diff options
-rw-r--r-- | arm9/arm9.lcf | 2 | ||||
-rw-r--r-- | arm9/arm9.lsf | 2 | ||||
-rw-r--r-- | arm9/asm/party.s (renamed from arm9/asm/unk_0206B8A4.s) | 4 | ||||
-rw-r--r-- | arm9/asm/pokemon_s.s | 528 | ||||
-rw-r--r-- | arm9/asm/scrcmd.s | 2 | ||||
-rw-r--r-- | arm9/asm/unk_02011744.s | 4 | ||||
-rw-r--r-- | arm9/asm/unk_0204AB0C.s | 4 | ||||
-rw-r--r-- | arm9/asm/unk_0205EC84.s | 10 | ||||
-rw-r--r-- | arm9/global.inc | 4 | ||||
-rw-r--r-- | arm9/modules/05/asm/module_05.s | 2 | ||||
-rw-r--r-- | arm9/modules/14/asm/module_14.s | 2 | ||||
-rw-r--r-- | arm9/modules/71/asm/module_71.s | 4 | ||||
-rw-r--r-- | arm9/modules/80/asm/module_80.s | 2 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 248 | ||||
-rw-r--r-- | include/pokemon.h | 47 | ||||
-rw-r--r-- | include/proto.h | 5 |
16 files changed, 323 insertions, 547 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index d4544ed6..ddccf15b 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -367,7 +367,7 @@ SECTIONS { unk_0206ABC4.o (.text) unk_0206B16C.o (.text) unk_0206B688.o (.text) - unk_0206B8A4.o (.text) + party.o (.text) unk_0206BB28.o (.text) unk_0206BB5C.o (.text) unk_0206BF90.o (.text) diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index dfb38bb4..261c41d5 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -246,7 +246,7 @@ Static arm9 Object unk_0206ABC4.o Object unk_0206B16C.o Object unk_0206B688.o - Object unk_0206B8A4.o + Object party.o Object unk_0206BB28.o Object unk_0206BB5C.o Object unk_0206BF90.o diff --git a/arm9/asm/unk_0206B8A4.s b/arm9/asm/party.s index aa6b8a28..12a63f73 100644 --- a/arm9/asm/unk_0206B8A4.s +++ b/arm9/asm/party.s @@ -325,8 +325,8 @@ _0206BAD8: pop {r3-r4} bx lr - thumb_func_start FUN_0206BAE4 -FUN_0206BAE4: ; 0x0206BAE4 + thumb_func_start PartyHasMon +PartyHasMon: ; 0x0206BAE4 push {r3-r7, lr} add r6, r0, #0x0 ldr r0, [r6, #0x4] diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s index 706b19f4..b0657999 100644 --- a/arm9/asm/pokemon_s.s +++ b/arm9/asm/pokemon_s.s @@ -23,530 +23,6 @@ __local_str_poketool_personal_pms_narc: ; 0x02105FC8 .extern BoxMonIsShiny - thumb_func_start GetMonEvolution -GetMonEvolution: ; 0x02069168 - push {r4-r7, lr} - sub sp, #0x44 - add r7, r1, #0x0 - str r0, [sp, #0x0] - mov r6, #0x0 - add r4, r2, #0x0 - add r0, r7, #0x0 - mov r1, #0x5 - add r2, r6, #0x0 - str r3, [sp, #0x4] - ldr r5, [sp, #0x58] - bl GetMonData - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - str r0, [sp, #0x2c] - add r0, r7, #0x0 - mov r1, #0x6 - add r2, r6, #0x0 - bl GetMonData - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - add r1, r6, #0x0 - str r0, [sp, #0x28] - add r0, r7, #0x0 - add r2, r1, #0x0 - bl GetMonData - str r0, [sp, #0x30] - add r0, r7, #0x0 - mov r1, #0x14 - add r2, r6, #0x0 - bl GetMonData - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - str r0, [sp, #0x10] - ldr r1, _020694A0 ; =0xFFFF0000 - ldr r0, [sp, #0x30] - add r2, r6, #0x0 - and r0, r1 - lsr r0, r0, #0x10 - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - str r0, [sp, #0x1c] - ldr r0, [sp, #0x28] - mov r1, #0x1 - bl FUN_0206E7B8 - lsl r0, r0, #0x18 - lsr r1, r0, #0x18 - ldr r0, [sp, #0x2c] - cmp r0, #0x40 - beq _020691E4 - cmp r1, #0x3f - bne _020691E4 - cmp r4, #0x3 - beq _020691E4 - add sp, #0x44 - add r0, r6, #0x0 - pop {r4-r7, pc} -_020691E4: - cmp r5, #0x0 - bne _020691EA - add r5, sp, #0x40 -_020691EA: - mov r0, #0x0 - mov r1, #0x2a - bl AllocFromHeap - str r0, [sp, #0x18] - ldr r0, [sp, #0x2c] - ldr r1, [sp, #0x18] - bl LoadMonEvolutionTable - cmp r4, #0x3 - bls _02069202 - b _0206954A -_02069202: - add r0, r4, r4 - add r0, pc - ldrh r0, [r0, #0x6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_0206920E: ; jump table (using 16-bit offset) - .short _02069216 - _0206920E - 2; case 0 - .short _02069486 - _0206920E - 2; case 1 - .short _020694BE - _0206920E - 2; case 2 - .short _020694BE - _0206920E - 2; case 3 -_02069216: - add r0, r7, #0x0 - mov r1, #0xa0 - mov r2, #0x0 - bl GetMonData - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - str r0, [sp, #0x14] - add r0, r7, #0x0 - mov r1, #0x9 - mov r2, #0x0 - bl GetMonData - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - str r0, [sp, #0x20] - mov r0, #0x0 - str r0, [sp, #0x24] - ldr r0, [sp, #0x1c] - mov r1, #0xa - ldr r4, [sp, #0x18] - bl _s32_div_f - str r1, [sp, #0x8] -_02069246: - ldrh r0, [r4, #0x0] - cmp r0, #0x1a - bls _0206924E - b _02069472 -_0206924E: - add r1, r0, r0 - add r1, pc - ldrh r1, [r1, #0x6] - lsl r1, r1, #0x10 - asr r1, r1, #0x10 - add pc, r1 -_0206925A: ; jump table (using 16-bit offset) - .short _02069472 - _0206925A - 2; case 0 - .short _02069290 - _0206925A - 2; case 1 - .short _0206929E - _0206925A - 2; case 2 - .short _020692B4 - _0206925A - 2; case 3 - .short _020692CA - _0206925A - 2; case 4 - .short _02069472 - _0206925A - 2; case 5 - .short _02069472 - _0206925A - 2; case 6 - .short _02069472 - _0206925A - 2; case 7 - .short _020692DA - _0206925A - 2; case 8 - .short _02069306 - _0206925A - 2; case 9 - .short _02069332 - _0206925A - 2; case 10 - .short _0206935E - _0206925A - 2; case 11 - .short _02069376 - _0206925A - 2; case 12 - .short _0206938C - _0206925A - 2; case 13 - .short _0206939C - _0206925A - 2; case 14 - .short _020693A2 - _0206925A - 2; case 15 - .short _02069472 - _0206925A - 2; case 16 - .short _02069472 - _0206925A - 2; case 17 - .short _020693B2 - _0206925A - 2; case 18 - .short _020693CA - _0206925A - 2; case 19 - .short _020693E2 - _0206925A - 2; case 20 - .short _020693F6 - _0206925A - 2; case 21 - .short _0206940E - _0206925A - 2; case 22 - .short _0206942C - _0206925A - 2; case 23 - .short _0206944A - _0206925A - 2; case 24 - .short _02069458 - _0206925A - 2; case 25 - .short _02069466 - _0206925A - 2; case 26 -_02069290: - ldr r0, [sp, #0x20] - cmp r0, #0xdc - blo _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x1 - str r0, [r5, #0x0] - b _02069472 -_0206929E: - bl FUN_0201277C - cmp r0, #0x0 - bne _0206936C - ldr r0, [sp, #0x20] - cmp r0, #0xdc - blo _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x2 - str r0, [r5, #0x0] - b _02069472 -_020692B4: - bl FUN_0201277C - cmp r0, #0x1 - bne _0206936C - ldr r0, [sp, #0x20] - cmp r0, #0xdc - blo _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x3 - str r0, [r5, #0x0] - b _02069472 -_020692CA: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x4 - str r0, [r5, #0x0] - b _02069472 -_020692DA: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _0206936C - add r0, r7, #0x0 - mov r1, #0xa4 - mov r2, #0x0 - bl GetMonData - str r0, [sp, #0x34] - add r0, r7, #0x0 - mov r1, #0xa5 - mov r2, #0x0 - bl GetMonData - ldr r1, [sp, #0x34] - cmp r1, r0 - bls _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x8 - str r0, [r5, #0x0] - b _02069472 -_02069306: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _0206936C - add r0, r7, #0x0 - mov r1, #0xa4 - mov r2, #0x0 - bl GetMonData - str r0, [sp, #0x38] - add r0, r7, #0x0 - mov r1, #0xa5 - mov r2, #0x0 - bl GetMonData - ldr r1, [sp, #0x38] - cmp r1, r0 - bne _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0x9 - str r0, [r5, #0x0] - b _02069472 -_02069332: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _0206936C - add r0, r7, #0x0 - mov r1, #0xa4 - mov r2, #0x0 - bl GetMonData - str r0, [sp, #0x3c] - add r0, r7, #0x0 - mov r1, #0xa5 - mov r2, #0x0 - bl GetMonData - ldr r1, [sp, #0x3c] - cmp r1, r0 - bhs _0206936C - ldrh r6, [r4, #0x4] - mov r0, #0xa - str r0, [r5, #0x0] - b _02069472 -_0206935E: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _0206936C - ldr r0, [sp, #0x8] - cmp r0, #0x5 - blt _0206936E -_0206936C: - b _02069472 -_0206936E: - ldrh r6, [r4, #0x4] - mov r0, #0xb - str r0, [r5, #0x0] - b _02069472 -_02069376: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _02069472 - ldr r0, [sp, #0x8] - cmp r0, #0x5 - blt _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0xc - str r0, [r5, #0x0] - b _02069472 -_0206938C: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0xd - str r0, [r5, #0x0] - b _02069472 -_0206939C: - mov r0, #0xe - str r0, [r5, #0x0] - b _02069472 -_020693A2: - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x10] - cmp r1, r0 - bgt _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0xf - str r0, [r5, #0x0] - b _02069472 -_020693B2: - bl FUN_0201277C - cmp r0, #0x0 - bne _02069472 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x28] - cmp r0, r1 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x12 - str r0, [r5, #0x0] - b _02069472 -_020693CA: - bl FUN_0201277C - cmp r0, #0x1 - bne _02069472 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x28] - cmp r0, r1 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x13 - str r0, [r5, #0x0] - b _02069472 -_020693E2: - ldrh r1, [r4, #0x2] - add r0, r7, #0x0 - bl FUN_02069A38 - cmp r0, #0x1 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x14 - str r0, [r5, #0x0] - b _02069472 -_020693F6: - ldr r0, [sp, #0x0] - cmp r0, #0x0 - beq _02069472 - ldrh r1, [r4, #0x2] - bl FUN_0206BAE4 - cmp r0, #0x1 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x15 - str r0, [r5, #0x0] - b _02069472 -_0206940E: - add r0, r7, #0x0 - mov r1, #0x6f - mov r2, #0x0 - bl GetMonData - cmp r0, #0x0 - bne _02069472 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x16 - str r0, [r5, #0x0] - b _02069472 -_0206942C: - add r0, r7, #0x0 - mov r1, #0x6f - mov r2, #0x0 - bl GetMonData - cmp r0, #0x1 - bne _02069472 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x14] - cmp r1, r0 - bgt _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x17 - str r0, [r5, #0x0] - b _02069472 -_0206944A: - ldr r1, [sp, #0x4] - cmp r1, r0 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x18 - str r0, [r5, #0x0] - b _02069472 -_02069458: - ldr r1, [sp, #0x4] - cmp r1, r0 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x19 - str r0, [r5, #0x0] - b _02069472 -_02069466: - ldr r1, [sp, #0x4] - cmp r1, r0 - bne _02069472 - ldrh r6, [r4, #0x4] - mov r0, #0x1a - str r0, [r5, #0x0] -_02069472: - cmp r6, #0x0 - bne _0206954A - ldr r0, [sp, #0x24] - add r4, r4, #0x6 - add r0, r0, #0x1 - str r0, [sp, #0x24] - cmp r0, #0x7 - bge _02069484 - b _02069246 -_02069484: - b _0206954A -_02069486: - ldr r3, [sp, #0x18] - mov r4, #0x0 - mov r7, #0x6 - mov r2, #0x5 -_0206948E: - ldrh r0, [r3, #0x0] - cmp r0, #0x5 - beq _0206949A - cmp r0, #0x6 - beq _020694A4 - b _020694B0 -_0206949A: - ldrh r6, [r3, #0x4] - str r2, [r5, #0x0] - b _020694B0 - .balign 4 -_020694A0: .word 0xFFFF0000 -_020694A4: - ldrh r1, [r3, #0x2] - ldr r0, [sp, #0x28] - cmp r0, r1 - bne _020694B0 - ldrh r6, [r3, #0x4] - str r7, [r5, #0x0] -_020694B0: - cmp r6, #0x0 - bne _0206954A - add r4, r4, #0x1 - add r3, r3, #0x6 - cmp r4, #0x7 - blt _0206948E - b _0206954A -_020694BE: - mov r0, #0x0 - ldr r4, [sp, #0x18] - str r0, [sp, #0xc] -_020694C4: - ldrh r2, [r4, #0x0] - cmp r2, #0x7 - bne _020694E4 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x4] - cmp r0, r1 - bne _020694E4 - ldr r0, [sp, #0xc] - mov r1, #0x6 - mul r1, r0 - ldr r0, [sp, #0x18] - add r0, r0, r1 - ldrh r6, [r0, #0x4] - mov r0, #0x0 - str r0, [r5, #0x0] - b _0206954A -_020694E4: - cmp r2, #0x10 - bne _02069510 - add r0, r7, #0x0 - mov r1, #0x6f - mov r2, #0x0 - bl GetMonData - cmp r0, #0x0 - bne _02069510 - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x4] - cmp r0, r1 - bne _02069510 - ldr r0, [sp, #0xc] - mov r1, #0x6 - mul r1, r0 - ldr r0, [sp, #0x18] - add r0, r0, r1 - ldrh r6, [r0, #0x4] - mov r0, #0x0 - str r0, [r5, #0x0] - b _0206954A -_02069510: - ldrh r0, [r4, #0x0] - cmp r0, #0x11 - bne _0206953E - add r0, r7, #0x0 - mov r1, #0x6f - mov r2, #0x0 - bl GetMonData - cmp r0, #0x1 - bne _0206953E - ldrh r1, [r4, #0x2] - ldr r0, [sp, #0x4] - cmp r0, r1 - bne _0206953E - ldr r0, [sp, #0xc] - mov r1, #0x6 - mul r1, r0 - ldr r0, [sp, #0x18] - add r0, r0, r1 - ldrh r6, [r0, #0x4] - mov r0, #0x0 - str r0, [r5, #0x0] - b _0206954A -_0206953E: - ldr r0, [sp, #0xc] - add r4, r4, #0x6 - add r0, r0, #0x1 - str r0, [sp, #0xc] - cmp r0, #0x7 - blt _020694C4 -_0206954A: - ldr r0, [sp, #0x18] - bl FreeToHeap - add r0, r6, #0x0 - add sp, #0x44 - pop {r4-r7, pc} - .balign 4 - thumb_func_start ReadFromPersonalPmsNarc ReadFromPersonalPmsNarc: ; 0x02069558 push {r3-r4, lr} @@ -1158,8 +634,8 @@ _02069A0A: bl SetMonData pop {r3-r7, pc} - thumb_func_start FUN_02069A38 -FUN_02069A38: ; 0x02069A38 + thumb_func_start MonHasMove +MonHasMove: ; 0x02069A38 push {r3-r7, lr} mov r4, #0x0 add r6, r0, #0x0 diff --git a/arm9/asm/scrcmd.s b/arm9/asm/scrcmd.s index aee5d3ff..8594afe7 100644 --- a/arm9/asm/scrcmd.s +++ b/arm9/asm/scrcmd.s @@ -10679,7 +10679,7 @@ FUN_0203EE98: ; 0x0203EE98 ldr r0, [r0, #0xc] bl FUN_0206BB1C add r1, r6, #0x0 - bl FUN_0206BAE4 + bl PartyHasMon strh r0, [r4, #0x0] mov r0, #0x1 pop {r4-r6, pc} diff --git a/arm9/asm/unk_02011744.s b/arm9/asm/unk_02011744.s index 4c1cb051..c8fec74e 100644 --- a/arm9/asm/unk_02011744.s +++ b/arm9/asm/unk_02011744.s @@ -2285,8 +2285,8 @@ _02012752: .balign 4 _02012778: .word UNK_020ED4B2 - thumb_func_start FUN_0201277C -FUN_0201277C: ; 0x0201277C + thumb_func_start IsNighttime +IsNighttime: ; 0x0201277C push {r3, lr} bl FUN_02012794 cmp r0, #0x3 diff --git a/arm9/asm/unk_0204AB0C.s b/arm9/asm/unk_0204AB0C.s index 0de63e29..f078e422 100644 --- a/arm9/asm/unk_0204AB0C.s +++ b/arm9/asm/unk_0204AB0C.s @@ -117,7 +117,7 @@ FUN_0204ABA8: ; 0x0204ABA8 push {r4-r6, lr} add r5, r0, #0x0 add r4, r1, #0x0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0204ABBE add r0, r4, #0x0 @@ -334,7 +334,7 @@ _0204AD40: .word UNK_020F471A FUN_0204AD44: ; 0x0204AD44 push {r4, lr} add r4, r0, #0x0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0204AD58 add r0, r4, #0x0 diff --git a/arm9/asm/unk_0205EC84.s b/arm9/asm/unk_0205EC84.s index 25427134..93afcc59 100644 --- a/arm9/asm/unk_0205EC84.s +++ b/arm9/asm/unk_0205EC84.s @@ -541,7 +541,7 @@ _0205F036: bl FUN_0205EC94 cmp r0, #0x1 bne _0205F054 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0205F050 mov r5, #0xfe @@ -566,7 +566,7 @@ _0205F06A: bl FUN_0205EC94 cmp r0, #0x1 bne _0205F0E0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0205F080 ldr r5, _0205F128 ; =0x000003F5 @@ -579,7 +579,7 @@ _0205F084: bl FUN_0205EC94 cmp r0, #0x1 bne _0205F0E0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0205F09A ldr r5, _0205F134 ; =0x000003FF @@ -592,7 +592,7 @@ _0205F09E: bl FUN_0205EC94 cmp r0, #0x1 bne _0205F0E0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0205F0B4 ldr r5, _0205F140 ; =0x000003EE @@ -605,7 +605,7 @@ _0205F0B8: bl FUN_0205EC94 cmp r0, #0x1 bne _0205F0E0 - bl FUN_0201277C + bl IsNighttime cmp r0, #0x0 bne _0205F0CE ldr r5, _0205F140 ; =0x000003EE diff --git a/arm9/global.inc b/arm9/global.inc index 0dc52bc5..840fe78b 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -805,7 +805,7 @@ .extern FUN_020126D8
.extern FUN_020126FC
.extern FUN_02012710
-.extern FUN_0201277C
+.extern IsNighttime
.extern FUN_02012794
.extern FUN_020127A8
.extern FUN_020127C0
@@ -4867,7 +4867,7 @@ .extern FUN_0206B9DC
.extern FUN_0206BA38
.extern FUN_0206BAD0
-.extern FUN_0206BAE4
+.extern PartyHasMon
.extern FUN_0206BB1C
.extern FUN_0206BB28
.extern FUN_0206BB34
diff --git a/arm9/modules/05/asm/module_05.s b/arm9/modules/05/asm/module_05.s index ea4a9191..b5f89157 100644 --- a/arm9/modules/05/asm/module_05.s +++ b/arm9/modules/05/asm/module_05.s @@ -43155,7 +43155,7 @@ _021EC544: bl FUN_0206B938 ldr r1, _021EC578 ; =0x000001B9 add r0, r6, #0 - bl FUN_0206BAE4 + bl PartyHasMon cmp r0, #0 bne _021EC572 add r0, r7, #0 diff --git a/arm9/modules/14/asm/module_14.s b/arm9/modules/14/asm/module_14.s index 0b764ed1..e0034fd2 100644 --- a/arm9/modules/14/asm/module_14.s +++ b/arm9/modules/14/asm/module_14.s @@ -116,7 +116,7 @@ MOD14_021D75B8: ; 0x021D75B8 lsl r1, r1, #2 ldr r0, [r4, r1] add r1, #0x95 - bl FUN_0206BAE4 + bl PartyHasMon cmp r0, #0 bne _021D75DE mov r0, #0x47 diff --git a/arm9/modules/71/asm/module_71.s b/arm9/modules/71/asm/module_71.s index e9d79012..606353f1 100644 --- a/arm9/modules/71/asm/module_71.s +++ b/arm9/modules/71/asm/module_71.s @@ -138,7 +138,7 @@ MOD71_0222D5C0: ; 0x0222D5C0 mov r0, #0x1a bl FUN_020335F0 bl FUN_02033E74 - bl FUN_0201277C + bl IsNighttime cmp r0, #0 bne _0222D71A ldr r1, _0222D748 ; =0x0000043D @@ -6375,7 +6375,7 @@ _02230A40: ldr r0, [sp, #4] ldr r1, _02230AE0 ; =0x000001B9 str r6, [r5, #0x2c] - bl FUN_0206BAE4 + bl PartyHasMon cmp r0, #0 bne _02230A98 ldr r0, [r5, #0x10] diff --git a/arm9/modules/80/asm/module_80.s b/arm9/modules/80/asm/module_80.s index 52e2cc5f..71ef95f1 100644 --- a/arm9/modules/80/asm/module_80.s +++ b/arm9/modules/80/asm/module_80.s @@ -16121,7 +16121,7 @@ _02235590: ldr r0, [r5] ldr r1, _022355EC ; =0x000001B9 ldr r0, [r0, #8] - bl FUN_0206BAE4 + bl PartyHasMon cmp r0, #0 bne _022355DC ldr r0, [r5] diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index 0a2e160c..f1fbcd1d 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -27,6 +27,8 @@ u8 BoxMonIsShiny(struct BoxPokemon * boxmon); u8 CalcShininessByOtIdAndPersonality(u32 otid, u32 pid); u32 MaskOfFlagNo(int flagno); void LoadMonPersonal(int species, struct BaseStats * personal); +void LoadMonEvolutionTable(u16 species, struct Evolution * dest); +BOOL MonHasMove(struct Pokemon * pokemon, u16 move); int ResolveMonForme(int species, int forme); void MonEncryptSegment(void * datap, u32 size, u32 key); @@ -2472,3 +2474,249 @@ BOOL FUN_020690E8(struct Pokemon * pokemon) } return FALSE; } + +u16 GetMonEvolution(struct PlayerParty * party, struct Pokemon * pokemon, u32 context, u32 usedItem, u32 * method_ret) +{ + u16 target = SPECIES_NONE; + u32 sp40; + u16 species; + u16 heldItem; + u32 personality; + int i; + u8 beauty; + u8 level; + u16 friendship; + u16 pid_hi; + struct Evolution * evoTable; + u8 r1; + + species = GetMonData(pokemon, MON_DATA_SPECIES, NULL); + heldItem = GetMonData(pokemon, MON_DATA_HELD_ITEM, NULL); + personality = GetMonData(pokemon, MON_DATA_PERSONALITY, NULL); + beauty = GetMonData(pokemon, MON_DATA_BEAUTY, NULL); + pid_hi = (personality & 0xFFFF0000) >> 16; + r1 = FUN_0206E7B8(heldItem, 1, 0); + if (species != SPECIES_KADABRA && r1 == 0x3F && context != 3) + return SPECIES_NONE; + if (method_ret == NULL) + method_ret = &sp40; + evoTable = AllocFromHeap(0, 7 * sizeof(struct Evolution)); + LoadMonEvolutionTable(species, evoTable); + switch (context) + { + case 0: + level = GetMonData(pokemon, MON_DATA_LEVEL, NULL); + friendship = GetMonData(pokemon, MON_DATA_FRIENDSHIP, NULL); + for (i = 0; i < 7; i++) + { + switch (evoTable[i].method) + { + case EVO_NONE: + break; + case EVO_FRIENDSHIP: + if (friendship >= 220) + { + target = evoTable[i].target; + *method_ret = EVO_FRIENDSHIP; + } + break; + case EVO_FRIENDSHIP_DAY: + if (IsNighttime() == 0 && friendship >= 220) + { + target = evoTable[i].target; + *method_ret = EVO_FRIENDSHIP_DAY; + } + break; + case EVO_FRIENDSHIP_NIGHT: + if (IsNighttime() == 1 && friendship >= 220) + { + target = evoTable[i].target; + *method_ret = EVO_FRIENDSHIP_NIGHT; + } + break; + case EVO_LEVEL: + if (evoTable[i].param <= level) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL; + } + break; + case EVO_TRADE: + break; + case EVO_TRADE_ITEM: + break; + case EVO_STONE: + break; + case EVO_LEVEL_ATK_GT_DEF: + if (evoTable[i].param <= level && GetMonData(pokemon, MON_DATA_ATK, NULL) > GetMonData(pokemon, MON_DATA_DEF, NULL)) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_ATK_GT_DEF; + } + break; + case EVO_LEVEL_ATK_EQ_DEF: + if (evoTable[i].param <= level && GetMonData(pokemon, MON_DATA_ATK, NULL) == GetMonData(pokemon, MON_DATA_DEF, NULL)) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_ATK_EQ_DEF; + } + break; + case EVO_LEVEL_ATK_LT_DEF: + if (evoTable[i].param <= level && GetMonData(pokemon, MON_DATA_ATK, NULL) < GetMonData(pokemon, MON_DATA_DEF, NULL)) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_ATK_LT_DEF; + } + break; + case EVO_LEVEL_PID_LO: + if (evoTable[i].param <= level && pid_hi % 10 < 5) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_PID_LO; + } + break; + case EVO_LEVEL_PID_HI: + if (evoTable[i].param <= level && pid_hi % 10 >= 5) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_PID_HI; + } + break; + case EVO_LEVEL_NINJASK: + if (evoTable[i].param <= level) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_NINJASK; + } + break; + case EVO_LEVEL_SHEDINJA: + *method_ret = EVO_LEVEL_SHEDINJA; + break; + case EVO_BEAUTY: + if (evoTable[i].param <= beauty) + { + target = evoTable[i].target; + *method_ret = EVO_BEAUTY; + } + break; + case EVO_STONE_MALE: + break; + case EVO_STONE_FEMALE: + break; + case EVO_ITEM_DAY: + if (IsNighttime() == 0 && evoTable[i].param == heldItem) + { + target = evoTable[i].target; + *method_ret = EVO_ITEM_DAY; + } + break; + case EVO_ITEM_NIGHT: + if (IsNighttime() == 1 && evoTable[i].param == heldItem) + { + target = evoTable[i].target; + *method_ret = EVO_ITEM_NIGHT; + } + break; + case EVO_HAS_MOVE: + if (MonHasMove(pokemon, evoTable[i].param) == TRUE) + { + target = evoTable[i].target; + *method_ret = EVO_HAS_MOVE; + } + break; + case EVO_OTHER_PARTY_MON: + if (party != NULL && PartyHasMon(party, evoTable[i].param) == 1) + { + target = evoTable[i].target; + *method_ret = EVO_OTHER_PARTY_MON; + } + break; + case EVO_LEVEL_MALE: + if (GetMonData(pokemon, MON_DATA_GENDER, NULL) == MON_MALE && evoTable[i].param <= level) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_MALE; + } + break; + case EVO_LEVEL_FEMALE: + if (GetMonData(pokemon, MON_DATA_GENDER, NULL) == MON_FEMALE && evoTable[i].param <= level) + { + target = evoTable[i].target; + *method_ret = EVO_LEVEL_FEMALE; + } + break; + case EVO_CORONET: + if (usedItem == evoTable[i].method) + { + target = evoTable[i].target; + *method_ret = EVO_CORONET; + } + break; + case EVO_ETERNA: + if (usedItem == evoTable[i].method) + { + target = evoTable[i].target; + *method_ret = EVO_ETERNA; + } + break; + case EVO_ROUTE217: + if (usedItem == evoTable[i].method) + { + target = evoTable[i].target; + *method_ret = EVO_ROUTE217; + } + break; + } + if (target != SPECIES_NONE) + break; + } + break; + case 1: + for (i = 0; i < 7; i++) + { + switch (evoTable[i].method) + { + case EVO_TRADE: + target = evoTable[i].target; + *method_ret = EVO_TRADE; + break; + case EVO_TRADE_ITEM: + if (heldItem == evoTable[i].param) + { + target = evoTable[i].target; + *method_ret = EVO_TRADE_ITEM; + } + break; + } + if (target != SPECIES_NONE) + break; + } + break; + case 2: + case 3: + for (i = 0; i < 7; i++) + { + if (evoTable[i].method == EVO_STONE && usedItem == evoTable[i].param) + { + target = evoTable[i].target; + *method_ret = 0; + break; + } + if (evoTable[i].method == EVO_STONE_MALE && GetMonData(pokemon, MON_DATA_GENDER, NULL) == MON_MALE && usedItem == evoTable[i].param) + { + target = evoTable[i].target; + *method_ret = 0; + break; + } + if (evoTable[i].method == EVO_STONE_FEMALE && GetMonData(pokemon, MON_DATA_GENDER, NULL) == MON_FEMALE && usedItem == evoTable[i].param) + { + target = evoTable[i].target; + *method_ret = 0; + break; + } + } + break; + } + FreeToHeap(evoTable); + return target; +} diff --git a/include/pokemon.h b/include/pokemon.h index 66ad03f2..83630d39 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -362,6 +362,37 @@ typedef enum { UNOWN_QUESTION_MARK = 27 } AlternateForms; +typedef enum EvoMethod +{ + EVO_NONE = 0, + EVO_FRIENDSHIP, + EVO_FRIENDSHIP_DAY, + EVO_FRIENDSHIP_NIGHT, + EVO_LEVEL, + EVO_TRADE, + EVO_TRADE_ITEM, + EVO_STONE, + EVO_LEVEL_ATK_GT_DEF, + EVO_LEVEL_ATK_EQ_DEF, + EVO_LEVEL_ATK_LT_DEF, + EVO_LEVEL_PID_LO, + EVO_LEVEL_PID_HI, + EVO_LEVEL_NINJASK, + EVO_LEVEL_SHEDINJA, + EVO_BEAUTY, + EVO_STONE_MALE, + EVO_STONE_FEMALE, + EVO_ITEM_DAY, + EVO_ITEM_NIGHT, + EVO_HAS_MOVE, + EVO_OTHER_PARTY_MON, + EVO_LEVEL_MALE, + EVO_LEVEL_FEMALE, + EVO_CORONET, + EVO_ETERNA, + EVO_ROUTE217, +} EvoMethod; + // Structs typedef struct { @@ -499,6 +530,22 @@ struct UnkStruct_02069038 struct Pokeanm anim; }; +struct Evolution +{ + u16 method; + u16 param; + u16 target; +}; + +#define PARTY_SIZE 6 + +struct PlayerParty +{ + u32 maxCount; + u32 curCount; + struct Pokemon mons[PARTY_SIZE]; +}; + void ZeroMonData(struct Pokemon * pokemon); void ZeroBoxMonData(struct BoxPokemon * boxmon); u32 SizeOfStructPokemon(void); diff --git a/include/proto.h b/include/proto.h index 3a6081b4..d9a5ec2a 100644 --- a/include/proto.h +++ b/include/proto.h @@ -2,7 +2,10 @@ #define POKEDIAMOND_PROTO_H // For homeless function declarations + +// Declare these here so that we don't have to include pokemon.h struct UnkStruct_02069038; +struct PlayerParty; u16 * FUN_0200AA50(u16 species, u32 heap_id); void FUN_02021A74(u16 * dest, u16 * src); @@ -13,5 +16,7 @@ u32 FUN_0206E7B8(u16 item, u32 a1, u32 a2); u32 GetArceusTypeByPlate(u16 plate); int FUN_02014C3C(u8); void FUN_02014C54(int, int, struct UnkStruct_02069038 *, u8); +u32 IsNighttime(void); // is day or night +u32 PartyHasMon(struct PlayerParty *, u16); #endif //POKEDIAMOND_PROTO_H |