Jump to content

Sky Editor: The first save editor for Pokemon Mystery Dungeon Explorers of Sky


evandixon

Recommended Posts

This program will let you edit various things in the saves of Pokémon Mystery Dungeon: Red and Blue Rescue Team and Explorers of Time, Darkness, and Sky, and some parts of the ROM for Pokémon Mystery Dungeon: Explorers of Sky!

You need the .Net Framework 4.6 to use 4.0.4 and above. Other versions only require 4.5.

Last Update: 12/23/2016

Latest Version: v4.0.11 Beta

Download

Changelog:

 

v4.0.11

  • Fixed game-breaking bug when saving Explorers of Time/Darkness saves
  • Fixed bug in Rescue Team saves where changing a move from None to something wouldn't show in-game

v4.0.5

  • Re-added the ability to edit moves of Active Pokemon in EoS
  • Fixed Sp. Attack and Defense being swapped

v4.0.4

Bugs fixed:

  • All occurrances of the character "e" being replaced with a superscript e
  • Quicksave Pokémon being corrupted
  • The original species of the partner
  • The size of the window not being saved on exit

v4.0.3

Notable changes:

  • Item Storage for Pokémon Mystery Dungeon: Red and Blue Rescue Team is now editable.
  • Original player and partner in Pokémon Mystery Dungeon: Explorers of Sky can be edited (can be observed at the beginning of the Bidoof's Wish special episode).
  • Stored Pokemon in all supported save files can now be imported and exported as individual Pokémon files.
  • Lots of bug fixes and internal changes

v3.2

New Features:

  • Explorers of Sky
    • (Save) Stored items are editable
    • (Save) Pokemon in quicksave are (somewhat) editable
    • (ROM) BGP files can be converted to and from pngs.
    • (ROM) Personality test results are editable. Including partner Pokémon.
    • (ROM) Pokémon portraits are editable

    [*]Red/Blue Rescue Team

    • Checksum is properly updated for European saves
    • Stored Pokémon can be edited in European saves.

    [*](In the version containing DeSmuMe), press F5 or use the menu to launch your save or ROM in DeSmuMe.

    [*]Lots of bug fixes

    [*]Lots of internal changes to let future versions be released faster

v3.1

Bug Fixes since 3.0.1:

* No scroll bar for viewing stored items in Red/Blue Rescue Team

* Editing stored money works now.

New features:

* Edit Rescue Points for Red/Blue Rescue Team

* Change Base Type for Red/Blue Rescue Team

* Edit Pokémon in the Boundless Sea friend area (Red/Blue Rescue Team)

* Open/Save stored Pokémon as *.skypkm files.

** When opening/saving a *.skypkm file from Pokémon Mystery Dungeon: Explorers of Sky, it is compatible with Sky JEditor

* ARDS code generation (currently only for Blue Rescue Team)

* Codebreaker (CBA) code generation for Red Rescue Team

* Developers can make plugins to extend the functionality of Sky Editor, including save editing and ARDS code generation

v3.0.1

 

Bug Fixes:

 

 

*Fixed bug where adding a held item ignored the item count

 

 

New Features

 

 

*Editing T/D Held Items supported

 

 

*Editing Red/Blue held items and Pokémon supported

 

 

*Stored Pokémon for all games are sortable by Friend Area or Team vs. Others

 

v2.6

 

Explorers of Sky

 

 

-Added ability to view name and level of Pokémon.

 

 

Explorers of Time/Darkness

 

 

-Held items can now be viewed, not edited

 

v2.3

 

-Increased max length of Team Name read/write to the proper 10 characters.

 

 

-Stored items display properly (as opposed to being duplicated when opening the same save again)

 

 

-Stored money read/write improved. Additionally, the limit is set to 9,999,999 because I don't know how high it will actually go, but the game lowers it to 9,999,999 anyway.

 

v2.2

 

Added support for .Net developers to make plugins to generate ARDS codes based on what's in the save.

 

v2.1

 

-Stored money maximum read/write increased to 16,580,607. That will be lowered to 9,999,999 once you withdraw any.

 

 

-Added viewing of stored items (no item counts or box contents yet).

 

 

-Changed GUI to have a tab control for items.

 

v2.0 R2

 

-Resource not packaged correctly v2.0. Fixed now.

 

v2.0

 

-Edit Held Money in Special Episode

 

 

-Edit Held Items in Special Episode

 

Current Features:

 

Current Features

* Pokémon Mystery Dungeon: Explorers of Sky

** Edit Team Name

** Edit Held Money (Main game and special episode)

** Edit Bank Money

** Edit Number of Adventures

** Edit Held Items (Main game and special episode)

** Edit Stored Pokémon

** Edit Active Pokémon (Main game and Special Episode)

** Edit Stored Items

* Pokémon Mystery Dungeon: Explorers of Time and Darkness

** Edit Team Name

** Edit Held Items

** Edit Stored Pokémon

** Edit Active Pokémon

* Pokémon Mystery Dungeon: Red and Blue Rescue Team

** Edit Team Name

** Edit Held money

** Edit Stored Money

** Edit Held Items

** Edit Pokémon

** Edit Rescue Points

** Edit Base Type

** View Stored Items

and more!

Cheat Generation

* Pokémon Mystery Dungeon: Red Rescue Team (CBA cheats only)

** Base Type

** Held Money

** Stored Money

** Rescue Points

** Team Name

* Pokémon Mystery Dungeon: Blue Rescue Team (ARDS cheats only)

** Base Type

** Held Money

** Stored Money

** Rescue Points

** Team Name

Credits:

-evandixon (Developer)

-Grovyle91 (Research of item structure)

-Prof. 9 (Team Name character encoding)

-matix2267 (Research of Pokémon structure)

-Demonic722 (Help with cheat generation)

-psy_commando (lots of stuff for ROM editing)

Old Downloads:

-Sky Editor 4.0.5 - Only save editing

-Sky Editor 4.0.4 - Only save editing

-Sky Editor 4.0.3 - Only save editing

-Sky Editor 3.2.zip

-Sky Editor 3.2 (No DeSmuMe).zip - same as above, but without DeSmuMe integration to keep the file size low.

-Sky Editor 3.2 (Full).zip - Contains debug symbols and XML comments. Only useful if you're a developer.

-Sky Editor 3.2 (Source).zip - Contains the source code for Sky Editor 3.2.

When you download a zip file, it's important that you right-click on it, got to Properties, then general, then click the button that says "Unblock" near the bottom. Otherwise, you might not be able to do anything with Sky Editor.

Source on GitHub

Other downloads:

Sky Editor v2.0 R.zip

Sky Editor v2.1..zip

Sky Editor v2.2..zip

Sky Editor v2.3..zip

Sky Editor v2.6..zip

Sky Editor v3.0.1.zip

Sky Editor 3.1 Final.zip

Sky Editor 3.2 (No DeSmuMe).zip

  • Like 2
  • Thanks 1
Link to comment
Share on other sites

I've only tested it on the US version. It might work on the European version.

As for your name, I'll keep looking. I changed it in the save file and nothing happened. It's probably hidden more places than I thought.

[Edit] Currently focusing on held items. I've got results with that. Just not the results I'm expecting. I'll continue later in the week. At least I've got the checksum, so this is actually possible.

Edited by evandixon
Link to comment
Share on other sites

Wow... good job on finding that. I know I've tried to edit the saves way back when the game was just released, but miserably failed. Certainly didn't thought of trying this.

But... .NET 4.5 already? Right... Win8. I'm still stuck at Win7 and .NET 4.0 :P. Don't want to switch over to Win8 xD

Anyway... again, good job. Although I haven't played it anymore for like... many years, I'll be watching this thread and you since it's interesting to follow the progress >:D

Link to comment
Share on other sites

Updated to support the .Net Framework 4.0 because it was requested. (Or should I have said downgraded?)

Anyway, I also added more info about the structure of items, which is remarkably inconsistent. I'll take a break from that for a little bit, perhaps I'll come up with something later.

Link to comment
Share on other sites

Haha... you didn't have to change it if you really depend on it. I just saw that the minimum requirement for .NET 4.5 is Win7 SP1 or Vista SP2. I think I just need to update it sometime.

I'll take a look at your data structure trying to figure some more out ;)

I should have an old save lying around somewhere.

EDIT: I'm progressing slowly trying to find a correct data structure.

I'm going with your example, apples. You should take a look at this (example of 8 apples in my inventory):

00000001 00000000 01101000 00000011
00000010 00000000 11010000 00000110
00000100 00000000 10100000 00001101
00001000 00000000 01000000 00011011
00010000 00000000 10000000 00110110
00100000 00000000 00000000 01101101
01000000 00000000 00000000 11011010
10000000 00000000 00000000 10110100 00000001

As you already figured out, there's some shifting happening here. But the funniest thing is, I don't think an item takes 31 bytes. Why would the first line otherwise end with an 1? I tested it with only one apple in my inventory, and it showed me the complete first line. Plus, it would be weird for the devs to store it like that.

There's some pattern though. Take groups of 16 bits, shift them a couple of times to the right (how much is depending on the line number) WITH overflow. Don't know how it's called properly, but when a bit gets lost while shifting, it gets added to the other side. (see edit 2)

That's not the complete story though. As you can see, there's an extra byte in the 8th line. I don't know why, but it seems like it's another shift, although a very weird one.

So if you shift everything, you get this:

00000001 00000000 01101000 00000011
00000001 00000000 01101000 00000011 (>> 1)
00000001 00000000 01101000 00000011 (>> 2)
00000001 00000000 01101000 00000011 (>> 3)
00000001 00000000 01101000 00000011 (>> 4)
00000001 00000000 01101000 00000011 (>> 5)
00000001 00000000 01101000 00000011 (>> 6)
10000000 00000000 00000000 10110100 00000001 (this is a tricky one...)

If you go on like this (I've tried with 16 apples), you get the exact same results, only at another offset.

It seems like the first page of your inventory is at 0x8BA2 - 0x8BC2 (33 bytes long), second page is at 0x8BC3 - 0x8BE3 (also 33 bytes long), etc.

This results that the total inventory of 48 items (6 pages) is located at 0x8BA2 - 0x8C67 (198 bytes long).

Then again, I really don't know what the devs were thinking about this shifting process... it seems a bit... inconvenient. But this is what I got from my test results.

I'll try with another item, trying to figure out the whole shifting process.

EDIT2: Take a look at https://en.wikipedia.org/wiki/Bitwise_operation#Rotate_no_carry (or https://en.wikipedia.org/wiki/Circular_shift) for the bit shifting that is used here (aka bit rotation or circular shifting).

EDIT3: Found what I was looking for, a complete brain breaker. Ignore the first 3 (but you can use them for more research):

8x Oran Berry:
00000001 00000000 00110000 00000010
00000010 00000000 01100000 00000100
00000100 00000000 11000000 00001000
00001000 00000000 10000000 00010001
00010000 00000000 00000000 00100011
00100000 00000000 00000000 01000110
01000000 00000000 00000000 10001100
10000000 00000000 00000000 00011000 00000001

8x Power Band:
00000001 00000000 11010000 00000000
00000010 00000000 10100000 00000001
00000100 00000000 01000000 00000011
00001000 00000000 10000000 00000110
00010000 00000000 00000000 00001101
00100000 00000000 00000000 00011010
01000000 00000000 00000000 00110100
10000000 00000000 00000000 01101000 00000000

8x Big Apple:
00000001 00000000 01110000 00000011
00000010 00000000 11100000 00000110
00000100 00000000 11000000 00001101
00001000 00000000 10000000 00011011
00010000 00000000 00000000 00110111
00100000 00000000 00000000 01101110
01000000 00000000 00000000 11011100
10000000 00000000 00000000 10111000 00000001

8x Petrify Orb:
00000001 00000000 11111000 00001001
00000010 00000000 11110000 00010011
00000100 00000000 11100000 00100111
00001000 00000000 11000000 01001111
00010000 00000000 10000000 10011111
00100000 00000000 00000000 00111111 [color=red]01000001[/color]
[color=red]01000001[/color] 00000000 00000000 01111110 [color=green]10000010[/color]
[color=green]10000010[/color] 00000000 00000000 11111100 00000100

As you can see, the Petrify Orb has more overflow to the next set of bits.

And for future reference, team members holding items:

8x Petrify Orb (with some given to members):
00000001 00000000 11111000 0[b]1[/b]001001 (1st team member)
00000010 00000000 11110000 00010011 [color=red]0000010[b]1[/b][/color] (2nd team member)
[color=red]00000101[/color] 00000000 11100000 00100111 [color=green]000010[b]11[/b][/color] (3rd team member)
[color=green]00001011[/color] 00000000 11000000 01001111 [color=blue]0001[b]1[/b]000[/color] (4th team member)
[color=blue]00011000[/color] 00000000 10000000 10011111
00100000 00000000 00000000 00111111
01000001 00000000 00000000 01111110
10000010 00000000 00000000 11111100 00000100

According to this, I've concluded the following: each item indeed uses 33 bits. Following up the last example, you can do this:

8x Petrify Orb (with some given to members):
00000001 00000000 11111000 01001001        [color=red]0[/color]
0000001[color=silver]0[/color] 00000000 11110000 00010011       [color=red]01[/color]
000001[color=silver]01[/color] 00000000 11100000 00100111      [color=red]011[/color]
00001[color=silver]011[/color] 00000000 11000000 01001111     [color=red]1000[/color]
0001[color=silver]1000[/color] 00000000 10000000 10011111    [color=red]00000[/color]
001[color=silver]00000[/color] 00000000 00000000 00111111   [color=red]000001[/color]
01[color=silver]000001[/color] 00000000 00000000 01111110  [color=red]0000010[/color]
1[color=silver]0000010[/color] 00000000 00000000 11111100 00000100

And then you need to read it from right to left, grouped as above (I think), which results in:

8x Petrify Orb (with some given to members):
0 01001001 11111000 00000000 00000001
01 00010011 11110000 00000000 0000001
011 00100111 11100000 00000000 000001
1000 01001111 11000000 00000000 00001
00000 10011111 10000000 00000000 0001
000001 00111111 00000000 00000000 001
0000010 01111110 00000000 00000000 01
00000100 11111100 00000000 00000000 1

And then polishing it a bit up:

8x Petrify Orb (with some given to members):
00100100 11111100 00000000 00000000 1 (1st team member)
01000100 11111100 00000000 00000000 1 (2nd team member)
01100100 11111100 00000000 00000000 1 (3rd team member)
10000100 11111100 00000000 00000000 1 (4th team member)
00000100 11111100 00000000 00000000 1
00000100 11111100 00000000 00000000 1
00000100 11111100 00000000 00000000 1
00000100 11111100 00000000 00000000 1

And there you have it! I hope, at least it looks like this is it. It's possible the reading from right to left is a bit off, because I do not exactly know the ordering and grouping (this just seemed logical to me).

I guess you need to experiment with some other items to figure the ordering out. But it definitely looks like something :D

EDIT4: I really don't know if you like figuring these things out yourself, but I don't think you have to anymore (sorry if you wanted that, but I was a bit caught up in this :P). I've looked some more with random items, and I can confirm this data structure is indeed correct. Let me explain the structure:

hhhxxxxx xxxxxx00 00nnnnnn n0000000 1
h = member holding bits (000 = none, 001 = member 1, 010 = member 2, 011 = member 3, 100 = member 4)
x = item ID (total amount of 1,351 items, so 1 - 1,351)
n = item amount (0 - 99, 0 for items without an amount)
0/1 = seems to be constant on my part / unknown

Of course you'll still need to decode and encode it. But you can read that method in my earlier edits.

In order to get the total amount of available items, I've dug up some old program from 2009 in which I can view/edit the MD strings in the rom. It lists every item (and more) ingame. Luckily, the string order is exactly the same as the item IDs (with an offset of course). I can send it to you if you want. This way you can make a list of items names ;).

Edited by Grovyle91
Link to comment
Share on other sites

Thank you for finding that! Users everywhere will soon be able to edit items! I'll start implementing that in the next few days (giving proper credit of course). Sending me a list of item ID's would be great. If you didn't, users would just have to manually add the item ID into a text file.

I made progress in editing the Player Name. It's stored at 0x487-0x490 in addition to 0x13F-0x148. 0x487 uses proprietary character encoding, terminated with 01 then 00's, while 0x13F is ANSI. I'll release that as soon as I have more character codes found (I only have A, B, C, and ? so far. Unknown characters are for now replaced with ?.

Link to comment
Share on other sites

Finished researching for the day. If any non developer wants to help out, send me your save files so I can list what values are for what character in the team name. Start new games with specific 10 character sets perhaps, then immediately quicksave.

Grovyle91: Thank you for your help in figuring out the over complicated item structure. I'll spend the next few days developing it and hopefully it will be ready soon.

Everyone else: What other features do you want? It will give me something to look for later.

Link to comment
Share on other sites

I need to correct myself after investigating some more. You know about those mystery boxes right? Yeah... the resulting item id needs to be stored somewhere. So look at this:

00000101 11100000 00100100 10000000 1 (Dainty Box)
00000101 11101001 01011001 10000000 1 (Dainty Box)
00000110 00101000 00100100 10000000 1 (Hard Box)
00000101 11001101 10110111 00000000 1 (Shiny Box)
00000101 11001101 01011101 00000000 1 (Shiny Box)

Right, there's no way I've more than 1 of each of those boxes. So the only logical explanation to this, is that it uses those bits for the hidden item id. And there are still some bits left. Since an amount can only be 0 - 99 (which uses 7 bits), I think the 7 bits after the hidden id is the amount in case of an item that uses this (like stick, geo pebble, etc.). And again 0 if it isn't used.

This still leaves the leftover 1, which is still unknown to me.

So after applying this, you get the following:

hhhxxxxx xxxxxxpp pppppppp pnnnnnnn 1
h = member holding bits (000 = none, 001 = member 1, 010 = member 2, 011 = member 3, 100 = member 4)
x = item ID (total amount of 1,351 items, so 1 - 1,351)
p = item parameter (in case of a mystery box: hidden item id; item with amount: amount of item (1 - 99); otherwise 0)
n = item amount of the hidden item (1 - 99, 0 for items without an amount), 0 if there's no hidden item
1 = seems to be constant on my part / unknown

So it gets even more complex, yay!

But that's not all... I've tried to figure out how the main item storage is stored. And I'm partly there. It seems that the item ids and parameters are seperated from each other. If you take a look at this screenshot of my notes, you'll instantly see it's not easy to decode this properly without using bitwise operations and gluing the pieces together.

It looks like there are 6 bits at the very beginning that are not used (or used by something else). Later on after each 8 items, these 6 bits are a kind of overflow used by the previous 8 items. It's not even easy to explain, so just take a look at the screenshot.

Regarding the character names at 0x13F, I've also noticed that your partner's name is right after it. But it's not updated at all. E.g. I've chosen Turtwig in the beginning (with just "Turtwig" as his name since I didn't bother to think of something else), but he's evolved to Torterra and the name at 0x149 - 0x152 is still Turtwig. So I wonder where this name is being used elsewhere in the game.

Anyway, this is what I found out for now. I'm done for today... xD

Link to comment
Share on other sites

Good work on the item stuff! It's nice to have properly formatted data to develop with.

As for names, the player name is also stored at 0x8411-0x841C in proprietary encoding (I have values for A, B, C, and ? so far, I'll look at more later). The partner name might be close to that.

Link to comment
Share on other sites

Everyone else: What other features do you want? It will give me something to look for later.

Adding and changing the Pokemon in your team would be a nice feature :)

As for the name characters, if you haven't found out yet:

0A -> a

+ 8

12 -> b

+ 8

1A -> c

...

and so on, just add 8.

The same for capital letters.

0B -> A

+ 8

23 -> B

+ 8

1B -> C

...

Link to comment
Share on other sites

0x487 uses proprietary character encoding, terminated with 01 then 00's, while 0x13F is ANSI.
It's mostly ANSI, but some characters were removed and/or replaced with different characters.

Here's a table file: http://www.mediafire.com/?xb0dxr9tl8ed2tp All the bullet characters are graphically the same, and 5B is glitchy. [$NN] denotes a character that the game doesn't support (meaning it's either a regular space, a solid square, or butchers the text display).

Link to comment
Share on other sites

Grovyle91: When items are removed from the bag, they're not overwritten. They stay there with a terminator. Maybe tonight I can post the terminator. It might be related to that constant 1.

It's mostly ANSI, but some characters were removed and/or replaced with different characters.

Here's a table file: http://www.mediafire.com/?xb0dxr9tl8ed2tp All the bullet characters are graphically the same, and 5B is glitchy. [$NN] denotes a character that the game doesn't support (meaning it's either a regular space, a solid square, or butchers the text display).

Thanks, that will help in reading names.

Adding and changing the Pokemon in your team would be a nice feature :)

As for the name characters, if you haven't found out yet:

0A -> a

+ 8

12 -> b

+ 8

1A -> c

...

and so on, just add 8.

The same for capital letters.

0B -> A

+ 8

23 -> B

+ 8

1B -> C

...

That might not be constant as it gets closer to the end of the alphabet, but I'll use that until I prove otherwise.

Link to comment
Share on other sites

Grovyle91: When items are removed from the bag, they're not overwritten. They stay there with a terminator. Maybe tonight I can post the terminator. It might be related to that constant 1.

Hmm... odd. Didn't notice it in my save. I'm almost sure that in my case everything was zeroed out upon removal, but don't take my word for it until I've tried it again (which may take some time as I receive PMD:GtI tomorrow, though it's just too bad I'm not able to get any save files from my 3DS... :P).

Link to comment
Share on other sites

The terminator is an item with all zeros. So that must be what the constant 1 is. I'll implement that later tonight.

[Edit 2]

New update released to view items.

Todo:

-Display whether an item is held

-Edit items (GUI is fully functional, now I have to actually write to the file).

-(Not next release) add extended box support

Untitled..zip

Untitled..zip

Edited by evandixon
Link to comment
Share on other sites

Ah, then the 1 is a bit to determine if there's an item or not. Well... that makes sense. I wonder why my save was being zeroed out in the whole remaining data. Anyway, at least there's a use for that 1 :)

Verstuurd van mijn GT-I8160 met Tapatalk

Link to comment
Share on other sites

Updated because the previous 1.0.1 version might have had a line of code I forgot to comment out that might have screwed up the player name. If this hurt anyone, give me your save file and your player name and I'll fix it.

[Edit 2]

Program updated!

See first post.

Edited by evandixon
Link to comment
Share on other sites

Update on items:

Editor now supports setting what's inside a box when adding an item. This is retained when putting a box in storage then removing it. (Didn't save before withdrawing, may or may not make a difference.)

Next I should work on Used TMs.

Link to comment
Share on other sites

Updated to 1.4.1.

-Edit Number of Adventures had. Guess what? You can have a negative number! You want to have -2 billion missions done? Sure thing!

-Proper tab order. I didn't check before, so next release I'll be sure the tab order makes sense.

-Bug fixes.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...