summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/unk_02088DD8.s172
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/src/scrcmd_24.c8
-rw-r--r--arm9/src/unk_02088DD8.c76
-rw-r--r--include/unk_02088DD8.h7
5 files changed, 86 insertions, 179 deletions
diff --git a/arm9/asm/unk_02088DD8.s b/arm9/asm/unk_02088DD8.s
deleted file mode 100644
index 3df58ffe..00000000
--- a/arm9/asm/unk_02088DD8.s
+++ /dev/null
@@ -1,172 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- thumb_func_start FUN_02088DD8
-FUN_02088DD8: ; 0x02088DD8
- push {r3, lr}
- mov r1, #0x18
- bl AllocFromHeap
- add r3, r0, #0x0
- mov r2, #0x18
- mov r1, #0x0
-_02088DE6:
- strb r1, [r3, #0x0]
- add r3, r3, #0x1
- sub r2, r2, #0x1
- bne _02088DE6
- pop {r3, pc}
-
- thumb_func_start FUN_02088DF0
-FUN_02088DF0: ; 0x02088DF0
- ldr r3, _02088DF4 ; =FreeToHeap
- bx r3
- .balign 4
-_02088DF4: .word FreeToHeap
-
- thumb_func_start FUN_02088DF8
-FUN_02088DF8: ; 0x02088DF8
- push {r3-r7, lr}
- sub sp, #0x18
- str r1, [sp, #0x0]
- mov r1, #0x5
- mov r2, #0x0
- add r5, r0, #0x0
- bl GetMonData
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- str r0, [sp, #0xc]
- add r0, r5, #0x0
- mov r1, #0x70
- mov r2, #0x0
- bl GetMonData
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x8]
- add r0, r5, #0x0
- mov r1, #0xa0
- mov r2, #0x0
- bl GetMonData
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- mov r4, #0x0
- str r0, [sp, #0x4]
- add r7, r4, #0x0
- add r6, sp, #0x10
-_02088E34:
- add r1, r4, #0x0
- add r0, r5, #0x0
- add r1, #0x36
- add r2, r7, #0x0
- bl GetMonData
- lsl r1, r4, #0x1
- strh r0, [r6, r1]
- add r0, r4, #0x1
- lsl r0, r0, #0x18
- lsr r4, r0, #0x18
- cmp r4, #0x4
- blo _02088E34
- ldr r0, [sp, #0x0]
- mov r1, #0x2c
- bl AllocFromHeap
- add r7, r0, #0x0
- ldr r0, [sp, #0x0]
- mov r1, #0x2c
- bl AllocFromHeap
- add r4, r0, #0x0
- ldr r0, [sp, #0xc]
- ldr r1, [sp, #0x8]
- add r2, r7, #0x0
- bl LoadWotbl_HandleAlternateForme
- mov r2, #0x0
- mov r12, r2
-_02088E70:
- mov r0, r12
- lsl r0, r0, #0x1
- ldrh r5, [r7, r0]
- ldr r6, _02088EF4 ; =0x0000FFFF
- cmp r5, r6
- bne _02088E82
- lsl r0, r2, #0x1
- strh r6, [r4, r0]
- b _02088EE8
-_02088E82:
- mov r1, #0xfe
- lsl r1, r1, #0x8
- and r1, r5
- asr r3, r1, #0x9
- ldr r1, [sp, #0x4]
- cmp r3, r1
- bgt _02088EDA
- lsr r1, r6, #0x7
- and r1, r5
- strh r1, [r7, r0]
- ldrh r3, [r7, r0]
- mov r1, #0x0
- add r6, sp, #0x10
-_02088E9C:
- lsl r5, r1, #0x1
- ldrh r5, [r6, r5]
- cmp r3, r5
- beq _02088EAE
- add r1, r1, #0x1
- lsl r1, r1, #0x18
- lsr r1, r1, #0x18
- cmp r1, #0x4
- blo _02088E9C
-_02088EAE:
- cmp r1, #0x4
- bne _02088EDA
- mov r1, #0x0
- cmp r2, #0x0
- bls _02088ECA
-_02088EB8:
- lsl r5, r1, #0x1
- ldrh r5, [r4, r5]
- cmp r5, r3
- beq _02088ECA
- add r1, r1, #0x1
- lsl r1, r1, #0x18
- lsr r1, r1, #0x18
- cmp r1, r2
- blo _02088EB8
-_02088ECA:
- cmp r1, r2
- bne _02088EDA
- ldrh r1, [r7, r0]
- lsl r0, r2, #0x1
- strh r1, [r4, r0]
- add r0, r2, #0x1
- lsl r0, r0, #0x18
- lsr r2, r0, #0x18
-_02088EDA:
- mov r0, r12
- add r0, r0, #0x1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- mov r12, r0
- cmp r0, #0x16
- blo _02088E70
-_02088EE8:
- add r0, r7, #0x0
- bl FreeToHeap
- add r0, r4, #0x0
- add sp, #0x18
- pop {r3-r7, pc}
- .balign 4
-_02088EF4: .word 0x0000FFFF
-
- thumb_func_start FUN_02088EF8
-FUN_02088EF8: ; 0x02088EF8
- ldrh r1, [r0, #0x0]
- ldr r0, _02088F08 ; =0x0000FFFF
- cmp r1, r0
- beq _02088F04
- mov r0, #0x1
- bx lr
-_02088F04:
- mov r0, #0x0
- bx lr
- .balign 4
-_02088F08: .word 0x0000FFFF
diff --git a/arm9/global.inc b/arm9/global.inc
index 086d9b5f..590bf428 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -5450,7 +5450,7 @@
.extern FUN_02088DBC
.extern FUN_02088DD8
.extern FUN_02088DF0
-.extern FUN_02088DF8
+.extern GetEligibleLevelUpMoves
.extern FUN_02088EF8
.extern FUN_02088F0C
.extern FUN_02088F4C
diff --git a/arm9/src/scrcmd_24.c b/arm9/src/scrcmd_24.c
index b38ed05a..bfa737be 100644
--- a/arm9/src/scrcmd_24.c
+++ b/arm9/src/scrcmd_24.c
@@ -10,10 +10,6 @@ extern struct UnkStruct_02037CF0* FUN_02037CF0(u32 heap_id, struct UnkSavStruct8
extern u8 FUN_02037D5C(struct UnkStruct_02037CF0*);
extern void FUN_02038864(struct UnkSavStruct80*, struct UnkStruct_02088DD8*);
extern BOOL FUN_0203BC04(struct ScriptContext* ctx);
-extern struct UnkStruct_02088DD8* FUN_02088DD8(u32 heap_id);
-extern void FUN_02088DF0(struct UnkStruct_02037CF0*);
-extern void* FUN_02088DF8(struct Pokemon* pokemon, u32 heap_id);
-extern BOOL FUN_02088EF8(void*);
THUMB_FUNC BOOL ScrCmd_Unk01C6(struct ScriptContext* ctx)
{
@@ -57,7 +53,7 @@ THUMB_FUNC BOOL ScrCmd_Unk021F(struct ScriptContext* ctx)
u16 mon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
struct Pokemon* pokemon = GetPartyMonByIndex(party, mon_idx);
- void* unk_ptr = FUN_02088DF8(pokemon, 32);
+ void* unk_ptr = GetEligibleLevelUpMoves(pokemon, 32);
*ret_ptr = (u16)FUN_02088EF8(unk_ptr);
FreeToHeap(unk_ptr);
@@ -96,7 +92,7 @@ THUMB_FUNC BOOL ScrCmd_Unk0221(struct ScriptContext* ctx)
u16 mon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
struct Pokemon* pokemon = GetPartyMonByIndex(party, mon_idx);
- void* unk_ptr = FUN_02088DF8(pokemon, 32);
+ void* unk_ptr = GetEligibleLevelUpMoves(pokemon, 32);
FUN_02045E74(ctx, 1, pokemon, unk_ptr);
return TRUE;
diff --git a/arm9/src/unk_02088DD8.c b/arm9/src/unk_02088DD8.c
new file mode 100644
index 00000000..b4633d25
--- /dev/null
+++ b/arm9/src/unk_02088DD8.c
@@ -0,0 +1,76 @@
+#include "global.h"
+#include "heap.h"
+#include "pokemon.h"
+#include "unk_02088DD8.h"
+
+extern void LoadWotbl_HandleAlternateForme(int species, int forme, u16 * wotbl);
+
+THUMB_FUNC struct UnkStruct_02088DD8* FUN_02088DD8(u32 heap_id) {
+ struct UnkStruct_02088DD8 *returnPointer = AllocFromHeap(heap_id, sizeof(struct UnkStruct_02088DD8));
+ __builtin__clear(returnPointer, sizeof(struct UnkStruct_02088DD8));
+ return returnPointer;
+}
+
+THUMB_FUNC void FUN_02088DF0(struct UnkStruct_02037CF0 *r0) {
+ FreeToHeap(r0);
+}
+
+#define WOTBL_END 0xFFFF
+#define WOTBL_MOVE_MASK 0x01FF
+#define WOTBL_MOVE_SHIFT 0
+#define WOTBL_LVL_MASK 0xFE00
+#define WOTBL_LVL_SHIFT 9
+#define WOTBL_MOVE(x) ((u16)(((x) & WOTBL_MOVE_MASK) >> WOTBL_MOVE_SHIFT))
+#define WOTBL_LVL(x) (/*(u8)*/(((x) & WOTBL_LVL_MASK) >> WOTBL_LVL_SHIFT))
+// i don't know why either.
+
+THUMB_FUNC u16* GetEligibleLevelUpMoves(struct Pokemon* pokemon, u32 heap_id) {
+ u16 species = (u16)GetMonData(pokemon, MON_DATA_SPECIES, 0);
+ u8 forme = (u8)GetMonData(pokemon, MON_DATA_FORME, 0);
+ u8 level = (u8)GetMonData(pokemon, MON_DATA_LEVEL, 0);
+ u16 moves[4];
+
+ for (u8 i = 0; i < 4; ++i) {
+ moves[i] = (u16)GetMonData(pokemon, MON_DATA_MOVE1 + i, 0);
+ }
+
+ u16 *tableFromFile = AllocFromHeap(heap_id, 44);
+ u16 *returnTable = AllocFromHeap(heap_id, 44);
+
+ LoadWotbl_HandleAlternateForme(species, forme, tableFromFile);
+
+ for (u8 i = 0, j, k = 0; i < 22; i++) {
+ if (tableFromFile[i] == WOTBL_END) {
+ returnTable[k] = WOTBL_END;
+ break;
+ }
+ else {
+ if (WOTBL_LVL(tableFromFile[i]) > level) continue;
+
+ tableFromFile[i] = WOTBL_MOVE(tableFromFile[i]);
+
+ for (j = 0; j < 4; j++) {
+ if (tableFromFile[i] == moves[j]) break;
+ }
+ if (j != 4) continue;
+
+ if (k >= 0) {
+ // don't know when that would be false
+ for (j = 0; j < k; j++) {
+ if (returnTable[j] == tableFromFile[i]) break;
+ }
+ }
+ if (j != k) continue;
+
+ returnTable[k] = tableFromFile[i];
+ k++;
+ }
+ }
+
+ FreeToHeap(tableFromFile);
+ return returnTable;
+}
+
+THUMB_FUNC BOOL FUN_02088EF8(u16 *r0) {
+ return *r0 != 0xFFFF;
+}
diff --git a/include/unk_02088DD8.h b/include/unk_02088DD8.h
index 318a98fb..7b023c56 100644
--- a/include/unk_02088DD8.h
+++ b/include/unk_02088DD8.h
@@ -1,6 +1,8 @@
#ifndef POKEDIAMOND_UNK_02088DD8_H
#define POKEDIAMOND_UNK_02088DD8_H
+#include "unk_020377F0.h"
+
struct Options;
struct PlayerData;
struct Pokemon;
@@ -16,4 +18,9 @@ struct UnkStruct_02088DD8
u8 padding2[0x2];
};
+struct UnkStruct_02088DD8* FUN_02088DD8(u32 heap_id);
+void FUN_02088DF0(struct UnkStruct_02037CF0 *r0);
+u16* GetEligibleLevelUpMoves(struct Pokemon* pokemon, u32 heap_id);
+BOOL FUN_02088EF8(u16 *r0);
+
#endif