msmfoster Posted December 18, 2025 Author Posted December 18, 2025 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.
iampumpkin Posted December 19, 2025 Posted December 19, 2025 (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 December 19, 2025 by iampumpkin
msmfoster Posted December 19, 2025 Author Posted December 19, 2025 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.
iampumpkin Posted December 20, 2025 Posted December 20, 2025 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).
msmfoster Posted December 20, 2025 Author Posted December 20, 2025 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.
fanyudexin Posted January 24 Posted January 24 [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' 1
msmfoster Posted January 24 Author Posted January 24 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.
Bluegunk Posted March 31 Posted March 31 (edited) Update - ahem. I missed a requirement... This is probably the problem... And it was. All good thanks! Edited March 31 by Bluegunk
Hatoc123 Posted Saturday at 04:16 PM Posted Saturday at 04:16 PM 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?
msmfoster Posted Saturday at 08:25 PM Author Posted Saturday at 08:25 PM 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?
Hatoc123 Posted Sunday at 02:20 PM Posted Sunday at 02:20 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now