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

.
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:
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,