Save Editor support

The Save Editor changes persistent game data. It does not change emulator save states.

Supported games

Game Platform Input Recognition limit
Pokémon Red Game Boy Raw 32 KiB SRAM Shares its layout with Blue
Pokémon Blue Game Boy Raw 32 KiB SRAM Shares its layout with Red
Pokémon Yellow Game Boy Raw 32 KiB SRAM Uses the stored starter marker
Pokémon Gold Game Boy Color Raw 32 KiB SRAM Shares its layout with Silver
Pokémon Silver Game Boy Color Raw 32 KiB SRAM Shares its layout with Gold
Pokémon Crystal Game Boy Color Raw 32 KiB SRAM English retail layout
Pokémon Ruby Game Boy Advance Raw 128 KiB Flash Shares its layout with Sapphire
Pokémon Sapphire Game Boy Advance Raw 128 KiB Flash Shares its layout with Ruby
Pokémon Emerald Game Boy Advance Raw 128 KiB Flash English retail layout
Pokémon FireRed Game Boy Advance Raw 128 KiB Flash Shares its layout with LeafGreen
Pokémon LeafGreen Game Boy Advance Raw 128 KiB Flash Shares its layout with FireRed
Pokémon Diamond Nintendo DS Raw 512 KiB save Uses the Diamond/Pearl block layout and profile version
Pokémon Pearl Nintendo DS Raw 512 KiB save Uses the Diamond/Pearl block layout and profile version
Pokémon Platinum Nintendo DS Raw 512 KiB save Uses the Platinum block layout and profile version
Pokémon HeartGold Nintendo DS Raw 512 KiB save The profile version selects the title
Pokémon SoulSilver Nintendo DS Raw 512 KiB save The profile version selects the title
Pokémon Black Nintendo DS Raw 512 KiB save Stored version and Black/White block checksums
Pokémon White Nintendo DS Raw 512 KiB save Stored version and Black/White block checksums
Pokémon Black 2 Nintendo DS Raw 512 KiB save Stored version and sequel block checksums
Pokémon White 2 Nintendo DS Raw 512 KiB save Stored version and sequel block checksums
Super Mario World Super Nintendo Raw 2 KiB SRAM Needs a valid primary or backup file checksum
The Legend of Zelda: A Link to the Past Super Nintendo Raw 8 KiB SRAM Needs a valid file marker and checksum

The Pokémon handlers cover the English layouts named above. A matching file size alone does not prove support.

The default registry also includes 589 fixed profiles for 80 title groups. The catalog lists their profile counts, exact editable scope, accepted physical variants, and creation support.

Editable fields

Family Fields
Pokémon Generation I Trainer name, rival name, Trainer ID, occupied bag/PC item IDs and quantities, money, coins, play time, text speed, battle options, eight badges, and all 151 Pokédex owned/seen flags; Yellow adds Pikachu friendship, Pikachu Beach score, sound, and printer brightness
Pokémon Generation II Trainer name, Trainer ID, money, stored money, coins, play time, options, inventory, 16 badges, and all 251 Pokédex owned/seen flags
Pokémon Generation III Trainer name, both Trainer IDs, gender, money, coins, play time including frames, options, bag and PC item IDs/quantities, eight badges, and all 386 Pokédex owned/seen flags; Emerald adds Battle Points
Pokémon Generation IV Both Trainer IDs, gender, money, coins, play time, Battle Points, and badges (eight in Diamond/Pearl/Platinum, 16 in HeartGold/SoulSilver)
Pokémon Generation V Trainer name, both Trainer IDs, gender, money, play time, Battle Points, eight badges, and inventory item IDs/quantities
Super Mario World Each file's 96 level flag bytes, 120 event flags, both players' submaps, animations, coordinates and tile pointers, four Switch Palaces, and exit count
Zelda: A Link to the Past Player name, resources, health, equipment, inventory, bottles, magic, capacity upgrades, dungeon maps/compasses/keys, and progression for each file

The Zelda resource fields cover rupees, bombs, and arrows. Its equipment fields cover swords, shields, armor, and gloves.

Generation I and II names accept up to seven supported game characters. The escapes { and } represent the PK and MN glyphs; each uses one game character.

Generation I and II item-list edits cover occupied slots. Generation II also exposes quantities for all 50 TMs and seven HMs, including zero. Key items have no stored quantity. Adding, removing, or reordering their item-list slots remains unsupported.

Generation III inventory fields include empty slots. Each slot has an item ID and quantity. Adding an item requires both values. Clearing a slot uses zero for both values. Item IDs use each game's numeric item table; a numeric ID does not prove that the item belongs in that pocket.

The Generation III slot counts, including PC storage, are 216 for Ruby/Sapphire, 236 for Emerald, and 216 for FireRed/LeafGreen. PC quantities remain unencrypted. Bag quantities retain the game's encryption.

Generation III owned flags also set all three seen copies. Clearing a seen flag also clears its owned flag. Previews include these related changes. Conflicting explicit assignments are rejected.

Numeric fields expose the ranges in save export-schema. A representable value does not establish a playable combination of progression flags, inventory, or player coordinates.

Zelda dungeon fields cover all 14 dungeon entries. Progression includes the game state, map icon, spawn point, saved world, and named story flags. A file name contains at most six supported ASCII characters.

Read-only fields

Family Fields
Pokémon Generation I Current PC box and formatted play-time summary
Pokémon Generation II Formatted play-time summary
Pokémon Generation III Formatted play-time summary and security key
Pokémon Generation IV Formatted play-time summary

Recognition

Recognition returns recognized, ambiguous, or unsupported. An ambiguous result needs an explicit game choice.

Red and Blue remain ambiguous without a selected game. The same rule applies to Gold/Silver, Ruby/Sapphire, and FireRed/LeafGreen.

Generation IV uses the block layout and stored game version after both save-block checks pass. Generation V checks the stored version and every primary block checksum, including the checksum table. Zelda uses its file marker and checksum. Super Mario World checks the file checksum and its backup.

Integrity rules

  • Generation I checks its complemented byte checksum, packed-decimal values, and inventory markers. Edits preserve the box storage and other bytes outside the edited fields and checksum.
  • Generation II checks primary and backup additive checksums. Edits need both copies to pass.
  • Generation III checks all 14 sections. It changes only the active slot and each affected section checksum.
  • Generation IV checks redundant copies, block footers, counters, signatures, sizes, and CRC-16 values.
  • Generation V repairs each changed block checksum, its table entry, and the checksum table itself. Other bytes, including backup storage, stay unchanged. Invalid primary checksums block editing.
  • Super Mario World rewrites both copies of each edited file and preserves unedited files. One valid copy can repair its damaged twin.
  • Zelda checks three primary files and their duplicate copies. It rewrites both copies only for an edited file.

Every write starts from a copy. The handler reparses the result before it returns the edited bytes.

Generation III chooses the newest complete valid slot. Each slot has 14 sections with IDs, signatures, counters, and checksums. An empty backup slot permits editing with a warning and stays empty. A damaged backup slot blocks editing, even if the active slot passes. No complete valid slot means no editable save.

Procedure: Edit a game save in the browser.

Save generation

Fresh generation is available for Super Mario World and The Legend of Zelda: A Link to the Past.

The repository schema catalog also limits fresh generation to the File 1 profiles for those two titles. Every other catalog profile requires a template.

Each of the two titles has two generation choices that write identical bytes. The browser shows one game entry and a Files to edit choice:

Browser choice Game ID Editable properties
All files super-mario-world, zelda-a-link-to-the-past Every file in the save. Zelda shows named equipment, inventory, and progress choices.
File 1 only super-mario-world-schema, zelda-a-link-to-the-past-file-1-schema File 1 and its backup; other files are preserved. Zelda shows raw numeric codes and raw name glyphs instead of choices.

For Super Mario World the two choices expose the same 233 properties in File 1. The properties differ only for Zelda: 122 against 127.

Super Mario World starts with one file at Yoshi's House, the original initial movement flags, a matching backup, and two empty slots.

The Zelda save follows the original file initialization. Its image contains one file named LINK, three hearts, no acquired equipment, a valid backup, and two empty file slots. Its bytes follow the original game's file initialization. The browser shows only editable properties for a fresh save; the full document retains its read-only metadata.

Fresh Pokémon generation is unavailable because structure and checksum checks do not prove a playable game state. Earlier generated Pokémon files may pass those checks while missing game initialization data. Pokémon templates require a save made by the matching game. Direct Rust handler calls enforce the same generation capability; synthetic Pokémon initializers remain test-only.

Template generation supports every editable registry entry. It validates an existing save, applies optional field assignments, and writes a separate file. Without assignments, the output is byte-identical to the template. Container wrappers are retained. A template cannot be the output path.

save list-games reports the game definitions and the IDs that support fresh generation. save create requires an output path unless it runs with --dry-run.

Procedures: Create saves in the browser and Create saves with the CLI.

Built-in schema catalog

The application includes every supported game definition in its default registry. The catalog contains 611 profiles: the original Pokémon, Super Mario World, and A Link to the Past definitions and 589 additional profiles. Existing IDs remain stable, including IDs that end in -schema. The catalog and its profile counts are in data/save-schemas/README.md.

The 589 additional profiles require explicit game selection. The original game families retain automatic recognition.

A profile represents one fixed slot, player, region, or storage variant. Profile count is not title count. A compatible physical format or save size does not make an unrecognized game editable.

The built-in definitions use the shared storage, layout, checksum, recovery, and text engines. Game-specific Rust callbacks implement rules that need conditional fields, checked arithmetic, or linked writes. The CLI and browser use the same registry and editing engine.

Adding or changing a game definition requires an application update. The CLI does not load layout packs, and the browser does not import them. save export-schema exports the fields of an inspected save for user interfaces and automation. Its JSON output is not an importable game definition.

Integer and packed-decimal fields use their stored range unless a definition sets a narrower constraint. A stored value or combination can still be invalid during play. Unknown numeric choice values appear as raw:<decimal> and survive unrelated edits.

Save containers

The editor removes these wrappers before recognition and puts them back on output. The wrapper metadata survives unchanged. If the container has a checksum, the editor updates it to match the changed save.

Container Extensions Layout Checksum
GameShark SP save (SharkPortSave) .sps, .xps Length-prefixed strings, a 28-byte game block, the raw save Recomputed on output
GameShark SP snapshot .gsv 1072-byte header, 128 KiB raw flash None
DeSmuME save .dsv Raw save, then a 122-byte footer None
DexDrive memory card .gme 3904-byte header, 128 KiB raw card None
Virtual Game Station memory card .mem, .vgs 64-byte header, 128 KiB raw card None

A GameShark SP checksum that does not match produces a warning, not a rejection. A DeSmuME footer whose padded size disagrees with the file produces a warning.

save identify reports the container under container, the raw save size under save_size, and the file size under file_size.

Physical save formats

An unsupported save still gets a physical format guess from its raw size. The report lists every format below that matches, under potential_formats. A size match alone does not prove the platform. A format with a signature check sorts first and sets signature_checked.

Platform Formats Signature
Game Boy and Game Boy Color Battery SRAM 512 B (MBC2), 2 KiB, 8 KiB, 32 KiB, 128 KiB None
Game Boy Advance EEPROM 512 B, EEPROM 8 KiB, SRAM 32 KiB, Flash 64 KiB, Flash 128 KiB None
Nintendo Entertainment System Battery WRAM 8 KiB None
Super Nintendo Battery SRAM 2 KiB, 8 KiB, 32 KiB, 64 KiB, 128 KiB None
Nintendo 64 EEPROM 512 B, EEPROM 2 KiB, SRAM 32 KiB, FlashRAM 128 KiB, Controller Pak 32 KiB, Mupen64Plus combined save 290 KiB None
Nintendo DS 512 B, 8 KiB, 64 KiB, 128 KiB, 256 KiB, 512 KiB, 1 MiB, 8 MiB, 32 MiB None
Sega Genesis and Mega Drive Cartridge SRAM 8 KiB, 32 KiB, 64 KiB None
Sega Master System and Game Gear Cartridge SRAM 8 KiB, 32 KiB None
Sony PlayStation Memory card 128 KiB MC at offset 0
PC Engine / TurboGrafx-CD Backup RAM 2 KiB HUBM at offset 0
Sega Saturn Internal backup RAM 32 KiB, 64 KiB (16-bit dump) BackUpRam Format header, contiguous or on odd bytes

The Mupen64Plus combined save is the libretro core's .srm: EEPROM, four Controller Paks, SRAM, then FlashRAM, 296,960 bytes in total. PSP saves are per-game directories and have no entry.

Unsupported data

Pokémon generations after V remain unsupported. Zelda support is limited to A Link to the Past, Link’s Awakening, Oracle of Ages, Oracle of Seasons, Ocarina of Time, and The Minish Cap, within the fields and physical variants listed in the catalog. The editor does not change party Pokémon or box contents. Generation IV and V Pokédex data and Generation IV inventory remain unsupported. Fields absent from a game's schema have no editing path; this is not unrestricted byte editing.

A physical format match or a removed container does not make a save editable. Only games in the built-in registry have an editor. Emulator save states are rejected.