Jump to content

Skimpy Armour Keyword Injector


Recommended Posts

Posted
8 hours ago, iampumpkin said:

Ah, I see. Didn't know they both use `Eli_Armour_Compendium.esp`. Then yes, merge can lead to strange results.

On the other hand, what alternative do we have? Just ignore the conflicting records? But then, which one to ignore? 1st one or the 2nd one? Probably, the script should report in the logs the ignored records, or even merged records (if bMERGE is true), because they are still conflicting (intentionally or not) and user should be aware that there is a potential error in the INIs.

 

It is similar to WARNs the script shows for unrecognized rules in the INI files. They are not necessary malformed. They are either malformed or just not supported by the script (while still supported by RobcoPatcher). The script shows WARNs for such INI rules and it is totally fine. Not an error, but a potential error that user should pay attention to.

E.g. these warnings:

[SAKR] INFO - Parsing SAKR config: C:\Games\Fallout 4 GOTY\Data\F4SE\Plugins\RobCo_Patcher\armor\LCC\lcc.ini
[SAKR] WARNING - Malformed line (no :keywordsToAdd=): filterByArmors=Deviously Cursed Wasteland.esp|D59A3:bipedSlotsToRemove=6
[SAKR] WARNING - Malformed line (no :keywordsToAdd=): filterByArmors=FO4_Basics.esp|180CD3:bipedSlotsToRemove=11

It is fine because script doesn't support `bipedSlotsToRemove` operation. But it is also a signal that I should probably keep `lcc.ini` when game starts to allow RobcoPatcher to apply it.
 
So, yeah, a similar warning for duplicated keys in .INI would be good.

That's what my latest revision does. It will either merge (as an option) or simply report the conflicts at the end. This permits the user to sort out the proverbial mess and select the records they want. The default is to do first wins and report. Turns out I had two exact copies of DLCCoast.ini leading to duplication. Still, it shows the script works.

Posted (edited)

I tested the latest version of the script. Great work!

One suggestion, though.
The report format could be improved to more clearly represent which 2 INIs exactly caused each conflict.

 

E.g. here is my report:
 

[SAKR]  =================================================
[SAKR]  95 records were targeted by multiple sources.
[SAKR]  Behaviour: First entry remains. Merge disabled.
[SAKR]  Check for competing collections
[SAKR]  E.g., Eli's base vs CCO lewd replacer variant).
[SAKR]  
[SAKR]          -= KEYWORD CONFLICT LOG BELOW =-
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000914E -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000914F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009151 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009152 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009153 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009E5B -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000806
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000EA36 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000EE79 -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000807
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000F04E -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000807
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000247C8 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000305BE -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000391E6 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0003A556 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812,SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00043331 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812,SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00046027 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00048234 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004885A -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004E698 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004FA88 -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000806,SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D3 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D4 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D9 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570DA -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00000F9A -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00000F9C -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00001737 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00001739 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173B -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173D -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173F -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A5 -> SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081E
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A7 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A9 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D44 -> SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|0000081C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D46 -> SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D48 -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D4A -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C86 -> SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C88 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8A -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8C -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|000026B0
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8E -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C90 -> SkimpyArmorKeywordResource.esm|0000080D,SkimpyArmorKeywordResource.esm|000026AF
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BC8 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BCA -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BCC -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B00 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B02 -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B04 -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00007A38 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000819,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000822
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00007A3A -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A03B -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A7D6 -> SkimpyArmorKeywordResource.esm|00000811
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A7D8 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000AF73 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000B70E -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000B710 -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000BEAB -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000BEAD -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000C648 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE3 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE5 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE7 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE9 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDEB -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDED -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000D587 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000DD22 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B2
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000DD24 -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F403 -> SkimpyArmorKeywordResource.esm|0000080C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F405 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F407 -> SkimpyArmorKeywordResource.esm|0000080F,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000FBA2 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001033D -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001033F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00010ADB -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821,SkimpyArmorKeywordResource.esm|00000822
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00010ADD -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00011278 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001127A -> SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001294F -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000130EC -> SkimpyArmorKeywordResource.esm|0000080F,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000130EE -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00013889 -> SkimpyArmorKeywordResource.esm|0000080C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000147C1 -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000147C3 -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00015E92 -> SkimpyArmorKeywordResource.esm|000026B4
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00017D35 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000184D1 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000184D3 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00018C6F -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940A -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940D -> SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000820,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001B28C -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001E026 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]         -= KEYWORD CONFLICT LOG ABOVE =-
[SAKR]  =================================================

 

Let's say I want to know which 2 INIs contain the duplicated DLCCoast.esm|0000914E record. From the report I only see the one of them: DLCCoast.ini. But where is the second one?


Now I'm forced to do a search in every .INI file the text DLCCoast.esm|00914E (note: the text in the INI is not normalized, i.e. contains less amount of zeroes, so it is different from what the script shows in the log, so can't be just copy/pasted into the search tool).

It would be great if the final report showed, for each conflict:

  • The conflicting key (DLCCoast.esm|0000914E). Or maybe even better to show non-normalized version to allow copy/paste and search it in the INI.
  • The winning rule (with the full INI-file name, including the path, and optionally the keywords added by it)
  • The losing rule (with the full INI-file name, including the path, and optionally the keywords added by it)


I.e. in my case it would be something like this:

 

[SAKR]  DLCCoast.esm|0000914E
[SAKR]  * Winning rule: armor\DLCCoast\DLCCoast.ini (Line 6) -> SkimpyArmorKeywordResource.esm|00081A,SkimpyArmorKeywordResource.esm|00080E
[SAKR]  *  Losing rule: armor\DLCRobot\DLCCoast.ini (Line 6) -> SkimpyArmorKeywordResource.esm|00081A,SkimpyArmorKeywordResource.esm|00080E

 

Also, it would be useful to silently ignore duplicates if they are complete duplicates (such as in the case above). I.e. the keywords are exactly the same. Which means this is not a real conflict, but just an excessive INI record, which doesn't cause any harm (except wasted CPU cycles to process it, hehe).

Edited by iampumpkin
Posted
11 minutes ago, iampumpkin said:

I tested the latest version of the script. Great work!

One suggestion, though.
The report format could be improved to more clearly represent which 2 INIs exactly caused each conflict.

 

E.g. here is my report:
 

[SAKR]  =================================================
[SAKR]  95 records were targeted by multiple sources.
[SAKR]  Behaviour: First entry remains. Merge disabled.
[SAKR]  Check for competing collections
[SAKR]  E.g., Eli's base vs CCO lewd replacer variant).
[SAKR]  
[SAKR]          -= KEYWORD CONFLICT LOG BELOW =-
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000914E -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000914F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009151 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009152 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009153 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00009E5B -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000806
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000EA36 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000EE79 -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000807
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0000F04E -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000807
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000247C8 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000305BE -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000391E6 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0003A556 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812,SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00043331 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812,SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00046027 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|00048234 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004885A -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004E698 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|0004FA88 -> SkimpyArmorKeywordResource.esm|00000802,SkimpyArmorKeywordResource.esm|00000806,SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D3 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D4 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570D9 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *DLCCoast.ini -> DLCCoast.esm|000570DA -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00000F9A -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00000F9C -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00001737 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00001739 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173B -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173D -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000173F -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A5 -> SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081E
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A7 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000035A9 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D44 -> SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|0000081C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D46 -> SkimpyArmorKeywordResource.esm|0000081A,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D48 -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00003D4A -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C86 -> SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C88 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8A -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8C -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|000026B0
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C8E -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00004C90 -> SkimpyArmorKeywordResource.esm|0000080D,SkimpyArmorKeywordResource.esm|000026AF
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BC8 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BCA -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00005BCC -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B00 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B02 -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00006B04 -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00007A38 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000819,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000822
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00007A3A -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A03B -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A7D6 -> SkimpyArmorKeywordResource.esm|00000811
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000A7D8 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000AF73 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000B70E -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000B710 -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000BEAB -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000BEAD -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000C648 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE3 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE5 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE7 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDE9 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDEB -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000CDED -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000D587 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000DD22 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B2
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000DD24 -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F403 -> SkimpyArmorKeywordResource.esm|0000080C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F405 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000F407 -> SkimpyArmorKeywordResource.esm|0000080F,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0000FBA2 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001033D -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001033F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00010ADB -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821,SkimpyArmorKeywordResource.esm|00000822
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00010ADD -> SkimpyArmorKeywordResource.esm|0000080A,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00011278 -> SkimpyArmorKeywordResource.esm|00000817,SkimpyArmorKeywordResource.esm|00000818,SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001127A -> SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001294F -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000130EC -> SkimpyArmorKeywordResource.esm|0000080F,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000130EE -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00013889 -> SkimpyArmorKeywordResource.esm|0000080C
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000147C1 -> SkimpyArmorKeywordResource.esm|0000080D
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000147C3 -> SkimpyArmorKeywordResource.esm|0000080A
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00015E92 -> SkimpyArmorKeywordResource.esm|000026B4
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00017D35 -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000184D1 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|000184D3 -> SkimpyArmorKeywordResource.esm|000026B5
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|00018C6F -> SkimpyArmorKeywordResource.esm|000026B1,SkimpyArmorKeywordResource.esm|000026B3
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940A -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081F,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940D -> SkimpyArmorKeywordResource.esm|0000081E,SkimpyArmorKeywordResource.esm|00000820,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001940F -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001B28C -> SkimpyArmorKeywordResource.esm|0000081B,SkimpyArmorKeywordResource.esm|0000081C,SkimpyArmorKeywordResource.esm|0000081D,SkimpyArmorKeywordResource.esm|00000821
[SAKR]  *HN66Fo4_TRS_SAK.ini -> HN66Fo4_TRS.esp|0001E026 -> SkimpyArmorKeywordResource.esm|0000080E,SkimpyArmorKeywordResource.esm|00000812
[SAKR]         -= KEYWORD CONFLICT LOG ABOVE =-
[SAKR]  =================================================

 

Let's say I want to know which 2 INIs contain the duplicated DLCCoast.esm|0000914E record. From the report I only see the one of them: DLCCoast.ini. But where is the second one?


Now I'm forced to do a search in every .INI file the text DLCCoast.esm|00914E (note: the text in the INI is not normalized, i.e. contains less amount of zeroes, so it is different from what the script shows in the log, so can't be just copy/pasted into the search tool).

It would be great if the final report showed, for each conflict:

  • The conflicting key (DLCCoast.esm|0000914E). Or maybe even better to show non-normalized version to allow copy/paste and search it in the INI.
  • The winning rule (with the full INI-file name, including the path, and optionally the keywords added by it)
  • The losing rule (with the full INI-file name, including the path, and optionally the keywords added by it)


I.e. in my case it would be something like this:

 

[SAKR]  DLCCoast.esm|0000914E
[SAKR]  * Winning rule: armor\DLCCoast\DLCCoast.ini -> SkimpyArmorKeywordResource.esm|00081A,SkimpyArmorKeywordResource.esm|00080E
[SAKR]  *  Losing rule: armor\DLCRobot\DLCCoast.ini -> SkimpyArmorKeywordResource.esm|00081A,SkimpyArmorKeywordResource.esm|00080E

 

Also, it would be useful to silently ignore duplicates if they are complete duplicates (such as in the case above). I.e. the keywords are exactly the same. Which means this is not a real conflict, but just an excessive INI record, which doesn't cause any harm (except lost CPU cycles to process it, hehe).

I agree with you, however the script does not track the location of every keyword. It only knows once it hits a conflict. Tracking likely means another parallel TStringList just for this purpose. 

 

Also agree about duplicates which is why I kept mine in place. Still no real reason to keep duplicate files. 

 

Something I can look into. Although things like notepad are naturally case-insensitive for searching. 

 

Did you have two copies of DLCCoast? in DLCRobots? I suspect that's the default for Rubber Duck's repository. 

Posted
21 hours ago, msmfoster said:

I agree with you, however the script does not track the location of every keyword. It only knows once it hits a conflict. Tracking likely means another parallel TStringList just for this purpose. 

Yes, but otherwise the report at the end is not really useful. Another idea is to track it right at the step of parsing INI files. So, you will still need an additional TStringList or two, but only until INIs are parsed. Then the logic will be identical to the current logic, probably even simplier as you will not need to track duplicates anymore because INI-parsing step will already track and remove/merge them.

 

 

21 hours ago, msmfoster said:

Also agree about duplicates which is why I kept mine in place. Still no real reason to keep duplicate files. 

 

Something I can look into. Although things like notepad are naturally case-insensitive for searching. 

The problem is not with case-sensitivity but with different number of zeroes in the FormID in its normalized form (with 8 characters) and the form in the INI files (with 6 characters, usually).

 

Also, I agree that there is no reason to keep duplicates, if they are yours. But if the duplicates come with some 3rd-party mods, it is a pain in the ass to carefulyl track/remove them, then after an update of such 3rd-party mod, do this all again. So, the reason to keep duplicates is just convenience, I suppose. :)

 

21 hours ago, msmfoster said:

Did you have two copies of DLCCoast? in DLCRobots? I suspect that's the default for Rubber Duck's repository.

Yes, exactly. This is the default state of `RD_SAKR_Repository`. It has:

  • armor\DLCCoast\DLCCoast.ini
  • armor\DLCRobot\DLCCoast.ini

Both files are exactly identical. So, one of them could be safely removed. But also could be safely kept. Which could be easier because they come with a 3rd party mod and I don't like to do changes in 3rd party mods. As soon as you do a change, you need to remember do it again and again when the mod is updated. So, just keep this duplicate is a good idea for me.

 

For the `HN66Fo4_TRS.esp` in my log the situation is a bit different, though. For some of these items the rules are identical. For others they are different. So, I must look more close to the differences and select which rule to keep. These rules (the ones with differences) are actually the only ones that are interested to me to see in the logs. Because for them I need to actively look and take some decision (which rule to remove, which to keep).

Posted

Rubber Duck's repository has not changed in years. So likely quite safe. 

 

Either way, this script requires periodic reruns if you make changes anyways. It's the name of how it works. 

 

Easiest way is to add a TStringList, change it to ORIGINAL -> CURRENT -> FORMID -> Rule Being Ignored  

 

There's also a setting you can adjust to avoid unknown changes. You can target a directory of your choosing with the .ini files you want. Max control and no unplanned changes. 

 

Rubber Duck's body morph tool pretty much encourages that. My script by default aligns with game folders because it's easier overall.

  • 1 month later...
Posted

[00:00] Error during Applying script "Fallout4 - SAKR Direct Injection v1.0.1": Error in unit 'SAKR_Direct_Injection' on line 1615 : Undeclared Identifier 'FileByName'

Posted
7 hours ago, fanyudexin said:

[00:00] Error during Applying script "Fallout4 - SAKR Direct Injection v1.0.1": Error in unit 'SAKR_Direct_Injection' on line 1615 : Undeclared Identifier 'FileByName'

FileByName is a comparatively recent addition to FO4Edit built-in functions. If you are not using 4.1.5f or above then you have two choices:

  • Update the 4.1.5f which will remedy this error.
  • Revert to an older version of this function. This comes with risks since other functions could require the same type of treatment.
// Change this line (around Initialize):
cPatchFile := FileByName(sPATCH_ESP);

// to:
cPatchFile := GetFileByName(sPATCH_ESP);

 

If you are running 4.1.5f then you likely have a corrupted version (missing helper scripts). Re-installed FO4Edit and see if this fixes everything.

  • 2 months later...
Posted (edited)

Update - ahem. I missed a requirement...  This is probably the problem...

 

And it was. All good thanks!

Edited by Bluegunk
  • 2 months later...
Posted
4 hours ago, Hatoc123 said:

I saw your post saying that this works with Robco Patcher but just out of curiosity is this still needed if robco patcher is up to date now?

Needed is relative, and with every update to AE you could end up with a non-working system. Ultimately this bypasses RobCo Patcher, which means you might not need it at all. This handles ESL and ESL-ified ESPs without any concern and saves you from dealing with the injection at runtime. So, its not needed but it can make your life easier. 

 

I still use it because this way I don't even need to have RobCo Patcher installed. Hope this helps?

Posted
17 hours ago, msmfoster said:

Needed is relative, and with every update to AE you could end up with a non-working system. Ultimately this bypasses RobCo Patcher, which means you might not need it at all. This handles ESL and ESL-ified ESPs without any concern and saves you from dealing with the injection at runtime. So, its not needed but it can make your life easier. 

 

I still use it because this way I don't even need to have RobCo Patcher installed. Hope this helps?

Yeah it helps thanks I'll just keep it for now then as I use Robco for other mods

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...