#85: myomer drive heat LIVE -- the five Mech motion operands were return-0

shims, so the reconstructed integrator @004b8d18 accumulated zero forever

The integrator, its gates and the heat plumbing were all reconstructed and
running -- but OwnerVelocityMag/OwnerDriveMag/OwnerVelocityY/OwnerMotionGain/
OwnerMass were cross-family compile shims returning 0.0f, so the myomers
priced ratio^2 * damageGain * 0 every tick: ice cold at any seek (Oracle's
night-7 panel-confirmed report).

Operands re-grounded against the raw disasm + decomp and mapped to NAMED
members via a complete-Mech-TU bridge (BTMechMyomerMotionSample, mech4.cpp),
per the databinding rule:
  +0x1C4 vec  -> localVelocity.linearMotion
  +0x82C vec  -> localAcceleration.linearMotion (the authentic 15-ring
                 smoothed AccelerationLastFrame the port already maintains)
  +0x20C      -> moverMass (the collision divert's cell; the old "motion
                 gain" label was a misread)
  *(+0x250)   -> environment gravity (FUN_00421e2c: vy -= **(+0x250)/tick),
                 via GetEnvironment()->gravityConstant
So the heat physics reads: 0.005 * 1/2 m v^2 (kinetic work, per-tick/no-dt
in the binary -- kept verbatim, frame-rate note documented) + 0.2 * m g
|vy| dt (climb power) + 0.2 * m |v||a| dt (acceleration power), all scaled
by ratio^2 and (1 + zone damage).  Restored the binary's fabs(v.y) (the
draft had signed vy -- descending would have COOLED).

Authored tuning extracted from BTL4.RES (18 mech records, one shared
tuning): VelocityEfficiency=0.995, AccelerationEfficiency=0.8, gears
0.3/0.5/0.7/0.9999 rec idx 2; myomer thermal profile 77/1000/2000,
conductance 1.9e5, thermalMass 2.5e5.

Live-verified (solo arena, BT_MYO_LOG + BT_HEAT_LOG): standstill generates
~0; hard circling drove Myomers T 77 -> 1225 (past the 1000 degradation
line) and the coolant loop conducted it back to ~520 equilibrium on
slowing; damageGain live at 1.048 from grind rattle.

Known-inert remainder (filed in open-questions): the climb term reads g=0
because Mover::localEnvironment is never populated in the port
(EnvironmentZone res type 23 unwired); the mover feed (speedEffect ->
locomotion) stays WAVE 6.

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 08:14:05 -05:00
co-authored by Claude Fable 5
parent 37dd7f9663
commit 1570983fde
5 changed files with 116 additions and 21 deletions
+30
View File
@@ -1606,6 +1606,36 @@ static void
}
}
//###########################################################################
// BTMechMyomerMotionSample -- the five Mech motion operands of the myomer
// drive-heat integrator @004b8d18 (issue #85), read here in a complete-Mech
// TU and mapped to NAMED engine members per the databinding rule:
// binary mech+0x1C4 vec -> localVelocity.linearMotion (|v|, v.y --
// the same vector the crash block's iv2 squares, operand-confirmed)
// binary mech+0x82C vec -> localAcceleration.linearMotion (the published
// "AccelerationLastFrame" attribute, decomp-reference entity table)
// binary mech+0x20C -> moverMass (same cell the collision divert
// divides by -- NOT a "motion gain")
// binary *(mech+0x250) -> GetEnvironment()->gravityConstant (the 1995
// Mover holds a POINTER to the environment gravity: FUN_00421e2c does
// vy -= **(+0x250) per tick. So the integrator's velTerm is m*g*|vy|
// = climb work, and the heat physics reads: kinetic energy + climb
// power + acceleration power, scaled by the authored inefficiencies.)
//###########################################################################
void BTMechMyomerMotionSample(void *mech_v,
float *vel_mag, float *acc_mag, float *vel_y, float *mass, float *gravity)
{
Mech *m = (Mech *)mech_v;
const Vector3D &v = m->localVelocity.linearMotion;
const Vector3D &a = m->localAcceleration.linearMotion;
*vel_mag = (float)Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
*acc_mag = (float)Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
*vel_y = (float)v.y;
*mass = (float)m->moverMass;
Environment *env = m->GetEnvironment();
*gravity = (env != 0) ? (float)env->gravityConstant : 0.0f;
}
//###########################################################################
// MechDeathHandler effect-spawn bridge (mechdmg.cpp calls this)
//