bone_sse: fix ribbon emitter offsets (#18-19), teardown guard
Bug #18: Ribbon emitter track offsets completely wrong. Position was entry+0x24, actual tracks from assembly (0x716402-0x716AA9): Track 1 (Vec3): gate=+0x1C, AnimData=+0x10, output=+0x00 Track 2 (Vec3): gate=+0x38, AnimData=+0x2C, output=+0x30 Track 3 (float): gate=+0x70, AnimData=+0x64, output=+0x80 Track 4 (Vec3): gate=+0x54, AnimData=+0x48, output=+0x50 Bug #19: Track 4 output was +0xA0 (should be +0x50), and tracks 2/4 were float (should be Vec3). Wrong output offsets corrupted stack data, causing bone_rt pointer to contain float bit patterns. Teardown: hook World_HandleLogoutCleanup (0x491180) instead of CleanupWorldAndEntities (0x66FC40). Fires at START of logout sequence before any Lua callbacks trigger model processing on freed data. Prologue: PUSH ESI/EDI, epilogue: POP EDI/ESI, JMP (tail call). Also: added bone_sse_reference.zig as separate compilation unit for A/B testing the proven-working version independently.
This commit is contained in: