myomer system COMPLETE -- the 'WAVE 6 mover cutover' was a phantom built on

a misattribution; the authentic couplings are all live

THE CORRECTION [T1]: @004b9550/@004b95b8 ('ConnectToMover'/'Disconnect
FromMover') are MechWeapon::ConfigureMappables/ChooseButton -- their +0x31C
is the weapon TriggerState and **(mech+0x128) is the CONTROLS MAPPER's
button roster (the MECHWEAP.CPP assert string + the trigger-edge detector
@004b9608 sit adjacent in the image).  The binary has NO dynamic myomer->
speed feed: AvailableOutput has exactly TWO callers in the whole image --
RegisterMaxOutput (assembly) and the SeekVoltageGraph sampler -- and
speedEffect@0x31C is a published GAUGE attribute.

The authentic myomer system (now fully live):
1. drive heat (#85, this morning);
2. VITAL death -- myomers are the only authored vital=1 subsystem
   (BTL4.RES res+0x48 scan): destroying them kills the mech via the #80
   vital-crit path (this is also the ram-death mechanism -- myomers are a
   0.35-weight collision-rattle target);
3. the assembly-time gait cap: RegisterMaxOutput @004b8ef0 raises
   mech+0x7A0 to AvailableOutput(top gear) = base x ~1.4284 -- now called
   (idempotent max, per tick; the 0x358 layout lock leaves no latch room)
   with real OwnerBaseSpeed/OwnerMaxSpeed bridges; the old per-frame
   reverseSpeedMax2 heal that would have clobbered it is garbage-guarded;
4. the ENG-page power curve at correct absolute scale (real base speed);
5. electrical sourcing (low gears run on a browned-out generator).

REMOVED (inventions): the mechmppr `speedDemand *= speedEffect` demand
multiplier + BTMyomersDriveOf + the Myomers ConnectToMover/MoverAttach
family.  Damaged-but-alive myomers heat faster and drop the power curve
but do NOT slow the mech (gitea #75's premise is falsified by the binary;
the real damage slowdown is the LEG-damage gimp gait).  Seek gears change
heat/sourcing/graph -- never speed.

Verified live: a mech at myomer dmg=0.234 (speedEffect attr 0.766)
beelines at full commanded speed with dmgGain=1.234 heat; 0 faults.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Zh7PTkFy4KwTzVighLR9J
This commit is contained in:
Joe DiPrima
2026-07-31 09:17:31 -05:00
co-authored by Claude Fable 5
parent 31552c0444
commit cf8618bcb9
6 changed files with 142 additions and 126 deletions
+31 -4
View File
@@ -1636,6 +1636,30 @@ void BTMechMyomerMotionSample(void *mech_v,
*gravity = (env != 0) ? (float)env->gravityConstant : 0.0f;
}
// Myomer owner speed-cell bridges (myomer-system completion, 2026-07-31):
// Mech+0x34C = the run-speed base the mapper multiplies demand by (port
// member `reverseStrideLength` -- documented misnomer), the
// base AvailableOutput scales by;
// Mech+0x7A0 = the gait rise-CLAMP (port member `reverseSpeedMax2` --
// misnomer) that Myomers::RegisterMaxOutput raises to
// AvailableOutput(top gear) = base x ~1.4284.
float BTMechRunSpeedBase(void *mech_v)
{
Mech *m = (Mech *)mech_v;
return (m != 0) ? (float)m->reverseStrideLength : 0.0f;
}
float BTMechTopSpeedGet(void *mech_v)
{
Mech *m = (Mech *)mech_v;
return (m != 0) ? (float)m->reverseSpeedMax2 : 0.0f;
}
void BTMechTopSpeedSet(void *mech_v, float v)
{
Mech *m = (Mech *)mech_v;
if (m != 0)
m->reverseSpeedMax2 = (Scalar)v;
}
//###########################################################################
// MechDeathHandler effect-spawn bridge (mechdmg.cpp calls this)
//
@@ -3944,10 +3968,13 @@ void
// reverseSpeedMax2@0x7a0 is the run-cycle bodyCycleSpeed CLAMP (AdvanceBody
// Animation case 12/13); LoadLocomotionClips does not set it -> it reads
// 0xCDCDCDCD (-4.3e8) and the clamp clobbers bodyCycleSpeed -> the run cycle
// explodes. Bring-up: clamp the run cadence to the run stride (reverseStride
// Length, the case-12 divisor) so bodyCycleSpeed/reverseStrideLength ~ 1, like
// walk. (The authentic value comes from the model/LoadLocomotionClips.)
reverseSpeedMax2 = reverseStrideLength;
// explodes. GARBAGE-GUARDED only (myomer completion 2026-07-31): the
// authentic writer is Myomers::RegisterMaxOutput -- ctor zeroes it, each
// myomer raises it to AvailableOutput(top gear) = base x ~1.4284 -- and the
// old unconditional per-frame heal CLOBBERED that registration back to
// base x 1.0 every frame. Heal only a value that is clearly uninit junk.
if (reverseSpeedMax2 < 0.001f || reverseSpeedMax2 > 500.0f)
reverseSpeedMax2 = reverseStrideLength;
// Gait SELECTION by throttle: walk aims for walkStrideLength; run aims for
// reverseSpeedMax (the run/reverse cap). Exceeding walkStrideLength makes the
// walk handler transition "up" to the run cycle (state 11 -> 12/13) via the real