• 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.
That ID should have had only one 0, to fit in with the rest of the event ID sequence.
 
--- Error 1 of 1 ---
At <mod>\decisions\faction_decisions.txt [plot_decisions\faction_claimant_ultimatum\ai_will_do\modifier[5]\liege\any_war\OR\AND[1]] (Line 1125, Column 8):
Invalid node "thirdparty_title" in scope WarTrigger (value is: <a complex type>)
Vanilla decision (thirdparty_title exists in executable):
Code:
	faction_claimant_ultimatum = {
		is_high_prio = yes
		
		potential = {
			leads_faction = faction_claimant
			OR = {
				NOT = { has_character_flag = faction_claimant_ultimatum_taken }
				had_character_flag = { flag = faction_claimant_ultimatum_taken days = 7 }
			}
			liege = {
				in_revolt = no
				liege = {
					in_revolt = no
					liege = {
						in_revolt = no
					}
				}
			}
		}
		
		allow = {
			war = no
			prisoner = no
			liege = {
				NOT = { war_with = ROOT }
				NOT = { reverse_has_truce = ROOT }
			}
			capital_holding = {
				controller = {
					character = ROOT
				}
			}
		}
		effect = {
			liege = {
				letter_event = { id = 8036 days = 3 tooltip = "EVTTOOLTIP8005" }
			}
			if = {
				limit = {
					supported_claimant = {
						NOT = { character = ROOT }
						OR = {
							NOT = { same_liege = ROOT }
							NOT = { in_faction = faction_claimant }
							NOT = { supported_claimant = { character = PREV } }
						}
					}
				}
				supported_claimant = {
					letter_event = { id = 8037 days = 1 }
				}
			}
			hidden_tooltip = {
				set_character_flag = faction_claimant_ultimatum_taken
			}
		}
		revoke_allowed = {
			always = no
		}
		
		ai_will_do = {
			factor = 1
			
			modifier = {
				factor = 0
				NOT = { 
					faction_power = 
					{
						faction = faction_claimant
						power = 0.5
					}
				}
			}
			
			modifier = {
				factor = 0
				faction_claimant = {
					has_law = succ_feudal_elective
				}
				liege = {
					ROOT = {
						supported_claimant = {
							religion = PREVPREV
							culture = PREVPREV
						}
					}
				}
			}
			
			modifier = {
				factor = 0
				liege = {
					primary_title = {
						ROOT = {
							faction_claimant = {
								title = PREVPREV
							}
						}
					}
				}
				NOT = { 
					faction_power = 
					{
						faction = faction_claimant
						power = 0.75
					}
				}
			}
			
			modifier = {
				factor = 0.5 # Slow it down a bit
			}
			
			modifier = {
				factor = 0
				liege = {
					any_war = {
						OR = {
							AND = {
								defender = { character = PREV }
								NOT = { using_cb = depose_liege }
								NOT = { using_cb = overthrow_ruler }
								NOT = { using_cb = overthrow_ruler_no_calls }
								NOT = { using_cb = succession_on_liege }
								NOT = { using_cb = other_succession_on_liege }
								[COLOR="#FF0000"]thirdparty_title[/COLOR] = {
									ROOT = {
										supported_claimant_title = {
											war_title = PREVPREV
										}
									}
									OR = {
										is_conquered = no
										conquest_culture = ROOT
									}
								}
								attacker = {
									OR = {
										in_revolt = no
										NOT = {
											liege_before_war = {
												character = PREVPREVPREV
											}
										}
									}
								}
							}
							AND = {
								attacker = {
									character = PREV
									ROOT = {
										supported_claimant = {
											religion = PREVPREV
											culture = PREVPREV
										}
									}
								}
								OR = {
									using_cb = religious
									using_cb = crusade
									using_cb = muslim_invasion
									using_cb = invasion
									using_cb = tribal_invasion
									using_cb = claim_all
									using_cb = claim
								}
							}
						}
					}
				}
			}
		}
	}
 
Vanilla decision (thirdparty_title exists in executable):
Code:
	faction_claimant_ultimatum = {
		is_high_prio = yes
		
		potential = {
			leads_faction = faction_claimant
			OR = {
				NOT = { has_character_flag = faction_claimant_ultimatum_taken }
				had_character_flag = { flag = faction_claimant_ultimatum_taken days = 7 }
			}
			liege = {
				in_revolt = no
				liege = {
					in_revolt = no
					liege = {
						in_revolt = no
					}
				}
			}
		}
		
		allow = {
			war = no
			prisoner = no
			liege = {
				NOT = { war_with = ROOT }
				NOT = { reverse_has_truce = ROOT }
			}
			capital_holding = {
				controller = {
					character = ROOT
				}
			}
		}
		effect = {
			liege = {
				letter_event = { id = 8036 days = 3 tooltip = "EVTTOOLTIP8005" }
			}
			if = {
				limit = {
					supported_claimant = {
						NOT = { character = ROOT }
						OR = {
							NOT = { same_liege = ROOT }
							NOT = { in_faction = faction_claimant }
							NOT = { supported_claimant = { character = PREV } }
						}
					}
				}
				supported_claimant = {
					letter_event = { id = 8037 days = 1 }
				}
			}
			hidden_tooltip = {
				set_character_flag = faction_claimant_ultimatum_taken
			}
		}
		revoke_allowed = {
			always = no
		}
		
		ai_will_do = {
			factor = 1
			
			modifier = {
				factor = 0
				NOT = { 
					faction_power = 
					{
						faction = faction_claimant
						power = 0.5
					}
				}
			}
			
			modifier = {
				factor = 0
				faction_claimant = {
					has_law = succ_feudal_elective
				}
				liege = {
					ROOT = {
						supported_claimant = {
							religion = PREVPREV
							culture = PREVPREV
						}
					}
				}
			}
			
			modifier = {
				factor = 0
				liege = {
					primary_title = {
						ROOT = {
							faction_claimant = {
								title = PREVPREV
							}
						}
					}
				}
				NOT = { 
					faction_power = 
					{
						faction = faction_claimant
						power = 0.75
					}
				}
			}
			
			modifier = {
				factor = 0.5 # Slow it down a bit
			}
			
			modifier = {
				factor = 0
				liege = {
					any_war = {
						OR = {
							AND = {
								defender = { character = PREV }
								NOT = { using_cb = depose_liege }
								NOT = { using_cb = overthrow_ruler }
								NOT = { using_cb = overthrow_ruler_no_calls }
								NOT = { using_cb = succession_on_liege }
								NOT = { using_cb = other_succession_on_liege }
								[COLOR="#FF0000"]thirdparty_title[/COLOR] = {
									ROOT = {
										supported_claimant_title = {
											war_title = PREVPREV
										}
									}
									OR = {
										is_conquered = no
										conquest_culture = ROOT
									}
								}
								attacker = {
									OR = {
										in_revolt = no
										NOT = {
											liege_before_war = {
												character = PREVPREVPREV
											}
										}
									}
								}
							}
							AND = {
								attacker = {
									character = PREV
									ROOT = {
										supported_claimant = {
											religion = PREVPREV
											culture = PREVPREV
										}
									}
								}
								OR = {
									using_cb = religious
									using_cb = crusade
									using_cb = muslim_invasion
									using_cb = invasion
									using_cb = tribal_invasion
									using_cb = claim_all
									using_cb = claim
								}
							}
						}
					}
				}
			}
		}
	}

OK, it switches into a title scope? Also, do you happen to know if this also works in a command area?
 
As far as I know, that's the only place it's currently used, so I don't know if it's useable in a command area.
 
In vanilla, thirdparty is only used in war declarations by event, and is always (except once) commented '# The de jure kingdom' so it should be a title (or PREV etc.).
It looks to be the title the war is being called for, as opposed to the aggressor or defender's main title.
 
Getting a false positive on this bit of code:
Code:
        NOT = {
            AND = {
                culture_group = celtic
                owner = { culture_group = germanic }
            }
        }
That's from a province scope, so the owner line should work fine.
The error I'm getting:
No direct match found for culture_group. However, other possible matches in scope CharTrigger were found.
Left: ["culture_group"] Right: [CultureGroup]
Left: ["culture_group"] Right: [ThisChar, ThisProv, or OpinionClauseDefinedTypes]
 
Getting a false positive on this bit of code:
Code:
        NOT = {
            AND = {
                culture_group = celtic
                owner = { culture_group = germanic }
            }
        }
That's from a province scope, so the owner line should work fine.
The error I'm getting:
No direct match found for culture_group. However, other possible matches in scope CharTrigger were found.
Left: ["culture_group"] Right: [CultureGroup]
Left: ["culture_group"] Right: [ThisChar, ThisProv, or OpinionClauseDefinedTypes]

Hmm strange. I think it's complaining about the germanic one? Is germanic definitely a spelled-correctly culture group?
 
Here, have an actual false-positive though:
The scope for rep_trade_posts is a province scope, not a title scope. Title scope gives false positives such as this:

Invalid node "any_neighbor_province" in scope TitleObjectiveTrigger (value is: <a complex type>)
 
Here, have an actual false-positive though:
The scope for rep_trade_posts is a province scope, not a title scope. Title scope gives false positives such as this:

Invalid node "any_neighbor_province" in scope TitleObjectiveTrigger (value is: <a complex type>)

Fixed.
 
Has anyone managed to get this running under Linux (via wine, mono, etc.) by any chance? I'm having no luck with wine and mono reports:

Code:
Unhandled Exception: System.Security.SecurityException: No access to the given key
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir, Boolean is_volatile) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler.Lookup (Microsoft.Win32.RegistryKey rkey, Boolean createNonExisting) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.UnixRegistryApi.OpenSubKey (Microsoft.Win32.RegistryKey rkey, System.String keyname, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Win32.RegistryKey:OpenSubKey (string)
  at Audax.Validator.Boot.FrameworkVersionCheck.HasRequiredVersion () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.FrameworkVersionCheck.Check40Installed () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Security.SecurityException: No access to the given key
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir, Boolean is_volatile) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler.Lookup (Microsoft.Win32.RegistryKey rkey, Boolean createNonExisting) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.UnixRegistryApi.OpenSubKey (Microsoft.Win32.RegistryKey rkey, System.String keyname, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Win32.RegistryKey:OpenSubKey (string)
  at Audax.Validator.Boot.FrameworkVersionCheck.HasRequiredVersion () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.FrameworkVersionCheck.Check40Installed () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
 
Has anyone managed to get this running under Linux (via wine, mono, etc.) by any chance? I'm having no luck with wine and mono reports:

Code:
Unhandled Exception: System.Security.SecurityException: No access to the given key
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir, Boolean is_volatile) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler.Lookup (Microsoft.Win32.RegistryKey rkey, Boolean createNonExisting) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.UnixRegistryApi.OpenSubKey (Microsoft.Win32.RegistryKey rkey, System.String keyname, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Win32.RegistryKey:OpenSubKey (string)
  at Audax.Validator.Boot.FrameworkVersionCheck.HasRequiredVersion () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.FrameworkVersionCheck.Check40Installed () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Security.SecurityException: No access to the given key
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir, Boolean is_volatile) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler..ctor (Microsoft.Win32.RegistryKey rkey, System.String basedir) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.KeyHandler.Lookup (Microsoft.Win32.RegistryKey rkey, Boolean createNonExisting) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.UnixRegistryApi.OpenSubKey (Microsoft.Win32.RegistryKey rkey, System.String keyname, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name, Boolean writable) [0x00000] in <filename unknown>:0 
  at Microsoft.Win32.RegistryKey.OpenSubKey (System.String name) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Microsoft.Win32.RegistryKey:OpenSubKey (string)
  at Audax.Validator.Boot.FrameworkVersionCheck.HasRequiredVersion () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.FrameworkVersionCheck.Check40Installed () [0x00000] in <filename unknown>:0 
  at Audax.Validator.Boot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

I can tell you that the crash is due to trying to check the (Windows) registry to see if .NET is installed. Since Ck2 is soon supporting Linux I guess I'd better try to get it to work with Mono, though it may take a while and the GUI may not be good, depending on what things are like (I know very little about Mono)
 
Hey Jamie, it's been a long time since I gave you some decent feedback, despite your tool being a lifesaver. Sorry about that! Here are some confirmed false positives:
  • spouse_even_if_dead is a valid character-to-character scope change similar to father_even_if_dead, but it of course scopes to the spouse instead.
  • dynasty = [#dynasty_id] doesn't work as a trigger, but it does work as a command. It will change the scoped character to the dynasty which corresponds to that numerical id.
  • set_name = "[new name]" is a valid command inside a title scope. It will rename that title to the new name inside the quotes.
  • add_weak_claim = [title_tag/FROM/PREV/ROOT etc] is a valid command inside a character scope. It will add a weak claim.
  • add_claim = [title_tag/FROM/PREV/ROOT etc]: same as above, for strong claims.
  • fertility = [0.0-1.0] will work as a character history command. It will also work inside a date clause, but right now the Validator rejects it when it's inside one.
  • real_father = [char_id] is a valid character history command. It specifies the real father, when the kid is secretly a bastard.
  • cuckoo_impregnate = [FROM/PREV/ROOT etc] is a valid command inside a character scope. It works the same as impregnate, but this will be the real father, while everybody think the father is the scoped woman's husband.
  • attacker is a valid war-to-character scope change. It scopes to the main attacker in the war.
  • defender: same as above, with the main defender.
  • add_betrothal = [FROM/PREV/ROOT etc] and break_betrothal = [FROM/PREV/ROOT etc] are both valid commands inside a character scope.
  • location is a valid siege-to-province scope change.
  • at_sea = [yes/no] is a valid trigger inside a character scope.
  • min_age = [age] and max_age = [age] are both valid arguments inside a create_character command (and any variations like create_random_soldier).
  • graphical_culture = [FROM/PREV/ROOT etc] is a valid trigger inside a character scope. It will check if the referenced character has the same graphical culture as the scoped character.
  • using_cb = [casus_belli_tag] is a valid trigger inside a war scope.

If you need any more info on any of these please ask. Thanks again for your great work!
 
New in 1.09.1:
is_holy_war = yes in scope CbTypeDef
used_for_random = no in scope Culture
 
In my experience, they're listed underneath the error.
 
One thing I'd recommend detecting:
The game will simply freeze if at campaign start if there's any patrician vassalized by someone who isn't a merchant republic. The issue is very difficult to track down without knowledge of it, so if the Validator could detect it it'd be fantastic.
 
Has anyone managed to get this running under Linux (via wine, mono, etc.) by any chance? I'm having no luck with wine and mono reports:

Ok, so I'm having problems even under Windows. I made a fresh 32-bit XP SP2 install, installed .NET 4.0 from the link in README, rebooted, and it still says: "Unable to find a version of the runtime to run this application."

Edit: Oh, I was trying to run the Validator.exe in the base folder, the one under App/ seems to run fine... What's the other one for?
 
Hey Jamie, it's been a long time since I gave you some decent feedback, despite your tool being a lifesaver. Sorry about that! Here are some confirmed false positives:
  • spouse_even_if_dead is a valid character-to-character scope change similar to father_even_if_dead, but it of course scopes to the spouse instead.
  • dynasty = [#dynasty_id] doesn't work as a trigger, but it does work as a command. It will change the scoped character to the dynasty which corresponds to that numerical id.
  • set_name = "[new name]" is a valid command inside a title scope. It will rename that title to the new name inside the quotes.
  • add_weak_claim = [title_tag/FROM/PREV/ROOT etc] is a valid command inside a character scope. It will add a weak claim.
  • add_claim = [title_tag/FROM/PREV/ROOT etc]: same as above, for strong claims.
  • fertility = [0.0-1.0] will work as a character history command. It will also work inside a date clause, but right now the Validator rejects it when it's inside one.
  • real_father = [char_id] is a valid character history command. It specifies the real father, when the kid is secretly a bastard.
  • cuckoo_impregnate = [FROM/PREV/ROOT etc] is a valid command inside a character scope. It works the same as impregnate, but this will be the real father, while everybody think the father is the scoped woman's husband.
  • attacker is a valid war-to-character scope change. It scopes to the main attacker in the war.
  • defender: same as above, with the main defender.
  • add_betrothal = [FROM/PREV/ROOT etc] and break_betrothal = [FROM/PREV/ROOT etc] are both valid commands inside a character scope.
  • location is a valid siege-to-province scope change.
  • at_sea = [yes/no] is a valid trigger inside a character scope.
  • min_age = [age] and max_age = [age] are both valid arguments inside a create_character command (and any variations like create_random_soldier).
  • graphical_culture = [FROM/PREV/ROOT etc] is a valid trigger inside a character scope. It will check if the referenced character has the same graphical culture as the scoped character.
  • using_cb = [casus_belli_tag] is a valid trigger inside a war scope.

If you need any more info on any of these please ask. Thanks again for your great work!

Added these, with the following exceptions
* set_name: This already seems to be there; can you post exact error message?
* cuckoo_impregnate: So this is not "impregnate_cuckoo" which I have in there for some reason?
* using_cb: This already seems to be in there, can you post exact?