Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
62c9029
Platinum: Cynthia rides the Distortion World lifts with the player
Darkatek7 Nov 14, 2026
cb8d409
gen4 checks: take cache path from GEN4_DATA/APPDATA instead of hard-c…
Darkatek7 Nov 14, 2026
a5aa86a
gen4_trainer_message_check: count handlers in modules the VM loads on…
Darkatek7 Nov 14, 2026
0158cee
Gate the Sweet Scent and Teleport roamer calls behind GameVersion.isG…
Darkatek7 Nov 14, 2026
5e05032
Escorted Gen 4 steps no longer fall through to Johto's roaming-beast …
Darkatek7 Nov 14, 2026
d4937bd
poketch checks: stub apps keep the order the steps index (engine now …
Darkatek7 Nov 14, 2026
7c6debc
gen4_mining_spots_check: the cartridge keeps the saved spots on leavi…
Darkatek7 Nov 14, 2026
abd3985
Gen 4 screens fill string buffers through gen4Markup instead of hand-…
Darkatek7 Nov 14, 2026
ca375b6
gen4_player_pic_check: Platinum's player backs are trbgra classes 0/1…
Darkatek7 Nov 14, 2026
47d68c8
gen4_height_rule_check: judge Pastoria gym over its three water level…
Darkatek7 Nov 14, 2026
b1a884c
gen4_game_corner_check: the slot machine is built (pt_slot_machine), …
Darkatek7 Nov 14, 2026
bf324ed
gen4_declined_census_check: dress-up photos are answered by Gen4Photo…
Darkatek7 Nov 14, 2026
b5ee663
gen4_form_mechanics_check: stub GameVersion.isNds/isGen5 (ItemEffects…
Darkatek7 Nov 14, 2026
de757bb
gen4_party_check: let Screens.resolveId reach the real MenuStyle inst…
Darkatek7 Nov 14, 2026
8a85ce9
Platinum playthrough: beats past the credits to Heatran
Darkatek7 Nov 14, 2026
0dd437c
tests: title_zone_seams reads Renderer with CRLF checkouts; soft_rese…
Darkatek7 Nov 14, 2026
8f0e564
Xbox controller support for Gen 4: lower-screen virtual cursor, stick…
Darkatek7 Nov 14, 2026
1253ab0
wide_battle_layout: pin the pic-anchored band (centres 26 / 124) the …
Darkatek7 Nov 14, 2026
9c10bd8
Merge branch 'worktree-agent-a05b74edce035715b' into platinum-stable
Darkatek7 Nov 14, 2026
a2145bc
Merge branch 'worktree-agent-ae2905fa2a30a98ee' into platinum-stable
Darkatek7 Nov 14, 2026
1d2f556
Platinum playthrough: Eterna Forest with Cheryl; drop a stale lift pa…
Darkatek7 Nov 14, 2026
69f994f
Platinum playthrough: walk the League room to room
Darkatek7 Nov 14, 2026
44763fa
Add Renegade Platinum as its own version on the Platinum engine
Darkatek7 Nov 14, 2026
7a5d6d1
Document Renegade Platinum support; battle harness SLOT
Darkatek7 Nov 14, 2026
7e2ceb6
Merge branch 'worktree-agent-aa6670bdabe6b78d8' into platinum-stable
Darkatek7 Nov 14, 2026
134566c
Playthrough runner: PT_CONTINUE saves and continues between beats
Darkatek7 Nov 14, 2026
1d3940e
Platinum: stamp the met location with the map's label
Darkatek7 Nov 14, 2026
819b0a2
Merge branch 'worktree-agent-a8945e922d7ccb39c' into platinum-stable
Darkatek7 Nov 14, 2026
01d3e38
Platinum battles: headless fuzzer, fix doubles locked actions/items, …
Darkatek7 Nov 14, 2026
237a799
Merge branch 'platinum-stable' into worktree-agent-adea5e0b8325f8aa0
Darkatek7 Nov 14, 2026
021bf7a
Add Gen 4 field sweep harness; fix party-pick cancel hang and trainer…
Darkatek7 Nov 14, 2026
f614837
metHere: name the live map, not the last saved one; regression check
Darkatek7 Nov 14, 2026
a994157
Merge branch 'worktree-agent-adea5e0b8325f8aa0' into platinum-stable
Darkatek7 Nov 14, 2026
e899887
Renegade Platinum: trainer lines past the offset table, intro Pokemon…
Darkatek7 Nov 14, 2026
38049c3
Trainer message check: Renegade expectations
Darkatek7 Nov 14, 2026
49a7ff8
Field sweep: warp-in landings, camera/bike/run walking, party and bag…
Darkatek7 Nov 14, 2026
15a8496
Field sweep: regression probes (--regress) for the three fixed bugs
Darkatek7 Nov 14, 2026
3a744c2
Platinum: accept the European and German cartridges
Darkatek7 Nov 14, 2026
fea4dba
Renegade Platinum: playthrough beats for the hack's rival battle and …
Darkatek7 Nov 14, 2026
baedad5
Renegade doc wording
Darkatek7 Nov 14, 2026
12ba3d6
Gen 4 extractor: read the German Platinum the way it reads the US one
Darkatek7 Nov 14, 2026
732e061
Gen 4 runtime: key on ids where German text broke English lookups
Darkatek7 Nov 14, 2026
39b8a56
Merge branch 'worktree-agent-a6e26d21f24315705' into platinum-stable
Darkatek7 Nov 14, 2026
ddc7d20
Field sweep: reset the field between maps; Battle Factory takeRentals…
Darkatek7 Nov 14, 2026
d407d5c
Merge branch 'worktree-agent-ae423ec5b7d1359ba' into platinum-stable
Darkatek7 Nov 14, 2026
25671e2
gen4_met_location_check: per-language place-name expectations
Darkatek7 Nov 14, 2026
ebb5bdf
Gen 4 checks: assert per language (item ids, HM prefix, place names),…
Darkatek7 Nov 14, 2026
de1fe88
Pal Park / CrossGen / Walker: reach Gen 4 items and moves by id throu…
Darkatek7 Nov 14, 2026
76dedef
Whiteout: find the nurse/Mom scripts, loss bank and scurry line by sh…
Darkatek7 Nov 14, 2026
d4ea1d5
Gen 4 playthrough: walk Renegade Platinum's story edits through Spear…
Darkatek7 Nov 14, 2026
6fc5851
Randomizer: protected/banned move, item and trainer-class lists read …
Darkatek7 Nov 14, 2026
8683023
German: hero default names from the cartridge's name bank; ROM langua…
Darkatek7 Nov 14, 2026
0d2fe75
Field sweep: driver batch fix, seeded engine RNG, failure diagnostics…
Darkatek7 Nov 14, 2026
b4034a9
Gen 4 abilities: berries by pocket
Darkatek7 Nov 14, 2026
97142fe
German battle: the cartridge's own battle lines (bank 368/0) in place…
Darkatek7 Nov 14, 2026
429099e
docs: German runtime coverage
Darkatek7 Nov 14, 2026
b3a032f
Merge branch 'worktree-agent-a4fd0ebd874b65dde' into platinum-stable
Darkatek7 Nov 14, 2026
89ada67
Field sweep: finish reaped battles through their own onFinish
Darkatek7 Nov 14, 2026
540041b
Gen 4 playthrough: walk Renegade Platinum's story to Heatran
Darkatek7 Nov 14, 2026
44fa2ba
Gen 4 playthrough: Psychic for Renegade's Saturn (Dry Skin Toxicroak)
Darkatek7 Nov 14, 2026
7413df8
Merge branch 'worktree-agent-a95c1caccc2dafbb7' into platinum-stable
Darkatek7 Nov 14, 2026
845b37e
Field sweep: retry START after a scene, report cycling prompts as loo…
Darkatek7 Nov 14, 2026
4c91995
Gen 4 (Platinum family): trainer Pokemon use TrainerData_BuildParty's…
Darkatek7 Nov 14, 2026
40b2b1a
Merge branch 'worktree-agent-a112f15273f4d1647' into platinum-stable
Darkatek7 Nov 14, 2026
e3042bc
Field sweep: cycling-prompt threshold
Darkatek7 Nov 14, 2026
8a86923
German battle: status, weather, items, abilities, hazards and stat li…
Darkatek7 Nov 14, 2026
fbc2c48
German battle: ability swap/shadow tag/anger point/spikes lines
Darkatek7 Nov 14, 2026
d1b19e2
Field sweep: count Distortion World tasks as the field being busy; he…
Darkatek7 Nov 14, 2026
0076720
Merge branch 'worktree-agent-aa92a10297bec9fff' into platinum-stable
Darkatek7 Nov 14, 2026
6d5fb62
checks: contest, dance, daily slots, field queries, fly, game corner,…
Darkatek7 Nov 14, 2026
5c712cf
checks: safari, seals, tablet, tag battle, town map read a non-Englis…
Darkatek7 Nov 14, 2026
93a70c9
Merge branch 'worktree-agent-a23ebe50aabb4d58c' into platinum-stable
Darkatek7 Nov 14, 2026
d9cfd4b
Gen 4 doubles: fill empty slots after residual faints, not before
Darkatek7 Nov 14, 2026
84e9c36
Merge branch 'worktree-agent-a02709ea2c06e7e34' into platinum-stable
Darkatek7 Nov 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ items, and the Gold/Silver title sequence.
It has since grown well past Generation II. The same launcher now imports and
runs **FireRed** and **Emerald** (Gen 3), **Platinum**, **HeartGold** and
**SoulSilver** (Gen 4), and **Black** and **White** (Gen 5), plus the
**Polished Crystal** and **Prism** romhacks — all side by side, all from your
**Polished Crystal**, **Prism** and **Renegade Platinum** romhacks — all side by side, all from your
own cartridge dumps. Around the games sit the **Monster Walker** (a
next-gen Pokéwalker with minigames and a Watt Shop), a **Map Editor**, a
**Save Editor**, machine **translation** into 25 languages, **cloud saves**,
Expand Down Expand Up @@ -80,10 +80,18 @@ revision) so you know why — see [docs/rom-revisions.md](docs/rom-revisions.md)
| Emerald | GBA | Alpha | `f3ae088181bf583e55daf962a92bb46f4f1d07b7` |
| Platinum (Rev 1) | DS | Pre-alpha | `0862ec35b24de5c7e2dcb88c9eea0873110d755c` |
| Platinum (Rev 0) | DS | Pre-alpha | `ce81046eda7d232513069519cb2085349896dec7` |
| Platinum (Europe, English) | DS | Pre-alpha | `8d15cd443d4e83e20493c79d3f9dc408c4f51ae0` |
| Platin Edition (Germany) | DS | Pre-alpha | `5d009a175c77d4387cde26d34efb71aee825a938` |
| HeartGold (USA) | DS | Pre-alpha | `4fcded0e2713dc03929845de631d0932ea2b5a37` |
| SoulSilver (USA) | DS | Pre-alpha | `f8dc38ea20c17541a43b58c5e6d18c1732c7e582` |
| Black (USA/EU) | DS | Pre-alpha | `26ad0b9967aa279c4a266ee69f52b9b2332399a5` |
| White (USA/EU) | DS | Pre-alpha | `bc696a0dfb448c7b3a8a206f0f8214411a039208` |
| Renegade Platinum (over Platinum USA Rev 1) | DS | Pre-alpha | `381f9eef44564602a5f6469ee8c390fbb8ebac3a` |

All four Platinum dumps import as the same game and share one save. The
German cartridge plays in German (its own text, names and localized art); the
European one is the US game with the European Game Corner. See
[docs/rom-revisions.md](docs/rom-revisions.md#platinum-europe-and-germany).

HeartGold, SoulSilver, Black and White dumps that have had their trailing `FF`
padding trimmed are also accepted, as long as every game byte is intact — see
Expand Down Expand Up @@ -123,6 +131,10 @@ Everything below arrived since this README was last updated.
including Professor Juniper's intro in BW — as **PRE-ALPHA** builds.
- **Polished Crystal** (beta) and **Prism** (experimental) romhacks, with
audio, overworld rendering and feature-parity fixes.
- **Renegade Platinum** (pre-alpha) imports as its own game on the Platinum
engine. It has the hack's species, moves, trainers and encounters, the
Fairy type (its chart, names and icons) and its 1/512 shiny odds. See
[docs/renegade-platinum.md](docs/renegade-platinum.md).
- **Mass ROM import**: pick a folder's worth of dumps at once.

### Monster Walker
Expand Down
61 changes: 61 additions & 0 deletions docs/controller.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Xbox controller (Gen 4 and the launcher)

SDL game-controller mapping through `love.gamepad*` (an "Xbox One For Windows"
pad reports as a gamepad; the triggers arrive as axes and are edge-detected at
0.5 / 0.3 in `Input.AXIS_BUTTONS`). Raw `joystick*` events are used only for
sticks SDL has no mapping for.

| Xbox | Action | Gen 4 meaning |
|---|---|---|
| A | A | confirm / talk / tap (cursor mode) |
| B | B | cancel; hold to run in the field |
| Y (north) | X | field start menu (DS X) |
| X (west) | Y | registered key item (DS Y) |
| Start | Start | start menu |
| Back/View | Select | Select (reorder moves / bag items, Pokétch clear) |
| LB | L | raises the Pokétch from the field (L or B lowers it) |
| RB | R | next Pokétch app; camera tilt in the field |
| D-pad / left stick | directions | move, menus (held = repeat) |
| RT | TOUCH | toggle the lower-screen cursor (below) |
| LT | CHAT | online chat only |
| L3 / R3 | zoom out / in | field zoom |

All rows are rebindable in the CONTROLS screen (pad capture works for buttons,
triggers and right-stick directions; the TOUCH row is new).

## Left stick

Press at 0.5, release under 0.3. Eight-way input maps to four directions with
a 1.3x diagonal bias: a held direction keeps its axis until the other axis is
clearly stronger, so a 45-degree wobble does not flip between two directions.
With two controllers the one deflected furthest drives the stick; each pad has
its own button sources, so two pads holding a button are one press and the
button stays held until both release.

## Lower-screen cursor (the DS touch screen)

RT toggles a crosshair in the bottom screen's 256x192 space (dual-screen games
only). While it is on: left stick and D-pad move it (the stick is quadratic for
fine control), A presses and drags (hold A and move), and every other button
keeps its normal job (B still backs out). It maps through
`SecondScreen.fromLocal`, the inverse of what every screen's touch handler
already does, so it works in swap, inset, vertical/horizontal and `display`
modes and drives every pointer-only screen: Pokétch apps (drawing pad,
dowsing, calendar, calculator, roulette, move tester, party apps), the battle
bag/party touch screens, Underground, contest and photo dress-up, Poffin
cooking, mining, naming-screen touch keys. It switches itself off whenever the
top screen changes (so the stick can never stay stolen), and refuses to start
over the field when no lower screen is showing.

Pokétch without the cursor: LB opens it, D-pad left/right or RB change app, A
presses the app's main button, B/L/Start close.

## Hotplug

`love.joystickadded` is forwarded (the touch overlay steps aside); removal
resets input and lifts the virtual finger. Controllers added or reconnected
mid-game send ordinary gamepad events.

## Tests

`python tools/run_lua_check.py tools/gen4_xbox_pad_check.lua`
6 changes: 6 additions & 0 deletions docs/gen4-platinum.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ Rev 0 (`ce81046eda7d232513069519cb2085349896dec7`) is registered as an
alternate hash. pokeplatinum builds both and the filesystem layout is the same
in each, which is what the extractor reads.

The English European cartridge (`8d15cd44…`, CPUE rev 10) and the German
Platin Edition (`5d009a17…`, CPUD) are alternates too. The German build moves
its 32 language archives under `/resource/ger/`, which
`src/import/Gen4Regions.lua` answers at the filesystem. See
[rom-revisions.md](rom-revisions.md#platinum-europe-and-germany).

### Files that will matter

| Path | Bytes | What |
Expand Down
55 changes: 55 additions & 0 deletions docs/platinum-parity-progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -2135,3 +2135,58 @@ it is the clock exclusion); nothing animating that is not on those lists, since
the union only ever adds; no prop drawn twice, since twelve models have just
changed pass; and a stutter check on a waterfall route or in Canalave, for the
14 extra chunks today and 41 after the flipbooks land.

## Story playthrough pass (November 2026)

The automated playthrough (`tools/gen4_playthrough/platinum.lua`, 78 beats from
the bedroom to the Hall of Fame) passed every beat on a USA Rev 1 cache before
this pass. The fixes below come from what the log showed while the beats still
passed — scenes that played to missing actors, no-op commands, stalls — and
from the beats added past the credits. Each is checked against pret's
pokeplatinum.

- **Cynthia rides the Distortion World lifts.** 1F's lift (progress 2) and
B6F's (progress 7) carry Cynthia down with the player
(`DistWorldElevatorPlatform_BeginMovement` / `_ChangeMaps`): the same map
object, renumbered for the next floor (B1F 128; B7F 128 with script 6). The
next floor's object table has no Cynthia for that moment, so B1F's and B7F's
first-entry scenes moved a local id that was not there ("no object with
localId 128") and played to an empty platform. `Gen4DistPlatforms` now
takes the passenger at the start of the ride, lifts her with the platform,
and places her on the arrival floor at the world tile she rode on (B7F: she
then walks to exactly the tile B7F's own table gives her at progress 8).
Check: `tools/gen4_dist_surface_check.lua <cache>/data/generated` (53).
- **The playthrough now goes past the credits** (91 beats, all passing in one
unbroken run on USA Rev 1). New beats: Eterna Forest with Cheryl as the
partner (her two-on-two trainers, the Soothe Bell); the Elite Four and the
Champion walked room to room — out by the door each win removes, up each
lift room's `TriggerPlatformLift`, walked in by the next room's frame
script — instead of teleported into; the credits to the title and a
CONTINUE at the house 2F (Mom's post-game scene); the National Dex at
Rowan's lab (a cheat, said as one: the Sinnoh dex marked seen); the
S.S. Spiral (Cynthia's send-off) to the Fight Area; Barry, Palmer and Buck
there; Route 227 (Crasher Wake and Barry, Buck's patrol request); Stark
Mountain — the grunts, Mars and Jupiter, Buck as the partner through room 2
(Rock Smash at (41,15), the Strength boulder at (29,12) pushed to (48,12),
his multi battles), Charon's arrest and Looker outside; the Battleground's
Buck; Heatran. Trainer-defeated flags are read from `save.gen4TrainerFlags`
(where the port keeps TRAINER_DEFEATED_FLAGS_START + id), not `save.flags`.
- **`PT_CONTINUE=1`** (tools/gen4_playthrough/runner.lua): save and continue
between every two beats — the field's `captureSave`, the save through the
codec, and `Game:restoreSave` as the title's CONTINUE — so each beat runs on
what a reload brings back. Off by default; shared by every game's beats.
- **Platinum Pokémon have a met location again.** The cartridge stamps a
caught, given or hatched Pokémon with the map's label
(`MapHeader_GetMapLabelTextID`, a place-name bank 433 index; egg_hatch.c,
field_battle_data_transfer.c). The port passed `BattleState.metHere`, a
Gen 3 region-map section that is nil on every Gen 4 map, so every Platinum
Pokémon was met nowhere: the Hall of Fame at the end of the story printed
"Met at ." and the summary left the line out. `Gen4Origin.stamp` now takes
the label of the map the player is on (the live field map — `save.player.map`
is only written by a save, so it named wherever the last save was: the
starter came out "met in Twinleaf Town"), and the Hall of Fame and the
summary name a numeric location from bank 433 (which also names the
locations NDS-imported Pokémon carry). HeartGold/SoulSilver, whose place
names are another bank, are left as they were. The starter now reads
"Route 201, Lv. 5". Check: `tools/gen4_met_location_check.lua
[<cache>/data/generated]` (13).
Loading