IronyModManager icon indicating copy to clipboard operation
IronyModManager copied to clipboard

Victoria 3 Conflict Solver

Open KeinNiemand opened this issue 8 months ago • 8 comments
trafficstars

Having the conflict Solver for Victoria 3 would be pretty usefull to get more mods to work together, I was disapointed when I found out that the conflict solver only works for stellaris.

KeinNiemand avatar Mar 07 '25 16:03 KeinNiemand

As with requests for other conflict detection, there is a lack of community resources, such as the FIOS/LIOS list. If you've modded Stellaris, you're probably familiar with it. For more details on why there isn't a Conflict Solver for other games, refer to #271.

bcssov avatar Mar 08 '25 02:03 bcssov

Strange that this stuff not documented for other games, is a FIOS/LIOS list absolutely required? I mean yes you do need that for the conflict solver to tell you what thing takes priority currently and what the actual final override of a thing is but can't you just let it tell you something like X is defined by mod A and B but which ones currently in use is unknown, then for the patch it could just full override everything you modified (in the process you'd have to tell it which version to use) it needs to so only on definition of any given thing exists once. You'd also have an option to leave things as is, in that case it won't touch that thing, leaving both conflicting definitions and letting whatever override happen.

Like theoretically knowing FIOS/LIOS isn't strictly required to just detect conflicts and letting you diff/merge stuff.

KeinNiemand avatar Mar 10 '25 15:03 KeinNiemand

It's required because Irony has to know what kind of filename to generate for the output to ensure it's resolution wins in the end and forces the game to use it.

Lastly, I don't own the game and am not honestly interested in Vicky 3. Games that I own have conflict analysis to some part: Stellaris (full), Hearts of Irony 4 (readonly).

bcssov avatar Mar 10 '25 15:03 bcssov

Can't you juts forcecebly win the resoltuon by doing full file override in the patch mods? ExampleMod1 overrides event A in foo.txt file ExampleMod2 overrides event A in bar.txt file both foo and bar contain lots of other events that don't conflict or that you want to keep in the default resolution. What Irony could do in Generate both a new foo.txt and bar.txt, but completely delete the definition of even A from the file from both and instead define the resolved event in patch.txt or whatever. If that isn't enough you could do a merge of some kind so that the original foo.txt and bar.txt no longer get loaded at all instead you got one merge mod containing foo.txt, bar.txt (without any definition for event A) and patch.txt

KeinNiemand avatar Mar 11 '25 08:03 KeinNiemand

We could do that but I am not sure if Irony script parser can handle vicky 3. See the linked ticket what else is needed.

bcssov avatar Mar 13 '25 05:03 bcssov

Putting this here from discord. Info provided by Bahmut | Chris author of pdx-deepl https://discord.com/channels/378985949373399040/692727670408085525/1355124353091637380:

I have collected the load order rules for both CK3 and Victoria 3. Both are the same except for one minor difference in the events

Base Rules

These are the rules that apply generally about overwriting files, types, and mods. Some of them have exceptions. Those will be listed below.

Base Game File Overwrites

everywhere When a file has the exact same filename and path as one in the base game, it completely overwrites it. This means if the modded file contains less or different content only that will be loaded.

Mod Overwrites

everywhere When two mods use the same filename and path, they overwrite each other the same as base game overwrites. What is different here is that the order inside the launcher playlist determines, which mod is loaded first. The load order is from top to bottom. So a mod lower in the list overwrites another mod that is higher on the list if they both have conflicting files.

File and Type load order

Inside a mod or between mods that do NOT use the same filenames load order is determined in alphabetical order of files in a folder. So if there are two files in game/common/buildings/ and they are named 00_buildings.txt and 01_more_buildings.txt the file starting with 00 is loaded first and then the file starting with 01 is loaded after that. If both files have different types in them, that makes no difference. But if they have the same type (building in this case) defined, the later loaded file will win. For example, if both files listed above have this building defined in them:

building_university = {
    # Some building definition
}

The latter loaded files building definition will be used. The first one will be totally overwritten. This only applies on a type level, so any other type NOT defined in both files will be loaded normally.

Exceptions

There are a few exceptions to the rules defined above.

GUI Types

game/gui/ When a GUI type or template (NOT types) is loaded it cannot be overwritten. So the one that is loaded first wins and is used. Otherwise, the rules defined above still apply. Example GUI type and template:

types gate_main_panel_types {
    type gate_main_panel = default_block_window {
        # Some gui stuff
    }
}

template test {
  # Some gui stuff
}

NOTE: The types container in the example above does not need to be unique and has no overwriting logic at all.

Events

game/events/ Events follow the same logic as GUI types in that the first one loaded wins. So an event loaded in a file that is loaded before another file with the same event is used. Not the last one defined as other definitions.

Defines

game/common/defines/ Defines allow for replacing single defines without replacing the whole define category:

NSomeCategory = {
    A_SINGLE_DEFINE = X
}

This is allowed and will only change the one define in the category.

On Actions

game/common/on_actions/ On Actions allow for appending more on_actions/events/random_events But they don't allow for replacing the on actions's trigger/effect blocks without replacing the whole file.

This works:

# Base game on action
on_monthly_pulse = {
  on_actions = {
    some_custom_on_action
  }
}

# Modded on action
some_custom_on_action = {
  limit = {
    # Trigger logic
  }
  effect = {
    # Effect logic
  }
}

This produces errors and overwrites the base game effect:

on_monthly_pulse = {
  effect = {
    # Effect logic
  }
}

Localizations

game/localization/ To overwrite single localization keys they need to be defined in the game/localization/{language}/replace folder. Full file overwrite still work and later loaded localization keys DO NOT overwrite the previously defined ones. But the replace folder wins over them.

DNA Data

game/common/dna_data/ Defined characters do not overwrite each other but produce duplicates. Only file overwrites properly replace a character.

If you need any more information please ping me and I will look into them. When you have a working branch I can test and refine it for you if you want since I can program C#.

bcssov avatar Mar 28 '25 17:03 bcssov

Hi all,

I am Bahmut from Discord. If you guys need any more info on this, just ping me in this Issue or via Discord.

Also I can do testing when you got something close to stable and maybe even touch up issues I find since I have already worked with C#. I simply do not have the time at the moment to fully implement the feature myself so would keep it to touch ups.

Regards,

Chris

kaiser-chris avatar Apr 16 '25 10:04 kaiser-chris

Forgot to reply to this, I am busy with other projects therefore this is on hold for the foreseeable future.

bcssov avatar Apr 30 '25 20:04 bcssov