diff options
Diffstat (limited to 'src/pokemon_3.c')
-rw-r--r-- | src/pokemon_3.c | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/src/pokemon_3.c b/src/pokemon_3.c index fd03834..62e60d8 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -1,4 +1,5 @@ #include "global.h" +#include "pokemon.h" extern u32 gIQSkillNames[]; extern u32 gIQSkillDescriptions[]; @@ -10,9 +11,269 @@ extern s16 gUnknown_810A378[]; extern s32 gUnknown_810A390[]; extern u32 gUnknown_81076E4[]; +struct unkStruct_808E9EC +{ + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u8 unk10; + u8 unk11; + u8 unk12; + u8 unk13; +}; + +extern s16 gUnknown_810AC60; // 0xC +extern s16 gUnknown_810AC62; // 0xC +extern s16 gUnknown_810AC68; // 0x8 +extern s16 gUnknown_810AC64; // 0x8 +extern s16 gUnknown_810AC66; // 0x8 + extern bool8 sub_808ECD0(u8 *, u32); extern void sub_808EC30(u8 *, u32); +s32 GetUnownIndex(s16 index) +{ + if(index == SPECIES_UNOWN_B) + return 1; + if(index == SPECIES_UNOWN_C) + return 2; + if(index == SPECIES_UNOWN_D) + return 3; + if(index == SPECIES_UNOWN_E) + return 4; + if(index == SPECIES_UNOWN_F) + return 5; + if(index == SPECIES_UNOWN_G) + return 6; + if(index == SPECIES_UNOWN_H) + return 7; + if(index == SPECIES_UNOWN_I) + return 8; + if(index == SPECIES_UNOWN_J) + return 9; + if(index == SPECIES_UNOWN_K) + return 10; + if(index == SPECIES_UNOWN_L) + return 11; + if(index == SPECIES_UNOWN_M) + return 12; + if(index == SPECIES_UNOWN_N) + return 13; + if(index == SPECIES_UNOWN_O) + return 14; + if(index == SPECIES_UNOWN_P) + return 15; + if(index == SPECIES_UNOWN_Q) + return 16; + if(index == SPECIES_UNOWN_R) + return 17; + if(index == SPECIES_UNOWN_S) + return 18; + if(index == SPECIES_UNOWN_T) + return 19; + if(index == SPECIES_UNOWN_U) + return 20; + if(index == SPECIES_UNOWN_V) + return 21; + if(index == SPECIES_UNOWN_W) + return 22; + if(index == SPECIES_UNOWN_X) + return 23; + if(index == SPECIES_UNOWN_Y) + return 24; + if(index == SPECIES_UNOWN_Z) + return 25; + if(index == SPECIES_UNOWN_EMARK) + return 26; + if(index == SPECIES_UNOWN_QMARK) + return 27; + return 0; +} + +u32 sub_808E9B8(struct PokemonStruct *r0) +{ + return r0->unk0 & 0x000001ff; +} + +void sub_808E9C4(struct PokemonStruct *r0, s16 r1) +{ + s32 r1_s32 = r1; // cast needed to match + r0->unk0 = ((0xFE << 8) & r0->unk0) | r1_s32 ; +} + +void sub_808E9D8(struct PokemonStruct *r0, s32 r1, s16 r2) +{ + s32 r2_32 = r2; // dumb cast to match + r0->unk0 = r2_32 | (r1 << 9) ; +} + +u32 sub_808E9E4(struct PokemonStruct *r0) +{ + return (r0->unk0 >> 9); +} + +// Unused +#ifdef NONMATCHING +void sub_808E9EC(struct PokemonStruct *r0, struct unkStruct_808E9EC *r1) +{ + u8 pokeAtt; + u8 r4; + u32 reg1_8; + s16 reg1; + + pokeAtt = r0->pokeAtt; + + r1->unk0 = pokeAtt; + r1->unk4 = r0->pokeSPAtt; + r1->unk8 = r0->pokeDef; + r1->unkC = r0->pokeSPDef; + r1->unk10 = 0; + r1->unk11 = 0; + r1->unk12 = 0; + r1->unk13 = 0; + if(r0->unk28 != 0) + { + r4 = r0->unk28; + if(r4 == 0x13) + { + r1->unk10 = gUnknown_810AC60; + r1->unk0 = pokeAtt + gUnknown_810AC60; + } + if(r4 == 0x21) + { + r1->unk11 += gUnknown_810AC62; + r1->unk4 += gUnknown_810AC62; + } + if(r4 == 0x2B) + { + // TODO: regs get a little f**ked + reg1_8 = (u8)gUnknown_810AC68; + r1->unk10 += reg1_8; + r1->unk11 += reg1_8; + + reg1 = gUnknown_810AC68; + r1->unk0 += reg1; + r1->unk4 += reg1; + } + if(r4 == 0x1E) + { + r1->unk12 += gUnknown_810AC64; + r1->unk8 += gUnknown_810AC64; + } + if(r4 == 0x22) + { + r1->unk13 += gUnknown_810AC66; + r1->unkC += gUnknown_810AC66; + } + } +} +#else +NAKED +void sub_808E9EC(struct PokemonStruct *r0, struct unkStruct_808E9EC *r1) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r3, r1, 0\n" + "\tldrb r2, [r0, 0x18]\n" + "\tstr r2, [r3]\n" + "\tldrb r1, [r0, 0x19]\n" + "\tstr r1, [r3, 0x4]\n" + "\tldrb r1, [r0, 0x1A]\n" + "\tstr r1, [r3, 0x8]\n" + "\tldrb r1, [r0, 0x1B]\n" + "\tstr r1, [r3, 0xC]\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r3, 0x10]\n" + "\tstrb r1, [r3, 0x11]\n" + "\tstrb r1, [r3, 0x12]\n" + "\tstrb r1, [r3, 0x13]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x28\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0\n" + "\tbeq _0808EA96\n" + "\tadds r4, r0, 0\n" + "\tadds r5, r4, 0\n" + "\tcmp r4, 0x13\n" + "\tbne _0808EA2A\n" + "\tldr r1, _0808EA9C\n" + "\tldrh r0, [r1]\n" + "\tstrb r0, [r3, 0x10]\n" + "\tmovs r6, 0\n" + "\tldrsh r0, [r1, r6]\n" + "\tadds r0, r2, r0\n" + "\tstr r0, [r3]\n" +"_0808EA2A:\n" + "\tcmp r4, 0x21\n" + "\tbne _0808EA42\n" + "\tldr r1, _0808EAA0\n" + "\tldrb r0, [r1]\n" + "\tldrb r2, [r3, 0x11]\n" + "\tadds r0, r2\n" + "\tstrb r0, [r3, 0x11]\n" + "\tmovs r6, 0\n" + "\tldrsh r1, [r1, r6]\n" + "\tldr r0, [r3, 0x4]\n" + "\tadds r0, r1\n" + "\tstr r0, [r3, 0x4]\n" +"_0808EA42:\n" + "\tcmp r4, 0x2B\n" + "\tbne _0808EA66\n" + "\tldr r2, _0808EAA4\n" + "\tldrb r0, [r2]\n" + "\tldrb r6, [r3, 0x10]\n" + "\tadds r1, r0, r6\n" + "\tstrb r1, [r3, 0x10]\n" + "\tldrb r1, [r3, 0x11]\n" + "\tadds r0, r1\n" + "\tstrb r0, [r3, 0x11]\n" + "\tmovs r6, 0\n" + "\tldrsh r1, [r2, r6]\n" + "\tldr r0, [r3]\n" + "\tadds r0, r1\n" + "\tstr r0, [r3]\n" + "\tldr r0, [r3, 0x4]\n" + "\tadds r0, r1\n" + "\tstr r0, [r3, 0x4]\n" +"_0808EA66:\n" + "\tcmp r4, 0x1E\n" + "\tbne _0808EA7E\n" + "\tldr r1, _0808EAA8\n" + "\tldrb r0, [r1]\n" + "\tldrb r2, [r3, 0x12]\n" + "\tadds r0, r2\n" + "\tstrb r0, [r3, 0x12]\n" + "\tmovs r6, 0\n" + "\tldrsh r1, [r1, r6]\n" + "\tldr r0, [r3, 0x8]\n" + "\tadds r0, r1\n" + "\tstr r0, [r3, 0x8]\n" +"_0808EA7E:\n" + "\tcmp r5, 0x22\n" + "\tbne _0808EA96\n" + "\tldr r1, _0808EAAC\n" + "\tldrb r0, [r1]\n" + "\tldrb r2, [r3, 0x13]\n" + "\tadds r0, r2\n" + "\tstrb r0, [r3, 0x13]\n" + "\tmovs r6, 0\n" + "\tldrsh r1, [r1, r6]\n" + "\tldr r0, [r3, 0xC]\n" + "\tadds r0, r1\n" + "\tstr r0, [r3, 0xC]\n" +"_0808EA96:\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0808EA9C: .4byte gUnknown_810AC60\n" +"_0808EAA0: .4byte gUnknown_810AC62\n" +"_0808EAA4: .4byte gUnknown_810AC68\n" +"_0808EAA8: .4byte gUnknown_810AC64\n" +"_0808EAAC: .4byte gUnknown_810AC66"); +} +#endif + u32 GetIQSkillName(u8 r0) { return gIQSkillNames[r0]; |