Jump to content

Pokemon Super Mystery Dungeon And PMD:GTI Research And Utilities


Recommended Posts

so about the IMG files, for the header you can refer to Megadrifter's thread about it. i haven't figured out the ETC1 format yet, though there's a specification and implementation, i couldn't get it to work (yet... or maybe i'll just implement it myself). for RGB8 and RGBA8888, the pixel data are stored in little-endian (BGR/BGRA) and stored bottom-row first. (so if you'd unscramble the image and output it straight to BMP format you'd have no problems)

the pixels are arranged this way, in blocks of 8x8. the blocks are then arranged left-to-right, bottom-to-top:

1YgCd7d.png

hopefully this helps visualizing it, done in 3 steps (which is basically taking blocks of 2n x n pixels, stack them on each other, for n = 1,2,4)

9UtPBPb.png

this is what it looks like with three steps separated:

raw pixel data

Nsh4SoX.png

first unscrambling

2yxVt4F.png

second unscrambling

N3PiqW6.png

third unscrambling, finished

62RtOvv.png

this also applies to portrait pictures, which i suppose Andibad has already done. the portrait pictures has japanese text below them describing the emotion of the portrait.

here's the source code to convert IMG <-> PNG: https://dl.dropboxusercontent.com/u/40407085/Stuff/imgconv.cpp

you need lodepng.h and lodepng.cpp to compile that.

and the compiled version with source code is here: https://dl.dropboxusercontent.com/u/40407085/Stuff/imgconv.zip

right now the tool can only convert RGB8 and RGBA8888 though.

also: all portraits in the data (but i deleted redundant ones): https://mega.nz/#!5EBBDT7B!jSV9Y0mnoOWfyvBzpy2Me4gaNrxmGlHnisxj7yUxRJs

Edited by Silverhawke
Link to comment
Share on other sites

On my end, I can confirm that the starter menu is hard-coded. And the starter moves are most likely too.

I can't find the literals for all starters for some reasons however, I changed the 7 I could find, and it only changed the 3d model of 7 of the starters, their stats and even the actual pokemon you get to play after the character select screen stays the same..

Here's what you see:

[ATTACH=CONFIG]12804[/ATTACH]

And what's displayed on the bottom screen:

[ATTACH=CONFIG]12805[/ATTACH]

Afterward it gave me the starter I was supposed to get, and not poochyena.

For those interested, the 7 starters IDs I found and changed are located at 0x004F 1618 in the code.bin. There seems to be some ldr opcodes that refers to those literals a bit above. I was able to find them using radare2.

But I really wonder where the rest of them are ? :/

They're probably not stored as 4 bytes integers if they're in there..

Also, here are the starter pokemon IDs for those interested. (Its one of those big ugly if/else if statement in the scripts):

 if pokemonIndexHero == 30 then
   CH("PIKACHUU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 595 then
   CH("POKABU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 598 then
   CH("MIJUMARU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 592 then
   CH("TSUTAAJA_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 1 then
   CH("FUSHIGIDANE_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 5 then
   CH("HITOKAGE_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 10 then
   CH("ZENIGAME_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 197 then
   CH("CHIKORIITA_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 200 then
   CH("HINOARASHI_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 203 then
   CH("WANINOKO_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 322 then
   CH("KIMORI_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 325 then
   CH("ACHAMO_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 329 then
   CH("MIZUGOROU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 479 then
   CH("NAETORU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 482 then
   CH("HIKOZARU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 485 then
   CH("POTCHAMA_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 537 then
   CH("RIORU_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 766 then
   CH("HARIMARON_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 769 then
   CH("FOKKO_H"):ResetFacialMotion()
 elseif pokemonIndexHero == 772 then
   CH("KEROMATSU_H"):ResetFacialMotion()
end

332 is poochyena btw for those wondering xD

Link to comment
Share on other sites

i made mistake on parsing sir0 message on my tools xD, my bad. here for fix one. this build also can extract cte image with support most pixel format, little bit tweak on extension renaming and add some example message code on msg_code.json.

and i notice GYU0 file is an compressed format, need poking exefs maybe i get something >.>

EDIT : uploaded project on github done : https://github.com/andibadra/unFARC

Edited by Andibad
Link to comment
Share on other sites

i just wondering how to get face graphic offset on the game, so far on lua script folder is only defined pokemon id like this one :

function Dungeon_OnTalkedFuupa(tokihanatareta)
 if tokihanatareta == 0 then
   WINDOW:DrawFaceFromPokemonIndex(20, 88, 926, false, FACE_TYPE.NORMAL)
 else
   WINDOW:DrawFaceFromPokemonIndex(20, 88, 927, false, FACE_TYPE.NORMAL)
 end

or call actor function ... to get pokemon id. hoppa id in there is 926 (pokemon id list). and also is have 16 (+16 special expression, not all pokemon have this) kind of expression face ... here for list of them :

NORMAL
HAPPY
PAIN
ANGRY
THINK
SAD
WEEP
SHOUT
TEARS
DECIDE
GLADNESS
EMOTION
SURPRISE
FAINT
RELEIF
CATCHBREATH
SPECIAL01~16

special expression is have number on it like this one : 3807.png

on FARC type 0x5, when not mark as has filename, filenameoffset field used as unique id? <.<, and also on sir0 message (on smd, not debug), unknown value is used as unique id? >.> since on lua script file is have negative id for calling an dialog text ...

EDIT:

I was think SMD use zlib compression on gyu files and save files, i will check it later.

Edited by Andibad
Link to comment
Share on other sites

well they couldn't make it more literal. that if condition is literally "if not unbound then". so 926 is Hoopa Confined and 927 is Hoopa Unbound.

i talked with psy_commando and we agree that the negative id in the lua script was supposed to be some hex number, which was interpreted as a signed number. it should make more sense when converted back to (dword?) hexadecimal.

on the other hand, i updated my pokemon_data_info.bin notes: https://dl.dropboxusercontent.com/u/40407085/Stuff/pkmn_data_info_notes.txt

as well as data parsed from that bin files as far as i know: https://dl.dropboxusercontent.com/u/40407085/Stuff/pkmn_data.txt

we can change a bunch of things in here already :P

Link to comment
Share on other sites

So, I've been digging in the executable for a while now, but I just can't find the pokemon IDs used in the starter selection screen..

I have no ideas why there are 7 of the 20 starters that have their model ID as literal in the bin, but none of the others do.. It also seems the game refers to a lot of data loaded at runtime at static memory addresses. There are a lot of fairly big 32bits pointers stored in the literal pools, and they don't point to sensible locations in the code bin most of the time..

So they have to point to places in memory..

But the only way to figure that would be with an emulator or debugger... At least AFAIK. Unless someone has some suggestion ? ^^;

i just wondering how to get face graphic offset on the game, so far on lua script folder is only defined pokemon id like this one :

function Dungeon_OnTalkedFuupa(tokihanatareta)
 if tokihanatareta == 0 then
   WINDOW:DrawFaceFromPokemonIndex(20, 88, 926, false, FACE_TYPE.NORMAL)
 else
   WINDOW:DrawFaceFromPokemonIndex(20, 88, 927, false, FACE_TYPE.NORMAL)
 end

or call actor function ... to get pokemon id. hoppa id in there is 926 (pokemon id list). and also is have 16 (+16 special expression, not all pokemon have this) kind of expression face ... here for list of them :

NORMAL
HAPPY
PAIN
ANGRY
THINK
SAD
WEEP
SHOUT
TEARS
DECIDE
GLADNESS
EMOTION
SURPRISE
FAINT
RELEIF
CATCHBREATH
SPECIAL01~16

special expression is have number on it like this one : 3807.png

If the faces are grouped by pokemons in the face_graphic.bin file, its probably structured like the kaomado.kao files in EoS. Basically, the ID of the actor would the index in the face_graphic.bin file, if we consider that each entry is 16 to 32 portraits long. I don't know if the amount of portraits for each pokes is specified in the table of content though. I didn't really investigate that file much yet. But in EoS, the table of content was just a table made of entries containing 40 pointers, null pointers indicating missing portraits.

on FARC type 0x5, when not mark as has filename, filenameoffset field used as unique id? <.<, and also on sir0 message (on smd, not debug), unknown value is used as unique id? >.> since on lua script file is have negative id for calling an dialog text ...

i talked with psy_commando and we agree that the negative id in the lua script was supposed to be some hex number, which was interpreted as a signed number. it should make more sense when converted back to (dword?) hexadecimal.

Yeah, the decompiler interprets the string UUID as signed 32 bits integers. But originally they were probably just an hexadecimal literal. Or maybe even some kind of macro that got replaced by their buildscript.

The decompiler doesn't seem to have an option to set how to interpret literals, but it might be possible to write a simple script to convert large decimal signed value to an hexadecimal string, and just mass replace them.

But, I'm thinking that the devs didn't just place those hex strings by themselves, Some kind of automated reference handling system probably did the work for them.

on the other hand, i updated my pokemon_data_info.bin notes: https://dl.dropboxusercontent.com/u/40407085/Stuff/pkmn_data_info_notes.txt

as well as data parsed from that bin files as far as i know: https://dl.dropboxusercontent.com/u/40407085/Stuff/pkmn_data.txt

we can change a bunch of things in here already :P

Btw, have you noticed that in all files ending in "_info.bin" there is a short 64 bytes table after the last entry ? I really wonder what its for, and how the game figures out its not just another entry..

Also, have you looked at pokemon_evolution.bin ? It seems to contain a lot of extra data on pokemmon evolutions and megas.

Link to comment
Share on other sites

Btw, have you noticed that in all files ending in "_info.bin" there is a short 64 bytes table after the last entry ? I really wonder what its for, and how the game figures out its not just another entry..

Also, have you looked at pokemon_evolution.bin ? It seems to contain a lot of extra data on pokemmon evolutions and megas.

i didn't notice that! well, i noticed that it's a thing in pokemon_data_info.bin but i didn't know it's a thing in other _info files. i haven't really looked into it, and if it exists in all other _info.bin files, i guess the game already knew beforehand that the last 64 bytes are for something...

i haven't looked at that! i didn't see it because it's not in the pokemon folder, oops xD

Link to comment
Share on other sites

well they couldn't make it more literal. that if condition is literally "if not unbound then". so 926 is Hoopa Confined and 927 is Hoopa Unbound.

i talked with psy_commando and we agree that the negative id in the lua script was supposed to be some hex number, which was interpreted as a signed number. it should make more sense when converted back to (dword?) hexadecimal.

i was think is an unique id (on integer value or on hexadecimal value). look this hoopa dialog on dungeon script :

function Dungeon_OnTalkedFuupa(tokihanatareta)
...
 if DUNGEON_MENU:IsFuupaLegendSummoned() then
   WINDOW:Talk_Fuupa(1157317309)
 else
   WINDOW:Talk_Fuupa(1576943368)
   WINDOW:SelectChain(1227155743, 2)
   WINDOW:SelectChain(-2106081020, 0)
   WINDOW:DefaultCursor(1)
   ret = WINDOW:SelectEndTalk(MENU_SELECT_MODE.ENABLE_CANCEL)
...
 end
end

see on WINDOW:Talk_Fuupa(1157317309), 1157317309 is refer to message unique id (u1). and i got this message :

SNAG_0019.png

Link to comment
Share on other sites

i didn't notice that! well, i noticed that it's a thing in pokemon_data_info.bin but i didn't know it's a thing in other _info files. i haven't really looked into it, and if it exists in all other _info.bin files, i guess the game already knew beforehand that the last 64 bytes are for something...

i haven't looked at that! i didn't see it because it's not in the pokemon folder, oops xD

Honestly, I hope the game doesn't assume hardcoded offsets in those files.. It would make things much more difficult ^^;

And its really not much, but I've been going through files and trying to decipher as much as possible then moved to other files, and I got this:

[font=Fixedsys]
====================================
 pokemon_evolution.bin
====================================

Offset      Name                    Size            Type            Description
----------  ----                    ----            ----            -----------
0x00        Sir0Header              16              -               The standard SIR0 header.
[]
0x10        EvoDataTbl              vary            -               
[
   PkmnEvoData                     12              -               
   [

   ]
   ...
]
PtrEvoInfoTbl                       vary            -               
[
   Entry                           12              -               
   [
       PtrEvoData                  4               uint32          A pointer to a structure containing detail on the evolution of the pokemon stored in the EvoDataTbl.
       unk1                        4               uint32          
       unk2                        4               uint16          
       unk3                        4               uint16          
   ]
   ...
]
Subheader                           16                              Contain a pointer to the data, and the nb of entries.
[
   PtrEvoInfoTbl                   4               uint32          A pointer to the PtrEvoInfoTbl.
   NbEntriesEvoInfTbl              4               uint32          The nb of entries in the PtrEvoInfoTbl table.
   ZeroPadding                     8               -               Null bytes.  
]
SIR0EncodedPtrOffsetTbl
[]
[/font]

I noticed a lot of other little things, but I didn't write those down yet because I still got to validate stuff.

i was think is an unique id (on integer value or on hexadecimal value). look this hoopa dialog on dungeon script :

function Dungeon_OnTalkedFuupa(tokihanatareta)
...
 if DUNGEON_MENU:IsFuupaLegendSummoned() then
   WINDOW:Talk_Fuupa(1157317309)
 else
   WINDOW:Talk_Fuupa(1576943368)
   WINDOW:SelectChain(1227155743, 2)
   WINDOW:SelectChain(-2106081020, 0)
   WINDOW:DefaultCursor(1)
   ret = WINDOW:SelectEndTalk(MENU_SELECT_MODE.ENABLE_CANCEL)
...
 end
end

see on WINDOW:Talk_Fuupa(1157317309), 1157317309 is refer to message unique id (u1). and i got this message :

SNAG_0019.png

That's what we're saying. Its just that it got decompiled as a large signed integer instead of an hex string for some reasons. Its been like that since GTI.

Link to comment
Share on other sites

Move data (on SMD) stored on waza_data_info.bin (act index information) and act_data_info.bin (move information). You can see move list on SMD here (include unused, named xl move, unnamed combination move and unnamed xl moves).

waza_data_info.bin

Containing index for move data (act_data_info.bin) and effect (act_effect_data_info.bin), 18 byte/entry.

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]offset (0x)

[/TD]

[TD=align: center]size (byte)[/TD]

[TD=align: center]comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x0[/TD]

[TD]2[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x2[/TD]

[TD]2[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x4[/TD]

[TD]2[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x6[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x7[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x8[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x9[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0xA[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0xB[/TD]

[TD]1[/TD]

[TD]constant 0x0*[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0xC[/TD]

[TD]2[/TD]

[TD]act_data_info index (uint)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0xE[/TD]

[TD]1[/TD]

[TD]?[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0xF[/TD]

[TD]1[/TD]

[TD]?[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x10[/TD]

[TD]1[/TD]

[TD]constant 0x1[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x11[/TD]

[TD]1[/TD]

[TD]constant 0x64[/TD]

[TD][/TD]

[/TR]

[/TABLE]

* only on Dragon Rage not 0x0

act_data_info.bin

Containing move data. 160 byte/entry

Section (start from 0x0 until 0x0f)

*unknown

Primary Effect Moves (start from 0x10 until 0x27)

0x10 ~ 0x23 - ???
0x24 - 2 byte - (num)(uint) Type effectiveness (even is immune 0x or not effective 0.5/0.25x to make them damage 1x)
0x26 - 2 byte - (0x00) unused

Secondary Effect Moves (start from 0x28 until 0x57)

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]Offset (0x0)

[/TD]

[TD=align: center]Size (Byte)

[/TD]

[TD=align: center]Comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x28[/TD]

[TD]2[/TD]

[TD]Effect Rate Value (0 - no effect, 1~100)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x2A[/TD]

[TD]2[/TD]

[TD]HP/Belly Change's Value[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x2C[/TD]

[TD]2[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x2E[/TD]

[TD]2[/TD]

[TD]Trap Flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x30[/TD]

[TD]2[/TD]

[TD]Status Change's (sleep, confused, poisoned, etc)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x32[/TD]

[TD]2[/TD]

[TD]Stat Change's (index)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x34[/TD]

[TD]2[/TD]

[TD]Type Change's (0 - no effect, 1 - normal, 19 - NoType)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x36[/TD]

[TD]2[/TD]

[TD]Terrain Change's[/TD]

[TD]uint[/TD]

[/TR]

[/TABLE]

*it will repeated until 0x57 (3 Effect)

Status List :

0    None
1    nightmare
2    sleepless
3    sleep
4    yawning
5    napping
6    
7    burn
8    poisoned
9    badly poisoned
10    paralysis
11    frozen
12    stuck
13    Ingrain
14    petrified
15    bound
16    Fire Spin
17    Sand Tomb
18    Clamp
19    Whirlpool
20    Magma Storm
21    Infestation
22    flinch
23    truant
24    confused
25    recoil
26    lethargic
27    infatuated
28    taunted
29    encore
30    discord
31    Bide
32    Solar Beam
33    Focus Punch
34    flying
35    bouncing
36    digging
37    Future Sight
38    Sky Drop
39    Suspended
40    charging
41    enraged
42    Round
43    Razor Wind
44    Sky Attack
45    Skull Bash
46    Doom Desire
47    Dive
48    Shadow Force
49    Phantom Force
50    Ice Burn
51    Freeze Shock
52    Geomancy
53    Reflect
54    Safeguard
55    Light Screen
56    Counter
57    protect
58    Quick Guard
59    Wide Guard
60    Mat Block
61    Crafty Shield
62    King's Shield
63    Spiky Shield
64    Mirror Coat
65    enduring
66    mist
67    healthy
68    Aqua Ring
69    Lucky Chant
70    Metal Burst
71    Magic Coat
72    Snatch
73    cursed
74    substitute
75    decoy
76    Gastro Acid
77    Heal Block
78    embargo
79    Leech Seed
80    Destiny Bond
81    Sure Shot
82    Focus Energy
83    encouraged
84    pierce
85    blinker
86    Eyedrops
87    mobile
88    trained
89    stockpiling
90    radar
91    scanning
92    grudge
93    exposed
94    Miracle Eye
95    terrified
96    grounded
97    Magnet Rise
98    telekinesis
99    autotomize
100    sealed
101    Perish Song
102    wish
103    transform
104    electrify
105    powder
106    puppet
107    awakened
108    berserk
109    
110    self-destruct
111    explosion
112    
113    
114    
115    
116    
117    
118    
119    
120    
121    
122    
123    
124    
125    
126    
127    
128    fainted
129    
130    
131    
132    
133    
134    
135    
136    
137    
138    
139    
140    
141    
142    
143    
144    
145    
146    
147    
148    
149    
150    
151    
152    
153    
154    
155    
156    
157    
158    
159     
160    rainbow
161    swamp
162    sea of fire

Terrain List :

0    None
1    Clear
2    Sunny
3    Rain
4    Hail
5    Sandstorm
6    Mud Sport
7    Water Sport
8    Defused
9    Thief Alert
10    Trick Room
11    Magic Room
12    Monster House
13    Shop
14    Nullified
15    Luminous
16     
17    heavy rain
18    harsh sunlight
19    strong winds
20    ineffective weather
21    gravity
22    Wonder Room
23    Ion Deluge
24    Grassy Terrain
25    Misty Terrain
26    Electric Terrain
27    Happy Hour
28    apathetic
29    Enemy Discord
30    disabled

Accurate Section (start from 0x57 until 0x5b)

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]Offset (0x0)

[/TD]

[TD=align: center]Size (Byte)

[/TD]

[TD=align: center]Comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x58[/TD]

[TD]1[/TD]

[TD]Base Accurate Value (0~100, 101 : sure shoot)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x5A[/TD]

[TD]1[/TD]

[TD]Maximum Accurate Value (0~100, 101 : sure shoot)[/TD]

[TD]uint[/TD]

[/TR]

[/TABLE]

Section (start from 0x5c until 0x7b)

*is seems related to accurate related like critical, etc, is have 4 group

Move Damage, PP, Range, Counter Section (start from 0x7c until 0x93)

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]Offset (0x0)

[/TD]

[TD=align: center]Size (Byte)

[/TD]

[TD=align: center]Comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x7C[/TD]

[TD]1[/TD]

[TD]Size Type Move (size of pokemon or move combination)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x7D[/TD]

[TD]1[/TD]

[TD]Type Move (1 - normal, 19 - NoType)[/TD]

[TD]uint

[/TD]

[/TR]

[TR]

[TD]0x7E[/TD]

[TD]1[/TD]

[TD]Attribute[/TD]

[TD]uint

[/TD]

[/TR]

[TR]

[TD]0x7F[/TD]

[TD]1[/TD]

[TD]Damage / ATK Base Value[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x80[/TD]

[TD]1[/TD]

[TD]? Damage Max

[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x81[/TD]

[TD]1[/TD]

[TD]PP Base Value

[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x82[/TD]

[TD]1[/TD]

[TD]? PP Max

[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x83[/TD]

[TD]1[/TD]

[TD]Constant 0xFF[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x84[/TD]

[TD]1[/TD]

[TD]Cut Corner Flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x85[/TD]

[TD]1[/TD]

[TD]more time to attack Flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x86[/TD]

[TD]1[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x87[/TD]

[TD]1[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x88[/TD]

[TD]1[/TD]

[TD]Tiles Count[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x89[/TD]

[TD]1[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x8A[/TD]

[TD]1[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x8B[/TD]

[TD]1[/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x8C[/TD]

[TD]1[/TD]

[TD]Range[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x8D[/TD]

[TD]1[/TD]

[TD]Target[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x8E[/TD]

[TD]1[/TD]

[TD]Piercing ATK flag[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x8F[/TD]

[TD]1[/TD]

[TD]Sleep ATK flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x90[/TD]

[TD]1[/TD]

[TD]Faint ATK flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x91[/TD]

[TD]1[/TD]

[TD]Constant 0x1[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x92[/TD]

[TD]1[/TD]

[TD]Nearby damage flag[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x93[/TD]

[TD]1[/TD]

[TD]Hit Counter Index (act_hit_count_table_data_info.bin)[/TD]

[TD]uint[/TD]

[/TR]

[/TABLE]

Section (start from 0x94 until 0x9f)

*unknown

act_xlwaza.bin

Containing id for xl moves. for move data, see on act_data_info.bin. 8 byte/entry.

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]Offset (0x0)

[/TD]

[TD=align: center]Size (Byte)

[/TD]

[TD=align: center]Comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x0[/TD]

[TD]2[/TD]

[TD]Move Action Index[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x2[/TD]

[TD]2[/TD]

[TD]Move Action Index Taget[/TD]

[TD]uint[/TD]

[/TR]

[/TABLE]

act_hit_count_table_data_info.bin

Data for hit counter for act_data_info.bin (0x93). 16 byte/entry.

[TABLE=class: grid, width: 600]

[TR]

[TD=align: center]Offset (0x0)

[/TD]

[TD=align: center]Size (Byte)

[/TD]

[TD=align: center]Comment

[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD]0x0[/TD]

[TD]1[/TD]

[TD]Repeat until move miss to target (bool, 1 for true, 0 for false)[/TD]

[TD]bool[/TD]

[/TR]

[TR]

[TD]0x1[/TD]

[TD]1[/TD]

[TD]hit count minimum (min 2)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x2[/TD]

[TD]1[/TD]

[TD]hit count maximum (max 5, min 2, if same it will count as 1 hit)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x3[/TD]

[TD]1[/TD]

[TD]constant 0x0[/TD]

[TD][/TD]

[/TR]

[TR]

[TD]0x4[/TD]

[TD]2[/TD]

[TD]2 hit chance rate (min 0, max 100)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x6[/TD]

[TD]2[/TD]

[TD]3 hit chance rate (min 0, max 100)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0x8[/TD]

[TD]2[/TD]

[TD]4 hit chance rate (min 0, max 100)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0xA[/TD]

[TD]2[/TD]

[TD]5 hit chance rate (min 0, max 100)[/TD]

[TD]uint[/TD]

[/TR]

[TR]

[TD]0xC[/TD]

[TD]4[/TD]

[TD]constant 0x0[/TD]

[TD][/TD]

[/TR]

[/TABLE]

act_param_data_info.bin

only have 1 byte/entry, i think is store single value. maybe used on act_data_info.bin

act_effect_data_info.bin

have 68 byte/entry. i was thing is related to animation.

Edited by Andibad
Link to comment
Share on other sites

Happy holidays !

I've been working on a thing :D

0NIaMrV.png

I finally got the UI to work without freezing the game, and actually displaying properly!

The initial movesets and abilities being wrong, and the crashing on some cutscenes (When forcing the game to use the HERO/PARTNER actors in cutscenes) hasn't been addressed yet though. But once its done, this should work pretty well xD

I noticed that not all pokemon that aren't the official starters had their initial moveset set to piplup's. And it seems like, official starters picked through my modification still get assigned the correct moveset. So it might mean that we might be able to affect what moveset and abilities are assigned somehow.

For example:

- Poochyena gets piplup's moveset + ability.

- Mightyena gets piplup's moveset + ability.

- Squirtle gets its own moveset + ability.

- Eevee gets Oshawott's moveset + ability.

Link to comment
Share on other sites

Hello, I currently coding my own pokemon mystery dungeon engine and I would love to know what the base power constants for all the moves are? Is that info available now? (I'm assuming they aren't the same as the mainline games)

PMD never worked like main series game for stats. That's pretty much a big part of what makes it interesting xD I can't imagine dealing with dungeons as a starter with base 300 stats or something against an army of high level fully evolved pokes D:

And, just scroll back up a few post until you reach Andibad's post. They're stored in act_data_info.bin apparently.

I'm guessing someone on gamefaq might have made a list with those values. But otherwise, you'll probably have to make a list yourself. Unless you use PMD2 stats. There are already excel sheets and etc filled with this kind of stuff floating around the web.

Link to comment
Share on other sites

PMD never worked like main series game for stats. That's pretty much a big part of what makes it interesting xD I can't imagine dealing with dungeons as a starter with base 300 stats or something against an army of high level fully evolved pokes D:

And, just scroll back up a few post until you reach Andibad's post. They're stored in act_data_info.bin apparently.

I'm guessing someone on gamefaq might have made a list with those values. But otherwise, you'll probably have to make a list yourself. Unless you use PMD2 stats. There are already excel sheets and etc filled with this kind of stuff floating around the web.

Alright, thanks, Decided to go with skies move base power, currently making a huge LUT for all the moves, its gonna take a while...

vyUr6yc.png

Link to comment
Share on other sites

Alright, thanks, Decided to go with skies move base power, currently making a huge LUT for all the moves, its gonna take a while...

you can see my post on this page, i already update with my current note ...(is almost done on most view-able data). right now i still looking for break wall flag and primary effect on it >.>

Link to comment
Share on other sites

Alright, thanks, Decided to go with skies move base power, currently making a huge LUT for all the moves, its gonna take a while...

vyUr6yc.png

I don't mean to tell you how to do your job, but you probably really don't want to store data in your code like that ^^;

You should put that in some config/data files outside your executable. It will make maintenance and improvements a thousand time easier, not to mention it allows for easier modding too. And you won't need to recompile each times you change something.

XML/JSON are really good and well supported by a ton of libraries around, and they're great at storing data, you can zip them too if they get too big. And XML is great for mass search and replace operations, thanks to its predictable tag layout. It might be worth it looking into those? Just some thoughts ^^;

Link to comment
Share on other sites

I don't mean to tell you how to do your job, but you probably really don't want to store data in your code like that ^^;

You should put that in some config/data files outside your executable. It will make maintenance and improvements a thousand time easier, not to mention it allows for easier modding too. And you won't need to recompile each times you change something.

XML/JSON are really good and well supported by a ton of libraries around, and they're great at storing data, you can zip them too if they get too big. And XML is great for mass search and replace operations, thanks to its predictable tag layout. It might be worth it looking into those? Just some thoughts ^^;

Thanks for the advice, I might do that later down the road, but for now I'm coding this project entirely in C, plus with a look up table it makes it quite efficient in terms performance.

Link to comment
Share on other sites

Thanks for the advice, I might do that later down the road, but for now I'm coding this project entirely in C, plus with a look up table it makes it quite efficient in terms performance.

In some cases maintainability is more important than performance. Even the original games had a data file that's read on demand.

But regardless how you do it, good luck!

Link to comment
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...