Pink Petal Games

Game Discussion => General Discussion & Download => Topic started by: DocClox on October 21, 2013, 06:51:37 AM

Title: WhoreMaster: Abby's Crossing
Post by: DocClox on October 21, 2013, 06:51:37 AM
[edit]

Changed the title to reflect the content of the thread a little better :)

Been messing around with pygame and PGU. I wasn't too impressed by Ren'Py when I looked at it before. I mean it's excellent if you're writing a VN, but seemed a bit of a pain if you needed to add a lot of actual game to the text boxes.

So I thought I'd have a try with pure Python. Well, Python and Pygame and PGU. I'm finding it a LOT easier to work with than C++ and the WM codebase :)

So far I'm just learning how to make widgets and the like.  I've had way too much fun making that viewscreen: the slider slides, the little lights change colour randomly, there's three to five frames of random snow when the image changes... that sort of thing.

Next thing probably is to look at Python's XML handling. I'd like an XML based container for screen layouts, and I want to be able to read the XML files for existing girl definitions. If I can get that far might look at porting some of the code from standard WM.

It should go without saying, but no promises or deadlines for any of this. I'm just messing around at the moment.

(http://i.imgur.com/ZgoToiE.png)


(http://i.imgur.com/tbRbc44.png)
Title: Re: I've been messing around with pygame
Post by: Xela on October 21, 2013, 07:42:53 AM
Ren'Py does offer the simplest scripting system for events for modders imaginable. Also it comes with most of the tools required to make a game like WM.

but seemed a bit of a pain if you needed to add a lot of actual game to the text boxes.

What do you mean exactly?

=======
In any case, please take a look at PyTFall before starting a new design all together (especially in Python), there's been a lot done already and we aren't really working off a concrete concept so development is really flexible.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 21, 2013, 09:08:32 AM
Ren'Py does offer the simplest scripting system for events for modders imaginable. Also it comes with most of the tools required to make a game like WM.

Well yeah,if you want to do mainly narrative and dialogue with supporting graphics then it's wonderful. The sound support is very nice too. But the dating sim/gui/forms plugin didn't strike me as particularly easy to use, and looked like a bit of a nightmare if you wanted your own layout and your own look and feel. And the python integration seemed fiddly if you wanted to do more than keep track of a few variables. That might just have been me, though. My python wasn't as good as I thought it was back then.

Mainly though, you're talking about taking a framework optimised to do narrative and dialogue and using it to make a forms based business sim.  I reckoned I'd end up doing most of it in python and pygame anyway, so why not cut out the middle man?

Of course, that's just the way I see it. YMMV and all that.

In any case, please take a look at PyTFall before starting a new design all together (especially in Python), there's been a lot done already and we aren't really working off a concrete concept so development is really flexible.

It's a bit awkward, really. Between your name and avatar, you put me mind of a poster called exodia with whom I had a full and frank exchange of views back when WM was in active development. I appreciate that the similarity is probably pure coincidence, but it makes it difficult to collaborate for all that.  :(

As for PyTFall, it looked like a cool project when last I looked at it, and I wish you well with it.

Really though, bottom line is I'm just messing around at the moment.
Title: Re: I've been messing around with pygame
Post by: Xela on October 21, 2013, 10:12:14 AM
Well yeah,if you want to do mainly narrative and dialogue with supporting graphics then it's wonderful. The sound support is very nice too. But the dating sim/gui/forms plugin didn't strike me as particularly easy to use, and looked like a bit of a nightmare if you wanted your own layout and your own look and feel. And the python integration seemed fiddly if you wanted to do more than keep track of a few variables. That might just have been me, though. My python wasn't as good as I thought it was back then.

That sim plugin does suck... that's why we don't use it :)

Python integration is as good as it gets (it's basically 100% integrated). Couple of modules has been deliberately left out as not required for game making, but they can always be added later.

Mainly though, you're talking about taking a framework optimised to do narrative and dialogue and using it to make a forms based business sim.  I reckoned I'd end up doing most of it in python and pygame anyway, so why not cut out the middle man?

Of course, that's just the way I see it. YMMV and all that.

Mainly because middleman offers a good amount of widgets, multi-platform support, packaging, failproof serialization system and easy scripting for modders... Doesn't really get any better than that. PyGame is a good choice as well, but it just seems like you're creating a lot of extra work for yourself.

PS: If not RenPy, have you considered Python + Qt as an option? It might have more to offer than PyGame.

It's a bit awkward, really. Between your name and avatar, you put me mind of a poster called exodia with whom I had a full and frank exchange of views back when WM was in active development. I appreciate that the similarity is probably pure coincidence, but it makes it difficult to collaborate for all that.  :(

As for PyTFall, it looked like a cool project when last I looked at it, and I wish you well with it.

Really though, bottom line is I'm just messing around at the moment.

Name is for Alex (reversed) as it was already taken. Good luck messing around, tell me if you change your mind, we could always use some assistance :)
Title: Re: I've been messing around with pygame
Post by: DocClox on October 21, 2013, 11:40:02 AM
That sim plugin does suck... that's why we don't use it :)

I'm glad it wasn't just me then :)

Python integration is as good as it gets (it's basically 100% integrated). Couple of modules has been deliberately left out as not required for game making, but they can always be added later.

mmm... I was more thinking of the $ prefix for embedded python and the various init blocks and how nothing seemed to be scoped the way I expected it to be scoped and a load of little things like that.

I expect the problem goes away if you ignore the Ren'Py DSL and just use it as a Python library. But  a lot of the appeal of Ren'Py lies in that DLS and the simplicity of it all. So if you lose that, you lose a lot of the appeal.


Mainly because middleman offers a good amount of widgets, multi-platform support, packaging, failproof serialization system and easy scripting for modders... Doesn't really get any better than that. PyGame is a good choice as well, but it just seems like you're creating a lot of extra work for yourself.

Well, Python offers multi-platform support, packaging and scripting. I've not looked at serialisation yet, but I can't imagine it's difficult, knowing python. The widgets are nice, but I find I like working at low level, and I enjoy the control you get that way. And nothing kills a game atmosphere faster than standard widgets to my mind.

Name is for Alex (reversed) as it was already taken. Good luck messing around, tell me if you change your mind, we could always use some assistance :)

Well fair enough. I'll have a bit think and get back to you.
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 23, 2013, 12:20:11 PM
Hi there!


That's a nice screen you created there :)


pygame
I tried it about two years ago and really didn't like it. The documentation was poor, the API felt unpythonic and I didn't find a nice GUI toolkit to go with. The GUI toolkits I found were incomplete and often poorly documented.


packaging
Python offers multi-platform support, packaging and scripting.
No argument about multi-platform support and scripting, but packaging? I'm pretty sure with "packaging" Xela meant creating an .exe, .deb or other binary/installer from the game source so your players can run it easily without having to install dependencies. The best way to do this that I've found so far is to use PyInstaller. I also tried py2exe and cxfreeze some time ago. All of these options may create problems when you try to package libraries, especially more complex toolkits like Qt or GTK. It often is doable, but it's far from easy IMHO.


serialization
I've not looked at serialisation yet, but I can't imagine it's difficult, knowing python.
It's not :)
*) The best XML library is ElementTree, unless you want to parse XML files that are too big to keep them in memory.
*) For JSON: import json
*) To serialize native python objects pickle works great. Unless you want to get close and personal with the pickle protocol, I would advise against trying to pickle instances of classes inheriting from standard data types.
*) For easy, human-readable object serialization, including custom classes, PyYAML works nicely.

I wrote some pretty generic ressource loaders which might be of interest to you. Look for the RessourceMap class and its descendants here: http://sourceforge.net/p/pytherworld/tags/ci/default/tree/resload.py (http://sourceforge.net/p/pytherworld/tags/ci/default/tree/resload.py)


custom widgets
The widgets are nice, but I find I like working at low level, and I enjoy the control you get that way. And nothing kills a game atmosphere faster than standard widgets to my mind.
Well, IIRC renpy implements its widgets in pure python, so you can take as much control of them as you want, right?

Another option for widgets with a customized look is to take a mature GUI toolkit like Qt and reimplement the paint methods of the widgets. After all, why should you implement all the boring, technical details widgets need to handle when all you want are widgets that look non-standard?


Pytherworld
I've been working on a reimagination of Otherworld, implemented in Python. The GUI is based on Qt and lately we've been talking about adding 3D graphics. Koffii is currently working on that.
Maybe we've created something you can use or are interested in? The discussion thread is over at the Otherworld forums: Pytherworld discussion (http://forum.otherworldgame.net/index.php?topic=221.0)
Pytherworld's code is on Sourceforge: Mercurial repository (http://sourceforge.net/p/pytherworld/code/ci/default/tree/)


paperdolls
Did you write the paperdoll code for Otherworld? Just so you know: Daisy lately talked about breaking the current system and reimplementing it to fix some issues with the scaling and positioning of the dolls. This would also mean that all items have to be repositioned. I've tried to convince Daisy to just fix the bugs causing the scaling and positioning problems, but I'm not sure I succeeded.
It would be a shame if Daisy actually decides to break the current implementation because I know the structure of the XML is not the problem. I implemented Otherworlds paperdolls in Python and they work very nice, no issues with scaling.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 24, 2013, 03:46:45 PM
Hi there!

Heya Rudi! How goes? :)

That's a nice screen you created there :)

Thanks. I think my fondness for steampunk and art deco is probably showing :)

I tried it about two years ago and really didn't like it. The documentation was poor, the API felt unpythonic and I didn't find a nice GUI toolkit to go with. The GUI toolkits I found were incomplete and often poorly documented.


You're not wrong about the latter :) In fact I'm more using PGU (http://code.google.com/p/pgu/), in particulkar the GUI module. It's still not fantastically well documented, but I think I'm getting the hang of it. If I could just work why it renders a one pixel seam two thirds of the way across my nice mahogany background, I'd be really happy.


packagingNo argument about multi-platform support and scripting, but packaging? I'm pretty sure with "packaging" Xela meant creating an .exe, .deb or other binary/installer from the game source so your players can run it easily without having to install dependencies. The best way to do this that I've found so far is to use PyInstaller. I also tried py2exe and cxfreeze some time ago. All of these options may create problems when you try to package libraries, especially more complex toolkits like Qt or GTK. It often is doable, but it's far from easy IMHO.

I was faintly planning on using py2exe, but I'll take your warning to heart. I'll also look at PyInstaller :)

serializationIt's not :)
*) The best XML library is ElementTree, unless you want to parse XML files that are too big to keep them in memory.
*) For JSON: import json
*) To serialize native python objects pickle works great. Unless you want to get close and personal with the pickle protocol, I would advise against trying to pickle instances of classes inheriting from standard data types.
*) For easy, human-readable object serialization, including custom classes, PyYAML works nicely.

Using ElementTree (the lxml version) and I'd heard of pickle. PyYAML sounds useful, too :)

I wrote some pretty generic ressource loaders which might be of interest to you. Look for the RessourceMap class and its descendants here: http://sourceforge.net/p/pytherworld/tags/ci/default/tree/resload.py (http://sourceforge.net/p/pytherworld/tags/ci/default/tree/resload.py)

Thanks. I'll take a look.

custom widgetsWell, IIRC renpy implements its widgets in pure python, so you can take as much control of them as you want, right?

I'm sure.  I mean, don't get me wrong, I'm not knocking Ren'Py. I spent a few days playing with it, got confused, decided the
forms plugin wasn't very good and then got distracted by something else. This time I thought I'd try using pygame, looked at the GUI options and decided that PGU was probably closest to what I wanted.

I will admit, I never considered using Ren'Py as a widget library. Maybe I'll give it another look. I did want to have a fairly strong story in  this outing, so the VN aspects would actually be quite useful.

Another option for widgets with a customized look is to take a mature GUI toolkit like Qt and reimplement the paint methods of the widgets. After all, why should you implement all the boring, technical details widgets need to handle when all you want are widgets that look non-standard?

Yeah. More or less what I'm doing with PGU :)

Pytherworld
I've been working on a reimagination of Otherworld, implemented in Python. The GUI is based on Qt and lately we've been talking about adding 3D graphics. Koffii is currently working on that.
Maybe we've created something you can use or are interested in? The discussion thread is over at the Otherworld forums: Pytherworld discussion (http://forum.otherworldgame.net/index.php?topic=221.0)
Pytherworld's code is on Sourceforge: Mercurial repository (http://sourceforge.net/p/pytherworld/code/ci/default/tree/)

Oddly enough, I came across an very early version of Pytherworld just the other day. I have to confess I didn't know you were still working on it. I guess I should check in to the Otherworld forums more often :) I'll have to have a look. It was a cool idea and I'm glad it's still going.

paperdolls
Did you write the paperdoll code for Otherworld?

Guilty as charged :)

Just so you know: Daisy lately talked about breaking the current system and reimplementing it to fix some issues with the scaling and positioning of the dolls. This would also mean that all items have to be repositioned. I've tried to convince Daisy to just fix the bugs causing the scaling and positioning problems, but I'm not sure I succeeded.

I keep promising Daisy I'll do some more work on Otherworld, but I never quite seem to get to it. The dolls were always a bit fragile though.  In principle it should be dead simple. In practice ... there's probably a lot to be said for a rewrite, really. I'll stick my head into IRC and talk about it.

It would be a shame if Daisy actually decides to break the current implementation because I know the structure of the XML is not the problem. I implemented Otherworlds paperdolls in Python and they work very nice, no issues with scaling.

I think the scaling issue in Otherworld was because I used a lot of relative placement, which meant that the various parts have different origins. That means that when you scale the whole, all the bits transform around different points and everything separates. Thinking about it, it should be possible to transform all the items to use a common origin after positioning. Or better yet, before. That should solve the problem.

I should also add that (after year or so in the wilderness) I finally found myself paying employment this week. So my spare time is going to be limited for a while. On the other hand - money! - so that's ok :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 25, 2013, 03:42:20 PM
Heya Rudi! How goes? :)
All's fine, thanks. Congratulations on your new job! Good luck!


I was faintly planning on using py2exe, but I'll take your warning to heart. I'll also look at PyInstaller :)
To be honest, packaging external libraries so I can distribute my software has always been my biggest problem with Python development. Everything else was more or less smooth sailing (or my own fault...).
This goes so far that packaging a new library is the first thing I try when I consider if I should use it in one of my projects.


Using ElementTree (the lxml version) and I'd heard of pickle.
Is the lxml version better? Never tried it myself.


I'm not knocking Ren'Py
And I'm not trying to promote it (that's Xelas job ;) ). I don't really like it myself, but it is a good engine with quite a few things to offer.


Oddly enough, I came across an very early version of Pytherworld just the other day. I have to confess I didn't know you were still working on it.
Came across? Did people upload it somewhere?
The current version still is in an early stage of development, especially from the looks of it. I spent quite some time with other projects and rewrote it from scratch once to fix some early design flaws. Now it is going quite well IMHO. I think what sets Pytherworld apart from other projects at this point is the dynamic image matching. You can give the game a set of parameters describing the image you want and it will find the image closest to your search criteria most times.


I think the scaling issue in Otherworld was because I used a lot of relative placement, which meant that the various parts have different origins. That means that when you scale the whole, all the bits transform around different points and everything separates.
I know. I had to play around a while to reverse-engineer how exactly your XML positioning and scale info was meant to work, but I think I got it in the end.
I do think that the way you built that XML is the best way to do it. For example, positioning all doll parts from the same origin would be awful. Adjusting the position or size of any part for any reason would mean all parts attached to it would have to be repositioned/rescaled too.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 26, 2013, 04:52:22 AM
All's fine, thanks. Congratulations on your new job! Good luck!

Cheers muchly :)

To be honest, packaging external libraries so I can distribute my software has always been my biggest problem with Python development. Everything else was more or less smooth sailing (or my own fault...).
This goes so far that packaging a new library is the first thing I try when I consider if I should use it in one of my projects.

Sounds like good advice to me. Also slightly worrying, since I'm doing most of my dev work on Linux again. Oh well, that's what dual boot and virtual box are for :)

Is the lxml version better? Never tried it myself.

It's about the same, with a couple of added extras and a couple of security holes fixed. I read on the Python wiki (I think) that the ElementTree that shipped with python was exploitable with malicious xml. Not a huge problem for what we're doing, of course, but I thought I'd use the secure one in any event.

And I'm not trying to promote it (that's Xelas job ;) ). I don't really like it myself, but it is a good engine with quite a few things to offer.

I might end up using it yet. The other night I found that PGU had started adding 60 pixel invisible borders to some of my screen elements,  for no reason I could make out. So I've been looking at some of the other possibilities. I thought I might have gone with Tkinter until I found that it can't cope with transparency in widgets.  So I'm currently playing with PyQt. I keep meaning to look at how Xela is using renpy, but every time I start to install mercurial, something happens to distract me at the moment.


Came across? Did people upload it somewhere?
The current version still is in an early stage of development, especially from the looks of it. I spent quite some time with other projects and rewrote it from scratch once to fix some early design flaws. Now it is going quite well IMHO. I think what sets Pytherworld apart from other projects at this point is the dynamic image matching. You can give the game a set of parameters describing the image you want and it will find the image closest to your search criteria most times.

Sounds cool. I think the version I have is the initial proof of concept you posted on the otherworld forums. I've not seen it posted anywhere else, certainly.

I know. I had to play around a while to reverse-engineer how exactly your XML positioning and scale info was meant to work, but I think I got it in the end.
I do think that the way you built that XML is the best way to do it. For example, positioning all doll parts from the same origin would be awful. Adjusting the position or size of any part for any reason would mean all parts attached to it would have to be repositioned/rescaled too.

Yeah, the relative positioning seemed the only sane way to do it. There is a good case for flattening the image once it's built, of course, and keeping the actual doll off-screen. That would solve all the scaling issues, at the expense of making it a little slower to change clothes. I know I thought about doing that - I might have even done at some point... but I have this nagging feeling I've forgotten something important about that.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 06:47:34 AM
PyQT seems to be working out quite well. I've reimplemented the old pygame ones and got a bit further into the bargain/

(http://i.imgur.com/oggSI0C.png)

I've got all the elements of the main screen in place. The layout needs a little love in places, and some of the widget seems a little too bright. I'd also like to make a little more space under the viewscreen for a brass box containing a rotating paper drum which I can use to print status messages and the like. Oh, and obviously most of the buttons do not yet work :(

(http://i.imgur.com/1Fztnnj.png)

But in general, I'm quite pleased with what I've got so far :)

Next things are a suitably themed message box to mkae a brothel name does in fact get entered, followed by a some basic game data handling, save/load, and loading some girl data.

[edit]

The dialogue didn't take long to make, anyway :)

(http://i.imgur.com/ulRct6B.png)
Title: Re: I've been messing around with pygame
Post by: Xela on October 29, 2013, 11:03:41 AM
Nice :)

What is the plan by the way? I mean if you get this out of "messing around faze", where are you planning to take the design?
Title: Re: I've been messing around with pygame
Post by: KaiSakurai on October 29, 2013, 11:47:41 AM
he is aiming to program a new WM version completely outdating the former versions and with it conquering the internet world!
........
.......
......
just kidding xD
but looks great so far =3
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 11:53:36 AM
Nice :)

Thanks :)

What is the plan by the way? I mean if you get this out of "messing around faze", where are you planning to take the design?

Well, at the moment I'm trying to restrict myself to reproducing the basic functionality of vanilla Whoremaster, if only to keep me from charging off and tilting at windmills. That said ...

The initial idea behind Abby's Crossing was as a sequel of sorts to the original WM.  The PC (who may or may not be connected to the PC in WM) arrives in a new city with the intention of extending the franchise by setting up a chain of brothels.

The city in question is Abby's Crossing: a minor trading city built at the junction of three desert trading routes. Not the wealthiest city in the Empire, but far from the poorest, it seemed like a good place to start. As well as trade, the city tends to attract scientific and technological arrivals in Mundiga. Sadly, science doesn't work too reliably in Mundiga, so there's a heavy reliance on steam and clockwork and other early industrial techs, which give the place something of a Steampunk character.

Of course, it's never that simple. What the PC doesn't know initially is that Abby's Crossing was founded on a terrible secret, one which will shortly come back to haunt the city. And as is the nature of such things, the PC will have a chance to be at the centre of those events and to exercise some influence over the final resolution.

In game mechanics terms, a more limited slave supply, more tech and less magic, a different story to "avenge your father's murderers" and a bit more developed story, with some named NPCs with whom to interact, maybe some events and/or quests beyond the simple generic objectives in WM.

[edit]

he is aiming to program a new WM version completely outdating the former versions and with it conquering the internet world!
........
.......
......
just kidding xD
but looks great so far =3

heh, cheers! :)

I'm absolutely not trying to conquer anything with this one, but I'm glad the look and feel seems to be working.
Title: Re: I've been messing around with pygame
Post by: Xela on October 29, 2013, 12:04:43 PM
So basically the plan is to mimic WM's functionality in Python and add more story/gameplay elements?
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 12:18:28 PM
So basically the plan is to mimic WM's functionality in Python and add more story/gameplay elements?

It sounds dreadfully unambitious when you put it in those terms. But yes, I suppose so. With a side order of learning Python and Qt and a lot of fun making steampunk widgets with Inkscape :)
Title: Re: I've been messing around with pygame
Post by: Xela on October 29, 2013, 12:36:46 PM
It sounds dreadfully unambitious when you put it in those terms. But yes, I suppose so. With a side order of learning Python and Qt and a lot of fun making steampunk widgets with Inkscape :)

"unambitious" is not the right word here, it should be "sane". More features can always be added later.

I've been meaning to try out Inkscape but never seem to find the time :(
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 12:57:33 PM
"unambitious" is not the right word here, it should be "sane". More features can always be added later.

"Sane" works for me, I must admit :)

I've been meaning to try out Inkscape but never seem to find the time :(

Yeah, I get the same thing whenever I try and learn a 3D modelling package - I'm always too busy coding to put the necessary hours in.

That said, there are a ton of decent inkscape tuts, as well as the examples on the website. Definitely worth the time if you can spare it :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 29, 2013, 01:37:44 PM
Are you planning to open-source your game?

Congratulations on the style. It really delivers a particular mood, provides atmosphere.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 02:16:40 PM
Are you planning to open-source your game?

Yes. If it ever gets to the point where it's halfway worth playing, I'll release the source. 

Congratulations on the style. It really delivers a particular mood, provides atmosphere.

Thanks. I've been playing around with some of these ideas for a long time now. It would be nice to finally do something with them :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 29, 2013, 02:28:14 PM
I see. How did you make the buttons? Are the whole buttons images or did you load an image into the background and let Qt draw the text and border? If it is the latter I'd be interested in the code. The way Pytherworld does that is pretty slow.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 29, 2013, 05:36:39 PM
I see. How did you make the buttons? Are the whole buttons images or did you load an image into the background and let Qt draw the text and border? If it is the latter I'd be interested in the code. The way Pytherworld does that is pretty slow.

They're a mix. The ones on the initial screen are pure images, bump-mapped in the Gimp. But that's not practical for every button, so the subsequent ones use a background image with text on top.

This is the pure image version. The "n, h, p, d" args stand for "normal, hover, pressed, disabled":

Code: [Select]
class ImageButton(QPushButton):
        def __init__(self, name, parent, n, h, p, d, *args, **kw):

                ssfmt = """
                QPushButton {{
                        background-image : url({0});
                        border: 1px solid transparent;
                }}
                QPushButton:hover {{
                        background-image : url({1});
                }}
                QPushButton:pressed {{
                        background-image : url({2});
                }}
                QPushButton:disabled {{
                        background-image : url({3});
                }}
                """

                QPushButton.__init__(self, parent, *args, **kw)
                self.setObjectName(name)
                ss = ssfmt.format(n, h, p, d)
                self.setStyleSheet(ss)

The mixed button and images ones work like this:

Code: [Select]
class MixedButton(QPushButton):
        def __init__(self, text, parent=None, *args, **kw):

                QPushButton.__init__(self, parent, *args, **kw)
                self.setText(text)

                ssfmt = """
                        QPushButton {{
                                color           : yellow;
                                background-image : url({0});
                                border: 1px solid transparent;
                                padding-top     : 8px;
                        }}
                        QPushButton:hover {{
                                background-image : url({1});
                        }}
                        QPushButton:pressed {{
                                background-image : url({2});
                                padding-top     : 12px;
                        }}
                        QPushButton:disabled {{
                                background-image : url({3});
                        }}
                """
                ss = ssfmt.format(
                        "work/button_blank_normal.png",
                        "work/button_blank_hover.png",
                        "work/button_blank_active.png",
                        "work/button_blank_disabled.png",
                )
                self.setStyleSheet(ss)
                self.setFont(QtGui.QFont("Gabrielle", 24))

I gather you're using QtCreator while I'm hand coding, so it might not be entirely straightforward. Let me know if I can help further.
Title: Re: I've been messing around with pygame
Post by: DocClox on October 30, 2013, 01:29:17 AM
I see. How did you make the buttons? Are the whole buttons images or did you load an image into the background and let Qt draw the text and border? If it is the latter I'd be interested in the code. The way Pytherworld does that is pretty slow.

It occurs to me that some button images might be helpful as well. Basically I have the border drawn into the button, like this:

(http://i.imgur.com/600bwQ5.png)

I made that by drawing the frame and the text in Inkscape and then using the Gimp to bump map it to give it a slightly rounded look. I added the leather background in a separate layer using the Gimpressionist filter.

For the hover image, I made another leather texture in a brighter shade of red

(http://i.imgur.com/aIcXJCU.png)

To get the disabled version I copied the frame and text layer, desaturated, and exported the result using the darker background

(http://i.imgur.com/fMW3NfV.png)

Finally, for the active image, I duplicated the text and border and gave it a gaussian blur. By displaying the blur layer on top of the non-blurrred one, I get a shine effect for the active button. Add the brighter background and we have our mousedown image

(http://i.imgur.com/eqsiXMG.png)

Of course, that's a lot of work if I'm going to do it for every button in the game, so I only bump-mapped the text on the opening screen buttons. For the rest I use the bump-mapped borders, but no text, and then use PyQt to add the caption. The code for that is in the previous post.

OK, that's about all I got. Hope I'm not teaching my granny how to suck eggs :)

[edit]

Since I'm talking about making images, here's the message area widget I was talking about:

(http://i.imgur.com/YVrnu44.png)

I think I feel a new sig coming on...

[edit]

What the hell, here's the "printer" widget as part of the main screen.

(http://i.imgur.com/Ueqbfvo.png)

The layout still needs a little love. It's a bit cramped and the style is uneven, but in some ways that suits the theme. Some things could be lined up a bit better, but I think I'm going to get a big empty spot in the middle of the screen which is going to stand out amidst all that clutter. I suppose I can always add a bit of decoration or some pointless blinking lights. I'm tending towards a brass nude statuette if I can find or make a suitable graphic.

It occurs to me that I'm in danger of taking this seriously.

Saving seems to be working, but I'll not know until loading is implemented. That's the next job.
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 30, 2013, 05:07:07 PM
OK, that's about all I got. Hope I'm not teaching my granny how to suck eggs :)
Thank you very much for the in-depth explanation! I actually know very little about image editing and creating game graphics, so that was really helpful.

In regard to the button classes:
I use QtDesigner for some parts of the GUI, true, but when you're working with Qt from Python and you want to do dynamic things like adding or removing widgets at runtime, using drag and drop or similar stuff, you have to create your widgets in code. The longer I use Qt, the more I do in code. Based on that experience I understand what you are doing in the button classes. I've been thinking a while about creating nice buttons similar to yours programmatically, using some image as background and create the borders, shape and text with Qt. I have not researched if a glow effect is possible, but the other things should be doable, maybe just with style sheets alone.


The message area widget is nice. I also really like the humor and atmosphere in the texts.

It's a bit cramped and the style is uneven
What stands out most to me is that the image frame has more linear, edgy elements than the other widgets. It's style is more precise and technical, especially when compared with the softer, rounder style of the message area widget.


I'm tending towards a brass nude statuette if I can find or make a suitable graphic.

It occurs to me that I'm in danger of taking this seriously.
The brass nude statuette or Abby's crossing? ;D


Saving seems to be working, but I'll not know until loading is implemented. That's the next job.
Saving complete class instances with pickle (or PyYAML for human-readable savegames) worked best for me. Saves you the trouble of maintaining serialization methods on your objects.

UPDATE:
Forgot to mention the Google protocol buffers. Those are another serialization method that works with Python, C++ and Java. No idea if the features they offer are useful to you. I have not yet used them for one of my projects.

UPDATE2:
Just realized that it should not be too hard to write a generic serialization method that turns an object into, say, XML. The most difficult part I can see is saving a useful reference to the object's class.

LAST UPDATE (I promise ;D ):
Since serializing to XML is not fundamentally different to serializing into other data formats, someone of course already wrote a Python XML serializer: http://sourceforge.net/projects/pyxser/
Title: Re: I've been messing around with pygame
Post by: DocClox on October 31, 2013, 03:50:50 AM
Thank you very much for the in-depth explanation! I actually know very little about image editing and creating game graphics, so that was really helpful.

My pleasure. I could probably whomp up a tutorial if people would find it helpful

I use QtDesigner for some parts of the GUI, true, but when you're working with Qt from Python and you want to do dynamic things like adding or removing widgets at runtime, using drag and drop or similar stuff, you have to create your widgets in code.

I wondered about that, I must admit.

The longer I use Qt, the more I do in code. Based on that experience I understand what you are doing in the button classes. I've been thinking a while about creating nice buttons similar to yours programmatically, using some image as background and create the borders, shape and text with Qt. I have not researched if a glow effect is possible, but the other things should be doable, maybe just with style sheets alone.

Glow is easy - just use a blur layer. I kept the glow on the AC buttons fairly subtle, but it doesn't need to be. The important thing is to resize the image layer so you have some empty pixels around the non-glowing button. Otherwise the blur gets truncated by the edge of the button.

The message area widget is nice. I also really like the humor and atmosphere in the texts.

:D

What stands out most to me is that the image frame has more linear, edgy elements than the other widgets. It's style is more precise and technical, especially when compared with the softer, rounder style of the message area widget.

Yeah, I think you're right. I went for a more organic feel for the design and while I like the result, I'm not sure it fits with the rest.

I might try combining the printer and the viewscreen frame. Maybe mount the brothel name panel in between the two. That would free some space for the message area and reduce the feeling of clutter as well. Maybe once I have a few more screens up.

The brass nude statuette or Abby's crossing? ;D

Abby's Crossing :)

Saving complete class instances with pickle (or PyYAML for human-readable savegames) worked best for me. Saves you the trouble of maintaining serialization methods on your objects.

Pickle seems to do the job nicely at the moment. The task now is to suitably theme QTableWidget and friends so I can present a list of save files.

[edit]

(http://i.imgur.com/zyp8Ft9.png)

:D
Title: Re: I've been messing around with pygame
Post by: rudistoned on October 31, 2013, 08:27:05 AM
@statuette
Splendid!  :D
Title: Re: I've been messing around with pygame
Post by: DocClox on October 31, 2013, 02:10:56 PM
@statuette
Splendid!  :D

:D

QTableView is a lot of work to customise, but I think I've got it sussed now...

(http://i.imgur.com/8sSMhHh.png)
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on October 31, 2013, 03:18:22 PM
DocClox, can I just say that I absolutely love the names of your files?  The aliteration is great!
Title: Re: I've been messing around with pygame
Post by: DocClox on November 01, 2013, 02:08:27 PM
DocClox, can I just say that I absolutely love the names of your files?  The aliteration is great!

Glad you like 'em :)

Spent most of yesterday writing a save manager and changing the save and load routines to pickle the brothel name, timestamp and file name before pickling the main data. That should let me scan the save games and get the data for the load screen without having to load each saved game in full to find out the brothel name. Of course, I could just use the brothel name as file name, but then I'd have to filter out punctuation in the names and I'd sooner not do that.

Also started work today. So the breakneck pace of development will slow down somewhat.

[edit]

On the other hand, I finally got the thing running on Windows as well as Linux, so I might try and see if I can make that exe bundling trick work.

Not that there's anything to play yet, but I'd like to get that sorted out sooner rather than later :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 02, 2013, 08:07:31 AM
Should you go with PyInstaller, here is some advise for you:

First of all, good choice :) I really like PyInstaller as many things work out-of-the-box that didn't when I tried py2exe.

Here's the "but": PyInstaller 2.1 (newest stable version) has a problem with Qt and the PySide bindings. I have no idea why and have not been able to get around it. Luckily, version 2.0 of PyInstaller just works for Qt with PySide, no fiddling required what so ever. Official support for PySide has been announced for version 2.2, which has not been released so far.

Now, you are using the PyQt bindings with Qt (any particular reason why you chose PyQt instead of PySide?). PyQt is already supported by PyInstaller, but there have been problems in the past. If it does not work with some version of PyInstaller, I strongly encourage you to try the stable version before and the latest dev version to see if it works there.

I don't remember if I ever tried to package Qt with anything else then PyInstaller, so I don't have advise on py2exe and friends.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 02, 2013, 08:27:02 AM
Should you go with PyInstaller, here is some advise for you:

First of all, good choice :) I really like PyInstaller as many things work out-of-the-box that didn't when I tried py2exe.

I am indeed using PyInstaller. And having a hell of a time of it since all the documentation seems out of date. Downloading the package didn't seem to have the install scripts where they were supposed to be. So I googled a bit more and found page that said to use pip. So I installed setuptools and pip and used pip to install pyinstall.

Now everything says to run pyinstaller.py, but I don't seem to have that, just an exe. I've not yet tried the exe - busy running a search for the .py at the moment.

Now, you are using the PyQt bindings with Qt (any particular reason why you chose PyQt instead of PySide?). PyQt is already supported by PyInstaller, but there have been problems in the past. If it does not work with some version of PyInstaller, I strongly encourage you to try the stable version before and the latest dev version to see if it works there.

Hmmm ... as it happens I'm using PyQt, mainly because I hadn't heard of Pyside at the time. From what I've seen since Pyside seems popular and regarded as being more pythonic. Is it a lot of hassle to migrate? I must admit I'm tempted to stay with what is working at the moment :)

I don't remember if I ever tried to package Qt with anything else then PyInstaller, so I don't have advise on py2exe and friends.

I'll see how I get on with pyinstaller then. Once my search finishes, anyway...

[edit]

... aaaaannnd, that seems to work! The exe version bundles it up just fine. All it needs is the resources folder and everything looks peachy.

Now I just need the saving debugged. Is pickle supposed to handle lists of objects? I've got a GameData object that holds (among other things) a list of Brothel objects. The Game data elements are getting reloaded, but the brothel list is not.  I guess I can always pickle them individually - it's still heaps better than reading and writing each and every field.

Oh, and thanks for the help, Rudi!

[edit]

Also, pickle seems to be working properly after all. I was loading the file to a temp variable, testing for None, and if not none, assigning the result to my global data reference. The problems seems to be that I was actually creating a new local variable rather than overwriting the global. Python scoping still catches me out from time to time.
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 02, 2013, 12:02:25 PM
I am indeed using PyInstaller. And having a hell of a time of it since all the documentation seems out of date.
I think they've been reworking their interface lately. Their docs also really could use a barebones, concise "Getting started" section. At least they update their docs every once in a while.
You can always take a look at the buildscripts of Pytherworld (http://sourceforge.net/p/pytherworld/code/ci/default/tree/buildlinux.sh) for a simple, working usage example for PyInstaller.


Now everything says to run pyinstaller.py, but I don't seem to have that, just an exe. I've not yet tried the exe - busy running a search for the .py at the moment.
I usually just download the .zip (https://pypi.python.org/packages/source/P/PyInstaller/PyInstaller-2.1.zip), which contains the source code.


Hmmm ... as it happens I'm using PyQt, mainly because I hadn't heard of Pyside at the time. From what I've seen since Pyside seems popular and regarded as being more pythonic. Is it a lot of hassle to migrate?
I've never used PyQt myself, but from what I've read they are very similar and migrating is accordingly easy. If PyQt works for you, well, never change a running system :)


Is pickle supposed to handle lists of objects?
As long as type(list_of_objects) == list, pickle should work out of the box. In case its class inherits from list, getting it to pickle correctly can become trickier because (unverified opinion based on personal experience) I think pickle handles the default data types differently from user-defined classes. Anyway, having an instance of a user-defined class with an instance of list as attribute should work flawlessly.
Now that I think of, the answer to my pickle problems with classes derived from default data types might just be that those data types implement the special methods of the pickle protocol. If those are defined and do not expect custom attributes on the class, that might cause the problems I've had in the past.


The problems seems to be that I was actually creating a new local variable rather than overwriting the global. Python scoping still catches me out from time to time.

I suppose you had something like
Code: [Select]
some_var = "foo"

def update_some_var():
    some_var = "bar" # actually creates a local variable

instead of
Code: [Select]
some_var = "foo"

def update_some_var():
    global some_var
    some_var = "bar" # updates the module-scope variable

Yeah, that's one of the less-than-intuitive properties of python namespaces (they're still awesome though IMHO). I'm sure that one got me at least once.


Oh, and thanks for the help, Rudi!
No problem, glad to help :)
Title: Re: I've been messing around with pygame
Post by: DocClox on November 02, 2013, 07:02:07 PM
I suppose you had something like
Code: [Select]
some_var = "foo"

def update_some_var():
    some_var = "bar" # actually creates a local variable

instead of
Code: [Select]
some_var = "foo"

def update_some_var():
    global some_var
    some_var = "bar" # updates the module-scope variable

Yup! Got it in one :)

Got the XML parsing working for the girlsx files, so the next thing to do is probably the slave market. So, naturally I've been working on a town map. This is very rough - mainly to get the layout straight in my head

(http://i.imgur.com/OjhEnuB.png)

And a few notes on the setting - also very rough:

The city lies in the desert at the intersection of two trade routes. One runs from Crossgate in the North-west and South East towards the Imperial Capital. The second road runs west and south toward the western marches.

The city shelters in the lee of the Great Escarpment, thirty miles of cliff face where some ancient geological fault splits the desert in two.

The city is a magnet for those inventors and technologists who find their way to Mundiga. One of the most influential factions in the city is the Science Guild. The guild was founded by imperial decree many hundreds of years ago. The Science Guild's headquarters is The Great Laboratory, built at the end of the West Road nestled up against the wall of Escarpment itself. 

The Guild obtains a generous stipend from the Emperor aimed at furthering the progress of the Technological Arts in Mundiga. Science does not work well, however, in the intensely magical land of Mundiga and the Guild's progress has been limited. It is true however that the presence of the Guild has made Abby's Crossing one of the least magical and most technological settlements in the world. The city is also one of the more dimensionally stable settlements, with comparatively few arrivals from other realms.

The trade roads pass through the center of the city, cutting Abby's crossing into four quarters, named for the four elements of Alchemy. To the west, the Fire Quarter houses the military, the council chambers and many of the city's nobility. To the north, the Water Quarter holds the governor's mansion, as well as temples, and much of the city bureaucracy. The southernmost quarter is associated with Earth and is preoccupied with trade and commerce, as well as the business of making sure the city is kept fed and watered.  Easternmost is the Air Quarter. Here you will find the majority of the city's scholars, a well as technologists and artisans, couriers and diviniers

Outside the city walls is the Souk, and huge informal marketplace that gives way to an extended tent city housing the itenerant traders as well as the many inhabitants who cannot find accomodation within the city walls. The Souk is also considered to extend along the sides of the trade roads as they pass through the city with many stalls and traders hawking their wares to passers by.
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 03, 2013, 01:26:40 AM
And a few notes on the setting - also very rough:

The city lies in the desert at the intersection of two trade routes. One runs from Crossgate in the North-west and South East towards the Imperial Capital. The second road runs west and south toward the western marches.

The city shelters in the lee of the Great Escarpment, thirty miles of cliff face where some ancient geological fault splits the desert in two.

The city is a magnet for those inventors and technologists who find their way to Mundiga. One of the most influential factions in the city is the Science Guild. The guild was founded by imperial decree many hundreds of years ago. The Science Guild's headquarters is The Great Laboratory, built at the end of the West Road nestled up against the wall of Escarpment itself. 

The Guild obtains a generous stipend from the Emperor aimed at furthering the progress of the Technological Arts in Mundiga. Science does not work well, however, in the intensely magical land of Mundiga and the Guild's progress has been limited. It is true however that the presence of the Guild has made Abby's Crossing one of the least magical and most technological settlements in the world. The city is also one of the more dimensionally stable settlements, with comparatively few arrivals from other realms.

The trade roads pass through the center of the city, cutting Abby's crossing into four quarters, named for the four elements of Alchemy. To the west, the Fire Quarter houses the military, the council chambers and many of the city's nobility. To the north, the Water Quarter holds the governor's mansion, as well as temples, and much of the city bureaucracy. The southernmost quarter is associated with Earth and is preoccupied with trade and commerce, as well as the business of making sure the city is kept fed and watered.  Easternmost is the Air Quarter. Here you will find the majority of the city's scholars, a well as technologists and artisans, couriers and diviniers

Outside the city walls is the Souk, and huge informal marketplace that gives way to an extended tent city housing the itenerant traders as well as the many inhabitants who cannot find accomodation within the city walls. The Souk is also considered to extend along the sides of the trade roads as they pass through the city with many stalls and traders hawking their wares to passers by.


...You're going to make me rewrite the entire backstory that I'd created for Whoremaster...
SIGH
All the more fun!  This time, it might even be readable!  I like your idea about science not working correctly.  I'll have to use it.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 03, 2013, 03:27:09 AM

...You're going to make me rewrite the entire backstory that I'd created for Whoremaster...
SIGH
All the more fun!  This time, it might even be readable!  I like your idea about science not working correctly.  I'll have to use it.

Apologies for that. I was working from the elements I had planned for AC from a couple of years back and what I remembered from the background notes I made at the end of my tenure as WM developer. I forgot that you'd taken a crack at developing the setting as well.

What are the main points of contradiction? If it's not plot critical I can probably adapt things at this end.

Hmmm... maybe I better PM you :)

[edit]

Somewhat improved city map. Icons still need work, but it's getting closer to what I want.

(http://i.imgur.com/WQw0BZP.jpg)
Title: Re: I've been messing around with pygame
Post by: Xela on November 03, 2013, 09:33:09 AM
Map looks solid, well done!
Title: Re: I've been messing around with pygame
Post by: DocClox on November 03, 2013, 11:03:04 AM
Map looks solid, well done!

Thank you.

Here's a bit of design work for the slave market screen:

(http://i.imgur.com/Z9x1fBd.png)
Title: Re: I've been messing around with pygame
Post by: DocClox on November 05, 2013, 03:21:35 PM
Just q quick update. I've slowed down on this on account of work, but not stopped.

What I've got working:

Currently:
Still to do:
Here's a shot of the poster from the slave market:

(http://i.imgur.com/5v2DDsX.png)

The names on the poster are the table of slaves being sold, so selecting one will change the slave being displayed. I also want to reduce the slave supply compared with Crossgate, so the girls on sale will only update every four or five turns.  I turned off the scroll bar background so it looked more in keeping with the paper texture. I've used asterisks to bracket the active girl, also in keeping with the paper motif.

I'd like to add some short descriptive text based on the girls' stats, but I'm not sure how best to go about it. I don't have too much space to work with, and I don't want to drop the font size too small. But somehow just listing "Alice, Betty, Carol..." doesn't seem to ring true. Any ideas, anyone?

In between times girls will get crossed off the list as they get sold, (either to the PC or NPCs). It's going to be possible for the market to run out of girls, and remain closed until the next caravan arrives in a few days time.

(http://i.imgur.com/lgtG7ec.png)

Of course, there will be other sources available. I'm just having fun making widgets :)
Title: Re: I've been messing around with pygame
Post by: Xela on November 05, 2013, 03:48:04 PM
Looks so good, it makes me wanna steel it  ::)
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 05, 2013, 03:56:57 PM

I'd like to add some short descriptive text based on the girls' stats, but I'm not sure how best to go about it. I don't have too much space to work with, and I don't want to drop the font size too small. But somehow just listing "Alice, Betty, Carol..." doesn't seem to ring true. Any ideas, anyone?


I actually do have an idea, one that I'd be willing to help with.  Why not have a script read the girls statistics and, if certain statistics are greater then, or less then, certain values, a descriptor appears?  Like, if they've got a constitution value of >80, a combat value of >75, a normal sex value of <10, and the trait "Tough", it'll spit out the message "A tough woman with a strong body and plenty of combat experience.  Has not received pillow training; recommended for combat or security-oriented duties."

If you'd like, I could write up a ton of these things.


EDIT:  To clarify, I'm thinking that these would appear when the girl in question is selected, possibly above the "Buy" button. 

In regards to the market display, why not have a title appended based on the possession of certain traits or skills?  LargeBreasts or AbnormallyLargeBreasts add "the Busty" to the end of the name, while "BrokenWill" will add "the Broken".
Title: Re: I've been messing around with pygame
Post by: Xela on November 05, 2013, 04:01:40 PM
I actually do have an idea, one that I'd be willing to help with.  Why not have a script read the girls statistics and, if certain statistics are greater then, or less then, certain values, a descriptor appears?  Like, if they've got a constitution value of >80, a combat value of >75, a normal sex value of <10, and the trait "Tough", it'll spit out the message "A tough woman with a strong body and plenty of combat experience.  Has not received pillow training; recommended for combat or security-oriented duties."

If you'd like, I could write up a ton of these things.


EDIT:  To clarify, I'm thinking that these would appear when the girl in question is selected, possibly above the "Buy" button. 

In regards to the market display, why not have a title appended based on the possession of certain traits or skills?  LargeBreasts or AbnormallyLargeBreasts add "the Busty" to the end of the name, while "BrokenWill" will add "the Broken".

Girls do have descriptions... isn't this an overkill?
Title: Re: I've been messing around with pygame
Post by: GonDra on November 05, 2013, 04:04:08 PM
I'd like to add some short descriptive text based on the girls' stats, but I'm not sure how best to go about it. I don't have too much space to work with, and I don't want to drop the font size too small. But somehow just listing "Alice, Betty, Carol..." doesn't seem to ring true. Any ideas, anyone?

How about a descriptive word based on the girls highest stat? aka: "Agile Alice, Beauty Betty, Charismatic Carol, Slutty Sarah..."
The problem with this can naturally be that the longer girl names plus descriptive word could be too large for the list, especially if you allow unique girls to be sold, you also could have instances where every or a lot of girls have the same stat as the highest which would fill the list with a lot of the same.

I like where you are going with this, keep up the good work.

Edit: It seem that while I slacked, hewhocumsbynight came up with something similar...
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 05, 2013, 04:21:10 PM
Girls do have descriptions... isn't this an overkill?

Possibly.  I got the inspiration from looking at historical newspaper advertisements from the Golden Age of slavery in the US, but that situation really isn't too applicable.  What is applicable is the fact that, at least in WhoreMaster, the descriptions are not visible from the market page.  They only become visible after purchase.  So, you could think of this as a market description, which is replaced by the actual description once you buy the product.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 05, 2013, 05:49:31 PM
Looks so good, it makes me wanna steel it  ::)

It wasn't hard to do. I used a bunch of display fonts and some lines drawn in inkscape to get a clean poster, and then aged it like this (http://wiki.tesnexus.com/index.php/Gimp_create_old_weathered_posters_and_other_images). The code is the same as I used for the load game screen table, just with different styling. I'll post the code if you want - possibly after I've had a chance to comment it. It's all a bit monolithic at the moment...

EDIT:  To clarify, I'm thinking that these would appear when the girl in question is selected, possibly above the "Buy" button. 

I was thinking of something similar to let the PC gauge slave quality. Let me think on it a bit.

In regards to the market display, why not have a title appended based on the possession of certain traits or skills?  LargeBreasts or AbnormallyLargeBreasts add "the Busty" to the end of the name, while "BrokenWill" will add "the Broken".

How about a descriptive word based on the girls highest stat? aka: "Agile Alice, Beauty Betty, Charismatic Carol, Slutty Sarah..."

That approach sounds good. A one word description, either before or after.  Another alternative would be to drop the names entirely and just have short descriptions: "Blonde and stupid", "likes to fuck" "Hard worker" (nothing positive to say about that one :))

Something along those lines, anyway.

The problem with this can naturally be that the longer girl names plus descriptive word could be too large for the list, especially if you allow unique girls to be sold, you also could have instances where every or a lot of girls have the same stat as the highest which would fill the list with a lot of the same.

I can always drop the adjective if the name looks like not fitting. Or drop the font size a little, perhaps, if it's not too much over.

Oh yeah, I decided the "no sale today" stamp on that poster looked way too clean and modern:

(http://i.imgur.com/EtNHX3C.png)
Title: Re: I've been messing around with pygame
Post by: Xela on November 05, 2013, 06:00:13 PM
It wasn't hard to do. I used a bunch of display fonts and some lines drawn in inkscape to get a clean poster, and then aged it like this (http://wiki.tesnexus.com/index.php/Gimp_create_old_weathered_posters_and_other_images). The code is the same as I used for the load game screen table, just with different styling. I'll post the code if you want - possibly after I've had a chance to comment it. It's all a bit monolithic at the moment...

Graphics take way to long when made by me, I'll just have to code and hope someone with photoshop skill decides to contribute at some point.

While I love reading Python code, Qt is to different from Ren'Py to be useful :(
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 06, 2013, 08:08:52 AM

The poster looks just great!


@girl descriptions
You could make the poster a bit broader / bigger and go with short descriptions like
Sally, fiery redhead
Justine,  brunette cutie
Lilly, blonde bombshell


I also like those you proposed, but they need even more space. I think multi-line entries for each girl would probably look strange.


You could also put the descriptions into tooltips, which would eliminate space constraints. I have no idea if frame and background of a tooltip window can be customized, but the text itself can be formatted in the same HTML-like manner available to labels and so on.
Tooltips are added something like this
Code: [Select]
text = "<b>this is bold text</b>"
tooltip = QtGui.QToolTip(text)
widget.setToolTip(tooltip)
Since posters don't offer tooltips this might break immersion a little, but posters also have no scroll bars, so it might be okay.


Another way to go would be to express the girls desirability on the hotness scale (1 to 10) ;)
It's not the best idea so far, but it's the one that needs the least amount of space  :D



@Xela
How were you able the read DocCloxs code?




@hewhocumsbynight
The "Golden Age of slavery"? That could be misunderstood pretty easily. The period of slavery in the US was certainly not a "Golden Age". I do think you did not mean to say that, but you never know on the internet.
Title: Re: I've been messing around with pygame
Post by: Xela on November 06, 2013, 08:29:09 AM
@girl descriptions
You could make the poster a bit broader / bigger and go with short descriptions like
Sally, fiery redhead
Justine,  brunette cutie
Lilly, blonde bombshell

Not possible with default WM resources I am afraid...

@Xela
How were you able the read DocCloxs code?

I wasn't, Doc offered to post the code, I stated that while I'd love to read it, it's not likely to be useful to my PyTFall design.
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 06, 2013, 08:45:12 AM
Thanks for the clarification.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 06, 2013, 04:04:34 PM
OK, let's see if this attaches ok.

One slave-poster script, with resources and stand-alone test mode. Would have done this earlier, but we had a power cut this evening.
Title: Re: I've been messing around with pygame
Post by: Xela on November 06, 2013, 05:08:27 PM
with resources and stand-alone test mode

Should be noted that Qt and Python are required to run this.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 06, 2013, 05:38:11 PM
Should be noted that Qt and Python are required to run this.

... and furthermore, it only makes a poster table like the one already screenshotted - so it's of little interest apart from python types.

Just in case that wasn't clear :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 06, 2013, 06:24:22 PM
Thanks for sharing, interesting code :)

I have confirmed that PySide and PyQt4 are quite similar. Just replacing the import statement let me run it :)

Here is a version using layout management. For this particular widget you don't gain anything because the poster demands a fixed size anyway. It could probably be changed though by splitting the poster into a fixed-size header, fixed-size footer and resizable middle part.

Title: Re: I've been messing around with pygame
Post by: DocClox on November 07, 2013, 01:57:36 AM
Cool. I'll have a look at that tonight. :)

What I'd like to achieve with layouts is have a game window that can be maximised or just resized without looking rubbish. Currently I'm working on a fixed size 1024x768 window, but I'd like it all to scale gracefully.

That said, getting a game is more important than making it all resize properly :)
Title: Re: I've been messing around with pygame
Post by: Xela on November 07, 2013, 02:09:11 AM
What I'd like to achieve with layouts is have a game window that can be maximised or just resized without looking rubbish. Currently I'm working on a fixed size 1024x768 window, but I'd like it all to scale gracefully.

That said, getting a game is more important than making it all resize properly :)

Ren'Py would do that for you without to much fuss  ::)

I am doing some screen realignments myself right now, cannot believe how awful my code was 8 month ago, prolly will not believe how awful it is right now in another 8 month...
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 07, 2013, 02:41:44 AM
Ren'Py would do that for you without to much fuss  ::)
So does Qt, if you tell it to  ::)
Except if Ren'Py does it by reading your mind and writing the code for you, that would indeed be better  :D
Title: Re: I've been messing around with pygame
Post by: DocClox on November 09, 2013, 04:57:12 PM
Not much done on account of work and all that, but I got some time in today.

Spent a lot of it splitting the code into packages and modules so it'll be easier to maintain in the long run. I did get time to put the slave market screen together though. This is (mostly) in-game and working

(http://i.imgur.com/0VtOUxB.png)

Sorry about the camel. I just thought it would be more fun than a blank frame if there were no girls available :D
Title: Re: I've been messing around with pygame
Post by: DocClox on November 13, 2013, 12:53:18 PM
OK, so no camel fans in the audience, huh? ;)

Not a lot to show at the moment, since I've been working on the girl loading and slave market logic.  If anyone's interested i could post some code ('m quite pleased with the way some of this is turning out) but no new pics for a while.

I'm still employed (yayyy) and almost having fun. Clearly something, somewhere has gone horribly wrong :)
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 13, 2013, 01:09:08 PM
OK, so no camel fans in the audience, huh? ;)

Not a lot to show at the moment, since I've been working on the girl loading and slave market logic.  If anyone's interested i could post some code ('m quite pleased with the way some of this is turning out) but no new pics for a while.

I'm still employed (yayyy) and almost having fun. Clearly something, somewhere has gone horribly wrong :)

Horribly wrong! Congratulations regardless. 

I'd be interested in seeing the code you've spawned.  Postage, please?
Title: Re: I've been messing around with pygame
Post by: DocClox on November 13, 2013, 02:46:15 PM
Horribly wrong! Congratulations regardless. 

Thank you! We may not have to send the kittens out to sweep chimneys this Christmas
after all :)

I'd be interested in seeing the code you've spawned.  Postage, please?

OK, you talked me into it :D

The motivation for this is best summed up in a comment from the slave_market data module

Code: [Select]
#
# this is the data underlying a slave market
#
# the intention is to have more than one,
# although the auction block in the Souk is the
# only one the initially accessible
#
# different markets are going to have different
# characteristics. The souk has mainly low quality girls
# and refreshes every 4 to 7 days. it never holds more
# than six girls and one or two are sold daily,
# starting with those of highest quality
#
# The J.Pettow and Son are toymakers in the Air Quarter
# who occasionally tinker with gynoids. Sometimes there are
# working models for sale, one, sometimes two,
# never more than three and frequently zero.
# Their stock has a low chance of changing daily.
# Only robot girls are traded at the Toyshop.
#
# Similarly, the Water Quarter has a house of Courtesans
# all highly trained, and capable healers and entertainers.
# None are for sale, although if the PC is of good repute
# and the girl is willing, delicate negotiations may be
# conducted. Similarly, the  fire quarter will sell
# gladiators and janissaries, while the Earth Quarter
# houses the richest slave traders (with the highest chance
# of finding exotics or unique girls) and the Warrens
# Bazaar where the cities poorest are often sold into slavery
#

So I want highly configurable slave markets with specialised stock and some fine control over what goes into them. To that end, I've decided that markets are made up of "slots" where each slot can hold a girl. So a market with three slots can hold no more than
three girls at a time

Code: [Select]
#
# Each market has a number of "slots" that can contain a girl
# Each slot has
#
#       * a chance to contain a unique girl
#       * failing that a chance for a generic.
#       * a chance that a girl will remain unchanged on refresh
#       * a scaling factor applied to all a girl's stats
#       * a list of required traits (eg "robot girls only")
#       * a list of excluded traits (eg "no demons or undead")
#
class Slot(object):
        def __init__(self, *args, **kw):
                object.__init__(self)
#
#               we'll default this to the souk
#               so we have a slot with no chance at all of a unique
#               70% chance of a generic, and an 80% chance that
#               a girl already in the slot will remain rather than
#               be removed and possibly replaced
#
                self.unique     = kw.get("unique",  0.0)
                self.generic    = kw.get("generic", 0.7)
                self.persist    = kw.get("persist", 0.8)
#
#               I'd like a bit of variability in the quality.
#               this is a tad redundant, since the random girls all
#               (obviously) have random elements. Still, it'd be
#               nice to have a bit of range of quality beyond that/
#               so scaling takes a function. In this case a
#               lambda expression that averages out at about .4
#               but trails away in a normal distribution so that
#               in rare case the scaling can go as high as 1
#               or drop as low as zero.
#
#               (values <= 0 are capped at 0.05. Values > 1 can
#               stand, but the resulting stats still cap at 100.
#               so occasionally some higher than average girls
#               will come through)
#
                func = lambda : .2 + random.normalvariate(1,1) / 5
                self.scaling = kw.get("scaling", func)
#
#               required and excluded traits
#
                self.required = kw.get("required", [])
                self.excluded = kw.get("excluded", [])
#
#               last but not least, a variable to hold the
#               girl instance in question
#
                self.girl = None

So, we can check first to see if the girl remains after the slot is refreshed, and then we can check to see if a unique girl is there, and if that fails we look for a generic one. We can set quality modifiers to change the likely quality of the girls,  and we can require or exclude any number of traits. So we can exclude demon girls from the souk, or make sure that only robots appear in the Toyshop.

And of course we can configure these on a slot by slot basis...

Code: [Select]
class SlaveMarket_Souk(SlaveMarketBase):
        def __init__(self, *args, **kw):
                SlaveMarketBase.__init__(self, *args, **kw)
#
#               array of slots to hold the girls
#
                self.slots = [
#
#                       first slot - 1 in 20 chance of a unique
#                       100% chance of generic if no unique
#                       100% scaling - this one is in good shape
#
                        self.mk_slot(   unique  = 0.05,
                                        generic = 1.0,
                                        scaling = 1.0,
                        ),
#
#                       second slot - 1% chance of unique
#                       100% generic, 70% scaling
#
                        self.mk_slot(   unique  = 0.01,
                                        generic = 1.0,
                                        scaling = 0.7,
                        ),
#
#                       remaining slots, no chance of unique
#                       diminishing chance of generics
#
                        self.mk_slot(   generic = 0.8),
                        self.mk_slot(   generic = 0.5),
                        self.mk_slot(   generic = 0.3,
                                        scaling = 0.2
                        ),
                        self.mk_slot(   generic = 0.1,
                                        scaling = 0.05
                        ),
                ]
                self.refresh()

#
#       little func to make sure the exclusions get passed
#       to all slots
#
        def mk_slot(self, **kw):
                xs = [
                        "Demon", "Gynoid", "Undead",
                        "Not Human", "Construct",
                        "No Souk"
                ]
                return Slot(excluded=xs, **kw)


There's some more marginally interesting stuff in the girl manager and how this lot are looked up and filtered, but this post is going on forever and I've posted the essence of it all.

Anyway, that's what I've been up to :)

Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 13, 2013, 05:49:59 PM
Ooh, I like!  I like, very much.  It's an excellent idea!

Only one question:  Would the scaling (bazaar<souk<Earth) apply to and read unique girls in the same fashion as generics, or would we need to make different sets for different markets?
Title: Re: I've been messing around with pygame
Post by: DocClox on November 13, 2013, 06:04:25 PM
Only one question:  Would the scaling (bazaar<souk<Earth) apply to and read unique girls in the same fashion as generics, or would we need to make different sets for different markets?

Well, I'm thinking of implementing the penalties as a stat adjustment that decays over time. So if you buy some nearly dead wretch from the Souk and nurse her back to health, you may end up with an excellent girl for comparatively little money. (And one with a loyalty boost if there's any justice in the world. Which there may not be, of course :)) Mind, the souk prices are going to be high, reflecting this. But probably not so high that you can't buy 'em broken down, heal them up and make a profit selling them healthy. So in that case, the penalties would apply to random and unique equally.

For girls that have a scaling factor > 1, I'd probably make that a permanent boost to the stats, reflecting hours of work by some trainer before you get to see her. I probably won't let scaling factors go too far over 1 anyway, maybe 1.5 max, and I'd still cap stats at 100. So it shouldn't be too unbalancing.

Again, this can probably be applied  to both unique and generic without problems :)
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 13, 2013, 06:14:42 PM
Very interesting.  Thank you for the sneak-peak:  We shall collectively wait with bated breath for your consumation.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 14, 2013, 05:42:32 PM
Very interesting.  Thank you for the sneak-peak:  We shall collectively wait with bated breath for your consumation.

I'll do my best. It's going to take some time, though.

I know I said I wasn't going to post any more pics for a while, but I decided that the widget that printed trait descriptions was indescribably dull

(http://i.imgur.com/gwjTc0U.png)

I like this one better :)

incidentally, the widget screen is nearly working now. Well, when i say "nearly", the traits don't display yet (but at least they're now being generated), the images resize about 50px too small for some reason and you can't buy anyone yet. but apart from that it's doing really well. Might have a shot of a working screen soonish :)
Title: Re: I've been messing around with pygame
Post by: hewhocumsbynight on November 14, 2013, 05:52:36 PM
Very nice - I like how it invokes the feel of a Pipboy readout!
Title: Re: I've been messing around with pygame
Post by: DocClox on November 16, 2013, 07:12:23 AM
Very nice - I like how it invokes the feel of a Pipboy readout!

I suppose it does. I learned to program on a green screen monitor (yup, I'm *that* old!) so that particular look always resonates with me.

I just got the trait display working. All I need now is to hook up the monitor and make the "buy" button work. And after that, I guess the next job is "Girl Management"

(http://i.imgur.com/6Xgdmvp.png)
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 16, 2013, 07:22:39 AM

Code: [Select]
class SlaveMarket_Souk(SlaveMarketBase):

#
#       little func to make sure the exclusions get passed
#       to all slots
#
        def mk_slot(self, **kw):
                xs = [
                        "Demon", "Gynoid", "Undead",
                        "Not Human", "Construct",
                        "No Souk"
                ]
                return Slot(excluded=xs, **kw)

Minor nitpick: If all mk_slot does is that it always passes a list of strings to the Slot constructor, why don't you make that list an attribute of the slave market class? Like this, for example:


Code: [Select]
class SlaveMarketBase(object):
    def mk_slot(self, **kw):
         return Slot(excluded=self.girltype_exclusions, **kw)
       
class SlaveMarket_Souk(SlaveMarketBase):
    girltype_exclusions = [
                        "Demon", "Gynoid", "Undead",
                        "Not Human", "Construct",
                        "No Souk"
                ]

It works either way, just an idea that popped into my head while reading the code. I like the setup in general. I also thought the camel was a nice touch, but not nice enough to demand a comment  :P
Title: Re: I've been messing around with pygame
Post by: DocClox on November 16, 2013, 07:42:53 AM
Minor nitpick: If all mk_slot does is that it always passes a list of strings to the Slot constructor, why don't you make that list an attribute of the slave market class? Like this, for example:


Code: [Select]
class SlaveMarketBase(object):
    def mk_slot(self, **kw):
         return Slot(excluded=self.girltype_exclusions, **kw)
       
class SlaveMarket_Souk(SlaveMarketBase):
    girltype_exclusions = [
                        "Demon", "Gynoid", "Undead",
                        "Not Human", "Construct",
                        "No Souk"
                ]

It works either way, just an idea that popped into my head while reading the code.

Yeah, that would work better, wouldn't it? :)

I think I just saw the code getting messy and slapped a little function around the slots just to make it look a bit neater. Didn't really give it much more thought than that.

I like the setup in general. I also thought the camel was a nice touch, but not nice enough to demand a comment  :P

:D I just had this mental image of the market being deserted, so this camel wanders over and peers into the camera.  Just my sense of humour, I suppose :)
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 16, 2013, 07:51:38 AM
:D I just had this mental image of the market being deserted, so this camel wanders over and peers into the camera.  Just my sense of humour, I suppose :)
That's about the impression I got from it. Empty, dusty streets, heat and a bored camel. Made me smile  :)

Sounds like you think about your game like it was a movie. You're definitely very visually oriented.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 16, 2013, 12:47:55 PM
Sounds like you think about your game like it was a movie. You're definitely very visually oriented.

I suppose I do. Long habit from refereeing countless face-to-face RPG sessions. I used to imagine the scene, and then work out how it would translate into game terms.  Seems to work for computer games as well :)

Finally got that monitor hooked up, btw. By default it prints the girl's description.

(http://i.imgur.com/a9JrewG.png)

But hover over a trait and you get the description of the trait. The second screeny shows the alternate stat screen that you get when you click the "more" button

(http://i.imgur.com/aVuoNBh.png)

Of course, the poster seems to have sprung a display bug now, but the screen functionality is all there. Next up, girl management!
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 16, 2013, 04:33:47 PM
Looks very nice!
Title: Re: I've been messing around with pygame
Post by: DocClox on November 17, 2013, 09:46:10 AM
Looks very nice!

It does, doesn't it. Even though I say so who shouldn't :)

Here's a mockup for the girl management screen.

(http://i.imgur.com/AgUqRaT.png)

I'm thinking of using drop down menus for the job selection, hence the absence of selection boxes. If it turns out I need 'em, there's plenty of room to make that table smaller.

Comments and suggestions are welcome
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 17, 2013, 10:53:11 AM
Drop-down menus (combo boxes) were my initial choice for job selection in Pytherworld. They work well for a small amount of jobs (up to 15 or so?), but are less practical for more jobs.
If you are talking about actual drop-down menus, not combo boxes, you could alleviate that problem by having sub-menus. However, that approach has limits too - everyone who tried to get into a third-tier submenu in the programs menu on Windows knows that.
SimBrothel opens a window displaying the available jobs in an iconview (a window displaying named icons). That's quite a visual approach IMHO, especially if you give each job an icon.
Another option is having a list of jobs somewhere that you can drag and drop into slots in the schedule. Not sure why that would be a good idea though.


Now I'm off to look at ldconfig. Thanks for the reply :)
Title: Re: I've been messing around with pygame
Post by: DocClox on November 17, 2013, 11:56:53 AM
Drop-down menus (combo boxes) were my initial choice for job selection in Pytherworld. They work well for a small amount of jobs (up to 15 or so?), but are less practical for more jobs.
If you are talking about actual drop-down menus, not combo boxes, you could alleviate that problem by having sub-menus. However, that approach has limits too - everyone who tried to get into a third-tier submenu in the programs menu on Windows knows that.

Hmm... I was thinking of putting the general duty category on the table. So if the duty area was brothel, it would only display the brothel activities. They'd all need a rest option, but otherwise the list should be manageable. Balanced against that, a girl would have to do all her activites in the same duty area - so she couldn't go whoring in the morning and explore the catcombs in the evening. That shouldn't be too limiting,although it's harder to see why she might not be able to whore in one shift and work behind the bar in another. What I would miss is being able to block select a group and change them all - although I might be able to make that work

I'd need to lose one of the time slots to make room as well - lost sight of this detail when I was making the headings. Either that or use numbers rather than descriptions for happiness and so forth...

Maybe the solution is just to keep the number of possible jobs small :)

SimBrothel opens a window displaying the available jobs in an iconview (a window displaying named icons). That's quite a visual approach IMHO, especially if you give each job an icon.
Another option is having a list of jobs somewhere that you can drag and drop into slots in the schedule. Not sure why that would be a good idea though.

Hmm... the popup selector would be my second choice, but I can see that getting fiddly quite quickly. Which incarnation of SimBrothel is that?

Now I'm off to look at ldconfig. Thanks for the reply :)

No problem. Let me know if I can be of further assistance.
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 17, 2013, 12:41:28 PM
Hmm... the popup selector would be my second choice, but I can see that getting fiddly quite quickly. Which incarnation of SimBrothel is that?
The original one. I have not played it since the fund-raising effort. That version only had a couple jobs (9?), so it had no problems displaying them all anyway.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 18, 2013, 05:52:00 PM
The original one. I have not played it since the fund-raising effort. That version only had a couple jobs (9?), so it had no problems displaying them all anyway.

Fewer than that, now I look at it: Whoring, Tea Ceremony, Resting and four training options. Seven in total. Just shows that we don't need so much complication to make a good game :)

And on the subject of needless complication: :)

(http://i.imgur.com/gj99TU1.png)

That's constructed in game, but still with mock-up data. I might end up re-thinking the whole thing yet - a screen that's going to get looked at so much should be clearer, I feel. I'll see how it goes, I guess.

The alignment on some of those buttons could stand some smartening up too, now I look at it again. Oh well...
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 19, 2013, 04:11:43 AM
You could use colour indicators instead of the grade-like system. Something like a little lamp, turning from green to yellow to red. Easiest to implement and understand are probably three (or five) hand-picked colours for that lamp. More information could be provided by implementing a gradual change between the "border colours", but I've only done that for progress bars showing the whole gradient, so I don't know how to do it for a single spot.
Title: Re: I've been messing around with pygame
Post by: DocClox on November 19, 2013, 05:58:31 AM
Hmm... I could maybe make a gradient strip that's bigger than the indicator, but give the widget a small size.  Then I'd be able to shade gradually by moving the strip so a different part showed through the viewport. Add a little brass lamp as a casing and it could work very well.

If I do that, I'll probably restyle the board to look more like zone 1930s railway departure board. that should let me use a font that's a bit easier to read. maybe disk back the colour on the burnished brass a little while I'm at it :)

[edit]

That worked. I needed to use 2 nested QLabels to make the scrolling work, but that should work fine

[edit]

OK, restyled with colour lamps and a steampunk departure board look for the text bits. I might lose the last row and add a couple of scroll up/scroll down buttons. I'll make it respond to PgUp/PgDown and arrow keys in any case, but explicit buttons are always a good idea. Maybe restyle the monitor and image to use square frames.

(http://i.imgur.com/Vo4mQ18.png)

Overall, I think I like this one better. What do you think?
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 19, 2013, 04:14:13 PM
Looks better, more interesting and IMHO makes it easier to spot problems (red color). Nicely done!
Title: Re: I've been messing around with pygame
Post by: DocClox on November 19, 2013, 04:34:10 PM
I agree. That was a good idea about the lamps :)

Here's a test strip for the lamps. Values range from 100% to 0 in 20% intervals, with the last one being deactivated.

(http://i.imgur.com/7JJ2AZ3.png)

They'll fade smoothly in 1% intervals (or less if need be). Want me to post the code?

Title: Re: I've been messing around with pygame
Post by: rudistoned on November 19, 2013, 04:38:46 PM
I'm always interested in code, sure! :)


Would it be okay if I used that code in my game? All character stats in Pytherworld scale from 0 to 100, so a widget like that will almost certainly be useful somewhere.
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on November 19, 2013, 04:50:13 PM
Ahh, you renamed the thread! I don't know what's going on now?
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on November 19, 2013, 04:51:58 PM
Looks like this is getting more serious  8)


Update:
It just struck me again that all these screens are customized Qt widgets. Isn't it great how malleable Qt can be if you press the right buttons (or maybe punch hard enough  :D  )?
Title: Re: I've been messing around with pygame
Post by: DocClox on November 19, 2013, 04:59:09 PM
Would it be okay if I used that code in my game? All character stats in Pytherworld scale from 0 to 100, so a widget like that will almost certainly be useful somewhere.

By all means use the code. Is it ok if I ask you to make your own lamp fittings? I mean I'm sure you would anyway.

Anyway, here's the code:

Code: [Select]
from PyQt4 import QtGui
from PyQt4.QtCore import Qt

class TartBarLamp(QtGui.QWidget):
        def __init__(self, *args, **kw):
                QtGui.QWidget.__init__(self, *args, **kw)
                self.setGeometry(0, 0, 39, 41)
#
#               this widget is going to be our viewport
#               we set it to be smaller than the grad
#               so the grad will be clipped to size
#
                vport = QtGui.QLabel(self)
                vport.setGeometry(8, 8, 25, 25)
#
#               now here's the grad itself.
#               I've used one about 10x the size of the port
#               but any size will do. bigger the grad, the
#               smoother the transition should be
#
                grad = QtGui.QLabel(vport)
                grad.setGeometry(0,0,34,229)
                path = "resources/grad.png"
                grad.setPixmap(QtGui.QPixmap(path))
                self.grad = grad
#
#               I want a grey lamp for when there is no data
#               so this is a plain grey texture.
#
#               we position it over the viewport and hide it
#               so the lamp is initially ON
#
                grey = QtGui.QLabel(self)
                grey.setGeometry(7, 7, 28, 31)
                path = "resources/tart_bar_lamp_grey.png"
                grey.setPixmap(QtGui.QPixmap(path))
                grey.hide()
                self.grey = grey
#
#               this is the lamp image that sits over the
#               viewport
#
                lamp = QtGui.QLabel(self)
                lamp.setGeometry(0, 0, 39, 41)
                path = "resources/tart_bar_lamp_2.png"
                lamp.setPixmap(QtGui.QPixmap(path))

#
#       set the lamp to represent X% value for a stat
#
#       expects an integer percentage
#
        def set_percent(self, percent):
#
#               first make sure it's turned ON
#
                self.switch(True)
#
#               convert to floating point
#
                fval = percent / 100.0
#
#               the way I set the grad up, green is at the
#               top of the strip. But I want green to mean
#               100% so I need to invert the ratio.
#
#               I'm sure there's a simpler way to go about this bit
#
                fval = 1.0 - fval
#
#               now scroll the grad strip down behind the viewport
#               proportionally speaking
#
                offset = int((229-25) * fval * -1)
                self.grad.move(0, offset)

#
#       toggle switch on and off
#
        def switch(self, bval):
                if bval:
                        self.grey.hide()
                else:
                        self.grey.show()

if __name__ == "__main__":
        import sys

        app = QtGui.QApplication(sys.argv)

        top = QtGui.QLabel()
        top.setGeometry(0, 0, 520, 80)
        path = "resources/wood.jpg"
        top.setPixmap(QtGui.QPixmap(path))

        xoff = 20
        lamp1 = TartBarLamp(top)
        lamp1.move(xoff,20)
        lamp1.set_percent(100)
        xoff += 70
        lamp2 = TartBarLamp(top)
        lamp2.move(xoff,20)
        lamp2.set_percent(80)

        xoff += 70
        lamp3 = TartBarLamp(top)
        lamp3.move(xoff,20)
        lamp3.set_percent(60)

        xoff += 70
        lamp4 = TartBarLamp(top)
        lamp4.move(xoff,20)
        lamp4.set_percent(40)

        xoff += 70
        lamp5 = TartBarLamp(top)
        lamp5.move(xoff,20)
        lamp5.set_percent(20)

        xoff += 70
        lamp6 = TartBarLamp(top)
        lamp6.move(xoff,20)
        lamp6.set_percent(0)

        xoff += 70
        lamp7 = TartBarLamp(top)
        lamp7.move(xoff,20)
        lamp7.switch(False)
        lamp6.set_percent(0)

        top.show()
        sys.exit(app.exec_())

That ought to do it. here's the images I used:

(http://i.imgur.com/sC40JgX.png)

(http://i.imgur.com/qzAhhir.png)

(http://i.imgur.com/2amygw6.png)

Ahh, you renamed the thread! I don't know what's going on now?

Like rudy said - I've decided to take this a bit more seriously. I've certainly moved beyond the "messing around" stage :D

It just struck me again that all these screens are customized Qt widgets. Isn't it great how malleable Qt can be if you press the right buttons (or maybe punch hard enough  :D  )?

Oh yeah :D And I've got a feeling I'm just scratching the surface ...
Title: Re: I've been messing around with pygame
Post by: rudistoned on November 19, 2013, 05:32:45 PM
By all means use the code. Is it ok if I ask you to make your own lamp fittings? I mean I'm sure you would anyway.
Of course that's okay, those are your graphics after all. I named the fittings "donotuse.png"  ;D
Lamp fittings matching the art style will be necessary, sure, but at the moment Pytherworld does not even have an art style. Well, I'll worry about graphics when it get to them. For now, my concerns are elsewhere.
Thank you very much! Your code works on my system, again by just replacing PyQt4 with PySide.


Oh yeah :D And I've got a feeling I'm just scratching the surface ...
If you ever feel like taking a dive, look at the graphics view framework (http://qt-project.org/doc/qt-5.0/qtwidgets/graphicsview.html). From what I've seen it's powerful and flexible.
Title: WhoreMaster: Abbey's Crossing
Post by: DocClox on November 20, 2013, 04:50:35 PM
If you ever feel like taking a dive, look at the graphics view framework (http://qt-project.org/doc/qt-5.0/qtwidgets/graphicsview.html). From what I've seen it's powerful and flexible.

I've been looking at some of the model/view stuff, but that looks fun too. If I ever decide to try and add a dungeon crawling mini-game, that looks like the way to go.

Here's another test strip, this one for the job boxes.

(http://i.imgur.com/SlR74PZ.png)

I think that's all the jobs I have planned, at least for the time being. Any others will probably be depend on special circumstances.

Now, I need a menu of some sort for all those, and then I need to start putting it all together and hooking it up.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on November 21, 2013, 02:13:35 PM
Menu Widget:

(http://i.imgur.com/1InCnTZ.png)

That's just the design and the basic graphics, of course. If I have more jobs than that, I might make it so the slots rotate with arrow keys or the mouse wheel. That would be cool.

I'd love to animate some of these widgets as well. I made a start with that on the main screen with the moving pointer and the blinking lights, but I've not really pursued it further.

Oh well, one thing at a time, I suppose :)

[edit]

Didn't get much done tonight, but I managed to stitch the "tart bar" together

(http://i.imgur.com/QWcJTKW.png)

The darker red is to indicate the currently selected row.

[edit]

Tart bar with header widget

(http://i.imgur.com/BrbmtBP.png)

The headings have tootips offering more detail, but they don't seem to want to screenshot

[edit]

OK,  replaced the old  table with the new oneL

(http://i.imgur.com/NZcDrPr.png)

Not bad, but the screw brackets I added kind of crowd out the other panels. I think I'll definitely need to redo those.

Otherwise, it's working quite well :)

[edit]

Reworked the image frame and monitor to fit in better with the style of the table. I'm putting a bit of thought into how these things are supposed to be attached to the wall and it seems to be paying dividends :)


(http://i.imgur.com/saZvnaW.png)

I can see me having to go back and redo the art for the main screen before I'm done. Oh well, I'll worry about that after everything else is working :)

[edit]

A couple of elevator style buttons for paging through the lists of girls, should that become necessary.

(http://i.imgur.com/WTwFj3o.png)

Same widget with mouse-down  on the up button.

(http://i.imgur.com/QsKiSq3.png)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on November 23, 2013, 08:11:47 AM
I made those buttons way too big. I was thinking of them as an extension of the monitor rack, but in practice, they just dominated the whole screen. So I redid the buttons at half size.

I think they're still a bit big. What do people think?

(http://i.imgur.com/Yv4okI7.png)

Thing is, I expect these'll see a lot of use, so I don't want to make them too small and fiddly.  On the other hand, I expect I'll page the screen using PgUp/Down or shift and up/down arrow, so it's not that big a deal. But not everyone plays these games the same way...

I also can't decide whether to mount the panel on the mounting rack with the monitors, or just centre it under the big board. But if I do that, I think it'll need shrinking again to about the width of one of the rows
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on November 23, 2013, 08:24:40 AM
It definitely looks nice now and the required functionality is there. May I suggest to polish cosmetic details when the game is working and fun? You know what they say about premature optimization ;)
Unless you really enjoy polishing doing this now is just not necessary.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on November 23, 2013, 09:09:11 AM
It definitely looks nice now and the required functionality is there. May I suggest to polish cosmetic details when the game is working and fun? You know what they say about premature optimization ;)
Unless you really enjoy polishing doing this now is just not necessary.

I think I enjoy the visual design aspect of the thing. It's not something I get to do much, and I find a certain satisfaction in making something look right.  I enjoy talking about the design process too. Maybe a little too much.

But yeah, some days I could fiddle all day with just one widget if I let myself. I'll try not to do that so much :)

Meanwhile, on the subject  of when things look right ...

(http://i.imgur.com/EG3jeIu.png)

I think extending the mounting rack worked quite well. Next job is to make it show the slaves I buy in the Souk :)

[edit]

OK, I can buy slaves from the market, have them disappear from the market and appear in the brothel so that they're names appear on the tart board. Slight bug in that you always seem to buy the wrong slave, but that's fixable.

Not bad for a busy weekend mostly taken up with relatives :)

[edit]

Bought from the slave market and loaded in game. Still loads to do on this screen, but making progress.

(http://i.imgur.com/boNyH66.png)

[edit]

I've been trying to think of an icon for the player in the game. A button to click on and bring up PC stats and so on.

I thought about a top hat, but that didn't entirely work. So I tried this:

(http://i.imgur.com/BCcVdPk.png)

I'm vaguely thinking of giving the player the choice of playing a male or female character, and I wanted something that could reflect that.

I'm quite pleased with how they turned out in the end :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on November 30, 2013, 06:57:57 PM
Here's a teaser for you all!

It's the first cut of the intro scene I'll be using in the game. Plus a test of the Storybox widget I made, and a test of my Pyinstaller generated exes.

On the downside, it doesn't have any gameplay beyond clicking "more", and some of the scene art is pretty rubbishy.

https://www.dropbox.com/s/k9c4vq7tvda9hic/wmac.demo.7z

Anyway, have a look. Source and art files are included. I'll update this post with some screenies in a bit :)

[edit]

Start of the scene. Just the storybox and the "more" button showing.



(http://i.imgur.com/Az4OBge.png)

Later on we get some dialogue. This one shows the facebox (more of a faceball, really) and the name box

(http://i.imgur.com/WBZBLvc.png)

The facebox raises some interesting issues. In the demo, we have an explicit face image to use. In the game, the plan is that you might get a scene with any of your girls. Which is going to be awkward because most girlpacks won't have "Face" images.

So the plan is to look for files starting with "face" and use them if we find them. If not, it's going to glom on to a random profile image, scale that to size, and clip to fit. Sometimes that works well, and sometimes you get headless boob and crotch shots (which can be oddly erotic, I find) depending on the original composition and aspect ratio.

Not an ideal solution, but it lets me use standard packs, and still provides an upgrade path to do it properly.

Oh! And also today, I updated the girl management table so it supports sorting by column and multiple selection based on shift click. Not bad for a day's work.
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on December 01, 2013, 12:00:45 AM
When I retool packs, I can start adding "Face" images to them.  Are there any other varieties of file you intend to introduce?
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 01, 2013, 12:42:31 AM
Good question. I'd like some way to specify emotions if suitable faces exist, but I haven't sorted that out in my head yet. There's going to be some optional extras for the attributes in the XML too.

Give me a day or so to mull it over and I'll give you something reasonably solid :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on December 01, 2013, 04:17:19 AM
About the variety of images useful for games like this:


SimBrothel, PyTFall, Otherworld and Pytherworld each have a list of keywords/tags they use to describe the contents of their images. You could look at those lists for inspiration about image categories.


For example, in Pytherworld I add the tag "portrait" to images showing the face or face and upper part of the torso. To get a face picture, I then crop the right, left and lower parts of the image. This works reasonably well, but far from perfect. Distinguishing between face and face/torso shots would make it work a lot better.


In general, Pytherworld does not use girls/girlpacks to add girls to the game. Instead, images are described with tags by the pack maker and the game builds girls from its database of images based on the descriptions of the images. Obviously, this has quite a few advantages/disadvantages in comparison to the "traditional" approach of predefined characters.
Should you find this concept interesting, I can tell you a lot more about it. I also kept the tools necessary to implement this pretty generic so they can be used by other projects too. PyTFall is using some of them already, even though they do use "traditional" predefined characters (I think).


Gonna take a look at your intro now, thanks for posting it :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 01, 2013, 08:41:48 AM
For example, in Pytherworld I add the tag "portrait" to images showing the face or face and upper part of the torso. To get a face picture, I then crop the right, left and lower parts of the image. This works reasonably well, but far from perfect. Distinguishing between face and face/torso shots would make it work a lot better.

I thought about that. Decided in the end to use a profile pic scaled to fit, which seems to work tolerably well in SlaveMaker.

In general, Pytherworld does not use girls/girlpacks to add girls to the game. Instead, images are described with tags by the pack maker and the game builds girls from its database of images based on the descriptions of the images. Obviously, this has quite a few advantages/disadvantages in comparison to the "traditional" approach of predefined characters.

Well, the plan was to work with existing girlpacks, at least initially. Lot of them out there, might as well make use of them.

The image tagging approach has a lot to recommend it however, and you could make the case that if I am going to switch over, better sooner than later.

On the other hand, I already have a shedload of old-skool girlpacks on my machine to use as test data.  So I'll probably stick with plan A for now :)

Should you find this concept interesting, I can tell you a lot more about it. I also kept the tools necessary to implement this pretty generic so they can be used by other projects too. PyTFall is using some of them already, even though they do use "traditional" predefined characters (I think).

Definitely interesting. Sounds like something I'd want to be able to accommodate in the medium to long term..

Gonna take a look at your intro now, thanks for posting it :)

Thanks. It's as much a test of my use of PyInstaller as anything. I wanted to be sure that people other than me could run those exe files.
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on December 01, 2013, 02:19:08 PM
I thought about that. Decided in the end to use a profile pic scaled to fit, which seems to work tolerably well in SlaveMaker.
Found another solution to this problem: face recognition (http://stackoverflow.com/questions/13211745/detect-face-then-autocrop-pictures)
It's like swatting a fly with a sledgehammer (kinda hard to pull of, but the fly is as dead as it can get when you manage to do it).
If I ever need other capabilities opencv provides I'd definitely try this. Adding such a powerful and large library just for this is IMHO overkill.

Well, the plan was to work with existing girlpacks, at least initially.
[...]
if I am going to switch over, better sooner than later.
[...]
I already have a shedload of old-skool girlpacks on my machine
So you've got a whole shed full of girlpacks, huh?  ;D
Could you send me the metadata of one of these packs in text form? Maybe its easy to write a conversion script that generates tag descriptions from the metadata of the girlpack? I would not expect those converted tag descriptions to be accurate and detailed enough to be used to randomly generate girls from them though.
In Pytherworld and in regard to the image ressources, I support two variants of girls: those generated from the image database, as described earlier and those created from traditional girlpacks. For the traditional variant, the name of the character replaces the tags describing their looks for the purpose of determining images available to them. It causes some complications, but you can actually have old school pre-defined characters and randomly generated characters in the same game.
Just to make your life more difficult by offering more choices  :P  :D
Title: Re: WhoreMaster: Abby's Crossing
Post by: GonDra on December 01, 2013, 03:10:54 PM
Nice to see you working on your project DocClox.

I like the premise, especially the small scale market is nice.

Anyway I found a small Typo and thought I would drop a note on that: "Eventually, you were found wanding (wandering) the desert..."

Also nice that you can proceed with the text not only by clicking more but also by using space, I hope you are going to implement a decent shortcut system when you are building the game besides the usual mouse centric controlling method.
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on December 01, 2013, 04:38:56 PM
A very easy way to add shortcuts to a button-heavy Qt interface is to add an ampersand character (&) to the button text, right before the character that should be the shortcut. For example, &Next can be activated by pressing Alt+n.


I can also post example code for keyboard control using the shortcut system of Qt.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 02, 2013, 02:18:20 AM
Found another solution to this problem: face recognition (http://stackoverflow.com/questions/13211745/detect-face-then-autocrop-pictures)
It's like swatting a fly with a sledgehammer (kinda hard to pull of, but the fly is as dead as it can get when you manage to do it).
If I ever need other capabilities opencv provides I'd definitely try this. Adding such a powerful and large library just for this is IMHO overkill.

Yeah, sounds like it might be :)

Busy night last night, just scurrying to catch up on my correspondence before work.

Could you send me the metadata of one of these packs in text form? Maybe its easy to write a conversion script that generates tag descriptions from the metadata of the girlpack? I would not expect those converted tag descriptions to be accurate and detailed enough to be used to randomly generate girls from them though.

That sounds like a good idea. Do you want just the picture categories or the XML descriptors as well?


Nice to see you working on your project DocClox.

I like the premise, especially the small scale market is nice.

Anyway I found a small Typo and thought I would drop a note on that: "Eventually, you were found wanding (wandering) the desert..."

Thanks. I'll fix that :)

Also nice that you can proceed with the text not only by clicking more but also by using space, I hope you are going to implement a decent shortcut system when you are building the game besides the usual mouse centric controlling method.

I've been planning to implement WM's shortcuts plus as many more as I can think of. Of course, having things like multiple slave markets is going to play hob with that, so I might need a bit of a rethink there. But I like my keyboard shortcuts, so there'll be as many as I can manage.

A very easy way to add shortcuts to a button-heavy Qt interface is to add an ampersand character (&) to the button text, right before the character that should be the shortcut. For example, &Next can be activated by pressing Alt+n.

I can also post example code for keyboard control using the shortcut system of Qt.

That would be good of you. I was reading about keyboard shortcuts, but I've not had a chance to try them out yet. Currently I'm having the screens listen for key events directly, which works well enough, but better if they don't have the additional complication.
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on December 02, 2013, 03:43:39 AM
That sounds like a good idea. Do you want just the picture categories or the XML descriptors as well?
Since I don't know yet what is saved where and you don't know what data my systems can work with, all available metadata would probably be best (picture categories and XML descriptors, even though I don't even know what that is ^^).

Update:
Code: [Select]
from PySide import QtGui
from PySide import QtCore
from PySide.QtCore import Qt as QtNS  # Qt global namespace

class MyCustomWidget(QtGui.QWidget):
    def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
        # add shortcut keys
        KeySeq = QtGui.QKeySequence
        Shortcut = QtGui.QShortcut
        Shortcut(KeySeq(QtNS.ALT + QtNS.Key_Left),
                 self, self.shortcut_handler_alt_left)
        Shortcut(KeySeq(QtNS.Key_Left), self, self.shortcut_handler_left)
The code is a generalized piece from one of my projects. It's untested, but should generally work. Let me know if you run into problems.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 02, 2013, 06:03:27 PM
Thanks for the code. I'll have a play with it when I get the signals sorted out for that auction screen :)

Since I don't know yet what is saved where and you don't know what data my systems can work with, all available metadata would probably be best (picture categories and XML descriptors, even though I don't even know what that is ^^).

Well, most of the image metadata is in the file names. They're all of the format TypeN.ext where ext is an image extention and "Type" is one of "Profile" for non-sex pictures, "Anal", "Beast" (bestiality), "Death" (also exhausted and/or defeated), "Group", "Les" (-bian) and (normal) "Sex".

The XML description data is more about the girl there are a pile of stats and skills. Most of these are in the range 1-100

Charisma, Happiness, Libido, Constitution,Intelligence,Confidence.Mana,Agility,Fame,Level,AskPrice,House,Exp,Age,Obedience,Spirit,Beauty.Tiredness
Health,PCFear,PCLove,PCHate,Anal,Magic,BDSM,NormalSex,Beastiality,Group,Lesbian,Service,Strip,Combat,Gold,Status

Most of them should be fairly obvious, but House is the default house percentage for a non-slave girl and Status can be catacomb, slave or normal and defines where she might be encountered. There's also generic girls who have random ranges for these things and a couple of other stats as well "Human" and "Catacomb", the latter replacing "Status"

Then there are traits, which are boolean markers for various attributes. Some have game effects, others are purely cosmetic. Unique girls get a list of these, generics get a list with probabilities attached to each entry.

There are quite a few of them. I'll just attach the old CoreTraits file here rather than type it all in. It's all in plain text anyway.


Title: Re: WhoreMaster: Abby's Crossing
Post by: Blubbif on December 02, 2013, 07:38:21 PM
Hi all. It's nice to see a successor to the original WM. The screens already look a lot more visually appealing than the original color scheme.  ;)

I've been trying to think of an icon for the player in the game. A button to click on and bring up PC stats and so on.

Yes, that would be a definite improvement. In WM the player character always felt less like an actual character and more like an omnipresent entity with money. Are you thinking of adding new stats?

I'm vaguely thinking of giving the player the choice of playing a male or female character [...]

I would greatly encourage the idea. Giving the player some more customization options is always a good idea and I'm sure some people would appreciate being able to play a female character.

Following the same train of thought, it might be a good idea to give slaves/employees the gender option as well. I personally don't care very much for male slaves and I doubt there will be any for a while, but someone might like them and add a few. And it's usually easier to add options during planning rather than after everything is already implemented.

I'm definitely looking forward to the release of the source. Maybe I'll have an excuse to dip into Python then.  ;D
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 03, 2013, 07:44:09 AM
Glad you like the style. The first cut of this was a skin for the original WM, way back when. it was a bit too much trouble to keep it updated and work on the code though, so I let it lapse.

PC stars are definitely going to get a bit more attention, as is his or her location in the city. I want to make the PC's time a precious commodity once again.

Female PCs were have been a long standing request in the game, so they're very likely to happen. plus I have some female friends who get put off WM because they feel forced into a male role. And there are some misadventures possible for females that just wouldn't appeal for a male PC.

Male slaves... well, it's no kink of mine, so it won't be getting much priority. What I might do is have a "male" trait, and key the standard master- slave scenes to exclude males. that way, it anyone wants to make a pack and write the scenes, they can. That's about all I'd be willing to do, but if there's enough interest, I'm sure someone will step on up.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 05, 2013, 03:56:51 PM
I've been working on the menu widget for the girl management screen.

(http://i.imgur.com/MHGfqN5.png)

That thing is going to slide in from the left screen, a bit like one of those library ladder-on-rails things you sometimes see pictures of. And possibly the menu elements dropping down from the top as it slides. It does that at the moment, but I'm not sure it works so well as just sliding the rails.  I might also have the whole contraption sometimes drop down from the top. It seems a shame to have all these mechanical looking widgets and not have them do anything :)

I was thinking of compiling this so people could see it moving, but it seems a bit OTT at the moment. Maybe once I have it plugged into the Tart Board and more or less working.

I've also been doing some work on an Otherworld style auction. No screenies since I used the Otherworld images, but there should be auctions turning up both in  WMAC and in Pytherworld in due course.

[edit]

Annnnnddd... I've just discovered that during the week I accidentally clobbered the file that I was working on last saturday. That's all the sorting and multiple selection stuff gone and needing to be redone. With the amount of free time I have at the moment, that amounts to wiping out a week's work.

Damn, that's annoying...

[edit]

Right, that's the sorting back again. Now for multiple selection, and I'll be in a position to see about getting that sliding menu integrated.

[edit]

OK. That's selection and multiple selection based on shift-click working. Actually, what I've got is probably what I'd expect for control-click (add/subtract clicked row from selection) where shift click should select a range. But I might just leave it the way it is.

Next: paging through the list using arrow keys, PgUp and Down and the arrow buttons ...

(edit) paging works, more or less. Need to check a few things regarding selection, otherwise it's all there.  would have been a lot easier if I'd used a QTableWidget, but those things are a right pain to style, and the headset didn't want to change at all.

Anyway, I have a few RL things to do, and then I can get started moving that menu.

and if I get that working, IRL l it'll be time for some job code after which we'll have something that will be almost playable.

This might actually happen :)

[edit]

Ha! Got the QPropertyAnimation working. And with easing curves too! This is going to make it a log easier to do things like the moving pointer on the main screen viewer. I can get the bounce effect i was after a lot easier too...

Also, I just noticed that the text on two of the job labels has run together where I missed out a comma in a list. I'd post a revised image, but I expect everyone has got the general idea :)

[edit]

Right. That's a couple of subtle bugs in the scrolling and selection squashed. There's a lot of complexity in the list handling, and I suspect that there are still issues.  But it'll do for now. In time I may come back to this and re-implement it as a custom list view and let Qt to most of the hard work.

[edit]

OK. Finally!

(http://i.imgur.com/Iiia8sZ.png)

The menu slides in until it's next to the column you clicked. If you click another cell in a different column, it slides to be next to that one. I've not added code to dismiss the thing yet, so it zips around the screen when you click a new cell.

I like it.

Next up, making the menu items do something, dismissing the menu, maybe have random options to slide in from above and from the right, just to help maintain the illusion that something larger is happening than just the bit of screen that you can see :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 08, 2013, 11:24:31 AM
OK, I have the job menu working, more or less.

Anyone interested in an executable demo? I'd quite like some feedback on the interface so far, especially how the girl table and menu work.

I should probably also stress at this point that this is not a working game yet. You can buy girls and you can assign them jobs, but there's no way as yet to advance the time, so there's no way to actually play anything.

That said, feedback would be useful.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DarkTl on December 08, 2013, 11:42:50 AM
Sure, I have tested brothel games for a while now. If you ever need feedbacks, just give me links  :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: Xela on December 08, 2013, 11:46:43 AM
Yeap, I would like to check it out as well.
Title: Re: WhoreMaster: Abby's Crossing
Post by: E. on December 08, 2013, 11:47:21 AM
Go for it, I love testing stuff.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 08, 2013, 02:08:16 PM
You got it!

https://www.dropbox.com/s/qfmhzvjrrq8wwyt/wmac.7z

Screens implemented are basically what's been screenshotted in this thread. Some of the WM hotkeys work, but not necessarily all the places you'd expect them to work.

The menu widget on the tart management screen can be dismissed with "Escape"

Let me know how you find it.

[edit]

Oh yeah, I've included a couple of cut down girlpacks for testing, but nothing much. It should work with any pack compatible with vanilla WM if anyone wants to test that.

Chances of uniques showing up in the souk are low however. 5% for one slot, 1% for the next and 0 for the rest.  Just so you know
Title: Re: WhoreMaster: Abby's Crossing
Post by: Xela on December 08, 2013, 03:10:22 PM
Awesome, really clean interface and good design. Well done!
Title: Re: WhoreMaster: Abby's Crossing
Post by: DarkTl on December 09, 2013, 12:41:51 AM
Yup, interface looks great. Too bad you cannot exit from that screen where you create a timetable for girls though.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 09, 2013, 02:25:43 AM
Awesome, really clean interface and good design. Well done!

Yup, interface looks great. Too bad you cannot exit from that screen where you create a timetable for girls though.

Thanks guys. I keep forgetting that button isn't hooked up yet. For now you can get back to the main screen with the "m" hotkey.

How did you both find the menu and the way the job selection worked? Did it seem logical and sensible?
Title: Re: WhoreMaster: Abby's Crossing
Post by: DarkTl on December 09, 2013, 02:38:52 AM
Yeah, it is seems logical. Although, at first I was somewhat confused by some decorations, like those blinking lights, for example. I'm still not sure if they are just decorations or will have a value in the future  :)
I guess tooltips of some kind could be useful there.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 09, 2013, 02:08:22 PM
Yeah, the blinking lights are just blinking lights. Mainly there to look cool :)

Tooltips are an ongoing project. I worked out how to add them fairly late, so most things don't have them yet.

Changing the subject, I've been thinking on the subject of the girls' level in the game. I'm thinking that low level girls can probably get through a lot more customers in a night, but they get paid less per trick. The high class whores do comparatively few but the amount they charge more than makes up for it.

Something like this, maybe:

Code: [Select]
lvl 0   10 mins            10 sigils    # 1440 max income for 24 hours working flat out
lvl 1   30 mins            50 sigils    # 2400
lvl 2   60 mins           150 sigils    # 3600
lvl 3   3 hours           750 sigils    # 6000
lvl 4   6 hours          2000 sigils    # 8000
lvl 5   1 day           10000 sigils    # 10000

The Sigil being the currency used in Abby's Crossing.

So your typical level 0 scrubber might have punters lined up round the block, but to work that fast, she's basically dishing out quick handjobs and blowjobs and pushing them out the door and leaving them to zip up in the street. She sees a lot of customers, but no one is going to pay a lot for that sort of treatment.

At level one, she gets half an hour rather than 10 mins. That's time enough to make a little small talk, make the process seem a bit less impersonal to the customer. It also gives her time to wipe the spunk from her lips before she sees the next john. The punters feel better about it and they pay more.

At level two, she's giving quality treatment. You get time for a drink and some chit-chat. She'll do it more than once if if the customer wants, maybe a little light roleplay. 

Level three you're hiring more of a call girl than a whore. This is someone who can accompany you for a meal out and talk to you about whatever interests you. She could be hired to dance, maybe do a couple of your friends for a small tip on top.

Level four and you've got a professional escort who can pose as your steady girlfriend, or provide the entertainment for a batchelor party. You're paying good money and she's more than willing to earn it.

Level five, you're hiring her by the day. We're leaving "call girl" and "escort" behind now for "courtesean" This is a girl you can hire to accompany you for a holiday by the sea, or if you can afford it, to live with you as your wife.

Of course, high class girls cost more in maintenance. You're not going to get barons and earls to thousands for dirty waif wearing a greasy shift, no matter how good she is at fucking. They expect silk and perfume and if you want your girls to operate at that level, you need to supply the tools of the trade. And there's also the question of availability - clients who can afford the level five treatment are comparatively rare.

Anyway, a few thoughts on how we might nuance the level time and payment question a little. Comments welcome.
Title: Re: WhoreMaster: Abby's Crossing
Post by: slate on December 09, 2013, 04:20:10 PM
Hello Doclox!

Good to hear about your work.
I consider myself a fairly good python programmer, maybe I can help.
However, I have never done gui work before. Mainly because I am not good at interface design, where you have no problems, as I see it.

I am running linux, wine cannot play your exe verry good.

If you are interested, maybe I can help.

Slate



Been messing around with pygame and PGU. I wasn't too impressed by Ren'Py when I looked at it before. I mean it's excellent if you're writing a VN, but seemed a bit of a pain if you needed to add a lot of actual game to the text boxes.

Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 09, 2013, 06:48:43 PM
Hello slate!

I keep forgetting I'm not the only Linux-head on this list. I'm  developing on Linux using Python 2.7.6 and Qt4. If that suits, I would welcome a hand porting some of the job code from the original WM. It's getting late now - I'll get back to you tomorrow with some specifics.

Title: Re: WhoreMaster: Abby's Crossing
Post by: DarkTl on December 10, 2013, 02:26:18 AM
Looks like the difference between the levels is considerable. While it's an interesting conception, I wonder how (and how often) girls are supposed to level up in order to not break the balance. I believe you can afford only a few lvl5 girls, while in most games (including WM) the higher level, the better.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 10, 2013, 06:24:05 AM
I think it should be OK. The per-fuck earnings rise dramatically with level, but the increased time spent with customers means that per-shift earnings are only about 50% higher for each level.  that's assuming both girls see as many cutlers as they are able, of course.
Title: Re: WhoreMaster: Abby's Crossing
Post by: slate on December 10, 2013, 01:51:34 PM
Hello slate!

I keep forgetting I'm not the only Linux-head on this list. I'm  developing on Linux using Python 2.7.6 and Qt4. If that suits, I would welcome a hand porting some of the job code from the original WM. It's getting late now - I'll get back to you tomorrow with some specifics.

Ok, I am waiting for it.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 10, 2013, 02:02:59 PM
Cool, I'll send you a PM in about 20 mins or so :)

Just got in from work, fed the cats, ate some supper and finished off this mornings project. I was starting on the game turn code and I realised I'd need to show the shift somehow as well as the day.

(http://i.imgur.com/ZUGBG0u.png)

I never was that happy with the old one anyway :)

[edit]

@slate: check your PMs :)

[edit]

Building the widget above progamatically. This is a test strip to make sure the digits are all readable. I don't have much space to
to work with, so they need to be compact.

(http://i.imgur.com/5Jd5hNu.png)

I hope I'm not boring people with all these screenshots. Posting helps keep me focused on the task at hand.
Title: Re: WhoreMaster: Abby's Crossing
Post by: rudistoned on December 11, 2013, 02:28:13 AM
I finally got around to testing your intro demo. I worked flawlessly on a Windows 7 machine.


Concerning the story: I liked it, it drew me into the game. I always like to start as low as possible so there is more room for development.
I'd also like to make a suggestion. The starting point of the story seems to be that the player has established himself as brothel owner in another city (Crossgate?), then leaves that city to expand to Abbey's Crossing. If that's the case, what is stopping the player from sending a message to his organization asking for additional funds? I would suggest to allow the player to do just that. The intial result should IMHO be that one of the 2nd row guys in the organization grabbed all the power when they heard news about the sandstorm swallowing the caravan. They might respond that the player must be an imposter since no one survived the storm and the raider attack. They also might send assassins to deal with the player, just in case he is not an imposter. Some people in the organization might still be loyal to the player and might send a little help secretly. Quite a few ways to take the story from there.


I'll get back to you about the girlpack metadata stuff. I have not found time to look into it yet.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 11, 2013, 07:42:50 AM
hi rudi, glad you liked it:)

I left things intentionally a little vague in the into. in the next scene there's going to be some "immigration papers"to fill out that'll give the player a chance to choose some background details. Those would include city of origin (so players don't have to come from Crossgate)  gender and whether they want to be free or a trusted slave. So I've been trying not to say anything that would contradict any of those.

I like the reason why there's  no support from central HQ. I was going to have Crossgate cut off by a unusual dimensional rift activity, but an ambiguous underling seizing control might work better. Of course, the details will depend somewhat on background.

of course, the more options there are the more writing I have to xiii for each scene, so all the above may be subject to change :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DarkTl on December 11, 2013, 09:38:28 AM
Well, you said it yourself that clients who can afford lvl5 girls are rare. So if you have too many lvl5 girls, you'll be bankrupt. And if you don't have any control over level ups, eventually you will have too many high-level girls.
Title: Re: WhoreMaster: Abby's Crossing
Post by: E. on December 11, 2013, 09:44:42 AM
Or you can let the player choose what kind of customer each girl can serve. It sure is a waste to let bums have their way with high ranking girls, but you gotta get cash in. In short, you choose your target demographics.
Additonaly, increase the occurrence of rare customers based on the average rank of your girls.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 11, 2013, 01:26:23 PM
Well, you said it yourself that clients who can afford lvl5 girls are rare. So if you have too many lvl5 girls, you'll be bankrupt. And if you don't have any control over level ups, eventually you will have too many high-level girls.

Yeah, I didn't get to post all the details. The idea is that you'll not have to operate them at max level. In fact some of them may be happier at the sluttier end of the market, even if they have the skill to entertain nobility. I might also allow you to make them work above their current level (less chance of success, more experience).

Also, a level 0 girl working flat will be almost dead at the end of 24 hours. At level six, the same girl has been wined, dined, pampered and allowed a long lie in before a bout of morning sex. So higher level girls don't get so tired so fast. Which means there's an advantage in rotating them when you can.

There are subtleties here that I hope will lend themselves to different effective strategies. I need to wargame some of this stuff  and see how it scales, but if it doesn't look like it's going to work, I promise I won't use it.

Or you can let the player choose what kind of customer each girl can serve. It sure is a waste to let bums have their way with high ranking girls, but you gotta get cash in. In short, you choose your target demographics.

That too. I might even take a leaf out of the original SimBrothel and make level increases depend on special training, so you would be able to choose who gets promoted and who not.

[edit]

Here's a test plate for the new widget, breaking it down and then building up in code.

(http://i.imgur.com/jWxlcFx.png)

Of course, at some point I'll need to re-do most of the main screen to fit. But then I was going to have to do that anyway :)

Maybe a couple of pixels more between the year and month and between the month and the day, perhaps?
Title: Re: WhoreMaster: Abby's Crossing
Post by: AkiraTepes on December 11, 2013, 08:05:36 PM
Looking good DocClox! 8)  Can't wait to give it a play ;)
Title: Re: WhoreMaster: Abby's Crossing
Post by: Marquis on December 12, 2013, 08:36:09 AM
I agree that a tiny bit more space between year-month and month-day would be better visually. That said, I think the way SlaveMaster3 handles this could be useful also: day and time is useful most of the time for planning shifts, etc. and should be shown on most planning screens. The date could be on a separate page in a calendar format showing any key events in the future (or past). Calling up the calendar could be used for longer term planning.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 12, 2013, 02:27:39 PM
Looking good DocClox! 8)  Can't wait to give it a play ;)

Thank you. I'm feeling much the same way about it. (Generally a good sign :))

I agree that a tiny bit more space between year-month and month-day would be better visually. That said, I think the way SlaveMaster3 handles this could be useful also: day and time is useful most of the time for planning shifts, etc. and should be shown on most planning screens. The date could be on a separate page in a calendar format showing any key events in the future (or past). Calling up the calendar could be used for longer term planning.

That's a fair point. We don't really need the date, but day number and time would be useful on some other screens.

I'll have a think on that.

And yeah, we are going to need a calendar :)

Here's a design pic for the turn summary screen

The idea is that the LEDs along the  top are toggles which can filter the events in the sidebar. The shift buttons underneath act as filters as well. The mini-leds on the plates are just there so you can see at a glance what categories an event falls into. All I need now is room for some text and a couple of navigation buttons. Still, getting there...

[edit]

Getting there...

(http://i.imgur.com/nZME6jA.png)

[edit]

removed the earlier WIP - not enough difference to be worth having two pics

[edit]

Coded up the header for the screen. All lights toggle and emit signals. Took a bit more juggling than I was expecting. I think  inkscape is rendering fonts too small. Either that or Qt is making them too big.

Anyway, I got it all to fit in the end.

(http://i.imgur.com/TYQQOpp.png)

[edit]

Another test image:

(http://i.imgur.com/WNspyos.png)

This rather unimpressive little thing is the result of a lot of work today. I wanted to be able to draw the outline of the font, and I knew that  QPainterPath could do that. And I wanted wo work out how to do that.

Still not sure the results are worth it. It looks a little pixelated compared to the inkscape version, even with all the antialiasing hints set.

I'll see what it looks like when it's in place. If it looks a mess, I can always draw the numerals normally.

[edit]

actually, looking at it on the web page, it looks ok. Funny that.

[edit]

Main panel is starting to come together:

(http://i.imgur.com/O4l4lUo.png)

[edit]

Another case of "doesn't look much but does cool stuff under the hood".

(http://i.imgur.com/Dvke0gv.png)

For this little beast, I've used QLinearGradient to generate the brass effect grad rather than exporting images from inkscape. That's going to cut down a lot on the number of images I need in the resource section, and will help me get a consistent look to the brass panels in the game. I feel quite proud of myself!
Title: Re: WhoreMaster: Abby's Crossing
Post by: malandor on December 20, 2013, 01:46:11 AM
interesting game will be extreamly interested to see the finished product
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 20, 2013, 01:28:38 PM
interesting game will be extreamly interested to see the finished product

Me too :)

Not a lot to look at this week. Been all sorts of busy and stressful, both at work and home, so I've not had much energy to work on the screens. That said, I do have a bit of a treat for those of you who like stats and game balancing and who aren't afraid of a little Python.

I did some googling for Python and Simulation and encountered SimPy (http://simpy.readthedocs.org)[1] - a really neat simulation package in Python. So I had a bit play with it. All of the Slavemaker/WM/SimBrothel type games are, at heart, simulations, and getting the sim part of it balanced is very difficult. So being able to separate out the sim from the boobies and test that it works is potentially very valuable.

Code: [Select]

# horrible coding here. will refactor if I get a chance
#
import simpy    # if we combine this with Ren'Py, do we get Ren and Simpy?
import random
import math

SHIFT=60.0*6.0

L0=0.65
L1=0.30
L2=0.05

#
# class representing the ladies providing the service
#
class Server:
    def __init__(self, env, name, charm, skill):
        self.env = env
        self.name = name
#
#        affect demand and satisfaction
#
        self.charm = charm
        self.skill = skill
#
#        the resouce lets customers queue to gain access
#
#        actually I think I want a queue outside and 1:1 access inside
#
        self.res = simpy.Resource(env, 1)
#
#        earings and other accountancy
#
        self.cash = 0
        self.hap_count = 0
        self.sad_count = 0
        self.ccount = 0
        self.skill_check = False

#
#    end of shift report for this valued employee
#
    def report(self):
        print "{0:12s} {1:3d} {2:3d} {3:3d} {4:3d} {5:3d} {6:5d} ".format(
            self.name,
            int(self.charm),
            int(self.skill),
            int(self.ccount),
            int(self.hap_count),
            int(self.sad_count),
            int(self.cash)
        )

#
#    should return true if able to service
#
    def free(self):
        return self.res.count == 0

    def earned(self, inc):
        #print self.name, ": earned ", inc
        self.cash += inc

    def satisf(self, clev):
        self.ccount += 1
        roll = random.uniform(0, 100)
        diff = self.skill - roll
        if diff > 0:    # pass
            self.hap_count += 1
            return 1
        if -1*diff > 25:
            self.sad_count += 1
            return -1
        return 0

class House:
    def __init__(self, env):
        self.servers = [ ]
        for i in range(3):
            server = Server(env,
                name = "server_{}".format(i),
                charm    = random.randint(1,50),
                skill    = random.randint(1,50)
            )
            self.servers.append(server)
#
#        sort them by looks and skill, in that order
#        we can get more creative with the selection process later
#
        self.servers = sorted(self.servers, key = lambda g: g.charm * 100 + g.skill, reverse=True)
#
#        rep draws in the customers. rep 10 gives us a mean of 10 cusomers per shift
#        which would normally be adjusted for the time of day.
#
#        actual numbers can vary a fair amount
#
#        plan is to make rep go up and down with customer satisfaction.
#        so if a lot of them go away unhappy, the number of punters will slowly
#        decrease over time
#
#        Actually, I'd like to base this one fame and reputation
#        where 100 rep gives a nice bonus to the number of customers
#        and -100 rep means that everyone knows your house a den of
#        slavers and murderers and the only visitors you'll get will be
#        adventurers and guardsmen.
#
#        but for now, we keep it simple
#
        self.rep = 20.0
#
#        mean time between arrivals - we'll pass this on to random.expovariant
#        to get a realistic scattering of times
#
        self.mean_tba = SHIFT/self.rep
        self.n_bored = 0
        self.n_custs = 0
#
#        the door: we allow N people inside at a time
#        (where N == number of servers)
#
#        if the house is full, you queue to get in the door
#
        self.door = simpy.Resource(env, 3)
    def top(self):
        for s in self.servers:
            flag = s.free()
            if flag:
                return s
        return None

    def report(self):
        print ""
        print "Shift Report"
        print "{} customers in total ({} bored)".format(self.n_custs, self.n_bored)
        print "Servers:"
        tot_g = tot_h = tot_s = 0
        print "Name         Bty Skl NCu Hap Sad  Cash"
       
        try:
            for s in self.servers:
                s.report()
                tot_g += s.cash
                tot_h += s.hap_count
                tot_s += s.sad_count
        except Exception as e:
            print e
        print "earnings: {}".format(tot_g)
#
#        bored customers count as unhappy.
#        this will have the effect of bringing your house to an
#        equillibrium level over time - if you can't cope, rep will drop
#        until you can. There is not corresponding force tending to raise
#        rep to equilibrium point though, so you need to watch it
#
        print "overal satisfaction: {}".format(tot_h - tot_s - self.n_bored)

env = simpy.Environment()
h = House(env)

def hhmmss(tim):
    mins = math.floor(tim)
    ss = math.floor((tim - mins) * 60)
    hh = mins // 60
    mm = mins % 60
    return "{0:02.0f}:{1:02.0f}:{2:02.0f}".format( hh, mm, ss)

def stamp(env, seq):
    return "{0:s}: {1:3d}: ".format(hhmmss(env.now), seq)

class Customer:
    next = 1
    levels = [
        { "chance" : 65, "level" : 0, "duration" : 10, "income" : 5 },
        { "chance" : 30, "level" : 1, "duration" : 30, "income" : 25 },
        { "chance" :  5, "level" : 2, "duration" : 60, "income" : 75 },
    ];

    def get_lvl():
        l0 = levels[0]["chance"]
        l1 = levels[1]["chance"]

        r = random.random()
        if r < l0:
            return levels[0]
        if r < l0 + l1:
            return levels[1]
        return levels[2]

    def __init__(self, env):
        self.env = env
        lvl = random.choice(self.levels)
        self.__dict__.update(lvl)
        self.seq = Customer.next
        Customer.next += 1
        self.name = "Customer S{}L{}".format(
            self.seq, self.level
        )
        self.process = env.process(self.go())
        self.paitence = env.timeout(random.uniform(20,100))

    def message(self, s):
        print "{}: {}: {}".format(
            hhmmss(self.env.now), self.name, s
        )
    def go(self):
        self.message("Arrival")
        self.arrive = env.now

        with h.door.request() as qq:
#
#            do the actual queue-to-get-through-the-door bit
#
            res = yield qq | self.paitence

#
#            HOW long?
#
            self.wait_time = env.now - self.arrive


            made_it = (qq in res)
            if not made_it:
                self.message("Got bored, went home")
                h.n_bored += 1
                return
               
#
#            otherwise, pick a "server"
#
#            if the door capacity == number of servers
#            there should always be one free
#
            h.n_custs += 1
            w = h.top()
            if w == None:
                raise Exception("No free servers!")
       
            with w.res.request() as ww:

                txt = ""
                if self.wait_time < 0.01:
                    txt = "service from {}".format(w.name)
                else:
                    txt = "service from {} - waited: {}".format(w.name, hhmmss(self.wait_time))
                self.message(txt)

#
#                let some time pass for the customer to conclude his business
#
                yield env.timeout(random.expovariate(1.0/self.duration))
#
#                was it good for you?
#
                sat = w.satisf(self.level)
                tip = 0

            if sat > 0:
                tip = int(math.ceil(random.uniform(0.1, 0.3) * self.income))
                self.message("cust happy - tip = {0:0.0f}".format(tip))
            elif sat < 0:
                self.message("cust unhappy - leaves muttering darkly")
            else:
                self.message("customer satisfied")
            self.message("earned: {}".format(self.income + tip))
            w.earned(self.income + tip)
            self.message("Done")

def source(env):
    seq = 0
    while True:
        t = random.expovariate(1/h.mean_tba)
        yield env.timeout(t)
        #seq += 1
        #if seq > 4: break
        c = Customer(env)



env.process(source(env))
env.run(until = SHIFT)

h.report()

Which runs to give us something like this:

Code: [Select]
00:07:57: Customer S1L0: Arrival
00:07:57: Customer S1L0: service from server_0
00:08:07: Customer S1L0: cust unhappy - leaves muttering darkly
00:08:07: Customer S1L0: earned: 5
00:08:07: Customer S1L0: Done
00:08:19: Customer S2L1: Arrival
00:08:19: Customer S2L1: service from server_0
00:12:04: Customer S3L2: Arrival
00:12:04: Customer S3L2: service from server_1
00:26:40: Customer S4L2: Arrival
00:26:40: Customer S4L2: service from server_2
00:31:58: Customer S3L2: customer satisfied
00:31:58: Customer S3L2: earned: 75
00:31:58: Customer S3L2: Done
00:35:08: Customer S4L2: cust unhappy - leaves muttering darkly
00:35:08: Customer S4L2: earned: 75
00:35:08: Customer S4L2: Done
00:50:27: Customer S5L1: Arrival
00:50:27: Customer S5L1: service from server_1
01:04:26: Customer S6L0: Arrival
01:04:26: Customer S6L0: service from server_2
01:17:12: Customer S2L1: customer satisfied
01:17:12: Customer S2L1: earned: 25
01:17:12: Customer S2L1: Done
01:24:48: Customer S6L0: cust unhappy - leaves muttering darkly
01:24:48: Customer S6L0: earned: 5
01:24:48: Customer S6L0: Done
01:50:34: Customer S7L0: Arrival
01:50:34: Customer S7L0: service from server_0
01:59:07: Customer S5L1: cust unhappy - leaves muttering darkly
01:59:07: Customer S5L1: earned: 25
01:59:07: Customer S5L1: Done
02:10:01: Customer S8L2: Arrival
02:10:01: Customer S8L2: service from server_1
02:14:15: Customer S7L0: cust happy - tip = 1
02:14:15: Customer S7L0: earned: 6
02:14:15: Customer S7L0: Done
02:45:11: Customer S9L1: Arrival
02:45:11: Customer S9L1: service from server_0
02:48:00: Customer S8L2: cust unhappy - leaves muttering darkly
02:48:00: Customer S8L2: earned: 75
02:48:00: Customer S8L2: Done
02:57:50: Customer S9L1: cust unhappy - leaves muttering darkly
02:57:50: Customer S9L1: earned: 25
02:57:50: Customer S9L1: Done
02:59:09: Customer S10L0: Arrival
02:59:09: Customer S10L0: service from server_0
03:00:58: Customer S11L0: Arrival
03:00:58: Customer S11L0: service from server_1
03:11:22: Customer S12L1: Arrival
03:11:22: Customer S12L1: service from server_2
03:13:50: Customer S11L0: customer satisfied
03:13:50: Customer S11L0: earned: 5
03:13:50: Customer S11L0: Done
03:20:56: Customer S10L0: customer satisfied
03:20:56: Customer S10L0: earned: 5
03:20:56: Customer S10L0: Done
03:23:13: Customer S13L2: Arrival
03:23:13: Customer S13L2: service from server_0
03:28:05: Customer S12L1: customer satisfied
03:28:05: Customer S12L1: earned: 25
03:28:05: Customer S12L1: Done
03:53:38: Customer S14L1: Arrival
03:53:38: Customer S14L1: service from server_1
03:54:33: Customer S13L2: cust happy - tip = 15
03:54:33: Customer S13L2: earned: 90
03:54:33: Customer S13L2: Done
04:04:17: Customer S15L2: Arrival
04:04:17: Customer S15L2: service from server_0
04:08:20: Customer S16L1: Arrival
04:08:20: Customer S16L1: service from server_2
04:11:43: Customer S17L1: Arrival
04:46:42: Customer S16L1: cust unhappy - leaves muttering darkly
04:46:42: Customer S16L1: earned: 25
04:46:42: Customer S16L1: Done
04:46:42: Customer S17L1: service from server_2 - waited: 00:34:58
05:01:01: Customer S17L1: cust unhappy - leaves muttering darkly
05:01:01: Customer S17L1: earned: 25
05:01:01: Customer S17L1: Done
05:01:48: Customer S18L0: Arrival
05:01:48: Customer S18L0: service from server_2
05:05:56: Customer S19L1: Arrival
05:16:08: Customer S14L1: customer satisfied
05:16:08: Customer S14L1: earned: 25
05:16:08: Customer S14L1: Done
05:16:08: Customer S19L1: service from server_1 - waited: 00:10:11
05:27:51: Customer S18L0: cust happy - tip = 1
05:27:51: Customer S18L0: earned: 6
05:27:51: Customer S18L0: Done
05:30:18: Customer S19L1: cust unhappy - leaves muttering darkly
05:30:18: Customer S19L1: earned: 25
05:30:18: Customer S19L1: Done
05:31:00: Customer S20L0: Arrival
05:31:00: Customer S20L0: service from server_1
05:42:10: Customer S21L0: Arrival
05:42:10: Customer S21L0: service from server_2
05:48:47: Customer S20L0: customer satisfied
05:48:47: Customer S20L0: earned: 5
05:48:47: Customer S20L0: Done
05:49:40: Customer S22L1: Arrival
05:49:40: Customer S22L1: service from server_1
05:49:42: Customer S23L1: Arrival
05:53:46: Customer S24L1: Arrival
05:58:41: Customer S15L2: cust unhappy - leaves muttering darkly
05:58:41: Customer S15L2: earned: 75
05:58:41: Customer S15L2: Done
05:58:41: Customer S23L1: service from server_0 - waited: 00:08:58

Shift Report
23 customers in total (0 bored)
Servers:
Name         Bty Skl NCu Hap Sad  Cash
server_0      40  45   7   2   3   231
server_1      17   8   7   0   3   235
server_2      13  25   6   1   4   161
earnings: 627
overal satisfaction: -7

As it stands, the code simulates a brothel with a reputation of 20 (which means roughly an average of 20 customers a shift), and which has three whores working flat out. There's a lot of detail missing yet, but I think this could be the basis of a game. it also, has the potential of stepping through the sim event by event - which means we can potentially offer a level of control ranging from micromanaging each customer, through to processing a day or a week at a time, once the management structures are in place.

Anyway, those of you so inclined are encouraged to have a play with the code and try changing some of the assumptions and the weightings and see how that affects the model. We could not only create a robust mathematical model here, but also the basis for a whole family of girl training sims :)

[1] Which sound like it's begging to be combined with Ren'Py so we can get Ren and SimPy.
Title: Re: WhoreMaster: Abby's Crossing
Post by: slate on December 21, 2013, 07:24:47 AM
Hello Doclox!

I have looked at the code. This solves working in paralell time.


My main concerns are:

slate
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 21, 2013, 04:46:38 PM
Hello Doclox!

Heya Slate!

My main concerns are:
  • There is so much code, it seems to be an overkill.

You're probably right. It's very much a first attempt at a simulator with me still trying to get the hang of the package. There's a lot in there that could be written much more concisely.

That said, I think I'd quite like to expand the scope of the simulation to address some of your other points. We could  almost write the entire game as a simpy app and then the GUI as a bolt on. Which is pretty much the right way to go about it, really.

  • house.top function returns a service(a girl). Customer's demand is not reflected in it.We implicitly suppose, that no customer will deny the service.

Yeah. What I was mainly trying to do was get the customer supply right. The rule where a brothel with reputation X will get a mean of X customers per shift and using an exponential distribution seems to work very well. There's a lot in the way of game mechanics that I didn't get time to address.  Customer refusal is one. Girl's refusing is another.

I use the term service because I needed some SFW nomenclature ;) 


  • We implicitly suppose, that if someone gets through the door, then he is guarantied to get a service, otherwise it is an unhandled exception.. I think the "door" is better a lobby, and we should implement waiting in the lobby, or we can also make house.top return a guarantied always accepted service (e.g: G.W.Bush reads up his memoirs...) for no income, too.

I was thinking just that. I've got an updated version that implements a queue outside the building, with the interior having a capacity equal to the no. of girls. That guarantees the match (or should). I was going to leave a reception area as one of the early upgrade options. Buy seating for three customers and you can have the first three wait inside and maybe get an extension to the customer paitence time.

   
  • The functionality of doing a job involves the house, the girl, and the customer. We cannot simply put it into the customer.

Mmmm... I tend to agree. Mainly I adapted the banking example from the SimPy website, so that's why it's a bit customer-entric.

   
  • I strongly recommend to have only one module importing simpy.


One module per simulation, certainly. I'm thinking of  modelling auctions using SimPy which would be another module. But we can import simpy into one module and then pass the environment reference into others.

[edit]

Updated version of same script. Code cleaned up a lot.

What I'd like to do with it is add a command loop so it could run shift by shift. Then add adjustments for the time of the shift, and start to adjust girls stats and house reputation according to performance.

The biggest problem with the current model is that it puts reputation into a nose dive. it needs a way to compensate for that, whether by lowering prices or by adding facilities. Anyway this is what I have so far:

http://pastebin.com/Vh4wn1sQ[/list][/list]
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 24, 2013, 11:02:12 AM
Hi All!

Still not much in the way of widgetry to show for my efforts. I've been getting quite fascinated with Simpy and various models for brothels and how they operate. I spent a chunk of today getting Simpy to talk to PyQt without either of them locking the other out, so I might try and do a rough front end to the sim, wrap it in an exe and let you guys have a play with it.

Some of the ideas I've been kicking around as a result of this:

Each Brothel has a property called "draw" which is an abstraction of its ability to draw in customers. I'm thinking taking the value. dividing by two and calling that the mean time between arrivals, and then dropping that into random.expovariate to scatter the arrival times a little realistically.

Currently draw is basically the brothel's reputation, which goes up by 0.1 with each happy customer and down by 0.1 for each unhappy customer, happiness being determined by the girl's skill. The trouble is that with the sort of girls a player is likely to have at the start, there's no real way to get that reputation up.

So I'm thinking to add some hefty bonuses for a girl's happiness, health and endurance. Maybe spirit too. What I'd like is so that a girl with really quite low skill can satisfy her customers, just so long as she's cheerful and energetic and healthy. That gives a bonus to the whoremaster who looks after his girls. It'll still be possible to do my old preferred tactic of keeping them all in kennels and using drugs to ensure obedience, but it's arguably going to be more efficient to treat them well.

The other side of the coin is that as customer level rises, the bonus from those stats drops. As the quality of the patrons rises, their expectations rise as well.   So looks and health and attitude will give less of a bonus and, at lower levels start to bring a penalty.

I'm also getting quite in the the possibility of an ultra low level mode where the player could micromanage customer-by-customer if so inclined.

OK, sorry about the random blather. Later all.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 24, 2013, 07:28:51 PM
Merry Christmas, all!
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 30, 2013, 08:23:07 AM
Bit of an update:

I got a working PyQt front end to my sim code, and did a bit more work towards getting the underlying model right.

Then I hit the point where I needed to pull in data objects from the game proper. Well, that flagged up all sorts of bugs and places where I fudged things to keep the momentum going. So now I'm biting the bullet and writing some unit tests. It's a pain but the code will be all the better for doing so.

I'm also implementing status effects. These are going to be used to represent things like potions and spell effects, as well as those traits which have an active effect, hunger, addiction - anything that modifies one or more stat really. They're going to let me streamline a lot of code when it comes to things like obedience checks and the like, since the near fractal complexity of WM decision trees can be reduced to looping over the status list and summing any relevant modifiers. But there's no such thing as a free lunch, and the SEs themselves are proving to be surprisingly complicated.

So: still no pictures worth uploading, but work is continuing.
Title: Re: WhoreMaster: Abby's Crossing
Post by: Hazure on December 31, 2013, 08:30:26 AM
It may be simplified if the rooms had levels as well as the girls.....so that no matter what level the girl is if she is in a lower level room, that's the level she preforms at.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on December 31, 2013, 12:36:46 PM
It may be simplified if the rooms had levels as well as the girls.....so that no matter what level the girl is if she is in a lower level room, that's the level she preforms at.

mmm... I was thinking along those lines. if you don't have a bed, all you can do is level 0. If you have a bed you can charge at level one. A bed and a bedroom to put it in for level 2. Level three needs nice furnishings and some refreshments, four and up and we're talking about a private suite. 

Interesting the same logic carries over to other activities. Streetwalking is generally level 0 unless there's a room the girl can use. So would sly handjobs for strippers and serving girls in the bar, although you might be able to charge a grade or two higher if the place was well appointed and the clientèle select.

All fun stuff, if I can master the complexity of it all.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 08, 2014, 03:08:52 PM
Quick update: I'm still working on the game :)

Things slowed down with my getting a job, and I've also let myself get sidetracked a little writing the auction code for Pytherworld. (I needed a break from writing tests).

But I'm not giving up just yet ;)
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on January 08, 2014, 09:46:09 PM
More power to you, DocClox!  While your endeavors are far beyond me, I'm cheering for you!  Take my moral support!  Take it, I say, like a gentleman!

Seriously though, I couldn't hold myself to such a large project. Kudos on what you've done so far.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 10, 2014, 01:32:02 PM
Thank you. Kind thoughts and encouragement are always welcome; doubly so after a week like this.

I think I might say "to hell with unit tests" and try and get the simulation linked up with the screens this weekend. If I can do that, we'll be very close to having a game. (I know - I keep saying that :) )
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on January 10, 2014, 04:06:29 PM
Huzzah!  Do as you see best, you probably know better then us feeble mortals.

Title: Re: WhoreMaster: Abby's Crossing
Post by: Ctwo on January 13, 2014, 12:22:27 AM
hi rudi, glad you liked it:)

I left things intentionally a little vague in the into. in the next scene there's going to be some "immigration papers"to fill out that'll give the player a chance to choose some background details. Those would include city of origin (so players don't have to come from Crossgate)  gender and whether they want to be free or a trusted slave. So I've been trying not to say anything that would contradict any of those.

I like the reason why there's  no support from central HQ. I was going to have Crossgate cut off by a unusual dimensional rift activity, but an ambiguous underling seizing control might work better. Of course, the details will depend somewhat on background.

of course, the more options there are the more writing I have to xiii for each scene, so all the above may be subject to change :)

Glad to see you working on a WM project again Doc. If I might make a few suggestions: don't have the protagonist in this game be the same as the protagonist in the WM game. It would probably work better to say your one of his lieutenants and asking for help will put you further into debt with them. If your going to give a variety of background choices one could be that you are the boss which will result in you receiving a starting package of goodies (+cash, +experienced girls, +ruffians) and several problems (formal rivals attempting to ruin you here, mayor already hostile to you because he knows about you controlling crossgate, constant police inspections, and more expensive for you to buy new girls because everybody knows your reputation of being wealthy, assassination attempts).
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 14, 2014, 04:50:56 PM
Huzzah!  Do as you see best, you probably know better then us feeble mortals.

Now don't go swelling my head. I'm bad enough at the best of times ;)

Glad to see you working on a WM project again Doc.

It's good to be back. I should have looked at python years ago.

If I might make a few suggestions: don't have the protagonist in this game be the same as the protagonist in the WM game. It would probably work better to say your one of his lieutenants and asking for help will put you further into debt with them.

I want to leave the identity of the PC a little vague, if I can. I'd like to leave room for the player to play as the WM protagonist if they wish, or decide to be someone else entirely. I'm also thinking of allowing male and female PCs, and maybe allowing the player to play as a trusted slave sent to arrange affairs for her master. Something along the lines of an immigration procedure perhaps to let the player decide.

If your going to give a variety of background choices one could be that you are the boss which will result in you receiving a starting package of goodies (+cash, +experienced girls, +ruffians) and several problems (formal rivals attempting to ruin you here, mayor already hostile to you because he knows about you controlling crossgate, constant police inspections, and more expensive for you to buy new girls because everybody knows your reputation of being wealthy, assassination attempts).

Everyone is going to start off with the basics. I have some ideas about why the PC can't just send back to Crossgate for funds and/or reinforcements, and rudi had a few others I might look at using. I do have some trade-offs in mind, though :)

One thing I do want to do is play down the rivals aspect a little. There will be other gangs, and they'll need to be dealt with, certainly. But I have a different main story arc in mind.  I don't want to talk too much about the details yet, but I expect there'll be plenty of things to occupy a whoremaster's mind in Abby's Crossing :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on January 14, 2014, 05:01:12 PM
Oh, DocClox, you tease!
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 16, 2014, 02:20:36 PM
Oh, DocClox, you tease!

:D

Work's been using up most of my energy this week, so still not a lot to report. I have made some progess with unit tests and so forth, but who wants to look at them? :)

Those tests have got me thinking about the girlsx/rgirlsx format, though. I'd like to make a few tweaks :)

Code: [Select]
<Girls>
        <Girl
                name = "Flossie"
                desc = "Comes from a little town you probably never even heard of"
                looks = "100"
                skill = "20"
        >
                <Trait name = "gorgeous"/>
                <Trait name = "dumb" />
        </Girl>
<Girls>
Code: [Select]
name : Flossie
desc : Comes from a little town you probably never even heard of
looks: 100
skill: 20
traits:
        - gorgeous
        - dumb
I'll talk more about my ideas for the stat system later.
Title: Re: WhoreMaster: Abby's Crossing
Post by: Ctwo on January 16, 2014, 04:02:43 PM
So the opposite of tiredness would be...energy? This is a new game based on WM, it certainly doesn't have to work the same. I'd like to suggest that you give bonuses and penalties for happiness and energy to work done. For most tasks give a 5% bonus for having over 90 in either stat. Give a -10% penalty for under 50% in either stat. The penalty rises to -25% as you approach 30 or less in each with a refuse to work at zero.

It might be nice to put in a few special activities in town. Say if you get in good with the government faction you can pay for one of your girls to visit their exclusive club for a day of pampering (big energy bonus, mild happiness bonus, and a slight bump to a random stat like reputation, charisma or beauty). Maybe the scientist have a private amusement park (big happiness bonus, small energy bonus, slight loyalty or love boost). Each factions private play area should be unique. Visits to each would be accessible after you've done work for each faction. Each visit would take a girl off work for an entire day and have a cost so the benefits should be worth it (like the major benefit be a long term boost that wears off after a few days).
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 16, 2014, 06:04:23 PM
So the opposite of tiredness would be...energy?

I had been thinking "endurance", but "energy" might work better :)

I'd like to suggest that you give bonuses and penalties for happiness and energy to work done. For most tasks give a 5% bonus for having over 90 in either stat. Give a -10% penalty for under 50% in either stat. The penalty rises to -25% as you approach 30 or less in each with a refuse to work at zero.

You're way ahead of me.  The plan is to make customer supply strongly depend on the brothel's reputation, and to make the rep depend on keeping the customers happy. At the lower levels at least, a girl who is pretty, healthy, happy and energetic is going to get very few complaints regardless of her actual skill. So looking after your girls is going to be key to building the reputation you need to get established. On the other hand, a girl who is sick, unhappy and exhausted is going to have a hard time pleasing the marks even if she has decent skills.

So the player will have an incentive to treat his girls well :)

It might be nice to put in a few special activities in town. Say if you get in good with the government faction you can pay for one of your girls to visit their exclusive club for a day of pampering (big energy bonus, mild happiness bonus, and a slight bump to a random stat like reputation, charisma or beauty).

I have some thoughts along those lines. There's a banker who before he'll advance any serious money, he'll want to sample the merchandise first. And if it's not up to standard, you'll need to come back when it is. And there's going to be a few discoverable locations, some with events attached, some just merchants. Then there are going to special commissions - parties that need party girls of various qualities ... or that's the plan, anyway. I have a rough outline of the events system working, so the big problem remaining is tying the triggers in to the timeline. That and writing all the events of course :)

Maybe the scientist have a private amusement park (big happiness bonus, small energy bonus, slight loyalty or love boost). Each factions private play area should be unique. Visits to each would be accessible after you've done work for each faction. Each visit would take a girl off work for an entire day and have a cost so the benefits should be worth it (like the major benefit be a long term boost that wears off after a few days).

There's going to be a lot of scientists. They may have one formal lab, but in practice it's more like a museum than a laboratory. The real action happens in dozens of little labs and artificer shops scattered across the Air Quarter. But there you'll find roboticists, plastic surgeons, resurrectionists, vivisectionists, mind controllers and plain old perverts. All of them with some sort of deal they can make with the player :)

Title: Re: WhoreMaster: Abby's Crossing
Post by: Armegetton on January 29, 2014, 07:50:42 PM
Good evening, gentlemen.

Sir, might I ask. Whether this project is openly testable by the public? I read through the entire post a saw a couple links to older things (off topic: the UI skin is amazing), but I didn't see any 'current' links.

I double-checked to make sure, but I also didn't see another thread for releases or updates (for WM: Abby's Crossing).

I apologize if I'm in error and this is still in a theory crafting phase.

In other news, it snowed for two days straight in middle georgia!? (this simply doesn't occur)  :o


Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on January 30, 2014, 09:19:04 AM
Good evening, gentlemen.

And a good evening to you, sir.

Sir, might I ask. Whether this project is openly testable by the public? I read through the entire post a saw a couple links to older things (off topic: the UI skin is amazing), but I didn't see any 'current' links.

Your enquiry is most welcome. Regrettably, there is as yet no testable demo beyond those older links you have already discovered. Development has slowed somewhat, partly due to my now having a paying job, and partly to being too tired to think straight when I get home in the evening.

However, development is proceding, albeit at a much slower pace. I have been doing some very exciting things regarding unit testng, data models and templating (assuming you are of the sort to get excited about such things, that is) and I'm rather looking forward to demonstrating how it all works. Sadly however nothing recently produced has much in the way of visual appeal. Hence the reason why this thread has been so uncharacteristicly quiet.

I'll also plead guilty to doing a little moonlighting with rudistoned's Pytherworld project. Alas, Pytherworld seems to be floundering a little during rudi's continuing absence, so I really do have no excuses not to do some more work for WMAC.

I apologize if I'm in error and this is still in a theory crafting phase.

No need to apologise; the pace just slowed right down.

Oh, and I'm glad you like the UI. Making the widgets is by far the most enjoyable part of the project :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on February 27, 2014, 03:29:48 PM
Just a quick update - although non-update would probably be closer.

Been busy with work, and playing games rather than trying to make them in the evenings. I'm still not giving up on this, but things have been slow. Still, forcing ,myself to work has always been a path to burnout in the past, while the games that get finished seem to be the ones where their creators can set them aside and return to them.

Besides which, right now I can't even compose a three paragraph post to PPG without having to do it in instalments. In the mean time, no news is good news, right? :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: Goryokaku on May 29, 2014, 04:32:39 PM
I'm glad your keeping us informed Doc, keeping an eye on this thread, was wondering if you planned to let us roll a character and actually assign ourselves jobs as well.  E.G. Security and such.  Always thought the game missed some aspect of needing to stand in your self to do some work whilst intially opening and setting up a new brothel.
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on November 20, 2014, 05:29:45 PM
Just checking in. Work wiped me out for a bit there, and it's taken me a while to get back in the mood for some Python

I'm going to see if I can remember what I was up to on this thing. Maybe trim back to my initial goal of re-implementing the initial WM mechanics.
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on November 20, 2014, 05:48:55 PM
Ahhh!  It lives!  It breathes!  It does the Peppermint Twist!

Good to see you back.
Title: Re: WhoreMaster: Abby's Crossing
Post by: andrewus on December 01, 2014, 04:30:05 AM
Good to see you back.
Title: Re: WhoreMaster: Abby's Crossing
Post by: mothballd on January 29, 2015, 10:45:48 PM
Definitely excited about this idea and DocClox, you are awesome good sir!
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on February 05, 2015, 08:19:42 AM
I should probably add that I've not done a lot towards this so far.

My last attempt was going fine until I decided to divert from the original WM code for customer. I found this package called SimPy that does threaded simulations. I got a nice model of customers arriving, allowed for time spent with a girl, how long before they got bored, popularity and reputation of the house, and I got a PyQt front end so I could run it as a thread and then incorporate the results into the game.

I just ran out of steam when it came to integrating that code into the larger program for some reason.

Lately, I've been playing with a RAGS style game engine and a demo adventure to go with it. That was PyQt and originally I though it would make a warm up to get me back up to speed for WMAC. (I should know by now - that never works!) And I'm playing skyrim and poking at the Skyrim mod I was working on a while back.

I don't really want to abandon any of those projects, but I'm not real clear on what I'm going to do next. Play Skyrim for a bit, I suspect.
Title: Re: WhoreMaster: Abby's Crossing
Post by: hewhocumsbynight on February 05, 2015, 01:26:03 PM
...Skyrim for a bit, I suspect.
As is the answer to so many of life's persistent questions.

Will we be seeing that mod on Lover's Lab in the future?
Title: Re: WhoreMaster: Abby's Crossing
Post by: DocClox on February 05, 2015, 04:05:55 PM
As is the answer to so many of life's persistent questions.

Will we be seeing that mod on Lover's Lab in the future?

Well, the first part is already there: Quick As You Like. This would be the next installment. The trouble is the little bit of scene setting I had in mind to introduce the next race took on a life of its own.

But yeah, given half a chance :)
Title: Re: WhoreMaster: Abby's Crossing
Post by: Popuri on March 25, 2015, 05:25:18 PM
Quick As You Like is fun, even given the early state it's in. :3