Skip to main content

Command Palette

Search for a command to run...

PKsinew Devlog # 9: Mass Storage, Settings, Themes, and Save Exporting

A full-circle moment: building the tools I wish I had when this project began

Updated
4 min read
PKsinew Devlog # 9: Mass Storage, Settings, Themes, and Save Exporting

At this point most of Sinew’s core features were in place, so I started looking at what would actually make it comfortable to use long-term.

The first idea was simple: what if Pokémon didn’t have to live inside save files at all?

Mass Pokémon Storage

I added a new Sinew-specific screen accessible from the PC box.
This isn’t a normal in-game PC — it’s external storage.

  • 20 boxes

  • 120 slots per box

  • 2,400 Pokémon total

These Pokémon exist completely outside any save file and can be moved in and out as needed. Internally they’re stored the same way Sinew already understands Pokémon, so transfers in and out are lossless.

(More on all them mythical mons next article when we discuss achievement rewards)


A Real Settings System

Up until now, “settings” was just the button mapper. That wasn’t going to cut it.

I scoped out what was actually needed:

  • Fullscreen toggle

  • Pokémon database builder (from PokéAPI)

  • Theme support

  • A/B button swapping

  • Cache clearing

  • Info / diagnostics screen

That meant building a few new systems properly instead of hacking features in.


Resolution Scaling & Layout Fixes

To support fullscreen and different resolutions, I built a UI scaler.
The goal was to preserve Sinew’s layout proportions regardless of resolution.

This immediately exposed a mistake I’d made earlier:
almost everything was positioned using rect-based layout, except one part — the Pokédex — which still used hard pixel coordinates.

When scaling kicked in, the Pokédex ended up partially off-screen.
Fixing it was straightforward: convert those elements to rect-based positioning so they scale and anchor correctly like the rest of the UI.

Lesson reinforced: pixel positioning always comes back to bite you.


Pokémon Database Builder

Building the Pokémon database itself was easy — I already had a script from day one that pulled sprites and metadata from PokéAPI.

Over time I’d improved it to:

  • Skip already-downloaded files

  • Support multiple sprite packs

  • Be restart-safe

I wrapped this in a proper build screen:

  • A terminal-style output window showing download progress

  • Buttons to build or rebuild the database


First-Run Experience

That raised an obvious issue:
Sinew is unusable without the database.

So on startup, Sinew now checks:

  • Does the database exist?

  • Is it complete?

If not, the user gets a blocking prompt explaining what’s missing and is taken directly to the build screen. The database status is also reflected in the info page.

While working on first-run logic, I also removed another early limitation.


Flexible ROM Name Matching

Previously, ROM detection was hardcoded (FireRed.gba, etc).
Now Sinew searches for known name variations per game.

Users no longer need to rename their ROMs to match exact filenames.


Cache Clearing

Nothing fancy here.
Clear cache clears the cache.


Theme System

Themes were planned from the beginning.

All UI colors already came from a single color scheme module, so adding themes was mostly a matter of:

  • Creating alternate color scheme files

  • Swapping them at runtime

I built a theme manager:

  • Theme list on the left

  • Live preview panel on the right

Because the UI was already abstracted properly, this worked exactly as intended.


Save Exporting (Full Circle Moment)

This was a feature I wished existed when I started Sinew.

Each game now has an Export option that opens an export manager with:

  • Trainer info + items tab

  • Party + box Pokémon tab

  • Export options tab

Instead of dumping everything blindly, the export system lets you toggle:

  • Trainer info

  • Items

  • Party Pokémon

  • Box Pokémon

  • Pokémon details

The initial export worked for trainer data and items, then failed on the first Pokémon.

The issue was raw Pokémon data — binary structures don’t serialize meaningfully, and the export system doesn’t need them anyway. It only needs interpreted values.

After removing raw data and running everything through:

  • Existing item lists

  • Species / move / location tables

  • HP recalculation using growth charts and XP (for boxed Pokémon)

…the full save exported successfully.

The result is a fully readable JSON representation of a Gen 3 save file.

This can now be used by anyone to display or process save data however they want.
Ironically, it would have made building Sinew much easier if it already existed.

For people who’ve been asking for a readable Pokémon save dumper for the last 20+ years — yes, now there is one.


What’s Next

Achievements, reward systems, final polish, and launch prep.

At this point, Sinew stopped being a prototype and started feeling like a product.