WIP: fix(gameplay): Half damage uses the full hit before life is clamped #269

Draft
simonwjackson wants to merge 5 commits from simonwjackson/Longshot:fix/damage-taken-review into main
Contributor

Why

Half can incorrectly save Link from a lethal hit because it halves damage after the game clamps life to zero. This follow-up to #138 scales the full hit instead.

What changed

  • nx2/oot_patches.py: pass x9 at the damage-site CAS only. Keep both player/life-pointer guards, the healing site's delta, idempotence and supported-build checks.
  • host/oot_damage.c: scale the full hit; preserve Normal's result, healing and Heart protection.
  • tests/test_oot_damage.py: a two-unit life/four-unit hit kills at Half through the emitted guard; exhaustive lethal/nonlethal hits and a changed-old-life CAS retry are covered.
  • README and docs/development.md: document exact lethal Half and the saved option. The README paragraph wraps below 120 columns.
  • docs/tested-configurations.md: three session rows below the day's existing rows, including the excluded first harness attempt.

HumanBean already fixed Debug-tools gating in b6d695b4, merged with #138. This PR retains his code, help and hidden-means-Normal test unchanged. The stale translation keys from that merge are repaired separately in #273.

Flags and settings

Flag What it does Default now Recommendation Helps on Doesn't help on Untested on
Debug → Player → Damage taken; damage_taken=0/1/2/3 Half / Normal / Double / Quadruple; Half uses the full hit Normal (1); tools Off uses Normal Keep Normal as default; opt in while tools are on Correct lethal-hit scaling Sources outside the guarded life-write site Dark Link, Ganon, drowning/cold water, heat/lava, Windows

Measurements

main: 514591a30d (2026-11-13)
this PR: fix/damage-taken-review @ 8c3c77cb08

The exact current-main SHA is recorded in the merge commit. The game ran at 2f42b40e01; later changes are tests/docs and main's Discord-link update only. Runtime source is unchanged. The original regression failed on main f3fe1763dda267a134494f1d21e6ad10b1ec4cd8. The two interleaved pairs below were repeated on the final heads after the last merge.

Game-free comparison

Method: two interleaved pairs on the same Linux machine, compiling the real emitted guards and host arithmetic. Main adds only the two-life/four-hit regression assertion, not an implementation change. This is a correctness fix, not an FPS comparison.

Result main @ 514591a3 this PR @ 8c3c77cb
Half, 2 life left / 4-unit hit, expected life 0 FAIL / FAIL PASS / PASS
Debug visibility and effective Normal while hidden PASS / PASS PASS / PASS
Checks passed, median of two runs 1 of 2 2 of 2
main: 1 passed, 1 failed, 0 skipped (each run)
this PR: 2 passed, 0 failed, 0 skipped (each run)

Lift and gameplay proof

On aka, the actual supported lift's damage block subtracts x9 before clamping next life. The failed-CAS edge refreshes old life and returns to recompute without changing x9. A local compiled fixture exercises those actual blocks with a forced failed CAS: old life changes from 6 to 2, x9 stays 4, and Half writes zero on retry. The lift, extracted fixture and executable stay on aka; no lifted code is included here. The public game-free test separately checks the emitted guard with authored inputs.

Hardware: AMD RX 7900 XT 20 GB, RADV Mesa 26.2.3; Ryzen 5 7600X, 32 GB RAM; NixOS 26.11, Linux 7.2.7. Private headless Sway 1.12/Xwayland, 1920×1080, game's upscaler, frame generation and HDR Off, mesh fallback, audio disabled. GPU lock held; only isolated builds and copied saves used.

Scene and method: Hyrule Castle Town (Market_Child), controlled falls onto the same roof. Hardware breakpoints read the full hit, old life, saved choice and Debug-tools state at impact, then detach. The read-only control bridge reads resulting life. No guest-memory or instruction writes. Two protected calibration falls (raw hits 5 and 4) leave life at 16; Heart protection is Off for the table below.

How to reproduce: on a disposable save, enable flight to reach the roof and rise until the normal fall hit is four quarter hearts (about six seconds climbing here). Land on that roof at Normal, Double, Half, Half. Use the menu or ordinary hits to reach two quarters before the final Half hit; do not change health with a memory write. For the separate gate check, keep Quadruple saved and compare a three-quarter fall with tools Off and On. Debug-tools state must be checked before impact, not after landing.

Observation, this PR @ 2f42b40e Tools Life before Full hit Life after
Quadruple saved Off 16 3 13
Quadruple restored On 13 3 1
Normal On 16 4 12
Double On 12 4 4
Half, nonlethal after scaling On 4 4 2
Half, lethal after scaling On 2 4 0

Units are quarter hearts. The last hit enters the death animation. Normal, Double and nonlethal Half retain their expected results.

DAMAGE old=16 next=13 hit=3 tools=0 saved=3; life after=13
DAMAGE old=13 next=10 hit=3 tools=1 saved=3; life after=1
DAMAGE old=16 next=12 hit=4 tools=1 saved=1; life after=12
DAMAGE old=12 next=8 hit=4 tools=1 saved=2; life after=4
DAMAGE old=4 next=0 hit=4 tools=1 saved=0; life after=2
DAMAGE old=2 next=0 hit=4 tools=1 saved=0; life after=0

These pair the debugger's hit record with the subsequent bridge life reading. One initial gate attempt was excluded because tools state was not recorded at impact. Two later no-rise input attempts were also excluded; shorter double-tap spacing and explicit height/state assertions made the completed runs reproducible. No product failure is claimed from those harness attempts.

Testing

Tested: full game-free suite at 98f3fdef: 514 passed, 2 failed, 16 skipped in 494 s, 8 jobs under the shared lock. Both failures reproduce on untouched main: test_linux_tools.py hardcodes a PATH without Nix tools; test_menu_i18n.py retains the old Debug-tools translation keys. The latter is fixed by separate #273, whose full suite has 516 passed, 1 inherited PATH failure, 16 skipped. No new failures.

Nine affected checks passed after the runtime main merge: damage, Debug menu, option IDs, README, mouse, controls and presets. The final explicit changed-old-life retry test and README checks pass. GCC C11 syntax check with -Wall -Wextra -Werror and git diff --check pass. No standalone formatter is configured. Native fixtures compile with warnings as errors; the full runner also checks tracked Python syntax.

Fresh pinned Linux release build from the NUP succeeded in 29 min 25 s; all tracked source hashes matched the archived commit before and after the build. Shader preparation succeeded. Gameplay above ran the resulting binary, and every screenshot was inspected. No GPU-hang, device-lost or crash marker occurred in the played sessions. All private units stopped and the GPU queue entry was removed. No installed game, live save or korri* unit was changed.

Not tested: Windows build/runtime and non-ASCII Windows paths, other GPU families, physical controllers, Dark Link, Ganon's final hits, drowning and cold water, heat rooms and lava, healing/fairy gameplay and a full playthrough. Requests are not passing results.

Needs other testers:

  • Dark Link: Half/Double/Quadruple must affect only Link; Heart protection must not protect Dark Link. Then tools Off with Quadruple saved must restore Normal (T-ZJJT).
  • Ganon's final hits: Half/Double/Quadruple, death/fairy and final-blow progression; then tools Off with Quadruple saved must restore Normal (T-B8VV).
  • Drowning and cold water: test each source at Half/Double/Quadruple, record any bypass, then tools Off with Quadruple saved must restore Normal (T-53MS).
  • Heat rooms and lava: test each source at Half/Double/Quadruple, then tools Off with Quadruple saved must restore Normal (T-BHQP).
  • Windows llvm-mingw and a non-ASCII path: build and repeat lethal/nonlethal Half, Normal, Double and tools-Off saved Quadruple (T-U5C9).

All five requests are open but await a maintainer's testing wanted label before testers can claim them.

Screenshots

PR attachments, verified byte-for-byte through anonymous downloads; no private-fork links:

this PR @ 2f42b40e: Half selected, Heart protection Off
this PR @ 2f42b40e: nonlethal Half leaves two quarter hearts
this PR @ 2f42b40e: two units left, a four-unit hit at Half, death

The gameplay evidence comment also contains the tools-Off and tools-On screenshots.

Risk and rollback

The hook is tied to the supported game's two guarded CAS sites. Other life-write paths can bypass it. Normal or Debug tools Off restores stock damage; reverting this fix restores the old lethal-Half limitation. Dark Link's identity remains unverified.

Reviewer notes

Only the remaining lethal-Half fix and its tests/docs. HumanBean's Debug-tools gate is not reimplemented. No public renderer ABI structure changes. Main was merged normally, not rebased or force-pushed. This stays WIP because the Windows build box is not fulfilled and the description checker requires a literal rebase box rather than the truthful merge wording below.

Issues

See #138 (review 1153).

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Merged current main (514591a) as 8c3c77c; no rebase or history rewrite. This replaces the template's inaccurate "Rebased on current main" wording.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. Deterministic correctness comparison above; gameplay proof is separate, not an FPS claim.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Flags noted, and the switch reference updated (docs/development.md, the README).
  • Screenshots for a change that shows on screen.
  • A row in docs/tested-configurations.md for each measured run.
  • A game-free test added for the fix, failing on main and passing here.
  • A check under tests/ that reads changed source updated in this PR, not weakened.
  • Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Linux verified; no Windows machine. Open request T-U5C9.
  • Docs updated.
## Why Half can incorrectly save Link from a lethal hit because it halves damage after the game clamps life to zero. This follow-up to #138 scales the full hit instead. ## What changed - `nx2/oot_patches.py`: pass x9 at the damage-site CAS only. Keep both player/life-pointer guards, the healing site's delta, idempotence and supported-build checks. - `host/oot_damage.c`: scale the full hit; preserve Normal's result, healing and Heart protection. - `tests/test_oot_damage.py`: a two-unit life/four-unit hit kills at Half through the emitted guard; exhaustive lethal/nonlethal hits and a changed-old-life CAS retry are covered. - README and `docs/development.md`: document exact lethal Half and the saved option. The README paragraph wraps below 120 columns. - `docs/tested-configurations.md`: three session rows below the day's existing rows, including the excluded first harness attempt. HumanBean already fixed Debug-tools gating in `b6d695b4`, merged with #138. This PR retains his code, help and hidden-means-Normal test unchanged. The stale translation keys from that merge are repaired separately in #273. ## Flags and settings | Flag | What it does | Default now | Recommendation | Helps on | Doesn't help on | Untested on | |---|---|---|---|---|---|---| | Debug → Player → Damage taken; `damage_taken=0/1/2/3` | Half / Normal / Double / Quadruple; Half uses the full hit | Normal (1); tools Off uses Normal | Keep Normal as default; opt in while tools are on | Correct lethal-hit scaling | Sources outside the guarded life-write site | Dark Link, Ganon, drowning/cold water, heat/lava, Windows | ## Measurements main: 514591a30d707fe9f3ad31eae148c3cc1e750bff (2026-11-13) this PR: fix/damage-taken-review @ 8c3c77cb0851b2fb06825849269af26f2839a938 The exact current-main SHA is recorded in the merge commit. The game ran at **2f42b40e01e35bb88a9f0618d1cfe0610f304f8e**; later changes are tests/docs and main's Discord-link update only. Runtime source is unchanged. The original regression failed on main `f3fe1763dda267a134494f1d21e6ad10b1ec4cd8`. The two interleaved pairs below were repeated on the final heads after the last merge. ### Game-free comparison Method: two interleaved pairs on the same Linux machine, compiling the real emitted guards and host arithmetic. Main adds only the two-life/four-hit regression assertion, not an implementation change. This is a correctness fix, not an FPS comparison. | Result | main @ 514591a3 | this PR @ 8c3c77cb | |---|---|---| | Half, 2 life left / 4-unit hit, expected life 0 | FAIL / FAIL | PASS / PASS | | Debug visibility and effective Normal while hidden | PASS / PASS | PASS / PASS | | Checks passed, median of two runs | 1 of 2 | 2 of 2 | ```text main: 1 passed, 1 failed, 0 skipped (each run) this PR: 2 passed, 0 failed, 0 skipped (each run) ``` ### Lift and gameplay proof On aka, the actual supported lift's damage block subtracts x9 before clamping next life. The failed-CAS edge refreshes old life and returns to recompute without changing x9. A local compiled fixture exercises those actual blocks with a forced failed CAS: old life changes from 6 to 2, x9 stays 4, and Half writes zero on retry. The lift, extracted fixture and executable stay on aka; no lifted code is included here. The public game-free test separately checks the emitted guard with authored inputs. Hardware: AMD RX 7900 XT 20 GB, RADV Mesa 26.2.3; Ryzen 5 7600X, 32 GB RAM; NixOS 26.11, Linux 7.2.7. Private headless Sway 1.12/Xwayland, 1920×1080, game's upscaler, frame generation and HDR Off, mesh fallback, audio disabled. GPU lock held; only isolated builds and copied saves used. Scene and method: Hyrule Castle Town (`Market_Child`), controlled falls onto the same roof. Hardware breakpoints read the full hit, old life, saved choice and Debug-tools state at impact, then detach. The read-only control bridge reads resulting life. No guest-memory or instruction writes. Two protected calibration falls (raw hits 5 and 4) leave life at 16; Heart protection is Off for the table below. How to reproduce: on a disposable save, enable flight to reach the roof and rise until the normal fall hit is four quarter hearts (about six seconds climbing here). Land on that roof at Normal, Double, Half, Half. Use the menu or ordinary hits to reach two quarters before the final Half hit; do not change health with a memory write. For the separate gate check, keep Quadruple saved and compare a three-quarter fall with tools Off and On. Debug-tools state must be checked before impact, not after landing. | Observation, this PR @ 2f42b40e | Tools | Life before | Full hit | Life after | |---|---|---:|---:|---:| | Quadruple saved | Off | 16 | 3 | 13 | | Quadruple restored | On | 13 | 3 | 1 | | Normal | On | 16 | 4 | 12 | | Double | On | 12 | 4 | 4 | | Half, nonlethal after scaling | On | 4 | 4 | 2 | | Half, lethal after scaling | On | 2 | 4 | 0 | Units are quarter hearts. The last hit enters the death animation. Normal, Double and nonlethal Half retain their expected results. ```text DAMAGE old=16 next=13 hit=3 tools=0 saved=3; life after=13 DAMAGE old=13 next=10 hit=3 tools=1 saved=3; life after=1 DAMAGE old=16 next=12 hit=4 tools=1 saved=1; life after=12 DAMAGE old=12 next=8 hit=4 tools=1 saved=2; life after=4 DAMAGE old=4 next=0 hit=4 tools=1 saved=0; life after=2 DAMAGE old=2 next=0 hit=4 tools=1 saved=0; life after=0 ``` These pair the debugger's hit record with the subsequent bridge life reading. One initial gate attempt was excluded because tools state was not recorded at impact. Two later no-rise input attempts were also excluded; shorter double-tap spacing and explicit height/state assertions made the completed runs reproducible. No product failure is claimed from those harness attempts. ## Testing **Tested:** full game-free suite at `98f3fdef`: **514 passed, 2 failed, 16 skipped in 494 s**, 8 jobs under the shared lock. Both failures reproduce on untouched main: `test_linux_tools.py` hardcodes a PATH without Nix tools; `test_menu_i18n.py` retains the old Debug-tools translation keys. The latter is fixed by separate #273, whose full suite has **516 passed, 1 inherited PATH failure, 16 skipped**. No new failures. Nine affected checks passed after the runtime main merge: damage, Debug menu, option IDs, README, mouse, controls and presets. The final explicit changed-old-life retry test and README checks pass. GCC C11 syntax check with `-Wall -Wextra -Werror` and `git diff --check` pass. No standalone formatter is configured. Native fixtures compile with warnings as errors; the full runner also checks tracked Python syntax. Fresh pinned Linux release build from the NUP succeeded in **29 min 25 s**; all tracked source hashes matched the archived commit before and after the build. Shader preparation succeeded. Gameplay above ran the resulting binary, and every screenshot was inspected. No GPU-hang, device-lost or crash marker occurred in the played sessions. All private units stopped and the GPU queue entry was removed. No installed game, live save or `korri*` unit was changed. **Not tested:** Windows build/runtime and non-ASCII Windows paths, other GPU families, physical controllers, Dark Link, Ganon's final hits, drowning and cold water, heat rooms and lava, healing/fairy gameplay and a full playthrough. Requests are not passing results. **Needs other testers:** - Dark Link: Half/Double/Quadruple must affect only Link; Heart protection must not protect Dark Link. Then tools Off with Quadruple saved must restore Normal (T-ZJJT). - Ganon's final hits: Half/Double/Quadruple, death/fairy and final-blow progression; then tools Off with Quadruple saved must restore Normal (T-B8VV). - Drowning and cold water: test each source at Half/Double/Quadruple, record any bypass, then tools Off with Quadruple saved must restore Normal (T-53MS). - Heat rooms and lava: test each source at Half/Double/Quadruple, then tools Off with Quadruple saved must restore Normal (T-BHQP). - Windows llvm-mingw and a non-ASCII path: build and repeat lethal/nonlethal Half, Normal, Double and tools-Off saved Quadruple (T-U5C9). All five requests are open but await a maintainer's `testing wanted` label before testers can claim them. ## Screenshots PR attachments, verified byte-for-byte through anonymous downloads; no private-fork links: ![this PR @ 2f42b40e: Half selected, Heart protection Off](https://git.magicbean.dev/attachments/fbcbd491-679e-4aef-bc30-13ff4908a468) ![this PR @ 2f42b40e: nonlethal Half leaves two quarter hearts](https://git.magicbean.dev/attachments/66268c47-6c88-4a21-ae3c-085094be8832) ![this PR @ 2f42b40e: two units left, a four-unit hit at Half, death](https://git.magicbean.dev/attachments/3c8f4177-bcab-4315-a35a-ef05c1b7a4fc) The [gameplay evidence comment](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/269#issuecomment-15013) also contains the tools-Off and tools-On screenshots. ## Risk and rollback The hook is tied to the supported game's two guarded CAS sites. Other life-write paths can bypass it. Normal or Debug tools Off restores stock damage; reverting this fix restores the old lethal-Half limitation. Dark Link's identity remains unverified. ## Reviewer notes Only the remaining lethal-Half fix and its tests/docs. HumanBean's Debug-tools gate is not reimplemented. No public renderer ABI structure changes. Main was merged normally, not rebased or force-pushed. This stays WIP because the Windows build box is not fulfilled and the description checker requires a literal rebase box rather than the truthful merge wording below. ## Issues See #138 (review 1153). ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Merged current `main` (514591a) as `8c3c77c`; no rebase or history rewrite. This replaces the template's inaccurate "Rebased on current main" wording. - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [x] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. Deterministic correctness comparison above; gameplay proof is separate, not an FPS claim. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Flags noted, and the switch reference updated (docs/development.md, the README). - [x] Screenshots for a change that shows on screen. - [x] A row in `docs/tested-configurations.md` for each measured run. - [x] A game-free test added for the fix, failing on `main` and passing here. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. - [ ] Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Linux verified; no Windows machine. Open request T-U5C9. - [x] Docs updated.
fix(gameplay): scale lethal hits before the life clamp
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 5s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
98f3fdefda
Pass the damage-site raw hit through without reusing x9 at the healing site. Keep Normal, heart protection, player guards and CAS retries unchanged. Cover lethal Half through the emitted guard and document the saved option.

Assisted-by: OpenAI GPT-6 Astra
Co-Authored-By: OpenAI GPT-6 Astra <[email protected]>
Assisted-by: OpenAI GPT-6 Astra
Co-Authored-By: OpenAI GPT-6 Astra <[email protected]>
Merge current Longshot main d964886 into lethal-Half follow-up
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 3s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
2f42b40e01
Assisted-by: OpenAI GPT-6 Astra
Co-Authored-By: OpenAI GPT-6 Astra <[email protected]>
Author
Contributor

Merged current main d964886 as 2f42b40e with a normal push; no rebase. The arithmetic is unchanged from 98f3fdef. All nine affected focused checks pass. The full-suite failures both reproduce on untouched main. The fresh Linux build is queued; this stays WIP until gameplay proof and test requests are recorded.

Merged current main d964886 as 2f42b40e with a normal push; no rebase. The arithmetic is unchanged from 98f3fdef. All nine affected focused checks pass. The full-suite failures both reproduce on untouched main. The fresh Linux build is queued; this stays WIP until gameplay proof and test requests are recorded.
Author
Contributor

Linux gameplay proof at this PR @ 2f42b40e is complete. Castle Town roof, RX 7900 XT/RADV 26.2.3, NixOS 26.11. Read-only hardware breakpoints recorded old life, the unclamped hit, Debug-tools state and saved setting; the bridge read life after impact. No guest-memory writes.

Setting Tools Life before Full hit Life after
Quadruple saved Off 16 3 13
Quadruple restored On 13 3 1
Normal On 16 4 12
Double On 12 4 4
Half, nonlethal after scaling On 4 4 2
Half, lethal after scaling On 2 4 0

Units are quarter hearts. The final hit enters the game's death animation. Normal, Double and nonlethal Half retain their expected results. HumanBean's existing Debug-tools gate also works: it was not changed here.

this PR @ 2f42b40e: Half selected, Heart protection Off
this PR @ 2f42b40e: nonlethal Half leaves two quarter hearts
this PR @ 2f42b40e: two units left, full four-unit hit at Half, death
this PR @ 2f42b40e: saved Quadruple, tools Off, three units removed
this PR @ 2f42b40e: tools On restores Quadruple, twelve units removed

Linux gameplay proof at **this PR @ 2f42b40e** is complete. Castle Town roof, RX 7900 XT/RADV 26.2.3, NixOS 26.11. Read-only hardware breakpoints recorded old life, the unclamped hit, Debug-tools state and saved setting; the bridge read life after impact. No guest-memory writes. | Setting | Tools | Life before | Full hit | Life after | |---|---|---:|---:|---:| | Quadruple saved | Off | 16 | 3 | 13 | | Quadruple restored | On | 13 | 3 | 1 | | Normal | On | 16 | 4 | 12 | | Double | On | 12 | 4 | 4 | | Half, nonlethal after scaling | On | 4 | 4 | 2 | | Half, lethal after scaling | On | 2 | 4 | 0 | Units are quarter hearts. The final hit enters the game's death animation. Normal, Double and nonlethal Half retain their expected results. HumanBean's existing Debug-tools gate also works: it was not changed here. ![this PR @ 2f42b40e: Half selected, Heart protection Off](https://git.magicbean.dev/attachments/fbcbd491-679e-4aef-bc30-13ff4908a468) ![this PR @ 2f42b40e: nonlethal Half leaves two quarter hearts](https://git.magicbean.dev/attachments/66268c47-6c88-4a21-ae3c-085094be8832) ![this PR @ 2f42b40e: two units left, full four-unit hit at Half, death](https://git.magicbean.dev/attachments/3c8f4177-bcab-4315-a35a-ef05c1b7a4fc) ![this PR @ 2f42b40e: saved Quadruple, tools Off, three units removed](https://git.magicbean.dev/attachments/4af146ec-59c0-494e-9ead-3da1176c52fa) ![this PR @ 2f42b40e: tools On restores Quadruple, twelve units removed](https://git.magicbean.dev/attachments/1ab0cccf-0f40-4f67-8fcf-5b1e44a91bdf)
Record raw four-unit hits at Normal, Double and Half, including two units left to death. Add a changed-old-life CAS retry regression and wrap the README reference. Preserve excluded harness attempts as such rather than claiming them as gate evidence.

Assisted-by: OpenAI GPT-6 Astra
Co-Authored-By: OpenAI GPT-6 Astra <[email protected]>
Merge current Longshot main 514591a into lethal-Half follow-up
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
8c3c77cb08
The only added main commit updates Discord links; runtime source is unchanged from the measured build.

Assisted-by: OpenAI GPT-6 Astra
Co-Authored-By: OpenAI GPT-6 Astra <[email protected]>
Author
Contributor

Pushed 8c3c77c: measured gameplay and the changed-old-life retry test are recorded; current main 514591a was merged normally (Discord links only). The pinned Linux build proves Half kills with 2 units left and a full 4-unit hit; nonlethal Half, Normal and Double retain their expected values. The inherited Debug gate is also proven Off/On. Five test requests are open; they need the testing wanted label. WIP remains honest: Windows is unverified, and the checker requires rebase wording despite the actual merge.

Pushed 8c3c77c: measured gameplay and the changed-old-life retry test are recorded; current main 514591a was merged normally (Discord links only). The pinned Linux build proves Half kills with 2 units left and a full 4-unit hit; nonlethal Half, Normal and Double retain their expected values. The inherited Debug gate is also proven Off/On. Five test requests are open; they need the testing wanted label. WIP remains honest: Windows is unverified, and the checker requires rebase wording despite the actual merge.
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
This pull request is marked as a work in progress.
Some workflows are waiting to be reviewed.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'fix/damage-taken-review:simonwjackson-fix/damage-taken-review'
git switch 'simonwjackson-fix/damage-taken-review'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!269
No description provided.