Releases: Darkaxt/DualScreenDex
Release list
DualDex 1.1.0-rc.9
DualDex 1.1.0-rc.9
RC9 corrects Atlas location identity and makes the local-map switch available for structurally decoded maps that do not have wild encounters.
Atlas and local maps
- Complete, structurally valid Gen III
gMapGroupscatalogs are retained instead of reducing them to encounter-bearing maps. Sparse hacks keep the existing encounter-keyed fail-closed fallback. - Modern Emerald v3.5 now reconstructs 557/557 local maps. Its live map
0x0009resolves as Littleroot Town with an exact 320×320 ROM-derived raster. - Gen III local rendering supports all 16 hardware-addressable BG palette banks. This covers tiles that use dynamically loaded upper palette slots without weakening tileset or raster validation.
- Atlas no longer substitutes the first revealed marker when the live location is unavailable, eliminating the appearance that the player occupies two places.
- The Local/Atlas shortcut appears whenever the current decoded map has a local asset. Area Pokédex remains disabled for locations without encounters.
Presentation
- Atlas header actions now place Area Pokédex before Settings, matching the Pokédex view.
- The welcome screen now says
Choose a Pokémon game to begin.and removes implementation-oriented storage commentary.
Upgrade behavior
- Catalog schema revision advances from 14 to 15. RC8-derived catalogs rebuild once; settings, discovery knowledge, and SaveRAM snapshots remain intact.
Real-ROM verification
- Official Ruby, Sapphire, Emerald, FireRed, LeafGreen, and Modern Emerald v3.5 retained exact Atlas and complete local-map catalogs: 394/394/518/425/425/557 maps.
- Modern Emerald v3.5 retained its exact Atlas raster and resolves live base
0x0009as Littleroot Town with the frozen local-map raster hash. - The 557-map catalog survived SQLite write/reopen and the Littleroot local PNG was served byte-for-byte by the production loopback API.
- Sparse Gen III map-group and Atlas resolver controls remained green.
DualDex 1.1.0-rc.8
DualDex 1.1.0-rc.8
RC8 preserves the RC7 interface and fixes an upgrade-only catalog-cache defect found on a real Modern Emerald installation.
Catalog rebuild
- Catalog parser cache revision advances from 13 to 14.
- Revision-13 SQLite catalogs are rebuilt once instead of being accepted after newer Atlas and local-map parsing was integrated.
- Settings, discovery knowledge, and persisted SaveRAM snapshots are preserved; only the derived ROM catalog is regenerated.
- The first RC8 load is therefore expected to show the full module progress sequence. Later launches can reopen the rebuilt catalog quickly.
Real-ROM verification
- The retained RC7 catalog was observed through the live loopback API with 428 species and 231 encounter areas but zero world maps, despite advertising the map capability.
- A fresh parse of Modern Emerald v3.5 reconstructed the exact normalized Atlas raster.
- The rebuilt catalog survived SQLite persistence/reopen and served the expected map PNG through the loopback API.
RC8 includes the RC7 loading-progress and Atlas presentation changes unchanged.
DualDex 1.1.0-rc.7
DualDex 1.1.0-rc.7
RC7 preserves every RC4 parser and runtime feature while polishing the startup and Atlas presentation.
Loading progress
- Startup hides the ROM and RetroArch setup actions while bootstrap or catalog loading is active.
- The progress label follows the real active module: ROM identity, core catalog, sprites and entries, evolutions and areas, extended data, or saved catalog.
- Determinate progress uses the existing completed/total unit counts. Bootstrap remains honestly indeterminate until those counts exist.
- Recovery actions return when loading stops without a catalog.
Atlas polish
- Removed the diagnostic-looking world-map and ROM-family title from the Atlas header.
- Selected location context stays on the left as
CURRENTorMAP POINT. - Settings and Area Pokédex use the same right-header action pattern as the Pokédex view.
- A fixed warm-brown map border travels with the raster so its edge remains visually stable while panning.
- The local-map shortcut remains the bottom-left
A/Lcontrol and appears only when the live area has a parsed local-map asset.
No ROM identity, parser, catalog, SQLite, map reconstruction, fog, gesture, WRAM, or SaveRAM contract changed.
DualDex 1.1.0-rc.4-hotfix.2
DualDex 1.1.0-rc.4-hotfix.2
This hotfix preserves every RC4 feature and fixes the remaining Android heap crash during a cold ROM catalog parse.
Fixed
- THUMB ability analysis no longer materializes a complete post-dominator set for every decoded instruction.
- Control-flow joins now use a linear-memory immediate-dominator calculation over the reversed control-flow graph.
- Incomplete graphs and paths that cannot reach a decoded exit remain fail-closed, withholding only the unproven mechanic.
- Warm launches continue reopening the materialized SQLite catalog without repeating the ROM-wide cold parse.
Root cause
The retained Android crash occurred on dualdex-parser at the 256 MiB heap limit inside BattleRoleProvenance.immediatePostDominator. A 4,096-instruction proof could allocate millions of boxed graph-set entries even after background ROM indexing had been bounded in hotfix 1.
No ROM identity rules, catalog tables, map reconstruction, WRAM behavior, or game-facing controls were changed.
DualDex 1.1.0-rc.4-hotfix.1
DualDex 1.1.0-rc.4-hotfix.1
This hotfix preserves every RC4 feature and fixes an Android heap crash observed while a ROM catalog and the automatic shared-storage ROM index were loading concurrently.
Fixed
- ROM-library indexing now streams CRC32 and SHA-256 while retaining only the cartridge header and a 64 KiB buffer.
- Direct GB, GBC, and GBA files preserve their exact identity and platform classification.
- Single-ROM ZIP sources preserve their archive-entry identity and multiple-ROM archives still fail closed.
- The fix removes whole-ROM allocations from the background storage-index thread; catalog parsing and local-map construction remain unchanged.
Evidence
- The retained Android crash was an exact
OutOfMemoryErrorondualdex-storage-indexat the 256 MiB heap limit. - The streaming path reproduces official Emerald SHA-256
a9dec84dfe7f62ab2220bafaef7479da0929d066ece16a6885f6226db19085afand CRC321F1C08FBfrom the complete 16 MiB ROM. - The signed hotfix is installed and revalidated on the affected AYN Thor through ADB after publication.
No ROM parser rules, catalog tables, map reconstruction, WRAM behavior, or game-facing controls were changed.
DualDex 1.1.0-rc.4
DualDex 1.1.0-rc.4
RC4 completes the fourth staged part of DualDex 1.1: presentation and navigation for the normalized read-only player state, plus convergence of the local world-map work.
Trainer Card
- Adds a live Trainer Card with name, public ID, money, play time, Pokédex totals, card stars, and eight stable badge positions.
- Uses ROM-derived portraits and badges when independently available; missing assets fall back per element without hiding valid text or progress.
- Withholds the entire shortcut when no safe Trainer record exists.
Party
- Adds six stable Party slots with nickname, species, level, HP, status, types, nature, ability, experience progress, stats, and four move/PP rows.
- Reuses existing Pokédex, move, and ability details, returning to the same selected Party slot afterward.
- Keeps the player's owned Party visible in Organic, Discovered, and Hidden knowledge modes. Opponent moves remain observation-gated.
- Suppresses unresolved IDs and unsupported fields instead of exposing raw numeric placeholders.
Compact, capability-driven switching
- Trainer, Party, Map, and Settings share the existing Pokédex header; RC4 adds no extra toolbar or navigation row.
- Trainer, Party, and Map actions appear only when the current catalog/session publishes usable data.
- Back navigation returns to the exact prior screen, while Map continues into the existing Area Pokédex flow.
Local world maps
- Includes the committed local-map work converged from master: normalized maps, persistent discovered-area fog, exact multi-area navigation, Pokémon area insets, and fail-closed optional map resolution.
- Preserves the compact map rail, semantic icons, one-pointer pan, midpoint-anchored two-pointer pinch, and fully black outer fog edges.
Deliberate boundary of RC4
- Display selection and recovery remain Stage 5.
- Bag and battle-UI snapshots remain internal for later presentation work.
- Emulator memory access remains read-only. RC4 adds no input injection, memory writes, cheats, or game commands.
Device installation and validation remain manual.
DualDex 1.1.0-rc.3
DualDex 1.1.0-rc.3
RC3 completes the third staged part of the DualDex 1.1 player-state foundation.
One coherent read-only live snapshot
- Reads the ROM-resolved SaveBlock pointer globals first, then requests only the validated SaveBlock, Party, lifecycle, target, encounter-kind, and battle windows for that sample.
- Re-reads pointers for every sample, so a relocated SaveBlock is replaced rather than reused. An invalid SaveBlock2 pointer withholds Trainer and Bag while leaving independently valid location and Party data available.
- Publishes independent Trainer, location, Party, Bag, battle-presence, and battle-UI results. A validated party count of zero authoritatively clears the live party.
- Keeps opponent moves behind the existing observation gate; the new snapshot does not expose raw enemy move slots.
Deterministic live-over-SaveRAM authority
- Valid live Trainer and Party state supersedes stale SaveRAM state.
- Missing or invalid live Trainer data retains a valid saved Trainer.
- A validated empty live party clears Team consistently in both normalized state and Pokédex filtering.
- Disconnect restores the SaveRAM fallback, while changing ROM identity drops all live state from the previous title.
Deliberate boundary of RC3
- Trainer Card and detailed Party presentation pages are Stage 4. RC3 publishes their normalized internal state but does not add the screens yet.
- Bag and battle-UI results remain internal for later presentation work.
- Display selection/recovery is unchanged and remains a later 1.1 stage.
- All emulator memory access remains read-only. RC3 adds no input injection, memory writes, cheats, or game commands.
Device installation and validation remain manual.
DualDex 1.1.0-rc.2
DualDex 1.1.0-rc.2
This second 1.1 candidate adds the ROM-derived runtime and artwork layer needed by the future Trainer Card and detailed Party screens. It preserves the complete DualDex 1.0 baseline and the Stage 1 normalized decoding contract from RC1.
Stage 2: official Emerald runtime descriptors and Trainer artwork
- Resolves the official Emerald SaveBlock1 and SaveBlock2 pointer globals from compiled ROM consumers and publishes a typed Trainer Card and Bag ABI, including name, gender, Trainer ID, play time, money, badge flags, encryption key, and five bag pockets.
- Publishes typed live Party and battle-menu addresses for official Emerald and preserves the separately verified Modern Emerald layout. These are immutable catalog descriptors; RC2 still performs no emulator-memory writes and sends no game commands.
- Decodes the official Emerald Brendan and May 64×64 Trainer portraits plus all eight 16×16 Hoenn badge images from ROM-owned sprite, palette, and loader roles.
- Persists the normalized Trainer assets in schema 12 and serves only catalog-owned assets through the loopback API with immutable caching and fail-closed missing/traversal handling.
- Keeps the runtime descriptor and artwork sections independently optional. A missing or ambiguous optional role leaves the base Pokédex usable instead of inventing a fallback.
Deliberate boundary of RC2
- Trainer Card, detailed Party, and Bag presentation pages are later 1.1 stages. RC2 supplies their verified descriptors and artwork but does not claim those screens yet.
- Live player snapshots, post-battle refresh, and secondary-display selection/recovery remain deferred.
- Trainer Card stars remain unavailable until each condition is mapped from source-backed game state.
Existing compatibility retained
- The stable baseline remains 50/50 selected first-corpus ROMs, 50/50 complete evolution catalogs, 26/50 complete normalized world-map catalogs, and source-backed official Generation III ability behavior.
- Unsupported or ambiguous optional data continues to fail closed while the normal Pokédex remains available.
DualDex 1.1.0-rc.11
DualDex 1.1.0-rc.11
RC11 repairs two user-visible RC10 regressions without changing the parser or catalog compatibility baseline.
Live game clock
- Live clock windows are now read and published even when a validated Generation III runtime layout does not expose dynamic SaveBlock pointers.
- The fix is exercised against the same pointerless layout shape used by Modern Emerald: a source-derived IWRAM clock window produces the validated in-game
HH:MMvalue without using Android wall time. - Pointer-driven unified live snapshots and checksum-validated party reads retain their existing behavior.
Pokédex header
- The root Pokédex title now keeps its compact left inset when Trainer, Party, Map, and Settings actions are present.
- Non-root headers continue reserving the normal back-button column.
Verification boundary
- Read-only ADB evidence on RC10 confirmed that Modern Emerald exposed valid clock bytes while the app state remained null, and that the generic action-header CSS won the cascade over the root rule.
- Focused coordinator, unified live-state, Pokédex production UI, and CSS regression suites cover the repairs.
- The signed APK is built and signed only by the protected GitHub release workflow. It is not installed or launched on a device by this release task; device acceptance remains with the user.
DualDex 1.1.0-rc.10
DualDex 1.1.0-rc.10
RC10 makes Atlas navigation and loading clearer and introduces a validated live in-game clock path.
Live game clock
- The upper toolbar displays a zero-padded
HH:MMvalue when the parser and live-memory reader can validate the running game's clock layout. - Modern Emerald v3.5 is source- and ROM-proven through compiled clock consumers; production does not select it by ROM name, SHA, symbols, or a fixed runtime address.
- Missing, ambiguous, unavailable, or invalid clock values stay hidden. DualDex never substitutes Android wall time or trainer play time.
- Official Gen I–III clock coverage will be audited after RC10. Local-map rendering remains daytime-only in this candidate; the live clock is the prerequisite for a later day/night presentation stage.
Atlas and Pokédex navigation
- The Atlas Pokédex button is always a global Pokédex shortcut. It returns to the last-used Pokédex filter instead of requiring encounter data or opening an Area-filter side path.
- Revealed Atlas locations use compact cyan squares. The live local-player position remains a distinct circular marker.
- The live game clock is geometrically centered in the upper toolbar while the Pokédex title remains left-aligned.
Loading presentation
- Idle guidance is hidden while module-aware loading progress is active, leaving the current module label and progress bar as the loading state.
Upgrade behavior
- Catalog schema revision advances from 15 to 16. RC9-derived catalogs rebuild once; settings, discovery knowledge, and SaveRAM snapshots remain intact.
Verification boundary
- Parser, live-memory, companion-state, API, web navigation, loading, marker, and production web-build checks are part of the RC10 gate.
- The signed APK is built and signed only by the protected GitHub release workflow. It is not installed or launched on a device by this release task; device acceptance remains with the user.