From e1c3f2db6afb76b954c788831072ae09f6686aee Mon Sep 17 00:00:00 2001 From: Joe DiPrima Date: Thu, 6 Aug 2026 09:21:28 -0500 Subject: [PATCH] Myomer factor: correct the false 'feeder unreconstructed' claim + wire the crouch gate to the LIVE drive value The myomer system was ALREADY COMPLETE (2026-07-31 seek audit): Performance wrapper @004b8b9c, AvailableOutput @004b8ac0 (gear clamp x quadratic heat degrade x (1 - zone damage)), and the master-perf chain walk + speedDemand scale + turn freeze in mechmppr.cpp:990 -- the same @0x4a9cf2-0x4a9da4 bytes the crouch dig re-decoded. The 2026-08-05 banners calling the feeder dark were an export-gap-blind grep (named members, not offsets). Fixes: mechmppr publishes the chain MAX into mech->myomerEffectiveness (the binary's +0x79C home) so the crouch posture gate reads the live factor (dead/overheated myomers now genuinely refuse squat/rise -- previously the gate read a neutral 1.0 and never fired); the duplicate speedDemand multiply in the posture block is removed (mechmppr's is the one application); banners and locomotion.md corrected. Squat re-benched green on the live wiring. Co-Authored-By: Claude Fable 5 --- context/locomotion.md | 7 ++++++- game/reconstructed/mech.hpp | 13 +++++++------ game/reconstructed/mech4.cpp | 26 +++++++++++++------------- game/reconstructed/mechmppr.cpp | 5 +++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/context/locomotion.md b/context/locomotion.md index 7fa4fdf..ad1427b 100644 --- a/context/locomotion.md +++ b/context/locomotion.md @@ -322,7 +322,12 @@ for FREE (screenshot receipt: the crouched crimson madcat from the observer's co duckmpA_031). Clip data verified from BTL4.RES (root joint drops -2.22, knees +-1.14; squ/sqd are exact mirrors; interior 'squi/sqdi' variants ship for all 8 chassis). Full solo cycle benched (BT_BTNTEST + BT_BTNTEST2): squat -> hold (joints steady for minutes) -> rise -> -standing zeros. Myomer speed-cripple feeder (@004b8be3) still deferred [T3] -- see mech4 banner. +standing zeros. Myomer factor: LIVE, not deferred -- the 2026-08-05 "feeder unreconstructed" claim was an +export-gap-blind grep (the members are NAMED: speedEffect@0x31C, myomers.cpp; the chain walk + +speedDemand scale + turn freeze = mechmppr.cpp:990, the 2026-07-31 seek audit, same bytes). +mechmppr now publishes the chain MAX into mech->myomerEffectiveness (the binary's +0x79C home) +so the crouch gate reads the live value: dead/overheated myomers (the Oracle seek-4 freeze) +refuse the squat AND the rise. The pilot's EYE drops too -- the task-#15 bob channel (gBTEyeBobY <- jointlocal.y each frame) carries the parked -2.22 into DPLEyeRenderable (log receipt bob=-2.2187 through the hold; frame receipt duckcp_030 = grass-level view). A false "eye does not drop" residual was briefly filed diff --git a/game/reconstructed/mech.hpp b/game/reconstructed/mech.hpp index 0260d23..e02f491 100644 --- a/game/reconstructed/mech.hpp +++ b/game/reconstructed/mech.hpp @@ -1036,12 +1036,13 @@ protected: // (0 none / 1 may-duck / 2 holding-squat), computed per // master frame (FUN_004a9b5c @0x4a9f61-0x4aa007; the // CROUCH reconstruction, 2026-08-05) - Scalar myomerEffectiveness; // binary @0x79c -- init 0 then MAX over the heatable - // chain's +0x31c each master frame; scales the mapper - // speedDemand (dead myomers cripple the walk) and gates - // the crouch. FEEDER (Myomers Performance @004b8be3, - // not in the export) UNRECONSTRUCTED -- the port holds - // the healthy 1.0 [T3]; see the mech4 posture block. + Scalar myomerEffectiveness; // binary @0x79c -- the master-perf myomer chain MAX + // (speedEffect@0x31C over the myomer subsystems), + // published LIVE each mapper update by mechmppr.cpp's + // drive-scale block (the 2026-07-31 seek-audit recon of + // the same @0x4a9cf2-0x4a9da4 bytes). Consumed by the + // crouch posture gate (mech4). Ctor 1.0 = pre-first- + // update default only. Scalar gimpSpeedMax; // @0x52c Scalar standSpeed; // @0x530 Scalar walkStrideLength; // @0x534 diff --git a/game/reconstructed/mech4.cpp b/game/reconstructed/mech4.cpp index 5357ded..7a272b9 100644 --- a/game/reconstructed/mech4.cpp +++ b/game/reconstructed/mech4.cpp @@ -4355,19 +4355,19 @@ void // (2) the posture selector (+0x3f8), (3) the DuckRequest consumer. // { - // (1) myomerEffectiveness (+0x79c): the binary inits 0 then MAXes - // the heatable chain's +0x31c (healthy myomers publish ~1.0; - // weapons park transient fireImpulse there) and multiplies the - // mapper's speedDemand -- dead muscles = a crawling mech. The - // WRITER (Myomers Performance @004b8be3) is not in the export and - // stays unreconstructed, so the member holds the ctor's healthy - // 1.0 and this multiply is a live no-op until that dig lands - // (neutral-value deferral, the role=NULL pattern). [T3 feeder] - { - MechControlsMapper *postureMppr = MappingMapper(); - if (postureMppr != 0) - postureMppr->speedDemand *= myomerEffectiveness; - } + // (1) myomerEffectiveness (+0x79c): LIVE. The master-perf myomer + // chain walk -- MAX speedEffect@0x31C -> speedDemand scale + the + // turn freeze -- was reconstructed 2026-07-31 (the seek audit) in + // mechmppr.cpp:990 from the SAME bytes (@0x4a9cf2-0x4a9da4), and + // the Myomers Performance/AvailableOutput (@004b8b9c/@004b8ac0: + // gear clamp x quadratic heat degrade x (1 - zone damage)) is + // complete in myomers.cpp. mechmppr publishes the chain MAX here + // (the binary's mech+0x79C store) each frame; the ctor's 1.0 only + // covers frames before the first mapper update. (A 2026-08-05 + // banner called this feeder unreconstructed -- an export-gap-blind + // grep missed the named members; corrected 2026-08-06. The + // duplicate speedDemand multiply that briefly lived here is gone + // -- mechmppr's is the one authentic application.) // (2) the posture selector (+0x3f8; feeds the map legend + the // duck arbiter). @0x4a9f61-0x4aa007: any non-zero movementMode diff --git a/game/reconstructed/mechmppr.cpp b/game/reconstructed/mechmppr.cpp index 985ef5d..4cf55fa 100644 --- a/game/reconstructed/mechmppr.cpp +++ b/game/reconstructed/mechmppr.cpp @@ -1018,6 +1018,11 @@ void if (myomers > 0) { speedDemand *= drive; // @0x4a9d63: in-place demand scale + // The binary keeps the chain MAX in mech+0x79C (@0x4a9d00-0x4a9d39) + // -- publish it so the CROUCH gate (mech4 posture block, 2026-08-06) + // reads the same live factor (dead/overheated myomers cannot squat + // or rise; the posture selector tests |factor| <= 1e-4). + mech->myomerEffectiveness = drive; if (fabsf(drive) <= 1.0e-4f) // @0x4a9d89 vs _DAT_004ab16c turnDemand = 0.0f; // @0x4a9d9e: mapper+0x12C -- the FREEZE }