# Battle Action Mapping

- status: `player-skill-payload-table-grounded-phase-formula-grounded`
- player table pointer base: `0x004d2488`
- shared table pointer: `0x004d2494`
- phase handler: `0x0040cf0a`
- payload selector: `0x00433f0e`

## Rules

- opcode a4 at 0x0040cf60..0x0040cf6e writes actor+0x60 = actor+0x59(skillId) + 0x0a for player actor type 1
- 0x00433f88..0x00433fa2 reads tableBase = dword[0x004d2488 + actor+0x05*4], payload = dword[tableBase + actor+0x59*8]
- 0x00433faa..0x00433fba reads sharedBase = dword[0x004d2494], payload = dword[sharedBase + actor+0x59*8] for actor type 2
- 0x00433fe0..0x00433ff1 selects payload + 0x16 + word[0x0059e2a4] * 8

## Known Player Rows

| actor | skill id | phase | skill | payload | MP | hits | anchor ok |
| --- | ---: | ---: | --- | --- | ---: | ---: | --- |
| 아타호 | `0x19` | `0x23` | 맹호스페셜 | `0x004d30ac` | 16 | 7 | `True` |
| 린샹 | `0x10` | `0x1a` | 선렬각 | `0x004d392c` | 12 | 6 | `True` |
| 스마슈 | `0x0c` | `0x16` | 쾌진격 | `0x004d3f84` | 12 | 1 | `True` |

## Player Tables

| actor | ptr slot | table | entries |
| --- | --- | --- | ---: |
| 아타호 | `0x004d2488` | `0x004d24a4..0x004d26b4` | 66 |
| 린샹 | `0x004d248c` | `0x004d26b4..0x004d285c` | 53 |
| 스마슈 | `0x004d2490` | `0x004d285c..0x004d299c` | 40 |

## Notes

- This proves skill id to effect payload for player skills.
- For player actor type 1, the first action phase is not a lookup table: it is skill id + 0x0a.
- Display script execution is handled by separate static display-VM reports; this mapping report does not depend on cinematic/runtime captures.
