summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-14 12:45:27 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-14 12:45:27 -0400
commitd6543eb215c80769469bf352330aa9d6387f859a (patch)
tree2d9e9c180c2989c68b5861203533f32617e90e13
parentc5eb6d2669cdb27cc9f5ad35fae73577edf8aac6 (diff)
GetMonEvolution
-rw-r--r--arm9/arm9.lcf2
-rw-r--r--arm9/arm9.lsf2
-rw-r--r--arm9/asm/party.s (renamed from arm9/asm/unk_0206B8A4.s)4
-rw-r--r--arm9/asm/pokemon_s.s528
-rw-r--r--arm9/asm/scrcmd.s2
-rw-r--r--arm9/asm/unk_02011744.s4
-rw-r--r--arm9/asm/unk_0204AB0C.s4
-rw-r--r--arm9/asm/unk_0205EC84.s10
-rw-r--r--arm9/global.inc4
-rw-r--r--arm9/modules/05/asm/module_05.s2
-rw-r--r--arm9/modules/14/asm/module_14.s2
-rw-r--r--arm9/modules/71/asm/module_71.s4
-rw-r--r--arm9/modules/80/asm/module_80.s2
-rw-r--r--arm9/src/pokemon.c248
-rw-r--r--include/pokemon.h47
-rw-r--r--include/proto.h5
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