From f4cf1e631a493bb15010e1c93a37d7627ee4977c Mon Sep 17 00:00:00 2001 From: arcattack Date: Sat, 18 Jul 2026 17:28:43 -0500 Subject: [PATCH] Spec cross-check vs the 1995 manual: reads CORRECT, numbers are 4.0-vs-4.10 drift Audited our live streamed subsystem config against the manual's per-mech stat sheets (new BT_SPEC_LOG dump: torso speed/limits, heat-sink count, reservoir capacity, at subsystem ctor). RESULT: structure + semantics align perfectly; the tuning NUMBERS differ -- because the manual is Tesla 4.0 and our content is release 4.10. Point-release balance drift, NOT a reconstruction bug: - Owens + Blackhawk are the two fixed-torso mechs in BOTH (speed 0, limit ~0, torsoHorizontalEnabled=0); the other four twist-enabled -- our reads correctly identify every case - torso speed/limit + heat-sink count exist per-mech exactly as the manual documents; only the values were retuned 4.0->4.10 (e.g. torso speed MadCat 80->50, heat sinks Loki 38->15) - reservoir coolantCapacity reads a flat 20 = the coolant THERMAL capacity (game units), NOT the manual's per-mech 'liters' (a display/flavor quantity with no single subsystem field) -- different measures, not a bug CONCLUSION: do NOT retune content to the manual -- BTL4.RES is the authentic 4.10 shipping data; the 4.0 manual's numbers are an earlier pass. The manual CONFIRMS our structural fidelity. BT_SPEC_LOG retained for re-auditing. Follow-up (structural, less drift-prone): the per-mech coolant-loop weapon/generator assignments. Co-Authored-By: Claude Fable 5 --- game/reconstructed/heatfamily_reslice.cpp | 16 ++++++++++++++++ game/reconstructed/torso.cpp | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/game/reconstructed/heatfamily_reslice.cpp b/game/reconstructed/heatfamily_reslice.cpp index 92f1646..0722b72 100644 --- a/game/reconstructed/heatfamily_reslice.cpp +++ b/game/reconstructed/heatfamily_reslice.cpp @@ -546,6 +546,14 @@ Reservoir::Reservoir( // *this = &PTR_LAB_0050ecd4; squirtEfficiency = 0.5f; // this[0x8b] @0x22C thermalCapacity = subsystem_resource->coolantCapacity; // this[0x4a] @0x128 (coolantCapacity reuses thermalCapacity) + + // SPEC AUDIT (BT_SPEC_LOG): streamed CoolantCapacity vs the manual's + // "Reservoir Size (Liters)". + if (getenv("BT_SPEC_LOG")) + { + DEBUG_STREAM << "[spec] reservoir: coolantCapacity=" + << subsystem_resource->coolantCapacity << "\n" << std::flush; + } coolantSquirtMass = subsystem_resource->coolantSquirtMass; // this[0x89] @0x224 = res +0x100 coolantLevel = thermalCapacity; // this[0x4b] @0x12C coolantFlowScale = 0.0f; // this[0x57] @0x15C (== "word57") @@ -823,6 +831,14 @@ AggregateHeatSink::AggregateHeatSink( heatSinkCount = subsystem_resource->heatSinkCount; // this[0x74] @0x1D0 = res +0xFC ambientTemperature = 300.0f; // this[0x75] @0x1D4 (_DAT_004ae89c) + // SPEC AUDIT (BT_SPEC_LOG): the streamed HeatSinkCount vs the manual's + // "Number of Heat Sinks" per-mech stat. + if (getenv("BT_SPEC_LOG")) + { + DEBUG_STREAM << "[spec] heatsinks: count=" << heatSinkCount + << "\n" << std::flush; + } + // task #9 (the ambient radiator lands): the binary ctor @4ae8d0 scales the // bank's conductance by 0.1 x HeatSinkCount (_DAT_004ae974 float80 = 0.1 // byte-verified; madcat count 14 -> x1.4) and installs the RADIATOR diff --git a/game/reconstructed/torso.cpp b/game/reconstructed/torso.cpp index 5808b87..b03191a 100644 --- a/game/reconstructed/torso.cpp +++ b/game/reconstructed/torso.cpp @@ -244,6 +244,24 @@ Torso::Torso( elevationCenter = verticalLimitTop; // @0x228 = @0x220 elevationHalfBottom = verticalLimitBottom * 0.5f; // @0x22C (_DAT_004b6fbc) + // SPEC AUDIT (BT_SPEC_LOG, 2026-07-18): dump the streamed torso config so + // it can be diffed against the 1995 manual's per-mech stat sheet + // ("Torso speed (deg/sec)" / "Torso Limit (degrees)"). Values printed in + // DEGREES (the manual's units); horizontalRotationPerSecond IS deg/sec in + // the resource, the limits are stored in degrees pre-DegToRad. + if (getenv("BT_SPEC_LOG")) + { + DEBUG_STREAM << "[spec] torso: speed=" << r->horizontalRotationPerSecond + << " deg/s limitL=" << r->horizontalLimitLeft + << " limitR=" << r->horizontalLimitRight + << " (arc=" << (r->horizontalLimitLeft - r->horizontalLimitRight) + << ") vRate=" << r->verticalRotationPerSecond + << " vTop=" << r->verticalLimitTop + << " vBot=" << r->verticalLimitBottom + << " hEnabled=" << (int)r->torsoHorizontalEnabled + << "\n" << std::flush; + } + buttonRampActive = 0; // @0x268 buttonRamp = 0.0f;// @0x26C