Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags

irezawa

22
Posts
4
Topics
A member registered Jan 23, 2021

Recent community posts

In a battle, if you click the ? on a character's portrait, you can toggle abilities and spells on and off the UI. I highly doubt you need them all.

Most significant problem with my code is that I've never properly studied this system or even Python, I just started twiddling with the code for my own amusement by tweaking variables and it all started snowballing, resulting in a web of features where everything is more or less tangled together. To make matters worse, I didn't even mark my own lines to separate them from original code. That's why my "creations" aren't exactly shareable, at least easily. But hopefully any of this gave even some useful ideas.

You're right, if a custom slave dies they could be brought back. This is because I've switched permadeath off when I've first started playing and then completely forgotten the whole setting even exists, thus being totally unaware they could even die... Thanks for pointing that out, it needs to be fixed.

Here's my version of handling custom characters as their own packages:

In addition to code in my previous reply, change func create in gallery.gd to this:

func create(code):
     var custompath = load("res://files/scripts/characters/custom/" + code + "/" + code + ".gd").new()
     var _slave = ''
     if !characters.has(code):
         _slave = globals.newslave(custompath.characters[code].basics[0], custompath.characters[code].basics[1], custompath.characters[code].basics[2], custompath.characters[code].basics[3])
         _slave.cleartraits()
         _slave.imagefull = null
         if _slave.age == 'child' && globals.rules.children == false:
             _slave.age = 'teen'
         for i in custompath.characters[code]:
             if i in _slave:
                 _slave[i] = custompath.characters[code][i]
             elif i in _slave.stats:
                 _slave.stats[i] = custompath.characters[code][i]
     else:
         _slave = globals.newslave(characters[code].basics[0], characters[code].basics[1],characters[code].basics[2],characters[code].basics[3])
         _slave.cleartraits()
         _slave.imagefull = null
         if _slave.age == 'child' && globals.rules.children == false:
             _slave.age = 'teen'
         for i in characters[code]:
             if i in _slave:
                 _slave[i] = characters[code][i]
             elif i in _slave.stats:
                 _slave.stats[i] = characters[code][i]
     return _slave

Then, create a folder "custom" in scripts/characters. Here's a Template Package for a custom character. It goes to that custom folder. It contains a folder with template character file in it. Same file is for character images. Image paths in code in previous reply need to be edited from images/custom to new path scripts/characters/custom. The character.unique (in this case Template) has to be added to var custompool in globals.gd of course, unless there's a way to automatically scan scripts/characters/custom and add all the content to it. And... that's pretty much it.

My version is still pretty stiff. I add custom characters to existing list of premade characters (Cali, Maple etc.) in gallery.gd. For their images they all have their own assigned folder, where filenames are identical. This can of course be done however one wants, I just like to have my stuff in folders. I also tweaked it a little bit, pictures used in mansion main screen are now triggered by loyalty, while pictures in dating screen are triggered by lust. This is in mansion.gd under func updateSlaveListNode:

    var customportrait = ''
    var customfull = ''
    if person.unique in [Your eligible characters listed in here]:
         if person.loyal >= 70:
             customportrait = "res://files/images/custom/" + person.unique + "/portrait2.png"
             customfull = "res://files/images/custom/" + person.unique + "/body2.png"
         else:
             customportrait = "res://files/images/custom/" + person.unique + "/portrait1.png"
             customfull = "res://files/images/custom/" + person.unique + "/body1.png"
         person.imageportrait = customportrait
         person.imagefull = customfull

I have to add characters to this list in case they don't all have multiple images. I'm not much of an artist myself, so I have to use whatever I can find. There's similar portion in dating.gd under func doaction:

    var customportrait = ''
    var customfull = ''
    if person.unique in [Your eligible characters listed in here]:
         if person.lust >= 90:
             customportrait = "res://files/images/custom/" + person.unique + "/portrait3d.png"
             customfull = "res://files/images/custom/" + person.unique + "/dating3.png"
         elif person.lust >= 60:
             customportrait = "res://files/images/custom/" + person.unique + "/portrait2d.png"
             customfull = "res://files/images/custom/" + person.unique + "/dating2.png"
         else:
             customportrait = "res://files/images/custom/" + person.unique + "/portrait1d.png"
             customfull = "res://files/images/custom/" + person.unique + "/dating1.png"
         $textfield/slaveportrait.set_texture(globals.loadimage(customportrait))
         $fullbody.set_texture(globals.loadimage(customfull))
    updatelist()

So, there's nothing really fancy in here. But at least it's quite tidy, bringing the characters in game is a mess. I added some new stuff in globals.gd:

var custompool = [Your custom characters listed in here]
var customchar 
var customtaken = [] 
var guildpool = []
func customslave(origins = 'slave'):
     customchar = globals.randomfromarray(custompool)
     for guild in guildslaves:
         var slaves = guildslaves[guild]
         for i in slaves:
             guildpool.append(i.unique)
     for i in globals.slaves:
         customtaken.append(i.unique)
     if customchar in customtaken || customchar in guildpool:
         guildpool.clear()
         return null
     else:
         return gallery.create(customchar)

When a new slave is brought in game, func newslave is used. In those situations I've added a rand_range check to see whether a custom character is introduced instead. I didn't put the random check in here because I wanted the random chance to be different in every situation. This code picks a character from list and then checks if said character is already in game, either in player's possession or in a slaver guild. If character is not yet in game, it's brought in, otherwise null is returned and original line is used. However, if custom character is already in game, the process is not repeated because I wanted the chances for new custom characters to be lower if there already are some in game.

Oh, and in original code, word "portrait" was typoed as "portait" in some parts. Instead of correcting that, some parts of original code were written to work with typo version, while others used the correct version. I couldn't get my code to work until I noticed it. This pissed me off beyond belief, so I went through all the files and fixed it. I highly recommend this to be done before doing anything related to portraits.

Also, keeping custom characters in separate files is a great idea that didn't even cross my mind. In fact, I think I came up with a way to keep custom characters in their own files, under a designated folder. It would make handling them much easier and they could even be easily shared one by one with other players. You'd still need to manually add the .unique values to those lists, but some proper coder could surely find a solution for that too. I need to take a look at this when I have some spare time.

(1 edit)

I've modified my copy of the game quite a bit. It all started as minor tweaks and tunes and escalated over time.  Everything is written in core files and over a couple of other mods, so at this point separating my modifications to a separate mod would be a massive hassle. But I thought I'd share a list of my stuff here, in case you or someone else could find something interesting.

  • Mental traits can no longer be inherited.
  • Homosexuality is not something you can learn and unlearn. Instead, each slave is assigned sex as a sexual preference and if that matches with slave's own sex, then they get the 'Homosexual' trait. There's a small chance to get both sexes assigned and that results in 'Bisexual' trait. If a slave goes through sex change, then having or not having 'Homosexual' will change too.
  • Increased tattoo slots. Added 'back' slot and split both 'arms' and 'legs' into left and right, resulting in a new total of nine slots. Adjusted tattoo bonuses to scale with this.
  • Added custom characters. They can appear at slave guilds and encounters with varying chance. If a custom character is not acquired as a slave, they can reappear later.
  • Custom characters can have several portraits and body pictures to reflect how high their lust is. More lust results in less clothes and hornier expression, updated after every action while dating and at the end of the day (this should actually be at the beginning of a new day, just realized it as I was writing this scratch that, func updateSlaveListNode is even better). This could be expanded to all slaves, but that would require ridiculous amount of portraits and body pictures to maintain variation as number of slaves increase, so I decided to limit this to unique characters.
  • Added negative sexual traits. 'Dislikes Anal', 'Dislikes Oral' and 'Dislikes Pain' can appear if a slave is participating in a related sexual act and finds out it's unpleasant. Making a slave perform uncomfortable sex can result in stress, less pleasant sex and even decreased loyalty if taken to extremes. If a slave has 'Submissive' trait, they won't mind having uncomfortable sex, but they still won't enjoy it as much.
  • Penises and vaginas/anuses no longer have unlimited compatibility. If a penis is too big and recipient too small, it can be unpleasant for the recipient. Imagine huge dong and creature like a fairy, and it can even be very unpleasant. Unless the recipient is a 'Masochist' or maybe 'Likes it rough', in which case it might actually be pleasant after all.
  • Sex is no longer unpleasant for everyone if one of the participants is unwilling. It's still not quite as pleasant as it could be if everyone would be fully in it, but raping doesn't feel like being raped anymore.
  • Planning on including trait 'Deviant' in the mix with these changes and maybe introducing new trait 'Sadist'.
  • Renamed Seraphs to Angels and added new race Succubus. Sex between a Human and a Demon results in a Succubus, and Humans with Angels can produce a Seraph. Mixing Demon with an Angel results in something else... Succubi can only be female, so I should add a male version Incubus.
  • Revamped Dragonkin race. Color of a Dragonkin now affects their attributes by assigning a trait. A Dragonkin can be red, blue, green, black or bronze. Blue Dragonkin gets 'Responsive' to increase their magical capabilities, and so on. I may or may not have blatantly stolen this from some MMORPG-ish thingie.
  • Consent is no longer permanent. If a slave's loyalty drops below 20, consent is revoked.
  • Divided hair into three different hair types; straight, wavy and curly. Added racial limitations to prevent curly Wolves and such.

Actually, I just downloaded this Godot-thing. It was quite intimidating and confusing at first, but the job is now done. Interesting tool.

Yes, they are different. It bothered me how hair could be wavy only at certain length, and how open hair was always straight. Minor detail, I know, but I tend to be quite catastrophic combination of neurotic , obsessive and perfectionist...

Thanks for your answer, now I know why I had such trouble locating the GUI structure. I guess I need to take a look at Constants mod then. 

I added different hair types in the game; straight, wavy and curly. They work just fine, but they're random just like everything else and I'd like to add to character creation a possibility to choose a hair type for your character (and subsequently for your starting slave, as they're the same menu). So, what I need is to add either a drop menu or text box to stage 6 in character creation. All the mechanics seem to be in mainmenu.gd but I can't find the portion where the actual layout of the menu is set, or designated file for it.

Any help? I'm fairly certain the hair styles are fully working in the game. Only place where they need to be chosen from is character creation. It doesn't need to be an option in slave tab or even at slave services. They can be edited with the Mutation spell, and that's enough for me.

(1 edit)

Here's what you can do: You can delete a few lines from two files, or if you want to save the code for whatever purpose, just add hashtags in front of these lines.

In newsexsystem.gd there's a portion that runs sexual development at the end of a sexual encounter. It looks like this:

#        if i.actionshad.samesex > i.actionshad.oppositesex && i.actionshad.samesexorgasms > 0:
#            if !i.person.traits.has("Bisexual") && !i.person.traits.has("Homosexual") && (randf() >= 0.5 || i.person.effects.has('entranced')):
#                i.person.add_trait("Bisexual")
#            elif i.person.traits.has("Bisexual") && (randf() >= 0.5 || i.person.effects.has('entranced')) && max(0.2,i.actionshad.samesex)/max(0.2, i.actionshad.oppositesex) > 4 :
#                i.person.trait_remove("Bisexual")
#                i.person.add_trait('Homosexual')
#        if i.actionshad.samesex < i.actionshad.oppositesex && i.actionshad.oppositesexorgasms > 0:
#            if (i.person.traits.has("Bisexual") || i.person.traits.has("Homosexual")) && (randf() >= 0.5 || i.person.effects.has('entranced')):
#                if i.person.traits.has("Bisexual") && (randf() >= 0.5 || i.person.effects.has('entranced')) && max(0.2,i.actionshad.oppositesex)/max(0.2, i.actionshad.samesex) > 4:
#                    i.person.trait_remove("Bisexual")
#                else:
#                    i.person.trait_remove("Homosexual")
#                    i.person.add_trait("Bisexual")

Those hashtags means those lines are "switched off", so that the sexual development isn't in the game anymore. You can delete those lines too, if you are absolutely certain you won't want to go back to how the game originally was.

In traits.gd you do the same thing on one line of code.

    "Homosexual": {
        "name": "Homosexual",
        "description": "$name is only expecting to have same-sex affairs. \n\n[color=aqua]Same-sex encounters have no penalty, opposite sex actions are unpreferred. [/color]",
        "effect": {
 
        },
        "tags": [
            "sexual",
            "mental",
#           "secondary"

With the tag "secondary" eliminated, Homosexuality becomes a primary trait and can be assigned at creation and when new slaves are generated.

This is just a quick fix though. It will remove this problem, but it will create another. In case of sex of the slave changing, how should it affect sexuality? If a homosexual female becomes a male, should they retain preferring same sex or should they now be drawn to opposite sex? And how about futas?

Weirdly enough, in this game homosexuality is something you'll learn. Homosexuality is considered simply as a matter of taste. Your partner can become a lesbian through training, i.e. repeated sex acts with women. Just like you can learn to like the taste of beer to the point where you prefer it over other beverages.

Not sure if it was your intention, but you raise an interesting point. It would make a lot more sense if Homosexuality was a permanent trait like Quick or Clever. It would make gameplay more restrictive though, but it's not always a bad thing.

1.0d
Win10

Lust increasing effect of Living Armor is not working.

This is how my var analcategories looks like, see for yourself.

var analcategories = ['assfingering','rimjob','missionaryanal','doggyanal','lotusanal','revlotusanal','doubledildoass','inserttaila','analvibrator','enemaplug','insertinturnsass','cowgirlanal','revcowgirlanal']

My code is a mess, I know, but it works. With it implemented, I had two slaves have sex in Cowgirl Anal position while entranced. As result, the slave who was riding did get the trait but the slave being ridden did not. Just how I wanted it to be and exact opposite to how it originally worked. 

In my code the slave getting the orgasm gets the trait IF they are the receiving party of any anal activity EXCEPT in Cowgirl Anal or Rev. Cowgirl Anal, OR if they are the performing party in Double Dildo Anal, Cowgirl Anal or Rev. Cowgirl Anal. Double Dildo Anal is already included in analcategories, so it's on both sides of the line. So, just like it's supposed to be.

I created an amalgam of your line and mine. The result is absolutely horrible to look at, but it works. I probably should try to squeeze it in a bit, but I'm tempted to leave it as it is and just forget the whole ordeal.

if (lastaction.scene.code in sceneref.analcategories && lastaction.takers.has(self) != lastaction.scene.code in ['cowgirlanal','revcowgirlanal']) || (lastaction.givers.has(self) && (lastaction.scene.code == 'doubledildoass' || lastaction.scene.code == 'cowgirlanal' || lastaction.scene.code == 'revcowgirlanal')):
(2 edits)

At the moment, trait Dominant is in game but acquiring it has been disabled due to malfunctioning code. It can be fixed by replacing the disabled code in newsexsystem.gd with this:

if lastaction.scene.code in sceneref.punishcategories && lastaction.takers.has(self) && person.asser >= 60:
    for giver in lastaction.scene.givers:
        if randf() >= 0.85 || person.effects.has("entranced"):
            giver.actionshad.addtraits.append("Dominant")
(1 edit)

I have added the actions. With your code no one gets Enjoy Anal in Cowgirl Anal positions, which was the case already to begin with. With my code both parties can get it. So the solution is somewhere in the middle.

I've switched my attention from categories to tags and it has... kind of worked? I'm now in a situation where there's a clear distinction between performer and receiver, but the trait is always awarded to the wrong party. If I wasn't so bloody obsessive, I'd take another break.

if lastaction.scene.givertags.has('oral') || lastaction.scene.takertags.has('mouth'):

With this, the game picks up positions where either someone uses their mouth or their mouth is used by someone. But the trait never goes to the person whose mouth is in question, but always to the opposite side.

EDIT: Got it! I found the reason why I can't get the person using their mouth to get the new trait. Enjoy Anal, which I copied and edited for my purpose, is under func orgasm() so getting the trait is checked when an orgasm occurs. Since oral actions are tagged as "noorgasm", you never get an orgasm from them and therefore never get the trait. I just need to place the trait somewhere else and/or edit it so you can get it from someone else's orgasm.

(3 edits)

Actually, thanks! Your reply combined with full night's sleep made me realize I've been looking at completely wrong place. I got so fixated on Cowgirl Anal positions being expansion material that I forgot the original code. And it's now fixed. It's not pretty, but it works and even without extra lines. I just turned this

if lastaction.scene.code in sceneref.analcategories && (lastaction.takers.has(self) || lastaction.scene.code == 'doubledildoass'):

into this

if lastaction.scene.code in sceneref.analcategories && (lastaction.takers.has(self) || lastaction.scene.code == 'doubledildoass' || lastaction.scene.code == 'cowgirlanal' || lastaction.scene.code == 'revcowgirlanal'):

It's a good reminder that taking a break beats banging your head against the wall ten times out of ten. Which I'm sure to forget. Again.

EDIT: It's still not flawless though, as one might guess. If you have your willy in someone's bum in Cowgirl Anal position, you soon get a craving for having one in yours too. To each their own, I guess. It's not too bad of a workaround, but as such it doesn't really work with what I'm trying to create. I'm pretty sure the problem lies with the lastaction.takers -part but for some reason I haven't been able to come up with a givers-equivalent of it. I'm already ashamed of how simple the solution must be, but it still eludes me.

(Moved from "Bugs and Suggestions")

A slave can only develop a taste for anal sex when they're passively getting their butt plowed. If they're the active party, like in Cowgirl Anal, it will not affect the possibility of acquiring the trait Enjoy Anal. 

I've been tampering with sex mechanics and wanted to add an oral equivalent for Enjoy Anal trait. I used Enjoy Anal as a reference (blatantly copied) and created Enjoy Oral, but it exposed a problem with acquiring said traits: The slave can only acquire them when they're the passive party in an action. Because of this, a slave can only learn to Enjoy Oral if they're getting a member rammed down their throat, or if they're getting their own phallus sucked. I'd be grateful if someone could take a look at Enjoy Anal trait and adjust it to include active participation, so I could use it as inspiration (blatantly copy) for my own code.

EDIT: Took me this long to realize that Cowgirl Anal and Reverse Cowgirl Anal are not vanilla content, but modded extra, so they were missing from var analcategories in newsexsystem.gd. They also have 'anus' tags when they should be 'anal'. However, adding them in and fixing the tags didn't remove the original problem. I probably should move this topic under discussion of the mod in question.

1.0d
Win10

1.0d Win10

In var analcategories there's 'inerttaila' when it should be 'inserttaila'. 

I don't think someone without testicles should be able to impregnate anyone. It does happen though, because impregnation check only checks if one of the participants is a horse or a dog. There's a quick fix to this, just adjust func impregnationcheck to look something like this:

func impregnationcheck(person1, person2): var valid = true
    if person1.unique in ['dog','horse'] || person2.unique in ['dog','horse']:
        valid = false
    if (person1.balls == 'none') && (person2.balls == 'none'):
        valid = false
    return valid