Jump to content

Pokemon Mystery Dungeon 2 - Psy_commando's Tools and research notes


Recommended Posts

Well as a small break from the nonsense of Unk values, guess I'll bring up a problem that's been in the back of my mind for awhile now. I've noticed a strange quirk after a long time of changing levels/experience among my pokemon with save editors.

I have no list of steps you can follow to 100% replicate this process, as it was only something I noticed when comparing the XP Level-Up table values to in-game values and continually found discrepancies over time across a large chunk of my pokemon. Essentially the game believes I require more XP to reach the next level than what is specified in each pokemon's respective table, and it is very adamant about needing this extra XP. But how can this be possible when the level-up table values are absolute? How can I have a level 73 Palkia with the same experience as a level 79 one but the game is absolutely certain mine should only be level 73? I've tried manually adding more experience and adjusting the level that I should be according to said table, and while that did produce a valid Level/XP ratio (as in no negative values), the excess experience fully carried through to the new level and it's only "pushed back" the problem to the new level. So I thought perhaps through some freak/glitch that one level had gotten kicked out of whack and a Joy Seed would correct the issue and get me back on track as the game itself would be calculating this and so surely it'd be using the level-up table right? .... right?

Yeah that didn't fix it either. Somehow along the line of a long string of changing levels/experience up and down across multiple pokemon an XP "Buildup" is accrued and tacked on to the level-up table that simply refuses to go away. On top of this, the stat gains upon each level are entirely wrong now as well. The real strange part? It's affecting pokemon I haven't even touched with a save editor. Perfectly clean pokemon that have been sitting in storage untouched for weeks are now suddenly out of whack with their level-up tables as well. And perhaps even more interesting is that some of them start off requiring LESS experience to level up! My level 1 Chingling levels up to 2 with only 8 experience points (and it is actually 8, I checked), when the table denotes needing 28. I've also noticed another bizarre quirk in that an entire evolution line(Weedle) started sharing a level-up table and every single one required the same amount of experience to get to the next level, even though they all have distinct values. However another evolution line I checked (Oddish) was perfectly fine.

So what gives? It seems perhaps obvious that the .skypkm portion of the save has gotten corrupted in some manner, but I guess the better question is why did this happen in the first place with simple shifting of levels and experience values? I will also mention that before I knew about the level-up tables I was guessing the level I would be at with a certain XP value. This led to the occasional popup of a negative value when I had the level set too low for the experience amount specified. I'd promptly correct it by bumping up the level, but was this causing irreversible damage since maybe the table was never designed to go into the negatives?

Couldn't really decide if I should post this here or in the SkyEditor topic but this seemed like the problem goes far deeper than just the Editor and I'm fairly certain I could achieve similar results if I had done this same thing with another editor instead.

Link to comment
Share on other sites

@Zerea Yeah, a lot of this I already knew. And I don't recommend removing move xml files when rebuilding them with statsutil right now, since its undefined behavior.

I read your posts, but I'm not really sure what you were asking/saying? Sorry.

 

20 hours ago, End45 said:

So I have been following this thread for a while and I have finally decided to register here and post something.
First of all, thanks to Zerea for the move data spreadsheet, I've been trying to figure out the meaning of the unknown values for some time, and the data has been really useful to me.
Now I will share my findings:

Bitfield 2 Controls the way enemies use moves. It works the same way as bitfield 1: If a move has a value of 48, enemies will use it if there's a party member in the same room.
You can try and give a value of 48 to some move like Tackle, enemies will try to hit you from far away (and obviously fail)
For some reason certain moves have different values for bitfield 1 and 2 when they should be the same, for example Discharge has Bitfield 1 = 48 and Bitfield 2 = 64. Although it is a move which hits all enemies in the room, other pokemon will only try to attack you with it if you are up to 2 tiles away from them.

Enemies (and I guess allies too) use the Unk6 value of a move as some sort of "weight". The larger this number is, the greater is the chance of a pokemon using it. A large value here means enemies will use the move constantly, and setting this to 0 causes pokemon not to use that specific move at all.

Unk7 is that other accuracy value you were talking about. If the move misses due to this second accuracy, a different message appears (I think it's 'the move missed X' instead of 'the move failed to impact X')

Unk10 is the number of times a move hits. 0 means it hits a random amount of times.

Unk13 = 1 means the move is affected by Magic Coat

Unk14 = 1 means the move is affected by Snatch

If a move has an Unk15 value of 1, it can't be used under the muzzled status (caused by a silence orb). That's why biting moves all have Unk15 = 1

Unk17 = 1 means the move can be used while taunted

Unk19 controls the message that comes up when the move is used. A value of 0 means default message, 1 would be the next string in the game ('Oh no! (Pokemon) chose (move)!') 2 = Regular attack message, and so on


Orb-effect moves are easy to test, I just make a quicksave in a dungeon, edit the save file and add those moves to the team leader or the enemies:

Famish: Decerases by 10 points the belly of all enemies in the room. Enemies/party members will act the same way as if they had eaten a hunger seed once they get affected 10 times by this move.
Observer: Foe-Seal orb.
Possess: Probably has something to do with the 'Possess Orb' from Mystery Dungeon 1. Using the move does nothing.
Searchlight: Has the same effect as the luminous orb.
Siesta: Same effect as the slumber orb.

 

I hope that helped. Sorry if I made any grammar mistakes, English is not my first language.

 

PS: @psy_commando, the sprite editor crashes for me every time I try to import/export sprite palletes (no matter if I save/load it as .txt or .pal). I don't have a github account to open an issue so I post it here.

Great! Thanks for the info!

I could reproduce the crash, but I'm not really sure what's going on.. I'll have to take a closer look. Seems like it crashes in release, but is completely fine in debug... Looks like its gonna be one of those bugs..

 

Edited by psy_commando
Link to comment
Share on other sites

Ah okay. To be quite honest I don't actually know what is or isn't already known, I just saw that many of the files on technical documentation had Unks sitting around and so I assumed that was a place to start looking to see if I could do some simple playing around with values and fill out the tables. So I kinda just went off on a journey on my own and probably did a lot of unnecessary testing and maybe just confirmed what was already known to be true or at least strongly suspected of being true. Basically all of my posts were just long-winded explanations of what I've been trying to look into and my process in doing so. I got sidetracked with my story telling in my excitement of "discovery" so that's why my posts are probably hard to follow. Sorry for kinda clogging that page with a lot of unnecessary explanation.

I'll never be able to help with anything more complicated than playing around on the surface of the ROM, so I'm trying to poke at stuff and post my findings to see if any of it is remotely helpful. I hate having to let you alone do all the hard stuff so I'm trying to be useful in other areas to maybe make some things slightly easier for you in the future. But I'm not sure at this point where to even put my time into helping out.

Let me know if there's any "grunt" work that could be done.

Edited by Zerea
Link to comment
Share on other sites

Well, I mean the unknowns are things I don't know about for the most part. But you seemed to be detailing the overall file structure of the waza_p file, and that's something I already know about and is pretty well documented in my notes and on the wiki.

I appreciate the help however.There are still lots of things that weren't investigated yet though.  If you wanna play around with script engine commands and figure out what they do, or mess with dungeon data, find reward lists offsets and etc.. There are still a lot of things like that.

Link to comment
Share on other sites

Is it possible to change the ingame button shortcuts? I love EoS but it's hard for me to get back to this game (and the rescue games for that matter) after playing Mystery Dungeon 3 and 4 because of the way they handled using moves so well. Even before that I tended to always use high PP moves like tackle and not much else until I ran out of PP because of how slow it is to use moves in this.

Is it possible to make it so the moves work like the 3DS games? IE: L+X= Move 1 L+A=Move 2 L+Y= Move 3 L+B Move 4?

Link to comment
Share on other sites

7 hours ago, psy_commando said:

Well, it might be possible. But not without some ASM hacking. Right now I don't think we know enough to do it easily. But that could be a possibility.

Yeah I figured as much. I mean it sounds fairly easy on paper but in execution I'd imagine it being a little more than changing a few lines of code. not to mention the already mapped commands to some of those combinations, the Linked moves would probably throw a wrench into the plan, the fact that you'd pretty much have to make custom hotkeys, the potential possibility that using a higher number move than you have might crash the game or something, and if you want it to look decent you'd have to change the UI to show the moves combinations when you hold L or something. (like the 3DS games)

Hopefully it will happen someday though in some sort of quality of life hack or something... (maybe fix the sleeping animation for evolved player characters as well or something)

Link to comment
Share on other sites

5 hours ago, FabOulus1 said:

There's just a problem with me:

Where do you get Kaomado.kao files? And other types of files? I REALLY want to know, thanks...

Well they're in the rom. You have to extract the rom, then look under data/FONT/kaomado.kao. You can use the batch scripts for doing that automatically too. Then you have to rebuild the rom with the modifications. Think of a ".nds" file as a zip file really. Except you need something else than winzip/7zip to extract/rebuild them.

 

5 hours ago, XModxGodX said:

Yeah I figured as much. I mean it sounds fairly easy on paper but in execution I'd imagine it being a little more than changing a few lines of code. not to mention the already mapped commands to some of those combinations, the Linked moves would probably throw a wrench into the plan, the fact that you'd pretty much have to make custom hotkeys, the potential possibility that using a higher number move than you have might crash the game or something, and if you want it to look decent you'd have to change the UI to show the moves combinations when you hold L or something. (like the 3DS games)

Hopefully it will happen someday though in some sort of quality of life hack or something... (maybe fix the sleeping animation for evolved player characters as well or something)

Well, its mainly about finding the UI API functions in the code, then hooking in your modified code. Its not that hard, but it takes time and patience. Especially if you're doing it by hand instead of using something like Radare2 or IDA.

And yeah, I plan to release a bunch of QoL asm hacks eventually. I got some done already on my github mainly to load map lists from file and etc.. In order to make modding easier. I'll probably dive back into that eventually, once I can fix my utilities and get to the big map editor I'm planning.

You could already fix the sleeping animations though. You'd need to basically copy in the missing sleep anims it looks for from the dungeon sprites into the ground mode sprites for the specified pokemons, and it would work.

Edited by psy_commando
Link to comment
Share on other sites

20 hours ago, psy_commando said:

Well they're in the rom. You have to extract the rom, then look under data/FONT/kaomado.kao. You can use the batch scripts for doing that automatically too. Then you have to rebuild the rom with the modifications. Think of a ".nds" file as a zip file really. Except you need something else than winzip/7zip to extract/rebuild them.

 

Well, its mainly about finding the UI API functions in the code, then hooking in your modified code. Its not that hard, but it takes time and patience. Especially if you're doing it by hand instead of using something like Radare2 or IDA.

And yeah, I plan to release a bunch of QoL asm hacks eventually. I got some done already on my github mainly to load map lists from file and etc.. In order to make modding easier. I'll probably dive back into that eventually, once I can fix my utilities and get to the big map editor I'm planning.

You could already fix the sleeping animations though. You'd need to basically copy in the missing sleep anims it looks for from the dungeon sprites into the ground mode sprites for the specified pokemons, and it would work.

Actually, I managed to do that on my own, however... I still can't run any program without a GUI in it...

I've been trying to replace the Char family with Mario, and all I can do right now is replace the expressions. Any ideas how to run a non-GUI program? It just opens and instantly closes.

Link to comment
Share on other sites

24 minutes ago, psy_commando said:

Use the batch files. Or SHIFT + right click with nothing selected on the background of the folder with the  program in, and click on "open command prompt here" then look at the command lines examples in the readme.

 

Alright, I'll check as soon as I can.

Link to comment
Share on other sites

On 01/01/2018 at 2:28 AM, psy_commando said:

Use the batch files. Or SHIFT + right click with nothing selected on the background of the folder with the  program in, and click on "open command prompt here" then look at the command lines examples in the readme.

 

Alright, it worked, but what exactly do I type for unpacking something with Gfxcrunch?

Link to comment
Share on other sites

Just drag and drop the "m_ground", "m_attack", or "monster" on the gfxcrunch executable. It'll export the content to a folder. Then do your changes to the folder, and drag and drop the folder on the gfxcrunch executable.

But I'm working on a sprite editor currently to supersede gfxcrunch.

Link to comment
Share on other sites

1 minute ago, psy_commando said:

Just drag and drop the "m_ground", "m_attack", or "monster" on the gfxcrunch executable. It'll export the content to a folder. Then do your changes to the folder, and drag and drop the folder on the gfxcrunch executable.

But I'm working on a sprite editor currently to supersede gfxcrunch.

Wait... Am I not supposed to export the file to have the three sprite files? Unless you meant the rom/sprite replacer?

Link to comment
Share on other sites

I'm not sure what you mean?

The sprites for each pokemon are stored inside "m_ground.bin", "m_attack.bin", and "monster.bin", under the data//MONSTER directory.

Each of those 3 files contains one of the 3 parts of each pokemon's animations/sprite. All pokemons have an entry in all 3 files.

m_ground contains the sprites on the overworld/ground mode. m_attack the attack and dungeon animations for the pokemons. And monster the enemy sprites, which are just stripped down versions of the m_attack sprites to save memory on enemy pokemons.

 

 

Edited by psy_commando
Link to comment
Share on other sites

2 minutes ago, psy_commando said:

I'm not sure what you mean?

The sprites for each pokemon are stored inside "m_ground.bin", "m_attack.bin", and "monster.bin", under the data//MONSTER directory.

Each of those 3 files contains the 3 parts of each pokemon's animations/sprite. All pokemons have an entry in all 3 files.

m_ground contains the sprites on the overworld/ground mode. m_attack the attack and dungeon animations for the pokemons. And monster the enemy sprites, which are just stripped down versions of the m_attack sprites to save memory on enemy pokemons.

 

 

Oops. Nevermind. Thanks.

Link to comment
Share on other sites

4 minutes ago, psy_commando said:

I'm not sure what you mean?

The sprites for each pokemon are stored inside "m_ground.bin", "m_attack.bin", and "monster.bin", under the data//MONSTER directory.

Each of those 3 files contains the 3 parts of each pokemon's animations/sprite. All pokemons have an entry in all 3 files.

m_ground contains the sprites on the overworld/ground mode. m_attack the attack and dungeon animations for the pokemons. And monster the enemy sprites, which are just stripped down versions of the m_attack sprites to save memory on enemy pokemons.

 

 

Oh, actually, it still doesn't seem to work... When I drag it to the EXE, it doesn't extract it.

Link to comment
Share on other sites

  • 3 weeks later...

I don't know how much has been discovered and just not updated and all on the research page, but I've been doing a lot of research on the current serialized data that results from the PMD stat tool so I can compile a lot of data for a thing I'm making for people to utilize.

Currently, I've found out a few things I didn't see on the documentation for Pokemon (monster.md):

  • For evolutions, 0x04 seems to point towards a needed Pokemon recruit. The only Pokemon that seems to have this is Mantine, and Param1 points towards 250, which is the INDEX for Remoraid (NOT the Dex Id or Entity Id). PreEvoIndex points towards 500, the Index for Mantyke.
  • Shedinja seems to have a separate script for it to be added to the recruits, since the evolution value is 0, None, but the PreEvoIndex is 318 for Nincada.

I'm doing a lot of serialization for all the data in PMD, and I'm not quite done but I thought I would drop some of the info I found along the way here. Thanks soooo much for this research though, it makes my project much easier to complete :D

Edited by JordantheDewott
Added PreEvoIndex info for first bullet
Link to comment
Share on other sites

6 hours ago, psy_commando said:

Well, 0x4 in a pokemon's entry changes its displayed dex id. I don't think it has anything to do with evolution.

Setting EvolutionMethod to 0x4 changes its displayed dex id? That's odd. I thought I was getting somewhere cause all of the rest of the evo data seemed to match correctly for the Mantyke/Mantine line.

EDIT:
I see now, I was unclear in my original post.

Quote

For evolutions, 0x04 seems to point towards a needed Pokemon recruit. The only Pokemon that seems to have this is Mantine, and Param1 points towards 250, which is the INDEX for Remoraid (NOT the Dex Id or Entity Id). PreEvoIndex points towards 500, the Index for Mantyke.

I was talking about setting EvolutionMethod (0x0A) to 0x04, which is Unknown on the documentation. Sorry for the confusion.

Edited by JordantheDewott
Link to comment
Share on other sites

  • 2 weeks later...

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...