Ren'Py [Development Thread] Brothelmania: Brothel Management Sim

Quintillian

Member
Apr 15, 2019
144
261
Happy New Year!


Here for the monthly update.

December progress.
UI Changes:
  • Reworked the Roster Screen, now allows for quick access to a character's location as well as showing their Attribute values, and Age.
  • UI change: Removed the scroll viewport from the Roster Menu, and instead implemented a Paginator to improve this screen loading time.
  • Also increase the image cache size to 1GB.

Systems Changes:
  • Added the final (for now) working implementation of the Courtesan, Masseuse, Waitress, and Dancer Jobs.
  • Added a Details button in the Job Report screen to show all the Roll results and other numeric outcomes and values.
  • Removed the Loyalty Stat from the game as it was thematically conflicting with the Defiance Check.
  • Reworked the starting Perks introducing the classification of Glamour Attributes (Cuteness, Looks, Refinement, Allure)
  • Patrons now have a list of Preferences.
    • One of those Preferences is the service their willing to pay for.
    • Another is the Glamour Attribute they are looking for.
  • As usual, bug fixes and balancing issues. For balancing, I still haven't figure out how to properly come out with math functions that scale well, but I'm taking inspiration from Balatro: shit's is a lot easier to reason and balance when it is basically (Base Value) * (Mult Value), and then use modifiers to mult the Mult.

January TODO.
This month, I'll be polishing the Relationship System. This will keep track of every relationship in the game, both player-character and character-character. It will consist of three things, opinion, dread, and status. This is the first System of 4 that will make up the social simulation aspects of the game. Next on the docket, is refining and adding content to the Interactions Systems. Once this is done, what follows is the Facets/Personality System and lastly, _finally_, the Desire/Fears System.
 
  • Like
Reactions: Su13n

Quintillian

Member
Apr 15, 2019
144
261
I am back. Couldn´t make an update till now. A lot of personal stuff is happening this 2025, mostly good stuff, but nonetheless means I didn't have lots of free time to spend on the game. However, there was some progress.

Jan-Feb Changes:
- (House Cleaning) Upgraded the project to use Ren'Py 8.3.4 ( latest, for now ). Fortunately, nothing broke this time. Keeping Ren'Py up to date while the game is still unreleased is important to me, first because once I release the game, I´ll have to start worrying about not breaking people´s files with major changes. 8.3.5 is supposed to come out in April, I think and I´m really looking forward to it. Any performance gains are very welcome indeed.
- (Systems) Finished the rework of the Relationship System. Each Relationship stores values for opinion, love, dread, friendship, and trust.
- (Systems) Streamlined the Interactions System so it is now more easy for me to add logic and variations to the interactions between characters.
- (Content) Added and tested 16 (half) of the planned Perks.
- (UI) All imagepacks are now clickable in-game to display them at their real size.
- (QoL) Added the posibility to Hard-Ban and Soft-Ban pack images. Hard-banned images will never show again across different savefiles while Soft-Banned images will not appear for that specific save.
- (QoL) Added the posibility of referencing multiple directories as sources for imagepacks, meaning players that have BK packs already installed don´t need to have duplicates, as I know some you degenerates have hundred of gigas worth of packs.

March TODO:
- Add the pending 16 perks. This is the more difficult half to add, as not all related systems support what I´ve planned yet. Also, I´ve to keep remind myself this is not the moment to worry about balancing issues.

Until then,
 
  • Like
Reactions: atmosphere1980

Quintillian

Member
Apr 15, 2019
144
261
It has been a while, time for an update.

I pushed against the plans I had for this iteration. Originally, the plan was to add the missing perks, but once I was doing that, I got the feeling that the perks I was planning to add where too boring or didn’t provide enough value.

To start fixing this, I want back to the existing game mechanics, and tried fleshing them out a little bit more. The consequence were a lot of changes listed below:

- Added basic logic for character appraisal.
- Added player character creation.
- Added a disclaimer screen.
- Added the inventory system for the player.
- Added the slave market into the game.
- Added the item shop into the game.
- Added QoL framework for an in-game wiki.
- Added temp effects that can make subsequent Checks less successful after a failed Check.
- Added framework for events-system using same Pattern Matching technique.
- Reworked the UI layout of the rooms screens.
- Modified the rest of the UI to use the same theme.
- Modified how base advertising works.
- Modified some Jobs to be able to serve more than 1 patron in the same Period if the employee has enough patron_slots and the Job allows it.
- Fix a bug where the game generated unreachable perks.
- Fix a bug with the traveling system were menus screen would overlap with one another.
- Fix a bug where the when the auto assignment of default jobs after the requirements for current job where no longer valid crashed the game.
- Fix a bug with traveling system where the would crash if the player was in a room.
- Fix a bug where characters bought after the work report was generated would crash the game due to their report being missing.

Another side-effect I discovered was the realization (or confirmation bias maybe?) that I don’t really know what content to implement into the game, or rather what of the already planned content to prioritize first.

For this reason, I am trying to get the alpha demo release as soon as possible. Right now aiming at mid-May. And instead on focusing on adding in more playable content, I’ll focus on the three systems I’ve still pending:
- Body Modification System ( Similar to how body modification works in Free Cities, just substantially more limited for now. Not started. )
- Inventory System ( Is already in the game internal logic, just not fully functional in the UI side )
- Trait System ( Some more to give each character some uniqueness, will work based on the Effect System, which is already fully implemented )
- Rules System ( Similar to how rules work in JoNT. Not started. )
The two systems I’ll leave out for now due to time constraint, are the Reward/Punishment system, and the Postings/Requests system, but will tackled them again for the release of 1.0.
 

Quintillian

Member
Apr 15, 2019
144
261
Last Day of April = Update.

So, on the last status update I set out with a couple of goals I thought I could cram into a single month. Well, unfortunately I couldn't complete even one. The Windows PC I was using to develop this game started blue-screening on me several times a day. I spent two weeks trying to get it fix, but it just wasn't happening. After much frustration, I decided to nuke Windows, and move development to Linux so I had to then spend time fixing everything that broke with the migration, the biggest one was the character packs, which for some reason Ren'Py liked to pretend files were missing when they weren't for some reason.

Anyways, that is solved, the point is: I didn't get much done in the game when it comes to new features, with the exception of the Body System. (* No extensive body modification yet, sadly).

I don't want this status update being just me complaining about Windows. For a supposed devlog, there is not much 'dev' stuff here besides what has changed. I've been wanting to change that. So the rest of this post is going to be me going over the Body System at full length. It will be heavy on the technical side to the point you're going to forget this is for a porn-game, so if you don't want to read a lot of nerdy stuff, this is your chance to run.

So, first I going to explain what I mean for a Body System. I have mentioned Free Cities game as the inspiration, and that is basically what I want long term. Player customization is a big part of what I enjoy on management games. The fantasy here for a Trainer-style game is to offer massive control to the player. From mild cosmetic changes like hairstyles to the more drastic (dark) modifications like in Free Cities like amputating a limb.


Actual Devlog Stuff Starts Here.

In the game, a character’s Body is composed of several Bodyparts. There are two types of Bodyparts: BodyPartContainer and BodyPartNode. These two classes are structured in a composite pattern giving the entire Body the logical structure of a tree:

Code:
Body.
- Head.
    - Eyebrows.
    - Eyes.
    - Ears.
    - Nose.
    - Mouth.
        - Tongue.
        - Lips.
        - Teeth.
    - Neck.
- Torso.
    - …

Since I want the game to highly moddable, I’ve currently designed the core of the game to be loaded in as a mod. Full-modding support isn’t my focus right now, at least with this decision I know I’m starting with the right approach, and any future changes to make modding easier will be less painful. Case in point, currently, the way to add new Bodyparts is as follows:

First, define the BodyPart in a .toml file. This file must exist in a specific folder structure, but I’ll talk more about that at other time, for now I want to just focus on the config.

Python:
# Head

[Head]

id_name = "Head"
name = "Head"
class_name = "BodyPartContainer"
subparts = ["Hair", "Eyebrows", "Eyes", "Ears", "Nose", "Mouth", "Neck"]

[Head.grammar]
teen = ["young", "youthful", "young, doll-like", "youthful, doll-like"]
high_looks = ["perfect", "beautiful"]
This defines the Head BodyPart. id_name is used internally as an identifier. name is how this BodyPart will be referenced by the game’s text. class_name indicates to the factory function what class to instantiate. Thanks to RenPy’s flexibility, this even means that anyone can create their custom classes if they find current functionality lacking. subparts are the ids of the BodyParts belonging to this BodyPart, this is also used by the factory function during the building process. Lastly, [Head.grammar] section defines additional grammar rules that the Text Descriptor System can process. This are text-substitutions rules to randomly flavor the text generation. In this particular rule, anywhere the Descriptor finds the string: #teen# it will be randomly replaced any of the suggestions, meaning the Descriptor entry can just be written like:

Python:
init 10 python:
    add_body_description(
        "BODY_DESCRIPTION_HEAD",
        [
            { "==": [{ "var": "context" }, "on_overview_body" ] },
            { "==": [{ "var": "body_part" }, "head" ] },
        ],
        None
    )

    add_body_description(
        "BODY_DESCRIPTION_HEAD",
        [
            { "==": [{ "var": "context" }, "on_overview_body" ] },
            { "==": [{ "var": "body_part" }, "head" ] },
            { "==": [{ "var": "age" }, "teen" ] },
            { ">=": [{ "var": "looks" }, 18 ] },
        ],
        "{{ character.name | title }}’s has a #teen# face with #high_looks# skin."
    )
Again, I’ll explain more about the Descriptor in another post. For now back to the bodyparts.toml, there are more values that can be configurable: stats and traits. stats should be used for characteristics that could change overtime more gradually, in the code this are represented as a numerical value, and broken into tiers; when a Stat moves up or down the threshold changing its current tier, it triggers an update which can be used to update the effects it has on the character object. traits are sort of like stats, with the difference they are not represented numerically. There is no concept of ‘higher’ or ‘lower’, just different. What a trait can represent can also be more abstract, Color here is the obvious trivial example. But DildoSlot on BodyPart Ass is interesting example to ponder about :devilish:. trait are also sometimes referenced in the game’s code as morphs.

i.e. a more complex example with traits and stats.

bodyparts.toml:
Python:
# Eyes

[Eyes]
id_name = "Eyes"
name = "Eyes"
class_name = "BodyPartNode"
stats = ["EyeSize"]
traits = ["EyeShape", "Color"]

[Eyes.grammar]
eye_size = "#{{ query.eyes_eyesize_tier }}#"
eye_shape = "#{{ query.eyes_eyeshape_name }}#"
medium = "medium-sized"
almond = "almond-shaped"
eye_expression = [
    "giving them a #expression# look.",
    "creating a #expression# #expression_end#.",
]
expression = [
    "{% if query.eyes_eyesize_tier == 'big' %}wide-eyed and curious{% else %}sharp and focused{% endif %}",
    "{% if query.eyes_eyeshape_name == 'round' %}soft and gentle{% else %}intense{% endif %}",
]
expression_end = ["gaze", "look"]
bodystats.toml:
Python:
# HairLength

[HairLength]
id_name = "HairLength"
class_name = "BodyStat"
name = "Hair Length"
base_min = 0
base_max = 100
min_on_creation = 0
max_on_creation = 100

[[HairLength.tiers]]
name = "bald"
lower_threshold = 0
effects = ["UnSetFlagHairPullable"]

[[HairLength.tiers]]
name = "short"
lower_threshold = 20
effects = ["UnSetFlagHairPullable"]

[[HairLength.tiers]]
name = "shoulder-length"
lower_threshold = 40
effects = ["UnSetFlagHairPullable"]

[[HairLength.tiers]]
name = "long"
lower_threshold = 60
effects = ["SetFlagHairPullable"]

[[HairLength.tiers]]
name = "waist-length"
lower_threshold = 80
effects = ["SetFlagHairPullable"]

bodymorphs.toml
Python:
# TwinTails

[TwinTails]

id_name = "TwinTails"
name = "twin-tails"
class_name = "CoreMorph"

[TwinTails.requirement]
class_name = "AndRequirements"

[[TwinTails.requirement.inspectors]]
inspector = "is_hair_length_between"
args = [40, 100]
description = "Character has long hair"

In the game, this all results to this:

Screenshot from 2025-04-30 18-53-58.png

In example above, the turquoise colors in the descriptions aren’t a coincidence. Similar to how it works on Brothel King, a configuration .toml file at the root of the image pack can be used to further refine a character, overwriting the default character builder template (More info on that also at a later time).

To conclude, hopefully this small snippet into game’s structure somewhat helps to document the extend of the customization that is possible. More work needs to happen on the Body System. For one, more content. Writing is the slowest part of the process for me, but I’m getting there. For the month of May, I’ll continue where I left off, provided I don’t run into another OS issue :).

Until then,
 
  • Like
Reactions: sejones999

Quintillian

Member
Apr 15, 2019
144
261
May update!

Fortunately this month I didn’t encounter any more OS-related issues. A couple of bugs here and there, but nothing serious. In fact, I could say my system has never ran as smoothly. You could be forgiven to think this meant I did a lot of progress in the game, but well… sort of.

At this moment, the code base for game that consist in pure python files (no screens, no labels) sits around 12000 lines. This is a lot of context to keep in mind at all times, a lot of decisions and plans are stored into those ~12000 lines of code. With no reliable way to build documentation, or implement a testing suite, this is as expected a little difficult to maintain. I like to think, I’m making robust code here, but the truth is without those tools there is not certain way to know, and any new change could be introducing new bugs previously unforeseen.

Anyways, until recently, I just thought this was an inevitable consequence of working with the Ren’Py engine. I choose it knowing this, because I really like working with Python, and I’m firm believer that for solo-development, the development experience has to be among the top concerns just to keep motivations.

So then imagine my joy when I found this:


I can’t even begin to describe how huge this is to me. Having the ability work directly with .py files instead of the usual .rpy opens so much tooling opportunities. Case in point, the use case of automatically building documentation:

Let’s take a moment to appreciate this, and go back to basics.

The way I’m structuring the game is so that it’s highly modable. But let’s be real, even if someone wants to slug their way through an alien code base to understand how it works, it is really not comfortable when as a modder all you want is to implement your idea and share it to the world.

Another case in point:
A game I like and a huge inspiration for this is Innoxia’s Lilith’s Throne, but tell me, if you were to make a mod, where would you want to start:

Here?
Or Here?

It is therefore vital, for the long-term support of this game to have at least a decent amount of documentation, and if possible some mocking and testing.

So, in short, that’s what I’ve been doing. Moving all the .rpy files to .py, and fixing the numerous issues that immediately get pointed out by the linter or formatter.
 

Quintillian

Member
Apr 15, 2019
144
261
Surprise update!

I felt a little bad for last update being so little on the features side, so I took the long weekend to tackle some of the low-hanging fruit I'd in the backlog.

I reworked the Location and Job system to support leadership roles. This is a mechanic straight taken from games like JoNT or Free Cities, where sure you have and train the slaves, but not all the slaves are equals amongst themselves. This also introduced one more stat to keep track of for the Relationship. 'Seniority' is a measure of the relative social standing between two characters. This drives social interactions, like bullying, making friends, or lovers.

Leaders are tied to a location, but their schedule remains still under player control, so you can still appoint how they spend their periods base on your needs. I'm already predicting someone will complain about the micromanagement, but I rather work on QoL enhancement to make the experience less tedious, than to simplify the mechanic.

On another subject, since I took a jab a the Location system, I went back to world building the setting and came back with 6 districts for the city with 23 different locations to explore with gameplay impact. Finding high quality backgrounds to... eh, 'borrow', for each is time consuming, to the point I am considering changing how this backgrounds are displayed. Currently, I am using Ren'Py scene to take the whole screen, but it is not convincing me.

Speaking of UI, I also reworked the Events System. Now there are two 'channels' lets say for events, one of which is exclusive for events marked as tutorials so it all uses the same system, but don't compete with each other. In that note, now events have the ability to 'self-trigger' when the player visits a new location/room instead of being a notification that need to be clicked to start the event.

And lastly, since I am tackling the content for the first tutorial, I started working on the Wiki System, which is an glorified name for a custom dictionary structure that can be accessed through text hyperlinks to display lore tidbits to the player.

You don't have permission to view the spoiler content. Log in or register now.

Aside from all that, I finally found the main that is going to haunt give ambience to the brothel management loop.
 

Quintillian

Member
Apr 15, 2019
144
261
Last update for a while, will update again by the end of month.

I don't post much on the whole learning to draw training arc, because I don't want to set false expectations for this project. Making art is hard, not fun hard (ifywim) like playing Desert Stalker for the first time this week, (Zahra is best girl, I will fight you on this), but painfully hard. Whatever you go with 3d, 2d, or AI, I have tried them all and it is a steep learning curve regardless and the improvements are slow.

That said, I have found drawing extremely calming and rewarding, I am in for this thing for the long run, Carpal Tunnel Syndrome be damned.

Anyways, here is a whole afternoon sketch:
You don't have permission to view the spoiler content. Log in or register now.

I am very happy with how this piece is turning out, I mean, who doesn't like a foxgirl?

I must be part IA, because I can't get hands ok either, so I have to resort to taking photos of people's hands and tracing them. I also feel very sorry for Dara here because of what is about to happen to her. Nothing lewd unfortunately, but things just degrade into hilarious fashion once I start adding in clothes, color, and shadows. Definitely something to improve.

Anyways I shall return to the coding mines.

Until next time,