feat: add Samus extender montage #22

Open
JayKobe6k wants to merge 1 commit from feat/samus-extender-montage into master
Owner

Summary

  • add a frame-exact Samus extender activation and grounded grapple montage
  • support optional digital-L homing and a single caller-timed latch input
  • expose per-stock activation state and reject invalid, duplicate, or terminal requests
  • export and document the montage, including the standard Slippi tip-position limitation

Grapple-tip telemetry

Standard Slippi item updates expose Item.pos from item offsets 0x4C and 0x50. That position can identify the SAMUS_GRAPPLE_BEAM article, but it is not the simulated outer chain-tip position. Melee stores and advances the grapple as separate linked ItemLink objects; homing, gravity, walls, and chain bending update those link positions without copying the tip back into Item.pos. As a result, GameState.projectiles is insufficient for reliable contact-timed latch input.

Exact tip telemetry can be added through a custom Gecko payload or direct Dolphin memory reads using this NTSC 1.02 pointer path:

fighter + 0x223C  -> Item_GObj*
Item_GObj + 0x2C -> Item*
Item + 0xDD4     -> outer-tip ItemLink*
ItemLink + 0x0C  -> tip X float
ItemLink + 0x10  -> tip Y float
ItemLink + 0x14  -> tip Z float
Item + 0xDEA     -> extender latch-state byte

For a grounded extender, latch state 1 means its A input remains available; it advances to 2 after the input is consumed. Until this telemetry is available, callers own latch timing and should invoke grab() heuristically or manually.

Sources:

  • Project Slippi Recording/SendItemInfo.s, which emits item position from Item + 0x4C/0x50
  • doldecomp itsamusgrapple.c, which stores the outer chain link in samusgrapple.x0
  • doldecomp itlinkhookshot.c, which updates individual ItemLink transforms

Tests

  • python test.py (333 tests)
  • uvx ruff check melee/bot/techskill/extender.py melee/bot/techskill/__init__.py melee/bot/__init__.py
  • uvx ruff check test.py --ignore SIM117,B905
  • git diff --check
## Summary - add a frame-exact Samus extender activation and grounded grapple montage - support optional digital-L homing and a single caller-timed latch input - expose per-stock activation state and reject invalid, duplicate, or terminal requests - export and document the montage, including the standard Slippi tip-position limitation ## Grapple-tip telemetry Standard Slippi item updates expose `Item.pos` from item offsets `0x4C` and `0x50`. That position can identify the `SAMUS_GRAPPLE_BEAM` article, but it is not the simulated outer chain-tip position. Melee stores and advances the grapple as separate linked `ItemLink` objects; homing, gravity, walls, and chain bending update those link positions without copying the tip back into `Item.pos`. As a result, `GameState.projectiles` is insufficient for reliable contact-timed latch input. Exact tip telemetry can be added through a custom Gecko payload or direct Dolphin memory reads using this NTSC 1.02 pointer path: ```text fighter + 0x223C -> Item_GObj* Item_GObj + 0x2C -> Item* Item + 0xDD4 -> outer-tip ItemLink* ItemLink + 0x0C -> tip X float ItemLink + 0x10 -> tip Y float ItemLink + 0x14 -> tip Z float Item + 0xDEA -> extender latch-state byte ``` For a grounded extender, latch state `1` means its A input remains available; it advances to `2` after the input is consumed. Until this telemetry is available, callers own latch timing and should invoke `grab()` heuristically or manually. Sources: - Project Slippi `Recording/SendItemInfo.s`, which emits item position from `Item + 0x4C/0x50` - doldecomp `itsamusgrapple.c`, which stores the outer chain link in `samusgrapple.x0` - doldecomp `itlinkhookshot.c`, which updates individual `ItemLink` transforms ## Tests - `python test.py` (333 tests) - `uvx ruff check melee/bot/techskill/extender.py melee/bot/techskill/__init__.py melee/bot/__init__.py` - `uvx ruff check test.py --ignore SIM117,B905` - `git diff --check`
feat: add Samus extender montage
All checks were successful
Linux tests / Python 3.12 (push) Successful in 35s
Linux tests / Python 3.13 (push) Successful in 35s
Linux tests / Python 3.11 (push) Successful in 36s
Linux tests / Python 3.11 (pull_request) Successful in 34s
Linux tests / Python 3.13 (pull_request) Successful in 33s
Linux tests / Python 3.12 (pull_request) Successful in 33s
bbf0bb5fbe
All checks were successful
Linux tests / Python 3.12 (push) Successful in 35s
Linux tests / Python 3.13 (push) Successful in 35s
Linux tests / Python 3.11 (push) Successful in 36s
Linux tests / Python 3.11 (pull_request) Successful in 34s
Linux tests / Python 3.13 (pull_request) Successful in 33s
Linux tests / Python 3.12 (pull_request) Successful in 33s
This pull request has changes conflicting with the target branch.
  • AGENTS.md
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/samus-extender-montage:feat/samus-extender-montage
git switch feat/samus-extender-montage

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff feat/samus-extender-montage
git switch feat/samus-extender-montage
git rebase master
git switch master
git merge --ff-only feat/samus-extender-montage
git switch feat/samus-extender-montage
git rebase master
git switch master
git merge --no-ff feat/samus-extender-montage
git switch master
git merge --squash feat/samus-extender-montage
git switch master
git merge --ff-only feat/samus-extender-montage
git switch master
git merge feat/samus-extender-montage
git push origin master
Sign in to join this conversation.
No description provided.