refactor: data/modpack_rules → data/rules; auto-apply on resort path

The directory was misnamed — these are wsid-triggered sorting-rule
overlays, not modpack-specific. HellDrinx happens to be a modpack but
RV Interior Expansion isn't; both use the same generic mechanism.

Renames:
  data/modpack_rules/        → data/rules/
  _MODPACK_RULES_*           → _RULES_*
  _modpack_rules_for         → _auto_rules_for
  _parse_rules_with_modpacks → _parse_rules_combined
  _emit_modpack_rules_warnings → _emit_rules_applied_warnings
  warning tag "modpack-rules-applied" → "rules-applied"

Bug fix: /api/resort was passing {} rules to sort_mods, silently
dropping every auto-injected rule. The frontend runs an automatic
resort after each /api/sort (driven by localStorage branchSelections),
so the user always saw the resort output — where rv_expansion.txt's
loadAfter chain wasn't taking effect. Now resort goes through
_parse_rules_combined and emits rules-applied warnings the same way
/api/sort does.
This commit is contained in:
2026-05-04 16:31:50 +00:00
parent 3336b2f661
commit ae408ea437
3 changed files with 54 additions and 39 deletions

71
data/rules/helldrinx.txt Normal file
View File

@@ -0,0 +1,71 @@
; HellDrinx modpack — bundled sorting rules
; Triggers: HellDrinx FULL (3672556207), HellDrinx LITE (3662909244).
; Auto-injected by app.py:_auto_rules_for() when either trigger wsid is in
; the user's input. User-supplied rules are appended afterward and override
; these on conflicting keys.
;
; Source: HellDrinx FULL/LITE — keep this file in sync with the modpack's
; upstream sorting_rules.txt when it updates.
[PROJECTRVInterior42]
loadFirst=on
[TombBody]
loadAfter=SPNCC,SPNCCDetails,SPNCCDetailsHD,SpnHairAPI,SpnCloth,SpnOpenCloth,SPNCCFaces,SpnHair,FH,KATTAJ1_ClothesCore,KATTAJ1_Military,[J&G] Black Multicam Uniform,[J&G] British DPM Uniform,[J&G] Caution Pack,[J&G] Firefighter Uniform,[J&G] Neon Vandals Uniform,[J&G] SWAT Uniform,[J&G] Trauma Responder Uniform,[J&G] Umbrella Corp Uniform,[J&G] Alpine Multicam Uniform,[J&G] Desert Multicam Uniform,[J&G] Flecktarn Uniform,[J&G] Forest Multicam Uniform,[J&G] Jordan's Tailoring Buff,[J&G] MARPAT Camo Uniform,[J&G] XKU Uniform,AliceGear,CamisetasSeleccion,CerberusPack,DarkWpnSlings,EFTBP,GanydeBielovzki's Frockin Shirts n Ties,GanydeBielovzki's Frockin Splendor!,GanydeBielovzki's Frockin Splendor! Vol.2,GanydeBielovzki's Frockin Splendor! Vol.3,GanydeBielovzki's Frockin Splendor! Vol.4,GanydeBielovzki's Frockin Splendor! Vol.5,GanydeBielovzki's Frockin Wiseguys,H_E_C_U,HardwoodsTurnoutGear,KITTYOWO,LynxPack,MilitaryPonchosRELOADED,newclothesmodels,TwoWeaponsB,VanillaGearExpanded,zReApoPonchosB42,zReArmorPackBYKB42,ArmoredVests,ArmoredVestsPatch
loadLast=on
[TombBodyCustom]
loadAfter=TombBody
loadLast=on
[TombBodyTexDOLL]
loadAfter=TombBodyCustom
incompatibleMods=TombBodyTexNUDE,TombBodyTex
loadLast=on
[TombGothTexDOLL]
loadAfter=TombBodyTexDOLL
incompatibleMods=TombGothTexNUDE,TombBodyTexNUDE,TombBodyTex
loadLast=on
[TombGothHair]
loadAfter=TombBody,FH
[TombBodyCompat]
loadAfter=TombBody
loadLast=on
[TombWardrobeALT]
loadAfter=TombBody
loadLast=on
[Optimal]
loadLast=on
[Performance]
loadLast=on
[ProjectSummerCar]
loadAfter=VehicleRepairOverhaul,VehicleSalvageOverhaulB42
incompatibleMods=Ivmakk_RestoreEngineQuality
loadLast=on
category=undefined
[ItemretexturePSC]
loadLast=on
category=undefined
[VehicleRepairOverhaul]
loadBefore=ProjectSummerCar,Ivmakk_RestoreEngineQuality
incompatibleMods=SimpleAutoParts
loadLast=on
[VehicleSalvageOverhaulB42]
loadBefore=ProjectSummerCar,Ivmakk_RestoreEngineQuality
loadLast=on
[MoreDescriptionForTraits4213]
loadBefore=FIX_DetailedDescriptionsForOccupationsAndTraits
[HellDrinxJSONFix]
loadAfter=ItemretexturePSC,TombBodyCompat
loadLast=on
[HellDrinxTranslations]
loadAfter=ItemretexturePSC
loadLast=on
[HellDrinxBugFixes]
loadAfter=ItemretexturePSC,TombBodyCompat,TombWardrobeALT,HellDrinxStrangers,SpnCloth
loadLast=on
[HellDrinxEssentials]
loadLast=on
[HellDrinxBugFixesFirst]
loadFirst=on
[TACPDM2]
loadLast=on
[damnlib]
loadFirst=on

View File

@@ -0,0 +1,19 @@
; RV Interior Expansion (B42) — sorting rules
; Triggers:
; - 3618427553 (RVInteriorExpansion, map folder rvupdate)
; - 3622163276 (RVInteriorExpansionPart2, map folder rv2)
; Auto-injected by app.py:_auto_rules_for() when either trigger wsid is
; in the user's input. User-supplied rules are appended afterward and
; override these on conflicting keys.
;
; Authored ordering: PROJECTRVInterior42 → RVInteriorExpansion → RVInteriorExpansionPart2.
; The expansion mods don't declare these loadAfter relationships in their own
; mod.info, so without these rules sortof has nothing to base the cluster
; ordering on (PROJECTRVInterior42 is in PREORDER slot 7 already; expansions
; just need to chain off of it).
[RVInteriorExpansion]
loadAfter=PROJECTRVInterior42
[RVInteriorExpansionPart2]
loadAfter=RVInteriorExpansion