diff options
-rw-r--r-- | arm9/asm/pokemon_s.s | 378 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 122 | ||||
-rw-r--r-- | include/pokemon.h | 13 |
3 files changed, 135 insertions, 378 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s index 80eadfe8..320c6252 100644 --- a/arm9/asm/pokemon_s.s +++ b/arm9/asm/pokemon_s.s @@ -23,384 +23,6 @@ __local_str_poketool_personal_pms_narc: ; 0x02105FC8 .extern BoxMonIsShiny - thumb_func_start FUN_02068B68 -FUN_02068B68: ; 0x02068B68 - ldr r3, _02068B6C ; =FUN_02068B70 - bx r3 - .balign 4 -_02068B6C: .word FUN_02068B70 - - thumb_func_start FUN_02068B70 -FUN_02068B70: ; 0x02068B70 - push {r4-r7, lr} - sub sp, #0x1c - add r5, r1, #0x0 - str r0, [sp, #0xc] - add r0, r5, #0x0 - str r2, [sp, #0x10] - bl AcquireBoxMonLock - str r0, [sp, #0x18] - add r0, r5, #0x0 - mov r1, #0xad - mov r2, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x10 - lsr r4, r0, #0x10 - add r0, r5, #0x0 - bl GetBoxMonGender - str r0, [sp, #0x14] - add r0, r5, #0x0 - bl BoxMonIsShiny - mov r1, #0x0 - add r7, r0, #0x0 - add r0, r5, #0x0 - add r2, r1, #0x0 - bl GetBoxMonData - add r6, r0, #0x0 - ldr r0, _02068BF8 ; =SPECIES_EGG - cmp r4, r0 - bne _02068BCA - add r0, r5, #0x0 - mov r1, #0x5 - mov r2, #0x0 - bl GetBoxMonData - ldr r1, _02068BFC ; =SPECIES_MANAPHY - cmp r0, r1 - bne _02068BC6 - mov r0, #0x1 - b _02068BD8 -_02068BC6: - mov r0, #0x0 - b _02068BD8 -_02068BCA: - add r0, r5, #0x0 - mov r1, #0x70 - mov r2, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 -_02068BD8: - str r7, [sp, #0x0] - str r0, [sp, #0x4] - str r6, [sp, #0x8] - ldr r0, [sp, #0xc] - ldr r2, [sp, #0x14] - ldr r3, [sp, #0x10] - add r1, r4, #0x0 - bl FUN_02068C00 - ldr r1, [sp, #0x18] - add r0, r5, #0x0 - bl ReleaseBoxMonLock - add sp, #0x1c - pop {r4-r7, pc} - nop -_02068BF8: .word SPECIES_EGG -_02068BFC: .word SPECIES_MANAPHY - - thumb_func_start FUN_02068C00 -FUN_02068C00: ; 0x02068C00 - push {r4-r7} - add r7, r2, #0x0 - add r5, r3, #0x0 - add r4, r0, #0x0 - add r0, r1, #0x0 - ldr r3, [sp, #0x10] - ldr r2, [sp, #0x14] - mov r1, #0x0 - strh r1, [r4, #0x6] - strb r1, [r4, #0x8] - str r1, [r4, #0xc] - ldr r1, _02068E0C ; =SPECIES_CHERRIM - cmp r0, r1 - bgt _02068C68 - bge _02068D1E - add r6, r1, #0x0 - sub r6, #SPECIES_CHERRIM-SPECIES_CASTFORM - cmp r0, r6 - bgt _02068C36 - sub r1, #SPECIES_CHERRIM-SPECIES_CASTFORM - cmp r0, r1 - blt _02068C2E - b _02068D58 -_02068C2E: - cmp r0, #SPECIES_UNOWN - bne _02068C34 - b _02068D90 -_02068C34: - b _02068DD4 -_02068C36: - add r6, r1, #0x0 - sub r6, #SPECIES_CHERRIM-SPECIES_DEOXYS - cmp r0, r6 - bgt _02068C48 - sub r1, #SPECIES_CHERRIM-SPECIES_DEOXYS - cmp r0, r1 - bne _02068C46 - b _02068D76 -_02068C46: - b _02068DD4 -_02068C48: - add r6, r1, #0x0 - sub r6, #SPECIES_CHERRIM-SPECIES_WORMADAM - cmp r0, r6 - bgt _02068C66 - add r6, r1, #0x0 - sub r6, #SPECIES_CHERRIM-SPECIES_BURMY - cmp r0, r6 - blt _02068C66 - add r6, r1, #0x0 - sub r6, #SPECIES_CHERRIM-SPECIES_BURMY - cmp r0, r6 - beq _02068CAA - sub r1, #SPECIES_CHERRIM-SPECIES_WORMADAM - cmp r0, r1 - beq _02068CC8 -_02068C66: - b _02068DD4 -_02068C68: - add r6, r1, #0x0 - add r6, #SPECIES_ARCEUS-SPECIES_CHERRIM - cmp r0, r6 - bgt _02068C8E - add r6, r1, #0x0 - add r6, #SPECIES_ARCEUS-SPECIES_CHERRIM - cmp r0, r6 - bge _02068D3A - add r6, r1, #SPECIES_GASTRODON-SPECIES_CHERRIM - cmp r0, r6 - bgt _02068C8C - add r6, r1, #SPECIES_SHELLOS-SPECIES_CHERRIM - cmp r0, r6 - blt _02068C8C - beq _02068CE6 - add r1, r1, #SPECIES_GASTRODON-SPECIES_CHERRIM - cmp r0, r1 - beq _02068D02 -_02068C8C: - b _02068DD4 -_02068C8E: - add r6, r1, #0x0 - add r6, #SPECIES_EGG-SPECIES_CHERRIM - cmp r0, r6 - bgt _02068CA0 - add r1, #SPECIES_EGG-SPECIES_CHERRIM - cmp r0, r1 - bne _02068C9E - b _02068DAC -_02068C9E: - b _02068DD4 -_02068CA0: - add r1, #SPECIES_MANAPHY_EGG-SPECIES_CHERRIM - cmp r0, r1 - bne _02068CA8 - b _02068DC4 -_02068CA8: - b _02068DD4 -_02068CAA: - cmp r2, #0x2 - bls _02068CB0 - mov r2, #0x0 -_02068CB0: - mov r0, #0x75 - strh r0, [r4, #0x0] - lsr r0, r5, #0x1 - lsl r1, r2, #0x1 - add r0, #0x48 - add r0, r0, r1 - add r3, #0x92 - strh r0, [r4, #0x2] - add r0, r3, r1 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068CC8: - cmp r2, #0x2 - bls _02068CCE - mov r2, #0x0 -_02068CCE: - mov r0, #0x75 - strh r0, [r4, #0x0] - lsr r0, r5, #0x1 - lsl r1, r2, #0x1 - add r0, #0x4e - add r0, r0, r1 - add r3, #0x98 - strh r0, [r4, #0x2] - add r0, r3, r1 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068CE6: - cmp r2, #0x1 - bls _02068CEC - mov r2, #0x0 -_02068CEC: - mov r0, #0x75 - add r5, #0x54 - strh r0, [r4, #0x0] - add r0, r5, r2 - strh r0, [r4, #0x2] - add r3, #0x9e - lsl r0, r2, #0x1 - add r0, r3, r0 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D02: - cmp r2, #0x1 - bls _02068D08 - mov r2, #0x0 -_02068D08: - mov r0, #0x75 - add r5, #0x58 - strh r0, [r4, #0x0] - add r0, r5, r2 - strh r0, [r4, #0x2] - add r3, #0xa2 - lsl r0, r2, #0x1 - add r0, r3, r0 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D1E: - cmp r2, #0x1 - bls _02068D24 - mov r2, #0x0 -_02068D24: - mov r0, #0x75 - add r5, #0x5c - strh r0, [r4, #0x0] - add r0, r5, r2 - strh r0, [r4, #0x2] - lsl r0, r3, #0x1 - add r0, #0xa6 - add r0, r2, r0 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D3A: - cmp r2, #0x11 - bls _02068D40 - mov r2, #0x0 -_02068D40: - mov r0, #0x75 - strh r0, [r4, #0x0] - lsr r0, r5, #0x1 - lsl r1, r2, #0x1 - add r0, #0x60 - add r0, r0, r1 - add r3, #0xaa - strh r0, [r4, #0x2] - add r0, r3, r1 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D58: - cmp r2, #0x3 - bls _02068D5E - mov r2, #0x0 -_02068D5E: - mov r0, #0x75 - strh r0, [r4, #0x0] - lsl r0, r5, #0x1 - add r0, #0x40 - add r0, r2, r0 - strh r0, [r4, #0x2] - lsl r0, r3, #0x2 - add r0, #0x8a - add r0, r2, r0 - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D76: - cmp r2, #0x3 - bls _02068D7C - mov r2, #0x0 -_02068D7C: - mov r0, #0x75 - strh r0, [r4, #0x0] - lsr r1, r5, #0x1 - lsl r0, r2, #0x1 - add r0, r1, r0 - strh r0, [r4, #0x2] - add r3, #0x86 - strh r3, [r4, #0x4] - pop {r4-r7} - bx lr -_02068D90: - cmp r2, #0x1c - blo _02068D96 - mov r2, #0x0 -_02068D96: - mov r0, #0x75 - lsr r1, r5, #0x1 - strh r0, [r4, #0x0] - add r1, #0x8 - lsl r0, r2, #0x1 - add r0, r1, r0 - strh r0, [r4, #0x2] - add r3, #0x88 - strh r3, [r4, #0x4] - pop {r4-r7} - bx lr -_02068DAC: - cmp r2, #0x1 - bls _02068DB2 - mov r2, #0x0 -_02068DB2: - mov r0, #0x75 - strh r0, [r4, #0x0] - add r0, r2, #0x0 - add r0, #0x84 - strh r0, [r4, #0x2] - add r2, #0xce - strh r2, [r4, #0x4] - pop {r4-r7} - bx lr -_02068DC4: - mov r0, #0x75 - strh r0, [r4, #0x0] - mov r0, #0x84 - strh r0, [r4, #0x2] - mov r0, #0xce - strh r0, [r4, #0x4] - pop {r4-r7} - bx lr -_02068DD4: - mov r1, #0x4 - strh r1, [r4, #0x0] - cmp r7, #0x1 - beq _02068DE0 - mov r2, #0x1 - b _02068DE2 -_02068DE0: - mov r2, #0x0 -_02068DE2: - mov r1, #0x6 - mul r1, r0 - add r6, r5, r1 - add r2, r6, r2 - add r1, r1, #0x4 - strh r2, [r4, #0x2] - add r1, r3, r1 - strh r1, [r4, #0x4] - ldr r1, _02068E10 ; =SPECIES_SPINDA - cmp r0, r1 - bne _02068E06 - cmp r5, #0x2 - bne _02068E06 - strh r1, [r4, #0x6] - mov r0, #0x0 - strb r0, [r4, #0x8] - ldr r0, [sp, #0x18] - str r0, [r4, #0xc] -_02068E06: - pop {r4-r7} - bx lr - nop -_02068E0C: .word SPECIES_CHERRIM -_02068E10: .word SPECIES_SPINDA - thumb_func_start FUN_02068E14 FUN_02068E14: ; 0x02068E14 ldr r3, _02068E18 ; =FUN_02068E1C diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index c253c709..5ecfb39b 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -2144,3 +2144,125 @@ u32 GenerateShinyPersonality(u32 otid) } return (u32)((r5 << 16) | r6); } + +void FUN_02068B68(struct SomeDrawPokemonStruct * spC, struct Pokemon * pokemon, u8 sp10) +{ + FUN_02068B70(spC, &pokemon->box, sp10); +} + +void FUN_02068B70(struct SomeDrawPokemonStruct * spC, struct BoxPokemon * boxmon, u8 sp10) +{ + BOOL decry = AcquireBoxMonLock(boxmon); + u16 species = GetBoxMonData(boxmon, MON_DATA_SPECIES2, NULL); + u8 gender = GetBoxMonGender(boxmon); + u8 shiny = BoxMonIsShiny(boxmon); + u32 personality = GetBoxMonData(boxmon, MON_DATA_PERSONALITY, NULL); + u8 forme; + if (species == SPECIES_EGG) + { + if (GetBoxMonData(boxmon, MON_DATA_SPECIES, NULL) == SPECIES_MANAPHY) + forme = 1; + else + forme = 0; + } + else + forme = GetBoxMonData(boxmon, MON_DATA_FORME, NULL); + FUN_02068C00(spC, species, gender, sp10, shiny, forme, personality); + ReleaseBoxMonLock(boxmon, decry); +} + +void FUN_02068C00(struct SomeDrawPokemonStruct * spC, int species, u8 gender, u8 sp10, u8 shiny, u8 forme, u32 personality) +{ + spC->unk6 = 0; + spC->unk8 = 0; + spC->unkC = 0; + switch (species) + { + case SPECIES_BURMY: + if (forme > 2) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 / 2 + 0x48 + forme * 2; + spC->unk4 = shiny + 0x92 + forme * 2; + break; + case SPECIES_WORMADAM: + if (forme > 2) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 / 2 + 0x4E + forme * 2; + spC->unk4 = shiny + 0x98 + forme * 2; + break; + case SPECIES_SHELLOS: + if (forme > 1) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 + 0x54 + forme; + spC->unk4 = shiny + 0x9E + forme * 2; + break; + case SPECIES_GASTRODON: + if (forme > 1) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 + 0x58 + forme; + spC->unk4 = shiny + 0xA2 + forme * 2; + break; + case SPECIES_CHERRIM: + if (forme > 1) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 + 0x5C + forme; + spC->unk4 = shiny * 2 + 0xA6 + forme; + break; + case SPECIES_ARCEUS: + if (forme > 17) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 / 2 + 0x60 + forme * 2; + spC->unk4 = shiny + 0xAA + forme * 2; + break; + case SPECIES_CASTFORM: + if (forme > 3) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 * 2 + 0x40 + forme; + spC->unk4 = shiny * 4 + 0x8A + forme; + break; + case SPECIES_DEOXYS: + if (forme > 3) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 / 2 + forme * 2; + spC->unk4 = shiny + 0x86; + break; + case SPECIES_UNOWN: + if (forme >= 28) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = sp10 / 2 + 0x8 + forme * 2; + spC->unk4 = shiny + 0x88; + break; + case SPECIES_EGG: + if (forme > 1) + forme = 0; + spC->unk0 = 0x75; + spC->unk2 = 0x84 + forme; + spC->unk4 = 0xCE + forme; + break; + case SPECIES_MANAPHY_EGG: + spC->unk0 = 0x75; + spC->unk2 = 0x84; + spC->unk4 = 0xCE; + break; + default: + spC->unk0 = 0x4; + spC->unk2 = species * 6 + sp10 + (gender == MON_FEMALE ? 0 : 1); + spC->unk4 = shiny + (species * 6 + 4); + if (species == SPECIES_SPINDA && sp10 == 2) + { + spC->unk6 = SPECIES_SPINDA; + spC->unk8 = 0; + spC->unkC = personality; + } + break; + } +} diff --git a/include/pokemon.h b/include/pokemon.h index 6d2c8cf7..7c358370 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -467,6 +467,17 @@ struct Pokemon { /* 0x088 */ struct PartyPokemon party; }; // size: 0xEC +struct SomeDrawPokemonStruct +{ + u16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + u8 unk8; + u8 filler_9[3]; + u32 unkC; +}; + void ZeroMonData(struct Pokemon * pokemon); void ZeroBoxMonData(struct BoxPokemon * boxmon); u32 SizeOfStructPokemon(void); @@ -517,5 +528,7 @@ u8 GetBoxMonGender(struct BoxPokemon * boxmon); u8 GetGenderBySpeciesAndPersonality(u16 species, u32 pid); u8 MonIsShiny(struct Pokemon * pokemon); u32 GenerateShinyPersonality(u32 otid); +void FUN_02068B70(struct SomeDrawPokemonStruct * spC, struct BoxPokemon * boxmon, u8 sp10); +void FUN_02068C00(struct SomeDrawPokemonStruct * spC, int species, u8 gender, u8 sp10, u8 shiny, u8 forme, u32 personality); #endif //POKEDIAMOND_POKEMON_H |