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
+14 -28
View File
@@ -969,31 +969,19 @@ void
speedDemand = -mech->reverseStrideLength * throttlePosition;
}
// #75 + #78: the DRIVE SCALE. The authentic coupling attached the
// myomers' speedEffect into the mech's mover, which multiplied every
// attached feed into its drive; the 2007 engine's mover has no feed
// roster, so the same multiplication is applied to the speed demand here.
// speedEffect is the wrapper's live 0..1 output (gear ratio, thermal
// curve, 1 - zone damage); a mech with no Myomers drives at 1.0.
// GIMP slowdown: the binary's real mechanism is the gimp gait machines
// (FUN_004a5bf8/71f4/6344/7970) -- the LIVE demand is clamped to the wg
// clip's speed (GimpLegClipFinished writes it back) and the limp cycle
// cadence enforces it; an EXTRA multiply here would double-slow. The
// earlier T3 0.5 stand-in is therefore retired; BT_GIMP_SPEED remains as
// an optional override multiplier (unset = 1.0 = authentic).
// (The myomer `speedDemand *= speedEffect` DRIVE SCALE is GONE -- myomer-
// system completion, 2026-07-31. It was an invention built on the
// ConnectToMover misattribution: the binary has NO dynamic myomer->speed
// coupling. AvailableOutput's only callers are RegisterMaxOutput (the
// assembly-time gait cap, now live via MyomersSimulation) and the ENG-page
// graph sampler; damaged-but-alive myomers heat faster and drop the power
// curve but do NOT slow the mech, and DESTROYED myomers KILL it (the
// authored vital flag + the #80 vital-crit death). GIMP slowdown: the
// binary's real mechanism is the gimp gait machines -- the LIVE demand is
// clamped to the wg clip's speed and the limp cadence enforces it;
// BT_GIMP_SPEED remains as an optional override multiplier (unset = 1.0 =
// authentic).)
{
extern Scalar BTMyomersDriveOf(void *subsystem);
Scalar drive = 1.0f;
int n = mech->GetSubsystemCount();
for (int i = 2; i < n; ++i) // 0/1 = mapper + voltage bus
{
Scalar f = BTMyomersDriveOf(mech->GetSubsystem(i));
if (f >= 0.0f) // -1 = not a Myomers
{
drive = f;
break;
}
}
extern int BTMechGimpLevel(void *mech_v); // mechdmg.cpp (the TU-safe read)
int mm = BTMechGimpLevel(mech); // the gimp cell (see above)
if (mm == 3 || mm == 4)
@@ -1005,17 +993,15 @@ void
s_gimp = (e != 0 && *e != '\0') ? (Scalar)atof(e) : 1.0f; // 1.0 = authentic (clamp lives in the gimp SM)
if (s_gimp < 0.0f || s_gimp > 1.0f) s_gimp = 1.0f;
}
drive *= s_gimp;
speedDemand *= s_gimp;
}
speedDemand *= drive;
if (getenv("BT_DRIVE_LOG"))
{
static float s_dAcc = 0.0f; s_dAcc += time_slice;
if (s_dAcc >= 1.0f)
{
s_dAcc = 0.0f;
DEBUG_STREAM << "[drive] n=" << n << " drive=" << drive
<< " mm=" << mm << " dmd=" << speedDemand
DEBUG_STREAM << "[drive] mm=" << mm << " dmd=" << speedDemand
<< " mech=" << (int)mech->GetEntityID()
<< " @" << (void *)mech << "\n" << std::flush;
}