diff options
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/modules/59/asm/mod59_021D74E0_asm.s | 261 | ||||
-rw-r--r-- | arm9/modules/59/include/mod59_021D74E0.h | 24 | ||||
-rw-r--r-- | arm9/modules/59/src/mod59_021D74E0_src.c | 186 | ||||
-rw-r--r-- | arm9/src/player_data.c | 4 |
4 files changed, 201 insertions, 274 deletions
diff --git a/arm9/modules/59/asm/mod59_021D74E0_asm.s b/arm9/modules/59/asm/mod59_021D74E0_asm.s index a48cd966..7d1c22b6 100644 --- a/arm9/modules/59/asm/mod59_021D74E0_asm.s +++ b/arm9/modules/59/asm/mod59_021D74E0_asm.s @@ -3,266 +3,7 @@ .section .text .balign 4, 0 - thumb_func_start MOD59_021D7564 -MOD59_021D7564: ; 0x021D7564 - push {r3, r4, r5, r6, lr} - sub sp, #0xc - add r5, r1, #0 - bl OverlayManager_GetData - ldr r1, [r5] - add r4, r0, #0 - mov r6, #0 - cmp r1, #5 - bls _021D757A - b _021D76AC -_021D757A: - add r1, r1, r1 - add r1, pc - ldrh r1, [r1, #6] - lsl r1, r1, #0x10 - asr r1, r1, #0x10 - add pc, r1 -_021D7586: ; jump table - .short _021D7592 - _021D7586 - 2 ; case 0 - .short _021D75FA - _021D7586 - 2 ; case 1 - .short _021D7642 - _021D7586 - 2 ; case 2 - .short _021D7668 - _021D7586 - 2 ; case 3 - .short _021D7690 - _021D7586 - 2 ; case 4 - .short _021D76AA - _021D7586 - 2 ; case 5 -_021D7592: - add r0, r6, #0 - add r1, r6, #0 - bl FUN_0200E3A0 - mov r0, #1 - add r1, r6, #0 - bl FUN_0200E3A0 - add r0, r6, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - add r0, r6, #0 - add r1, r0, #0 - bl FUN_02015F34 - bl GX_DisableEngineALayers - bl GX_DisableEngineBLayers - mov r2, #1 - lsl r2, r2, #0x1a - ldr r1, [r2] - ldr r0, _021D76B4 ; =0xFFFFE0FF - and r1, r0 - str r1, [r2] - ldr r2, _021D76B8 ; =0x04001000 - ldr r1, [r2] - and r0, r1 - str r0, [r2] - mov r0, #4 - mov r1, #8 - bl SetKeyRepeatTimers - add r0, r4, #0 - bl MOD59_021D778C - add r0, r4, #0 - bl MOD59_021D79F8 - add r0, r4, #0 - bl MOD59_021D7A4C - ldr r0, _021D76BC ; =MOD59_021D7724 - add r1, r4, #0 - bl Main_SetVBlankIntrCB - bl GX_BothDispOn - mov r0, #1 - str r0, [r5] - b _021D76AC -_021D75FA: - bl MOD59_021D8920 - cmp r0, #1 - bne _021D761E - mov r0, #6 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r0, [r4] - str r0, [sp, #8] - add r0, r6, #0 - add r1, r0, #0 - add r2, r0, #0 - add r3, r0, #0 - bl FUN_0200E1D0 - mov r0, #2 - str r0, [r5] -_021D761E: - ldr r0, [r4, #0x14] - cmp r0, #0 - beq _021D76AC - mov r0, #6 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r0, [r4] - str r0, [sp, #8] - mov r0, #0 - add r1, r0, #0 - add r2, r0, #0 - add r3, r0, #0 - bl FUN_0200E1D0 - mov r0, #3 - str r0, [r5] - b _021D76AC -_021D7642: - bl FUN_0200E308 - cmp r0, #1 - bne _021D76AC - add r0, r4, #0 - bl MOD59_021D7A34 - add r0, r4, #0 - bl MOD59_021D796C - add r0, r4, #0 - bl MOD59_021D7A5C - add r0, r6, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - mov r6, #1 - b _021D76AC -_021D7668: - bl FUN_0200E308 - cmp r0, #1 - bne _021D76AC - add r0, r4, #0 - bl MOD59_021D7A34 - add r0, r4, #0 - bl MOD59_021D796C - add r0, r4, #0 - bl MOD59_021D7A5C - add r0, r6, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - mov r0, #4 - str r0, [r5] - b _021D76AC -_021D7690: - ldr r0, [r4, #0x14] - bl OverlayManager_Run - cmp r0, #1 - bne _021D76AC - ldr r0, [r4, #0x14] - bl OverlayManager_delete - add r0, r6, #0 - str r0, [r4, #0x14] - mov r0, #5 - str r0, [r5] - b _021D76AC -_021D76AA: - str r6, [r5] -_021D76AC: - add r0, r6, #0 - add sp, #0xc - pop {r3, r4, r5, r6, pc} - nop -_021D76B4: .word 0xFFFFE0FF -_021D76B8: .word 0x04001000 -_021D76BC: .word MOD59_021D7724 - thumb_func_end MOD59_021D7564 - - thumb_func_start MOD59_021D76C0 -MOD59_021D76C0: ; 0x021D76C0 - push {r4, r5, r6, lr} - add r6, r0, #0 - bl OverlayManager_GetData - add r4, r0, #0 - ldr r0, [r4, #4] - ldr r5, [r4] - bl Sav2_PlayerData_GetProfileAddr - ldr r1, [r4, #0x70] - ldr r1, [r1, #0x18] - bl PlayerName_StringToFlat - ldr r0, [r4, #4] - bl Sav2_PlayerData_GetProfileAddr - ldr r1, [r4, #0x70] - ldr r1, [r1, #4] - bl PlayerProfile_SetTrainerGender - ldr r0, [r4, #4] - bl FUN_02024EB4 - ldr r1, [r4, #0x74] - ldr r1, [r1, #0x18] - bl RivalsNameToU16Array - ldr r0, [r4, #0x70] - bl FUN_02077AC4 - ldr r0, [r4, #0x74] - bl FUN_02077AC4 - add r0, r6, #0 - bl OverlayManager_FreeData - add r0, r5, #0 - bl DestroyHeap - ldr r0, _021D771C ; =SDK_OVERLAY_MODULE_52_ID - ldr r1, _021D7720 ; =MOD52_021D76D8 - bl RegisterMainOverlay - mov r0, #1 - pop {r4, r5, r6, pc} - nop -_021D771C: .word SDK_OVERLAY_MODULE_52_ID -_021D7720: .word MOD52_021D76D8 - thumb_func_end MOD59_021D76C0 - - thumb_func_start MOD59_021D7724 -MOD59_021D7724: ; 0x021D7724 - ldr r3, _021D772C ; =FUN_0201AB60 - ldr r0, [r0, #0x18] - bx r3 - nop -_021D772C: .word FUN_0201AB60 - thumb_func_end MOD59_021D7724 - - thumb_func_start MOD59_021D7730 -MOD59_021D7730: ; 0x021D7730 - push {r3, r4} - ldr r2, _021D7788 ; =gMain + 0x40 - mov r0, #0 - ldrh r1, [r2, #0x20] - cmp r1, #0 - beq _021D7784 - ldrh r3, [r2, #0x1c] - mov r1, #1 - lsl r1, r1, #8 - cmp r3, r1 - bhs _021D7784 - ldrh r2, [r2, #0x1e] - cmp r2, #0xc0 - bhs _021D7784 - cmp r3, #0x80 - bhs _021D7758 - mov r1, #0x80 - sub r1, r1, r3 - lsl r1, r1, #0x10 - b _021D775C -_021D7758: - sub r3, #0x80 - lsl r1, r3, #0x10 -_021D775C: - lsr r3, r1, #0x10 - cmp r2, #0x64 - bhs _021D776A - mov r1, #0x64 - sub r1, r1, r2 - lsl r1, r1, #0x10 - b _021D776E -_021D776A: - sub r2, #0x64 - lsl r1, r2, #0x10 -_021D776E: - lsr r4, r1, #0x10 - add r2, r3, #0 - add r1, r4, #0 - mul r2, r3 - mul r1, r4 - add r2, r2, r1 - mov r1, #1 - lsl r1, r1, #8 - cmp r2, r1 - bgt _021D7784 - mov r0, #1 -_021D7784: - pop {r3, r4} - bx lr - .align 2, 0 -_021D7788: .word gMain + 0x40 - thumb_func_end MOD59_021D7730 + .extern MOD59_021D7730 thumb_func_start MOD59_021D778C MOD59_021D778C: ; 0x021D778C diff --git a/arm9/modules/59/include/mod59_021D74E0.h b/arm9/modules/59/include/mod59_021D74E0.h index 9342913d..2dd05826 100644 --- a/arm9/modules/59/include/mod59_021D74E0.h +++ b/arm9/modules/59/include/mod59_021D74E0.h @@ -5,6 +5,15 @@ #include "options.h" #include "save_block_2.h" #include "main.h" +#include "player_data.h" + +struct MOD59_UnkPlayerStruct +{ + u8 padding[0x4]; + GenderEnum gender; + u8 padding2[0x10]; + struct String *name; +}; typedef struct MOD59_OverlayData { @@ -13,10 +22,11 @@ typedef struct MOD59_OverlayData struct Options *options; u32 Unk0C; u32 Unk10; - u32 Unk14; - u8 padding[0x58]; - u32 Unk70; - u32 Unk74; + struct UnkStruct_02006234 *Unk14; + struct UnkStruct_02016B94_2 *Unk18; + u8 padding[0x54]; + struct MOD59_UnkPlayerStruct *playerStruct; + struct MOD59_UnkPlayerStruct *rivalStruct; u8 padding2[0x10]; u8 Unk88; u8 Unk89; @@ -24,9 +34,13 @@ typedef struct MOD59_OverlayData u8 Unk8B; u8 padding3[4]; u32 Unk90; - //TODO pad to 0xb4 + u8 padding4[32]; } MOD59_OverlayData; BOOL MOD59_Init(struct UnkStruct_02006234 *param0); +BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1); +BOOL MOD59_021D76C0(struct UnkStruct_02006234 *param0); +void MOD59_021D7724(MOD59_OverlayData *data); +BOOL MOD59_021D7730(void); #endif //POKEDIAMOND_MOD59_021D74E0_H diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c index be8dac20..9be9eff3 100644 --- a/arm9/modules/59/src/mod59_021D74E0_src.c +++ b/arm9/modules/59/src/mod59_021D74E0_src.c @@ -3,24 +3,45 @@ #include "overlay_manager.h" #include "mod59_021D74E0.h" #include "heap.h" +#include "game_init.h" +#include "GX_layers.h" +#include "unk_02024E64.h" +#include "unk_02016B94.h" +#include "module_52.h" +extern void *FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struct Options *options); -extern u32 FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struct Options *options); +extern void FUN_0200E3A0(PMLCDTarget, int); + +extern void MOD59_021D778C(MOD59_OverlayData *data); +extern void MOD59_021D79F8(MOD59_OverlayData *data); +extern void MOD59_021D7A34(MOD59_OverlayData *data); +extern void MOD59_021D796C(MOD59_OverlayData *data); +extern void MOD59_021D7A4C(MOD59_OverlayData *data); +extern void MOD59_021D7A5C(MOD59_OverlayData *data); +extern u32 MOD59_021D8920(MOD59_OverlayData *data); + +extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id); +extern u32 FUN_0200E308(void); + +extern void FUN_02077AC4(void *param0); + +FS_EXTERN_OVERLAY(MODULE_52); THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0) { - //note: 0xb4 is likely the overlay data struct size, once struct is padded replace with sizeof CreateHeap(3, 0x52, 1 << 18); - MOD59_OverlayData *data = (MOD59_OverlayData *) OverlayManager_CreateAndGetData(param0, 0xb4, 0x52); + MOD59_OverlayData *data = (MOD59_OverlayData *) OverlayManager_CreateAndGetData(param0, sizeof(MOD59_OverlayData), 0x52); (void)memset((void *)data, 0, 0xb4); data->heap_id = 0x52; - int *field18 = OverlayManager_GetField18(param0); + s32 *field18 = OverlayManager_GetField18(param0); data->sav2 = (struct SaveBlock2 *)field18[2]; //? data->options = Sav2_PlayerData_GetOptionsAddr(data->sav2); - data->Unk14 = data->Unk10 = data->Unk0C = 0; - data->Unk70 = FUN_02077A84(0x52, 0, 0, 7, data->options); - data->Unk74 = FUN_02077A84(0x52, 3, 0, 7, data->options); + data->Unk10 = data->Unk0C = 0; + data->Unk14 = NULL; + data->playerStruct = (struct MOD59_UnkPlayerStruct *)FUN_02077A84(0x52, 0, 0, 7, data->options); + data->rivalStruct = (struct MOD59_UnkPlayerStruct *)FUN_02077A84(0x52, 3, 0, 7, data->options); data->Unk88 = 0; data->Unk89 = 0; data->Unk8A = 0; @@ -28,3 +49,154 @@ THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0) data->Unk90 = 0; return TRUE; } + +THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) +{ + MOD59_OverlayData *data = (MOD59_OverlayData *) OverlayManager_GetData(param0); + BOOL ret = FALSE; + + switch (*param1) + { + case 0: + FUN_0200E3A0(PM_LCD_TOP, 0); + FUN_0200E3A0(PM_LCD_BOTTOM, 0); + + Main_SetVBlankIntrCB(NULL, NULL); + + FUN_02015F34(NULL, NULL); + GX_DisableEngineALayers(); + GX_DisableEngineBLayers(); + + reg_GX_DISPCNT = reg_GX_DISPCNT & 0xFFFFE0FF; + reg_GXS_DB_DISPCNT = reg_GXS_DB_DISPCNT & 0xFFFFE0FF; + + SetKeyRepeatTimers(4, 8); + + MOD59_021D778C(data); + MOD59_021D79F8(data); + MOD59_021D7A4C(data); + + Main_SetVBlankIntrCB((void (*)(void *))MOD59_021D7724, data); + + GX_BothDispOn(); + + *param1 = 1; + + break; + + case 1: + if (MOD59_021D8920(data) == 1) + { + FUN_0200E1D0(0, 0, 0, 0, 6, 1, data->heap_id); + *param1 = 2; + } + + if (data->Unk14 == NULL) + { + break; + } + + FUN_0200E1D0(0, 0, 0, 0, 6, 1, data->heap_id); + *param1 = 3; + + break; + + case 2: + if (FUN_0200E308() != 1) + { + break; + } + + MOD59_021D7A34(data); + MOD59_021D796C(data); + MOD59_021D7A5C(data); + + Main_SetVBlankIntrCB(NULL, NULL); + + ret = TRUE; + break; + + case 3: + if (FUN_0200E308() != 1) + { + break; + } + + MOD59_021D7A34(data); + MOD59_021D796C(data); + MOD59_021D7A5C(data); + + Main_SetVBlankIntrCB(NULL, NULL); + + *param1 = 4; + + break; + + case 4: + if (OverlayManager_Run(data->Unk14) != TRUE) + { + break; + } + + OverlayManager_delete(data->Unk14); + data->Unk14 = NULL; + + *param1 = 5; + + break; + + case 5: + *param1 = 0; + + break; + } + + return ret; +} + +THUMB_FUNC BOOL MOD59_021D76C0(struct UnkStruct_02006234 *param0) +{ + MOD59_OverlayData *data = (MOD59_OverlayData *) OverlayManager_GetData(param0); + + u32 heap_id = data->heap_id; + PlayerName_StringToFlat(Sav2_PlayerData_GetProfileAddr(data->sav2), data->playerStruct->name); + PlayerProfile_SetTrainerGender(Sav2_PlayerData_GetProfileAddr(data->sav2), data->playerStruct->gender); + + RivalsNameToU16Array(FUN_02024EB4(data->sav2), data->rivalStruct->name); + + FUN_02077AC4(data->playerStruct); + FUN_02077AC4(data->rivalStruct); + + OverlayManager_FreeData(param0); + DestroyHeap(heap_id); + + RegisterMainOverlay(FS_OVERLAY_ID(MODULE_52), &MOD52_021D76D8); + + return TRUE; +} + +THUMB_FUNC void MOD59_021D7724(MOD59_OverlayData *data) +{ + FUN_0201AB60(data->Unk18); +} + +THUMB_FUNC BOOL MOD59_021D7730(void) +{ + BOOL ret = FALSE; + + if (gMain.touchNew != 0 && gMain.touchX < 256 && gMain.touchY < 192) + { + s32 distanceFromXCentre = gMain.touchX < 128 ? (u16)(128 - gMain.touchX) : (u16)(gMain.touchX - 128); + s32 distanceFromYCentre = gMain.touchY < 100 ? (u16)(100 - gMain.touchY) : (u16)(gMain.touchY - 100); + + s32 distanceXSquare = distanceFromXCentre * distanceFromXCentre; + s32 distanceYSquare = distanceFromYCentre * distanceFromYCentre; + + if (distanceXSquare + distanceYSquare <= 256) + { + ret = TRUE; + } + } + + return ret; +} diff --git a/arm9/src/player_data.c b/arm9/src/player_data.c index ea5802aa..182e99e8 100644 --- a/arm9/src/player_data.c +++ b/arm9/src/player_data.c @@ -111,12 +111,12 @@ u16 PlayerProfile_GetTrainerID_VisibleHalf(struct PlayerData * data) return (u16)data->playerId; } -void PlayerProfile_SetTrainerGender(struct PlayerData * data, u8 gender) +void PlayerProfile_SetTrainerGender(struct PlayerData * data, GenderEnum gender) { data->gender = gender; } -u32 PlayerProfile_GetTrainerGender(struct PlayerData * data) +GenderEnum PlayerProfile_GetTrainerGender(struct PlayerData * data) { return data->gender; } |