• 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.
Thanks, I'll see if I find any false positives. If I do I'll edit them into this post.

Edit:
At <mod>\common\buildings\ca_shipyard.txt [castle\ca_shipyard_2] (Line 19, Column 2):
Invalid node "port" in scope BuildingDef (value is: yes)
port = yes is a valid thing for a building as of the 1.101 beta patch.

At <mod>\common\buildings\ct_trade_post.txt [city\ct_trade_post_5] (Line 109, Column 2):
Invalid node "military_techpoints" in scope BuildingDef (value is: 0.05)
Perfectly valid, though not used in vanilla. Same effect as the other techpoint stuff, just for military.

At <mod>\decisions\PB_various.txt [decisions\create_hre_france\effect\any_demesne_title\limit\OR\de_jure_liege] (Line 289, Column 7):
"e_hre" is not a valid ThisChar or ThisTitle.
Checking de_jure_liege = e_hre from any_demesne_title is perfectly valid.

At <mod>\history\titles\k_france.txt [987.7.3] (Line 86, Column 1):
Invalid node "reset_adjective" in scope DateClause (value is: yes)
Entirely valid to do to a title, including in the history files.

At <mod>\history\titles\k_france.txt [987.7.3] (Line 86, Column 1):
Invalid node "reset_name" in scope DateClause (value is: yes)
See above.

At <mod>\history\titles\k_france.txt [936.1.15] (Line 71, Column 1):
Invalid node "adjective" in scope DateClause (value is: WEST_FRANCIA_ADJ)
See above.

At <mod>\history\titles\k_france.txt [936.1.15] (Line 71, Column 1):
Invalid node "name" in scope DateClause (value is: WEST_FRANCIA)
See above.

That should be everything.
 
Last edited:
Does this look at save files?
 
I had a non-detected double entry of a kingdom in my files (had to painfully figure it out flag by flag xD) with the newest RC.

The kingdoms were defined in separate .txt files in the landed_titles folder
 
Last edited:
Does this look at save files?
Nope. That can be done if there is enough interest; I believe one person expressed their interest recently so you'd be the second.

Thanks, I'll see if I find any false positives. If I do I'll edit them into this post.

Edit:
At <mod>\common\buildings\ca_shipyard.txt [castle\ca_shipyard_2] (Line 19, Column 2):
Invalid node "port" in scope BuildingDef (value is: yes)
port = yes is a valid thing for a building as of the 1.101 beta patch.

At <mod>\common\buildings\ct_trade_post.txt [city\ct_trade_post_5] (Line 109, Column 2):
Invalid node "military_techpoints" in scope BuildingDef (value is: 0.05)
Perfectly valid, though not used in vanilla. Same effect as the other techpoint stuff, just for military.

At <mod>\decisions\PB_various.txt [decisions\create_hre_france\effect\any_demesne_title\limit\OR\de_jure_liege] (Line 289, Column 7):
"e_hre" is not a valid ThisChar or ThisTitle.
Checking de_jure_liege = e_hre from any_demesne_title is perfectly valid.

At <mod>\history\titles\k_france.txt [987.7.3] (Line 86, Column 1):
Invalid node "reset_adjective" in scope DateClause (value is: yes)
Entirely valid to do to a title, including in the history files.

At <mod>\history\titles\k_france.txt [987.7.3] (Line 86, Column 1):
Invalid node "reset_name" in scope DateClause (value is: yes)
See above.

At <mod>\history\titles\k_france.txt [936.1.15] (Line 71, Column 1):
Invalid node "adjective" in scope DateClause (value is: WEST_FRANCIA_ADJ)
See above.

At <mod>\history\titles\k_france.txt [936.1.15] (Line 71, Column 1):
Invalid node "name" in scope DateClause (value is: WEST_FRANCIA)
See above.

That should be everything.

Fixed.

I had a non-detected double entry of a kingdom in my files (had to painfully figure it out flag by flag xD) with the newest RC.

The kingdoms were defined in separate .txt files in the landed_titles folder

Fixed.
 
So I'm assuming this should actually do something, but I just keep getting this, or similar, errors.

Code:
Beginning validation...
Beginning Bookmarks validation...
Bookmarks validation complete!
Beginning Buildings validation...

ec) EXCEPTION CONTEXT
ec) Validation Task: Buildings
Validation Key: Buildings
Validation Type: Audax.Validator.TypeExtension.DeclarativeValidatorJob



ERROR
System.InvalidOperationException: No string satisfying the select path ^\id\\[R] could be found.
   at Audax.Validator.Selection.StringSelector.SelectOne(ParentNode node)
   at Audax.Validator.ContextValidatorSystem.CallSearchPath.SearchForCalls(Document doc, CallSearchMethod searchMethod)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.CallSearch.ProcessPath(CFilePath path, Document doc, IList`1 stringSearches, Boolean enableNamespaces)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.FindCalls(IList`1 callSearch, IList`1 stringSearches, CFilePath path, Document doc)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.ProcessPath(CFilePath path, IList`1 idSearch, IList`1 callSearch, IList`1 stringSearches, IList`1 eventScopes)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.GetWorker()
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.get_worker()
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.LoadAll()
   at Audax.Validator.ContextValidatorSystem.ContextValidatorInfo.Load()
   at Audax.Validator.ContextValidatorSystem.ContextValidatorInfo.Validate(Context c, String key, ElementNode node, NodeFlags flags)
   at Audax.Validator.ContextValidatorSystem.ContextValidatorConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeExtension.DeclarativeValidatorJob.DeclarativeValidatorWorker.Validate(Context c)
   at Audax.Validator.TypeExtension.DeclarativeValidatorJob.ValidateOverride()
   at Audax.Validator.ValidatorJobBase.Validate()
   at Audax.Validator.ValidatorJob.Validate()
   at Audax.Validator.GameValidator.Validate(Action onEachValidatorCompleteAction)

Note, I have no idea how this thing is supposed to work, and I'm quite new to modding, it's entirely possible I'm making some dumb mistake.
 
So I'm assuming this should actually do something, but I just keep getting this, or similar, errors.

Code:
Beginning validation...
Beginning Bookmarks validation...
Bookmarks validation complete!
Beginning Buildings validation...

ec) EXCEPTION CONTEXT
ec) Validation Task: Buildings
Validation Key: Buildings
Validation Type: Audax.Validator.TypeExtension.DeclarativeValidatorJob



ERROR
System.InvalidOperationException: No string satisfying the select path ^\id\\[R] could be found.
   at Audax.Validator.Selection.StringSelector.SelectOne(ParentNode node)
   at Audax.Validator.ContextValidatorSystem.CallSearchPath.SearchForCalls(Document doc, CallSearchMethod searchMethod)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.CallSearch.ProcessPath(CFilePath path, Document doc, IList`1 stringSearches, Boolean enableNamespaces)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.FindCalls(IList`1 callSearch, IList`1 stringSearches, CFilePath path, Document doc)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.ProcessPath(CFilePath path, IList`1 idSearch, IList`1 callSearch, IList`1 stringSearches, IList`1 eventScopes)
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.ContextFileCrawlerPrototype.GetWorker()
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.get_worker()
   at Audax.Validator.ContextValidatorSystem.ContextFileCrawler.LoadAll()
   at Audax.Validator.ContextValidatorSystem.ContextValidatorInfo.Load()
   at Audax.Validator.ContextValidatorSystem.ContextValidatorInfo.Validate(Context c, String key, ElementNode node, NodeFlags flags)
   at Audax.Validator.ContextValidatorSystem.ContextValidatorConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.PlaceholderConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeCore.ChildConstraintSystem.ChildConstraint.Validate(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ValidateInstanceAsBase(Context c, NodeFlags flags)
   at Audax.Validator.TypeCore.ComplexConstraint.ComplexConstraintWorker.ElementValidate(Context c)
   at Audax.Validator.TypeCore.ComplexConstraint.ElementValidate(Context c)
   at Audax.Validator.TypeCore.Constraint.ElementValidate(Context c, ElementNode node)
   at Audax.Validator.TypeExtension.DeclarativeValidatorJob.DeclarativeValidatorWorker.Validate(Context c)
   at Audax.Validator.TypeExtension.DeclarativeValidatorJob.ValidateOverride()
   at Audax.Validator.ValidatorJobBase.Validate()
   at Audax.Validator.ValidatorJob.Validate()
   at Audax.Validator.GameValidator.Validate(Action onEachValidatorCompleteAction)

Note, I have no idea how this thing is supposed to work, and I'm quite new to modding, it's entirely possible I'm making some dumb mistake.

Are you using the testing version? The older one might have a bug that has since been fixed.

Otherwise, there is an error in your files somewhere (some event seems to be missing an ID entry), but of course the Validator should give you a friendly error message instead of crashing like this. I will look into this ASAP, and can you post any error messages you get that don't have "No string satisfying the select path ^\id\\[R] could be found." in them?
 
Generally I really love this tool. It helped me to iron out a great deal of small mistakes in the past.

The problem is the tag line "Find-errors-quickly-and-with-minimal-pain".
Currently finding errors comes with a big amount of pain. I am currently at 2600 "errors". Most of them are vanilla things, false positives, localisation issues or non-issues.
It would be nice if the tool had a mode where it only lists the game breaking stuff. Let's say someone migrates to 1.10 /1.101 and is missing the adjacencies entries. As long as he doesn't fix that the game won't load. Very important error. Many, many other listed errors will only make it more difficult to find the essential ones. Not everyone runs a ship as tight as Meneth does ;)
I would make different kinds of errors: warnings, errors, fatal errors and add an option to toggle them on and off.
 
Generally I really love this tool. It helped me to iron out a great deal of small mistakes in the past.

The problem is the tag line "Find-errors-quickly-and-with-minimal-pain".
Currently finding errors comes with a big amount of pain. I am currently at 2600 "errors". Most of them are vanilla things, false positives, localisation issues or non-issues.
It would be nice if the tool had a mode where it only lists the game breaking stuff. Let's say someone migrates to 1.10 /1.101 and is missing the adjacencies entries. As long as he doesn't fix that the game won't load. Very important error. Many, many other listed errors will only make it more difficult to find the essential ones. Not everyone runs a ship as tight as Meneth does ;)
I would make different kinds of errors: warnings, errors, fatal errors and add an option to toggle them on and off.
Do make sure you've got it set to "show mod errors" rather than "show all errors".
Also take a look at the settings file so you can hide some errors you don't need.

With the combination of the two I get "only" 366 errors.

On a related note, here's one false-positive:
At <mod>\common\cb_types\Vanilla CBs.txt [county_conquest\can_use_title\OR[1]\NOT\location] (Line 7354, Column 12):
Invalid node "continent" in scope ProvTrigger (value is: region_sahara)

ProvTrigger is exactly where one should be using the continent condition.
 
Another false-ish positive:
At <mod>\common\opinion_modifiers\00_opinion_modifiers.txt [opinion_claimant_adventure_target] (Line 2262, Column 1):
The string opinion_claimant_adventure_target was not found in localization.

Essentially, any opinion modifier that doesn't actually change opinion "opinion = 0" is just used to denote a target and similar, and is never visible in the game. In such cases, no localisation is therefore needed.
 
Another false-ish positive:
At <mod>\common\opinion_modifiers\00_opinion_modifiers.txt [opinion_claimant_adventure_target] (Line 2262, Column 1):
The string opinion_claimant_adventure_target was not found in localization.

Essentially, any opinion modifier that doesn't actually change opinion "opinion = 0" is just used to denote a target and similar, and is never visible in the game. In such cases, no localisation is therefore needed.

To make sure: the way the game knows when to hide an opinion is exactly when "opinion = 0"?

Generally I really love this tool. It helped me to iron out a great deal of small mistakes in the past.

The problem is the tag line "Find-errors-quickly-and-with-minimal-pain".
Currently finding errors comes with a big amount of pain. I am currently at 2600 "errors". Most of them are vanilla things, false positives, localisation issues or non-issues.
It would be nice if the tool had a mode where it only lists the game breaking stuff. Let's say someone migrates to 1.10 /1.101 and is missing the adjacencies entries. As long as he doesn't fix that the game won't load. Very important error. Many, many other listed errors will only make it more difficult to find the essential ones. Not everyone runs a ship as tight as Meneth does ;)
I would make different kinds of errors: warnings, errors, fatal errors and add an option to toggle them on and off.

For vanilla things, you can indeed use "show mod errors" as Meneth said. As for false positives, I try to fix them, but I am not always aware of when something is a false positive, so please let me know. Most localization issues and non-issues can be disabled with the ValidatorSettings.txt file, but I would claim that they are still errors, and so they do get found with minimal pain.

The problem with warnings/errors/fatal errors is that I am not a very good modder, so have no idea what is fatal or just a mere error as opposed to a warning. If someone wants, most of the validation is in text files, so it shouldn't be too hard to add warning/error/fatal levels by using flags (well, it would take a while to get familiar with things), but I personally don't have time to figure everything out.

Also, currently the validator files don't have any mention of "adjacency" in them so it may not even be checking adjacency files, I'll have to look into that.
 
Another false-ish positive:
At <mod>\common\opinion_modifiers\00_opinion_modifiers.txt [opinion_claimant_adventure_target] (Line 2262, Column 1):
The string opinion_claimant_adventure_target was not found in localization.

Essentially, any opinion modifier that doesn't actually change opinion "opinion = 0" is just used to denote a target and similar, and is never visible in the game. In such cases, no localisation is therefore needed.

Do make sure you've got it set to "show mod errors" rather than "show all errors".
Also take a look at the settings file so you can hide some errors you don't need.

With the combination of the two I get "only" 366 errors.

On a related note, here's one false-positive:
At <mod>\common\cb_types\Vanilla CBs.txt [county_conquest\can_use_title\OR[1]\NOT\location] (Line 7354, Column 12):
Invalid node "continent" in scope ProvTrigger (value is: region_sahara)

ProvTrigger is exactly where one should be using the continent condition.

Both fixed.

Also, some more map checking added.
 
Thanks, though somehow I ended up at 367 errors now when I had 360 in the last version.

Edit: One false positive:
At <mod>\common\cb_types\Vanilla CBs.txt [claim\can_use\ROOT\OR\dynasty] (Line 66, Column 5):
"25061" is not a valid ThisChar or OpinionClauseDefinedTypes.
1.10 allowed checking for a dynasty ID directly.

At <mod>\common\landed_titles\landed_titles.txt [k_shiite] (Line 352, Column 1):
Invalid node "caliphate" in scope KingTitleDef (value is: yes)
I'm pretty sure you can have any title be a caliphate; or at least any title above county level.
 
Last edited: