From e088555b96997dd68d478ac7e5689b72d09b4dca Mon Sep 17 00:00:00 2001 From: RT Date: Sat, 8 Aug 2026 16:47:29 -0500 Subject: [PATCH] Fix content defects found while decompiling V4H packages Three unrelated source-data bugs surfaced while round-tripping our own Content/Mechs tree against the decompiled V4H packages. All three were found because a decompiler verifier disagreed with the shipped data, not by inspection. Hellspawn / Sunder: unterminated section headers ------------------------------------------------- hellspawn.subsystems:101 [HeatSink10 -> [HeatSink10] sunder.subsystems:120 [HeatSink16 -> [HeatSink16] The notation parser keys a page on the bracketed name. With the closing bracket missing the page name is malformed, so that heat sink's block is not registered as its own page and its Model/ExecutionState/ InternalLocation keys are absorbed by the preceding page. Net effect: one heat sink silently missing from each mech (Hellspawn LeftTorso, Sunder LeftArm), and the preceding sink's location keys overwritten. CauldronBorn: undefined macro in TwistRadius -------------------------------------------- cauldronborn.torso:15 TwistRadius=$(OBSTUSE_TRADIUS) -> 100 OBSTUSE_TRADIUS is a typo and is defined nowhere in the define tables; the intended symbol is OBTUSE_TRADIUS (=140). An undefined macro does not fail loudly - the factory substitutes its own default - so this shipped for years as a silent fallback. Resolved to the literal 100 rather than $(OBTUSE_TRADIUS) because the compiled .torso record in the shipped package holds 100.0f, i.e. the factory default that has always been in effect. Using 140 would change long-standing behaviour; 100 preserves it and makes it explicit. Verified against the packaged record: verify_smallmodel now reports 1280/1280 keys. Lesson recorded: an undefined macro is not a build error here. Check what the compiled package actually holds before "correcting" a symbol name. Co-authored-by: Claude Opus 5 (Anthropic) Co-authored-by: GitHub Copilot --- Gameleap/mw4/Content/Mechs/CauldronBorn/cauldronborn.torso | 2 +- Gameleap/mw4/Content/Mechs/Hellspawn/hellspawn.subsystems | 2 +- Gameleap/mw4/Content/Mechs/Sunder/sunder.subsystems | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gameleap/mw4/Content/Mechs/CauldronBorn/cauldronborn.torso b/Gameleap/mw4/Content/Mechs/CauldronBorn/cauldronborn.torso index 1d9e0a95..fb8442ba 100644 --- a/Gameleap/mw4/Content/Mechs/CauldronBorn/cauldronborn.torso +++ b/Gameleap/mw4/Content/Mechs/CauldronBorn/cauldronborn.torso @@ -12,7 +12,7 @@ ArmRatioAngle=$(NORMAL_RATIO) TwistSpeed=$(NORMAL_TSPEED) PitchSpeed=$(NORMAL_PSPEED) -TwistRadius=$(OBSTUSE_TRADIUS) +TwistRadius=100 PitchRadius=$(WIDE_PRADIUS) CageJointName=joint_cage diff --git a/Gameleap/mw4/Content/Mechs/Hellspawn/hellspawn.subsystems b/Gameleap/mw4/Content/Mechs/Hellspawn/hellspawn.subsystems index c2295f1d..4173efd6 100644 --- a/Gameleap/mw4/Content/Mechs/Hellspawn/hellspawn.subsystems +++ b/Gameleap/mw4/Content/Mechs/Hellspawn/hellspawn.subsystems @@ -98,7 +98,7 @@ Model=Subsystems\HeatSinkSubsystem.data ExecutionState=NeverExecuteState InternalLocation=RightTorso -[HeatSink10 +[HeatSink10] Model=Subsystems\HeatSinkSubsystem.data ExecutionState=NeverExecuteState InternalLocation=LeftTorso diff --git a/Gameleap/mw4/Content/Mechs/Sunder/sunder.subsystems b/Gameleap/mw4/Content/Mechs/Sunder/sunder.subsystems index d4831747..89438878 100644 --- a/Gameleap/mw4/Content/Mechs/Sunder/sunder.subsystems +++ b/Gameleap/mw4/Content/Mechs/Sunder/sunder.subsystems @@ -117,7 +117,7 @@ Model=Subsystems\HeatSinkSubsystem.data ExecutionState=NeverExecuteState InternalLocation=RightArm -[HeatSink16 +[HeatSink16] Model=Subsystems\HeatSinkSubsystem.data ExecutionState=NeverExecuteState InternalLocation=LeftArm