Jump to content
joemann

CK3-Quick Modding Qustions

Recommended Posts

Once again, I come to you. I hope you saw my success in implementing larger breasts into the base game. I have an idea of how to implement the largest sizes too (which normally in the mod can only be acquired via beauty traits). The problem is that I need to find the place in the programming where the game take genes and uses them to make characters so I can swap the gene setting for normal breasts with the setting for sjk breasts. I don't know where that place in the programming is, though. Can anyone tell me? I've looked but not found it.

Link to post
7 hours ago, Hermitic said:

Once again, I come to you. I hope you saw my success in implementing larger breasts into the base game. I have an idea of how to implement the largest sizes too (which normally in the mod can only be acquired via beauty traits). The problem is that I need to find the place in the programming where the game take genes and uses them to make characters so I can swap the gene setting for normal breasts with the setting for sjk breasts. I don't know where that place in the programming is, though. Can anyone tell me? I've looked but not found it.

I would start with looking at sjk_beauty_breast_scale.txt (You'll need notepad, but I recommend Notepad ++) , but to warn you if your planning to make them larger you're gonna have to fix the attachments, or else the breasts will pop out of the clothes, it will ruin your immersion. Here you will have to play around with:

Quote

    female = {
                    setting = { attribute = "bs_body_breast_size_min" value = { min = 0.0 max = -2.0 } age = age_preset_puberty  }
                    setting = { attribute = "bs_body_breast_size_max" value = { min = 0.0 max = 2.0 } age = age_preset_puberty }

                    # These are two extra blendshapes added to the female body and clothing to allow for some
                    # extra scaling
                    setting = { attribute = "sjk_bs_body_breast_size_max" value = { min = 0.0 max = 1.0 } age = age_preset_puberty  }
                    setting = { attribute = "sjk_bs_body_breast_size_max_extra" value = { min = 0.0 max = 1.0 } age = age_preset_puberty  }
                }
            }
        }

Good luck!

 

Something you should know: These files can be found in sjkBreastScales/gfx/models/portraits/attachments (For clothes)

and sjkBreastScales/common/genes (For the genes

Link to post

Wait, I misread your text, this would make them larger if you've got a mod Beauty Traits + (Can Be found on Steam Workshop). If anyone wants to make it, this mod is for grabs! Just let me know.

 

Link

Link to post

If you read thread about integrating SJK into vanilla, you'll see that I've already messed with what you suggested. I think the problem is that Kincade inseparably attached the largest sizes to traits, so the only way I could get them is via traits. This means that I could never have females naturally range from minimal to maximal. Ah well. I at least was able to make the breasts significantly larger, though not maximal, as shown in my thread.

Link to post

Yea its in the resource so here's the path you need to take: sjkBeautyScalesBreasts/common, here you will find 3 things, decisions, script_values, and scripted_triggers. I know its not in decisions, but I've only skimmed through the other 2 but this is your mod expansion so I won't do all the work for you, if you haven't looked already, I'd look there.

 

If you don't have the file here it is (all you gotta do is extract, and look in it, if you don't trust this file you can find it with the same name at the breast scale page)

sjkBeautyScalesBreasts.zip

Link to post

How do you code events that fire for the player's heir after the player's character has died?  I assume it's some form of on_action (from studying the Carnalitas code), but this doesn't work:

 

on_death = {
    effect = {
        primary_heir = {
            trigger_event = {
                id = test_event.0001
                days = 1
            }
        }
    }
}

 

Link to post
4 hours ago, bobbily said:

How do you code events that fire for the player's heir after the player's character has died?  I assume it's some form of on_action (from studying the Carnalitas code), but this doesn't work:

 

on_death = {
    effect = {
        primary_heir = {
            trigger_event = {
                id = test_event.0001
                days = 1
            }
        }
    }
}

 

on_death already has an effect block so you can't add another, if you do it will just collapse. It can actually be quite an issue, Some mods (of the top of my head, VIET) adds things like delays to the vanilla on_actions and if two mods try to do the same, it just tanks the whole on_action. I think the only thing you can safely add to an on_action is events = {}, random_events = {} and other on_actions = {}.

 

So on your case, I would add an new on_action to on_death, that launched my_mod_on_action that used your code above.

Link to post
On 2/1/2021 at 12:19 PM, Dagulus said:

I suspect the reason why may be because the crime is from Carnalitis, which is obviously higher in my load order than my own mod, but you would still think basic sequencing could be achieved? So does anyone know if there is a way to set the sequence things go in?

So to answer my own question in case someone else has this issue. The main way I have found to get around this is to launch whatever you need to go last as part of an on_action. These always seem to be the last thing to be resolved in any immediate block. That is still pretty limited though: AFAICT, if you are writing an event that needs to do multiple things in a specific order, you are probably safest to split it into multiple events.

Link to post

So moving on to today's question for things that have eaten far to much of my time...

 

Has anyone played about with the activities box? The one the bottom corner that shows who is at the same activity as you. I would like to get rid of the checkered pink background at my orgy event, but I just don't see how the game knows where to pull the image from?

 

Also, the orgy map marker is not showing an icon either, just a black circle. This is less annoying but I would still like something to display if possible.

 

Link to post

I have the following  ai_will_do modifier in a character_interaction:

 

Spoiler

modifier = {
                    factor = 2
                    scope:actor = {                    
                                var:current_sex_drive >= 3
                                OR = {    
                                    has_trait = rapist
                                    has_trait = sadistic
                                    ai_vengefulness >= medium_positive_ai_value
                                }
                                OR = {
                                    has_relation_nemesis = scope:recipient
                                    has_relation_nemesis = scope:recipient.father
                                    has_relation_nemesis = scope:recipient.mother
                                    has_relation_nemesis = scope:recipient.primary_partner
                                    has_relation_rival = scope:recipient
                                    has_relation_rival = scope:recipient.father
                                    has_relation_rival = scope:recipient.mother
                                    has_relation_rival = scope:recipient.primary_partner
                                    scope:recipient = {
                                                    is_spouse_of = scope:actor
                                                    exposed_cheating_on_spouse_trigger = { SPOUSE = scope:actor }
                                    }
                                }    
                    }                        
                }

Does anybody know why the error_log keeps spamming me with the following error:

Spoiler

 Error: has_relation_nemesis trigger [ character (has relation) was null ]
  Script location: file: common/character_interactions/00_prisoner_rape_interactions.txt line: 234
[19:18:30][jomini_script_system.cpp:169]: Script system error!
  Error: has_relation_nemesis trigger [ character (has relation) was null ]
  Script location: file: common/character_interactions/00_prisoner_rape_interactions.txt line: 234
[19:18:30][jomini_script_system.cpp:169]: Script system error!
  Error: has_relation_rival trigger [ character (has relation) was null ]

I haven't been able to test the particular situation the modifier covers, but why wouldn't this work?

 

The idea here is that a vengeful character will rape a prisoner who is the wife or daughter of his rival or nemesis

Link to post

As an aside: I have not tested, but based on the 'offer_vassalization_interaction' it looks like 'has_relation_rival' should return true for a Nemesis as well, so you can cut out that test.

 

As for your question, if any of scope:recipient.father, scope:recipient.mother or scope:recipient.primary_partner do not exist, I would expect it to generate the 'character (has relation) was null' error. It might also generate the same error if they technically exist but are dead. Your probably best of building a scripted_trigger and within that, testing if the scopes actually exist before you test them further.

 

I think most people are used to scripting languages where testing for something that does not exist would simply return False (I know I am), but that does not seem to be how this one is set up. Of course, given how vague the error messages are, a lot of its down to trial and error.

 

 

Link to post
45 minutes ago, Dagulus said:

As an aside: I have not tested, but based on the 'offer_vassalization_interaction' it looks like 'has_relation_rival' should return true for a Nemesis as well, so you can cut out that test.

 

As for your question, if any of scope:recipient.father, scope:recipient.mother or scope:recipient.primary_partner do not exist, I would expect it to generate the 'character (has relation) was null' error. It might also generate the same error if they technically exist but are dead. Your probably best of building a scripted_trigger and within that, testing if the scopes actually exist before you test them further.

 

I think most people are used to scripting languages where testing for something that does not exist would simply return False (I know I am), but that does not seem to be how this one is set up. Of course, given how vague the error messages are, a lot of its down to trial and error.

 

 

Would this do the trick?

Spoiler

is_family_of_rival_trigger = {
                        trigger_if = {
                                    limit = {
                                        OR = {
                                            exists = scope:recipient
                                            exists = scope:recipient.father
                                            exists = scope:recipient.mother
                                            exists = scope:recipient.primary_partner
                                        }
                                    }
                                OR = {
                                    has_relation_rival = scope:recipient
                                    has_relation_rival = scope:recipient.father
                                    has_relation_rival = scope:recipient.mother
                                    has_relation_rival = scope:recipient.primary_partner
                                }
                        }    
}   

used as follows:

Spoiler

modifier = {
                    factor = 2
                    scope:actor = {                    
                                var:current_sex_drive >= 3
                                OR = {    
                                    has_trait = rapist
                                    has_trait = sadistic
                                    ai_vengefulness >= medium_positive_ai_value
                                }
                                OR = {
                                    is_family_of_rival_trigger = yes
                                    scope:recipient = {
                                                    is_spouse_of = scope:actor
                                                    exposed_cheating_on_spouse_trigger = { SPOUSE = scope:actor }
                                    }
                                }    
                    }                        
                }

 

Link to post
5 hours ago, joemann said:

Would this do the trick?

  Reveal hidden contents

is_family_of_rival_trigger = {
                        trigger_if = {
                                    limit = {
                                        OR = {
                                            exists = scope:recipient
                                            exists = scope:recipient.father
                                            exists = scope:recipient.mother
                                            exists = scope:recipient.primary_partner
                                        }
                                    }
                                OR = {
                                    has_relation_rival = scope:recipient
                                    has_relation_rival = scope:recipient.father
                                    has_relation_rival = scope:recipient.mother
                                    has_relation_rival = scope:recipient.primary_partner
                                }
                        }    
}   

used as follows:

  Hide contents

modifier = {
                    factor = 2
                    scope:actor = {                    
                                var:current_sex_drive >= 3
                                OR = {    
                                    has_trait = rapist
                                    has_trait = sadistic
                                    ai_vengefulness >= medium_positive_ai_value
                                }
                                OR = {
                                    is_family_of_rival_trigger = yes
                                    scope:recipient = {
                                                    is_spouse_of = scope:actor
                                                    exposed_cheating_on_spouse_trigger = { SPOUSE = scope:actor }
                                    }
                                }    
                    }                        
                }

 

Wait, theres a trait Rapist? What mod?

Link to post
10 hours ago, joemann said:

Would this do the trick?

  Reveal hidden contents

is_family_of_rival_trigger = {
                        trigger_if = {
                                    limit = {
                                        OR = {
                                            exists = scope:recipient
                                            exists = scope:recipient.father
                                            exists = scope:recipient.mother
                                            exists = scope:recipient.primary_partner
                                        }
                                    }
                                OR = {
                                    has_relation_rival = scope:recipient
                                    has_relation_rival = scope:recipient.father
                                    has_relation_rival = scope:recipient.mother
                                    has_relation_rival = scope:recipient.primary_partner
                                }
                        }    
}   

used as follows:

  Reveal hidden contents

modifier = {
                    factor = 2
                    scope:actor = {                    
                                var:current_sex_drive >= 3
                                OR = {    
                                    has_trait = rapist
                                    has_trait = sadistic
                                    ai_vengefulness >= medium_positive_ai_value
                                }
                                OR = {
                                    is_family_of_rival_trigger = yes
                                    scope:recipient = {
                                                    is_spouse_of = scope:actor
                                                    exposed_cheating_on_spouse_trigger = { SPOUSE = scope:actor }
                                    }
                                }    
                    }                        
                }

 

I think this might work?

Spoiler

is_family_of_rival_trigger = {
	scope:recipient = { 
		or = {
			has_relation_rival = root
			any_parent = {
				has_relation_rival = root
			}
			any_spouse = {
				has_relation_rival = root
			}
		}
	}
}

 

 

 

Link to post
8 hours ago, M4rocks said:

Wait, theres a trait Rapist? What mod?

A mod I am working on based on bits and pieces from other mods. The rape part is from Tosca, which I have modified, adding and expanding stuff. I don't think I will upload it since it is in perpetual change and is probably not compatible with other mods. I am not a good coder, but I enjoy modding the game almost as much as playing it.

 

1 hour ago, Dagulus said:

I think this might work?

  Reveal hidden contents


is_family_of_rival_trigger = {
	scope:recipient = { 
		or = {
			has_relation_rival = root
			any_parent = {
				has_relation_rival = root
			}
			any_spouse = {
				has_relation_rival = root
			}
		}
	}
}

 

 

 

Thanks! this looks good and very much cleaner than what I cobbled together. As I said I am not a good coder. I will try it today. Question: if I don't expect to use this trigger elsewhere

can I include it directly in the character_interaction? I am not sure what the criteria are for using a scripted trigger.

Link to post
10 minutes ago, joemann said:

Question: if I don't expect to use this trigger elsewhere can I include it directly in the character_interaction? I am not sure what the criteria are for using a scripted trigger.

I believe you should just be able to put it in the same file, yes.

Link to post

I have the following question:

 

Spoiler

immediate = {            
                scope:test_sex_target = {
                                    if = {
                                        limit = {
                                                any_relation = {
                                                            type = soulmate
                                                            count = 1
                                                }                                                                                                
                                        }                                        
                                        random_relation = {
                                                        type = soulmate                                                                                                                                                                                                                     
                                                        save_scope_as = deflowerer                
                                        }
                                    }    
                                    else_if = {
                                            limit = {
                                                    any_relation = {
                                                                    type = lover
                                                                    count = 1
                                                    }
                                            }        
                                            random_relation = {
                                                            type = lover                                             
                                                            save_scope_as = deflowerer
                                            }                
                                    }
                                    else_if = {
                                            limit = {
                                                    any_relation = {
                                                                type = rapist
                                                                count = 1
                                                    }
                                            }        
                                            random_relation = {
                                                            type = rapist                                             
                                                            save_scope_as = deflowerer
                                            }
                                    }
                                    else = {
                                        limit = {
                                            top_liege = {    
                                                    any_courtier_or_guest = {
                                                                            is_ai = yes
                                                                            is_adult = yes
                                                                            is_male = yes
                                                                            is_female = no
                                                                            NOT = { has_trait = virgin }
                                                                                OR = {                                                                                                                                                                                                             has_trait = lifestyle_reveler
                                                                                    has_trait = lustful
                                                                                    has_trait = rapist
                                                                                    has_trait = gallant
                                                                                    has_trait = seducer
                                                                                    has_trait = fornicator
                                                                                    has_trait = adulterer
                                                                                    var:basic_sex_drive > 3.5
                                                                                }
                                                                                                                
                                                    }
                                            }
                                        }                                                                                
                                        top_liege = {
                                                random_courtier_or_guest = {
                                                                        limit = {
                                                                            is_ai = yes
                                                                            is_adult = yes
                                                                            is_male = yes
                                                                            is_female = no
                                                                            NOT = { has_trait = virgin }
                                                                            OR = {
                                                                                has_trait = lifestyle_reveler
                                                                                has_trait = lustful
                                                                                has_trait = rapist
                                                                                has_trait = gallant
                                                                                has_trait = seducer
                                                                                has_trait = fornicator
                                                                                has_trait = adulterer
                                                                                var:basic_sex_drive = 3
                                                                            }
                                                                        }
                                                                                                        
                                                }
                                        }                                                                                                                                                            
                                        save_scope_as = deflowerer                                    
                                    }
            }                            
    }   

When I test this on Duchess Mathilda ( scope:player_sex_target ) this always comes up with Mathilda herself as the deflowerer, although she has the HRE as her  liege with a full court. I would like it to pick one of the emperors courtiers as the deflowerer. What am I doing wrong? Is Mathilda a default?

Link to post
1 hour ago, joemann said:

I have the following question:

 

When I test this on Duchess Mathilda ( scope:player_sex_target ) this always comes up with Mathilda herself as the deflowerer, although she has the HRE as her  liege with a full court. I would like it to pick one of the emperors courtiers as the deflowerer. What am I doing wrong? Is Mathilda a default?

At a first glance it looks to me that 'save_scope_as = deflowerer ' is in completely the wrong set of {}. I think it needs to be within 'random_courtier_or_guest = {}'. Whereas you seem to have it in the else statement of 'scope:test_sex_target = {'

 

Link to post
2 hours ago, Dagulus said:

At a first glance it looks to me that 'save_scope_as = deflowerer ' is in completely the wrong set of {}. I think it needs to be within 'random_courtier_or_guest = {}'. Whereas you seem to have it in the else statement of 'scope:test_sex_target = {'

 

😬 Thanks. Sometimes it really helps when someone looks at it with fresh eyes.

Link to post

Since the 1.3 update I am having problems with character being bald. I partially solved it by modding  the genes and ethnicity files. The problem is now limited to naked characters in the event window, which are always bald. Anybody know what causes  this?

 

I also get a strange error message referring to ethnicity files that I can not find. They are not in the vanilla game, neither are they in the mods in the Steam workshop file.

Spoiler

[12:49:37][ethnicity.cpp:285]: gene category 'hairstyles' cannot be influenced by DNA, at  file: common/ethnicities/01_ethnicities_african_northeastern.txt line: 182

Does anybody know where they come from?

Link to post
6 hours ago, joemann said:

Since the 1.3 update I am having problems with character being bald. I partially solved it by modding  the genes and ethnicity files. The problem is now limited to naked characters in the event window, which are always bald. Anybody know what causes  this?

 

I also get a strange error message referring to ethnicity files that I can not find. They are not in the vanilla game, neither are they in the mods in the Steam workshop file.

  Hide contents

[12:49:37][ethnicity.cpp:285]: gene category 'hairstyles' cannot be influenced by DNA, at  file: common/ethnicities/01_ethnicities_african_northeastern.txt line: 182

Does anybody know where they come from?

The baldness seems to be a Paradox issue. Paradox totally changed the way hair worked, there are actually more changes on the backend that I spent the last couple of days working through. When I wanted characters to be naked who would otherwise not be naked I basically copied the code paradox uses (there are only a couple events that do this).

    left_portrait = {
        character = root
        animation = shock
        triggered_outfit = {
            remove_default_outfit = yes
            outfit_tags = { no_clothes }
        }
    }

remove_default_outfit is meant to removes all clothing that does not match the outfit tags. But actually it removes all portrait modifiers that aren't coded with "ignore_outfit_tags = yes". Despite having an easy way code to prevent this problem Paradox hasn't used that code all that often, probably because the only events that code characters to be naked are a random court scheme result and a random brothel trip result.

Anyway things like ablinism, gigantism, and even carnalitas tit modifiers will be removed by the remove_default_outfit command as well. Now it seems like hair is added to that list. My work around was to stop using the remove_default_outfit command (since its easier than fully replacing every modifier). By default "outfit_tags = { no_clothes }" will remove tops but leave your character with their pants, cloak, and headgear. So I added three outfit tags to my char_body_overhaul mod that no_cloak, no_hat, no_pants that each remove those items. So now I just code events with nudity with those outfit tags.

Link to post
6 hours ago, joemann said:

Since the 1.3 update I am having problems with character being bald. I partially solved it by modding  the genes and ethnicity files. The problem is now limited to naked characters in the event window, which are always bald. Anybody know what causes  this?

 

I also get a strange error message referring to ethnicity files that I can not find. They are not in the vanilla game, neither are they in the mods in the Steam workshop file.

  Hide contents

[12:49:37][ethnicity.cpp:285]: gene category 'hairstyles' cannot be influenced by DNA, at  file: common/ethnicities/01_ethnicities_african_northeastern.txt line: 182

Does anybody know where they come from?

The error is because you are trying to code a characters hairstyles in their DNA but DNA no longer influences hairstyle* just hair type. Hair style is determined via portrait modifiers that give you a random chance of having any one of the available hairstyles based on your culture and hairtype. Hairtype is genetic, hairstyle is not. But this is all new, so anything you have that messes with hair at all could be an issue.

Link to post
On 3/20/2021 at 8:48 PM, Mange2020 said:

The baldness seems to be a Paradox issue. Paradox totally changed the way hair worked, there are actually more changes on the backend that I spent the last couple of days working through. When I wanted characters to be naked who would otherwise not be naked I basically copied the code paradox uses (there are only a couple events that do this).

    left_portrait = {
        character = root
        animation = shock
        triggered_outfit = {
            remove_default_outfit = yes
            outfit_tags = { no_clothes }
        }
    }

remove_default_outfit is meant to removes all clothing that does not match the outfit tags. But actually it removes all portrait modifiers that aren't coded with "ignore_outfit_tags = yes". Despite having an easy way code to prevent this problem Paradox hasn't used that code all that often, probably because the only events that code characters to be naked are a random court scheme result and a random brothel trip result.

Anyway things like ablinism, gigantism, and even carnalitas tit modifiers will be removed by the remove_default_outfit command as well. Now it seems like hair is added to that list. My work around was to stop using the remove_default_outfit command (since its easier than fully replacing every modifier). By default "outfit_tags = { no_clothes }" will remove tops but leave your character with their pants, cloak, and headgear. So I added three outfit tags to my char_body_overhaul mod that no_cloak, no_hat, no_pants that each remove those items. So now I just code events with nudity with those outfit tags.

Thanks for this answer. Where/how do you define outfit_tags? I tried using outfit_tags = { no_cloak no_headgear no_legwear no_clothes } but I still get a naked  character with a crown and a cloak (although he has his hair back ).

Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...