Skip to content

Implement native GBA Triple Kick accuracy and escalating power - #226

Closed
Roxas2712 wants to merge 69 commits into
UNDERdecoded:mainfrom
Roxas2712:codex/gen3-triple-kick
Closed

Roxas2712 wants to merge 69 commits into
UNDERdecoded:mainfrom
Roxas2712:codex/gen3-triple-kick

Conversation

@Roxas2712

@Roxas2712 Roxas2712 commented Oct 25, 2026 •

Copy link
Copy Markdown

Triple Kick currently repeats one accuracy/critical/damage calculation three times at twice its extracted power. Native GBA effect 104 checks every reached kick, assigns 10/20/30 power and calculates damage independently; rounding, misses and move-end state make the approximation observably different.

Implement the native per-hit script through a per-dataset builtin adapter. Stop at accuracy/protection/hidden/immunity, sleep/faint and actual Endure boundaries; continue through Substitute, retain Focus Band and spend one learned PP per selected attack. Expose each assigned power through the existing public damage hook's ctx.opts.power. Preserve explicit damage/count/full overrides, delegation, neverMiss, shared statics and older-generation behavior. Keep completed Rage behavior when a later kick misses, and suppress it only when immunity is actually reached.

Stacks on #225. Gen1 is an unchanged read-only reference; this PR neither requires nor publishes Gen1 changes. Native command revision 8 rejects revision 7; party codec stays 1.

Validation at clean feature runtime 10a5c325a7852c6e8f7fea1502fafd9cfdc4a393 (later commit only documents results):

  • 2,220 focused checks pass, plus the 154-check native protocol suite.
  • 108 workers / 76,362 paired observations agree with clean Gen1 535a5ec088c1ae1bf4d91dd3e35a56f64cf46d91; the new mode adds 576 complete rows per FireRed/Emerald profile, all actor slots, each possible missed kick, critical stages/items, public per-kick power overrides, live lifecycle conditions and Rage. Raw RNG bounds/values, hook observations, damage/move events and battler state are retained.
  • Full feature: 126/135 engine suites, SDK 3/3, B30. The exact Counter of 25 inherited FAIL lines across nine suites equals freshly tested clean Implement native GBA Rage state and move-end boosts #225 (123/132); the full command retains its nonzero exit.
  • Combined runtime c1dac0994aa9fe0d1659e510874065697dca2534: 246/246 engine suites, SDK 3/3, B30 and the same complete comparison. Independent baseline repairs are in this combined branch.
  • Unchanged Implement native GBA Rage state and move-end boosts #225 fails 240 assertions using the exact final fixture; 396/576 complete FireRed rows differ. Exploratory/negative failures remain retained.
  • Two actual link roles complete three turns through real menus with every paired completed hash/component and learned PP equal. Revision 7 is refused before party selection. Raw fixture hash dcc938191b0bb075 → b9ec4e8a94f4ba6e is independently audited with the unchanged Implement native GBA Rage state and move-end boosts #225 hasher and only the explicit revision token changed; other-generation goldens stay unchanged.
  • 12 CPU-only scenarios with actual FireRed/Emerald imports pass public move submission and completed turns: all three kicks, misses on 1/2/3, Substitute break and an actual faster enemy Endure. Extracted attack metadata is unchanged. No ROM/cache/save assets are distributed and no normal SAVE is issued.
  • Scoped StyLua, actionlint and whitespace checks pass.

The earlier missing RAGE_EFFECT probe is resolved as a catalog boundary: pinned Gen1 seeds no GBA native move-effect records; Gen2 exposes its builtins. The same minimal authored primary record registers in both public loaders. Host native builtin delegation is tested separately and is not claimed as a shared cross-engine catalog contract.

See docs/native-gen3-triple-kick.md for reproducible commands, accepted/negative evidence and limits. Full Sleep Talk/other controllers, complete catalogs, Ruby/Sapphire per-hit scheduling, global RNG/selection orchestration, rendering and full playthrough parity remain separate work. Hosted CI execution and combined publication are recorded separately from local acceptance.

Published combined snapshot: Roxas2712/Gen2Recomped:codex/portability-testing at 5bbe0dbdfff2fe664c1a2f451ce0be51204f952e. Changes after tested runtime c1dac0994aa9fe0d1659e510874065697dca2534 only document acceptance/publication. Fork main stays 13af468b97dc37015d14ad5c71d7f067c3ee810d.

All nine hosted workflows await maintainer approval (action_required). The dedicated contract run has zero jobs, separately verified; local acceptance does not claim hosted execution. The app's existing 100-artifact identity cap rejected an attachment, but this regular PR is published and linked.

# Conflicts:
#	src/mods/Loader.lua
# Conflicts:
#	docs/modding.md
#	src/mods/Loader.lua
#	src/world/WorldAPI.lua
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant