Skip to main content

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

Strive for Power

Fantasy Slave Management/RPG Erotic Game · By Strive4Power

Modding help Sticky

A topic by Strive4Power created Aug 20, 2018 Views: 60,673 Replies: 199
Viewing posts 41 to 53 of 53 · Previous page · First page

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

Something like the "amnesiapoteffect" function on line 709 of ".../files/inventory.gd"?

Or something like the "_on_nickname_pressed" function on line 542 of ".../files/scripts/slave_tab.gd"?

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).

The names are fully set after line 50 of ".../files/scripts/characters/constructor", so anything between there and the return will generally work, except for unique characters and mods like AricsExpansion, which set some traits afterwards.

Guilds slaves are added in the function at 339 of ".../files/scripts/outside.gd".

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.

There's no records of mental breakdowns. It seems to me that the simplest way to implement this would be to add a timer variable to ".../files/scripts/person/person.gd". It could also be implemented as a new effect, but that system is a bit clunky so it would be more work to implement it correctly.

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.

The only thing that has been known to force people to restart is when people make their edits directly to the game files and then they use the mod system to change the active mods, which resets all changes to the game files and erases their edits. As long as you are making your changes to files in the Mods folder you should be able to make progress forward. If you do get stuck on errors, feel free to hop on the Strive Discord and we can fix them quickly.

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.

where would the mod folder be in the files?

The Mods menu has a button to "Open Mod Folder", which will attempt to open the folder for you.

The location of the mod folder on your computer is dependent upon which OS you are using and tend to be hidden by the OS. As stated in the Help section of the Mods menu:

Replace USER_NAME with the value appropriate for your computer.
Windows:  C:/Users/USER_NAME/AppData/Roaming/Strive/mods
MacOSX:  Users/USER_NAME/Library/Application Support/Strive/mods
Linux:  ~/.local/share/Strive/mods
Note, if you are using the itch.io launcher to run the game, then your mod folder will be inside the data folder for the launcher.

Also, the folder ".../files/scripts/mods/" in the Strive program folder is strictly for the Constants mod that comes with the game.

thx im runinng on windows

when i do the windows os thing and go into the game and then go to the mods it just shows e.g: emptymod 100011110

ive extracted the mod and everything 

This game should never show anything like "emptymod" nor "10001110". Are you playing Strive: Conquest?

In Strive for Power, the mod is always named by the folder containing the mod, so only a mod in a folder named "emptymod" could appear with that name. A new folder named "New folder" in the mod folder with only sub-folder named "scripts", will appear as a mod named "New folder" not "emptymod".

yeah i was and didnt even realized it im downloading strive for power now

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?"

There are no records of past orgasms/ejaculations in the unmodded game, so your options are to either add some type of record or add the relevant code from "func checkrequest" to "func orgasm". The latter approach is probably simpler.

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

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?

You found one of the messier parts of the game's code. Godot provides the option to set custom getter and setter functions for variables in a class. In this case, the class "progress" is found in ".../files/globals.gd". 

var condition = 85 setget cond_set

This variable declaration establishes a custom setter function for "condition", so any attempt to assign a value to "condition" outside the setter function will call the setter function with the new value as the argument for the function. Simply changing "condition = -X" to "condition -= X" causes the resulting value of "condition" to be "condition*2-X".

In order to make the switch, you would need to remove the setter function and update every line in the game that assigns to "condition". Note that all changes to "condition" are multiplied by "conditionmod", which is 1.3, so you would need to include this multiplier in every line when updating them otherwise the value would be reduced.

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.

If you are simply trying to add it as new behavior style to the Headgirl job, then you would simply need to add the role to the GUI, either through patching the Mansion.tscn or adding code to the "_ready" function of Mansion.gd to add the option to the OptionButton.

If you are trying to add it as a new job, then you need to add an entry to the jobdict in ".../files/scripts/jobs&specs.gd".

After either of those, you add your code to the end-of-day function.

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.

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...?

"checkforevents" is a variable in the mansion that essentially indicates whether the mansion should attempt to check for and display a new event. In practice, this value is only true while an event is being displayed, but it will be blocked from checking for new events until the first frame where the current event is no longer visible on screen. Thus "func nextdayevents" will be repeatedly called until the end of the function is reached without triggering an event.

The player gives birth first, followed by slaves giving birth in the order that they appear in the mansion list, followed by scheduled events, followed by random events, and followed by main quest story scenes. This order of presenting events is always maintained, though not every type of event occurs in a single day.

A new system was being planned to handle events in a more centralized manner, but the person contributing that code abandoned it for whatever reason. So the new system was removed from operation and the game uses the old system for events.

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?

Line 684 of ".../files/scripts/jobs&specs.gd".

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.

(1 edit)

I'm not sure if this is the right place to ask but I thought I'd try here first, does anyone know where/if it's possible to edit the pronouns for futa that are used during sex interactions in one of the gd files? I'm assuming there's still no mod that works with Aric's Expansion that allows us to set pronouns in-game or prevent their gender pronouns from changing from male to female when they become futa, and I was able to figure out how to change the code in the person gd file and have it reflect male pronouns on their overview in game but this doesn't seem to apply to the sex interactions. 

Also, the wrong participant always gets the 'Enjoys Anal' trait from Cowgirl Anal and Reverse Cowgirl Anal. How could I go about fixing this, or which gd file and what could I edit? 

Any change is possible if you put in the time and effort.
The flavor text provided during sexual interactions is created by ".../files/scripts/sexdescriptions.gd". The system converts pronoun tags into the most specific generalization for the group. Though it was designed for a simpler conception of pronouns, it should be relatively easy to adapt if you have already managed the change in person.gd.

The core of the sex interactions is ".../files/scripts/newsexsystem.gd". Search the file for the trait name. You will probably need to add exceptions for the action codes for those actions since the original system was designed with phallic-based assumptions about which side was the "giver" or "taker".

Mostly I've been finding solutions through trial and error, and interestingly changing the gender in the save file data sticks and the character doesn't revert back. Also I just ended up removing the actions from that trait group, which was in the newsexsystem file so thank you! 

Unrelated question, but is there an easy way to make certain sex actions add a specific item to inventory?  I've been poking around a lot of files and trying to look things up, but I'm pretty much an amateur and can't seem to figure how to not break the game every time I try to add a new line. Most of what I've come up with is just editing/overwriting existing code to tweak or adjust things, but I don't know how or where I would place this.  

Character sex/gender is only updated when the character undergoes a change which would be likely to change it. These changes are pretty much all driven by the player, though using too many potions too quickly can cause random mutations.

If the game crashes anytime you add a new line, even a blank one, then your editor is adding the wrong set of newline characters (the invisible characters that cause editors to put text on a new line) whenever you press the Enter/Return key.

If you don't have programming experience with Python, then I recommend taking a free online interactive tutorial for Python. GDScript is designed as a beginner friendly version of Python with some LUA, but since Python is a primary programming language it gets some better tutorials. A few hours with a tutorial will make things a lot clearer.

For simple debugging I recommend the Debug mod: /t/1137280/debugmod-v10d
I tend to do most of my programming in Sublime Text 3 with Python syntax highlighting and use the Debug mod to find out what breaks.
Otherwise get the Godot Editor version 3.3. It is needed if you want to work with the GUI, though it won't be much help for making mods.

Hello again! I am back with what I hope is my final question lol! Using Godot 3 made all the difference and I've been doing a lot of Googling and experimenting and had a lot of success, but I can't seem to figure out a simple way to make the text under func initiate() play in a specific order rather than randomly each time the action is clicked. Is this a situation where there's not really an easy way to do this without changing all the code and the way it functions (like without having to change temparray to something like const)? 

(1 edit)

Quick tip, it helps if you reference a file name when referring to code so the other person doesn't need to hunt for it.

In the sex action files, the game uses 2 separate types of randomization; one is relatively easy to replace with a specific order, one is somewhat complicated to order. Changing temparray to const would have no meaningful impact on the behavior of the array, as it only prevents you from changing the type of the variable to something that is not an array; it does not prevent changes to the contents of the array. 


text += temparray[randi()%temparray.size()]

This selects a random line of text within temparray and appends it to the text return variable. To change it to a specific order, the simplest approach is to replace the random integer generator "randi()" with a persistent variable storing an incrementing integer. If we keep most of the function unchanged we get:

var count1 = 0
func initiate():
    ...
    text += temparray[count1%temparray.size()]
    count1 += 1
    ...

However,  many sex actions use multiple layers of appended text to the text return variable and reusing count1 for every layer can restrict the number of combinations of text generated if the layers have the same number of lines of text in temparray. To fix that specific case we can use conditional increments.

var count1 = 0
var count2
func initiate():
    ...
    text += temparray[count1%temparray.size()] 
    count1 += 1
    temparray.clear()
    ...
    text += temparray[count2%temparray.size()]
    if count1%temparray.size() == 0:
        count2 += 1
    ...

The second type of randomization uses specific characters to mark the beginning, separations, and end of the set of randomly selected text:

{^gently:tenderly:carefully}

The first two characters "{^" mark the beginning of the randomized text, the individual texts are separated with colons, and the end is marked with another brace. This sounds straightforward and you might be tempted convert split those three words into separate lines to be handled by a layer of temparray, but consider this line from 100caress.gd:

temparray += ["[name1] {^gently:tenderly:carefully} {^stroke:fondle:cuddle:massage}[s/1] and {^caress[es/1]:rub[s/1]} [names2] [body2]"]

This single line provides 24 unique combinations of randomized text.

The code for this process is found in func splitrand(text) of sexdescriptions.gd. If we made the incorrect assumption that there are a minimal number of cases where these random sets of text are identical, then it's possible to use dictionary to implement an incrementing integer strategy similar to above.

var dictCounting = {}
func splitrand(text):
    var pos = text.find("{^")
    while pos >= 0:
        var targetText = text.substr(pos, text.find("}", pos)+1 - pos)
        var splitText = targetText.substr(2, targetText.length()-3).split(":")
        text = text.replace(targetText, splitText[ dictCounting.get(targetText,0) % splitText.size() ])
        dictCounting[targetText] = dictCounting.get(targetText,0) + 1
        pos = text.find("{^", pos)
    return text

It's been a while since I've coded, but I'm mostly certain this would work as long as I didn't make any typos. While this is an inaccurate solution as the assumption was incorrect, it's by far the least effort solution.

If you want any more control over the ordering of text than this, then you will probably have to create an array of all possible combinations of text for each sex action and then use the incrementing integer technique to walk through them one at a time.


Edit: Please note that itch.io converted all tabs to spaces, which will wreck havoc in Godot if you try to copy and paste my code.

Thank you so much for taking the time to type all that out! And apologies for not referencing the file name, I was trying to ask in a way that would hopefully be less work to answer but ended up doing the opposite and oversimplifying.

I was just not understanding what I needed to do with randi() and using count1 worked perfectly for what I needed. Thank you! 

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?

(1 edit)

First, the game's error logs are nearly useless most of the time, which is why there is a Debug mod (/t/1137280/debugmod-v10d) to provide error messages, file names, and line numbers for error messages in real time (though the terminal window) with the bonus of somewhat improving the messages in the log file. The Debug mod is not a true mod and doesn't use the mod system so there is no to worry about erasing all the changes to your files by using the mod system.

Second, I recommend finding an online interactive tutorial for Python as GDScript is heavily based on that mainstream language, which will have better tutorials and explanations for stuff like scope. A few hours with a tutorial can easily save you days of fumbling around on your own.

As to what your problem is specifically, I don't know. You didn't include any information or description of outcomes that would clearly identify one. While much of your code is bulky and inefficient, I didn't see anything that would necessarily cause errors. This leaves three issues which would be possible causes of errors that I cannot verify. The first and biggest one is that at the end of your post you are replacing "enby" in a person's sex with "female", but there's no indication that you have replaced "futanari" with "enby" in a person's sex variable, which means that "futanari" slaves are searching for data entries that may not exist unless you added them. The second is whitespace. I am unable to check if spaces were used instead of tabs in your code since the forums convert everything to spaces. The third is the validity of the references to the original variable for names "globals.racefile.names". It's not entirely clear what you have done or not done to the original lists of names. If those lists still exist in the original variables and entry names, then those should still be functioning and not a problem.

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.

(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.

(1 edit)

Right, I forgot about the difference in engine versions. The game is essentially running on version 3.3 of the Godot engine, whereas the most recent version is 4.7.1, which includes a significant overhaul of the string variable functions. This is the relevant document for the game's string functions: https://docs.godotengine.org/en/3.3/classes/class_string.html. The string functions are still somewhat crude, so you will probably want to use the clunky #2 approach for most things. Alternatively you could use dictionaries to convert string keys into boolean values or integers, though it's really just pushing the bulk and work to somewhere else.

Godot is the game engine. GDScript is simply an abbreviation for Godot Script. Godot can run on other languages than GDScript, such as C#.

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.

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.)

The Modding Guide in the wiki was simply a slightly out of date version of the one available in the game. The Strive wiki may get re-uploaded at some point, but someone would need to re-format the data and maybe find new images. One user has pointed out in the Discord that the wiki is still available through the Wayback Machine's internet archive.

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.

The game doesn't flag the persons available post-combat within their own data; it stores lots of data in arrays within the "defeated" dictionary, using the indexes from the insertion order to track the data. The persons are not renamed at all by the exploration nor mansion code. The captured list label is simply given a few existing strings to display:

newbutton.get_node("Label").set_text(defeated.names[i] + ' ' + person.sex+ ' ' + person.race)


The most obvious approach to improving descriptions is to add a bit of data to each person to track their context. However, that can be somewhat over-complicated unless you plan to incorporate that into other portions of the game, so the simplest alternative would probably be to add a new function or argument to the chain of description functions to pass the context. Another approach is to use the global reference path ("globals.main.exploration.defeated") to the "defeated" dictionary in order to search for the current person to ascertain their context. The indirection of it is a bit complicated but it puts all the problems in a single location.

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?

There are no in-game methods to be certain if a slave at the auction is one that you've owned before. The best you could do in-game is to use mind reading to check if their courage, confidence, wit, and charm are extremely high or low values as slaves are generated with fairly average values. You could check their stats in the raw save file as there are several stats like stress, lust, lewdness, which will all be zero for newly generated auction slaves.

No, selling a slave has no impact on the stats of the slave, which is why some strategies utilize selling slaves as a somewhat expensive mechanic to get around certain problems. In fact, slaves that have been sold effectively enter a form of stasis(assuming they don't get deleted) as only slaves in the player's slave list experience end of day updates, so any slave you sell will be bought back in exactly the same condition as you sold it.

(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.

Every variable has it's own set of cases where it can be less reliable, so using any single variable will be prone to problems. For instance, "person.metrics.ownership" would be the variable that most consistently corresponds to days spent in your household, except that it actually counts days in your slave list. This means that time away for quests, vacations, training, or recovery still counts towards days of ownership.

Newly generated slaves don't really have any backstory and stores and slave auctions don't particularly constrain themselves to the rules of the world. Though only a few versions ago this was basically true for any time a slave was away from the mansion. Even now you can indefinitely lengthen the duration of a pregnancy by simply using the Dream spell on the slave every night.

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.

Yup, so if you bought a new slave just to fulfill Ayda's request in exchange for the quest potion, then after 15 days you would have a slave that was identical to when you first got them except that you have owned them for 15 days.

Sooo... I'm presuming this is gonna be out of my reach for a while, but how difficult would it be to accomplish the following set of actions during a sex scene?

  1. If act is penetrating, giver has a particular trait (Dominant), and climax just happened, then:
  2. Turn penetrating act into ongoing act (ideally with unique wording)
  3. Lock those buttons that conflict with (that is, would cancel) the ongoing act (ideally with unique tooltip if you hover over them)
  4. Set a timer to keep the buttons locked for at least three rounds
  5. Change the wording for when the act gets shifted to a different act

I'm open to variations that avoid the most complicated portions here.

It's entirely doable, but there isn't any support within the sex system for those particular changes and some of them can end up being rather complex to implement. I would rate this as a significantly difficult set of changes that would probably take weeks or months for most people to implement.

1. Orgasm is a function in newsexsystem.gd. The only challenge is coming up with a proper set of conditions to check as there are some variations on the conditions you gave, such as the double dildo actions. 

2.  It's not particularly difficult to append the last action to the list of ongoing actions, but sex actions effectively have no state information, meaning that they don't track any changes or variations. The sex action scripts are reused by other participants so you cannot easily add variables to the sex action files to track the timer for a specific act. Storing the timer outside of the action and using it to switch between two types of text generation functions is complicated by the alternate text system that is used by many penetration actions, but at the very least this means altering the every penetration sex action file to handle the unique wording. I expect that altering the following line in newsexsystem.gd to include an entry for your action state information is the simplest approach:

var dict = {'scene' : scenescript, 'takers' : takers.duplicate(), 'givers' : givers.duplicate()}

3. There is some precedent for disabling action buttons based on other conditions and the conflicting actions function might produce data that can be used to accomplish this. Though there are other considerations for preventing actions from being cancelled, such as the "Interrupt" URL for ongoing actions. The sex system's GUI currently does not support alternate uses for URLs nor showing tooltips, though such functionalities exist for other GUIs in the game. Also, all actions get cancelled when restraints are removed from a slave that is resisting sex or when the sex interaction ends.

4. Timers themselves are easy to manage, but going back to #2 the core problems are where to store them and share them.

5. This is covered in #2, but changes to the flavor text of sex actions is messy work and likely to consume a disproportionately large portion of your time.

That's very useful info and I much appreciate it, especially the way you explained each element in turn and told me where to find them specifically.  It does look like it's outside my skill set / patience level for the moment, but that I might be capable of toying around with parts of it just to see if little pieces could give me kinda what I'm after, or at least a hint of it.  I've been debating about toying with the flavor text to try to get an Omegaverse version anyway, so maybe if I start playing with that section I'll see about tying it into some of the other parts.

On the up side, my recent changes have finally started paying off, aside from a few random crashes.  Unfortunately, the debug utility won't work -- every time I try to load a game, it pops back to forcing me to tell it I'm okay playing a game like this, which just takes me back to the main menu.  So I'm still fumbling through trying to suss out which problems I've created, mostly by keeping track of which lines do get displayed without crashes.  But I've got it giving different reactions when I sell slaves (based on if they're terrified, if they're newly captured, if they're spoiled and demand to be released, etc.) and when I look at them up for auction, which now differs between locations (I've finally worked out how to grab the location, though I'm half convinced that that might be part of what triggers crashes).  Slaves get treated more "genteel" in Wimborn and more rough in Gorn (or Umbra, should I ever get there), and Frostford has a different view on which slaves are exotic vs. mundane.  That sort of thing.  Child slaves in particular get treated differently in the code, because I was getting a bit creeped out by the way it automatically flashed me same as any other slave.  (At some point I'm gonna make bandits stop having child soldiers in their gangs, but I do still want kids to be part of my experience in general, so I'm slowly tailoring it to treat them more distinctly... which is a lot of fiddly bits.)

Also got the descriptions back to working, though some of them are still buggy or half-formed.  No more crashes there that I've noticed.  It'll have me find a character doing something related to their job, give me their reaction to my approach and their costume (and reaction to the costume, e.g. a prude not appreciating the sexy clothing) etc.  And the core descriptors change as the slave gets familiar: newbies are described in more physical terms ("The wolf-eared lad looks up cautiously as you approach"), while slaves I've had for a while get less flowery about the descriptions.  Only issue there is that because of the way I've reused functions, currently the auction house has slaves reacting as they would in my mansion, lol!

P.S. What's the easiest way to give my character the Heal spell without having to bother with the Mage Guild quest?  Like, I'd be willing to make a function to give it to me, and then tie it to some in-game button just long enough to grant me the spell and then undoing that code.  It bugs me that I'm not starting with that spell because it changes how well newbies warm up to me if I can heal their wounds (not just bandage them) and I miss that.

If the normal error messages from debug mode are not useful for your problems, then I recommend using the the print() or globals.traceFile() functions to track what is happening or not happening. When I am uncertain how code is actually executing, I'll scatter those around the code and run it to see what ran and what didn't. Usually it looks something like this:

print("Here1")
... various code ...
print("Here2")
... various code ...
print("Here3, var1: " + str(var1))


It is a simple boolean change with no other consequences, so the simplest way to give yourself the healing spell is to add a line like this to the _ready() function in Mansion.gd:

globals.spelldict.heal.learned = true

Nice!  I didn't realize it was so simple, 'cuz the spot I found for learning spells has quite a few other lines of code.

I just stuffed it into looking at myself in the mirror, 'cuz I've already got description modifications going fine.  That'll be a useful tweak for me to use next time I restart the game, and a decent place to stick any quick cheat codes like that.

Viewing posts 41 to 53 of 53 · Previous page · First page