#124: hit-location ASPECT was rotated 180 degrees -- the resolver now speaks the 1995 frame
Night-10's systematic targeting audit (rear panels unhittable from direct fire, Owens left torso hitting the RIGHT weapon pod and vice versa, missiles favoring the far side) measured down to one geometric fact: the authored wedge ring puts the Front* cells in the +Z arc (slice-name audit, bit-verified tables), i.e. the 1995 resolver frame has mech-forward = +Z -- while OUR engine's entity frame carries forward along -Z. Bench proof: a victim facing its attacker took frontal beams at local z = -4..-10, theta ~270 deg, resolving the REAR-named cells (zones 12/14/15) every time. The two frames differ by a pi ROTATION about Y -- rotation, not reflection, because the field flank observations CROSS (left->right) rather than persist. ResolveHit now rotates the local impact into the cylinder's frame (negate x and z; y untouched; handedness preserved so the SelectSlice torso-twist add keeps its sign). A/B (172 resolves, live missiles+beams on a facing victim): before theta~4.7 -> rear zones only; after theta~1.42-1.59 -> utorso/dtorso/ ltorso/rtorso/arm -- the front-authored cells, with the per-burst re-roll scatter intact. NOT this bug: the "one band LOW" Y-axis half of the night-10 table -- that is #16 (pick-ray boresight parallax, code-confirmed, still open). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
788031bc36
commit
c5dfb002f3
@@ -277,6 +277,22 @@ int
|
||||
Scalar heightRef = owner->CylinderReferenceHeight(); // owner+0x2ec[+0xc]
|
||||
if (heightRef <= 0.0f) return -1;
|
||||
|
||||
// PORT FRAME ADAPTER (#124, measured 2026-08-03). The 1995 resolver frame
|
||||
// carries the mech's FORWARD along +Z: the authored wedge ring puts the
|
||||
// FrontChest-family cells in the +Z arc (slice-name audit [T1]) -- frontal
|
||||
// hits MUST read z > 0 for the shipped tables to mean what they say. Our
|
||||
// engine's entity frame carries forward along -Z (bench 2026-08-03: the
|
||||
// dummy facing its attacker takes frontal beams at local z = -4..-10,
|
||||
// theta ~270 deg, resolving the REAR-named cells; the night-10 field table
|
||||
// -- rear panels unhittable, Owens left torso -> RIGHT pod -- is this same
|
||||
// pi ROTATION at every aspect: rotation, not reflection, because the
|
||||
// left/right flanks CROSS rather than persist). Express the impact in the
|
||||
// cylinder's frame: rotate pi about Y. y (the band axis) is untouched,
|
||||
// and the frames share handedness, so the torso-twist add in SelectSlice
|
||||
// keeps its sign.
|
||||
local.x = -local.x;
|
||||
local.z = -local.z;
|
||||
|
||||
// --- height -> layer (penetration depth) ---
|
||||
Scalar depth = local.y; // binary local_2c
|
||||
int layerIndex = (int)floorf((Scalar)layerCount * (depth / heightRef));
|
||||
@@ -305,7 +321,9 @@ int
|
||||
{
|
||||
static int s_rh = 0;
|
||||
if (s_rh++ < 400)
|
||||
DEBUG_STREAM << "[dmgresolve] localY=" << local.y
|
||||
DEBUG_STREAM << "[dmgresolve] impact=(" << impact.x << ","
|
||||
<< impact.y << "," << impact.z << ")"
|
||||
<< " local=(" << local.x << "," << local.y << "," << local.z << ")"
|
||||
<< " heightRef=" << heightRef
|
||||
<< " frac=" << (depth / heightRef)
|
||||
<< " layer=" << layerIndex << "/" << layerCount
|
||||
|
||||
Reference in New Issue
Block a user