devolution

Author Topic: Game Balancing - General  (Read 34962 times)

0 Members and 1 Guest are viewing this topic.

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #15 on: May 29, 2014, 09:14:33 AM »
Equipped items... It's hard to say.
A hypothetical situation: a warrior girl saved some money to buy a better weapon to do her work better. Fair enough, with higher attack she can guard better, so she earned it.
But it also will prevent players from giving powerful items to girls. We already have a couple of people who prefer to equip rags on girls to reduce upkeep as much as possible.

I think taking equipment into account is a sound plan. I remembered two more bugs that had been reported, going to see if those can be squashed today.
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #16 on: May 30, 2014, 11:19:57 AM »
I'll do more excel testing, but for now I propose something like:
Quote
def expects_wage(self):
            """
            Amount of money each girl expects to get paid for her skillset.
            """
           
            wage = 0
           
            if self.occupation == 'Prostitute':
                bw = self.rank * 5 # Base wage
                sm = (1 + self.charisma/5 + self.refinement/5 + self.reputation/2 + self.fame/2)/100 # Stats Mod
                osm = (self.anal + self.normalsex + self.blowjob + self.lesbian + self.bdsm) / 15 # Occupational Stats M

                wage =  bw * sm + osm

            elif self.occupation == 'Stripper':
                bw = 9
                sm = (1 + self.charisma/5 + self.refinement/5 + self.reputation/4 + self.fame/4 + self.agility/2) / 100
                osm = self.strip/3

                wage = bw * sm + osm

            elif self.occupation == 'ServiceGirl':
                bw = 17
                sm = (1 + self.charisma/5 + self.agility/2 + self.refinement/3)/100
                osm = self.service/4

                wage = bw*sm+osm

            elif self.occupation == 'Warrior':
                bw = 15 + self.attack*0.01 + self.defence*0.01
                sm = (1+self.fame/3 + self.reputation/3)/100
                osm = (self.attack + self.defence + self.magic/2 + self.agility)/150

                wage = bw * sm + osm

            else:
                for stat in self.stats:
                    if stat not in ["disposition", "libido", "joy", "health", "fatigue", "mood"]:
                        wage += getattr(self, stat)
                wage = wage/2       

            # Normalize:   
            wage = int(wage)
            if wage < 20:
                wage = 20
               
            return wage

Pay attention that I added bdsm skill as well. It's about time to add it, even without ST we have plenty of pics for it.
We should be really careful with salary, since skills could be very high eventually.
« Last Edit: May 30, 2014, 11:25:05 AM by DarkTl »

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #17 on: May 30, 2014, 11:45:16 AM »
I'll do more excel testing, but for now I propose something like:
Pay attention that I added bdsm skill as well. It's about time to add it, even without ST we have plenty of pics for it.
We should be really careful with salary, since skills could be very high eventually.

Feel free to update SF with this and test how it's working. BDSM is a VERY broad field and has loads and loads of options during jobs. That's why we still don't have it enabled.
Like what we're doing?

Offline Marquis

  • Newbie
  • *
  • Posts: 30
Re: Game Balancing - General
« Reply #18 on: May 31, 2014, 08:14:01 AM »
I like the looks of the 'expected wage' logic. If skills are very high, maybe you can't afford to have her on staff anymore.
Should intelligence be a direct factor in some jobs (like service) or will it indirectly affect wage potential by improving skills faster?

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #19 on: May 31, 2014, 08:23:07 AM »
I like the looks of the 'expected wage' logic. If skills are very high, maybe you can't afford to have her on staff anymore.
Should intelligence be a direct factor in some jobs (like service) or will it indirectly affect wage potential by improving skills faster?

For future matron, alchemist classes, right now intelligence can play a role during events (for example, an intelligent girls has a decent chance of weaseling her way out of bad costumer attack event during jobs) but that prolly shouldn't be part of her wage.

We'll also include balancing values here in the future as well I think.
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #20 on: June 07, 2014, 03:51:25 PM »
You know, it's kinda strange that we calculate both income and wage. I mean, they both depend on same stats more or less. Perhaps we should simplify the wage part a bit.

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #21 on: June 08, 2014, 09:46:29 AM »
You know, it's kinda strange that we calculate both income and wage. I mean, they both depend on same stats more or less. Perhaps we should simplify the wage part a bit.

What do you mean? We calculate wage, income is just being logged in by finances.
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #22 on: June 08, 2014, 10:50:32 AM »
There is a formula for wage and there is a formula for girl's income per day. Both depend on pretty much the same set of skills and stats.

Maybe they always should expect some % of their income, like from 20% (rank 1) to 55% (rank 8 ). Maybe a bit more complex system, but still with expected wage totally depending on pure income, not stats, because income does depend on stats already.

I mean only those girls who have actual income of course, it's whores and strippers for now, maybe waitresses too.
« Last Edit: June 08, 2014, 10:57:01 AM by DarkTl »

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #23 on: June 08, 2014, 12:35:53 PM »
There is a formula for wage and there is a formula for girl's income per day. Both depend on pretty much the same set of skills and stats.

Maybe they always should expect some % of their income, like from 20% (rank 1) to 55% (rank 8 ). Maybe a bit more complex system, but still with expected wage totally depending on pure income, not stats, because income does depend on stats already.

I mean only those girls who have actual income of course, it's whores and strippers for now, maybe waitresses too.

Those are to different, I think that we require both...
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #24 on: June 10, 2014, 07:56:01 AM »
Oki, I pushed expected wages part. Now I need to know where to find income for jobs in the code.

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #25 on: June 11, 2014, 12:46:57 PM »
Oki, I pushed expected wages part. Now I need to know where to find income for jobs in the code.

Got it.

I think this is what you're looking for, it follows the wages method:

Code: [Select]
        def get_whore_price(self):
            """
            Workprice for girls working as whores.
            """
           
            chr = self.instance
           
            if chr.rank < 3:
                bp = 15 * chr.rank # Base Price
            elif chr.rank < 5 :
                bp = 20 * chr.rank
            else:
                bp = 25 * chr.rank
            sp = chr.charisma/3 + chr.refinement/3 + chr.reputation/5 + chr.fame/5 # Stats Price
            ssp = chr.anal/3 + chr.normalsex/3 + chr.blowjob/3 + chr.lesbian/3 # Sex Stats Price

            return int(bp + sp + ssp)

I'll try to get back into development soon, I've been having a good amount of free time lately but it all goes to other crap so I just need to kick myself in the ass and start writing some code :)
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #26 on: June 12, 2014, 02:55:46 AM »
There is a problem. The game calculates average income depending on average sex stats value. Thus, if a girl has 0 sex and 300 everything else, according to the formula she has 300 average sex stat. And even if she will have only customers that want sex, she still will have good income thanks to it.
That's illogical. Ideally, we should calculate income for every single sex act and then summarize them.

Also, I believe we have more sources of income than just whores. I mean strippers and bar.

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #27 on: June 12, 2014, 05:12:16 AM »
There is a problem. The game calculates average income depending on average sex stats value. Thus, if a girl has 0 sex and 300 everything else, according to the formula she has 300 average sex stat. And even if she will have only customers that want sex, she still will have good income thanks to it.
That's illogical. Ideally, we should calculate income for every single sex act and then summarize them.

You're right... I oversimplified to save time and energy + we wanted a different system in the future. If you have ideas, we'll just recode the method or rewrite the job files as well.

Also, I believe we have more sources of income than just whores. I mean strippers and bar.

Yeah, those I burried in code somewhrere :D

Lets see:

(Ignore the job classes that start with ND, I think we'll have to delete them.)

You'll have to go through the jobs to find all the places, StripJob:

Code: [Select]
            tippayout = 0
+++
            # Upgrades effects:
+++
                tippayout += int(len(self.clients)/4)*3   <----- Here is the first mod due to the third tear upgrade (len(self.clients) gets the length of a list with all the client objects which we track individually, it could be quite a number in a large brothel.) There is another one for second tier which is disregarded if the third one is active.
+++
            if self.girl.strip > 300 and self.girl.charisma > 300:
                tippayout += int(len(self.clients) / 5) + 1 * int(len(self.clients) * self.girl.refinement * 0.1 * self.girl.charisma * 0.1 + len(self.clients) * self.girl.strip * 0.2) + int(self.APr  * (self.girl.charisma * 0.1 + self.girl.strip * 0.1) ) <----- This is during the stats checkups. Maybe an overkill but it was a long time ago I coded this. a variation of this is repeated 6 more times for different stat checkups.
+++

As I've said before, Strippers do not have a direct income from the clients other than tips since it's not a "private show" and it's implied that they're just sitting in a club watching girls dance.

=========================================
Now the Service Job:

Notes:
Same client will order the drinks/snacks several times for as long as they enjoy the stripping girls, so while it's very time consuming and pricy to initially establish a Stripclub/Bar operation, I believe it can pay off really well in the end. There are obviously clients in the bar even without the strippers.

Code: [Select]
            barfees = int(clientsserved * 0.5) * self.APr * int(self.girl.refinement * 0.2 + self.girl.charisma * 0.2 + self.girl.service * 0.2)
            if tapas:
                barfees = int(barfees * 1.5)
            elif beer:
                barfees = int(barfees * 1.2)

Tapas and Beer are possible upgrades to the bar. self.APr is the amount of action points spent during the act. clientserved is the amount of clients girl has served.

Code: [Select]
            if self.girl.service > 120:
                self.brothelmod['reputation'] += random.choice([0, 1])
                barfees = int(barfees * 1.5)

7 different modifiers for her service skill level. This btw hasn't been updated to new stat values, guess I've missed this job. And I found another oddity, this is logged in as tips instead of a wage, I wonder why I did that... I am going to fix this, the Male filter messing up shops thing and push. I will also add actual tips.

Club:

            clubfees = int(clientsserved * 0.6) * self.APr * int(self.girl.agility * 0.2 + self.girl.charisma * 0.2 + self.girl.service * 0.2)

Also not updated... wtf, I could have sworn I've done this before:

Code: [Select]
            if self.girl.service > 120:
                self.brothelmod['reputation'] += random.choice([0, 1])
                clubfees = int(clubfees * 1.5)
                self.txt.append("She is an exellent waitress, customers didn't notice how they've just kept spending their money as she offered them more and more house specials. \n")

I think this is it, I'll take a look if I don't take a part of these fees and turn them into tips elsewhere in code and if not tweak the log to store wages and add tips to these jobs.
Like what we're doing?

Offline DarkTl

  • Hero Member
  • *****
  • Posts: 4737
Re: Game Balancing - General
« Reply #28 on: June 12, 2014, 10:26:44 AM »
Well, I can adapt the income formula only after some testing, but we need to calculate whores income per act. Customers should have a wish or two, either when they come to brothel, or acquiring it during streaptease phase.
And probably gender, so we won't have the same customer wanting bj after les (and since some players already want futa in the future, gender is pretty much must have).

It's also a good chance to add group events, when several customers "work" with 1 girl, checking several sex skills at once, causing more fatigue and paying more.

I don't remember if customers already have random amount of money depending on rank, but they should. It also will somewhat prevent excessive discontent of high ranked whores, since low ranked customers cannot and will not have enough money to hire them, at least usually.

Offline Xela

  • Global Moderator
  • *****
  • Posts: 6893
  • "It's like hunting cows"
Re: Game Balancing - General
« Reply #29 on: June 12, 2014, 11:08:51 AM »
Well, I can adapt the income formula only after some testing, but we need to calculate whores income per act. Customers should have a wish or two, either when they come to brothel, or acquiring it during streaptease phase.

It is implied as per act (Girl spending 1 AP). Also I believe that it is being further modified during the job (Satisfaction from striptease, trait that a customer likes, ) so those formulas are for base wage.

And probably gender, so we won't have the same customer wanting bj after les (and since some players already want futa in the future, gender is pretty much must have).

We have a tremendous amount of work ahead just for finishing the Alpha (Current TODO list) and I prolly forgot to add improving tags there as well. Even more for the Beta. I honestly don't see anyone ion the dev team who's enough into Futa to spend 10 - 20 hours required adapting the game to it. Unless someone new joins the team, we are not likely to add Futa before 1.0 release.

Otherwise... There is no way for player to know which costumer is which but even for the logic, a female costumer cannot request a blowjob, there is no code that would allow that.
 
It's also a good chance to add group events, when several customers "work" with 1 girl, checking several sex skills at once, causing more fatigue and paying more.

Only if we keep it simple. There are more pressing tasks, also this is part of lesbian job:

Code: [Select]
                acts = list()
                # We'll be adding "les" here as Many lesbian pics do not fall in any of the categories and will never be called...
                acts.append("les")
                if self.girl.has_image("les", "dildo joined"):
                    acts.append("dildo joined")
                if self.girl.has_image("les", "lick pussy"):
                    acts.append("les_lick_pussy")
                if self.girl.has_image("les", "do lick pussy"):
                    acts.append("les_do_lick_pussy")
                if self.girl.has_image("les", "lick anus"):
                    acts.append("les_lick_anus")
                if self.girl.has_image("les", "do lick anus"):
                    acts.append("les_do_lick_anus")
                if self.girl.has_image("les", "finger pussy"):
                    acts.append("les_finger_pussy")
                if self.girl.has_image("les", "do finger pussy"):   
                    acts.append("les_do_finger_pussy")
                if self.girl.has_image("les", "finger anus"):
                    acts.append("les_finger_anus")
                if self.girl.has_image("les", "do finger anus"):   
                    acts.append("les_do_finger_anus")
                if self.girl.has_image("les", "caress tits"):
                    acts.append("les_caress_tits")
                if self.girl.has_image("les", "do caress tits"):
                    acts.append("les_do_caress_tits")
                if self.girl.has_image("les", "hug"):
                    acts.append("les_hug")
                if self.girl.has_image("les", "strapon"):
                    acts.append("les_strapon")
                if self.girl.has_image("les", "do strapon"):
                    acts.append("les_do_strapon")
                if self.girl.has_image("les", "anal strapon"):
                    acts.append("les_anal_strapon")
                if self.girl.has_image("les", "do anal strapon"):
                    acts.append("les_do_anal_strapon")
                if self.girl.has_image("les", "anal beads"):
                    acts.append("les_anal_beads")
                if self.girl.has_image("les", "do anal beads"):
                    acts.append("les_do_anal_beads")
                if self.girl.has_image("les", "dildo pussy"):
                    acts.append("les_dildo_pussy")
                if self.girl.has_image("les", "do dildo pussy"):
                    acts.append("les_do_dildo_pussy")
                if self.girl.has_image("les", "dildo anal"):
                    acts.append("les_dildo_anal")
                if self.girl.has_image("les", "do dildo anal"):
                    acts.append("les_do_dildo_anal")
                   
                act = random.choice(acts)

                if act == "dildo joined":
                    self.txt.append(random.choice(["She've asked your girl to lend her a double-ended dildo.\n",
                                                                                    "She brought a twin-ended dildo for the party so %s could have some fun as well.\n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "dildo joined", resize=(500, 600))
                elif act == "les_lick_pussy":
                    self.txt.append(random.choice(["Clearly in the mood for some cunt, she licked %ss pussy clean.\n"%self.girl.nickname,
                                                                                    "Hungry for a cunt, she told %s to be still and started licking her soft pussy with her hot tong. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "lick pussy", resize=(500, 600))
                elif act == "les_do_lick_pussy":
                    self.txt.append(random.choice(["All hot and bothered, she ordered %s to lick her cunt. \n"%self.girl.nickname,
                                                                                    "As if she had an itch, she quickly told %s to tong her pussy. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "do lick pussy", resize=(500, 600))
                elif act == "les_lick_anus":
                    self.txt.append(random.choice(["She licked %ss anus clean.\n"%self.girl.nickname,
                                                                                    "She told %s to be still and started licking her asshole with her hot tong. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "lick anus", resize=(500, 600))
                elif act == "les_do_lick_anus":
                    self.txt.append(random.choice(["All hot and bothered, she ordered %s to lick her asshole. \n"%self.girl.nickname,
                                                                                    "As if she had an itch, she quickly told %s to tong her anus. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "do lick anus", resize=(500, 600))
                elif act == "les_finger_pussy":
                    self.txt.append(random.choice(["In mood for a hot lesbo action, she stuck her fingers in your girls pussy. \n",
                                                                                     "She watched %s moan as she stuck fingers in her pussy. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "finger pussy", resize=(500, 600))
                elif act == "les_do_finger_pussy":
                    self.txt.append(random.choice(["Quite horny, she ordered your girl to finger her cunt. \n",
                                                                                    "Clearly in the mood, she told %s to finger her until she cums. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "do finger pussy", resize=(500, 600))
                elif act == "les_finger_anus":
                    self.txt.append(random.choice(["In mood for a hot lesbo action, she stuck her fingers in your girls anus. \n",
                                                                                     "She watched %s moan as she stuck fingers in her asshole. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "finger anus", resize=(500, 600))
                elif act == "les_do_finger_anus":
                    self.txt.append(random.choice(["Quite horny, she ordered your girl to finger her anus. \n",
                                                                                    "Clearly in the mood, she told %s to finger her asshole until she cums. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "do finger anus", resize=(500, 600))
                elif act == "les_caress_tits":
                    self.txt.append(random.choice(["Liking your girls breasts, she had some good time caressing them. \n",
                                                                                    "She enjoyed herself by caressing your girls breasts. \n"]))
                    self.img = self.girl.show("les", "caress tits", resize=(500, 600))
                elif act ==  "les_do_caress_tits":
                    self.txt.append(random.choice(["She asked your girl to caress her tits. \n",
                                                                                      "She told your girl to put a squeeze on her breasts. \n"]))
                    self.img = self.girl.show("les", "do caress tits", resize=(500, 600))
                elif act == "les_hug":
                    self.txt.append(random.choice(["Girls lost themselves in eachothers embrace.\n",
                                                                                    "Any good lesbo action should start with a hug, don't you think??? \n"]))
                    self.img = self.girl.show("les", "hug", resize=(500, 600))
                elif act == "les_strapon":
                    if "Virgin" in self.girl.traits:
                        tips = self.girl.rank * 100 + self.girl.charisma * 2
                        self.txt.append("\n{color=[pink]}%s lost her virginity!{/color} Customer thought that was super hot so she left a tip of {color=[gold]}%d Gold{/color} for your girl.\n\n"%(self.girl.nickname, tips))
                        self.girl.removetrait(traits["Virgin"])
                        self.girl.fin.log_tips(tips, "WhoreJob")
                        self.brothel.fin.log_work_income(tips, "WhoreJob")

                    self.txt.append(random.choice(["She put on a strapon and fucked your girl in her cunt. \n",
                                                                                   "Equipping herself with a strap-on, she lustfully shoved it in %ss pussy. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "strapon", resize=(500, 600))
                elif act == "les_do_strapon":
                    self.txt.append(random.choice(["She ordered %s to put on a strapon and fuck her silly with it. \n"%self.girl.nickname,
                                                                                   "She equipped %s with a strapon and told her that she was 'up' for a good fuck! \n"]))
                    self.img = self.girl.show("les", "do strapon", resize=(500, 600))
                elif act == "les_anal_strapon":
                    self.txt.append(random.choice(["She put on a strapon and fucked your girl in her butt. \n",
                                                                                   "Equipping herself with a strapon, she lustfully shoved it in %ss asshole. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "anal strapon", resize=(500, 600))
                elif act == "les_do_anal_strapon":
                    self.txt.append(random.choice(["She ordered %s to put on a strapon and butt-fuck her silly with it. \n"%self.girl.nickname,
                                                                                   "She equipped %s with a strapon and told her that she was 'up' for a good anal fuck! \n"]))
                    self.img = self.girl.show("les", "do anal strapon", resize=(500, 600))
                elif act == "les_anal_beads":
                    self.txt.append(random.choice(["They got their hands on some anal beads and shoved it up %ss butt. \n"%self.girl.nickname,
                                                                                   "She had some fun with your girls asshole and some anal beads \n"]))
                    self.img = self.girl.show("les", "anal beads", resize=(500, 600))
                elif act == "les_do_anal_beads":
                    self.txt.append(random.choice(["She had %s stick some anal beads up her butt. \n"%self.girl.nickname,
                                                                                     "She told %s to get some anal beads to play with her anus. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "do anal beads", resize=(500, 600))
                elif act == "les_dildo_pussy":
                    if "Virgin" in self.girl.traits:
                        tips = self.girl.rank * 100 + self.girl.charisma * 2
                        self.txt.append("\n{color=[pink]}%s lost her virginity!{/color} Customer thought that was super hot so she left a tip of {color=[gold]}%d Gold{/color} for your girl.\n\n"%(self.girl.nickname, tips))
                        self.girl.removetrait(traits["Virgin"])
                        self.girl.fin.log_tips(tips, "WhoreJob")
                        self.brothel.fin.log_work_income(tips, "WhoreJob")
                       
                    self.txt.append(random.choice(["She played with a dildo and %ss pussy. \n"%self.girl.nickname,
                                                                                   "She stuck a dildo up %s cunt. \n"%self.girl.nickname]))
                    self.img = self.girl.show("les", "dildo pussy", resize=(500, 600))
                elif act == "les_do_dildo_pussy":
                    self.txt.append(random.choice(["Without further ado, %s fucked her with a dildo. \n"%self.girl.nickname,
                                                                                   "She asked your girl to fuck her pussy with a dildo. \n"]))
                    self.img = self.girl.show("les", "do dildo pussy", resize=(500, 600))
                elif act == "les_dildo_anal":
                    self.txt.append(random.choice(["After some foreplay, she stuck a dildo up your girls butt. \n",
                                                                                   "For her money, she had some fun playing with a dildo and your girls asshole. \n"]))
                    self.img = self.girl.show("les", "dildo anal", resize=(500, 600))
                elif act == "les_do_dildo_anal":
                    self.txt.append(random.choice(["After some foreplay, she asked %s to shove a dildo up her ass. \n"%self.girl.nickname,
                                                                                   "This female customer of your brothel clearly believed that there is no greater pleasure than a dildo up her butt. \n"]))
                    self.img = self.girl.show("les", "do dildo anal", resize=(500, 600))
                else:   
                    self.txt.append(random.choice(["She was in the mood for some girl on girl action. \n", "She asked for a good lesbian sex. \n"]))
                    self.img = self.girl.show("les", resize=(500, 600))
               
                self.txt.append("\n")

The options allowed by current tagging system (if job is done proper) will require even more than this, who's going to write the texts/match tags... BDSM is even worse, there are like 80 options by my estimate so doing those properly is best left for the future.

I don't remember if customers already have random amount of money depending on rank, but they should. It also will somewhat prevent excessive discontent of high ranked whores, since low ranked customers cannot and will not have enough money to hire them, at least usually.

They do, system is there... but without a very detailed balancing document I found that actually take money from clients created too many issues like they would all spend it in bar and not have enough for a girl and whores would go begging after a couple of weeks :D

So I left it until "better days".

Anyway, just found and fixes another small bug during items transfers and trying to decide what to do next (I think it's a choice between Next Day Reports/Screen and writing modding guides).
Like what we're doing?