Jump to content

psy_commando

Innovator
  • Posts

    425
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by psy_commando

  1. Thanks ! It seems the map tiles are not using the exact same method though. But that's a good lead. The map tiles files I was looking at are split into 3 files. bpc, bma, and bpl. BPC contains the actual tileset. BPL contains color palettes . And BMA contains possibly info on what color palette to use where, I'd say.. And it seems not all the tiles are in there, but only filler type stuff, depending on the name. Things like seamless rocky walls tiles and etc.. Other than that, there are a lot of duplicates ! I guess most of the map tiles must be in that messy "dungeon.bin" file then And I guess I could probably also implement BGP import/export support while I'm at it. *EDIT*: Speaking of the "DUNGEON/dungeon.bin file" I analyzed the content a couple of weeks ago, and I still can't figure out how to display the images in there.. Its hard to tell what palette goes with which image, and if I'm even displaying them in the right format.. If only I could just find a tileset from the beginning of the game, I'd have a good way of figuring out the format by selectively corrupting it.. Here are my notes : https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/FileFormats/Dungeon_bin.txt (The latest packfileutil also properly give a file extension to most of the content of unpacked file btw. If anyone wants to take a look for themselves.)
  2. Idk if posting those would be against the rule here or not.. So I suggest you look around the pokemusicverse forums instead, without being too specific. Besides that, I'm having a hard time doing any work these days on anything really.. Not sure why.. Possibly because I've been feeling pretty bleh lately. And as a result, I got a lot of catchup to do in every single ones of my hobbies.. But anyways. I got a question I'm trying to find an answer to.. Does anyone here have any experience with palette sets ? Because, apparently that they're using something like that for the dungeon tiles. I can't seem to figure them out though.. Its probably really obvious too.. How do you know what palette/color to use for what pixels ?
  3. I actually made something already to replace sprites, and there's another for portraits. Its called ppmd_gfxutil, and the other is ppmd_kaoutil. There isn't a user-friendly frontend for ppmd_gfxutil yet though, so you need to work with the XML to set animations and etc, but you can replace a pokemon's sprite entirely using that. I know that evandixon showed me a neat little app he made to view animations using the data exported with my tool, but I don't know if he's planning to do anything with that. If not, someone else might just make one, or I might, but I need to fully support the wan format first, because I can't really deal with having to rewrite that thing every times I find something new. Also, you seem to like Arceus very much, don't you ? And by pokemon stats, you mean researching what they do, right ? Because, if people want to help with those, that might go much faster given I'm kinda sick of doing trial/error with those in particular right now ^^; Its not all that complicated, given all the unknown values are exported by my tool in the XML data. Of course ! Custom dungeons is something I really want to enable as soon as possible. And, there is a possibility you wouldn't need to actually replace dungeons, the game is very modular in design, and dungeons seems to depend heavily on their script, which is much, much easier than having to deal with hard-coded stuff and ARM byte code. But, from what I know right now, in order to make dungeons fully editable or add custom ones I need to figure out: - dungeon.bin. That file is so weird. Its a big pack file with tons of different types of files piled up arbitrarily. But figuring out what is what, and why its organized that way is the tricky part. - The tile format used for the dungeon tiles. - The sprite format differences for props. It uses mostly the same layout as pokemon sprites, but some differences make my utility crash or fail to extract/rebuild them properly. Mainly because I can't find where the image resolution for those is, and its hard to figure out just from the amount of pixels what format they're in.. I'm suspecting the resolution is possibly stored in the file that indicates where each props is positioned on the map, but I only got a vague idea where it could be. - the mappa_* files in the balance folder. The people on the Gamefaq thread figured out a bunch about those, but there is still much unknown. - The way the script engine work and interact with levels/dungeons. (Though, Nerketur figured out most of it already, which helps a lot) So that might take a while I just wish I could find someone willing to do repetitive trial and error stuff. Like corrupting individual files with random bytes and finding out when the game crashes/glitches.. And then, most likely that having an actual graphical editor for maps would help a lot. But a map editor like that is in itself is a huge project! (That's why I'm planning on just exporting all that data into XML and images so that anyone can use any language or script language(even web-based !) to make an actually good map editor.) And I second that about the soundtrack ! Its awesome ! Though I still like a good chunk of the other games' soundtracks.
  4. So, I was wondering. What would be the most important thing to research/invest time in out of those ?: * Props sprites support for GFXUtil. * Font support for GFXUtil. * UI sprite/effects support for GFXUtil * Dungeon tiles support for GFXUtil * Item stats support for StatsUtil * Random dungeon param support for StatsUtil. * Music/Sound effects support with a new utility. * Researching what each missing fields in the pokemon stats and items stats are for. * Or something else ? I'm lacking focus right now, and I need a clear goal to focus on and to help getting a sense of progress. But given everything I could currently do seems just equally important, its kinda hard to decide.. I'd also love to get more feedback if possible. Feedback is pretty much what keeps me going. Otherwise it feels like I'm just stumbling aimlessly in the dark, and not actually making anything useful..
  5. Have you figured the compression they're using on the game disc ? That's something I have been struggling with back when I was attempting to reverse it. Though I didn't really dig very deep into the file system. Then PMD2 came up, and I switched all my attention on that As for the textures, I've dealt with several image formats in the past, so I might be able to see if I can't do something about it. Also, a good tool to work with several texture formats IMO is Tileggd. You can change endianess and the pixel format, work with palettes, change the offset to begin reading the image at, and etc.. It should work with a lot of formats. Moreover, if you've got some nice info on Pokemon XD/Colosseum, you might want to ask Alpha to get access to the wiki and write that over there ? I could probably even give you a hand on the wiki, since I'm an editor. And I'm about to make another info dump for PMD anyways.
  6. I made a find while messing around with the game's font. The font data for most dialog and menus is stored inside the kanji_rd.dat file, and the kanji.dic file has something to do with it. "/FONT/kanji_rd.dat" is structured this way: Offset: Length: Type: Description: ------- ------- ------- ----------------------------------- 0x0 NbEntries 4 uint32 Nb of char in the file. 0x4 DataBlockA (NbEntries * 28) Block that contains all the data in the file. [ Entry 28 [ CharCode 2 uint16 The code tied to this particular character. Unk#1 2 uint16 Unknown CharData 24 - The 16x12 pixels(192 pixels total), 1 bpp, linear image data for the character. [ ] ] ... ] There is a lot of redundancy in the /FONT/ folder though, and there are at least 2-4 other files with the same character data as kanji_rd.dat, but only editing kanji_rd.dat actually seems to impact dialog and menu text. Also, there is text data that's 4bpp and up in other files, I'm not sure when it could be used, as most text for titles and chapters are just raster images and not text. Then, the markfont.dat and markfont.pal files contains a lot of symbols and icons used throughout dialogs and menus in the game. Things like the icons for the NDS's buttons, arrows, bullets, etc.. I'm also going to make another wiki update pretty soon, once I gathered enough info. Well, the chances of stumbling on another shinx are pretty low unless you go where they spawn, besides, they'd probably have overwritten the move at the level they spawn. And be sure to let me know how that goes! Well, its always possible that, one of these would turn out to be easier to edit than the others, and it would be nice to have everything figured out already. I mean, some games have quirks that sometimes actually unlock more potential about them, like an exploit fixed in the newer editions and whatnot. Then, some people just do it out of nostalgia, or maybe they have their own reasons.
  7. Do you mean that it works fine when you edit another move that your pokemon learns naturally, or do you mean it works fine when you play the game with the modified move, but without giving it to your pokemon ? Also, you do not need to edit the ram to give your poke the move. You can just replace its first move ID in its level-up move list with the move ID you want to try out. EDIT: Also, on the topic of research and the progress with the tools, I found out that the pokemon data in Explorers of Time/Darkness is stored in a slightly different format than in EoS, so that's gonna take a while to figure out.. EoT/D pokemon data is 76 bytes per entry, while EoS is 68.. I might just drop EoT/D support for now, and actually get some more progress done on other areas of the game for EoS.. There are so many quirks that I have to adapt the code for to support those, and frankly, I'm not too motivated to do all that research twice, especially since I still got a lot of trial and error to do to figure out the missing field names for the pokemon and item data.. And I don't really see why someone would make a romhack of Explorers of Time/Darkness over Explorers of Sky anyways..
  8. So kleenexfeu, any more details on the issue ? I can't seem to be able to replicate the issue on my end..
  9. Yep, I realized that later on. But I still posted the video because corsola and shellos don't have that ability. And if you look at the vid for a bit, you'll see I hit a few of them and it resulted in no crit.
  10. I'm really not sure unk12 is the critical hit ratio. I mean, I just thought it matched the value of the critical field in BRT most of the time, but I'm not sure it only does critical hit ratio.. setting the value to either signed max, or unsigned max doesn't seem to let you land criticals every times, which is kinda puzzling.. Just by curiosity, have you tried any higher values than 55 ? For example, look at this video : https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/Test_IronTail_BasePower0_TypeGrass_PP255_Acc124_crit255.avi I changed the type of iron tail to grass, set the base power to 0, set accuracy to 124 and set unk12 to 255. Crit would not happen all the time. That's interesting.. That bitflag has a different effects with each different bit toggled on. 0011 0000 => 48 (Hit every enemies in the room) 0110 0000 => 96 And they both share a common bit. And then if you look at this: 0010 0000 => 32 (Hit every enemy 360 deg around user) ..it seems like bit 6 has something to do with hitting anything within the area of effect.. But this brings the question, what's the difference between 96 and 48 then? Because I've seen healing and status move have much different values than offensive move do, and I'm not sure why. Like, 115 for example, was taken from a boosting move for the user. 0111 0011 => 115 (Hit user) This makes even offensive moves hit yourself. And it has also bit 6 toggled on.. And the lower nybble contains a value too. You know, I'm not 100% sure Neutral is a legit type It looks to me its only a string, and possibly an enum value, but there is probably no data for it. Its possible the game tries to read the damage multiplier outside the type table, and it just multiply the damage with whatever it read there.. Which would explains the insanely high values! (Now, I wonder if we can't use this to find the type effectiveness table or the type data table?) I can't really tell.. Have you tried just running the game normally, without the cheat, and without having the move on your shinx ? Or maybe you could try modifying a more common move instead, restoring move #467 to default, and see what happens ? Its all good. ( Tu parlerais pas Français par hasard ? Il me semble que j'ai lu le mot "Ordinateur" plus haut ) I guess Neutral type is probably not really implemented. Its probably just a string. I had no idea it was possible to get that much damage though. during testing, setting the field at a int16's limit values only resulted in these: https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/Test_IronTail_BasePower32767_TypeGrass_PP66.avi https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/Test_IronTail_BasePower-32767_TypeGrass_PP66.avi The type and whether the attack is physical or not is written in the description string of the move, its not replaced at runtime like the rest for some really weird reason.. So if you wanted to change the type that's displayed in the description, you need to modify the description string in the XML data directly. That was really headache inducing when I was trying to figure out if the move data contained the actual type of the move.. If you manually edited the ram without using a pre-made cheat, and you know what you're doing, it should be fine. Btw, do you have any more hints on how to reproduce the bugs you've been having ? That's so weird... Why compute the damage value as a 32bits integer, before truncating it like that ? I wonder if the NDS9 has some kind of overflow protection...
  11. The cheats are a problem. When I did some testing, the party pokemon data was moved around in memory, possibly due to either modifying the text strings, or adding / removing moves from a pokemon's move list. The cheat didn't have the intended effect and were writing in a now random memory spot. Every "cheat code" you enter in desmume's cheat menu just writes a value in memory at a certain address, which works fine for the base game, but since you basically shifted things in memory, the cheat is telling the emulator to write in memory at a location that isn't what it should be anymore. And, a lot of xml tags are missing in what you posted, did you remove those ? And I checked move #467, and you seem to have changed a lot of the unknown values. Here's the original I got: <?xml version="1.0"?> <Move> <!--Pokemon Mystery Dungeon: Explorers of Sky move data--> <!--In-game text--> <Strings> <Name>$$$</Name> <Description>[M:D1]$$$\n\n\n\nBasic Information:[CLUM_SET:100][M:B20]</Description> </Strings> <!--Move data from waza_p.bin--> <Data> <BasePower>20</BasePower> <Type>1</Type> <Category>1</Category> <Unk4>48</Unk4> <Unk5>48</Unk5> <BasePP>7</BasePP> <Unk6>30</Unk6> <Unk7>125</Unk7> <Accuracy>80</Accuracy> <Unk9>75</Unk9> <Unk10>1</Unk10> <Unk11>99</Unk11> <Unk12>8</Unk12> <Unk13>0</Unk13> <Unk14>0</Unk14> <Unk15>0</Unk15> <Unk16>1</Unk16> <Unk17>1</Unk17> <Unk18>15</Unk18> <MoveID>467</MoveID> <Unk19>0</Unk19> </Data> <!--Move data from waza_p2.bin--> <Data> <BasePower>20</BasePower> <Type>1</Type> <Category>1</Category> <Unk4>48</Unk4> <Unk5>48</Unk5> <BasePP>7</BasePP> <Unk6>30</Unk6> <Unk7>125</Unk7> <Accuracy>80</Accuracy> <Unk9>75</Unk9> <Unk10>1</Unk10> <Unk11>99</Unk11> <Unk12>8</Unk12> <Unk13>0</Unk13> <Unk14>0</Unk14> <Unk15>0</Unk15> <Unk16>1</Unk16> <Unk17>1</Unk17> <Unk18>15</Unk18> <MoveID>467</MoveID> <Unk19>0</Unk19> </Data> </Move> Setting the accuracy to 255 is probably already not a good idea, given most entries in the game never exceed 125. I suspect the value is signed, which would mean you basically gave the move -1 accuracy. I'm not sure what setting Unk4 to 96 does, the only ones I tested with success are 16, 32, 48, and 115. So I'm not sure why you changed it from 48 to 96. And I'm not sure why you changed Unk12 from 8 to 55. And keep in mind that, the stats aren't calculated the same way as in the main series games. Stats goes from 0 to 255 in every categories except HPs. Anyways, try setting those 3 values I mentioned above to their default, and see how it goes. I'll try to replicate this on my end. Also, can you take a screenshot of the damage done ? Because, the value you mentioned is higher than both the maximum values that a 16 bits integer can contain... 65535 when unsigned, or 32767 to -32767 when signed. And don't worry about it, it really helps a lot when people actually tell me about issues they're having, no matter how much they know their stuff. With that I can make the whole thing less confusing, and fix bugs that I could never find on my own if everyone would remain silent.
  12. Did you use any cheats at all ? Even if they used to work ? Please, double check your cheat list, because that's really important. What emulator, and what version ? What did you change exactly ? I'll need the move's ID, and the fields you changed, along with the value you set them to. (You could also just paste the XML into a CODE tag in your post or on pastebin) Don't bother writing the state of the registers. Registers can contain anything at any given time, so without context its useless.
  13. The "/BALANCE/waza_p.bin" file and the "/BALANCE/waza_p2.bin" files contains both the data for every moves in the game, and the movesets for every Pokemon in the game. Its a SIR0 wrapped format. The "waza_p2.bin" file is found only in Explorers of Sky, and its purpose remains unknown. It contains mainly a perfect copy of all the move data in waza_p.bin. Only some Pokemon movesets differs between both files. Erasing the waza_p2.bin file from the game's files causes no immediate issues, as the game seems to use exclusively data from the waza_p.bin file inside and outside dungeons. The file is referred to in a string within the arm9.bin binary. Thus, it must be used eventually by the game in some way. "waza" is the Romaji equivalent of "わざ", which means technique/art.[1] File Structure Overview The format is pretty straightforward. Its made up of 3 major parts. The moveset data, the move data, and a table of pointers to regroup and access individual Pokemon moveset data. Offset Length Name Description 0x00 16 SIR0 Header A SIR0 header wrapping the item data. 0x10 varies Movesets Data A block containing the moveset data for most Pokemon. After Movesets Data 0-15 Padding Bytes Some 0xAA padding bytes to align the next block on 16 bytes. After Padding Bytes varies Moves Data A block containing the data for all moves in the game. After Moves Data 0-15 Padding Bytes Some 0xAA padding bytes to align the next section on 16 bytes. After Padding Bytes varies Moveset Data Pointers Table A table containing pointers stored in groups of 3 for every Pokemon's moveset stored in there. After Moveset Data Pointers Table 0-15 Padding Bytes Some 0xAA padding bytes to align the next section on 16 bytes. After Padding Bytes 8 Waza Header Two pointers, one to the Moves Data, the other to the Moveset Data Pointers Table. After Waza Header 0-15 Padding Bytes Some 0xAA padding bytes to align the next section on 16 bytes. After Padding Bytes 3 SIR0 Pointer Offset List A list of encoded offsets to the pointers in the file. Since there are only the 2 pointers of the SIR0 header, those three bytes are always 0x04, 0x04, 0x00. After SIR0 Pointer Offset List 13 Padding Bytes Since all entries have a fixed size, and the SIR0 Pointer Offset List is 3 bytes long, 13 0xAA bytes are used as padding to align the end of the file on 16 bytes. Waza Header Not really a header in the traditional sense, but more like the entry point to the data the file contains. Its made of two 4 bytes pointers, one to the beginning of the Moves Data block, and the other to the beginning of the Moveset Data Pointers Table. Waza Header (Total length 8 bytes) Offset Length Type Name Description 0x0 4 uint32 PtrMoveDataBlock Points to the beginning of the Moves Data block. 0x4 4 uint32 PtrPtrTable Points to the beginning of the Moveset Data Pointers Table. Moves Data This block is very simple. Its made up of 26 bytes entries containing data for all the moves used in the game. The first entry is always a dummy move. The order the moves appears in this block is the same order as the move names strings are stored inside the text*.strfile. The same goes for the moves' description strings. Move Data Entry (Total length 26 bytes) Offset Length Type Name Description 0x00 2 uint16 Base Power The base power of the move. 0x02 1 uint8 Type The type of the move. See the types list below, for the possible values. 0x03 1 uint8 Category What kind of move is it. 0x0 is Physical 0x1 is Special 0x2 is Status move 0x04 2 uint16 Bitfield#1 A bit field not fully understood yet. It does however changes what enemies are hit at close range. See Bitfield 1 for more details. 0x06 2 uint16 Bitfield#2 Another bit field that's not fully understood yet. This one seems to alter long-range attack. See Bitfield 2 for more details. 0x08 1 uint8 Base PPs The base amount of PP for the move. 0x09 1 uint8 Unk#6 Unknown. 0x0A 1 uint8 Unk#7 Unknown. 0x0B 1 uint8 Move Accuracy The percentage indicating the chances the move will succeed. 100 is perfect accuracy. Anything higher than 100 is a never-miss move. 0x0C 1 uint8 Unk#9 Unknown. 0x0D 1 uint8 Unk#10 Unknown. 0x0E 1 uint8 Unk#11 Unknown. 0x0F 1 uint8 Unk#12 Unknown. Possibly related to critical hits calculation? 0x10 1 uint8 Unk#13 Unknown. 0x11 1 uint8 Unk#14 Unknown. 0x12 1 uint8 Unk#15 Unknown. 0x13 1 uint8 Unk#16 Unknown. 0x14 1 uint8 Unk#17 Unknown. 0x15 1 uint8 Unk#18 Unknown. Possible bitfield. 0x16 2 uint16 Move ID The move's ID, possibly used by the game code for allocating resources and etc.. 0x18 1 uint8 Unk#19 Unknown. Types List Value Type 0x00 None 0x01 Normal 0x02 Fire 0x03 Water 0x04 Grass 0x05 Electric 0x06 Ice 0x07 Fighting 0x08 Poison 0x09 Ground 0x0A Flying 0x0B Psychic 0x0C Bug 0x0D Rock 0x0E Ghost 0x0F Dragon 0x10 Dark 0x11 Steel 0x12 Neutral Bitfield 1[edit] Not much is known about this field, except that setting some of its bits to 1 changes the way moves target entities. 0001 0000 (16)= Hit everything next to the user on 180 degrees forward 0010 0000(32) = Hit everything next to the user on 360 degrees 0011 0000(48) = Hit everything in the same room 0111 0011(115)= Hit user Bitfield 2 Not much either is known about this field. Changing some of its bits seems to alter ranged moves. 0101 0000(80) makes the move a long range straight line attack Moveset Data Pointers Table A table made of a series of groups of 3 pointers. Each groups of 3 pointers is assigned to a Pokemon that has the same index in monster.md as the group of pointer. Moveset Pointers Group (Total length 12 bytes) Offset Length Type Name Description 0x0 4 uint32 PtrLvlUpLst Points to this Pokemon's level-up moves list. Only null for the first dummy Pokemon. 0x4 4 uint32 PtrHmTmLst Points to this Pokemon's list of teachable HM/TM moves. Only null for the first dummy Pokemon. 0x8 4 uint32 PtrEggLst Points to this Pokemon's list of possible egg moves. Only null for the first dummy Pokemon. Movesets Data This block is made of null terminated lists of encoded integers. Each lists are pointed to by a pointer in the Moveset Data Pointers Table. The block always begin with 3 null bytes. Those are the lists for the dummy first Pokemon. Every 3 lists belongs to a specific Pokemon, and each have a specific content/purpose. An empty list is represented by a single null byte. Moveset Lists Group Offset Name Description 0x0 Level-Up Moves List This list of integer is particular. Its not just a list of moves, like the two others. Each move ID is followed with the level at which the Pokemon learns the move. So essentially, every 2 integer decoded from this list form a pair indicating the move ID and then the level. After Level-Up Moves List HM/TM Moves List A simple list of integer where each value correspond to a HM/TMs move ID the Pokemon can learn. After HM/TM Moves List Egg Moves List Another simple list of integer where each value correspond to a move ID of a move the Pokemon may get if it hatches from an egg. Encoding The encoding for the lists is the same used for the SIR0 format's encoded pointer list. However, each values decoded is not relative to the previous one, and you must keep in mind that there are several lists, not a single one, unlike the SIR0's encoded pointer offsets list. Also, the move IDs are 16 bits integers, not 32 bits integers like the pointer offsets are. Here's an example of decoding Bulbasaur's 3 lists. This only shows the raw bytes, then the decoded raw values, then the corresponding move to the move ID that was decoded: First List: 0x81 0x1A 0x01 => 0x9A, 1 => Tackle lvl 1 0x81 0x59 0x03 => 0xD9, 3 => Growl lvl 3 0x82 0x49 0x07 => 0x149, 7 => Leech Seed lvl 7 0x81 0x36 0x09 => 0xB6, 9 => Vine Whip lvl 9 0x81 0x47 0x0D => 0xC7, 13 => Poison Powder lvl 13 0x81 0x67 0x0D => 0xE7, 13 => Sleep Powder lvl 13 0x81 0x4B 0x0F => 0xCB, 15 => Take Down lvl 15 0x81 0x7B 0x13 => 0xFB, 19 => Razor Leaf lvl 19 0x0A 0x15 => 0x0A, 21 => Sweet Scent lvl 21 0x81 0x14 0x19 => 0x94, 25 => Growth lvl 25 0x81 0x0C 0x1B => 0x8C, 27 => Double-Edge lvl 27 0x83 0x78 0x1F => 0x1F8, 31 => Worry Seed lvl 31 0x5E 0x21 => 0x5E, 33 => Synthesis lvl 33 0x83 0x66 0x25 => 0x1E6, 37 => Seed Bomb lvl 37 0x00 Second List: 0x12 => 18 => Cut 0x18 => 24 => Swagger 0x1D => 29 => Rock Smash 0x30 => 48 => Return 0x32 => 50 => Strength 0x38 => 56 => Double Team 0x43 => 67 => Facade 0x4C => 76 => Giga-Drain 0x68 => 104 => Endure 0x81 0x17 => 151 => Solar Beam 0x81 0x23 => 163 => Bullet Seed 0x81 0x35 => 181 => Swords Dance 0x81 0x45 => 197 => Toxic 0x81 0x5F => 223 => Sunny Day 0x81 0x63 => 227 => Sleep Talk 0x81 0x68 => 232 => Rest 0x82 0x07 => 263 => Secret Power 0x82 0x11 => 273 => Flash 0x82 0x18 => 280 => Sludge Bomb 0x82 0x2D => 301 => Protect 0x82 0x30 => 304 => Substitute 0x82 0x44 => 324 => Hidden Power 0x82 0x46 => 326 => Attract 0x82 0x48 => 328 => Frustration 0x82 0x68 => 360 => Wide Slash 0x83 0x0A => 394 => Vacuum-Cut 0x83 0x3B => 443 => Energy Ball 0x83 0x4A => 458 => Grass Knot 0x83 0x57 => 471 => Natural Gift 0x84 0x16 => 534 => Captivate 0x00 Third List: 0x0B => 11 => Charm 0x54 => 84 => Grass Whistle 0x77 => 119 => Nature Power 0x81 0x06 => 134 => Safeguard 0x81 0x57 => 215 => Amnesia 0x81 0x69 => 233 => Ingrain 0x81 0x6D => 237 => Curse 0x81 0x7D => 253 => Petal Dance 0x82 0x03 => 259 => Light Screen 0x82 0x29 => 297 => Magical Leaf 0x82 0x5C => 348 => Skull Bash 0x84 0x19 => 537 => Leaf Storm 0x00 Credits The WMS project, for their notes. [2] OgreGunner and nhahtdh for that huge thread on GameFaqs filled with tidbits of information! [3] Kelvin Chung for the .grammar file containing much useful information on the PMD:RRT format, which share similarities with PMD2! [4]
  14. NDSTools shrinks the rom by default, it leaves out all the padding bytes from the rom when re-building it. That might be an issue on the actual hardware, but not on emulators AFAIK. Actually, I noticed the same issue while testing. Not sure what's going on with that exactly I think it might have to do with modifying the length of a text string, like Pokemon names or category string. Its odd though, because I'd assume they wouldn't load all game strings in memory at all time, especially since the whole thing is around a mega byte!
  15. Use any text editor/xml editor you want. I recommend using notepad++, it highlights everything and make it all easier to read. If you've never used XML before think of it like tags in a forum, or HTML tags. Its a set of tags, that can wrap other tags or a value. EDIT: Alright then, and no problems
  16. Alright, first, you're not dumb, you just don't seem very used to this way of doing things. Which is understandable, because literally every utilities to hack NDS games try to operate on the rom directly(Which isn't really the best idea especially if you're editing a lot of things in the rom, using several different tools, you'd have to rebuild the rom everytime with every single tools. If there was a way to load a rom image as a file system, then that would be leagues better, but nobody has done that AFAIK) When I said extracted, I meant you can't use a NDS file directly, you have to extract the file system as-is to the disk. The tool needs to have the whole directory structure of the rom intact to do anything, because it checks the files present to figure out if its EoS or EoT/D, and then it needs to load several files to assemble the pokemon and move data, plus it needs to load the game strings. The logic being that, its way easier for everyone to just use the rom directory structure to find where everything is located, rather than forcing the user to have to specify the location of all those files manually. Don't use nitro explorer though, it doesn't seem to be able to extract the whole rom and rebuild it. Try dslazy for now, it uses NDS tool and works pretty well : http://filetrip.net/nds-downloads/utilities/download-dsbuff-v1-final-f3100.html It always extract the rom data into the directory its in, in a sub-directory named NDS_UNPACK. So you'll want to put as first argument the path to the dslazy directory, followed with this : "NDS_UNPACK/data" It will give something like this: "C:/somedirectory/dslazy/NDS_UNPACK/data" Also, when specifying a path to a command-line program, always be sure to enclose paths in-between quotes, that will ensure that any spaces in the path won't confuse the system's argument parser. Also, always replace any \ with /
  17. Alright, I made an update, and now you can just drag and drop the rom data folder onto the executable and it will export everything it can. For importing everything you just need to specify the folder where the data was exported to as first parameter, and the path to the exported rom's data directory! https://github.com/PsyCommando/ppmdu/releases/download/ppmd_statsutil_0.11/ppmd_statsutil_0_11.zip I also, removed the progress indicator and got a big speed up! Have you extracted the rom first ? And if you did, you have to make sure you put the path to the "data"/root directory of the rom, that's the directory that contains the "MESSAGE" and "BALANCE" directories.
  18. Well, that won't work with this one right now, you have to either make a shortcut or a batch file. Actually, I could even ship it with a few batch files that would handle the drag-and-drop.. There's an issue with the item data parser, so just dragging and dropping the game's data dir onto it will just end with an "not implemented" exception ^^; It should be fixed next release, but I figured it was good enough for testing You're welcome But, like evandixon said, its a command line utility, so you have to do extra work. Well, for now anyways. So, if you're using windows vista/7, go to the directory you're extracted the whole zip to, hold the shift key, right click on some empty space in the folder window, and click "Open command window here..". Then, the readme has a few pre-made lines for specific operations: ---------------------------------------------------------------------------------------------------- How to use: ---------------------------------------------------------------------------------------------------- Exporting: ---------- * Exporting Pokemon data to XML: Type this at the command line (without the first set of quotes): "ppmd_statsutil.exe -e -pk "path/To/PMD2/ROM/Data/Directory" "Path/To/Output/Directory"" Replace the paths with the appropriate paths! You can omit the output path, and the xml data will be exported to a default directory. * Exporting move data to XML: Type this at the command line (without the first set of quotes): "ppmd_statsutil.exe -e -mv "path/To/PMD2/ROM/Data/Directory" "Path/To/Output/Directory"" Replace the paths with the appropriate paths! You can omit the output path, and the xml data will be exported to a default directory. * Exporting game text to text file: Type this at the command line (without the first set of quotes): "ppmd_statsutil.exe -e -str "path/To/PMD2/ROM/DataDir" "Path/To/Output/File/text.txt"" Replace the paths with the appropriate paths! And replace the filenames as desired. You can omit the output path, and the text data will be exported to a text file with the default name. Importing: ---------- * Importing Pokemon data from XML back into the game: Enter this at the commandline (without the first set of quotes): "ppmd_statsutil.exe -i -pk "Path/To/Input/XMLdata/Directory" "path/To/Target/PMD2/ROM/Data/Directory"" Replace the paths with the appropriate paths! The output path is mandatory! * Importing moves data from XML back into the game: Enter this at the commandline (without the first set of quotes): "ppmd_statsutil.exe -i -mv "Path/To/Input/XMLdata/Directory" "path/To/Target/PMD2/ROM/Data/Directory"" Replace the paths with the appropriate paths! The output path is mandatory! * Importing game text from a text file back into the game: Enter this at the commandline (without the first set of quotes): "ppmd_statsutil.exe -i -str "Path/To/Input/File/text.txt" "path/To/PMD2/ROM/DataDir"" Replace the paths with the appropriate paths! The output path is mandatory! So if you want to export Pokemon data from the extracted ROM data located at "C:/directory/pmd2rom/data", you'd write this in the command prompt: ppmd_statsutil.exe -e -pk "C:/directory/pmd2rom/data" "-e" tells the program you want to export. "-pk" tells the program you want to operate on pokemon data. "C:/directory/pmd2rom/data" is the path to the extracted rom's data. The utility is mainly meant to be used by software devs to make their own more user friendly tools however. That's why its command line, because its way faster to develop and easier to use from any other GUI utility. I'm also going to make a very rudimentary GUI for this one too, pretty much the same thing as packfileutil and kaoutil, just to make it easier to handle for most people until more complete and user friendly tools are available. EDIT: Oh well, got ninja-ed
  19. Well, from what I could find out, the "en-US" locale on Windows is basically ANSI codepage 1252. http://web.archive.org/web/20130813083656/http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx And that works pretty well from what I've seen this far! Also, all symbols that appears in the text are triggered by a tag that changes the font to use, so its possible you lost some characters while parsing the file, and those tags aren't read properly anymore ? Also, I wrote obscenities in the game and didn't have any issues XP EDIT: Also, wouldn't Shift-JIS be more appropriate for "text_j.str" ? Because, the name of the file changes based on the language and the encoding too.
  20. So, after nearly a month of messing around, here's the first alpha release for ppmd_statsutil! https://github.com/PsyCommando/ppmdu/releases/download/ppmd_statsutil_0.1a/ppmd_statsutil_0_1.zip Its nothing all that great yet though, but I figured I might as well release something, and see if it helps figuring out the remaining details about the game data! Right now, it supports only exporting/importing Pokemon data, move data, and the game text. And it only works with Explorers of Sky this far, at least AFAIK(didn't test with the others yet). And only doing so one at a time! Don't try drag and drop on this one! It won't work. There's no way to figure out what you want from doing that! You have to specify at the command line whether you're importing or exporting with the "-i" or "-e" option. And then you must specify what you want to export/import using the "-pk" "-mv" or "-str" option, for respectively, pokemon data, move data, and game strings. Move data and Pokemon data are exported to XML, and the game strings are exported to a text file, where each line is a single string entry. All control characters are escaped using a backslash. For example \n is a newline, and \0 marks the end of the string. Other unprintable characters are represented using a decimal number after a backslash, instead of a character. To edit anything you'll need to have a reference for the move IDs and ability, type, movement ids and etc.. This is because while nearly all of those have strings associated, most of those values contain duplicate strings, which makes it unpractical and extremely error prone. Plus, the tool is mainly intended to be used by another more complete tool with a user interface that would handle this kind of things. Luckily, you can find references in a couple of places, namely the project pokemon wiki ! : http://projectpokemon.org/wiki/Pmd2_monster.md and the item_p_Sky.xlsx file over there !: http://apointlessplace.net/wms/research/ Here's bulbasaur's XML data as example : <?xml version="1.0"?> <Pokemon GameVersion="EoS"> <!--In-game text--> <Strings> <Name>Bulbasaur</Name> <Category>Seed</Category> </Strings> <!--Primary gender entity--> <GenderedEntity> <PokeID>1</PokeID> <Unk31>1</Unk31> <PokedexNumber>1</PokedexNumber> <Unk1>1</Unk1> <EvolutionReq> <PreEvoIndex>0</PreEvoIndex> <Method>0</Method> <Param1>0</Param1> <Param2>0</Param2> </EvolutionReq> <SpriteIndex>0</SpriteIndex> <Gender>1</Gender> <BodySize>1</BodySize> <PrimaryType>4</PrimaryType> <SecondaryType>8</SecondaryType> <MovementType>0</MovementType> <IQGroup>5</IQGroup> <PrimaryAbility>26</PrimaryAbility> <SecondaryAbility>0</SecondaryAbility> <Bitfield>0x70</Bitfield> <ExpYield>7</ExpYield> <RecruitRate1>82</RecruitRate1> <RecruitRate2>82</RecruitRate2> <BaseStats> <HP>22</HP> <Attack>3</Attack> <SpAttack>4</SpAttack> <Defense>2</Defense> <SpDefense>3</SpDefense> </BaseStats> <Weight>153</Weight> <Size>27</Size> <Unk17>0xa</Unk17> <Unk18>0xa</Unk18> <Unk19>0x1</Unk19> <Unk20>0x8</Unk20> <Unk21>0x64</Unk21> <BasePokemonIndex>1</BasePokemonIndex> <ExclusiveItems> <ItemID>574</ItemID> <ItemID>575</ItemID> <ItemID>576</ItemID> <ItemID>577</ItemID> </ExclusiveItems> <Unk27>0x2ee</Unk27> <Unk28>0x15</Unk28> <Unk29>0x1b</Unk29> <Unk30>0x1c</Unk30> </GenderedEntity> <!--Secondary gender entity--> <GenderedEntity> <PokeID>1</PokeID> <Unk31>1</Unk31> <PokedexNumber>1</PokedexNumber> <Unk1>1</Unk1> <EvolutionReq> <PreEvoIndex>0</PreEvoIndex> <Method>0</Method> <Param1>0</Param1> <Param2>0</Param2> </EvolutionReq> <SpriteIndex>0</SpriteIndex> <Gender>2</Gender> <BodySize>1</BodySize> <PrimaryType>4</PrimaryType> <SecondaryType>8</SecondaryType> <MovementType>0</MovementType> <IQGroup>5</IQGroup> <PrimaryAbility>26</PrimaryAbility> <SecondaryAbility>0</SecondaryAbility> <Bitfield>0x70</Bitfield> <ExpYield>7</ExpYield> <RecruitRate1>82</RecruitRate1> <RecruitRate2>82</RecruitRate2> <BaseStats> <HP>22</HP> <Attack>3</Attack> <SpAttack>4</SpAttack> <Defense>2</Defense> <SpDefense>3</SpDefense> </BaseStats> <Weight>153</Weight> <Size>27</Size> <Unk17>0xa</Unk17> <Unk18>0xa</Unk18> <Unk19>0x1</Unk19> <Unk20>0x8</Unk20> <Unk21>0x64</Unk21> <BasePokemonIndex>1</BasePokemonIndex> <ExclusiveItems> <ItemID>574</ItemID> <ItemID>575</ItemID> <ItemID>576</ItemID> <ItemID>577</ItemID> </ExclusiveItems> <Unk27>0x2ee</Unk27> <Unk28>0x15</Unk28> <Unk29>0x1b</Unk29> <Unk30>0x1c</Unk30> </GenderedEntity> <StatsGrowth> <!--Level 1--> <Level> <RequiredExp>0</RequiredExp> <HP>0</HP> <Attack>0</Attack> <SpAttack>0</SpAttack> <Defense>0</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 2--> <Level> <RequiredExp>9</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 3--> <Level> <RequiredExp>23</RequiredExp> <HP>2</HP> <Attack>1</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 4--> <Level> <RequiredExp>40</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 5--> <Level> <RequiredExp>88</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 6--> <Level> <RequiredExp>193</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 7--> <Level> <RequiredExp>300</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 8--> <Level> <RequiredExp>563</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 9--> <Level> <RequiredExp>1136</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 10--> <Level> <RequiredExp>1711</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 11--> <Level> <RequiredExp>2616</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 12--> <Level> <RequiredExp>4828</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 13--> <Level> <RequiredExp>7046</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 14--> <Level> <RequiredExp>10985</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 15--> <Level> <RequiredExp>14927</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 16--> <Level> <RequiredExp>19348</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 17--> <Level> <RequiredExp>23774</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 18--> <Level> <RequiredExp>28688</RequiredExp> <HP>3</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 19--> <Level> <RequiredExp>33607</RequiredExp> <HP>2</HP> <Attack>2</Attack> <SpAttack>2</SpAttack> <Defense>2</Defense> <SpDefense>2</SpDefense> </Level> <!--Level 20--> <Level> <RequiredExp>38528</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>2</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 21--> <Level> <RequiredExp>43488</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>2</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 22--> <Level> <RequiredExp>49233</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>2</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 23--> <Level> <RequiredExp>54983</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 24--> <Level> <RequiredExp>60739</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 25--> <Level> <RequiredExp>68068</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 26--> <Level> <RequiredExp>76985</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 27--> <Level> <RequiredExp>86688</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 28--> <Level> <RequiredExp>97176</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 29--> <Level> <RequiredExp>108451</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 30--> <Level> <RequiredExp>120511</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 31--> <Level> <RequiredExp>133358</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 32--> <Level> <RequiredExp>146991</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 33--> <Level> <RequiredExp>162993</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 34--> <Level> <RequiredExp>179782</RequiredExp> <HP>3</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 35--> <Level> <RequiredExp>197356</RequiredExp> <HP>2</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 36--> <Level> <RequiredExp>215717</RequiredExp> <HP>2</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 37--> <Level> <RequiredExp>234863</RequiredExp> <HP>2</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 38--> <Level> <RequiredExp>254795</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 39--> <Level> <RequiredExp>275513</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 40--> <Level> <RequiredExp>297017</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 41--> <Level> <RequiredExp>319308</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 42--> <Level> <RequiredExp>342385</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 43--> <Level> <RequiredExp>366247</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 44--> <Level> <RequiredExp>391681</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 45--> <Level> <RequiredExp>418687</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 46--> <Level> <RequiredExp>447265</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 47--> <Level> <RequiredExp>477415</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 48--> <Level> <RequiredExp>509138</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 49--> <Level> <RequiredExp>542432</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 50--> <Level> <RequiredExp>577298</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 51--> <Level> <RequiredExp>613736</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 52--> <Level> <RequiredExp>651746</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 53--> <Level> <RequiredExp>691054</RequiredExp> <HP>1</HP> <Attack>0</Attack> <SpAttack>1</SpAttack> <Defense>0</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 54--> <Level> <RequiredExp>730368</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 55--> <Level> <RequiredExp>769691</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 56--> <Level> <RequiredExp>809022</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 57--> <Level> <RequiredExp>848361</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 58--> <Level> <RequiredExp>887707</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 59--> <Level> <RequiredExp>927061</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>0</SpAttack> <Defense>1</Defense> <SpDefense>0</SpDefense> </Level> <!--Level 60--> <Level> <RequiredExp>966424</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 61--> <Level> <RequiredExp>1005793</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 62--> <Level> <RequiredExp>1045171</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 63--> <Level> <RequiredExp>1084557</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 64--> <Level> <RequiredExp>1123951</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 65--> <Level> <RequiredExp>1163352</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 66--> <Level> <RequiredExp>1202761</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 67--> <Level> <RequiredExp>1242179</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 68--> <Level> <RequiredExp>1281604</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 69--> <Level> <RequiredExp>1321036</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 70--> <Level> <RequiredExp>1360477</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 71--> <Level> <RequiredExp>1399926</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 72--> <Level> <RequiredExp>1439383</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 73--> <Level> <RequiredExp>1478847</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 74--> <Level> <RequiredExp>1518319</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 75--> <Level> <RequiredExp>1557799</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 76--> <Level> <RequiredExp>1597287</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 77--> <Level> <RequiredExp>1636783</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 78--> <Level> <RequiredExp>1676287</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 79--> <Level> <RequiredExp>1715798</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 80--> <Level> <RequiredExp>1755317</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 81--> <Level> <RequiredExp>1794845</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 82--> <Level> <RequiredExp>1834380</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 83--> <Level> <RequiredExp>1873922</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 84--> <Level> <RequiredExp>1913473</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 85--> <Level> <RequiredExp>1953032</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 86--> <Level> <RequiredExp>1992599</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 87--> <Level> <RequiredExp>2032173</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 88--> <Level> <RequiredExp>2071756</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 89--> <Level> <RequiredExp>2111345</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 90--> <Level> <RequiredExp>2150943</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 91--> <Level> <RequiredExp>2190549</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 92--> <Level> <RequiredExp>2230163</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 93--> <Level> <RequiredExp>2269785</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 94--> <Level> <RequiredExp>2309414</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 95--> <Level> <RequiredExp>2349052</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 96--> <Level> <RequiredExp>2388696</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 97--> <Level> <RequiredExp>2428349</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 98--> <Level> <RequiredExp>2468010</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 99--> <Level> <RequiredExp>2507679</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> <!--Level 100--> <Level> <RequiredExp>2547402</RequiredExp> <HP>1</HP> <Attack>1</Attack> <SpAttack>1</SpAttack> <Defense>1</Defense> <SpDefense>1</SpDefense> </Level> </StatsGrowth> <!--Moveset from waza_p.bin--> <Moveset> <!--Learns 14 move(s)--> <LevelUpMoves> <Learn> <Level>1</Level> <MoveID>154</MoveID> </Learn> <Learn> <Level>3</Level> <MoveID>217</MoveID> </Learn> <Learn> <Level>7</Level> <MoveID>329</MoveID> </Learn> <Learn> <Level>9</Level> <MoveID>182</MoveID> </Learn> <Learn> <Level>13</Level> <MoveID>199</MoveID> </Learn> <Learn> <Level>13</Level> <MoveID>231</MoveID> </Learn> <Learn> <Level>15</Level> <MoveID>203</MoveID> </Learn> <Learn> <Level>19</Level> <MoveID>251</MoveID> </Learn> <Learn> <Level>21</Level> <MoveID>10</MoveID> </Learn> <Learn> <Level>25</Level> <MoveID>148</MoveID> </Learn> <Learn> <Level>27</Level> <MoveID>140</MoveID> </Learn> <Learn> <Level>31</Level> <MoveID>504</MoveID> </Learn> <Learn> <Level>33</Level> <MoveID>94</MoveID> </Learn> <Learn> <Level>37</Level> <MoveID>486</MoveID> </Learn> </LevelUpMoves> <!--Has 12 egg move(s)--> <EggMoves> <MoveID>11</MoveID> <MoveID>84</MoveID> <MoveID>119</MoveID> <MoveID>134</MoveID> <MoveID>215</MoveID> <MoveID>233</MoveID> <MoveID>237</MoveID> <MoveID>253</MoveID> <MoveID>259</MoveID> <MoveID>297</MoveID> <MoveID>348</MoveID> <MoveID>537</MoveID> </EggMoves> <!--Can learn 30 HM/TM move(s)--> <HmTmMoves> <MoveID>18</MoveID> <MoveID>24</MoveID> <MoveID>29</MoveID> <MoveID>48</MoveID> <MoveID>50</MoveID> <MoveID>56</MoveID> <MoveID>67</MoveID> <MoveID>76</MoveID> <MoveID>104</MoveID> <MoveID>151</MoveID> <MoveID>163</MoveID> <MoveID>181</MoveID> <MoveID>197</MoveID> <MoveID>223</MoveID> <MoveID>227</MoveID> <MoveID>232</MoveID> <MoveID>263</MoveID> <MoveID>273</MoveID> <MoveID>280</MoveID> <MoveID>301</MoveID> <MoveID>304</MoveID> <MoveID>324</MoveID> <MoveID>326</MoveID> <MoveID>328</MoveID> <MoveID>360</MoveID> <MoveID>394</MoveID> <MoveID>443</MoveID> <MoveID>458</MoveID> <MoveID>471</MoveID> <MoveID>534</MoveID> </HmTmMoves> </Moveset> <!--Moveset from waza_p2.bin--> <Moveset> <!--Learns 14 move(s)--> <LevelUpMoves> <Learn> <Level>1</Level> <MoveID>154</MoveID> </Learn> <Learn> <Level>3</Level> <MoveID>217</MoveID> </Learn> <Learn> <Level>7</Level> <MoveID>329</MoveID> </Learn> <Learn> <Level>9</Level> <MoveID>182</MoveID> </Learn> <Learn> <Level>13</Level> <MoveID>199</MoveID> </Learn> <Learn> <Level>13</Level> <MoveID>231</MoveID> </Learn> <Learn> <Level>15</Level> <MoveID>203</MoveID> </Learn> <Learn> <Level>19</Level> <MoveID>251</MoveID> </Learn> <Learn> <Level>21</Level> <MoveID>10</MoveID> </Learn> <Learn> <Level>25</Level> <MoveID>148</MoveID> </Learn> <Learn> <Level>27</Level> <MoveID>140</MoveID> </Learn> <Learn> <Level>31</Level> <MoveID>504</MoveID> </Learn> <Learn> <Level>33</Level> <MoveID>94</MoveID> </Learn> <Learn> <Level>37</Level> <MoveID>486</MoveID> </Learn> </LevelUpMoves> <!--Has 12 egg move(s)--> <EggMoves> <MoveID>11</MoveID> <MoveID>84</MoveID> <MoveID>119</MoveID> <MoveID>134</MoveID> <MoveID>215</MoveID> <MoveID>233</MoveID> <MoveID>237</MoveID> <MoveID>253</MoveID> <MoveID>259</MoveID> <MoveID>297</MoveID> <MoveID>348</MoveID> <MoveID>537</MoveID> </EggMoves> <!--Can learn 30 HM/TM move(s)--> <HmTmMoves> <MoveID>18</MoveID> <MoveID>24</MoveID> <MoveID>29</MoveID> <MoveID>48</MoveID> <MoveID>50</MoveID> <MoveID>56</MoveID> <MoveID>67</MoveID> <MoveID>76</MoveID> <MoveID>104</MoveID> <MoveID>151</MoveID> <MoveID>163</MoveID> <MoveID>181</MoveID> <MoveID>197</MoveID> <MoveID>223</MoveID> <MoveID>227</MoveID> <MoveID>232</MoveID> <MoveID>263</MoveID> <MoveID>273</MoveID> <MoveID>280</MoveID> <MoveID>301</MoveID> <MoveID>304</MoveID> <MoveID>324</MoveID> <MoveID>326</MoveID> <MoveID>328</MoveID> <MoveID>360</MoveID> <MoveID>394</MoveID> <MoveID>443</MoveID> <MoveID>458</MoveID> <MoveID>471</MoveID> <MoveID>534</MoveID> </HmTmMoves> </Moveset> </Pokemon> And here's the XML data for the move Iron Tail as an example : <?xml version="1.0"?> <Move> <!--Pokemon Mystery Dungeon: Explorers of Sky move data--> <!--In-game text--> <Strings> <Name>Iron Tail</Name> <Description>"Basic Information"[CS:E][bAR][CR]\nInflicts damage on the target. It may\nalso reduce the target's [CS:E]Defense[CR] by\n1 level.\n\n\n\n\nDetailed Information:[CLUM_SET:108][M:B20]\n[C]\n"Detailed Information"[CS:E][bAR][CR]\nRange:[CLUM_SET:36] Enemy in front\nType:[CLUM_SET:36] Steel/Physical\nHit Ratio[CLUM_SET:54]:[CLUM_SET:62][move_hit_ratio]\nPower[CLUM_SET:54]:[CLUM_SET:62][move_power]\n\n\n\nBasic Information:[CLUM_SET:100][M:B20]</Description> </Strings> <!--Move data from waza_p.bin--> <Data> <BasePower>40</BasePower> <Type>17</Type> <Category>0</Category> <Unk4>0</Unk4> <Unk5>0</Unk5> <BasePP>10</BasePP> <Unk6>15</Unk6> <Unk7>125</Unk7> <Accuracy>78</Accuracy> <Unk9>75</Unk9> <Unk10>1</Unk10> <Unk11>99</Unk11> <Unk12>8</Unk12> <Unk13>0</Unk13> <Unk14>0</Unk14> <Unk15>0</Unk15> <Unk16>1</Unk16> <Unk17>1</Unk17> <Unk18>11</Unk18> <MoveID>1</MoveID> <Unk19>0</Unk19> </Data> <!--Move data from waza_p2.bin--> <Data> <BasePower>40</BasePower> <Type>17</Type> <Category>0</Category> <Unk4>0</Unk4> <Unk5>0</Unk5> <BasePP>10</BasePP> <Unk6>15</Unk6> <Unk7>125</Unk7> <Accuracy>78</Accuracy> <Unk9>75</Unk9> <Unk10>1</Unk10> <Unk11>99</Unk11> <Unk12>8</Unk12> <Unk13>0</Unk13> <Unk14>0</Unk14> <Unk15>0</Unk15> <Unk16>1</Unk16> <Unk17>1</Unk17> <Unk18>11</Unk18> <MoveID>1</MoveID> <Unk19>0</Unk19> </Data> </Move> Also, one of the more powerful feature of this tool is the "gamelang.xml" file. Its a very simple XML file that contains the name of the "text_*.str" file for all supported languages, along with a locale string associated with that language to allow parsing special charactersets, and a list of string indexes for move names, pokemon names and etc, within the the "text_*.str" file! This XML file can be edited by anyone and more languages can be added, along with the appropriate string indexes for all the relevant things in the game text! The gamelang.xml file included is very incomplete for now though, with only support for the English game! Here's the current entry for Explorers of Sky for example: <!--Begin List for Explorers of Sky--> <Game name="EoS"> <Language name="English" strfile="text_e.str" locale="en-US"> <StringBlock> <Name>Pokemon Names</Name> <Begin>8734</Begin> <End>9334</End> </StringBlock> <StringBlock> <Name>Pokemon Categories</Name> <Begin>9334</Begin> <End>9934</End> </StringBlock> <StringBlock> <Name>Move Names</Name> <Begin>8173</Begin> <End>8734</End> </StringBlock> <StringBlock> <Name>Move Descriptions</Name> <Begin>10145</Begin> <End>10704</End> </StringBlock> <StringBlock> <Name>Item Names</Name> <Begin>6773</Begin> <End>8173</End> </StringBlock> <StringBlock> <Name>Item Short Descriptions</Name> <Begin>12104</Begin> <End>13504</End> </StringBlock> <StringBlock> <Name>Item Long Descriptions</Name> <Begin>10704</Begin> <End>12104</End> </StringBlock> <StringBlock> <Name>Ability Names</Name> <Begin>13789</Begin> <End>13913</End> </StringBlock> <StringBlock> <Name>Ability Descriptions</Name> <Begin>13913</Begin> <End>14037</End> </StringBlock> <StringBlock> <Name>Type Names</Name> <Begin>13770</Begin> <End>13989</End> </StringBlock> </Language> I could probably add stuff for exporting small sections of the game text, like only abilities, or only pokemon, or types, etc, if anyone would have any use for that. If there are any feature requests, or any issues with the tool, let me know!
  21. The "/BALANCE/item_s_p.bin" file in the Pokemon Mystery Dungeon: Explorers of Sky game is used to store data for the "exclusive items". Its wrapped in a SIR0 container. File Structure Overview Offset Length Name Description 0x00 16 SIR0 Header A SIR0 header wrapping the item data. 0x10 (NbEntries * 4) Item Data A block containing entries for all exclusive items. After Item Data 3 SIR0 Pointer Offset List A list of encoded offsets to the pointers in the file. Since there are only the 2 pointers of the SIR0 header, those three bytes are always 0x04, 0x04, 0x00. After SIR0 Pointer Offset List 13 Padding Bytes Since all entries have a fixed size, and the SIR0 Pointer Offset List is 3 bytes long, 13 0xAA bytes are used as padding to align the end of the file on 16 bytes. Item Data Item Data Entry (Total length 4 bytes) Offset Length Type Name Description 0x0 2 uint16 Item Type A number that indicates several things on the item. 0x2 2 uint16 Item Parameter A parameter that depends on the item type. Item Type A list of the possible type values an "exclusive item" can have. This list is based on data compiled by nhahtdh into the item_p_sky.xlsx excel document, and then verified/confirmed on our end.(See links in the Credits section. ) The type can determine these things: The star rating of the item. (rarity) Whether its Pokemon-specific, or type-specific. If its a 1 star item, which of the 2 possible 1-star items is it. Whether its an item that a Pokemon can randomly get when hatching. And possibly, an additional unknown trait. Here are the possible item type values, and what they imply: Value Rarity Item "Slot" Exclusive To Extra Trait 0x0 - - - - 0x1 * 1 A Type - 0x2 * 2 A Type - 0x3 ** - A Type - 0x4 *** - A Type - 0x5 * 1 A Pokemon - 0x6 * 2 A Pokemon - 0x7 ** - A Pokemon - 0x8 *** - A Pokemon - 0x9 *** - A Pokemon The Pokemon may hatch holding the item. 0xA *** - A Pokemon ? (Only all the Eeveelutions, and the Tyrogue line have items with this type! ) Item Parameter The parameter's value changes meaning depending on the exclusive item type. Here are the two cases: If the item's type is set to "exclusive to a Pokemon", the parameter contains that Pokemon's National Pokedex number. If the item's type is set to "exclusive to a type", the parameter contains the ID of the type. (See monster.md's page for a list of values for each types.) External Resource Wonder Mail S Tools, research notes. The "items_p_Sky.xlsx" excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [1] Credits The WMS project, for their notes. [2] OgreGunner and nhahtdh for that huge thread on GameFaqs filled with tidbits of information! [3]
  22. The "/BALANCE/item_p.bin" file in Pokemon Mystery Dungeon Explorers of Sky/Time/Darkness contains data on every item in the game. Its a SIR0 wrapped file. Notes The item_p.bin file has a different structure in PMD:EoT/D than in PMD:EoS. Item entries in EoS are 16 bytes, while they're 24 bytes int EoT/D! In Explorers of Sky, there are 1,400 entries. In Explorers of Time/Darkness, there are 1,000 entries. File Structure (Explorers of Sky) Overview Offset Length Name Description 0x00 16 SIR0 Header A SIR0 header wrapping the item data. 0x10 (NbEntries * 16) Item Data A block containing entries for all items. After Item Data 3 SIR0 Pointer Offset List A list of encoded offsets to the pointers in the file. Since there are only the 2 pointers of the SIR0 header, those three bytes are always 0x04, 0x04, 0x00. After SIR0 Pointer Offset List 13 Padding Bytes Since all entries have a fixed size, and the SIR0 Pointer Offset List is 3 bytes long, 13 0xAA bytes are used as padding to align the end of the file on 16 bytes. Item Data The entries for each items are always 16 bytes long, and are organized this way: Item Entry (Total length 16 bytes) Offset Length Type Name Description 0x00 2 uint16 Buy Price Price to pay for the item when purchased from a shop. 0x02 2 uint16 Sell Price Price a shop will offer for the item. 0x04 1 uint8 Category Used for sorting items, and possibly to determine the way the item works. 0x05 1 uint8 SpriteID The sprite shown next to the item in the bag and on the ground. 0x06 2 uint16 ItemID The ID by which the game refers to this item ! 0x08 2 uint16 Item Parameter #1 See Item Parameter 0x0A 1 uint8 Item Parameter #2 Another parameter for items. Unknown role. 0x0B 1 uint8 Item Parameter #3 Another parameter for items. Unknown role. 0x0C 1 uint8 Unknown#1 Unknown. 0x0D 1 uint8 Unknown#2 Unknown. 0x0E 1 uint8 Unknown#3 Unknown. 0x0F 1 uint8 Unknown#4 Unknown, usually is 0. Category A list of the possible category value an item can have. This list is based on data compiled by nhahtdh into the item_p_sky.xlsx excel document, and then verified/confirmed on our end.(See links in the Credits section. ) ID Category 0x0 Projectile 0x1 Arc 0x2 Seed & Drink 0x3 Food & Gummi 0x4 Hold item 0x5 TM & HM 0x6 Poké 0x7 N/A 0x8 Evo. + Misc. 0x9 Orb 0xA Link Box 0xB Used TM 0xC Box 1 0xD Box 2 0xE Box 3 0xF Specific Items Item Parameter There are 3 parameters slots available for each items, their use depends on the item type. Parameter #1 (offset 0x08) If the item is an HM/TM, or an orb, this value is the move ID it refers to. Its also used the same way by some items, like orbs. Otherwise, with items of any other category, its role is unknown ! File Structure (Explorers of Time/Darkness) External Resources Wonder Mail S Tools, research notes. The "items_p_Sky.xlsx" excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [1] [Mirror] Credits The WMS project, for their notes. [2] OgreGunner and nhahtdh for that huge thread on GameFaqs filled with tidbits of information! [3]
  23. The "/BALANCE/m_level.bin" file in Pokemon Mystery Dungeon: Explorers of Sky/Time/Darkness contains level-up data for all the Pokemon in the game. Its a pack file containing one entry per Pokemon. The index/order of the entry for each Pokemon is identical to the order of the entries in the monster.md file, and that's how they're assigned. However, in Explorers of Sky, the m_level.bin file's number of entries was cut in half, removing most redundant entries.(see monster.md for more details on why its redundant ) Notes Explorers of Sky: Contains 571 entries. Explorers of Time/Darkness: Contains 1,192 entries. The stats the Pokemon has on level 1 are contained within its entry inside the monster.md file! Not in m_level.bin! What is in m_level.bin is merely added to those stats as the Pokemon grows in level. File Structure See the pack file page, for details on how the container is organized. This page will focus on the particularities of the content, not the container. Content Structure Each individual entry/sub-file is a PKDPX compressed container. Once decompressed, the data is simply 100, 12 bytes entries one after the other. Each of those entries contains the total experience required to reach this level, and the stats growth after the level has been reached. Level-Up Data List Here's the structure of the entire thing: Total length 1200 bytes Offset Length Type Name Description 0x00 12 FirstLvlEntry Entry for the first level. Its always completely null, since there are no previous levels, and thus, no level-up requirements. .. Rest of the levels entries here.. 0x4A4 12 LastLvlEntry The entry for level 100 ! Level-Up Data Entry Here's how a single entry for a single level is structured. Everything is little endian. Total length 12 bytes Offset Length Type Name Description 0x0 4 int32 ExpReq The total amount of experience required to reach that level. The value is absolute, not relative to the last level! 0x4 2 uint16 HP Increase The amount of HPs the Pokemon will gain when reaching this level. 0x6 1 uint8 Attack Increase The amount the attack of the Pokemon will increase when reaching this level. 0x7 1 uint8 Special Attack Increase The amount the special attack of the Pokemon will increase when reaching this level. 0x8 1 uint8 Defense Increase The amount the defense of the Pokemon will increase when reaching this level. 0x9 1 uint8 Special Defense Increase The amount the special defense of the Pokemon will increase when reaching this level. 0xA 2 uint16 Null 2 bytes of zeroes.
  24. The "monster.md" contained in the "/BALANCE" directory, contains data for every single unique entities in the game. Explorers of Sky's monster.md has a unique entity entry format. Entries in EoS are 68 bytes long, while in EoT/D they're 76 bytes long. Additionally, there is a "monster.mnd" file in EoT/D that appears to contain extra data related to entities in the "monster.md" file. File Structure Overview Offset Length Type Name Description 0x00 8 MonsterData Header A very short header for the MD format. 0x08 (NbEntries * 68) Entities Data Block A block containing entries for every entities in the game. MonsterData Header[edit] Offset Length Endianness Type Name Description 0x00 4 Magic Number The string "MD\0\0", { 0x4D, 0x44, 0x0, 0x0 }, or 0x4D440000. 0x04 4 NbEntries The amount of entries in the Entities Data Block. Entities Data Block Simply one entity's entry after another, no padding whatsoever. The file contains 1,155 entries. The Pokemon in the National Pokedex from 1 to 493 are represented in here. Entry #0 is a dummy entry. There are several reasons why the file contains 1,155 entries: Every Pokemon has a duplicate entry. One for each of its gender. Even genderless, or female/male-only species have 2 entries. Several entities are dummy placeholders, mainly copies of Arceus's data. Several entities are for special NPC characters in the game. The layout of the data is : Entries [0 to 600[ contains data for the default gender, usually male, genderless, or female. Entries [600 to 1,154] contains data for the secondary gender, either female, or invalid. The secondary entries that have their gender set to "invalid" usually are genderless or single gender specie. Move set data, level-up data, name string, category string, and a possibly a few others, are associated to the index in the "monster.md" file of the entries [0 to 600[. The only exception to this is the way pokemon faces are assigned. The kaomado.kao file contains 1,155. Which is one for every single entity entry in the "monster.md" file. This allows separate genders to have a different set of face portraits. Its used for several Pokemon that exhibit physical gender differences. A little more on kaomado.kao Species for which both gender are physically identical have a single set of portraits corresponding to the index of their primary gender entry in "monster.md", while the entry for their secondary gender are all null. The game probably falls back to the primary gender's entry when no portrait data is found for the secondary gender. Entity Entry (Explorers of Sky) Entry for a single entity follow this layout. Several things in here aren't 100% certain yet however. Entity Entry (Total length 68 bytes) Offset Length Type Name Description 0x00 2 uint16 EntityID A entity-unique ID to identify the entity in both of its 2 entries. (Independent from file index) 0x02 2 uint16 Unk#31 Unknown. Pokemon with the same category string have the same value in here. 0x04 2 uint16 NationalPokedexNb The national Pokedex number, as displayed in Chimecho's assembly. 0x06 2 uint16 Unk#1 Unknown, seems to be 0x1 for most pokemon ! ( smaller than 1 => Slowed down status, 1 = no status, bigger than 1 => Sped up status ) 0x08 2 uint16 PreEvoIndex The INDEX of the pre-evolution inside the "monster.md" file. Not the Pokedex number, or the Entity ID! Is 0 if none. 0x0A 2 uint16 EvolutionMethod The evolution method required to evolve to this Pokemon from the pre-evo specified in PreEvoIndex. Null if unused. 0x0C 2 uint16 EvoParam#1 The first parameter for the evolution method. Null if unused. 0x0E 2 uint16 EvoParam#2 The second parameter for the evolution method. Null if unused. 0x10 2 uint16 SpriteIndex The index of the Entity's sprite. Its the index inside the three Pokemon sprite files inside the "/MONSTER/" directory! 0x12 1 uint8 Gender Gender of this particular entity entry. (0 = Invalid, 1 = Male, 2 = Female, 3 = Genderless) 0x13 1 uint8 BodySize The body size of the Pokemon. Used when determining how many Pokemon fits in the party. 0x14 1 uint8 PrimaryType The Pokemon's primary type. 0x15 1 uint8 SecondaryType The Pokemon's secondary type. 0x16 1 uint8 MovementType This decides what terrains the entity can move over, and whether its hovering or not. 0x17 1 uint8 IQGroup The IQ group the Pokemon belongs to. 0x18 1 uint8 PrimaryAbility The Pokemon's primary ability's ID. 0x18 1 uint8 SecondaryAbility The Pokemon's secondary ability's ID. 0x1A 2 uint16 BitFlag1 Most likely used to store bitflags! Bit 4: 0 if the Pokémon can't move inside dungeons (used for some species like Cascoon) Bit 7: 1 if the Pokémon needs a special item to spawn 0x1C 2 uint16 ExpYield Possibly the Exp yield. 0x1E 2 int16 RecruitRate1 Possibly another recruit rate, this one is usually closer to 0 when RecruitRate1 and RecruitRate2 are different! 0x20 2 int16 BaseHp The HP the Pokemon has at lvl 1. 0x22 2 int16 RecruitRate2 Possibly recruit rate. 0x24 1 int8 BaseAtk The attack stat of the Pokemon at lvl 1. 0x25 1 int8 BaseSpAtk The special attack stat of the Pokemon at lvl 1. 0x26 1 int8 BaseDef The defense stat of the pokemon at lvl 1. 0x27 1 int8 BaseSpDef The base special defense of the pokemon at lvl 1. 0x28 2 int16 Weight Probably the weight tier for weight based damages. 0x2A 2 int16 Size Probably the size tier for size based damages. 0x2C 1 int8 Unk#17 Unknown. Most of the time 0xA. 0x2D 1 int8 Unk#18 Unknown. Most of the time 0xA. 0x2E 1 int8 Unk#19 Unknown. Value seems between. 0x2F 1 int8 Unk#20 Unknown. Most of the 0x8. 0x30 2 int16 Unk#21 Always 0x64. Possibly max level for the Pokemon ? 0x32 2 int16 BaseFormIndex Seems to match the index in the "monster.md" file of the Pokemon's first form's first entry.. Its always the index of the entry within the 0 to 600 range! Never the one between 600 and 1155 ! 0x34 2 int16 ExclusiveItem#1 The first 1-star exclusive item for this Pokemon. Null if NA. 0x36 2 int16 ExclusiveItem#2 The second 1-star exclusive item for this Pokemon. Null if NA. 0x38 2 int16 ExclusiveItem#3 The 2-star exclusive item for this Pokemon. Null if NA. 0x3A 2 int16 ExclusiveItem#4 The 3-star exclusive item for this Pokemon. Null if NA. 0x3C 2 int16 Unk#27 Unknown. Values so far : 0x2EE, 0x320. 0x3E 2 int16 Unk#28 Unknown. Often 0xF. 0x40 2 int16 Unk#29 Unknown. 0x42 2 int16 Unk#30 Unknown. Entity Entry (Explorers of Time/Darkness) Each monster.md entry in Explorers of Time/Darkness is 76 bytes long. Evolution Method WARNING: The following are based on observing the data for several Pokemon, and there is a possibility the role of each fields and value is not entirely accurate. Value Evolution Method Parameter#1 Use Parameter#2 Use 0x00 None - - 0x01 Level (uint16)Level required to evolve (uint16)Optional evolutionary item ID 0x02 IQ (uint16)IQ required (uint16)Optional evolutionary item ID 0x03 Item(s) (uint16)Regular Item ID (uint16)Optional evolutionary item ID 0x04 Unknown - - 0x05 Link Cable (uint16)Null (uint16)0x01 Evolutionary item ID are numbered from 1 to 7 apparently: ID Name 0x01 Link Cable 0x02 Unknown 0x03 Unknown 0x04 Unknown 0x05 Sun Ribbon 0x06 Lunar Ribbon 0x07 Beauty Scarf Type List Value Type 0x00 None 0x01 Normal 0x02 Fire 0x03 Water 0x04 Grass 0x05 Electric 0x06 Ice 0x07 Fighting 0x08 Poison 0x09 Ground 0x0A Flying 0x0B Psychic 0x0C Bug 0x0D Rock 0x0E Ghost 0x0F Dragon 0x10 Dark 0x11 Steel 0x12 Neutral Ability IDs List List of all the possible Pokemon abilities. Value Ability 0x1 Stench 0x2 Thick Fat 0x3 Rain Dish 0x4 Drizzle 0x5 Arena Trap 0x6 Intimidate 0x7 Rock Head 0x8 Air Lock 0x9 Hyper Cutter 0xA Shadow tag 0xB Speed Boost 0xC Battle Armor 0xD Sturdy 0xE Suction Cups 0xF Clear Body 0x10 Torrent 0x11 Guts 0x12 Rough Skin 0x13 Shell Armor 0x14 Natural Cure 0x15 Damp 0x16 Limber 0x17 Magnet Pull 0x18 White Smoke 0x19 Synchronize 0x1A Overgrow 0x1B Swift Swim 0x1C Sand Stream 0x1D Sand Veil 0x1E Keen Eye 0x1F Inner Focus 0x20 Static 0x21 Shed Skin 0x22 Huge Power 0x23 Volt Absorb 0x24 Water Absorb 0x25 Forecast 0x26 Serene Grace 0x27 Poison Point 0x28 Trace 0x29 Oblivious 0x2A Truant 0x2B Run Away 0x2C Sticky Hold 0x2D Cloud Nine 0x2E Illuminate 0x2F Early Bird 0x30 Hustle 0x31 Drought 0x32 LightningRod 0x33 CompoundEyes 0x34 Marvel Scale 0x35 Wonder Guard 0x36 Insomnia 0x37 Levitate 0x38 Plus 0x39 Pressure 0x3A Liquid Ooze 0x3B Color Change 0x3C Soundproof 0x3D Effect Spore 0x3E Flame Body 0x3F Minus 0x40 Own Tempo 0x41 Magma Armor 0x42 Water Veil 0x43 Swarm 0x44 Cute Charm 0x45 Immunity 0x46 Blaze 0x47 Pickup 0x48 Flash Fire 0x49 Vital Spirit 0x4A Chlorophyll 0x4B Pure Power 0x4C Shield Dust 0x4D Ice Body 0x4E Stall 0x4F Anger Point 0x50 Tinted Lens 0x51 Hydration 0x52 Frisk 0x53 Mold Breaker 0x54 Unburden 0x55 Dry Skin 0x56 Anticipation 0x57 Scrappy 0x58 Super Luck 0x59 Gluttony 0x5A Solar Power 0x5B Skill Link 0x5C Reckless 0x5D Sniper 0x5E Slow Start 0x5F Heatproof 0x60 Download 0x61 Simple 0x62 Tangled Feet 0x63 Adaptability 0x64 Technician 0x65 Iron Fist 0x66 Motor Drive 0x67 Unaware 0x68 Rivalry 0x69 Bad Dreams 0x6A No Guard 0x6B Normalize 0x6C Solid Rock 0x6D Quick Feet 0x6E Filter 0x6F Klutz 0x70 Stedfast 0x71 Flower Gift 0x72 Poision Heal 0x73 Magic Guard 0x74 $$$ 0x75 Honey Gather 0x76 Aftermath 0x77 Snow Cloak 0x78 Snow Warning 0x79 Forewarn 0x7A Storm Drain 0x7B Leaf Guard IQ Groups List Here are the possible values for a Pokemon's IQ group: Value IQ Group 0x0 A 0x1 B 0x2 C 0x3 D 0x4 E 0x5 F 0x6 G 0x7 H 0x8 Unused 0x9 Unused 0xA I 0xB J 0xC Unused 0xD Unused 0xE Unused 0xF Invalid Movement Types List Defines on what types of terrain the Pokemon can move on. All types above "Standard" also include the terrain Standard refers to. Value Movement Type 0x0 Standard 0x1 Unknown 0x2 Hovering 0x3 Unknown 0x4 Lava 0x5 Water More Details Credits Jellynater for the list of Pokemon abilities. TruePikachu for some of the details on the monster.md format! [1] The WMS project, for their notes. [2] OgreGunner and nhahtdh for that huge thread on GameFaqs filled with tidbits of information! [3] Kelvin Chung for the .grammar file containing much useful information on the PMD:RRT format, which share similarities with PMD2! [4]
×
×
  • Create New...