Hacking Homebrew PKSE - Pokemon Save Editor

  • Thread starter Thread starter kiasta
  • Start date Start date
  • Views Views 5,869
  • Replies Replies 12
  • Likes Likes 5

kiasta

Member
Newcomer
Joined
Jan 3, 2025
Messages
17
Reaction score
14
Trophies
0
Age
42
XP
88
Country
United States

PKSE - Pokemon Save Editor v1.1.0​



Source and binary can be found here: https://github.com/kiasta/PKSE

Greetings everyone! I have developed a switch homebrew application for editing Pokemon save files -- PKSE (Pokemon Save Editor). I used PKHeX heavily as a resource and I am very thankful for their hard work!

Current games supported:
  • Legends: Z-A
  • Scarlet/Violet
  • Brilliant Diamond/Shining Pearl
  • Legends: Arceus
  • Sword/Shield
  • Let's Go Pikachu/Eevee
  • FireRed/LeafGreen

I would strongly suggest making a backup with Checkpoint or a similar tool before using my save editor.



LOOSE DEVELOPMENT ROADMAP
  • Event injection + event-flag enable
  • Legality Layer 3 — encounter matching
  • Legalize" button — auto-fix to nearest legal
  • PKSM bank import/export interop
  • Ribbon Editing


SCREENSHOTS

0.jpg

2.jpg

4.jpg

6.jpg

12.jpg





I HAVE PERSONALLY TESTED THIS WITH THE 22.5.0 FIRMWARE.

INSTRUCTIONS: Place the PKSE.nro file in your "smdc:/switch" directory. Must use title override for newer firmwares 21+.

If anyone has any suggestions or feedback feel free to leave it here, thanks!


Source and binary can be found here: https://github.com/kiasta/PKSE
 
Last edited by kiasta,
Nice to see an app like this being made that target current switch games !

FYI I opened several issues regarding optimizations / bugs for the current codebase.

Keep up the good work !
 
  • Like
Reactions: kiasta
Nice to see an app like this being made that target current switch games !

FYI I opened several issues regarding optimizations / bugs for the current codebase.

Keep up the good work !

Thanks a lot! There's another one with more features around here with more features, but not open-source. But I'm pretty close on getting the missing titles integrated. Thanks for the suggestions, much appreciated!
Post automatically merged:

Version 0.0.1 Release Candidate 1

- Fixed offsets for Pokemon Legends: Z-A. Now party/box Pokemon and items can now be modified.

https://github.com/kiasta/PKSE/releases/tag/0.0.1_rc1
 

Version 0.0.1 Official Release

  • Fixed various issues with Base Stats and IV/EV calculation
  • Added regional variant and individual Pokemon form Base Stat changes for IV/EV and Stat calculation
  • Several UI fixes
  • Save logic fixes
  • Instruction tooltip fixes
  • Heavy file and code restructuring
https://github.com/kiasta/PKSE/releases/tag/0.0.1_Release
Post automatically merged:

Version 0.0.2 Release​

Changelog:​

  • Fixed issue where shiny Pokemon had improper PID generation based on trainer OT instead of the Pokemon's OT.
  • Added project and build support for Visual Studio 2026
https://github.com/kiasta/PKSE/releases/tag/0.0.2
 
Last edited by kiasta,

Version 0.0.3 Release​

This release brings several enhancements and bug fixes.​

Enhancements:​

  • Added option to delete a save backup
  • Updated MAKEFILE to include Regional Variants/Forms sprites
  • Added Pokemon Types and Type banner sprites
  • Added Pokemon sprite to the Pokemon Details modal

Bug fixes:​

  • Fixed issue causing Pokemon shininess to toggle off when modifying IV/EV values
  • Fixed the incorrect back navigation logic from Save Backups screen
  • Fixed Dialog when leaving Trainer View Screen with unsaved changes
https://github.com/kiasta/PKSE/releases/tag/0.0.3_Release
 

Version 1.0 Release​

This release brings several new features, title support, a whole new UI interface and a plethora of bug fixes.​

Supported games (read, edit, write):​

  • Legends: Z-A
  • Scarlet/Violet
  • Brilliant Diamond/Shining Pearl
  • Legends: Arceus
  • Sword/Shield
  • Let's Go Pikachu/Eevee
  • FireRed/LeafGreen

Editing:​

  • Party & box Pokemon: species, level, stats, IVs/EVs (AVs in Let's Go),
    nature, ability, moves, held item, ball, OT/met/origin, shininess, gender,
    and ribbons.
  • Trainer info and item pouches, with per-game item and count limits.
  • Pokemon creator: build one from scratch in any game's format, with legal
    values highlighted.
  • Legality checker: flags illegal values as you edit (informational; it never
    blocks or changes anything).
  • Cross-game bank: PKSE-native storage every supported game shares. A Pokémon
    deposited from one game is converted into the destination's format on
    withdrawal, preserving its origin (OT, IDs, met data, IVs, nature, PID).

Interface & save handling:​

  • HOME-style UI (NanoVG) with 256px HD sprites, full touch controls, and
    scrollable storage and lists.
  • On-console backup and restore, with retained backup history.
  • Per-game save-version and DLC detection.
  • On-screen error reporting (including when no backups are present).

https://github.com/kiasta/PKSE/releases/tag/v1.0.0
 
Last edited by kiasta,
  • Like
Reactions: Doredialilligan
Version 1.0.2 Hotfix Release

Met/egg locations, pre-Switch origins, and 7 missing HD sprites bug fixes

Met/Egg location bug:
Met/egg location showed "(none)" for banked location IDs. PKHeX banks these IDs by ID / 10000 (bank 0 = in-world, 3 = Link Trade / region + Pokémon HOME/GO transfers / "a picnic", 4 = events, 6 = egg sources). The generator only emitted bank 0, so traded, HOME-transferred, and egg Pokémon rendered "(none)". Now emit every bank and route by threshold, mirroring PKHeX LocationSet6.

Pre-Switch Origins bug:
HOME transferred Pokémon from a pre-Switch game showed Origin "Unknown" and met/egg "(none)". PKSE only recognised the Switch-era origin games. getOriginGameName now names every origin version byte (Gen 1-9), and location lookup carries one table set per generation (added Gen 4/5/6/7 = HGSS/BW2/XY/SM) routed on the origin generation, per PKHeX GameStrings.GetLocations. A Gen 3/4 (and Pokémon GO) MET ID is remapped into the current format's numbering when the mon is transferred up, so it is named with the format table -- a Platinum starter link-traded to Violet reads met = "a Link Trade"; Gen 5+ keep their own table; a Gen 4 egg stays on the Gen 4 table. An unset met date (00/00) now shows "(none)" instead of "00/00/2000". Verified against a real Violet save: every transferred mon resolves.

Missing HD Sprites bug:
The HD sprite set was fetched by NAME from pokemondb, which needs a name->dex map. That map dropped Mimikyu and six other species/forms whose display name didn't match pokemondb's URL slug. Once the old 96px PokeAPI fallback was removed, they rendered blank.

Fix the class of bug at the source: fetch PokeAPI's HOME renders by NUMERIC id instead (base = National Dex number, forms = 10000+ ids), so there is no name map to get wrong. New tools/gen_hdsprites.py downloads and downscales them from 512->256px (Pillow), fails on any missing base sprite, and is pinned to a PokeAPI/sprites commit for reproducibility.

Retire the whole download-based pipeline from the Makefile (the old low-res sprites/forms targets and the HD hdsprites/hdforms targets); `make` / `make all` no longer fetch Pokemon sprites. Delete the name-map tool files and document the one-time fetch step in the README.

https://github.com/kiasta/PKSE/releases/tag/v1.0.2
 
Last edited by kiasta,
  • Like
Reactions: JonJaded
Version 1.0.3 Hotfix Release

This hotfix fixes 3 critical bugs that could potentially cause data loss/memory overflow issues.


- Fixed an issue where the sprite and texture caches grow without bound — ~512 KB per unique Pokémon, never freed until exit.
- Fixed an issue where when creating a Pokémon the creator stamps the PAIRED version as the wrong Origin — a Pokémon created in Violet says it came from Scarlet, etc.
- Fixed an issue where if a user presses '+' while in the Bank/Storage, the app saves the bank with NO prompt — and does it BEFORE asking about the game save and leaves a permanently cloned (or destroyed) Pokémon.

Download: https://github.com/kiasta/PKSE/releases/tag/v1.0.3
 
I'm very excited to finally finish this release. I've spent so many hours testing and tracking down a ton of bugs and issues as well as adding some QoL. I hope you all enjoy this release!

Version 1.1.0 Feature Release

This release adds Pokédex registration to all seven games, editable trainer details, a much larger bank
and multi-select storage, and fixes a long list of correctness bugs in forms, sprites, gender, Gen 3
text and cross-game transfer.

New features

  • Added Pokédex registration on **all seven games**. A Pokémon you create or transfer in is now recorded as seen and caught, with its form, gender and shiny state, so it shows up in the in-game Pokédex instead of silently missing from it. Each game's dex is written in that game's own format — Sword/Shield's three separate regional dexes, Scarlet/Violet's shared block, Legends: Z-A's per-form shiny and Mega records, and Legends: Arceus's research log with its size records.
  • Added editable **trainer money and OT name** on all seven games.
  • Increased the bank from **8 boxes to 100** (240 slots to 3,000). This was an oversight on my part, I simply forgot to change the slot amount. Existing banks are read as-is and keep their custom box names.
  • Added **rectangle select and carry** to the bank and the box grid: anchor a corner, rubber-band a selection, and move the whole block at once across boxes and between the bank and the save.
  • Added a **Nickname row to FireRed/LeafGreen** — it was the only generation a user could not rename a Pokémon. Names follow the same length and character rules the games do.
  • Added **size records for Let's Go**, so a Pokémon written by PKSE contributes its height and weight to the Pokédex the way a caught one does.
  • Added **Mega and Alpha records for Legends: Z-A**, and per-form shiny tracking, so a transferred Pokémon registers everything that game's Pokédex actually keeps.
  • Renamed the **Let's Go move warning** setting to **Move warning**, and split the two cases it was covering. The Let's Go transfer warning (AV/EV training resets to zero) is still gated by the setting; the Gen 3 down-convert now always warns, because it rebuilds the PID and cannot be undone.

Fixed - forms and sprites

  • Fixed an issue where Maushold's two family sizes were labelled backwards, and where its base form drew the wrong artwork.
  • Fixed an issue where 19 form sprite mappings across 13 species rendered a completely different Pokémon.
  • Fixed an issue where Zygarde 10% drew the Power Construct variant, because a second hand-written form list had silently drifted out of step with the sprite mapping.
  • Fixed an issue where Slowbro, Darmanitan and Braviary form labels were wrong — a Mega and a Zen form sat where the regional form was assumed to be.
  • Fixed an issue where form 0 was shown as "Base" for 34 species that have a real form name, and where Sinistcha's form was mislabelled.
  • Fixed an issue where roughly 200 Pokémon renders could never be shown, because the sprite mapping could only express numeric ids and those forms are named instead — Unown's letters, Arceus and Silvally's types, Vivillon's patterns, Alcremie's sweets, Deerling's seasons and more.
  • Fixed an issue where the sprite fetcher mirrored only a hand-picked subset of the available artwork, so some forms had no image on disk at all.
  • Fixed an issue where 7 Pokémon rendered with no HD sprite.
  • Fixed an issue where type icons ignored the form — Hisuian Braviary showed Normal/Flying instead of Psychic/Flying.
  • Fixed an issue where the Form picker offered battle-only forms a save cannot hold, forms the open game has never had, and the Legends: Arceus noble (Lord/Lady) forms.

Fixed - Pokémon editing

  • Fixed an issue where gender was a free field, so a male-only, female-only or genderless species could be given any gender.
  • Fixed an issue where a fixed-gender species opened a pointless one-row Gender picker instead of showing the value as read-only.
  • Fixed an issue where Meowstic, Indeedee, Basculegion and Oinkologne were locked to a single gender, because those species encode gender as the form index.
  • Fixed an issue where species names had their punctuation, accents and gender signs stripped — Ho-Oh, Farfetch'd, Type: Null, Flabébé and Nidoran♀/♂ all displayed incorrectly.
  • Fixed an issue where "Allow illegal edits" let the creator make a species the open game has no entry for.
  • Fixed an issue where the creator's species list dropped 16 species from Legends: Arceus, offering 226 of 242.

Fixed - Generation 3 (FireRed/LeafGreen)

  • Fixed an issue where Gen 3 names lost every character outside `A-Z 0-9 ! ? . -`. Four separate character tables disagreed with each other, so a name could be written correctly and read back wrong — and because `?` is itself a valid Gen 3 character, the damage was invisible. Farfetch'd, Nidoran♀/♂ and every apostrophe or accent now survive a round trip.
  • Fixed an issue where the Gen 3 species index was assumed to be a flat offset, storing **109 of 135** Hoenn-era species as a *different Pokémon* — a created Castform appeared in-game as Absol, Deoxys as Chimecho, Trapinch as Plusle.
  • Fixed an issue where Pokémon created for FireRed/LeafGreen showed **level 0** in-game while PKSE showed level 1.
  • Fixed an issue where editing an Unown's shininess or nature changed its **letter**, because all three are derived from the same PID.
  • Fixed an issue where down-converting a Pokémon into LeafGreen stamped FireRed as its origin, since the fallback was hard-coded to one member of the pair.

Fixed - trainer and save data

  • Fixed an issue where Sword/Shield read the trainer's OT name and gender from the Trainer Card block instead of the block the game actually keeps them in.
  • Fixed an issue where Scarlet/Violet and Legends: Z-A truncated the trainer's OT name to 8 characters.
  • Fixed an issue where Scarlet/Violet and Legends: Z-A store an **internal species index** that PKSE read as the National Dex number, so every Pokémon from #917 onward decoded as the wrong species — wrong name, sprite, types and false legality errors.
  • Fixed an issue where Pokémon transferred through HOME from pre-Switch games showed their origin as "Unknown" and their met location as "(none)".
  • Fixed an issue where a trainer name could be renamed to something the games reject, because there was no cap on how many digits it may contain.
  • Fixed an issue where the Scarlet/Violet title bar never showed which DLC a save had, as the version was read from a block that does not exist in an S/V save.

Fixed - bank and transfer

  • Fixed an issue where a Pokémon transferred into a Generation 8 or 9 game displayed a **Kalos Champion ribbon** it does not own. The field that selects which ribbon to display uses 0 to mean "ribbon index 0", which is that ribbon — not "none" — so every Pokémon arriving from FireRed/LeafGreen or Let's Go, and anything banked before the display field was being set, showed it.
  • Fixed an issue where Brilliant Diamond/Shining Pearl refused Spinda and Nincada from the bank with no way to override. The refusal is correct — HOME will not move those two species into BDSP — but it is a legality rule, not a format limit, so **Allow Illegal Values** now lifts it. It stays on by default.

Fixed - interface

  • Fixed an issue where creating a Pokémon in Let's Go, into any slot that is not the next empty one, left the app unresponsive with the editor never appearing. Let's Go storage has no gaps, so the new Pokémon was slid into place before the editor had finished opening on the slot it was created in.

Download: https://github.com/kiasta/PKSE/releases/tag/v1.1.0
 
Last edited by kiasta,

Site & Scene News

Popular threads in this forum