A Gen 3-style Pokémon storage screen for Gen1Recomp: a grid you can see, and a cursor that picks a Pokémon up and puts it down.
Gen 1's PC shows you twenty names in a list and makes you withdraw, change box, and re-deposit to move anything. This is the Ruby/Sapphire answer to that — a 5×4 grid of the current box, one button to grab and drop, and one button between the box and your party.
Download gen3_box-<version>.zip from
Releases, then in the game:
Launcher → MODS → Import mod .zip, or in a running game START → MODS → Import mod .zip.
The launcher can also keep it up to date on its own: the manifest declares this repo, so MODS → the mod's row offers a newer release when one is published, and it can be installed from the launcher's Find mods tab without touching a file at all.
Requires Gen1Recomp with mod API 2 (engine 0.1.37 or newer). Gold needs 0.1.79 or newer — see On Gold below.
The mod runs on Pokémon Gold as well as on Red, Blue and Yellow: the manifest
claims "games": ["gen1", "gen2"], which is what a Gen 2 boot loads a mod on.
Gen 2 support in the engine is a beta, and this port is held to the loader,
modkit gen2check and the headless harness rather than to a full playthrough.
It ships stable all the same: Gold plays, so a Gen 2 player is updated into
this the way a Gen 1 player is.
What is different there, and nowhere else:
| on Gold | |
|---|---|
| boxes | 14 of 20, not 12 — the grid, JUMP TO BOX and FIND all follow |
| the summary | Gen 2's own summary screen, which is a different screen with a different call |
| stats | a withdrawn Pokémon's missing stat block is Gen 2's, Special split in two |
| BOX HEALS | Gold's own PP table, rather than the Gen 1 one that was never loaded |
a party Pokémon holding mail cannot be picked up or displaced — Remove MAIL., the same refusal the vanilla PC gives |
|
| the PC entrance | the BOXES row goes in the storage menu, not in the ITEM PC |
GRID |
CLASSIC always: BIG needs two Gen 1 drawing seams Gold's boot does not have |
| wallpapers | the pattern, without the four-colour palette, for the same reason |
Everything else — FIND, SORT, MARKS, NAME BOX, PLACE CRY, the header row and the BOX MENU — is the same screen doing the same thing.
| Key | Action |
|---|---|
| D-pad UP (at top row) | move onto the header row |
| D-pad DOWN (at header) | move back into the grid |
| D-pad LEFT/RIGHT (at header) | change box |
| D-pad LEFT/RIGHT (off edge) | change box |
| A | pick up / put down — on an occupied slot the two swap; on the header, open the BOX MENU |
| START | the summary of whatever the cursor is on in the grid; on the header (with a search active) find next |
| B | back: carrying one it goes back on a shelf first, otherwise close |
| SELECT | cross to the party and back — this is how you deposit and withdraw |
The header row is the box title at the top, reached by moving up from the grid
in CLASSIC or BIG layout. It carries a MENU button on its right-hand end —
that is the BOX MENU, and everything this screen gained in 1.6.0 is behind it:
FIND, JUMP TO BOX, SORT, MARK MODE, NAME BOX and WALLPAPER. Press UP from the
top row, then A. B works from anywhere and only back — the convention
every other screen in this game follows — and that is what frees START to be
the summary when the cursor is on a Pokémon. With CURSOR WRAP on, UP from
the top row moves to the header, and UP again wraps to the bottom, not back as
in 1.5.2.
START → MODS → Gen 3 Box → OPTIONS..
| Row | Values | Meaning |
|---|---|---|
OPEN FROM |
START+PC / START / PC |
where the BOXES entry appears |
CURSOR WRAP |
on / off | whether the cursor wraps at the edges |
BOX HEALS |
on / off | rest everything in storage when the screen closes |
PLACE CRY |
on / off | play the Pokémon's cry every time one lands in a slot |
GRID |
CLASSIC / BIG |
a 320×288 surface, full-size pics, and a palette per Pokémon |
SLOTS |
CLEAR / 25% / 40% / 60% / 80% |
how opaque each cell is over the wallpaper |
ANIMATE |
on / off | whether the wallpaper drifts (off is a still wallpaper, pixel for pixel) |
OW SPRITES |
on / off | draw Wilds of Kanto's overworld sprites in the CLASSIC grid instead of the half-scale battle pics (on by default; does nothing without that mod — see below) |
OPEN FROM is read each time a menu opens, so changing it takes effect
immediately rather than on the next boot. PLACE CRY is on by default, because
it changes nothing but sound.
The vanilla box PC is left in place whichever way this is set. Nothing is taken away, and turning the mod off leaves a save reaching its storage exactly as before.
BIG asks the renderer for a 320×288 surface instead of the Game Boy's
160×144. Two things follow from the one number that makes it worth doing —
56:
Battle pics draw at scale 1. A pic is 56×56 and the cell is now 56, so every pixel of the sprite is one pixel of the canvas. Not halved, not stretched. It is the first time this screen has shown one undamaged.
Every Pokémon wears its own colours. 56 is seven tiles exactly, and a palette zone is addressed in tiles — so each cell carries that species' own palette, the same table the summary screen and the battle use. Charmander orange, Bulbasaur green, Gengar purple, all at once. The Game Boy could show four palettes on a screen; this shows twenty-one.
CLASSIC can do neither, for the same reason: a 28-pixel cell is three and
a half tiles, and half a tile cannot carry a zone.
Nothing has to be restored. Game:draw asks the top state for its
surface every frame and passes 160×144 when the state has no opinion, so
the moment this screen is not on top the game is back on its own canvas.
What it does not buy: sharper Pokémon. The sprites are the ROM's art
and cannot be redrawn, so BIG buys room and colour, not detail.
Off by default. Turn it on and closing the box screen rests everything in
storage — full HP, status cleared, every move's PP back. It is the Pokémon
Centre's own routine (Pokemon.heal, which is what HealParty does, PP-Up
bonus and all), not a lookalike.
It runs once, when you close, rather than on each placement. Healing per move would have meant deciding what a move even is: a deposit heals, but a swap is a deposit and a withdrawal at once, and dragging a Pokémon between two box slots is neither. Closing has no such question — whatever ended up in storage comes out of it rested, however it got there.
Every box, not only the one you were looking at, for the same reason: "rested unless you happened to be on that box when you left" is not a rule anyone could hold in their head.
The party is untouched. Not to stop you depositing six and taking them straight back — you can — but because the party is the half of this screen that is not storage, and resting your active six for opening and closing a menu would be a Pokémon Centre with extra steps.
It is off by default because it is an economy change rather than a convenience: what stops being needed is Potions and trips to town.
Every box is searched from the cursor forward, wrapping around to where it started. Open the BOX MENU and choose FIND, then pick a search kind:
- SPECIES — type a substring to match against the Pokémon's nickname, its
species name, or its raw species ID.
CHARfinds CHARMANDER, and a Pokémon nicknamed CHARLIE alike. - TYPE — pick from the list of types. The list is built from every species in the data each time, so a mod that adds species does not need to be named here.
- MARK — pick from the four marks: CIRCLE, SQUARE, TRIANGLE, HEART.
A hit lands the cursor on that Pokémon and reports its name in the footer. A miss says so and moves nothing. The search is remembered: with a search active, START on the header row finds the next match. The party is not searched — it is six visible slots on the same screen.
Open the BOX MENU and choose JUMP TO BOX to see all twelve boxes with their
names and population (n/20). Pick one and the cursor moves there without a
save prompt.
Open the BOX MENU and choose SORT. The options are:
- BY DEX — by species ID.
- BY LEVEL — descending, strongest first.
- BY NAME — by species name, then nickname.
- BY TYPE — by the first type, then dex.
- UNDO — restore the order before the last sort, if the box has not changed.
Every sort is stable: equal keys stay in their original order. When you undo, UNDO refuses if the box has changed (a Pokémon arrived or left), and says so.
Open the BOX MENU and choose MARK MODE to toggle it on. With it on, A opens the marking window on a Pokémon instead of picking it up. The window shows four marks: CIRCLE, SQUARE, TRIANGLE, HEART. Use LEFT/RIGHT or A to pick each one and toggle it (they draw as small filled shapes in the corner of the cell), and B to close the window. B from the grid leaves MARK MODE.
Open the BOX MENU and choose NAME BOX to give the current box a custom name up
to eight glyphs. The name shows in the header and in JUMP TO BOX. An empty
confirm keeps the current name unchanged; to return to the numbered default
(BOX 1, BOX 2, etc), type BOX n back.
Choose WALLPAPER to change the background pattern and colours for the current box. Six options are available: PLAIN (the default, no colour change), STRIPES, CHECKS, DOTS, WAVES, and NIGHT (a dark mode where the background is dark and the text is light). Names and wallpapers are saved with the save file, so they travel between screens.
When a Pokémon lands in a slot — dropped into an empty cell, swapped in, or
shelved with B — its cry plays. Turn PLACE CRY off in the options if you do
not want it. A refused landing (full box, full party, nowhere to go) plays no
cry, because nothing landed.
The grid is drawn from battle pics, not icons. Gen 3's grid works
because every species has its own icon. Gen 1 has no such thing — the icon
table maps a species to one of a handful of shapes (GRASS, MON, WATER, BUG)
and the whole game carries four icon images. Twenty identical blobs in a
grid is strictly worse than the vanilla list of twenty names, so the grid
draws each Pokémon's spriteFront at exactly half scale instead. Half is
deliberate: an integer divisor keeps two-bit pixel art crisp where 0.6 would
smear it, and the arithmetic lands — five columns of 28 is 140 across a
160-wide screen, four rows is 112 of the 144 down, leaving a header and a
footer.
Those pictures are read through the engine's Assets.image, which is also
the seam a sprite mod shadows — so if you run an animated-sprite mod, its
art shows up in this grid too.
A box stays a compact array. Gen 1 stores a box as box[1..n] with
nothing after n, not Gen 3's sparse grid, and the vanilla PC, the save
format and every other mod read that shape. So dropping into an empty cell
appends to the end rather than leaving a hole. It is the one thing here that
is not a faithful copy of Ruby, and the price of a save the rest of the game
still understands.
- It will never empty your party — the last Pokémon cannot be picked up, exactly as the vanilla PC refuses it.
- It will never overflow a box past 20 or a party past 6. If you are carrying one and both are full, it refuses to close rather than dropping it out of the save.
- It touches nothing but
save.boxesandsave.party, which are the engine's own storage arrays.
On by default, and it does nothing at all unless you also have
Wilds of Kanto
(overworld_wild_spawns) installed and enabled.
CLASSIC draws a battle pic at half scale into a 28-pixel cell, which is the best Gen 1 has on its own: the four generic party icons are unreadable in a grid, so there was never a third option. Wilds of Kanto builds a per-species overworld sprite for its wilds and its followers, sized for that mod's own use — a whole sprite rather than a halved one, and it fits a 28-pixel cell with room to spare.
With both mods installed, in the CLASSIC grid,
every occupied cell in the box and the party pane draws that sprite instead
of the half-scale battle pic, at an integer scale — the same rule a
replaced battle pic already follows. GRID BIG is untouched: its cell is
56, a battle pic already draws there at scale 1, and a 16-pixel overworld
sprite would have to be blown up four times to fill it.
This reaches the other mod through the engine's own mod.find, never a
manifest dependency, so it stays an optional enhancement rather than a
requirement — nobody without Wilds of Kanto installed is affected by it
existing. Nothing of that mod's art is copied into this repository; this
only ever asks it, at runtime, for a path and draws it, the same seam a
sprite-replacement mod already uses to shadow the battle pics above. If
anything about that call is missing or fails — the mod absent, no sprite
resolved, a black-silhouette fallback, or an error — the cell falls back
silently to the battle picture that has always worked.
Which of that mod's sprites you get. It is asked the same way that mod
already draws the icons you see in the vanilla party menu: through its
follower sprite service, which honours whatever Sprite Style you picked
over there. Its general spriteProviders seam is tried second, so the
feature survives if that party-menu path ever goes away.
On by default because it cannot change anything for anyone who does not
have Wilds of Kanto installed — without it the whole feature is one nil
check and the battle pic. If it ever misbehaves against a future release of
that mod, turning it off restores exactly the old drawing.
Got an idea for something this should do? Open an issue — there is a template for it. You do not need to know any Lua, and you do not need to have worked out how it would be built. Describe what you want and why.
Want to build it yourself? Open a pull request. Collaboration is welcome on any part of this.
Anything you send that includes art has to be your own work — nothing traced, edited or recoloured from a ROM, a fan game, a wiki or another mod.
This mod is Lua source only. It contains no ROM, no ROM-derived data, and
no game assets — modkit lint reports no ROM-derived content, and the
sprites in the grid are read at runtime from the cache the engine builds
from your own legally obtained cartridge dump. Nothing is redistributed
here.
You need Gen1Recomp and your own legally obtained Pokémon Red or Blue ROM. Neither is provided by this repository, and no help obtaining one will be given.
Not affiliated with, endorsed by, or connected to Nintendo, Game Freak, or The Pokémon Company. Pokémon and all related names are trademarks of their respective owners, used here only to describe what this software does.
If this saved you some scrolling, you can support the author here: https://linktr.ee/made_in_taly
MIT — see the file for terms.