fix(physics): match live tangent response transitions

Correct the common projection to spin*0.4 + normal_velocity*response_tangent and seal line/circle behavior against current Wine one-substep traces. Preserve record-two's in-response special-respawn continuation, producing the live (16698,21191)/(-302,-1809) state after publishing (17000,23000)/(0,3040), and update the readable C evidence.

Test Plan:
- bash original/tools/test_reconstructed_c.sh
- python3 original/tools/audit_reconstruction.py --require-complete
- cargo test --all-targets
- cargo clippy --all-targets --all-features -- -D warnings
- rumdl check original/C_RECONSTRUCTION_FINAL_AUDIT.md tdkpin-rs/CHANGELOG.md tdkpin-rs/RECONSTRUCTION.md tdkpin-rs/README.md
- live Wine record 2 trace: /tmp/original-special-respawn.csv
- live Wine object 155 trace: /tmp/original-circle155-after.csv
- git diff --check
This commit is contained in:
2026-08-23 19:42:23 +02:00
parent 06d1010431
commit 3dce159965
8 changed files with 107 additions and 26 deletions
+4 -2
View File
@@ -935,7 +935,7 @@ static void apply_collision_response(
(void)discarded;
discarded = (BorlandReal48){{0,0,0,0,0,0}};
projection = borland_real48_round_to_i32(borland_real48_subtract(
projection = borland_real48_round_to_i32(borland_real48_add(
borland_real48_subtract(
borland_real48_multiply(motion->spin, g_real48_point_four),
borland_real48_divide(
@@ -943,7 +943,9 @@ static void apply_collision_response(
borland_i32_to_real48(absolute_wrap(projection)),
discarded),
borland_i32_to_real48(motion->speed))),
candidate->response_tangent));
borland_real48_multiply(
borland_i32_to_real48(candidate->normal_velocity),
candidate->response_tangent)));
motion->spin = borland_real48_add(
borland_real48_multiply(motion->spin, g_real48_point_six),
spin_delta);