• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.
On the tech, making it all lower case does not affect the error message.

On the adventure war, I've seen claimant adventures, not sure I've seen duchy adventures, I'll have to do some testing.

2) I'm going to allow a province target which should fix this issue
3) Can't seem to reproduce, the files seem to indicate this is actually valid. Maybe for some reason TECH_NOBLE_CUSTOMS isn't considered a tech in your mod for some reason?
 
Version v1.6 has been released: https://www.dropbox.com/s/01r6gqy3gkzkdax/Audax.Validator v1.6.rar

The reason for bumping the version is that 1.5 doesn't work for the latest ck2 patch.

If I did not reply to you, then you issue should be fixed, but of course report again if it doesn't seem to be.

Please keep reporting false positives with the Validator, and they will likely get fixed. If you are reporting a false positive, it is very useful to copy the error message into the post - you can just select the error message, then press Ctrl+C to copy it.

If no issues are reported on either the Eu4 or Ck2 forums for a week, then a final 1.7 will be released and it will be the last version until a new patch comes out.
 
The Bastard Check for Character History should check for "add_trait = child_of_consort" as well not only bastard / legit_bastard

Oh and the add_spouse / add_spouse_matrilineal should actually check for the religion and take the max_spouse value from there as restrain instead of "1" if it not allready does so
 
Last edited:
Code:
character_event = {
	id = TOG.1061
	desc =*EVTDESC_TOG_1061
	picture = GFX_evt_heretic
	border = GFX_event_normal_frame_war
	
	is_triggered_only = yes
	
	option = {
		name = EVTOPTA_TOG_1060
		trigger = {
			owner = { religion_group = FROM }
		}
	}
	option = {
		name = EVTOPTB_TOG_1060
		trigger = {
			owner = { NOT = { religion_group = FROM	} }
		}
	}
}

This is from Vanilla - i know it does look totally odd but it DOES work (just tested) - i dont know why it does work but it does. (owner in character scope trigger)
 
The owner would be incorrect, characters don't have owners. (It's called from a province event, the lieges of the province owner get this event.) It should be ROOT whose religion_group is compared to FROM.
 
It's not correct, it just doesn't cause an error. Same with a bunch of FROMFROMFROMs in plot_events.txt, which (depending on just what event string path is followed) scopes to the first event in the string, or the event before it.

TL;DR: If there is no FROM, FROM is ROOT.
 
Code:
character_event = {
	id = TOG.1061
	desc =*EVTDESC_TOG_1061
	picture = GFX_evt_heretic
	border = GFX_event_normal_frame_war
	
	is_triggered_only = yes
	
	option = {
		name = EVTOPTA_TOG_1060
		trigger = {
			owner = { religion_group = FROM }
		}
	}
	option = {
		name = EVTOPTB_TOG_1060
		trigger = {
			owner = { NOT = { religion_group = FROM	} }
		}
	}
}

This is from Vanilla - i know it does look totally odd but it DOES work (just tested) - i dont know why it does work but it does. (owner in character scope trigger)

It's incorrect, but yes it does work (it shouldn't if coded properly...). So no, ignore that it does work and have the Validator report this as an error.
 
The Validator doesn't yet support the hostile_within_group flag and is treating it as a religion name:
--- Error 1 of 2 ---
At <mod>\common\religions\00_religions.txt [indian_group\hostile_within_group] (Line 14987, column 2):
The required "icon" entry was not found.
--- Error 2 of 2 ---
At <mod>\common\religions\00_religions.txt [indian_group\hostile_within_group] (Line 14987, column 2):
The string hostile_within_group was not found in localization.

--- Error 1 of 1 ---
At <mod>\decisions\LIFF_prisoner_decisions.txt [decisions\indoctrinate_prisoners_decision\allow\NOT\any_ward\count] (Line 91, column 6):
Invalid node "count" in scope CharTrigger (value is: 2)
"count" should be valid within any any_x trigger scope.

Edit: I take this last one back, it doesn't seem to work in any_ward scope.
 
Last edited:
False negative: on_action events that contain a mean_time_to_happen line should be flagged as errors (weight_multiplier should be used instead.) If tracking on_action events is too difficult, flag a mean_time_to_happen line as an error if the event is is_triggered_only = yes.
 
False positive:
--- Error 1 of 1 ---
At <mod>\events\pillaging_sacking_events.txt [character_event\option\FROM\FROM\holder_scope] (Line 6289, column 5):
Invalid node "holder_scope" in scope CharCommand (value is: <a complex type>)

This event is called from an event triggered on_siege_won_leader, where as I have reported before, FROM is the holding taken per vanilla documentation, so holder_scope should be valid.

Code:
# Liege Takes Prsioners
character_event = {
	id = 3199501
	desc = "EVTDESC3199501"
	picture = "GFX_evt_people_captured"
	border = GFX_event_normal_frame_war

	is_triggered_only = yes
		
	option = {
		name = "EVTOPTA3199501"
		FROM = {
			FROM = { 
				holder_scope = {
Code:
character_event = {			# Owner in Settlement
	id = 319950
	title = "EVTNAME319900"
	desc = "EVTDESC319950"
	picture = "GFX_evt_people_captured"

	is_triggered_only = yes

	trigger = {
		NOT = { any_liege = { has_landed_title = e_rebels } }
		FROM = {
			holder_scope = { 
				capital_holding = { 
					OR = {
						title = PREVPREV
						controller = {
							NOT = { character = PREVPREV }
						}						
					}	
				}
				at_location = ROOT 
				war_with = ROOT
				OR = {
					is_primary_war_attacker = yes
					is_primary_war_defender = yes
				}
				NOT = { has_character_modifier = modifier_hidden }
			}
		}
	}

	option = {
		name = "EVTOPTA319950"
		trigger = {
			liege = {
				FROM = { 
					holder_scope = { 
						OR = {
							war_with = ROOT 
							war_with = PREVPREV
						}	
					} 
				}
			}	
		}  

		ai_chance = {
			factor = 5
			modifier = {
				factor = 5  
				FROM = {
					holder_scope = {
						primary_title = {
							higher_tier_than = COUNT
						}
					}
				}
			}
			modifier = {
				factor = 3  
				FROM = {
					holder_scope = {
						primary_title = {
							higher_tier_than = DUKE
						}
					}
				}
			}
			modifier = {
				factor = 0.25  
				FROM = {
					holder_scope = {
						primary_title = {
							lower_tier_than = COUNT
						}
					}
				}
			}
			modifier = {
				factor = 2
				trait = cruel
			}
			modifier = {
				factor = 2
				trait = greedy
			}
			modifier = {
				factor = 2
				trait = ruthless
			}
			modifier = {
				factor = 10
				trait = impaler
			}
			modifier = {
				factor = 10
				trait = wroth
			}
			modifier = {
				factor = 0.25
				trait = charitable
			}
			modifier = {
				factor = 0.25
				trait = kind
			}
			modifier = {
				factor = 0.5
				trait = honorable
			}
			modifier = {
				factor = 0.5
				trait = weak
			}
			modifier = {
				factor = 0.5
				trait = just
			}
		}
		
		FROM = { 
			holder_scope = {
				limit = { 
					at_location = ROOT
					NOT = { has_character_modifier = modifier_hidden }
					NOT = { character = ROOT }
				} 
				set_character_flag = captured_in_battle
				if = {
					limit = { ROOT = { demesne_size = 1 } }
					imprison = ROOT 	
				}
				hidden_tooltip = { 
					if = {
						limit = { ROOT = { NOT = { demesne_size = 1 } } }
						ROOT = { liege = { character_event = { id = 3199501 } } }
Code:
on_siege_won_leader = {
	events = {
		312170 		# Siege of Ynys Trebes
		319952 		# Release Previous Prisoners
		319900 		# Sacking and Pillaging - Castle (Small)
		319901 		# Sacking and Pillaging - Castle (Medium)
		319902 		# Sacking and Pillaging - Castle (Large)
		319920 		# Sacking and Pillaging - Town (Small)
		319921 		# Sacking and Pillaging - Town (Medium)	 
		319922 		# Sacking and Pillaging - Town (Large)
		319950 		# Siege Imprisonment - Holder in Settlement
		319951 		# Siege Imprisonment - Holder NOT in Settlement
	}
}
Comment from a vanilla on_siege_won_leader event:
Code:
# on_siege_won_leader
# FROM = barony won
 
False positive:


This event is called from an event triggered on_siege_won_leader, where as I have reported before, FROM is the holding taken per vanilla documentation, so holder_scope should be valid.

Code:
# Liege Takes Prsioners
character_event = {
	id = 3199501
	desc = "EVTDESC3199501"
	picture = "GFX_evt_people_captured"
	border = GFX_event_normal_frame_war

	is_triggered_only = yes
		
	option = {
		name = "EVTOPTA3199501"
		FROM = {
			FROM = { 
				holder_scope = {
Code:
character_event = {			# Owner in Settlement
	id = 319950
	title = "EVTNAME319900"
	desc = "EVTDESC319950"
	picture = "GFX_evt_people_captured"

	is_triggered_only = yes

	trigger = {
		NOT = { any_liege = { has_landed_title = e_rebels } }
		FROM = {
			holder_scope = { 
				capital_holding = { 
					OR = {
						title = PREVPREV
						controller = {
							NOT = { character = PREVPREV }
						}						
					}	
				}
				at_location = ROOT 
				war_with = ROOT
				OR = {
					is_primary_war_attacker = yes
					is_primary_war_defender = yes
				}
				NOT = { has_character_modifier = modifier_hidden }
			}
		}
	}

	option = {
		name = "EVTOPTA319950"
		trigger = {
			liege = {
				FROM = { 
					holder_scope = { 
						OR = {
							war_with = ROOT 
							war_with = PREVPREV
						}	
					} 
				}
			}	
		}  

		ai_chance = {
			factor = 5
			modifier = {
				factor = 5  
				FROM = {
					holder_scope = {
						primary_title = {
							higher_tier_than = COUNT
						}
					}
				}
			}
			modifier = {
				factor = 3  
				FROM = {
					holder_scope = {
						primary_title = {
							higher_tier_than = DUKE
						}
					}
				}
			}
			modifier = {
				factor = 0.25  
				FROM = {
					holder_scope = {
						primary_title = {
							lower_tier_than = COUNT
						}
					}
				}
			}
			modifier = {
				factor = 2
				trait = cruel
			}
			modifier = {
				factor = 2
				trait = greedy
			}
			modifier = {
				factor = 2
				trait = ruthless
			}
			modifier = {
				factor = 10
				trait = impaler
			}
			modifier = {
				factor = 10
				trait = wroth
			}
			modifier = {
				factor = 0.25
				trait = charitable
			}
			modifier = {
				factor = 0.25
				trait = kind
			}
			modifier = {
				factor = 0.5
				trait = honorable
			}
			modifier = {
				factor = 0.5
				trait = weak
			}
			modifier = {
				factor = 0.5
				trait = just
			}
		}
		
		FROM = { 
			holder_scope = {
				limit = { 
					at_location = ROOT
					NOT = { has_character_modifier = modifier_hidden }
					NOT = { character = ROOT }
				} 
				set_character_flag = captured_in_battle
				if = {
					limit = { ROOT = { demesne_size = 1 } }
					imprison = ROOT 	
				}
				hidden_tooltip = { 
					if = {
						limit = { ROOT = { NOT = { demesne_size = 1 } } }
						ROOT = { liege = { character_event = { id = 3199501 } } }
Code:
on_siege_won_leader = {
	events = {
		312170 		# Siege of Ynys Trebes
		319952 		# Release Previous Prisoners
		319900 		# Sacking and Pillaging - Castle (Small)
		319901 		# Sacking and Pillaging - Castle (Medium)
		319902 		# Sacking and Pillaging - Castle (Large)
		319920 		# Sacking and Pillaging - Town (Small)
		319921 		# Sacking and Pillaging - Town (Medium)	 
		319922 		# Sacking and Pillaging - Town (Large)
		319950 		# Siege Imprisonment - Holder in Settlement
		319951 		# Siege Imprisonment - Holder NOT in Settlement
	}
}
Comment from a vanilla on_siege_won_leader event:
Code:
# on_siege_won_leader
# FROM = barony won

So FROM = { FROM = { is the equivalent of FROMFROM?
 
That is my understanding, yes.
 
That is my understanding, yes.

Are you absolutely sure? This may suck to code if it's the issue (which it probably is).

Is there anything else special? e.g. FROM = { ROOT = { would the second root be the current event's root, or the FROM event's root (which would be the same as FROM, but someone might have it anyways).
 
Not absolutely sure, no. It's simple enough in this case to change FROM = { FROM = { to FROMFROM = { so I'll go with that.
 
Are you absolutely sure? This may suck to code if it's the issue (which it probably is).

Is there anything else special? e.g. FROM = { ROOT = { would the second root be the current event's root, or the FROM event's root (which would be the same as FROM, but someone might have it anyways).

(In a character event) ROOT always points to the character getting the event. Nesting ROOT inside FROM like that would just scope back to the person experiencing the event. (In other words, FROM = { ROOT = {} } would scope to the same character as plain ROOT = {})

Edit: Clarified I was referring to character events only.
 
Last edited:
Is it possible to make validator ignore all errors in one file. I tried adding "# Audax Validator "!" Ignore_ALL" at the top of file, but it doesn't work. If I try "# Audax Validator "!" Ignore_NEXT", it works too good and I get no errors from ALL my files.
 
  • 1Like
Reactions:
ROOT always points to the character getting the event. Nesting ROOT inside FROM like that would just scope back to the person experiencing the event. (In other words, FROM = { ROOT = {} } would scope to the same character as plain ROOT = {})

Not Entirely true - ion Narative events every character does get the event but only the triggering Character is treated as root

The FROMROOT thing can be easily tested:

Make two events.
Event A calls Event B on another (playable) character with a 3 Day delay)

Event B gives FROMROOT a trait or a hughe amount of gold

now call Event A via Console - select the option - switch to the reciving Character (best is safe the game and reload from the save game with the receving Character )
wait 3 days select the Option in Event B and see who does get the gold/trait.

The Save/Reload can usually be skipped but i wont lay my hand in the fire that some weired chaching issues with Scopes do occur when console switching characters in connection with ongoing events ^^

EDIT:
General comment:
Basically FROMFROM PREVPREV and so on is juist a short form of writing FROM = { FROM = { and so on
and in theory you can stack this endlessly
like PREVPREVPREVROOTTHISTHISFROMFROMROOTTHIS does not make sense but does work ^^
 
Last edited:
I've a question there is a mode to have the errors only of the mod itself?

I've set the mod path and the name of the mod strange things happens:

  1. It looks the mod directory and it sees some bugged .mod files that were there! But I wanted to check errors in my mod not in the mods of others...
  2. The errors of my mod are mixed with the Vanilla errors (for example a lot of vanilla history files are a little bugged with people with date of death before their birth and so on...), the errors of my mod are 3-4, but I see mixed with other 2000!

Some bugs that I've noticed:

  • I'm using Windows 8 / 64 Bit in Desktop mode sometimes the file/files are locked the program crashes badly! Probably opening them in read only would be better (could I use GVIM as editor when I press "edit" by the way?)
  • I use GVIM as editor and when it opens a file it creates a shadow copy with changed extension (.txt --> .txt~) the validator gives me errors of duplicated entries... GVIM is bugged as it should delete them on closing but it does NOT, nevertheless the game correctly uses the files (at least it seems to do this as I don't see duplicates) with the correct extension so those files should be ignored and don't be see as errors.

Thanks and keep the good work!