Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
dcd752a
Bridge compatibility collision queries to live native maps
Oct 25, 2026
6bbc5a4
Expose owned field-effect artwork with native records and scoped cach…
Roxas2712 Oct 26, 2026
780b259
Read uploaded field images through actual GPU render targets
Roxas2712 Oct 26, 2026
186081a
Preserve contribution credit and upstream integration permission
Roxas2712 Oct 26, 2026
a8b3096
Retire loaded field resources after mod wrapper unwind on reload and …
Roxas2712 Oct 26, 2026
b1388f1
Bind field-move presentation to native admissions and owned resources
Roxas2712 Oct 26, 2026
487e1e5
Run field-move GPU qualification on both supported host versions
Roxas2712 Oct 26, 2026
c83ef08
Keep native GBA field cut-ins independent of dialogue theme dimensions
Roxas2712 Oct 26, 2026
f2cd89d
Verify field-move rollback and teardown through the actual mod SDK
Roxas2712 Oct 26, 2026
4af592e
Retire source-owned field-move admissions after mod wrapper unwind
Roxas2712 Oct 26, 2026
455fbbc
Add authenticated cartridge field-move artwork and presentation profiles
Roxas2712 Oct 26, 2026
a840d23
Keep the parent native streak phase and freeze its GPU baseline
Roxas2712 Oct 26, 2026
24a975e
Honor admitted worlds, retired stacks and mixed validation contracts
Roxas2712 Oct 26, 2026
965868a
Cover authenticated strip profiles when edition metadata is supplied …
Roxas2712 Oct 26, 2026
84f4eb4
Bind source GBA battle views and presentation phases to native contro…
Roxas2712 Oct 26, 2026
5a36c15
Include standalone native boundary checks and contribution notice
Roxas2712 Oct 26, 2026
679abfd
Report unsupported older-host UI queries explicitly
Roxas2712 Oct 26, 2026
3de60c5
Guard native battle admissions and share frame capture ownership
Roxas2712 Oct 26, 2026
6913ad4
Preserve the native screen after captures into separate render targets
Roxas2712 Oct 26, 2026
807f3ca
Retire loaded battle presentation services on older native hosts
Roxas2712 Oct 26, 2026
8e3669e
Assert the native GPU controller comes from its frozen source tree
Roxas2712 Oct 26, 2026
316ad42
Share native GBA animation frames, screen effects and layout queries
Roxas2712 Oct 26, 2026
32a3e83
Share native terrain and encounter observations with mod consumers
Roxas2712 Oct 26, 2026
dcf0311
Include the contribution permission for native terrain integration
Roxas2712 Oct 26, 2026
6ee690d
Carry decoded layout and admitted-world integration for map readers
Roxas2712 Oct 26, 2026
48e0f68
Keep decoded source layouts distinct from native grid handles
Roxas2712 Oct 26, 2026
1fd6886
Share persistent native world lookup across read adapters
Roxas2712 Oct 26, 2026
cb7cd46
Compose offered native animation and companion observations
Roxas2712 Oct 26, 2026
63834d1
Compose offered field-move presentation with native companion runtime
Roxas2712 Oct 26, 2026
c9d920c
Adapt native companion commands and owned UI flows to the public host
Roxas2712 Oct 26, 2026
b72e5b7
Adapt native battle chrome and particle observations to the public host
Roxas2712 Oct 26, 2026
ff14b0d
Connect native field fades, warp admission and source UI flows
Roxas2712 Oct 26, 2026
457834a
Observe native field resources and render at drawable resolution
Roxas2712 Oct 26, 2026
2fcecaa
Expose native semantic forced-terrain observations
Roxas2712 Oct 26, 2026
35daf5c
Observe native arrival ownership for source movement
Roxas2712 Oct 26, 2026
8d3e4c0
Share native START layout and glyph presentation with source menus
Roxas2712 Oct 26, 2026
e09c4be
Retain owned actor presentation and admit unpainted source followers
Roxas2712 Oct 26, 2026
1e273b7
Share indexed palette code while isolating native and source shader b…
Roxas2712 Oct 26, 2026
495780f
Borrow native move selections and keep UI cursors bound to their owner
Roxas2712 Oct 26, 2026
6980fbd
Record actual quality, supersampling and Retina rendering observations
Roxas2712 Oct 26, 2026
0b33ef7
Borrow native frame and ball presentation with cartridge type names
Roxas2712 Oct 27, 2026
1e399df
Expose current native PP palette and threshold queries
Roxas2712 Oct 27, 2026
81df0b5
Borrow the native entry controller through its admitted update
Roxas2712 Oct 27, 2026
bdbfaf0
Borrow native modal UI drawing through a scoped source pass
Roxas2712 Oct 27, 2026
7be3089
Expose native cartridge Help resources and an owned modal draw pass
Roxas2712 Oct 27, 2026
1e37380
Read native Help visibility from flag, item and dex progress
Roxas2712 Oct 27, 2026
aeb9c88
Observe real native battle modals across their current cohort
Roxas2712 Oct 27, 2026
c38df97
Expose owned native ball artwork for battle presentation consumers
Roxas2712 Oct 27, 2026
1c0b9da
Observe the current native frame cutout for battle layouts
Roxas2712 Oct 27, 2026
83b0914
Observe native battle stage geometry and live presentation state
Roxas2712 Oct 27, 2026
da9ec9b
Record qualified public stage composition and actual battle limit
Roxas2712 Oct 27, 2026
b381f38
Expose native target blink and imported integer selection motion
Roxas2712 Oct 27, 2026
8a1318a
Borrow native particle painters and keep selection ownership weak
Roxas2712 Oct 27, 2026
08d0d57
Use actual native battler slots in presentation fixtures
Roxas2712 Oct 27, 2026
9bf6565
Record bounded native presentation qualification and import fixture
Roxas2712 Oct 27, 2026
d90f728
Expose registered native picture-slot identities
Roxas2712 Oct 27, 2026
92cdd06
Share native battle menu-frame painting through admitted UI
Roxas2712 Oct 27, 2026
a478192
Expose native tutorial cue and move-menu observations
Roxas2712 Oct 27, 2026
32cb98e
Settle public native queue before quick-item readiness checks
Roxas2712 Oct 27, 2026
5c56e2c
Exercise quick-item observations in a fresh native admission
Roxas2712 Oct 27, 2026
c0e80df
Record exact public tutorial cue qualification
Roxas2712 Oct 27, 2026
8664a3e
Paint pixel cursors through current native font resources
Roxas2712 Oct 27, 2026
7844aa9
Expose live native battle move labels
Roxas2712 Oct 27, 2026
4592878
Notify animation decorators once from the native phase
Roxas2712 Oct 27, 2026
4e211f2
Record composed HUD and phase-hook qualification
Roxas2712 Oct 27, 2026
22a123d
Record refreshed native scene qualification
Roxas2712 Oct 27, 2026
c5abe2b
Expose current native base battler coordinate queries
Roxas2712 Oct 27, 2026
4b88714
Keep explicit coordinate layouts isolated and reject malformed records
Roxas2712 Oct 27, 2026
0601882
Record composed native coordinate query qualification
Roxas2712 Oct 27, 2026
f9c1fc7
Expose native edition font and battle-layout profile facts
Roxas2712 Oct 27, 2026
61645d2
Record native presentation profile qualification
Roxas2712 Oct 27, 2026
9fbefc6
Add scoped native GBA colour effect drawing
Roxas2712 Oct 27, 2026
a5e8f4b
Record scoped colour and alpha composition qualification
Roxas2712 Oct 27, 2026
10ef0cd
Return native indexed battle text colour records
Roxas2712 Oct 27, 2026
a83f37c
Exercise palette cache revisions on older importer owners
Roxas2712 Oct 27, 2026
79a0b33
Document indexed battle text contracts and validation
Roxas2712 Oct 27, 2026
66edfbe
Expose shared native RS cursor drawing with logical texture density
Roxas2712 Oct 27, 2026
e6e9c03
Document shared RS cursor density and GPU qualification
Roxas2712 Oct 27, 2026
17e5091
Expose native battle window and PP palette manifests
Roxas2712 Oct 27, 2026
9f2982b
Qualify native window and PP palette drawing on both GPU backends
Roxas2712 Oct 27, 2026
d66d5b6
Share native trainer party drawing and expose source move-swap cursors
Roxas2712 Oct 27, 2026
3fc4a0f
Retain logical party-bar sizes across independent image densities
Roxas2712 Oct 27, 2026
17c535b
Document native trainer and move-swap qualification
Roxas2712 Oct 27, 2026
133e88d
Share native frame presentation providers and once-only window paint …
Roxas2712 Oct 27, 2026
663f2d7
Bound provider callbacks and reject reentrant frame restarts
Roxas2712 Oct 27, 2026
fee3425
Document independent native provider and unchanged-mod qualification
Roxas2712 Oct 27, 2026
fa58047
Project native move-effect bytes and shared critical-rule metadata
Roxas2712 Oct 27, 2026
b882049
Qualify rule metadata against both existing native critical owners
Roxas2712 Oct 27, 2026
a26a6ad
Preserve false metadata and describe native hit producers without exe…
Roxas2712 Oct 27, 2026
bc74a20
Recognize the native critical callback game-context argument in quali…
Roxas2712 Oct 27, 2026
abc5986
Document native move-rule metadata and current-main queue qualification
Roxas2712 Oct 27, 2026
0b35973
Route native GBA frame widgets through shared presentation leases
Roxas2712 Oct 27, 2026
7f88230
Compare native frame and following-label pixels across provider fallb…
Roxas2712 Oct 27, 2026
4a07115
Document native frame widgets and independent following-label pixel q…
Roxas2712 Oct 27, 2026
ae7bbfd
Share canonical native move-effect symbols and detached source constants
Roxas2712 Oct 27, 2026
b3a55bd
Document canonical effect provenance and independent current-main qua…
Roxas2712 Oct 27, 2026
2eb116c
Observe native Hoenn dex/search metadata and preserve admitted Safari…
Roxas2712 Oct 27, 2026
64057be
Initialize the owned party before checking dex observation neutrality
Roxas2712 Oct 27, 2026
fbd9dbf
Share native text pen controls between source measurement and painting
Roxas2712 Oct 27, 2026
b28b2a6
Declare native font page bases in the owned pen fixture
Roxas2712 Oct 27, 2026
446073b
Check native text pen pixels on both desktop renderers
Roxas2712 Oct 27, 2026
ba58a34
Document native Hoenn observation and RS menu presentation contracts
Roxas2712 Oct 27, 2026
9efa038
Share native desktop file selection with source consumers
Roxas2712 Oct 27, 2026
a27581d
Exclude source comments from the existing picker funnel counter
Roxas2712 Oct 27, 2026
29b2b8c
Run native picker and existing launcher contracts in CI
Roxas2712 Oct 27, 2026
45d2e30
Record older-native picker contracts and actual RS menu boundaries
Roxas2712 Oct 27, 2026
de36cfd
Share native Safari text observations and canonical metatile queries
Roxas2712 Oct 28, 2026
1c6e9c1
Exercise existing collision semantics through the shared public names…
Roxas2712 Oct 28, 2026
184d868
Delegate source Safari player healthboxes to the existing native coun…
Roxas2712 Oct 28, 2026
1898984
Check portable native observation views and existing Gen2 presentation
Roxas2712 Oct 28, 2026
6851bb4
Document older-native owner boundaries for cartridge observation offers
Roxas2712 Oct 28, 2026
e2b6fee
Record actual corrected Safari counter and older-owner limits
Roxas2712 Oct 28, 2026
77deabe
Use native compound menu glyphs in source and native font paths
Roxas2712 Oct 28, 2026
c1c865a
Check the shared native compound-label painter entry point
Roxas2712 Oct 28, 2026
ec62432
Keep fixed compound labels on the shared native glyph fast path
Roxas2712 Oct 28, 2026
3db9219
Offer native region picker observations and once-only flight decoration
Roxas2712 Oct 28, 2026
7f45bbb
Keep flight CI scoped to tests present on the older public branch
Roxas2712 Oct 28, 2026
6d55240
Offer required constant queries and compact native Hoenn field label …
Roxas2712 Oct 28, 2026
29db339
Check required native constant queries in cartridge-view CI
Roxas2712 Oct 28, 2026
239d527
Offer native logical region atlas metadata without another screen owner
Roxas2712 Oct 28, 2026
abe2317
Offer once-only native flight arrival deferral under the existing opa…
Roxas2712 Oct 28, 2026
86e5b3f
Keep native game phases and callback attribution in live coroutine sc…
Roxas2712 Oct 28, 2026
3f8f2bf
Record exact public coroutine scope and native script composition checks
Roxas2712 Oct 28, 2026
439f23c
Observe real native ordered action rows without changing execution cl…
Roxas2712 Oct 28, 2026
4f9bed7
Preserve typed iteration for native action facts
Roxas2712 Oct 28, 2026
c9d4449
Keep cumulative adapter qualification separate from fork-only CI
Roxas2712 Oct 28, 2026
f6615b3
Record exact native and older-public action qualification
Roxas2712 Oct 28, 2026
821e486
Adapt native action presentation provenance without replacing control…
Roxas2712 Oct 28, 2026
1ea3129
Record exact older-controller presentation qualification
Roxas2712 Oct 28, 2026
4558608
Separate source record identities from native actor-only callback han…
Roxas2712 Oct 28, 2026
acc3b87
Allow the shared native turn probe to install an actual callback cons…
Roxas2712 Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
41 changes: 41 additions & 0 deletions .github/workflows/native-cartridge-views.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Native cartridge observation views
on:
pull_request:
paths:
- 'src/battle/Gen3SafariText.lua'
- 'src/battle/Gen3Battle.lua'
- 'src/core/game3/mb.lua'
- 'src/core/game3/constants.lua'
- 'src/import/gba/field_label_facts.lua'
- 'tests/engine/native_constant_queries.lua'
- 'src/core/game3/rom_text.lua'
- 'src/core/game3/battle/profile.lua'
- 'src/core/game3/battle/healthbox.lua'
- 'tests/engine/native_safari_text_views.lua'
- 'tests/engine/native_rom_text_ir.lua'
- 'tests/engine/compatibility_cell_semantics.lua'
- '.github/workflows/native-cartridge-views.yml'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: native-cartridge-views-${{ github.ref }}
cancel-in-progress: true
jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- run: sudo apt-get update && sudo apt-get install -y luajit
- name: Native authority and retired-view boundaries
run: |
luajit tests/engine/native_safari_text_views.lua
luajit tests/engine/native_constant_queries.lua
luajit tests/engine/compatibility_cell_semantics.lua
luajit tests/engine/native_rom_text_ir.lua
luajit tests/engine/native_battle_chrome.lua
- name: Existing native Gen2 presentation
run: |
luajit tests/engine/gen2_battle_window.lua
luajit tests/engine/gen2_battle_scene.lua
31 changes: 31 additions & 0 deletions .github/workflows/native-file-picker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Native desktop file selection
on:
pull_request:
paths:
- 'src/core/FilePicker.lua'
- 'src/core/HostShell.lua'
- 'src/import/RomImporter.lua'
- 'tests/engine/native_file_picker.lua'
- 'tests/*picker*'
- 'tests/rom_importer_android_mod_pick_test.lua'
- '.github/workflows/native-file-picker.yml'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: native-file-picker-${{ github.ref }}
cancel-in-progress: true
jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- run: sudo apt-get update && sudo apt-get install -y luajit
- name: Model desktop commands without opening dialogs
run: luajit tests/engine/native_file_picker.lua
- name: Preserve native pointer release and mobile fallback
run: |
luajit tests/parity_picker_pointer_grab.lua
luajit tests/rom_importer_no_picker_test.lua
luajit tests/rom_importer_android_mod_pick_test.lua
41 changes: 41 additions & 0 deletions .github/workflows/native-flight.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Native region picker and flight boundary
on:
pull_request:
paths:
- 'src/compat/gen1/NativeRegionMap.lua'
- 'src/world/Gen3FlyTargets.lua'
- 'src/world/Gen3FlyArrival.lua'
- 'src/core/game3/field_effects.lua'
- 'src/render/Transition.lua'
- 'tests/engine/native_fly_arrival.lua'
- 'src/ui/Gen3RegionMap.lua'
- 'src/ui/Gen3RsRegionMap.lua'
- 'src/ui/game3/region_map.lua'
- 'src/ui/game3/rse/region_map.lua'
- 'src/core/game3/field.lua'
- 'src/world/OverworldController.lua'
- 'tests/engine/native_region_map_observations.lua'
- 'tests/engine/native_fly_boundary.lua'
- '.github/workflows/native-flight.yml'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: native-flight-${{ github.ref }}
cancel-in-progress: true
jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- run: sudo apt-get update && sudo apt-get install -y luajit
- name: Native observations and once-only departure
run: |
luajit tests/engine/native_region_map_observations.lua
luajit tests/engine/native_fly_boundary.lua
luajit tests/engine/native_fly_arrival.lua
luajit tests/engine/native_field_observations.lua
- name: Existing native admission and other generations
run: |
luajit tests/engine/gen2_battle_scene.lua
15 changes: 15 additions & 0 deletions .github/workflows/native-phase-scopes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: Native coroutine phase ownership
on:
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- run: sudo apt-get update && sudo apt-get install -y luajit
- run: luajit tests/engine/native_coroutine_phase_scopes.lua
- run: luajit tests/engine/native_game_coroutine_scopes.lua
88 changes: 88 additions & 0 deletions LICENSE-ROXAS2712.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Roxas2712 — Fork Contributions

Version 1.0 · Effective 25 October 2026

Copyright © 2026 Roxas2712, to the extent of rights held.
All rights reserved except as expressly granted below or already granted.

## 1. Scope and ownership

This notice applies only to original contributions made by Roxas2712
(GitHub: Roxas2712) to `Roxas2712/Gen2Recomped`, including original additions
within modified files, insofar as he owns the relevant rights. Git history,
pull-request diffs and source provenance identify contributions; a commit
author or a whole-file change alone does not establish ownership of every
part of that file.

It does not claim ownership of Cedric's work, Gen1Recomp / BOIS CLUB GAMES
work, other contributors' work, third-party dependencies, or ROM-derived
content. Their applicable licences and notices remain in force. It does not
grant permission to distribute the complete combined fork where another
rights holder's permission is required.

## 2. General permission and reserved rights

For contributions covered by this notice and not already licensed more
broadly, you may read and study the published source and make private,
non-commercial modifications and builds for your own use. This grants no
general permission to redistribute, sublicense, sell, or offer those
contributions as a hosted service. Other uses require Roxas2712's
written permission, except for the specific permission below and rights
available independently under applicable law.

Keep the relevant copyright, licence and attribution notices. Do not
represent Roxas2712's contributions as exclusively authored by someone
else. Public source availability alone does not put them in the public
domain or grant an open-source licence.

## 3. Specific permission for Cedric / UNDERdecoded

Roxas2712 expressly grants Cedric (Ced; GitHub: UNDERdecoded /
UNDERdecodedHD) a non-exclusive, worldwide, perpetual, royalty-free
permission to use, reproduce, integrate, modify and distribute the covered
contributions that Roxas2712 submits or expressly offers through pull
requests to `UNDERdecoded/Gen2Recomped`, for Cedric's Gen2Recomped /
RetroRecompiled project. This includes its renamed continuation maintained
by Cedric, its official builds, and its commercial operation.

Cedric may license the incorporated contributions to recipients as part of
that project, subject to preserving this permission's applicable credit and
notice requirements. This permission is not a copyright assignment, is not
exclusive, and does not cover unpublished work, separate repositories,
ModCompass service operation, credentials, or content not offered in those
pull requests. Roxas2712 retains his own rights to his contributions.

For uses relying on this permission:

- retain the relevant source copyright and licence notices;
- give visible credit in the project's README or equivalent public project
page, and in the application's existing About / Credits view, if present;
- use at least the following credit, or a substantially equivalent one:

> Contributions by Roxas2712 —
> https://github.com/Roxas2712

A maintained consolidated contributor credit is sufficient; a separate
credit on every screen or for every change is not required. Adapted
contributions must not be attributed exclusively to another author. Other
contributors' credits must also remain intact.

## 4. Earlier licences and permissions remain effective

This notice does not revoke, narrow, or retrospectively add conditions to
any permission already validly granted, including MIT / GPL grants,
separate agreements, or permissions arising from previously submitted
pull requests. Where an earlier grant permits a use independently of this
notice, its existing terms govern that use. For such earlier uses, the
visible credit above is requested to the extent it is not already required.

For subsequent contributions, this is the default statement of Roxas2712's own reserved rights and the specific PR permission, subject to any
applicable existing licence obligations or separately agreed terms. It
does not change another rights holder's licence or guarantee compatibility
of a particular combination of code.

## 5. No warranty

To the extent permitted by applicable law, these contributions are provided
as is, without warranty. No support obligation, endorsement, or rights to
third-party code, game assets, names, or trademarks are granted.
72 changes: 72 additions & 0 deletions docs/native-battle-animation-runtime.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Native battle animation bridge

`src.core.game3.battle.anim` presents the admitted GBA battle through its native
`BattleState`, `Gen3MoveAnim` and `Gen3BallAnim` owners. It does not load another
battle engine or rewrite a mod package. FireRed, LeafGreen, Emerald, Ruby and
Sapphire use the same boundary and their own imported identifiers and records.

## Shared clock and ownership

The native update opens one presentation phase. A source `Anim.update()` can
advance that phase while a custom ending or pose holds the combat update.
Repeated source calls and a later native base call consume the same display
steps. The native dt drives sprite animations. Outside that phase, source
updates cannot manufacture frames.

Move/ball effects, visual waits, HP drain and EXP fill remain native operations.
Only the native combat update consumes command rows, input and outcomes.
Source-launched clips occupy the native animation player and hold the command
queue until that clip finishes. A presentation serial distinguishes a finished
source clip from a newer native animation on the same player. Reset/unload
cancels only a clip still owned by that source admission.

`present(id)` has stable identity for an admitted battler. It observes native
display HP/maximum/level/status/EXP, visibility, offsets and affine effects.
Source visual overrides compose around the existing native sprite draw;
reading a native effect never applies it a second time. `shownBattler` carries
an owned presentation override without replacing the native combatant.
Replacing the session, save, data or catalogue retires old poses and callbacks.

`GameVersion.layout(id)` also reports the registered GBA family (`frlg` or
`rse`) so an unchanged field companion probe can recognize the native host.
It supports current-version and colon queries without changing cache/save
selection; an explicit registered layout takes precedence.

## Geometry and screen effects

`anim_coords` exposes authored anchors and ordering for singles and doubles.
Current imported cartridge coordinates take precedence over the standard
240x160 anchors. Temporary side bindings restore on success and failure and
preserve trailing nil arguments/results.

Supported screen effects are inversion, fade to white/black, darkening,
grayscale and blending to a custom colour. Repeated begin calls reapply within
one guarded render seam; nested seams restore their caller's shader. The native
graphics guard restores render targets, transforms, shaders and leaked pushes
after an error. Synthetic asymmetric sprites test orientation as well as colour.

## Current boundary

This bridge implements native move launch/observation, source pose tweens,
display ratios, sequence observations, screen effects and coordinate bindings.
It deliberately does not advertise a complete presentation API version.
Authored animation commands, mutable VM/sprite/task/palette callbacks,
particle bands, trainer/intro/switch/catch stage control, source HP/EXP tween
commands and complete custom UI captures still require integration. A module
being importable is not evidence of a complete mod boot or playable campaign.

## Validation

- `tests/engine/native_battle_animation.lua`: all five editions; shared clocks,
owned clip completion, held command queues, stale poses/callbacks and 180-frame
native trajectory comparisons per edition with and without the bridge.
- `tools/battle-animation-runtime/lifecycle-check.lua`: SDK entry failure,
teardown and native peer callback identities.
- `tools/battle-animation-runtime/coords-check.lua`: optional local contract
oracle supplied through `BATTLE_COORDS_ORACLE`; no external engine is bundled.
- `tools/battle-animation-runtime/host`: actual Metal/OpenGL sprite and screen
effect rendering, pixel comparisons and graphics error restoration.

Local qualification runs use the repository's QA storage manager, frozen source
copies and dedicated LOVE identities. They use synthetic imported data and art;
they do not open player profiles, save files or ROM originals.
42 changes: 42 additions & 0 deletions docs/native-battle-chrome.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Native battle chrome and particle observations

Battle panel wrappers enter the existing native panel pass. Repeated base
calls paint once, including translucent artwork. Window queries use imported
cartridge templates and the actual native surface width. Healthbox captures
validate the current battle and battler, use native geometry, and apply owned
offsets inside a restored graphics scope. Native shown ailment state stays
separate from queued logical status changes.

Trainer images and picture offsets resolve from native imported records.
Additional genuine window templates and the native trainer portrait index
are retained by new imports. Existing imports retain their available records;
unavailable windows and artwork are reported rather than invented.

The particle observation module projects actual native event poses at the
current clip/frame. It cannot advance a clock or create combat particles.
Reversible position, scale, reflection, visibility and custom drawing changes
compose around the same native event painter, including OAM-composited draws.
The ordinary native path avoids these observations until a consumer asks for
the pool. Retired events and unloaded owners leave no visible source rows.
This is not a complete external animation VM or managed-sprite API.

ROM-free tests cover all five GBA editions. The real Metal/OpenGL host uses
asymmetric synthetic sprites and panels, independent pixel remapping, native
text shaders, multiple logical widths and healthbox offsets. It does not load
the original package or demonstrate complete gameplay.

The unchanged local package has progressed beyond the previously missing
battle chrome, healthbox, trainer-picture and picture-coordinate imports.
Additional battle/UI contracts remain. The complete battle presentation
protocol is not advertised by this change. No private runtime or cartridge
assets are included.

## Public-host composition

The API-2 candidate builds on #327 and its declared prerequisites. It passes
315 chrome/particle, 916 companion, 1,466 terrain, 486 collision and nine
lifecycle checks, plus 3/3 SDK suites. Engine: 95/106 versus reference 94/105,
with the identical eleven inherited failed suites. Actual Metal and OpenGL
runs each pass the same 778 graphics checks, 90 comparisons and 185 readbacks
on the composed public candidate. No full unchanged-package gameplay
acceptance is inferred from those fixtures.
Loading