diff --git a/restoration/source410/BT/GYRO.CPP b/restoration/source410/BT/GYRO.CPP index 5e7af23e..49f97277 100644 --- a/restoration/source410/BT/GYRO.CPP +++ b/restoration/source410/BT/GYRO.CPP @@ -469,7 +469,14 @@ void direction *= magnitude; bodyForce += direction; bodyForce.y = 0.0f; - bodyForce.Negate(bodyForce); + // + // 5.3.130 CORRECTION: the binary (@004b2de4) negates ONLY the x + // component in place -- `*(+0x308) = -*(+0x308)` -- after zeroing y at + // +0x30c. Vector3D::Negate flips all three, so our z carried the + // wrong sign on every damage shake and collision crunch since this + // function landed. + // + bodyForce.x = -bodyForce.x; } void diff --git a/restoration/source410/BT/MECH4.NOTES.md b/restoration/source410/BT/MECH4.NOTES.md index 4356a14d..727aa701 100644 --- a/restoration/source410/BT/MECH4.NOTES.md +++ b/restoration/source410/BT/MECH4.NOTES.md @@ -447,3 +447,31 @@ streamed value. Both halves now land together. Soak: `[mobility] scale 1 over 1 myomers` on an undamaged bhk1 -- throttle unscaled, drive unchanged (demand 35.9, speed 7.0), zero faults. + +## 5.3.130 -- two findings from re-reading landed code + +**A REAL SIGN BUG, fixed.** `Gyroscope::ApplyDamageTorque` (binary +@004b2de4) ended with `bodyForce.Negate(bodyForce)`, but the binary +negates ONLY the x component in place (`*(+0x308) = -*(+0x308)`) after +zeroing y at +0x30c. `Vector3D::Negate` flips all three, so the z +component has carried the wrong sign on every damage shake and every +collision crunch since the function landed. Fixed to `bodyForce.x = +-bodyForce.x`. STILL WORTH A LOOK: `ApplyVerticalImpulse` ends with +`bodyForce.y = bodyForce.x`, which is odd enough to want its binary +address found and checked the same way. + +**THE DAMAGE AVERAGES: computed, consumed by nobody -- NOT landed.** +`@0049fe80` (the master perf's second census) writes three means to +mech+0x354 / +0x358 / +0x35c: over the HULL zones, over every subsystem's +private zone, and over the MYOMERS' private zones (the 0x51155c test -- +the same GUID the mobility scan proved). Default 0.0 (@0049ffc8) when a +count is empty. + +A reader hunt found none. The apparent hits at part_013:9498 and 13728 +are on OTHER objects at the same offsets -- the gyro's damage multipliers +inside its damage fan-out (@004b2980) and a myomers cell inside the +myomer simulation (@004b8d18) -- a reminder that offsets are per-class and +a bare `+ 0x354)` grep proves nothing. No Mech attribute row binds them +either. Landing them would be three loops feeding dead memory, so per the +project rule (record where the binary is silent, never invent a consumer) +this stays decoded and unlanded until a consumer turns up.