Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Kilyle

74
Posts
5
Following
A member registered Sep 24, 2016

Recent community posts

Trying to make sure I don't misunderstand this: If your slave goes away from the household for some reason, but has not been sold etc., it still adds 1 to the Ownership counter for each day?  So like, a person who's been working in your mansion for a week, and a person who spent 6 of the 7 days out of the rotation due to vacation/recovery/whatever, would have identical numbers added to their variable?

That feels like it's working as it should be.  Feels like if the number of days owned were calculated minus "days outside the rotation", it'd wind up with way more problems.

(1 edit)

So... does "if slave.[variable] > 0" work for any specific reliable variable?  There's a variable for days spent in my household, right?  That one would be 0 for newly generated slaves or ones I caught that day, but higher than 0 for slaves I've owned longer than a day?

What I'm basically after is switch the slave's reaction to me perusing them at the auction, based on whether they're familiar with me.  So I don't care about first-day slaves at all, but about slaves I sold after molding them a bit, basically.  (I routinely sell and rebuy a slave to get upgrade points and a free(ish) brand.  I don't think a slave like that should react to my presence the same as a slave who's never been in my house.)

Also hang on, slaves at the auction house have a stress level of 0?  That seems... interesting, from a worldbuilding viewpoint.  I might toy with that one.

What's the easiest way to check if a slave at the auction is one we've owned before?

Also, does selling a slave cause a drop in their loyalty/obedience or an increase in fear?

Okay, so, I hunted a bit through Combat and Exploration, and tracked down the part where the game distinguishes bandits from captives (or at least, one of the spots):

if defeated.names[index] == 'Captured' || defeated.faction[index] in ['stranger','elf']:

What I would like to do is to reference this in Description, when trying to determine whether the described character is (a) a bandit, (b) someone I just rescued, or (c) someone I just kidnapped, because the described mood should be very different, right?  "Bound at your feet, looking up at you with fear and hatred" doesn't fit someone I just rescued.

So... how do I do this, or is it too complicated to handle at my current skill level?  Is this info I'd need to hand over from Combat/Exploration to Description, instead of having Description query from within its functions?  Would it be best to make a secondary description routine in Description and have Combat/Exploration call it while sending a secondary faction marker?  Is it hidden in the person's code already (e.g. by calling them "bandit" or "captive" before they get named)?

Also does the game rename characters between the "do you want to capture them?" scene and getting them home? because it feels like the names I see at the end of combat aren't the names I see once I look through my haul.

By the by, the wiki that the Modding Guide used to be on has gone down.  The wiki gave me a chance to download the whole thing, but hunting through it for specific details has been... an adventure.  Is it likely to get uploaded to a different site or something, or is it gone for good?  (No wonder I couldn't find a list of Traits online the other day when I was looking for it.)

Oooh, that's a useful doc; thanks!

Oddly enough, despite it being less efficient than later versions, I do kinda appreciate having a version set in a given form.  Far too many things moving faster than my workflow can account for these days, so it's nice to have a thing where I can learn it at my own pace and not have to keep up with changes.

(1 edit)

Okay, so, I found the part of the code causing the obvious harm (not to say there's not more to find; I'm currently testing a little at a time), and it's the "has" method.  Not sure if an issue with the distinction between Godot and GDScript, or between different versions of the engine or something, but on the bit I'm testing the error stops if I swap out a tiny piece of code.  ...and then I thought I understood the error, but the error comes right back if I correct it.  Here are the four versions:

1. if person.race.has("Elf"):
2. if person.race.find("Elf") >= 0:
3. if "Elf" in person.race:
4. if person.race.contains("Elf"):

First version fails (generates empty log), which led me to the second version (as it gets used in the code a lot), which lets the game load without an error.  But it feels inelegant, so I looked through the documentation and it says that the third one is identical, so I used that and it ran without error.

However, examining the documentation more closely, I realized that I was using an array operation when I should be using one for a string (so the third version might run without error, but it's not doing what I want it to do, and might still crash later).  So I found the "contains" method, which appears to do what I want.  However, when I use it in the code, we're right back to zero-content-log crash.

Is the second method really the only one that works??  I need to sort races into pools (Elves and Beastkin specifically), and it sure would be handy to ask the code if it has the little keyword in there, as opposed to "Does it have an Elf? Well, how about a Wood Elf? Well, how about a Dark Elf?" etc.  The "where do you find this substring?" method clearly does work, but it feels weird.

That actually makes me feel a bit better -- that it's not an obvious problem with my code, but something that requires more digging.  And thanks for reminding me about the debug thing; it's been so long since I modded that I'd forgotten all about it.

White space has never been a problem for me; I've been coding since well before the turn of the century and that sort of feels like native punctuation to me (like the way people who are fluent in English and skilled in the use of language will typically know where to put a period or how to break things into appropriate paragraphs).  My brain's well specced for it, and actually finds it a bit hard to conceptualize the people who don't notice the "tiers" there.  (Also the spaces vs. tabs thing amuses me because I've recently started working as a proofreader and was just laughing with my friend about how the person whose work I'm editing uses spaces instead of tabs... just like my dad, sigh.)

And I'm relatively certain that I have the futanari/enby thing correct (added in one place, subtracted in another), but I'll double-check that I didn't inadvertently drop it in one spot when trying to troubleshoot the rest of the issues.

I have modified the contents of, but not the structure of, the names list (and the variables leading to it, which apparently go through three layers, sigh); basically I've been trying to mimic existing structure, and it's been frustrating when existing structure can't be easily mimicked.  I don't like overhauling existing things, but like branching off to a piece of my own that I have to the side, and letting it do its thing, and then redirecting back to the original code, ideally so that less of it breaks.  Or like turning a thing with two parts into a thing with three parts (as I did successfully with the pronouns code some months ago).

So, it sounds like your second piece of advice is key: I need to set aside a bit of time and go through a tutorial, with a focus on getting a grounding in the specific implementation details.  The concepts are old hat, but given the number of languages I've studied over the years, it's more than likely I'm "speaking Spanish when I meant to speak Italian" as it were.  That, or missing something unique to Godot.

Thanks for giving me a bit of confidence, though -- that my code (even if not efficient) doesn't look broken.  (I have mixed feelings about the efficiency thing, because part of my frustration with the existing code is that some of the coding efficiencies have led to implementation opacities, such as "where the hell does it even set the surname? oh right there as part of a section to set all the things in this set, not specifically the surname" -- which is why I couldn't find the word "surname" anywhere useful.)

And in the meantime, I shall encourage myself with the thought that even if my code sucks, at least it isn't made by AI.

Hey-di-ho, I am back, with my fumbling attempts to update the name pools so that they stop breaking my immersion (no more elves named Melanie, plz and thx).  (I had a brief but hilarious error where it turned absolutely everyone Japanese with Orcish given names.  I feel a bit like a monkey trying to mash random keys until the bananas come out.)

After much fumbling around and getting frustrated by scope that I don't know enough to do correctly, I decided to just shove things into the Names.gd file with just a couple alterations to Constructor.gd and Assets.gd, but after some troubleshooting I have gotten to where the log file is just blank (sigh).  Likely I got a bit too complicated too fast.

In Constructor's GetCaste function, I added a little bit under the Rich and Noble sections:

if person.race == "Human":
    ## Switch surname to a fancy one
    person.surname = globals.racefile.namefile.getMyName(person,"noble")

(I also have it erase a slave's surname, since this appears to come after one is set, and slaves having surnames always struck me as a little weird, since stealing heritage from slaves is one of those things that did happen, historically.)

In Names, I messed with the existing lists, and ported a number of names into my own lists, which I wound up sticking under a single variable, thusly:

var MyNames = {
    kidnames = {
        humanfemale = ["Addie", ... ],
        humanmale = ["Abel", ... ],
        humanenby = ["Alex", ... ]
    },
    nobility = {
        humanmale = ["Abigail", ... ]
    },
    ...
}

It also contains sets of Slave, Furry, and Ethnic names (the latter mostly for Tanuki, though if I get it working I'd like to be able to have a certain percentage of slaves have ethnic names where they actually match (as opposed to random Asian or Spanish surnames paired with random English given names, etc.).

Anyway, this is the function I eventually pared down to:

func getMyName(person,namepool = "kid",heritage = ""):
    var text = person.race.to_lower() + person.sex.replace("futanari","enby")
    
    match namepool:
        "noble":
            if MyNames.nobility.has(text):
                return globals.randomfromarray(MyNames.nobility[text])
            else:
                return ""
        "kid":
            if MyNames.kidnames.has(text):
                return globals.randomfromarray(MyNames.kidnames[text])
            else:
                return ""
        "ethnic":
            text = heritage + person.sex.replace("futanari","enby")
            if MyNames.ethnicnames.has(text):
                return globals.randomfromarray(MyNames.ethnicnames[text])
            else:
                return ""
        _:
            return ""

And then in Assets, I changed the getname() function to this:

func getname(person):
    var text = person.race.to_lower()
    var newname = ""
    var classrating = 0
    
    if person.race.has("Elf"):
        text = "elf"
    elif person.race.has("Tanuki"):
        text = "asian"
    elif person.race.has("Beastkin"):
        text = person.race.replace("Beastkin ", "")
        text = text.to_lower()
        ## Should amount to Wolf, Fox, Cat, or Bunny
    elif person.race.has("Halfkin"):
        text = "human"  ## Might change later
        text += person.sex.replace("futanari","enby")
    
    if person.race in ["Human", "Elf", "Seraph"] && person.origins in ["rich", "noble"]:
        classrating = 1
    ## Note: "bandit" is for later, if we get around to getting it set up
    elif person.origins in ["slave", "bandit"]:  ## Dropped poor
        classrating = -1
    
    ## So it would be: Nobles (who also give their kids fancy names)
    ## then kids, then slavenames, then regular, yes?
    
    if classrating > 0:  ## In case we want to differentiate Rich from Noble
        newname = globals.racefile.namefile.getMyName(person,"noble")
    elif person.age == "child":
        newname = globals.racefile.namefile.getMyName(person,"kid")
    elif classrating < 0:
        newname = globals.racefile.namefile.getMyName(person,"slave")
    elif person.race.has("Tanuki"):
        newname = globals.racefile.namefile.getMyName(person,"ethnic","asian")
    elif person.race.has("Beastkin"):
        newname = globals.racefile.namefile.getMyName(person,"furry")
    
    ## If the above doesn't work out...
    if newname == "":  ## Still haven't set name
        if !globals.racefile.names.has(text):
            text = "human" + person.sex.replace("enby","female")
        person.name = getrandomfromarray(globals.names[text])

I'm clearly doing something wrong, but as I have reached the stage of zero mechanical feedback, I am left floundering.  Halp?

Oh!  I missed that there's more to that file.

(Notepad++ lets me see all the times a search term comes up, but Scrivener just shows me the first and apparently expects me to hunt for the rest.  I've currently got the full code in Scrivener in sections so that I can easily hunt down which part to edit in NPP.)

Hmm... this might actually make part of what I'm doing easier.  Or possibly screw it all up again, depending.  Guess we'll see.

Gotcha.

I'm not finding any indication that having a nurse on staff helps characters heal overnight (in the end day process stuff).  Where is this code located?

Trying to figure out the logic in NextDayEvents()

if player.preg.duration > variables.pregduration && player.preg.baby != null:
    childbirth(player)
    checkforevents = true
    return
for i in globals.slaves:
    if i.preg.baby != null && (i.preg.duration > variables.pregduration ||
    (i.race == 'Goblin' && i.preg.duration > variables.pregduration/2)):
        if i.race == 'Goblin':
            i.away.duration = 2
        else:
            i.away.duration = 3
        i.away.at = 'in labor'
        childbirth(i)
        checkforevents = true
        return

Given that these checks end in Return, does that mean that the game only allows one birth per day, and the player's birth takes precedence?

Also, does this mean that if a birth happens, no other events happen?  Or what does checkforevents do?  (I'm getting a little overwhelmed by all the code lately.)

Also, the next section that's not commented out says "#Old scheduled event system" -- is it still functional, or am I looking at code that never activates, or...?

Just two spots, huh?  That's a relief (after the other things I've been fixing up have bled out all over the place).

And yeah, I want a new job that a different character can be -- a Majordomo, the top butler, the Edwin Jarvis who keeps everything running aside from the slaves themselves.  A head girl is like the chief slave (focused on keeping the slaves in line), but a majordomo is like the chief butler (focused on the smooth running of the household, such that the master never has to bother himself with the little details and always finds his preferences accounted for and only has the actually important stuff brought before him while the rest gets handled secretly).

Long before I ran into this game, I ran into the concept of the Majordomo (in Marvel Comics), and the thought has stuck with me ever since.  Sure would be nice to have someone whose sole job is to ensure that I don't have to clog my easily distracted ADHD brain with all the little details of life, just the ones that actually require my attention.

Besides the Mansion's end-of-day stuff, how many sections would I need to modify to establish a new role, like Headgirl, for a Majordomo -- someone who keeps track of certain details and informs me of them (like to replace "You notice some of your food/gold is missing" as if the leader of an estate with multiple slaves would be the one personally inspecting the storehouses each day).  I mean I might want to add some additional details later, but mostly I want to start with "Sir, your gold seems to be dwindling faster than the books would account for.  I presume one of your slaves is sneaking into the treasury" or the like.

Character would be more effective in a Butler's Outfit, and less effective under some other conditions, and certain stats or traits would affect it too -- most obviously Wit.

So, I found this section, which appears to be where the Cleanliness of the house gets reduced: each slave reduces it by 1, except that shortstacks do 2/3, beastkin 4/3, and a few key races nearly twice the norm.

for person in globals.slaves:
    if person.away.duration == 0:
        if person.bodyshape == 'shortstack':
            globals.state.condition = -0.65
        elif person.race in ['Lamia','Arachna','Centaur', 'Harpy', 'Scylla']:
            globals.state.condition = -1.8
        elif person.race.find('Beastkin') >= 0:
            globals.state.condition = -1.3
        else:
            globals.state.condition = -1.0

But then I took a closer look, and it appears that each line is setting the variable, not changing the variable.  That is, the only loop that matters should be the final loop, in which the condition is set te a negative number related to that specific slave's race.

But since the mansion clearly appears to be getting dirty in a less consistent fashion, it appears that these lines do something I didn't expect.  So I hunted around some more and found this:

func cond_set(value):
    condition += value*conditionmod
    if condition > 100:
        condition = 100
    elif condition < 0:
        condition = 0

...which is defined as the way that this variable gets changed/set.  So I take it that elsewhere in the code, "globals.state.condition = X" gets reinterpreted as "cond_set(X)"?

Related question: If I change these statements to -= X instead of = -X, how would that affect the code, if at all?

Ah, that would do it!  Thanks for the idea!

Browsing this sex code stuff is making my eyes cross.  I would like to include a desire to get bred, and have it met if the character gets ejaculated into.  I figured out the desire part, and how to add conditions (Submissive or Monogamous or Clingy, past a certain loyalty threshold, etc.), and how to make a category for breedable acts (one for MPreg, one for normal), so I can ask "was the last action a breedable action?" and probably also "was this character the receiving partner?"

But I can't see how to ask "did it involve ejaculation by the penetrator?"

It's not so much that the code would be unsalvageable, as that at some point my brain will revolt over the sheer enormity and complexity of it all, and scream at me until I push the old version to the side and start a newer, cleaner version, using more of what I've learned.

Cycles of iteration and all.  It's been a fascinating journey so far.

Haven't yet tested this lastest round (still touching up major portions, and I have a Thing about not testing in small chucks due to sheer annoyance with load times), but I believe I've managed to let Omegas (Submissives) get pregnant, and possibly allowed Alphas (Dominants) to get turned into Submissives if they take it up the ass enough (heh).  Plus I've recently managed, let's see...

  • A kajillion birth scenes based on this or that trait -- a big difference in reaction between a Prude, Spoiled, Sex-crazed, Infirm, etc.; Passives dissociate unless they feel cared for, and there's even a nod to the mother's reaction if knowing they'll not get to keep the kid
  • A set of more subtle pregnancy signs for the player (you're about halfway through when you stop denying that you've got a baby bump, and near the end you're complaining about it taking too long and how you can't breathe), and I'll be putting together more subtle signs for slaves as well
  • Costume/Accessory effects have been dolled up, though I'm still in the middle of that -- but like, using a Maid costume on a male character who's not Pervert/Deviant or Submissive will stress him out (even more if he's forced to go out in public that way), but the obedience gain is a bit better too.  I've got a whole set of trait-based modifications for the Living Suit, should I ever get far enough into the game to find it.
  • More interesting groups of names, though I petered out partway through so it's basically just fairies and sea creatures, plus surnames for elves and herdfolk, and changing the human names so that I stop winding up with names that break my immersion (like "Elvis")

Eventually I'll see if I can't manage litters for Beastkin (especially bunnies) and Omegas, but that seems like it might be a bit of an undertaking.  I also want to get to the point where I can fork a bit of the sex scenes so as to make Alpha/Omega sex more interesting.  With the new Omega fertility boost, I expect to be playing those scenes a lot, lol.

Oooh, I hadn't even thought of it being an effect (like "Captured").  That would actually be pretty useful.  Not sure I want to tackle it right now, though, if as you say it's a difficult thing.  I've been messing with enough systems lately that I'm just waiting for the whole thing to come crashing down around my ears and force me to restart, heh.

Is there a way to tell if the "mind break" (getting so stressed you dropped to 0 confidence etc.) happened on a given day?  Like, even just "was it today" would help, but "was it within the last three days" would be better.

If not, is there some simple way to rig this?  I'd like for the reaction to mind break to be incoherence for at least a couple of days.  It seems weird they'd be able to talk normally.

I mean, where would I put the "actually, gimme a sec while I change your name before the player ever sees it" code redirect, when the slave is getting created in either (a) combat/exploration zone or (b) slaves at the auction zone.  I'd just want to have a moment when the name is already set (so the code doesn't expect it to be messed with anymore) but before the player gets to interact with the name (so the player doesn't see one name and then a different one later).

With that sort of redirect, I should be able to put together a "let's look through your Traits to see what sort of nameset would suit you" function for e.g. names like Prince, Princess, Ryan, Adora for Spoiled characters, names like Gunther, Viktor, and Rodrigo for Tough characters, a pool for names that sound faster vs. ones that sound stronger, or more delicate, or prettier / more handsome.

Now that you've told me how to reference globals.names I should be able to use arrays for cute fairy names, Western/Country centaur/taurus names, ocean-themed Nereid/Scylla names, etc.  But being able to change the names based on traits (especially for humans, who don't have a more interesting natural detail to work from) wouldn't really work from an array, unless I made a ton of arrays, and even so it'd wind up needing code to sort through which array to direct to (e.g. female_rich_beautiful_delicate).

...actually, where would I hook a name-change function, if I wanted to change the name only after the character is completely put together and I can look at all the pieces like a normal character?  That'd probably be an easier way for me to do it.

I'd love to give the Spoiled characters uppity names, lol.

Where is the code that gives a character their name?  I can't seem to lay my hands on anything that looks like it actually makes use of those name lists, but they're clearly working (I keep getting "Joesph", one of the reasons I want to change them), so what am I missing?  I want to change how the game chooses names and surnames (based on ages as well as races, so it's easier for me to tell human children and teens apart from adults... and I might switch name lists based on class as well).  (I've already managed some build-it-yourself elven surnames, but the code wound up in an unusual place 'cuz I couldn't figure out how to reference names.gd.  Also, fairies are about to get super trendy weird baby names, lol.)

Also, how would I reference the race of the captive, in a "thugs" or "wolves with person" type encounter?  I wound up having it describe the captive using the race of the first thug -- whoops!  Dunno if there's any way to do this.

On the up side, I've finally gotten past the annoying-troubleshooting phase of the descriptions and dialogue, and those are working well; I've even split up the responses to a request for intimacy, so that we don't get a "meek nod" response from every possible character -- the request phrasing differs based on traits (Subs and Doms, slutty/pervy types, masochists, passive, etc.), and the reactions differ as well, and there's a different threshold by having various traits give a multiplier to either the Lust or the Resistance (e.g. Subs, Masochists, and Likes It Rough bump up the Lust part of the calculation, while Doms and Spoiled bump up the resistance, and at least one trait increases both).  Also, people who could get pregnant are a little more reluctant.  And because it's a multiplier instead of an addition/subtraction, it effectively increases the effect of the existing add/sub lines.  I'll need to refine it a bit (having a Passive character just shrug and go along with it despite being fairly rebellious was not very immersive, but I could change that by changing the threshold a bit and rephrasing the "acceptance").

Anyway, now I've moved on to refining the Encounters.  My Wimborn Outskirts now has random washerwomen, kids running around, and bullies that specifically target a child (or occasionally a teen) or a cat-girl or cat-boy, so it feels a bit more lively.  Frostborn Outskirts and the Forest both have people gathering firewood.  I hope to eventually dig into the code enough to change how many steps an area takes and how much energy it costs per step, so that there's more encounters for the same amount of energy.

One thing I've noticed is that the "bound tightly to prevent escape" stuff also shows up for the captive that was being bullied/attacked, which makes no sense.  Haven't yet figured out how to distinguish between the two types in code such that the captive gets a different description and it doesn't sound like I randomly tied up the person I've just rescued.

By the way, how would I go about making it that I can release captives in the wild in order to reuse that rope?  I once did this sort of thing and wound up with a phantom rope causing crash errors IIRC.  But there's plenty of times when I've got a passel of midling captives and I run across the type I'd really like to catch, but I'm out of rope; it seems like releasing a captive would get me that rope, but that's not how it works and it bugs me.

P.S. While trying to learn some of the string handling in Godot/GDScript, I noticed that "finds" is not the best choice when trying to see if a string merely contains a substring (e.g. "Beastkin" or "Halfkin").  I wound up with some errors using "contains" and eventually hit on:

if "Beast" in person.race

Anyway, is there any reason to favor "person.race.find("Beast") > 0" over "if X in string"?

Also, I've completely forgotten how to look up what sort of code (which edition of GDScript?) this game is using.

Oh, it's definitely a lot of branching statements and having to figure out which subqualities matter for which initial branches (e.g. the amount of Confidence by which a Submissive/Omega becomes notable is much lower than for a Dominant/Alpha, Fear isn't such a big deal for Doms, and Passive bypasses most of the checks I put in later by virtue of just going along with what's happening instead of actively trying to avoid it).  It's taking a while to bash this out, and I'm only on the opening lines!

But I do think that just adding some alternative trait-based and situation-based content (e.g. characters speaking differently if they're Captured, which I believe should effectively act like a counter for "the first few interactions" for most slaves) will make it much less samey and more engaging.  Plus, it should help me get a feel for the personality of my slaves without having to constantly go "wait, which one was the X one again?"  I've especially had fun putting together variations on what Foul-Mouthed characters might say (from being rebellious through to being affectionate).  My test world quickly wound up with a pair of Foul-Mouthed Dominant and Submissive, so I'm tickled that I'll get to test what happens when alphas and omegas express themselves in coarse language ^_^

Ah.  Might be a bit much for me right now, but I'm glad for the info.

So far -- although I'm in the middle of coding it and haven't tested anything -- I've been working on changing the opening line when the slave gets brought to your chambers.  The aim is for traits like Passive, Submissive, Dominant, Spoiled, Ascetic and the like to take control enough to set a baseline style, and then for stats like fear, confidence/courage, wit, and charm to nuance the portrayal.  Seems to be going well in theory, but like I said, haven't gotten to the point where I can readily test it.

Also is "dom" just obsolete code?  In SlaveDialogues' CheckSpeechPatterns:

if (person.conf < 35 && person.dom < 40 && person.traits.has('Dominant') != true) ||
(person.traits.has('Submissive') && person.conf < 60):
shy = true
if (person.conf > 55 && person.dom > 60 && person.traits.has('Submissive') != true) ||
(person.traits.has('Dominant') && person.conf > 35):
bold = true

I don't see it elsewhere but Scrivener doesn't seem to appreciate that one might want to search for a short term without getting the longer ones (e.g. "random") so I've gotten too many results to really sift through.

Is there any record of how many dates a given slave has had?  Like, if this is the first date interaction?

If not, do you have a suggestion for the best place to add such a variable?  I'd hope with like variables such as might be used for the statistics rundown, where I could also list number of dates we've had, or maybe track separately which dates ended positively vs. negatively.

What, if anything, does the following code do?  I don't see other references to this variable.

var newclass = dateclass.new()
newclass.sex = globals.player.sex
newclass.name = globals.player.name_short()
newclass.person = globals.player
dateclassarray.append(newclass)
newclass = dateclass.new()
newclass.person = person
newclass.sex = person.sex
newclass.name = person.name_short()
dateclassarray.append(newclass)

I'm trying to figure out how to make the "dating" more interesting without breaking too much in the process.  Don't have a lot of spoons for troubleshooting right now.

Ah!  That explains my confusion.

Glad I asked, or I'd still be barking up the wrong tree.

I have returned to ask: Is punish.expect a static setting that never goes away once you've berated a slave, or am I just not finding the right part of the code that cancels it?

I'm working on my dialogue options again and there's the "Scared" option somewhere in the code that's like "if slave is over 34 stress and expects punishment then they're Scared" and I borrowed that concept for part of my dialogue tree but if this is a "you berated him once, he's always gonna hold that against you" thing then I might change how I navigate that dialogue tree.  That, or add a bit somewhere that gets rid of punishment expectation if the slave gets to a certain level of loyalty/obedience and hasn't been unfairly punished.  I don't recall many of my slaves getting to a positive relationship without a little discipline somewhere along the way, and berating them is the lightest thing you can do, so it feels weird to have that be a static setting instead of a dynamic one.

Don't suppose there's a "days since last punishment" variable somewhere, like with "days since last sex"?

I suppose that's good -- I always kinda hated the way that my Sims had a limited time to be at a given age, even as part of me also loved the "realism".

Debating whether having elders would amuse me enough to be worth the effort of creating a new age category...

(I'm currently down a rabbit hole of skintones, haircolors, and eyecolors -- trying to figure out patterns and where I'd like the patterns to change, and how to achieve a more bell-curve or weighted bell-curve (similar to advantage/disadvantage in DnD) for heights and such.  Like, petite and towering should be comparatively rare for humans but comparatively common for elves, that sort of thing.  And red hair rare, and why do humans not have brown and dark as part of their skintone range?)

(Also I get a very different impression of "red hair" for mundane/human vs. fantasy/fairy, so I'm gonna change the terminology to have auburn/copper/strawberry-blond hair for humans, with the term "red hair" reserved for fantasy races and probably augmented with "bright" or "deep" or "rich" -- I'm working on some color-nuance code to give more interesting shades like lavender and silver, and fairies and lamias can have pink hair.)

(1 edit)

I'm starting to mess with the races and got to wondering about characters switching age ranges.  I can find code for a baby to... I guess go away for a while until they're a child/teen/adult based on a button press?  I'm not finding any section that can age up a child to teen or teen to adult.  Does such a mechanic exist?  If so, where; and does it change the height range when a person levels up? because the height range for a child is understandably short, but that shouldn't say anything about their adult height, right (aside from not going down in height)?

Oop! just ran across the Maturing Pot.  Forgot about those.

Is there a different mechanic for ages or is it only by potions?

It's gonna take me a while to digest all this, but this is super, super useful.  Especially this part: "The dot operation for objects and dictionaries is simply an alias for the square bracket operation with a string key."  (Is this the case in Visual Basic, I wonder?  If it is, either I never got taught it explicitly, or I've forgotten it in the intervening years.)

I appreciate you taking the time to show me the incremental steps to get down to the most efficient version, so that I can more easily conceptualize what's going on and why.  As a self-taught programmer with what is likely ADHD, I find it all too easy to gloss over bits that seem surface-level "duh" or "I can look this up whenever", but explanations that are succinct enough to focus on but also detailed enough to help me grasp the underlying principles (instead of just the surface-level appearance) are exceedingly useful yet difficult to find.

P.S. I presume the debug mode would be a better way of handling the troubleshooting process than pulling out bits of code like I've been doing... so I just gotta get past the inertia/resistance of "but I don't want to figure out the New Thing, I'm working on this thing, and the irritation of doing this poorly is less of a problem than the effort it takes to do things better" brain mode.  Same reason it took me like five years to get to the point of modding Skyrim, and now I can't imagine playing without mods.  Brain inertia is fun (sigh).

Just to be sure I understand this:

You're specifically referencing the part that didn't work and corrupted the string, and saying that if I want to turn that into a string, then I need to take an extra step.

As opposed to "so the rest of your code may look like it's working, but it's not working right, and you really do need to take this extra step on all the things that so far seem to be working."  Which is currently this:

var accessory = globals.state.unstackables.get(person.gear.accessory)
var acc = getaccessory(accessory.code)
 
func getaccessory(code):
    var acc = null
    match code:
        "accslavecollar":
            acc = "collar"
        "acchandcuffs":
            acc = "handcuffs"
        _:
            acc = null
    return acc

...with variations for costumes and underwear.

I'm not sure if it's possible to shortcut the first two lines to avoid an extra variable that gets immediately discarded?  Something like this:

var acc = getaccessory(globals.state.unstackables.get(person.gear.accessory).code)

I debated about trying that but decided that despite the throwaway variable (three of them, all told), the code just looks nicer and more readable when I separate those two steps.

Anyway, I've gotten to the point of being able to reference and sort by these values, and it's all working pretty smoothly now that I've put it behind "if x != null" walls (which checks if the variable isn't set -- in this case, if the character isn't wearing anything, as opposed to wearing a different thing).  I presume I could do a similar thing using typeof() to make sure it's a string, which is likely a good habit to get into (sanitizing input), but at present all I am looking for is whether it's null.

(P.S. I understand print() functions to display text on the screen (pop-up box); does it have a different function or multiple functionality in Godot?)

Also, on the up side, I've gotten to the point where nearly all the problems get washed away in a few rounds of basic troubleshooting (e.g. pull the newly added code out to a text file, make sure the base isn't broken, add it back in in pieces, find the part that throws a wobbly, then look extra carefully to see if I've forgotten a quote or colon somewhere or misspelled a variable or the like (Notepad++ is actually really good at reducing the (already low) chance that I'll misspell a variable I've used elsewhere in the code), or if the issue is another round of misunderstanding how the code actually works).

So now it's just... ye gods, that's an ambitious level of fine-tuning my brain wants to do to the script!  I'm not even to the fancier parts of the code, just the description you see when you look at a slave and what the slave says to you when you talk to them.  I've condensed parts of the description to lines like "You see Wisteria Smithee, a towering, strikingly gorgeous Halfkin Wolf youth with her hands bound behind her" (which also omits the average part, unless both height and beauty are average, in which case it says "unremarkable" for humans and "typical" for non-humans) and fancy descriptions for costumes based on whether the character is handcuffed or wearing a collar (and the collar description changes when the character is more loyal).

Tomorrow, if all goes well, I'm gonna tackle separating the upper body description from the lower body description so that the eye flows seamlessly down the body.  And then figure out which parts of the character traits I'd like to weave into the description and where.  It'd be nice to see bits of description that combine e.g. beauty and strength (Strong, Frail), or agility and charm to add up to gracefulness, or like have a foul-mouthed character in handcuffs with low obedience throw you the bird.

Okay I think I got to the right stuff where I can easily check what I want

but en route I ran across a weird output formatting?  I'm gonna scrap this code, it was just to pin down the right details, but I am baffled as to how this produces the output.  This isn't even a question really, just a "wtf??"

(NOTE: the line break in the one text line is for readability here and not in the actual code)

CODE:
text += "Not naked!  "
var clothes = globals.state.unstackables.get(person.gear.costume)
var accessory = globals.state.unstackables.get(person.gear.accessory)
 
text += "clothes: " + clothes + ", type: " + typeof(clothes)
    + "; accessory: " + accessory + ", type: " + typeof(accessory)
text += "\nClothes Code: " + clothes.code + "\n Accessory Code: " + accessory.code
 
RESULTS:
1393, type: ; accessory:, type: 1393, type: ; accessory:, type:
Accessory Code: acchandcuffs

So it did spit out the right details, so now I know how to get it.  And I need some error-catching to make sure I'm handling actual variables and not making messy code when they're not wearing anything.  And the actual variables there translate to numbers hence the need for a thing to look them up and all (and 1393 appears to be the null entry? I guess?).

but... why did "clothes: " disappear? why did "Clothes Code: " disappear?  Do mishandled null entries actually erase part of existing strings???

(1 edit)

I knew my code was definitely not right, I just had absolutely no clue what the next step would be or how to look it up (as I had tried, some time ago, to find any example in the Godot/GDScript documentation that matched what I was seeing there, and came up blank).

var gold = 5
var formatPython1 = { gold : gold }  # creates { 5 : 5}
var formatPython2 = { 'gold' : gold }  # creates { 'gold' : 5}
var formatLua = { gold = gold }  # creates { 'gold' : 5}
var emptyDict = {}
emptyDict[gold] = gold  # creates { 5 : 5}

*tearing my hair out*

okay so

let me get this straight:

the Lua format lets you make a string without using quotes, that becomes a string in the code and gets referenced as a string???

never in a million years would I have made that leap on my own

this is my "dot operator" moment for this language

(actually it's more like... this language has broken one of the Core Concepts of every language I have studied thus far (aside from perhaps HTML), which is that strings go inside quotes and non-strings stay outside quotes and never the twain shall meet)


Thank you so much for laying it out so succinctly so I can compare the formats.  That helps a hell of a lot, and I much appreciate it.

Yeah, I'd guessed as much.  In the moment, I was irritated, but afterwards I was just amused -- I'm a language buff, and it's always interesting to run across signs that someone isn't a native speaker (though I do have to wonder about "shit hole" since most of the languages I've studied have "shit" as a base obvious swear with roughly equivalent meaning).  It also explained a lot of odd phrasings in the rest of the program (another detail I'm focused on while modding, just to increase immersion).

As far as the modding, guess for now I'll stick to the existing files and see how far I can go with just that.

Latest roadblock: What is the distinction between these two formats?

## First Format:
var rules = {'silence':false, 'pet':false, 'contraception':false}
## Second Format:
var gear = {costume = null, underwear = null, accessory = null}
var itemlist = {clothmiko = {code = "clothmiko", type = "gear", subtype = "costume"}}
## List of possible costumes:
#costume: clothmaid, clothkimono, clothmiko, clothbutler...
 
## This line works:
if person.rules["nudity"] != true:  ## Nope!
    text += "Not naked!"
## This line doesn't:
if person.gear[costume] != null:
    text += "In costume!"
 
## But the code gets REALLY SUPER WEIRD for that second format???
## These are things I found that seem to reference it:
for i in globals.itemdict.values():
    if !i.type in ['gear','dummy']:
        i.amount += 10
 
var handcuffs = false
for i in person.gear.values():
    if i != null && globals.state.unstackables.has(i):
        var tempitem = globals.state.unstackables[i]
        if tempitem.code in ['acchandcuffs']:
            handcuffs = true
for i in ['clothkimono','underwearlacy','accamuletemerald']:
    var tmpitem = globals.items.createunstackable(i)
    globals.state.unstackables[str(tmpitem.id)] = tmpitem
    globals.items.enchantrand(tmpitem)

What the heck is going on here?  It seems like the first format (dictionary?) allows for a super easy reference to keyed codes ("Does he have this specific rule? Y/N"), while the second format -- which I think I tried to look up soon after dipping into this language, and could not find -- seems to either require several more steps, or require you to manually hunt through every entry to locate the thing in question.

What I want is to be able to see if a person is wearing a specific costume, underwear, or accessory, and then give description based on that.  How to reference these values?

Sweet.  So now the only other major roadblock I've hit (that hasn't cleared up with some troubleshooting) is how to add an extra .gd file of my own, because I couldn't make that work at all.  I presume that has to do with something outside the basic scripts folder?

Anyway.

Yeah, if I were thinking to make a mod for more than just my own private use, I'd probably try to work out a nice integrated restriction like those you mentioned.  Or if it turns out that I wind up using it too much, I guess, but I doubt that'll be an issue.

For the traits, I'm definitely putting a lot of work into expanding the dialogue based on various traits and trait combinations.  First step is just working on the basic Talk Mode thing -- just trying to make sure I grasp the flow enough to make things work without breaking things (the first major step! spent way too long troubleshooting just to realize I'd forgotten a colon and a quote somewhere).  I've been having way too much fun making up randomized dialogue options for Foul Mouth (and I don't usually like things with swearing! but it feels weird to have slave characters with such a pronounced trait who talk just the same as everyone else even when being outraged at their captor).

Next step will be to change the character descriptions again (I did this in a previous attempt, but I want to start from scratch), making them more condensed and flowy and less gamified.  Bits I've thought of include, let's see... logic for when the sizes for two things are equal, nearly equal, or very unequal, then making the sentence combine them ("small X and Y"), use a basic "and" ("small X and average Y"), or contrast ("small X but huge Y" or "huge X but small Y").  Combining longer hair with description of chest ("her long hair flows down and around her large breasts", "his long hair contrasts his muscular chest"), depending on hairstyle.  Describing the clothing they're wearing, once I figure out how to reference items/gear (butler suit, geisha outfit, but also handcuffs or slave collar, etc.).

My first attempt was mostly to get rid of the genital description because I'm not the kind of "master" who wants to see penises every time I enter a room (I initially changed them to how far apart they spread their legs).  And even the way they stand or the way they look at me could be switched up based on traits and/or stats.

Later on I'll be trying to revamp the sex scenes a bit, see what I can do without breaking everything.  I definitely want the Dominant/Submissive stuff to work more like Omegaverse, and the non-human cocks to actually matter.  And the thing that actually got me into modding was being halfway through a scene when the term "rectum" was used, and then "shit hole", and I'm like "......well, someone doesn't have a firm grasp on reasonable sex-scene terminology" (or possibly just English registers -- the idea that certain terminology works in doctor's offices and not in the bedroom) and then I went "hmm, wonder how hard it would be to change this stuff..." and down the rabbit hole I went.

Hmmm.  Sounds like suboptimal code, the idea that characters get created before the game knows whether they even matter (whether the player will in any way get to see the details).  It would make more sense to say "There's two bandits over there, do you want to engage?" and then, if you engage, generating characters.  This problem would be even worse for those giant packs of bandits I've seen (but not yet engaged with).

Actually, optimal code would likely generate a full character only upon capture, and generate a partial (necessary stats only) character for combat, then generate the next partial bit at the end of combat (when you get to see a few new stats), and finally transferring the partial character into a fresh full character if you capture them.

It's good to know that the uniqueness sticks around even if you sell them, though.  That does avoid some issues.

(1 edit)

It's working fine!  The only thing I noticed is that the immediate update changes the name in the left (personal) panel, but not in the slave list (until I change screens).  I presume there's a "rebuild slave list" call or something that'd do that, just like your last line there.

I went ahead and updated the logic to include the effect on the slave:

func _on_namechangeconfirm_pressed():
get_node("namechange").visible = false
var text = "Yes, $master."
 
if person.obed >= 70:  ## Highly obedient
    if person.loyal >= 50:
        text = "— Of course, $master.  It's my pleasure to mold myself to your desire."
        person.loyal += 10  ## They're pleased with the personal attention and "gift" of a new name
        person.stress -= 5
    else:  ## They're not yet broken in, but have been forced to high obedience
        text = "— Of course, $master.  Your will is all that matters."
        person.loyal += 5  ## They have mixed feelings about the personal attention
        person.stress += 5
elif person.obed < 35:  ## Not yet broken
    if person.conf > 30:
        text = "— You can't just take my name away!"
    else:
        text = "— Are you really going to take away even my name??"
    person.stress += 15  ## Highly stressed at having their individuality taken from them
else:  ## Moderate, compelled obedience
    if person.conf > 60:
        text = "— I guess I don't have much choice, do I?"
    else:
        text = "— Yes... $master."
    person.stress += 5  ## Kinda used to it by this point, but it's still a negative
 
person.name = get_node("namechange/LineEdit").get_text()
get_tree().get_current_scene().close_dialogue()
get_tree().get_current_scene().popup(person.dictionary(text))
get_parent().slavetabopen() # Ankmairdor - add this to update GUI and show new name immediately

So basically, if you name them right away it helps to break them; if you've already done some work before naming them it's a little stressful; if you wait until they're well trained then it's still a little stressful but bonds them more to you; and if you hold off until you're sure of their loyalty then it's a wonderful gift.

I mean you could totally abuse the function to just repeatedly stress them out (or increase their loyalty a bunch), but I don't intend to use it that way and thus don't care to code around it.

P.S. Forgot to include support for Mute characters, but now have a similar section with reactions ranging from outrage to resignation to joy.  There's so much that can be done with body language, even without access to words!