From ccab6eda0454ac01d0a16d114c20cf4ece463663 Mon Sep 17 00:00:00 2001 From: tgsm Date: Wed, 15 Nov 2023 16:14:14 -0600 Subject: [PATCH 1/7] Name ScrCmd_425 and sub_0203FA8C --- asm/include/unk_0203E348.inc | 2 +- asm/macros/script.inc | 2 +- asm/unk_0203E348.s | 6 +++--- files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s | 4 ++-- files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s | 2 +- include/scrcmd.h | 2 +- include/unk_0203E348.h | 7 ++++++- src/data/fieldmap/script_cmd_table.h | 4 ++-- src/scrcmd_c.c | 8 ++++---- tools/py_scripts/scrcmd.json | 2 +- 10 files changed, 22 insertions(+), 17 deletions(-) diff --git a/asm/include/unk_0203E348.inc b/asm/include/unk_0203E348.inc index 5f1148b83..299d20bb0 100644 --- a/asm/include/unk_0203E348.inc +++ b/asm/include/unk_0203E348.inc @@ -128,7 +128,7 @@ .public sub_0203F9C4 .public HatchEggInParty .public LaunchVoltorbFlipApp -.public sub_0203FA8C +.public LaunchCertificatesApp .public sub_0203FAB4 .public sub_0203FAE8 .public ScratchOffCards_Create diff --git a/asm/macros/script.inc b/asm/macros/script.inc index 08111e655..784aa6ba9 100644 --- a/asm/macros/script.inc +++ b/asm/macros/script.inc @@ -2422,7 +2422,7 @@ .short \arg0 .endm - .macro scrcmd_425 arg0 + .macro show_certificate arg0 .short 425 .short \arg0 .endm diff --git a/asm/unk_0203E348.s b/asm/unk_0203E348.s index dac3d8592..4d7c36752 100644 --- a/asm/unk_0203E348.s +++ b/asm/unk_0203E348.s @@ -3145,8 +3145,8 @@ LaunchVoltorbFlipApp: ; 0x0203FA38 _0203FA88: .word _020FA234 thumb_func_end LaunchVoltorbFlipApp - thumb_func_start sub_0203FA8C -sub_0203FA8C: ; 0x0203FA8C + thumb_func_start LaunchCertificatesApp +LaunchCertificatesApp: ; 0x0203FA8C push {r4, r5, r6, lr} add r5, r0, #0 add r0, r1, #0 @@ -3165,7 +3165,7 @@ sub_0203FA8C: ; 0x0203FA8C pop {r4, r5, r6, pc} .balign 4, 0 _0203FAB0: .word _020FA304 - thumb_func_end sub_0203FA8C + thumb_func_end LaunchCertificatesApp thumb_func_start sub_0203FAB4 sub_0203FAB4: ; 0x0203FAB4 diff --git a/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s b/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s index db7b0002a..68247c20b 100644 --- a/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s +++ b/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s @@ -135,7 +135,7 @@ scr_seq_T07R0203_000: closemsg fade_screen 6, 1, 0, RGB_BLACK wait_fade - scrcmd_425 0 + show_certificate 0 scrcmd_150 setflag FLAG_UNK_143 add_special_game_stat 25 @@ -152,7 +152,7 @@ _01ED: closemsg fade_screen 6, 1, 0, RGB_BLACK wait_fade - scrcmd_425 1 + show_certificate 1 scrcmd_150 setflag FLAG_UNK_144 add_special_game_stat 26 diff --git a/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s b/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s index 68c4ab7d7..d20d73c43 100644 --- a/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s +++ b/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s @@ -91,7 +91,7 @@ _00FC: _010D: fade_screen 6, 1, 0, RGB_BLACK wait_fade - scrcmd_425 2 + show_certificate 2 scrcmd_150 fade_screen 6, 1, 1, RGB_BLACK wait_fade diff --git a/include/scrcmd.h b/include/scrcmd.h index 0c184daf2..2116181dd 100644 --- a/include/scrcmd.h +++ b/include/scrcmd.h @@ -459,7 +459,7 @@ BOOL ScrCmd_421(ScriptContext* ctx); BOOL ScrCmd_422(ScriptContext* ctx); BOOL ScrCmd_CheckJohtoDexComplete(ScriptContext* ctx); BOOL ScrCmd_CheckNationalDexComplete(ScriptContext* ctx); -BOOL ScrCmd_425(ScriptContext* ctx); +BOOL ScrCmd_ShowCertificate(ScriptContext* ctx); BOOL ScrCmd_KenyaCheck(ScriptContext* ctx); BOOL ScrCmd_427(ScriptContext* ctx); BOOL ScrCmd_MonGiveMail(ScriptContext* ctx); diff --git a/include/unk_0203E348.h b/include/unk_0203E348.h index c1193ce0c..30c3b90e7 100644 --- a/include/unk_0203E348.h +++ b/include/unk_0203E348.h @@ -117,6 +117,11 @@ typedef struct UnkStruct_0203EDDC { Pokemon *unk10; } UnkStruct_0203EDDC; +typedef struct CertificatesApp_Args { + SaveData *saveData; + u32 certificateId; +} CertificatesApp_Args; + struct UseMailWork *CreateUseMailWork(FieldSystem *fieldSystem, int kind, int mailId, HeapID heapId); struct ApricornBoxWork *CreateApricornBoxWork(FieldSystem *fieldSystem, int a1); struct PalPadWork *CreatePalPadWork(FieldSystem *fieldSystem, SaveData *saveData, HeapID heapId); @@ -179,7 +184,7 @@ void sub_0203E960(TaskManager *taskManager, int a1, u16 *a2, u16 *a3, u16 *a4); void sub_0203F818(FieldSystem *fieldSystem); void HatchEggInParty(FieldSystem *fieldSystem); void *sub_0203F074(FieldSystem *fieldSystem, HeapID heapId); -void *sub_0203FA8C(FieldSystem *fieldSystem, HeapID heapId, u16 a2); +void *LaunchCertificatesApp(FieldSystem *fieldSystem, HeapID heapId, u16 certificateId); void *sub_0203E5D0(HeapID heapId, FieldSystem *fieldSystem, u16 a2); void *sub_0203FAB4(FieldSystem *fieldSystem, u8 a1, u8 a2, u16 a3, HeapID heapId); ScratchCardAppData *ScratchOffCards_Create(FieldSystem *fieldSystem, HeapID heapId); diff --git a/src/data/fieldmap/script_cmd_table.h b/src/data/fieldmap/script_cmd_table.h index 1f48b95ad..f95487906 100644 --- a/src/data/fieldmap/script_cmd_table.h +++ b/src/data/fieldmap/script_cmd_table.h @@ -424,7 +424,7 @@ BOOL ScrCmd_421(ScriptContext *ctx); BOOL ScrCmd_422(ScriptContext *ctx); BOOL ScrCmd_CheckJohtoDexComplete(ScriptContext *ctx); BOOL ScrCmd_CheckNationalDexComplete(ScriptContext *ctx); -BOOL ScrCmd_425(ScriptContext *ctx); +BOOL ScrCmd_ShowCertificate(ScriptContext *ctx); BOOL ScrCmd_KenyaCheck(ScriptContext *ctx); BOOL ScrCmd_427(ScriptContext *ctx); BOOL ScrCmd_MonGiveMail(ScriptContext *ctx); @@ -1279,7 +1279,7 @@ const ScrCmdFunc gScriptCmdTable[] = { ScrCmd_422, ScrCmd_CheckJohtoDexComplete, ScrCmd_CheckNationalDexComplete, - ScrCmd_425, + ScrCmd_ShowCertificate, ScrCmd_KenyaCheck, ScrCmd_427, ScrCmd_MonGiveMail, diff --git a/src/scrcmd_c.c b/src/scrcmd_c.c index 8580a847c..e3d89927f 100644 --- a/src/scrcmd_c.c +++ b/src/scrcmd_c.c @@ -3314,10 +3314,10 @@ BOOL ScrCmd_CheckNationalDexComplete(ScriptContext *ctx) { return FALSE; } -BOOL ScrCmd_425(ScriptContext *ctx) { //todo: pokedex screen - void **p_work = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); //PokedexAppData - u16 r2 = ScriptGetVar(ctx); - *p_work = sub_0203FA8C(ctx->fieldSystem, HEAP_ID_32, r2); +BOOL ScrCmd_ShowCertificate(ScriptContext *ctx) { + CertificatesApp_Args **args = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); + u16 certificateId = ScriptGetVar(ctx); + *args = LaunchCertificatesApp(ctx->fieldSystem, HEAP_ID_32, certificateId); SetupNativeScript(ctx, ScrNative_WaitApplication_DestroyTaskData); return TRUE; } diff --git a/tools/py_scripts/scrcmd.json b/tools/py_scripts/scrcmd.json index 9d8e22c36..b821f0284 100644 --- a/tools/py_scripts/scrcmd.json +++ b/tools/py_scripts/scrcmd.json @@ -2635,7 +2635,7 @@ ] }, { - "name": "scrcmd_425", + "name": "show_certificate", "args": [ 2 ] From c75faae5fd0d8a5b6e2db091c532a036ac1ba8c9 Mon Sep 17 00:00:00 2001 From: tgsm Date: Wed, 15 Nov 2023 16:15:24 -0600 Subject: [PATCH 2/7] heap: Add a heap ID for the certificates app --- include/heap.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/heap.h b/include/heap.h index af7d61cc9..267773ff1 100644 --- a/include/heap.h +++ b/include/heap.h @@ -22,6 +22,7 @@ typedef enum HeapID { HEAP_ID_CHOOSE_STARTER = 46, HEAP_ID_EVOLUTION = 71, HEAP_ID_CREDITS = 73, + HEAP_ID_CERTIFICATES = 82, HEAP_ID_89 = 89, HEAP_ID_ALPH_PUZZLE = 97, HEAP_ID_GAME_BOARD = 110, From 704a80bb95be3ce750c0fc1d93234df02de4f334 Mon Sep 17 00:00:00 2001 From: tgsm Date: Wed, 15 Nov 2023 16:40:49 -0600 Subject: [PATCH 3/7] Decompile most of overlay 78 (certificates app) --- asm/include/overlay_78.inc | 107 -- asm/include/unk_0203E348.inc | 6 +- asm/overlay_78.s | 1852 ---------------------------------- asm/unk_0203E348.s | 8 +- global.inc | 2 +- heartgold.us/main.sha1 | 2 +- include/certificates_app.h | 14 + include/unk_02023694.h | 1 + main.lsf | 4 +- soulsilver.us/main.sha1 | 2 +- src/certificates_app.c | 1068 ++++++++++++++++++++ 11 files changed, 1095 insertions(+), 1971 deletions(-) delete mode 100644 asm/include/overlay_78.inc delete mode 100644 asm/overlay_78.s create mode 100644 include/certificates_app.h create mode 100644 src/certificates_app.c diff --git a/asm/include/overlay_78.inc b/asm/include/overlay_78.inc deleted file mode 100644 index 72edc1346..000000000 --- a/asm/include/overlay_78.inc +++ /dev/null @@ -1,107 +0,0 @@ -#include -#pragma once -.public LoadFontPal0 -.public OverlayManager_CreateAndGetData -.public OverlayManager_GetData -.public OverlayManager_FreeData -.public OverlayManager_GetArgs -.public ReadWholeNarcMemberByIdPair -.public NARC_New -.public NARC_Delete -.public NARC_AllocAndReadWholeMember -.public GfGfxLoader_LoadCharData -.public GfGfxLoader_LoadScrnData -.public GfGfxLoader_GXLoadPal -.public G2dRenderer_SetSubSurfaceCoords -.public NewMsgDataFromNarc -.public DestroyMsgData -.public ReadMsgDataIntoString -.public MessageFormat_New -.public MessageFormat_Delete -.public BufferPlayersName -.public BufferBoxMonNickname -.public StringExpandPlaceholders -.public SpriteRenderer_Create -.public SpriteRenderer_CreateGfxHandler -.public SpriteRenderer_GetG2dRendererPtr -.public sub_0200CF70 -.public sub_0200CFF4 -.public sub_0200D020 -.public thunk_OamManager_ApplyAndResetBuffers -.public SpriteRenderer_Delete -.public SpriteRenderer_Init2DGfxResManagersFromCountsArray -.public SpriteRenderer_LoadCharResObjFromOpenNarc -.public SpriteRenderer_LoadPlttResObjFromOpenNarc -.public SpriteRenderer_LoadCellResObjFromOpenNarc -.public SpriteRenderer_LoadAnimResObjFromOpenNarc -.public SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset -.public SpriteRenderer_UnloadResourcesAndRemoveGfxHandler -.public sub_0200D9DC -.public UnkImageStruct_SetSpriteAnimActiveFlag -.public thunk_Set2dSpriteVisibleFlag -.public UnkImageStruct_SetSpriteVisibleFlag -.public UnkImageStruct_SetSpritePositionXY_CustomScreenYOffset -.public BeginNormalPaletteFade -.public IsPaletteFadeFinished -.public sub_0200FBF4 -.public sub_020145B4 -.public Main_SetVBlankIntrCB -.public Main_SetHBlankIntrCB -.public SetKeyRepeatTimers -.public CreateHeap -.public DestroyHeap -.public AllocFromHeapAtEnd -.public FreeToHeap -.public BgConfig_Alloc -.public SetBothScreensModesAndDisable -.public InitBgFromTemplate -.public FreeBgTilemapBuffer -.public ToggleBgLayer -.public BgCommitTilemapBufferToVram -.public BG_ClearCharDataRange -.public BgTilemapRectChangePalette -.public BgClearTilemapBufferAndCommit -.public AddWindow -.public RemoveWindow -.public FillWindowPixelRect -.public DoScheduledBgGpuUpdates -.public ScheduleSetBgPosText -.public ResetAllTextPrinters -.public AddTextPrinterParameterized2 -.public GfGfx_SetBanks -.public GfGfx_DisableEngineAPlanes -.public GfGfx_EngineATogglePlanes -.public GfGfx_DisableEngineBPlanes -.public GfGfx_EngineBTogglePlanes -.public GfGfx_BothDispOn -.public sub_02024B1C -.public sub_02024B34 -.public Sprite_GetVramType -.public GF_AssertFail -.public String_New -.public String_Delete -.public Save_PlayerData_GetProfileAddr -.public PlayerProfile_GetTrainerGender -.public Save_GetPartyLeadAlive -.public SpeciesToOverworldModelIndexOffset -.public OverworldModelLookupFormCount -.public OverworldModelLookupHasFemaleForm -.public GetMonData -.public GetMonGender -.public MonIsShiny -.public sub_02070438 -.public Mon_GetBoxMon -.public Party_GetMonByIndex -.public SaveArray_Party_Get -.public NNS_G2dGetImageLocation -.public NNS_G3dGetTex -.public GX_LoadOBJPltt -.public GXS_LoadOBJPltt -.public GX_LoadOBJ -.public GXS_LoadOBJ -.public DC_FlushRange -.public memset -.public gSystem -.public ov78_021E5900 -.public ov78_021E59EC -.public ov78_021E5B24 diff --git a/asm/include/unk_0203E348.inc b/asm/include/unk_0203E348.inc index 299d20bb0..3c227ea50 100644 --- a/asm/include/unk_0203E348.inc +++ b/asm/include/unk_0203E348.inc @@ -295,9 +295,9 @@ .public CreditsApp_OvyInit .public CreditsApp_OvyExit .public CreditsApp_OvyExec -.public ov78_021E5900 -.public ov78_021E59EC -.public ov78_021E5B24 +.public CertificatesApp_Init +.public CertificatesApp_Run +.public CertificatesApp_Exit .public ov86_021E5900 .public ov86_021E5A40 .public ov86_021E5AA4 diff --git a/asm/overlay_78.s b/asm/overlay_78.s deleted file mode 100644 index 80814ef24..000000000 --- a/asm/overlay_78.s +++ /dev/null @@ -1,1852 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_78.inc" - .include "global.inc" - - .text - - thumb_func_start ov78_021E5900 -ov78_021E5900: ; 0x021E5900 - push {r3, r4, r5, r6, r7, lr} - mov r2, #2 - add r5, r0, #0 - mov r0, #3 - mov r1, #0x52 - lsl r2, r2, #0x10 - bl CreateHeap - add r0, r5, #0 - mov r1, #0x5c - mov r2, #0x52 - bl OverlayManager_CreateAndGetData - mov r1, #0 - mov r2, #0x5c - add r4, r0, #0 - bl memset - add r0, r5, #0 - bl OverlayManager_GetArgs - add r5, r0, #0 - ldr r0, [r5] - bl Save_GetPartyLeadAlive - add r6, r0, #0 - cmp r5, #0 - bne _021E593C - bl GF_AssertFail -_021E593C: - ldr r0, [r5] - cmp r0, #0 - bne _021E5946 - bl GF_AssertFail -_021E5946: - ldr r0, [r5] - bl SaveArray_Party_Get - add r7, r0, #0 - mov r0, #0x52 - str r0, [r4] - ldr r0, [r5] - str r0, [r4, #8] - ldr r0, [r5, #4] - str r0, [r4, #4] - ldr r0, [r4, #8] - bl Save_PlayerData_GetProfileAddr - str r0, [r4, #0xc] - add r0, r7, #0 - add r1, r6, #0 - bl Party_GetMonByIndex - str r0, [r4, #0x10] - mov r0, #0 - add r1, r0, #0 - bl sub_0200FBF4 - mov r0, #1 - mov r1, #0 - bl sub_0200FBF4 - mov r0, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - mov r0, #0 - add r1, r0, #0 - bl Main_SetHBlankIntrCB - bl GfGfx_DisableEngineAPlanes - bl GfGfx_DisableEngineBPlanes - mov r2, #1 - lsl r2, r2, #0x1a - ldr r1, [r2] - ldr r0, _021E59E0 ; =0xFFFFE0FF - and r1, r0 - str r1, [r2] - ldr r2, _021E59E4 ; =0x04001000 - ldr r1, [r2] - and r0, r1 - str r0, [r2] - mov r0, #4 - mov r1, #8 - bl SetKeyRepeatTimers - add r0, r4, #0 - bl ov78_021E5BAC - add r0, r4, #0 - bl ov78_021E5D94 - ldr r0, _021E59E8 ; =ov78_021E5B60 - add r1, r4, #0 - bl Main_SetVBlankIntrCB - ldr r0, [r4, #4] - cmp r0, #2 - bne _021E59D6 - add r0, r4, #0 - bl ov78_021E628C - add r0, r4, #0 - bl ov78_021E636C -_021E59D6: - bl GfGfx_BothDispOn - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - nop -_021E59E0: .word 0xFFFFE0FF -_021E59E4: .word 0x04001000 -_021E59E8: .word ov78_021E5B60 - thumb_func_end ov78_021E5900 - - thumb_func_start ov78_021E59EC -ov78_021E59EC: ; 0x021E59EC - 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 _021E5A02 - b _021E5B14 -_021E5A02: - add r1, r1, r1 - add r1, pc - ldrh r1, [r1, #6] - lsl r1, r1, #0x10 - asr r1, r1, #0x10 - add pc, r1 -_021E5A0E: ; jump table - .short _021E5A1A - _021E5A0E - 2 ; case 0 - .short _021E5A76 - _021E5A0E - 2 ; case 1 - .short _021E5A8A - _021E5A0E - 2 ; case 2 - .short _021E5AA6 - _021E5A0E - 2 ; case 3 - .short _021E5AD0 - _021E5A0E - 2 ; case 4 - .short _021E5B0A - _021E5A0E - 2 ; case 5 -_021E5A1A: - bl ov78_021E5E44 - add r0, r4, #0 - bl ov78_021E5EA4 - add r0, r4, #0 - bl ov78_021E6068 - add r0, r6, #0 - mov r1, #1 - bl ToggleBgLayer - mov r0, #1 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #1 - bl ToggleBgLayer - mov r0, #4 - mov r1, #1 - bl ToggleBgLayer - mov r0, #5 - mov r1, #1 - bl ToggleBgLayer - mov r0, #7 - mov r1, #1 - bl ToggleBgLayer - mov r0, #6 - mov r1, #1 - str r0, [sp] - str r1, [sp, #4] - ldr r0, [r4] - add r2, r1, #0 - str r0, [sp, #8] - add r0, r6, #0 - add r3, r0, #0 - bl BeginNormalPaletteFade - mov r0, #1 - str r0, [r5] - b _021E5B14 -_021E5A76: - bl IsPaletteFadeFinished - cmp r0, #1 - bne _021E5B14 - add r0, r6, #0 - add r4, #0x42 - strh r0, [r4] - mov r0, #2 - str r0, [r5] - b _021E5B14 -_021E5A8A: - add r0, #0x42 - ldrh r0, [r0] - cmp r0, #0x3c - bhs _021E5AA0 - add r0, r4, #0 - add r0, #0x42 - ldrh r0, [r0] - add r4, #0x42 - add r0, r0, #1 - strh r0, [r4] - b _021E5B14 -_021E5AA0: - mov r0, #3 - str r0, [r5] - b _021E5B14 -_021E5AA6: - mov r1, #0x40 - ldrsh r2, [r4, r1] - add r1, r6, #0 - sub r1, #0xc0 - cmp r2, r1 - ble _021E5ABE - sub r1, r2, #4 - add r4, #0x40 - strh r1, [r4] - bl ov78_021E5E54 - b _021E5B14 -_021E5ABE: - add r1, r6, #0 - sub r1, #0xc0 - add r4, #0x40 - strh r1, [r4] - bl ov78_021E5E54 - mov r0, #4 - str r0, [r5] - b _021E5B14 -_021E5AD0: - ldr r0, _021E5B1C ; =gSystem - ldr r1, [r0, #0x48] - mov r0, #1 - and r0, r1 - cmp r0, #1 - beq _021E5AEC - mov r0, #2 - and r0, r1 - cmp r0, #2 - beq _021E5AEC - ldr r0, _021E5B20 ; =gSystem + 0x40 - ldrh r0, [r0, #0x24] - cmp r0, #0 - beq _021E5B14 -_021E5AEC: - 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 BeginNormalPaletteFade - mov r0, #5 - str r0, [r5] - b _021E5B14 -_021E5B0A: - bl IsPaletteFadeFinished - cmp r0, #1 - bne _021E5B14 - mov r6, #1 -_021E5B14: - add r0, r6, #0 - add sp, #0xc - pop {r3, r4, r5, r6, pc} - nop -_021E5B1C: .word gSystem -_021E5B20: .word gSystem + 0x40 - thumb_func_end ov78_021E59EC - - thumb_func_start ov78_021E5B24 -ov78_021E5B24: ; 0x021E5B24 - push {r4, r5, r6, lr} - add r6, r0, #0 - bl OverlayManager_GetData - add r4, r0, #0 - ldr r1, [r4, #4] - ldr r5, [r4] - cmp r1, #2 - bne _021E5B3A - bl ov78_021E6338 -_021E5B3A: - add r0, r4, #0 - bl ov78_021E5E24 - add r0, r4, #0 - bl ov78_021E5D18 - mov r0, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - add r0, r6, #0 - bl OverlayManager_FreeData - add r0, r5, #0 - bl DestroyHeap - mov r0, #1 - pop {r4, r5, r6, pc} - .balign 4, 0 - thumb_func_end ov78_021E5B24 - - thumb_func_start ov78_021E5B60 -ov78_021E5B60: ; 0x021E5B60 - push {r4, lr} - add r4, r0, #0 - bne _021E5B6A - bl GF_AssertFail -_021E5B6A: - ldr r0, [r4, #0x14] - cmp r0, #0 - bne _021E5B74 - bl GF_AssertFail -_021E5B74: - ldr r0, [r4, #4] - cmp r0, #2 - bne _021E5B8E - ldr r0, [r4, #0x48] - cmp r0, #0 - bne _021E5B84 - bl GF_AssertFail -_021E5B84: - ldr r0, [r4, #0x48] - bl sub_0200D020 - bl thunk_OamManager_ApplyAndResetBuffers -_021E5B8E: - ldr r0, [r4, #0x14] - bl DoScheduledBgGpuUpdates - ldr r3, _021E5BA4 ; =0x027E0000 - ldr r1, _021E5BA8 ; =0x00003FF8 - mov r0, #1 - ldr r2, [r3, r1] - orr r0, r2 - str r0, [r3, r1] - pop {r4, pc} - nop -_021E5BA4: .word 0x027E0000 -_021E5BA8: .word 0x00003FF8 - thumb_func_end ov78_021E5B60 - - thumb_func_start ov78_021E5BAC -ov78_021E5BAC: ; 0x021E5BAC - push {r4, r5, lr} - sub sp, #0x54 - ldr r5, _021E5D0C ; =ov78_021E6858 - add r4, r0, #0 - add r3, sp, #0x2c - mov r2, #5 -_021E5BB8: - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021E5BB8 - add r0, sp, #0x2c - bl GfGfx_SetBanks - ldr r0, [r4] - bl BgConfig_Alloc - add r3, sp, #0x1c - ldr r5, _021E5D10 ; =ov78_021E67E0 - str r0, [r4, #0x14] - add r2, r3, #0 - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - add r0, r2, #0 - bl SetBothScreensModesAndDisable - ldr r5, _021E5D14 ; =ov78_021E681C - add r3, sp, #0 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #0 - str r0, [r3] - add r0, sp, #0 - strb r1, [r0, #0x12] - mov r3, #4 - strb r3, [r0, #0x13] - lsl r3, r3, #0xa - str r3, [sp, #8] - mov r3, #2 - strb r3, [r0, #0x10] - ldr r0, [r4, #0x14] - add r3, r1, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #0 - bl BgClearTilemapBufferAndCommit - mov r2, #2 - add r0, sp, #0 - strb r2, [r0, #0x12] - strb r2, [r0, #0x13] - lsl r1, r2, #0xb - str r1, [sp, #8] - strb r2, [r0, #0x10] - ldr r0, [r4, #0x14] - mov r1, #1 - add r2, sp, #0 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #1 - bl BgClearTilemapBufferAndCommit - mov r1, #4 - add r0, sp, #0 - strb r1, [r0, #0x12] - mov r2, #1 - strb r2, [r0, #0x13] - lsl r1, r2, #0xb - str r1, [sp, #8] - strb r2, [r0, #0x10] - ldr r0, [r4, #0x14] - mov r1, #3 - add r2, sp, #0 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #3 - bl BgClearTilemapBufferAndCommit - mov r1, #4 - mov r3, #0 - add r0, sp, #0 - strb r3, [r0, #0x12] - strb r1, [r0, #0x13] - lsl r2, r1, #0xa - str r2, [sp, #8] - mov r2, #2 - strb r2, [r0, #0x10] - ldr r0, [r4, #0x14] - add r2, sp, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #4 - bl BgClearTilemapBufferAndCommit - mov r2, #2 - add r0, sp, #0 - strb r2, [r0, #0x12] - strb r2, [r0, #0x13] - lsl r1, r2, #0xb - str r1, [sp, #8] - strb r2, [r0, #0x10] - ldr r0, [r4, #0x14] - mov r1, #5 - add r2, sp, #0 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #5 - bl BgClearTilemapBufferAndCommit - mov r1, #4 - add r0, sp, #0 - strb r1, [r0, #0x12] - mov r2, #1 - strb r2, [r0, #0x13] - lsl r1, r2, #0xb - str r1, [sp, #8] - strb r2, [r0, #0x10] - ldr r0, [r4, #0x14] - mov r1, #7 - add r2, sp, #0 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x14] - mov r1, #7 - bl BgClearTilemapBufferAndCommit - mov r0, #0 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #1 - mov r1, #0 - bl ToggleBgLayer - mov r0, #2 - mov r1, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #0 - bl ToggleBgLayer - mov r0, #4 - mov r1, #0 - bl ToggleBgLayer - mov r0, #5 - mov r1, #0 - bl ToggleBgLayer - mov r0, #6 - mov r1, #0 - bl ToggleBgLayer - mov r0, #7 - mov r1, #0 - bl ToggleBgLayer - add sp, #0x54 - pop {r4, r5, pc} - .balign 4, 0 -_021E5D0C: .word ov78_021E6858 -_021E5D10: .word ov78_021E67E0 -_021E5D14: .word ov78_021E681C - thumb_func_end ov78_021E5BAC - - thumb_func_start ov78_021E5D18 -ov78_021E5D18: ; 0x021E5D18 - push {r4, lr} - add r4, r0, #0 - mov r0, #0 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #1 - mov r1, #0 - bl ToggleBgLayer - mov r0, #2 - mov r1, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #0 - bl ToggleBgLayer - mov r0, #4 - mov r1, #0 - bl ToggleBgLayer - mov r0, #5 - mov r1, #0 - bl ToggleBgLayer - mov r0, #6 - mov r1, #0 - bl ToggleBgLayer - mov r0, #7 - mov r1, #0 - bl ToggleBgLayer - ldr r0, [r4, #0x14] - mov r1, #0 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - mov r1, #1 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - mov r1, #3 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - mov r1, #4 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - mov r1, #5 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - mov r1, #7 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x14] - bl FreeToHeap - pop {r4, pc} - thumb_func_end ov78_021E5D18 - - thumb_func_start ov78_021E5D94 -ov78_021E5D94: ; 0x021E5D94 - push {r4, lr} - sub sp, #0x10 - ldr r1, _021E5E20 ; =_021E67D8 - add r4, r0, #0 - ldrh r2, [r1] - add r0, sp, #8 - strh r2, [r0] - ldrh r2, [r1, #2] - strh r2, [r0, #2] - ldrh r2, [r1, #4] - ldrh r1, [r1, #6] - strh r2, [r0, #4] - strh r1, [r0, #6] - bl ResetAllTextPrinters - ldr r3, [r4] - mov r0, #1 - mov r1, #0x1b - mov r2, #4 - bl NewMsgDataFromNarc - str r0, [r4, #0x38] - ldr r0, [r4] - bl MessageFormat_New - str r0, [r4, #0x3c] - mov r1, #0 - add r0, sp, #8 - strb r1, [r0] - add r1, r4, #0 - ldr r0, [r4, #0x14] - add r1, #0x18 - add r2, sp, #8 - bl AddWindow - mov r1, #0 - mov r0, #1 - lsl r0, r0, #8 - str r0, [sp] - mov r0, #0xc0 - str r0, [sp, #4] - add r0, r4, #0 - add r0, #0x18 - add r2, r1, #0 - add r3, r1, #0 - bl FillWindowPixelRect - mov r1, #4 - add r0, sp, #8 - strb r1, [r0] - add r1, r4, #0 - ldr r0, [r4, #0x14] - add r1, #0x28 - add r2, sp, #8 - bl AddWindow - mov r1, #0 - mov r0, #1 - lsl r0, r0, #8 - str r0, [sp] - mov r0, #0xc0 - add r4, #0x28 - str r0, [sp, #4] - add r0, r4, #0 - add r2, r1, #0 - add r3, r1, #0 - bl FillWindowPixelRect - add sp, #0x10 - pop {r4, pc} - .balign 4, 0 -_021E5E20: .word _021E67D8 - thumb_func_end ov78_021E5D94 - - thumb_func_start ov78_021E5E24 -ov78_021E5E24: ; 0x021E5E24 - push {r4, lr} - add r4, r0, #0 - add r0, #0x28 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x18 - bl RemoveWindow - ldr r0, [r4, #0x3c] - bl MessageFormat_Delete - ldr r0, [r4, #0x38] - bl DestroyMsgData - pop {r4, pc} - thumb_func_end ov78_021E5E24 - - thumb_func_start ov78_021E5E44 -ov78_021E5E44: ; 0x021E5E44 - add r1, r0, #0 - ldr r3, _021E5E50 ; =ov78_021E5E54 - mov r2, #0 - add r1, #0x40 - strh r2, [r1] - bx r3 - .balign 4, 0 -_021E5E50: .word ov78_021E5E54 - thumb_func_end ov78_021E5E44 - - thumb_func_start ov78_021E5E54 -ov78_021E5E54: ; 0x021E5E54 - push {r4, lr} - add r4, r0, #0 - mov r3, #0x40 - ldrsh r3, [r4, r3] - ldr r0, [r4, #0x14] - mov r1, #1 - mov r2, #3 - bl ScheduleSetBgPosText - mov r3, #0x40 - ldrsh r3, [r4, r3] - ldr r0, [r4, #0x14] - mov r1, #5 - mov r2, #3 - add r3, #0xc0 - bl ScheduleSetBgPosText - mov r3, #0x40 - ldrsh r3, [r4, r3] - ldr r0, [r4, #0x14] - mov r1, #0 - mov r2, #3 - bl ScheduleSetBgPosText - mov r3, #0x40 - ldrsh r3, [r4, r3] - ldr r0, [r4, #0x14] - mov r1, #4 - mov r2, #3 - add r3, #0xc0 - bl ScheduleSetBgPosText - ldr r0, [r4, #4] - cmp r0, #2 - bne _021E5EA0 - add r0, r4, #0 - bl ov78_021E652C -_021E5EA0: - pop {r4, pc} - .balign 4, 0 - thumb_func_end ov78_021E5E54 - - thumb_func_start ov78_021E5EA4 -ov78_021E5EA4: ; 0x021E5EA4 - push {r4, r5, r6, r7, lr} - sub sp, #0x1c - add r5, r0, #0 - ldr r0, [r5, #4] - cmp r0, #0 - bne _021E5EC4 - mov r0, #3 - str r0, [sp, #0x18] - mov r0, #9 - str r0, [sp, #0x14] - mov r0, #0xc - mov r7, #0xf - str r0, [sp, #0x10] - mov r6, #0 - mov r4, #6 - b _021E5EEE -_021E5EC4: - cmp r0, #1 - bne _021E5EDC - mov r0, #4 - str r0, [sp, #0x18] - mov r0, #0xa - str r0, [sp, #0x14] - mov r0, #0xd - mov r7, #0x10 - str r0, [sp, #0x10] - mov r6, #1 - mov r4, #7 - b _021E5EEE -_021E5EDC: - mov r0, #5 - str r0, [sp, #0x18] - mov r0, #0xb - str r0, [sp, #0x14] - mov r0, #0xe - mov r7, #0x11 - str r0, [sp, #0x10] - mov r6, #2 - mov r4, #8 -_021E5EEE: - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - add r1, r7, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #3 - bl GfGfxLoader_LoadScrnData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - ldr r1, [sp, #0x18] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #3 - bl GfGfxLoader_LoadCharData - mov r0, #0x20 - str r0, [sp] - ldr r0, [r5] - mov r2, #0 - str r0, [sp, #4] - ldr r1, [sp, #0x14] - mov r0, #0x7e - add r3, r2, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - add r1, r7, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #7 - bl GfGfxLoader_LoadScrnData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - ldr r1, [sp, #0x18] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #7 - bl GfGfxLoader_LoadCharData - mov r0, #0x20 - str r0, [sp] - ldr r0, [r5] - ldr r1, [sp, #0x14] - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #4 - mov r3, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - ldr r1, [sp, #0x10] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #1 - bl GfGfxLoader_LoadScrnData - mov r0, #0x20 - str r0, [sp] - mov r0, #0x18 - str r0, [sp, #4] - mov r1, #1 - str r1, [sp, #8] - mov r2, #0 - ldr r0, [r5, #0x14] - add r3, r2, #0 - bl BgTilemapRectChangePalette - ldr r0, [r5, #0x14] - mov r1, #1 - bl BgCommitTilemapBufferToVram - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - add r1, r6, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #1 - bl GfGfxLoader_LoadCharData - mov r3, #0x20 - str r3, [sp] - ldr r0, [r5] - add r1, r4, #0 - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - ldr r1, [sp, #0x10] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #5 - bl GfGfxLoader_LoadScrnData - mov r0, #0x20 - str r0, [sp] - mov r0, #0x18 - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - mov r2, #0 - ldr r0, [r5, #0x14] - mov r1, #5 - add r3, r2, #0 - bl BgTilemapRectChangePalette - ldr r0, [r5, #0x14] - mov r1, #5 - bl BgCommitTilemapBufferToVram - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5] - add r1, r6, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #5 - bl GfGfxLoader_LoadCharData - mov r3, #0x20 - str r3, [sp] - ldr r0, [r5] - add r1, r4, #0 - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #4 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - ldr r3, [r5] - mov r1, #0x20 - add r2, r0, #0 - bl BG_ClearCharDataRange - ldr r3, [r5] - mov r0, #4 - mov r1, #0x20 - mov r2, #0 - bl BG_ClearCharDataRange - ldr r2, [r5] - mov r0, #0 - mov r1, #0x40 - bl LoadFontPal0 - ldr r2, [r5] - mov r0, #4 - mov r1, #0x40 - bl LoadFontPal0 - add sp, #0x1c - pop {r4, r5, r6, r7, pc} - thumb_func_end ov78_021E5EA4 - - thumb_func_start ov78_021E6068 -ov78_021E6068: ; 0x021E6068 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x20 - add r5, r0, #0 - mov r0, #2 - ldr r1, [r5] - lsl r0, r0, #8 - bl String_New - add r6, r0, #0 - ldr r0, [r5, #4] - cmp r0, #2 - bne _021E608C - mov r0, #0 - str r0, [sp, #0x18] - mov r7, #0x24 - str r0, [sp, #0x14] - mov r4, #0x38 - b _021E6096 -_021E608C: - mov r0, #0x30 - mov r4, #0x40 - str r0, [sp, #0x18] - mov r7, #0x20 - str r4, [sp, #0x14] -_021E6096: - mov r0, #2 - ldr r1, [r5] - lsl r0, r0, #8 - bl String_New - str r0, [sp, #0x10] - ldr r0, [r5, #4] - cmp r0, #2 - bne _021E60D0 - ldr r0, [r5, #0x10] - cmp r0, #0 - bne _021E60B2 - bl GF_AssertFail -_021E60B2: - ldr r0, [r5, #0x10] - bl Mon_GetBoxMon - str r0, [sp, #0x1c] - ldr r0, [r5, #0x38] - ldr r2, [sp, #0x10] - mov r1, #4 - bl ReadMsgDataIntoString - ldr r0, [r5, #0x3c] - ldr r2, [sp, #0x1c] - mov r1, #1 - bl BufferBoxMonNickname - b _021E60DA -_021E60D0: - ldr r0, [r5, #0x38] - ldr r2, [sp, #0x10] - mov r1, #0 - bl ReadMsgDataIntoString -_021E60DA: - ldr r0, [r5, #0x3c] - ldr r2, [r5, #0xc] - mov r1, #0 - bl BufferPlayersName - ldr r0, [r5, #0x3c] - ldr r2, [sp, #0x10] - add r1, r6, #0 - bl StringExpandPlaceholders - str r7, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r5, #0 - ldr r3, [sp, #0x18] - str r1, [sp, #0xc] - add r0, #0x18 - add r2, r6, #0 - bl AddTextPrinterParameterized2 - str r7, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r5, #0 - ldr r3, [sp, #0x18] - add r0, #0x28 - add r2, r6, #0 - str r1, [sp, #0xc] - bl AddTextPrinterParameterized2 - ldr r0, [sp, #0x10] - bl String_Delete - ldr r0, [r5, #4] - cmp r0, #0 - bne _021E612E - mov r1, #1 - b _021E6138 -_021E612E: - cmp r0, #1 - bne _021E6136 - mov r1, #2 - b _021E6138 -_021E6136: - mov r1, #5 -_021E6138: - ldr r0, [r5, #0x38] - add r2, r6, #0 - bl ReadMsgDataIntoString - str r4, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r5, #0 - ldr r3, [sp, #0x14] - str r1, [sp, #0xc] - add r0, #0x18 - add r2, r6, #0 - bl AddTextPrinterParameterized2 - str r4, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r5, #0 - ldr r3, [sp, #0x14] - str r1, [sp, #0xc] - add r0, #0x28 - add r2, r6, #0 - bl AddTextPrinterParameterized2 - ldr r0, [r5, #4] - cmp r0, #2 - beq _021E61B4 - ldr r0, [r5, #0x38] - mov r1, #3 - add r2, r6, #0 - bl ReadMsgDataIntoString - mov r0, #0x90 - str r0, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r0, r5, #0 - add r0, #0x18 - add r2, r6, #0 - mov r3, #0x8a - str r1, [sp, #0xc] - bl AddTextPrinterParameterized2 - mov r0, #0x90 - str r0, [sp] - mov r1, #0 - ldr r0, _021E61C0 ; =0x00010200 - str r1, [sp, #4] - str r0, [sp, #8] - add r5, #0x28 - add r0, r5, #0 - add r2, r6, #0 - mov r3, #0x8a - str r1, [sp, #0xc] - bl AddTextPrinterParameterized2 -_021E61B4: - add r0, r6, #0 - bl String_Delete - add sp, #0x20 - pop {r3, r4, r5, r6, r7, pc} - nop -_021E61C0: .word 0x00010200 - thumb_func_end ov78_021E6068 - - thumb_func_start ov78_021E61C4 -ov78_021E61C4: ; 0x021E61C4 - push {r4, r5, r6, r7, lr} - sub sp, #0x34 - ldr r4, _021E6210 ; =ov78_021E6880 - add r6, r2, #0 - add r5, r3, #0 - add r7, r0, #0 - mov ip, r1 - add r3, sp, #0 - mov r2, #6 -_021E61D6: - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021E61D6 - ldr r0, [r4] - add r1, sp, #0 - str r0, [r3] - strh r6, [r1] - strh r5, [r1, #2] - add r0, sp, #0x38 - ldrb r2, [r0, #0x14] - mov r3, #3 - lsl r3, r3, #0x12 - str r2, [sp, #8] - ldrb r0, [r0, #0x10] - add r2, sp, #0 - strh r0, [r1, #6] - add r0, r7, #0 - mov r1, ip - bl SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset - mov r1, #0 - add r4, r0, #0 - bl UnkImageStruct_SetSpriteAnimActiveFlag - add r0, r4, #0 - add sp, #0x34 - pop {r4, r5, r6, r7, pc} - nop -_021E6210: .word ov78_021E6880 - thumb_func_end ov78_021E61C4 - - thumb_func_start ov78_021E6214 -ov78_021E6214: ; 0x021E6214 - push {r4, r5, r6, r7, lr} - sub sp, #0x34 - ldr r4, _021E624C ; =ov78_021E68B4 - add r6, r2, #0 - add r5, r3, #0 - add r7, r0, #0 - mov ip, r1 - add r3, sp, #0 - mov r2, #6 -_021E6226: - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021E6226 - ldr r0, [r4] - mov r1, ip - str r0, [r3] - add r0, sp, #0 - strh r6, [r0] - mov r3, #3 - strh r5, [r0, #2] - add r0, r7, #0 - add r2, sp, #0 - lsl r3, r3, #0x12 - bl SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset - add sp, #0x34 - pop {r4, r5, r6, r7, pc} - nop -_021E624C: .word ov78_021E68B4 - thumb_func_end ov78_021E6214 - - thumb_func_start ov78_021E6250 -ov78_021E6250: ; 0x021E6250 - push {r4, r5, r6, r7, lr} - sub sp, #0x34 - ldr r4, _021E6288 ; =ov78_021E68E8 - add r6, r2, #0 - add r5, r3, #0 - add r7, r0, #0 - mov ip, r1 - add r3, sp, #0 - mov r2, #6 -_021E6262: - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021E6262 - ldr r0, [r4] - mov r1, ip - str r0, [r3] - add r0, sp, #0 - strh r6, [r0] - mov r3, #3 - strh r5, [r0, #2] - add r0, r7, #0 - add r2, sp, #0 - lsl r3, r3, #0x12 - bl SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset - add sp, #0x34 - pop {r4, r5, r6, r7, pc} - nop -_021E6288: .word ov78_021E68E8 - thumb_func_end ov78_021E6250 - - thumb_func_start ov78_021E628C -ov78_021E628C: ; 0x021E628C - push {r4, r5, r6, lr} - sub sp, #0x50 - add r5, r0, #0 - ldr r0, [r5] - bl SpriteRenderer_Create - str r0, [r5, #0x44] - bl SpriteRenderer_CreateGfxHandler - add r2, sp, #0x30 - ldr r3, _021E632C ; =ov78_021E6838 - str r0, [r5, #0x48] - ldmia r3!, {r0, r1} - add r4, r2, #0 - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - ldr r6, _021E6330 ; =ov78_021E67F0 - stmia r2!, {r0, r1} - add r3, sp, #0x1c - ldmia r6!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r6!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r6] - add r1, r4, #0 - str r0, [r3] - mov r3, #0x20 - str r3, [sp, #0x1c] - ldr r0, [r5, #0x44] - bl sub_0200CF70 - ldr r0, [r5, #0x44] - ldr r1, [r5, #0x48] - mov r2, #0x20 - bl sub_0200CFF4 - ldr r4, _021E6334 ; =ov78_021E6804 - add r3, sp, #4 - add r2, r3, #0 - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r4!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5, #0x44] - ldr r1, [r5, #0x48] - bl SpriteRenderer_Init2DGfxResManagersFromCountsArray - ldr r0, [r5, #0x44] - bl SpriteRenderer_GetG2dRendererPtr - mov r2, #3 - mov r1, #0 - lsl r2, r2, #0x12 - bl G2dRenderer_SetSubSurfaceCoords - ldr r0, [r5, #0x10] - mov r1, #5 - mov r2, #0 - bl GetMonData - bl SpeciesToOverworldModelIndexOffset - add r2, r0, #0 - add r0, sp, #0 - mov r1, #0x8d - bl ReadWholeNarcMemberByIdPair - add r0, sp, #0 - ldrb r0, [r0, #1] - str r0, [r5, #0x58] - add sp, #0x50 - pop {r4, r5, r6, pc} - nop -_021E632C: .word ov78_021E6838 -_021E6330: .word ov78_021E67F0 -_021E6334: .word ov78_021E6804 - thumb_func_end ov78_021E628C - - thumb_func_start ov78_021E6338 -ov78_021E6338: ; 0x021E6338 - push {r3, r4, r5, r6, r7, lr} - add r5, r0, #0 - ldr r6, [r5, #0x44] - ldr r7, [r5, #0x48] - mov r4, #0 -_021E6342: - ldr r0, [r5, #0x4c] - cmp r0, #0 - bne _021E634C - bl GF_AssertFail -_021E634C: - ldr r0, [r5, #0x4c] - bl sub_0200D9DC - add r4, r4, #1 - add r5, r5, #4 - cmp r4, #3 - blt _021E6342 - add r0, r6, #0 - add r1, r7, #0 - bl SpriteRenderer_UnloadResourcesAndRemoveGfxHandler - add r0, r6, #0 - bl SpriteRenderer_Delete - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 - thumb_func_end ov78_021E6338 - - thumb_func_start ov78_021E636C -ov78_021E636C: ; 0x021E636C - push {r4, r5, r6, r7, lr} - sub sp, #0x14 - add r5, r0, #0 - ldr r1, [r5] - ldr r7, [r5, #0x44] - ldr r4, [r5, #0x48] - mov r0, #0xa2 - bl NARC_New - add r6, r0, #0 - mov r1, #0 - str r1, [sp] - mov r0, #2 - str r0, [sp, #4] - mov r0, #3 - str r0, [sp, #8] - str r1, [sp, #0xc] - add r0, r7, #0 - add r1, r4, #0 - add r2, r6, #0 - mov r3, #0x41 - bl SpriteRenderer_LoadPlttResObjFromOpenNarc - mov r1, #0 - str r1, [sp] - mov r0, #3 - str r0, [sp, #4] - str r1, [sp, #8] - add r0, r7, #0 - add r1, r4, #0 - add r2, r6, #0 - mov r3, #0x42 - bl SpriteRenderer_LoadCharResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - add r0, r7, #0 - add r1, r4, #0 - add r2, r6, #0 - mov r3, #0x43 - bl SpriteRenderer_LoadCellResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - add r0, r7, #0 - add r1, r4, #0 - add r2, r6, #0 - mov r3, #0x44 - bl SpriteRenderer_LoadAnimResObjFromOpenNarc - add r0, r6, #0 - bl NARC_Delete - ldr r1, [r5] - mov r0, #0x7e - bl NARC_New - str r0, [sp, #0x10] - mov r0, #0 - str r0, [sp] - mov r1, #1 - str r1, [sp, #4] - mov r0, #3 - str r0, [sp, #8] - str r1, [sp, #0xc] - ldr r2, [sp, #0x10] - add r0, r7, #0 - add r1, r4, #0 - mov r3, #0x12 - bl SpriteRenderer_LoadPlttResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #3 - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - ldr r2, [sp, #0x10] - add r0, r7, #0 - add r1, r4, #0 - mov r3, #0x13 - bl SpriteRenderer_LoadCharResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r2, [sp, #0x10] - add r0, r7, #0 - add r1, r4, #0 - mov r3, #0x14 - bl SpriteRenderer_LoadCellResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r2, [sp, #0x10] - add r0, r7, #0 - add r1, r4, #0 - mov r3, #0x15 - bl SpriteRenderer_LoadAnimResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - mov r0, #3 - str r0, [sp, #8] - mov r0, #2 - str r0, [sp, #0xc] - ldr r2, [sp, #0x10] - add r0, r7, #0 - add r1, r4, #0 - mov r3, #0x12 - bl SpriteRenderer_LoadPlttResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #3 - str r0, [sp, #4] - mov r0, #2 - str r0, [sp, #8] - ldr r6, [r5, #0x58] - ldr r2, [sp, #0x10] - lsl r3, r6, #1 - add r3, r6, r3 - add r0, r7, #0 - add r1, r4, #0 - add r3, #0x13 - bl SpriteRenderer_LoadCharResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - ldr r6, [r5, #0x58] - ldr r2, [sp, #0x10] - lsl r3, r6, #1 - add r3, r6, r3 - add r0, r7, #0 - add r1, r4, #0 - add r3, #0x14 - bl SpriteRenderer_LoadCellResObjFromOpenNarc - mov r0, #0 - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - add r1, r4, #0 - ldr r4, [r5, #0x58] - ldr r2, [sp, #0x10] - lsl r3, r4, #1 - add r3, r4, r3 - add r0, r7, #0 - add r3, #0x15 - bl SpriteRenderer_LoadAnimResObjFromOpenNarc - ldr r0, [sp, #0x10] - bl NARC_Delete - mov r0, #7 - str r0, [sp] - mov r2, #0 - str r2, [sp, #4] - ldr r4, _021E6528 ; =_021E6920 - mov r3, #6 - ldrsh r2, [r4, r2] - ldrsh r3, [r4, r3] - ldr r0, [r5, #0x44] - ldr r1, [r5, #0x48] - bl ov78_021E61C4 - str r0, [r5, #0x4c] - mov r2, #4 - mov r3, #6 - ldrsh r2, [r4, r2] - ldrsh r3, [r4, r3] - ldr r0, [r5, #0x44] - ldr r1, [r5, #0x48] - bl ov78_021E6250 - str r0, [r5, #0x50] - mov r2, #8 - mov r3, #0xa - ldrsh r2, [r4, r2] - ldrsh r3, [r4, r3] - ldr r0, [r5, #0x44] - ldr r1, [r5, #0x48] - bl ov78_021E6214 - str r0, [r5, #0x54] - ldr r0, [r5, #0x4c] - mov r1, #0 - bl UnkImageStruct_SetSpriteVisibleFlag - ldr r0, [r5, #0x50] - ldr r1, [r5, #0xc] - ldr r0, [r0] - ldr r2, [r5] - bl ov78_021E6664 - ldr r0, [r5, #0x54] - ldr r1, [r5, #0x10] - ldr r0, [r0] - ldr r2, [r5] - ldr r3, [r5, #0x58] - bl ov78_021E66D4 - mov r0, #0x10 - mov r1, #1 - bl GfGfx_EngineATogglePlanes - mov r0, #0x10 - mov r1, #1 - bl GfGfx_EngineBTogglePlanes - add sp, #0x14 - pop {r4, r5, r6, r7, pc} - nop -_021E6528: .word _021E6920 - thumb_func_end ov78_021E636C - - thumb_func_start ov78_021E652C -ov78_021E652C: ; 0x021E652C - push {r3, r4, r5, r6, r7, lr} - add r7, r0, #0 - ldr r5, _021E6568 ; =_021E6920 - mov r6, #0 - add r4, r7, #0 -_021E6536: - ldr r0, [r4, #0x4c] - cmp r0, #0 - bne _021E6540 - bl GF_AssertFail -_021E6540: - mov r2, #2 - mov r3, #0x40 - ldrsh r2, [r5, r2] - ldrsh r3, [r7, r3] - mov r1, #0 - ldrsh r1, [r5, r1] - sub r2, r2, r3 - lsl r2, r2, #0x10 - mov r3, #3 - ldr r0, [r4, #0x4c] - asr r2, r2, #0x10 - lsl r3, r3, #0x12 - bl UnkImageStruct_SetSpritePositionXY_CustomScreenYOffset - add r6, r6, #1 - add r4, r4, #4 - add r5, r5, #4 - cmp r6, #3 - blt _021E6536 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_021E6568: .word _021E6920 - thumb_func_end ov78_021E652C - - thumb_func_start ov78_021E656C -ov78_021E656C: ; 0x021E656C - push {r3, r4, r5, r6, r7, lr} - add r7, r0, #0 - add r5, r1, #0 - add r6, r2, #0 - add r4, r3, #0 - bl Sprite_GetVramType - cmp r0, #3 - beq _021E6582 - bl GF_AssertFail -_021E6582: - add r0, r5, #0 - add r1, r6, #0 - bl DC_FlushRange - add r0, r7, #0 - bl sub_02024B1C - mov r1, #1 - add r7, r0, #0 - bl NNS_G2dGetImageLocation - add r1, r0, #0 - add r0, r5, #0 - add r1, r1, r4 - add r2, r6, #0 - bl GX_LoadOBJ - add r0, r7, #0 - mov r1, #2 - bl NNS_G2dGetImageLocation - add r1, r0, #0 - add r0, r5, #0 - add r1, r1, r4 - add r2, r6, #0 - bl GXS_LoadOBJ - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 - thumb_func_end ov78_021E656C - - thumb_func_start ov78_021E65BC -ov78_021E65BC: ; 0x021E65BC - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x18 - add r5, r1, #0 - add r4, r3, #0 - mov r1, #0 - add r6, r0, #0 - str r2, [sp, #0xc] - bl thunk_Set2dSpriteVisibleFlag - mov r0, #0x51 - add r1, r4, #0 - bl NARC_New - add r1, r5, #0 - add r2, r4, #0 - str r0, [sp, #0x10] - bl NARC_AllocAndReadWholeMember - str r0, [sp, #0x14] - bl NNS_G3dGetTex - add r5, r0, #0 - ldr r0, [r5, #0x14] - mov r1, #2 - add r7, r5, r0 - add r0, r4, #0 - lsl r1, r1, #8 - bl AllocFromHeapAtEnd - mov r1, #4 - str r1, [sp] - mov r2, #0 - add r4, r0, #0 - str r1, [sp, #4] - str r4, [sp, #8] - ldr r0, [sp, #0xc] - add r3, r2, #0 - lsl r0, r0, #9 - add r0, r7, r0 - bl sub_020145B4 - mov r2, #2 - add r0, r6, #0 - add r1, r4, #0 - lsl r2, r2, #8 - mov r3, #0 - bl ov78_021E656C - add r0, r4, #0 - bl FreeToHeap - add r0, r6, #0 - bl Sprite_GetVramType - ldr r4, [r5, #0x38] - mov r1, #0x20 - add r0, r5, r4 - bl DC_FlushRange - add r0, r6, #0 - bl sub_02024B34 - add r0, r5, r4 - mov r1, #0x40 - mov r2, #0x20 - bl GX_LoadOBJPltt - add r0, r5, r4 - mov r1, #0x40 - mov r2, #0x20 - bl GXS_LoadOBJPltt - ldr r0, [sp, #0x14] - bl FreeToHeap - ldr r0, [sp, #0x10] - bl NARC_Delete - add r0, r6, #0 - mov r1, #1 - bl thunk_Set2dSpriteVisibleFlag - add sp, #0x18 - pop {r3, r4, r5, r6, r7, pc} - thumb_func_end ov78_021E65BC - - thumb_func_start ov78_021E6664 -ov78_021E6664: ; 0x021E6664 - push {r3, r4, r5, lr} - add r5, r0, #0 - add r0, r1, #0 - add r4, r2, #0 - bl PlayerProfile_GetTrainerGender - cmp r0, #0 - bne _021E6678 - mov r1, #0x45 - b _021E667A -_021E6678: - mov r1, #0x46 -_021E667A: - add r0, r5, #0 - mov r2, #0x15 - add r3, r4, #0 - bl ov78_021E65BC - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end ov78_021E6664 - - thumb_func_start ov78_021E6688 -ov78_021E6688: ; 0x021E6688 - push {r3, r4, r5, r6, r7, lr} - add r5, r0, #0 - add r6, r1, #0 - add r7, r2, #0 - cmp r5, #0 - ble _021E669A - ldr r1, _021E66CC ; =0x000001ED - cmp r5, r1 - ble _021E669E -_021E669A: - mov r4, #1 - b _021E66C6 -_021E669E: - bl SpeciesToOverworldModelIndexOffset - ldr r1, _021E66D0 ; =0x00000129 - add r4, r0, r1 - add r0, r5, #0 - bl OverworldModelLookupHasFemaleForm - cmp r0, #0 - beq _021E66B8 - cmp r7, #1 - bne _021E66C6 - add r4, r4, #1 - b _021E66C6 -_021E66B8: - add r0, r5, #0 - bl OverworldModelLookupFormCount - cmp r6, r0 - ble _021E66C4 - mov r6, #0 -_021E66C4: - add r4, r4, r6 -_021E66C6: - add r0, r4, #0 - pop {r3, r4, r5, r6, r7, pc} - nop -_021E66CC: .word 0x000001ED -_021E66D0: .word 0x00000129 - thumb_func_end ov78_021E6688 - - thumb_func_start ov78_021E66D4 -ov78_021E66D4: ; 0x021E66D4 - push {r4, r5, r6, r7, lr} - sub sp, #0x2c - add r4, r1, #0 - add r7, r0, #0 - str r2, [sp, #0xc] - add r0, r4, #0 - mov r1, #5 - mov r2, #0 - add r5, r3, #0 - bl GetMonData - str r0, [sp, #0x20] - add r0, r4, #0 - mov r1, #0x70 - mov r2, #0 - bl GetMonData - add r6, r0, #0 - add r0, r4, #0 - bl GetMonGender - str r0, [sp, #0x1c] - add r0, r4, #0 - bl MonIsShiny - str r0, [sp, #0x18] - cmp r5, #0 - beq _021E6714 - mov r4, #2 - lsl r4, r4, #0xa - mov r5, #8 - b _021E671A -_021E6714: - mov r4, #2 - lsl r4, r4, #8 - mov r5, #4 -_021E671A: - ldr r1, [sp, #0xc] - mov r0, #0x51 - bl NARC_New - str r0, [sp, #0x14] - ldr r0, [sp, #0x20] - lsl r1, r6, #0x18 - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - lsr r1, r1, #0x18 - bl sub_02070438 - cmp r0, #0 - bne _021E6738 - mov r6, #0 -_021E6738: - lsl r1, r6, #0x10 - ldr r0, [sp, #0x20] - ldr r2, [sp, #0x1c] - lsr r1, r1, #0x10 - bl ov78_021E6688 - add r1, r0, #0 - ldr r0, [sp, #0x14] - ldr r2, [sp, #0xc] - bl NARC_AllocAndReadWholeMember - str r0, [sp, #0x10] - bl NNS_G3dGetTex - ldr r1, [r0, #0x14] - str r0, [sp, #0x24] - add r6, r0, r1 - ldr r0, [sp, #0xc] - add r1, r4, #0 - bl AllocFromHeapAtEnd - str r5, [sp] - str r5, [sp, #4] - mov r2, #0 - str r0, [sp, #0x28] - str r0, [sp, #8] - lsl r0, r4, #1 - add r0, r6, r0 - add r1, r5, #0 - add r3, r2, #0 - bl sub_020145B4 - ldr r1, [sp, #0x28] - add r0, r7, #0 - add r2, r4, #0 - mov r3, #0 - bl ov78_021E656C - ldr r0, [sp, #0x28] - bl FreeToHeap - add r0, r7, #0 - bl Sprite_GetVramType - ldr r0, [sp, #0x24] - ldr r1, [r0, #0x38] - add r4, r0, r1 - ldr r0, [sp, #0x18] - cmp r0, #0 - beq _021E679E - add r4, #0x20 -_021E679E: - add r0, r4, #0 - mov r1, #0x20 - bl DC_FlushRange - add r0, r7, #0 - bl sub_02024B34 - add r0, r4, #0 - mov r1, #0x60 - mov r2, #0x20 - bl GX_LoadOBJPltt - add r0, r4, #0 - mov r1, #0x60 - mov r2, #0x20 - bl GXS_LoadOBJPltt - ldr r0, [sp, #0x10] - bl FreeToHeap - ldr r0, [sp, #0x14] - bl NARC_Delete - add r0, r7, #0 - mov r1, #1 - bl thunk_Set2dSpriteVisibleFlag - add sp, #0x2c - pop {r4, r5, r6, r7, pc} - thumb_func_end ov78_021E66D4 - - .rodata - -_021E67D8: - .byte 0x00, 0x00, 0x00, 0x20, 0x18, 0x02, 0x01, 0x00 - -ov78_021E67E0: ; 0x021E67E0 - .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov78_021E67F0: ; 0x021E67F0 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 - .byte 0x10, 0x00, 0x00, 0x00 - -ov78_021E6804: ; 0x021E6804 - .byte 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov78_021E681C: ; 0x021E681C - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov78_021E6838: ; 0x021E6838 - .byte 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 - -ov78_021E6858: ; 0x021E6858 - .byte 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov78_021E6880: ; 0x021E6880 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - -ov78_021E68B4: ; 0x021E68B4 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 - .byte 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov78_021E68E8: ; 0x021E68E8 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - .data - -_021E6920: - .byte 0x80, 0x00, 0x10, 0x00, 0x74, 0x00, 0xB4, 0x00, 0x8C, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ; 0x021E6940 diff --git a/asm/unk_0203E348.s b/asm/unk_0203E348.s index 4d7c36752..308c191e7 100644 --- a/asm/unk_0203E348.s +++ b/asm/unk_0203E348.s @@ -62,8 +62,8 @@ _020FA2E4: .word ov67_021E5900, ov67_021E5984, ov67_021E5968, FS_OVERLAY_ID(OVY_67) _020FA2F4: .word ov103_021EC940, ov103_021EC988, ov103_021EC9A4, FS_OVERLAY_ID(OVY_103) -_020FA304: - .word ov78_021E5900, ov78_021E59EC, ov78_021E5B24, FS_OVERLAY_ID(OVY_78) +sAppTemplate_Certificates: + .word CertificatesApp_Init, CertificatesApp_Run, CertificatesApp_Exit, FS_OVERLAY_ID(certificates_app) _020FA314: .word ov99_021E7818, ov99_021E794C, ov99_021E78F0, FS_OVERLAY_ID(OVY_99) _020FA324: @@ -3156,7 +3156,7 @@ LaunchCertificatesApp: ; 0x0203FA8C add r4, r0, #0 str r6, [r4, #4] ldr r0, [r5, #0xc] - ldr r1, _0203FAB0 ; =_020FA304 + ldr r1, _0203FAB0 ; =sAppTemplate_Certificates str r0, [r4] add r0, r5, #0 add r2, r4, #0 @@ -3164,7 +3164,7 @@ LaunchCertificatesApp: ; 0x0203FA8C add r0, r4, #0 pop {r4, r5, r6, pc} .balign 4, 0 -_0203FAB0: .word _020FA304 +_0203FAB0: .word sAppTemplate_Certificates thumb_func_end LaunchCertificatesApp thumb_func_start sub_0203FAB4 diff --git a/global.inc b/global.inc index ce583dbe9..8a4a2d236 100644 --- a/global.inc +++ b/global.inc @@ -97,7 +97,7 @@ FS_EXTERN_OVERLAY(OVY_74) FS_EXTERN_OVERLAY(OVY_75) FS_EXTERN_OVERLAY(credits) FS_EXTERN_OVERLAY(OVY_77) -FS_EXTERN_OVERLAY(OVY_78) +FS_EXTERN_OVERLAY(certificates_app) FS_EXTERN_OVERLAY(OVY_79) FS_EXTERN_OVERLAY(OVY_8) FS_EXTERN_OVERLAY(OVY_80) diff --git a/heartgold.us/main.sha1 b/heartgold.us/main.sha1 index 938d52f34..95ae47a6d 100644 --- a/heartgold.us/main.sha1 +++ b/heartgold.us/main.sha1 @@ -106,7 +106,7 @@ c89c5b9496cb967df817641e6c021f74ec8f37d4 *build/heartgold.us/OVY_74.sbin 2defca91fb335bec80051767f686a66e5b7f1f1f *build/heartgold.us/OVY_75.sbin 9b2eaa0c6bba33cec913d01e33ddda3f8ed3ef38 *build/heartgold.us/credits.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *build/heartgold.us/OVY_77.sbin -ff262de0394edb7421fb7b7f5fcbdccfbe652bde *build/heartgold.us/OVY_78.sbin +ff262de0394edb7421fb7b7f5fcbdccfbe652bde *build/heartgold.us/certificates_app.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *build/heartgold.us/OVY_79.sbin a6a008a9cdc439cc55a878fe6478fb23f347baec *build/heartgold.us/OVY_80.sbin 7b6f25a18e5a3496deafd27f0046e68b335f615e *build/heartgold.us/OVY_81.sbin diff --git a/include/certificates_app.h b/include/certificates_app.h new file mode 100644 index 000000000..b3c84d969 --- /dev/null +++ b/include/certificates_app.h @@ -0,0 +1,14 @@ +#ifndef POKEHEARTGOLD_CERTIFICATES_APP_H +#define POKEHEARTGOLD_CERTIFICATES_APP_H + +#include "overlay_manager.h" + +#define CERTIFICATE_JOHTO_DEX 0 +#define CERTIFICATE_NATIONAL_DEX 1 +#define CERTIFICATE_SHINY_LEAVES 2 + +BOOL CertificatesApp_Init(OVY_MANAGER *manager, int *state); +BOOL CertificatesApp_Run(OVY_MANAGER *manager, int *state); +BOOL CertificatesApp_Exit(OVY_MANAGER *manager, int *state); + +#endif diff --git a/include/unk_02023694.h b/include/unk_02023694.h index aba2d903e..27ea3ce66 100644 --- a/include/unk_02023694.h +++ b/include/unk_02023694.h @@ -65,6 +65,7 @@ void SpriteList_Delete(SpriteList *); void sub_0202457C(SpriteList *); void Sprite_Delete(Sprite *); void Sprite_SetMatrix(Sprite *, VecFx32 *); +NNSG2dImagePaletteProxy *sub_02024B34(Sprite *); NNS_G2D_VRAM_TYPE Sprite_GetVramType(Sprite*); void sub_0202487C(Sprite*, u8); void Set2dSpriteVisibleFlag(Sprite *, int); diff --git a/main.lsf b/main.lsf index efa600693..ba006b59b 100644 --- a/main.lsf +++ b/main.lsf @@ -923,10 +923,10 @@ Overlay OVY_77 { After main } -Overlay OVY_78 +Overlay certificates_app { After main - Object asm/overlay_78.o + Object src/certificates_app.o } Overlay OVY_79 { diff --git a/soulsilver.us/main.sha1 b/soulsilver.us/main.sha1 index 4cb83b5a0..3314bd75a 100644 --- a/soulsilver.us/main.sha1 +++ b/soulsilver.us/main.sha1 @@ -106,7 +106,7 @@ bbb27790c043c8b6985137283c04c8d74f4626ef *build/soulsilver.us/OVY_73.sbin f63a6664ca45d0b719979623875b97db7148eab7 *build/soulsilver.us/OVY_75.sbin 39b04344d2451a8c655cbc4ebac01fef116a5750 *build/soulsilver.us/credits.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *build/soulsilver.us/OVY_77.sbin -ff262de0394edb7421fb7b7f5fcbdccfbe652bde *build/soulsilver.us/OVY_78.sbin +ff262de0394edb7421fb7b7f5fcbdccfbe652bde *build/soulsilver.us/certificates_app.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *build/soulsilver.us/OVY_79.sbin a6a008a9cdc439cc55a878fe6478fb23f347baec *build/soulsilver.us/OVY_80.sbin 7b6f25a18e5a3496deafd27f0046e68b335f615e *build/soulsilver.us/OVY_81.sbin diff --git a/src/certificates_app.c b/src/certificates_app.c new file mode 100644 index 000000000..983c742a0 --- /dev/null +++ b/src/certificates_app.c @@ -0,0 +1,1068 @@ +#include "global.h" +#include +#include "bg_window.h" +#include "constants/mmodel.h" +#include "certificates_app.h" +#include "field_follow_poke.h" +#include "font.h" +#include "gf_gfx_loader.h" +#include "msgdata.h" +#include "msgdata/msg.naix" +#include "msgdata/msg/msg_0004.h" +#include "party.h" +#include "player_data.h" +#include "pokemon.h" +#include "save.h" +#include "system.h" +#include "text.h" +#include "unk_0200FA24.h" +#include "unk_0203E348.h" +#include "unk_0205BB1C.h" + +typedef struct CertificatesApp_Data { + HeapID heapId; + u32 certificateId; + SaveData *savedata; + PlayerProfile *profile; + Pokemon *frontPokemon; + BgConfig *bgConfig; + Window window1; + Window window2; + MsgData *msgData; + MessageFormat *msgFmt; + s16 unk40; + u16 waitFrames; + SpriteRenderer *spriteRenderer; + SpriteGfxHandler *spriteGfxHandler; + UnkImageStruct *unk4C[3]; + u32 unk58; +} CertificatesApp_Data; // size: 0x5c + +static const WindowTemplate ov78_021E67D8 = { + .bgId = 0, + .left = 0, + .top = 0, + .width = 32, + .height = 24, + .palette = 2, + .baseTile = 0x0001, +}; + +static const GraphicsModes ov78_021E67E0 = { + .dispMode = GX_DISPMODE_GRAPHICS, + .bgMode = GX_BGMODE_0, + .subMode = GX_BGMODE_0, + ._2d3dMode = GX_BG0_AS_2D, +}; + +static const Unk122_021E92D0 ov78_021E67F0 = { + .unk0 = 0, + .unk4 = 0x20000, + .unk8 = 0x4000, + .unkC = 0x10, + .unk10 = 0x10, +}; + +static const SpriteResourceCountsListUnion ov78_021E6804 = { + .numChar = 3, + .numPltt = 3, + .numCell = 3, + .numAnim = 3, + .numMcel = 0, + .numManm = 0, +}; + +static const BgTemplate ov78_021E681C = { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .size = GF_BG_SCR_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = GX_BG_AREAOVER_XLU, + .mosaic = FALSE, +}; + +static const Unk122_021E92FC ov78_021E6838 = { + .unk0 = 0, + .unk4 = 0x80, + .unk8 = 0, + .unkC = 0x20, + .unk10 = 0, + .unk14 = 0x80, + .unk18 = 0, + .unk1C = 0x20, +}; + +static const GraphicsBanks ov78_021E6858 = { + .bg = GX_VRAM_BG_128_B, + .bgextpltt = GX_VRAM_BGEXTPLTT_NONE, + .subbg = GX_VRAM_SUB_BG_128_C, + .subbgextpltt = GX_VRAM_SUB_BGEXTPLTT_NONE, + .obj = GX_VRAM_OBJ_128_A, + .objextpltt = GX_VRAM_OBJEXTPLTT_NONE, + .subobj = GX_VRAM_SUB_OBJ_16_I, + .subobjextpltt = GX_VRAM_SUB_OBJEXTPLTT_NONE, + .tex = GX_VRAM_TEX_NONE, + .texpltt = GX_VRAM_TEXPLTT_NONE, +}; + +static const UnkTemplate_0200D748 ov78_021E68B4 = { + .x = 0, + .y = 0, + .z = 0, + .animation = 0, + .spritePriority = 1, + .pal = 3, + .vram = NNS_G2D_VRAM_TYPE_MAX, + .resIdList = { 2, 2, 2, 2, 0, 0 }, + .bgPriority = 0, + .vramTransfer = 0, +}; + +static const UnkTemplate_0200D748 ov78_021E6880 = { + .x = 0, + .y = 0, + .z = 0, + .animation = 0, + .spritePriority = 0, + .pal = 0xFFFF, + .vram = NNS_G2D_VRAM_TYPE_MAX, + .resIdList = {}, + .bgPriority = 0, + .vramTransfer = 0, +}; + +static const UnkTemplate_0200D748 ov78_021E68E8 = { + .x = 0, + .y = 0, + .z = 0, + .animation = 0, + .spritePriority = 0, + .pal = 2, + .vram = NNS_G2D_VRAM_TYPE_MAX, + .resIdList = { 1, 1, 1, 1, 0, 0 }, + .bgPriority = 0, + .vramTransfer = 0, +}; + +static s16 ov78_021E6920[3][2] = { + { 128, 16 }, + { 116, 180 }, + { 140, 180 }, +}; + +// FIXME: Types are probably wrong. +extern void sub_020145B4(void *a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, void *a6); + +static void CertificatesApp_OnVBlank(CertificatesApp_Data *data); +static void CertificatesApp_SetupBgConfig(CertificatesApp_Data *data); +static void CertificatesApp_FreeBgConfig(CertificatesApp_Data *data); +static void CertificatesApp_SetupWindowsAndText(CertificatesApp_Data *data); +static void CertificatesApp_FreeWindowsAndText(CertificatesApp_Data *data); +static void ov78_021E5E44(CertificatesApp_Data *data); +static void ov78_021E5E54(CertificatesApp_Data *data); +static void ov78_021E5EA4(CertificatesApp_Data *data); +static void ov78_021E6068(CertificatesApp_Data *data); +static UnkImageStruct *ov78_021E61C4(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y, u8 animation, u8 spritePriority); +static UnkImageStruct *ov78_021E6214(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y); +static UnkImageStruct *ov78_021E6250(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y); +static void CertificatesApp_SetupSpriteRenderer(CertificatesApp_Data *data); +static void CertificatesApp_FreeSpriteRenderer(CertificatesApp_Data *data); +static void ov78_021E636C(CertificatesApp_Data *data); +static void ov78_021E652C(CertificatesApp_Data *data); +static void ov78_021E656C(Sprite *sprite, void *unkBuffer, u32 unkBufferSize, u32 srcOffset); +static void ov78_021E65BC(Sprite *sprite, u32 narcMemberNum, u32 a2, HeapID heapId); +static void ov78_021E6664(Sprite *sprite, PlayerProfile *profile, HeapID heapId); +static u32 ov78_021E6688(int species, int forme, int gender); +static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a3); + +BOOL CertificatesApp_Init(OVY_MANAGER *manager, int *state) { + CreateHeap(HEAP_ID_3, HEAP_ID_CERTIFICATES, 0x20000); + + CertificatesApp_Data *data = OverlayManager_CreateAndGetData(manager, sizeof(CertificatesApp_Data), HEAP_ID_CERTIFICATES); + memset(data, 0, sizeof(CertificatesApp_Data)); + CertificatesApp_Args *args = OverlayManager_GetArgs(manager); + + int slot = Save_GetPartyLeadAlive(args->saveData); + + // kinda late for this, isn't it? + GF_ASSERT(args != NULL); + GF_ASSERT(args->saveData != NULL); + + Party *party = SaveArray_Party_Get(args->saveData); + + data->heapId = HEAP_ID_CERTIFICATES; + data->savedata = args->saveData; + data->certificateId = args->certificateId; + data->profile = Save_PlayerData_GetProfileAddr(data->savedata); + data->frontPokemon = Party_GetMonByIndex(party, slot); + + sub_0200FBF4(0, 0); + sub_0200FBF4(1, 0); + + Main_SetVBlankIntrCB(NULL, NULL); + Main_SetHBlankIntrCB(NULL, NULL); + + GfGfx_DisableEngineAPlanes(); + GfGfx_DisableEngineBPlanes(); + GX_SetVisiblePlane(GX_PLANEMASK_NONE); + GXS_SetVisiblePlane(GX_PLANEMASK_NONE); + + SetKeyRepeatTimers(4, 8); + + CertificatesApp_SetupBgConfig(data); + CertificatesApp_SetupWindowsAndText(data); + Main_SetVBlankIntrCB((GFIntrCB)CertificatesApp_OnVBlank, data); + + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + CertificatesApp_SetupSpriteRenderer(data); + ov78_021E636C(data); + } + + GfGfx_BothDispOn(); + + return TRUE; +} + +BOOL CertificatesApp_Run(OVY_MANAGER *manager, int *state) { + CertificatesApp_Data *data = OverlayManager_GetData(manager); + BOOL ret = FALSE; + + switch (*state) { + case 0: + ov78_021E5E44(data); + ov78_021E5EA4(data); + ov78_021E6068(data); + + ToggleBgLayer(GF_BG_LYR_MAIN_0, GF_PLANE_TOGGLE_ON); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GF_PLANE_TOGGLE_ON); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GF_PLANE_TOGGLE_ON); + ToggleBgLayer(GF_BG_LYR_SUB_0, GF_PLANE_TOGGLE_ON); + ToggleBgLayer(GF_BG_LYR_SUB_1, GF_PLANE_TOGGLE_ON); + ToggleBgLayer(GF_BG_LYR_SUB_3, GF_PLANE_TOGGLE_ON); + + BeginNormalPaletteFade(0, 1, 1, RGB_BLACK, 6, 1, data->heapId); + + *state = 1; + break; + case 1: + if (IsPaletteFadeFinished() != TRUE) { + break; + } + + data->waitFrames = 0; + *state = 2; + break; + case 2: + if (data->waitFrames < 60) { + data->waitFrames++; + } else { + *state = 3; + } + break; + case 3: + if (data->unk40 > -192) { + data->unk40 -= 4; + ov78_021E5E54(data); + } else { + data->unk40 = -192; + ov78_021E5E54(data); + *state = 4; + } + break; + case 4: + if ((gSystem.newKeys & PAD_BUTTON_A) == PAD_BUTTON_A || (gSystem.newKeys & PAD_BUTTON_B) == PAD_BUTTON_B || gSystem.touchNew != 0) { + BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 6, 1, data->heapId); + *state = 5; + } + break; + case 5: + if (IsPaletteFadeFinished() == TRUE) { + ret = TRUE; + } + break; + } + + return ret; +} + +BOOL CertificatesApp_Exit(OVY_MANAGER *manager, int *state) { + CertificatesApp_Data *data = OverlayManager_GetData(manager); + HeapID heapId = data->heapId; + + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + CertificatesApp_FreeSpriteRenderer(data); + } + + CertificatesApp_FreeWindowsAndText(data); + CertificatesApp_FreeBgConfig(data); + + Main_SetVBlankIntrCB(NULL, NULL); + + OverlayManager_FreeData(manager); + + DestroyHeap(heapId); + + return TRUE; +} + +static void CertificatesApp_OnVBlank(CertificatesApp_Data *data) { + GF_ASSERT(data != NULL); + GF_ASSERT(data->bgConfig != NULL); + + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + GF_ASSERT(data->spriteGfxHandler != NULL); + sub_0200D020(data->spriteGfxHandler); + + thunk_OamManager_ApplyAndResetBuffers(); + } + + DoScheduledBgGpuUpdates(data->bgConfig); + + OS_SetIrqCheckFlag(OS_IE_VBLANK); +} + +static void CertificatesApp_SetupBgConfig(CertificatesApp_Data *data) { + GraphicsBanks banks = ov78_021E6858; + GfGfx_SetBanks(&banks); + + data->bgConfig = BgConfig_Alloc(data->heapId); + + GraphicsModes modes = ov78_021E67E0; + SetBothScreensModesAndDisable(&modes); + + BgTemplate template = ov78_021E681C; + + template.screenBase = GX_BG_SCRBASE_0x0000; + template.charBase = GX_BG_CHARBASE_0x10000; + template.bufferSize = 0x1000; + template.size = GX_BG_SCRSIZE_TEXT_256x512; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_0, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_0); + + template.screenBase = GX_BG_SCRBASE_0x1000; + template.charBase = GX_BG_CHARBASE_0x08000; + template.bufferSize = 0x1000; + template.size = GX_BG_SCRSIZE_TEXT_256x512; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_1, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1); + + template.screenBase = GX_BG_SCRBASE_0x2000; + template.charBase = GX_BG_CHARBASE_0x04000; + template.bufferSize = 0x800; + template.size = 1; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_3, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_3); + + template.screenBase = GX_BG_SCRBASE_0x0000; + template.charBase = GX_BG_CHARBASE_0x10000; + template.bufferSize = 0x1000; + template.size = GX_BG_SCRSIZE_TEXT_256x512; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_0, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_0); + + template.screenBase = GX_BG_SCRBASE_0x1000; + template.charBase = GX_BG_CHARBASE_0x08000; + template.bufferSize = 0x1000; + template.size = GX_BG_SCRSIZE_TEXT_256x512; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_1, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_1); + + template.screenBase = GX_BG_SCRBASE_0x2000; + template.charBase = GX_BG_CHARBASE_0x04000; + template.bufferSize = 0x800; + template.size = GX_BG_SCRSIZE_TEXT_512x256; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_3, &template, GF_BG_TYPE_TEXT); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_3); + + ToggleBgLayer(GF_BG_LYR_MAIN_0, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_0, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GF_PLANE_TOGGLE_OFF); +} + +static void CertificatesApp_FreeBgConfig(CertificatesApp_Data *data) { + ToggleBgLayer(GF_BG_LYR_MAIN_0, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_0, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GF_PLANE_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GF_PLANE_TOGGLE_OFF); + + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_3); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_3); + + FreeToHeap(data->bgConfig); +} + +static void CertificatesApp_SetupWindowsAndText(CertificatesApp_Data *data) { + WindowTemplate template = ov78_021E67D8; + + ResetAllTextPrinters(); + + data->msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, NARC_msg_msg_0004_bin, data->heapId); + data->msgFmt = MessageFormat_New(data->heapId); + + template.bgId = GF_BG_LYR_MAIN_0; + AddWindow(data->bgConfig, &data->window1, &template); + FillWindowPixelRect(&data->window1, 0x00, 0, 0, GX_LCD_SIZE_X, GX_LCD_SIZE_Y); + + template.bgId = GF_BG_LYR_SUB_0; + AddWindow(data->bgConfig, &data->window2, &template); + FillWindowPixelRect(&data->window2, 0x00, 0, 0, GX_LCD_SIZE_X, GX_LCD_SIZE_Y); +} + +static void CertificatesApp_FreeWindowsAndText(CertificatesApp_Data *data) { + RemoveWindow(&data->window2); + RemoveWindow(&data->window1); + + MessageFormat_Delete(data->msgFmt); + DestroyMsgData(data->msgData); +} + +void ov78_021E5E44(CertificatesApp_Data *data) { + data->unk40 = 0; + ov78_021E5E54(data); +} + +static void ov78_021E5E54(CertificatesApp_Data *data) { + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_1, BG_POS_OP_SET_Y, data->unk40); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_SUB_1, BG_POS_OP_SET_Y, data->unk40 + GX_LCD_SIZE_Y); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_0, BG_POS_OP_SET_Y, data->unk40); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_SUB_0, BG_POS_OP_SET_Y, data->unk40 + GX_LCD_SIZE_Y); + + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + ov78_021E652C(data); + } +} + +// https://decomp.me/scratch/52sOK +#ifdef NONMATCHING +static void ov78_021E5EA4(CertificatesApp_Data *data) { + u32 ncgrFileNum; + u32 nclrFileNum; + u32 nscrFileNum; + u32 ncgrFileNum2; + u32 nclrFileNum2; + u32 nscrFileNum2; + + if (data->certificateId == CERTIFICATE_JOHTO_DEX) { + ncgrFileNum = 3; + nclrFileNum = 9; + nscrFileNum = 15; + ncgrFileNum2 = 12; + nclrFileNum2 = 0; + nscrFileNum2 = 6; + } else if (data->certificateId == CERTIFICATE_NATIONAL_DEX) { + ncgrFileNum = 4; + nclrFileNum = 10; + nscrFileNum = 16; + ncgrFileNum2 = 13; + nclrFileNum2 = 1; + nscrFileNum2 = 7; + } else { // CERTIFICATE_SHINY_LEAVES + ncgrFileNum = 5; + nclrFileNum = 11; + nscrFileNum = 17; + ncgrFileNum2 = 14; + nclrFileNum2 = 2; + nscrFileNum2 = 8; + } + + GfGfxLoader_LoadScrnData(NARC_a_1_2_6, nscrFileNum, data->bgConfig, GF_BG_LYR_MAIN_3, 0, 0, FALSE, data->heapId); + GfGfxLoader_LoadCharData(NARC_a_1_2_6, ncgrFileNum, data->bgConfig, GF_BG_LYR_MAIN_3, 0, 0, FALSE, data->heapId); + GfGfxLoader_GXLoadPal(NARC_a_1_2_6, nclrFileNum, GF_BG_LYR_MAIN_0, 0, 0x20, data->heapId); + GfGfxLoader_LoadScrnData(NARC_a_1_2_6, nscrFileNum, data->bgConfig, GF_BG_LYR_SUB_3, 0, 0, FALSE, data->heapId); + GfGfxLoader_LoadCharData(NARC_a_1_2_6, ncgrFileNum, data->bgConfig, GF_BG_LYR_SUB_3, 0, 0, FALSE, data->heapId); + GfGfxLoader_GXLoadPal(NARC_a_1_2_6, nclrFileNum, GF_BG_LYR_SUB_0, 0, 0x20, data->heapId); + GfGfxLoader_LoadScrnData(NARC_a_1_2_6, nscrFileNum2, data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heapId); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, 32, 24, 1); + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_1); + + GfGfxLoader_LoadCharData(NARC_a_1_2_6, ncgrFileNum2, data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heapId); + GfGfxLoader_GXLoadPal(NARC_a_1_2_6, nclrFileNum2, GF_BG_LYR_MAIN_0, 0x20, 0x20, data->heapId); + GfGfxLoader_LoadScrnData(NARC_a_1_2_6, nscrFileNum2, data->bgConfig, GF_BG_LYR_SUB_1, 0, 0, FALSE, data->heapId); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_SUB_1, 0, 0, 32, 24, 1); + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_SUB_1); + + GfGfxLoader_LoadCharData(NARC_a_1_2_6, ncgrFileNum2, data->bgConfig, GF_BG_LYR_SUB_1, 0, 0, FALSE, data->heapId); + GfGfxLoader_GXLoadPal(NARC_a_1_2_6, nclrFileNum2, GF_BG_LYR_SUB_0, 0x20, 0x20, data->heapId); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, data->heapId); + BG_ClearCharDataRange(GF_BG_LYR_SUB_0, 0x20, 0, data->heapId); + LoadFontPal0(GF_BG_LYR_MAIN_0, GF_PAL_SLOT_OFFSET_2, data->heapId); + LoadFontPal0(GF_BG_LYR_SUB_0, GF_PAL_SLOT_OFFSET_2, data->heapId); +} +#else +static asm void ov78_021E5EA4(CertificatesApp_Data *data) { + push {r4, r5, r6, r7, lr} + sub sp, #0x1c + add r5, r0, #0 + ldr r0, [r5, #4] + cmp r0, #0 + bne _021E5EC4 + mov r0, #3 + str r0, [sp, #0x18] + mov r0, #9 + str r0, [sp, #0x14] + mov r0, #0xc + mov r7, #0xf + str r0, [sp, #0x10] + mov r6, #0 + mov r4, #6 + b _021E5EEE +_021E5EC4: + cmp r0, #1 + bne _021E5EDC + mov r0, #4 + str r0, [sp, #0x18] + mov r0, #0xa + str r0, [sp, #0x14] + mov r0, #0xd + mov r7, #0x10 + str r0, [sp, #0x10] + mov r6, #1 + mov r4, #7 + b _021E5EEE +_021E5EDC: + mov r0, #5 + str r0, [sp, #0x18] + mov r0, #0xb + str r0, [sp, #0x14] + mov r0, #0xe + mov r7, #0x11 + str r0, [sp, #0x10] + mov r6, #2 + mov r4, #8 +_021E5EEE: + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + add r1, r7, #0 + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #3 + bl GfGfxLoader_LoadScrnData + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + ldr r1, [sp, #0x18] + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #3 + bl GfGfxLoader_LoadCharData + mov r0, #0x20 + str r0, [sp] + ldr r0, [r5, #0] + mov r2, #0 + str r0, [sp, #4] + ldr r1, [sp, #0x14] + mov r0, #0x7e + add r3, r2, #0 + bl GfGfxLoader_GXLoadPal + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + add r1, r7, #0 + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #7 + bl GfGfxLoader_LoadScrnData + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + ldr r1, [sp, #0x18] + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #7 + bl GfGfxLoader_LoadCharData + mov r0, #0x20 + str r0, [sp] + ldr r0, [r5, #0] + ldr r1, [sp, #0x14] + str r0, [sp, #4] + mov r0, #0x7e + mov r2, #4 + mov r3, #0 + bl GfGfxLoader_GXLoadPal + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + ldr r1, [sp, #0x10] + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #1 + bl GfGfxLoader_LoadScrnData + mov r0, #0x20 + str r0, [sp] + mov r0, #0x18 + str r0, [sp, #4] + mov r1, #1 + str r1, [sp, #8] + mov r2, #0 + ldr r0, [r5, #0x14] + add r3, r2, #0 + bl BgTilemapRectChangePalette + ldr r0, [r5, #0x14] + mov r1, #1 + bl BgCommitTilemapBufferToVram + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + add r1, r6, #0 + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #1 + bl GfGfxLoader_LoadCharData + mov r3, #0x20 + str r3, [sp] + ldr r0, [r5, #0] + add r1, r4, #0 + str r0, [sp, #4] + mov r0, #0x7e + mov r2, #0 + bl GfGfxLoader_GXLoadPal + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + ldr r1, [sp, #0x10] + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #5 + bl GfGfxLoader_LoadScrnData + mov r0, #0x20 + str r0, [sp] + mov r0, #0x18 + str r0, [sp, #4] + mov r0, #1 + str r0, [sp, #8] + mov r2, #0 + ldr r0, [r5, #0x14] + mov r1, #5 + add r3, r2, #0 + bl BgTilemapRectChangePalette + ldr r0, [r5, #0x14] + mov r1, #5 + bl BgCommitTilemapBufferToVram + mov r0, #0 + str r0, [sp] + str r0, [sp, #4] + str r0, [sp, #8] + ldr r0, [r5, #0] + add r1, r6, #0 + str r0, [sp, #0xc] + ldr r2, [r5, #0x14] + mov r0, #0x7e + mov r3, #5 + bl GfGfxLoader_LoadCharData + mov r3, #0x20 + str r3, [sp] + ldr r0, [r5, #0] + add r1, r4, #0 + str r0, [sp, #4] + mov r0, #0x7e + mov r2, #4 + bl GfGfxLoader_GXLoadPal + mov r0, #0 + ldr r3, [r5, #0] + mov r1, #0x20 + add r2, r0, #0 + bl BG_ClearCharDataRange + ldr r3, [r5, #0] + mov r0, #4 + mov r1, #0x20 + mov r2, #0 + bl BG_ClearCharDataRange + ldr r2, [r5, #0] + mov r0, #0 + mov r1, #0x40 + bl LoadFontPal0 + ldr r2, [r5, #0] + mov r0, #4 + mov r1, #0x40 + bl LoadFontPal0 + add sp, #0x1c + pop {r4, r5, r6, r7, pc} +} +#endif + +static void ov78_021E6068(CertificatesApp_Data *data) { + String *string = String_New(512, data->heapId); + + u32 x1, x2, y1, y2; + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + x1 = 0; + y1 = 36; + x2 = 0; + y2 = 56; + } else { + x1 = 48; + y1 = 32; + x2 = 64; + y2 = 64; + } + + String *tempString = String_New(512, data->heapId); + + if (data->certificateId == CERTIFICATE_SHINY_LEAVES) { + GF_ASSERT(data->frontPokemon != NULL); + BoxPokemon *boxMon = Mon_GetBoxMon(data->frontPokemon); + ReadMsgDataIntoString(data->msgData, msg_0004_00004, tempString); + BufferBoxMonNickname(data->msgFmt, 1, boxMon); + } else { + ReadMsgDataIntoString(data->msgData, msg_0004_00000, tempString); + } + + BufferPlayersName(data->msgFmt, 0, data->profile); + StringExpandPlaceholders(data->msgFmt, string, tempString); + AddTextPrinterParameterized2(&data->window1, 0, string, x1, y1, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + AddTextPrinterParameterized2(&data->window2, 0, string, x1, y1, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + String_Delete(tempString); + + u32 msgNum; + if (data->certificateId == CERTIFICATE_JOHTO_DEX) { + msgNum = msg_0004_00001; + } else if (data->certificateId == CERTIFICATE_NATIONAL_DEX) { + msgNum = msg_0004_00002; + } else { + msgNum = msg_0004_00005; + } + ReadMsgDataIntoString(data->msgData, msgNum, string); + AddTextPrinterParameterized2(&data->window1, 0, string, x2, y2, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + AddTextPrinterParameterized2(&data->window2, 0, string, x2, y2, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + + if (data->certificateId != CERTIFICATE_SHINY_LEAVES) { + ReadMsgDataIntoString(data->msgData, msg_0004_00003, string); + AddTextPrinterParameterized2(&data->window1, 0, string, 138, 144, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + AddTextPrinterParameterized2(&data->window2, 0, string, 138, 144, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL); + } + + String_Delete(string); +} + +static UnkImageStruct *ov78_021E61C4(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y, u8 animation, u8 spritePriority) { + UnkTemplate_0200D748 template = ov78_021E6880; + template.x = x; + template.y = y; + template.spritePriority = spritePriority; + template.animation = animation; + + UnkImageStruct *unk = SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset(renderer, gfxHandler, &template, FX32_CONST(GX_LCD_SIZE_Y)); + UnkImageStruct_SetSpriteAnimActiveFlag(unk, FALSE); + return unk; +} + +static UnkImageStruct *ov78_021E6214(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y) { + UnkTemplate_0200D748 template = ov78_021E68B4; + template.x = x; + template.y = y; + + return SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset(renderer, gfxHandler, &template, FX32_CONST(GX_LCD_SIZE_Y)); +} + +static UnkImageStruct *ov78_021E6250(SpriteRenderer *renderer, SpriteGfxHandler *gfxHandler, s16 x, s16 y) { + UnkTemplate_0200D748 template = ov78_021E68E8; + template.x = x; + template.y = y; + + return SpriteRenderer_LoadResourcesAndCreateSprite_CustomBottomScreenOffset(renderer, gfxHandler, &template, FX32_CONST(GX_LCD_SIZE_Y)); +} + +static void CertificatesApp_SetupSpriteRenderer(CertificatesApp_Data *data) { + data->spriteRenderer = SpriteRenderer_Create(data->heapId); + data->spriteGfxHandler = SpriteRenderer_CreateGfxHandler(data->spriteRenderer); + + Unk122_021E92FC unkTemplate1 = ov78_021E6838; + Unk122_021E92D0 unkTemplate2 = ov78_021E67F0; + unkTemplate2.unk0 = 0x20; + sub_0200CF70(data->spriteRenderer, &unkTemplate1, &unkTemplate2, 0x20); + sub_0200CFF4(data->spriteRenderer, data->spriteGfxHandler, 0x20); + + SpriteResourceCountsListUnion counts = ov78_021E6804; + SpriteRenderer_Init2DGfxResManagersFromCountsArray(data->spriteRenderer, data->spriteGfxHandler, &counts); + + G2dRenderer_SetSubSurfaceCoords(SpriteRenderer_GetG2dRendererPtr(data->spriteRenderer), FX32_CONST(0), FX32_CONST(GX_LCD_SIZE_Y)); + + u8 tp_param_data[4]; + ReadWholeNarcMemberByIdPair(tp_param_data, NARC_fielddata_tsurepoke_tp_param, SpeciesToOverworldModelIndexOffset(GetMonData(data->frontPokemon, MON_DATA_SPECIES, NULL))); + data->unk58 = tp_param_data[1]; +} + +static void CertificatesApp_FreeSpriteRenderer(CertificatesApp_Data *data) { + SpriteRenderer *renderer = data->spriteRenderer; + SpriteGfxHandler *gfxHandler = data->spriteGfxHandler; + + for (int i = 0; i < (int)NELEMS(data->unk4C); i++) { + GF_ASSERT(data->unk4C[i] != NULL); + sub_0200D9DC(data->unk4C[i]); + } + + SpriteRenderer_UnloadResourcesAndRemoveGfxHandler(renderer, gfxHandler); + SpriteRenderer_Delete(renderer); +} + +static void ov78_021E636C(CertificatesApp_Data *data) { + SpriteRenderer *renderer = data->spriteRenderer; + SpriteGfxHandler *gfxHandler = data->spriteGfxHandler; + + { + NARC *narc = NARC_New(NARC_a_1_6_2, data->heapId); + + SpriteRenderer_LoadPlttResObjFromOpenNarc(renderer, gfxHandler, narc, 65, FALSE, 2, 3, 0); + SpriteRenderer_LoadCharResObjFromOpenNarc(renderer, gfxHandler, narc, 66, FALSE, 3, 0); + SpriteRenderer_LoadCellResObjFromOpenNarc(renderer, gfxHandler, narc, 67, FALSE, 0); + SpriteRenderer_LoadAnimResObjFromOpenNarc(renderer, gfxHandler, narc, 68, FALSE, 0); + + NARC_Delete(narc); + } + + { + NARC *narc = NARC_New(NARC_a_1_2_6, data->heapId); + + SpriteRenderer_LoadPlttResObjFromOpenNarc(renderer, gfxHandler, narc, 18, FALSE, 1, 3, 1); + SpriteRenderer_LoadCharResObjFromOpenNarc(renderer, gfxHandler, narc, 19, FALSE, 3, 1); + SpriteRenderer_LoadCellResObjFromOpenNarc(renderer, gfxHandler, narc, 20, FALSE, 1); + SpriteRenderer_LoadAnimResObjFromOpenNarc(renderer, gfxHandler, narc, 21, FALSE, 1); + + SpriteRenderer_LoadPlttResObjFromOpenNarc(renderer, gfxHandler, narc, 18, FALSE, 1, 3, 2); + SpriteRenderer_LoadCharResObjFromOpenNarc(renderer, gfxHandler, narc, 19 + (data->unk58 * 3), FALSE, 3, 2); + SpriteRenderer_LoadCellResObjFromOpenNarc(renderer, gfxHandler, narc, 20 + (data->unk58 * 3), FALSE, 2); + SpriteRenderer_LoadAnimResObjFromOpenNarc(renderer, gfxHandler, narc, 21 + (data->unk58 * 3), FALSE, 2); + + NARC_Delete(narc); + } + + data->unk4C[0] = ov78_021E61C4(data->spriteRenderer, data->spriteGfxHandler, ov78_021E6920[0][0], ov78_021E6920[1][1], 7, 0); + data->unk4C[1] = ov78_021E6250(data->spriteRenderer, data->spriteGfxHandler, ov78_021E6920[1][0], ov78_021E6920[1][1]); + data->unk4C[2] = ov78_021E6214(data->spriteRenderer, data->spriteGfxHandler, ov78_021E6920[2][0], ov78_021E6920[2][1]); + + UnkImageStruct_SetSpriteVisibleFlag(data->unk4C[0], FALSE); + ov78_021E6664(data->unk4C[1]->sprite, data->profile, data->heapId); + ov78_021E66D4(data->unk4C[2]->sprite, data->frontPokemon, data->heapId, data->unk58); + + GfGfx_EngineATogglePlanes(GX_PLANEMASK_OBJ, GF_PLANE_TOGGLE_ON); + GfGfx_EngineBTogglePlanes(GX_PLANEMASK_OBJ, GF_PLANE_TOGGLE_ON); +} + +static void ov78_021E652C(CertificatesApp_Data *data) { + for (int i = 0; i < (int)NELEMS(data->unk4C); i++) { + GF_ASSERT(data->unk4C[i] != NULL); + UnkImageStruct_SetSpritePositionXY_CustomScreenYOffset(data->unk4C[i], ov78_021E6920[i][0], ov78_021E6920[i][1] - data->unk40, FX32_CONST(GX_LCD_SIZE_Y)); + } +} + +static void ov78_021E656C(Sprite *sprite, void *unkBuffer, u32 unkBufferSize, u32 srcOffset) { + GF_ASSERT(Sprite_GetVramType(sprite) == NNS_G2D_VRAM_TYPE_MAX); + + DC_FlushRange(unkBuffer, unkBufferSize); + + NNSG2dImageProxy *proxy = sub_02024B1C(sprite); + GX_LoadOBJ(unkBuffer, (u32)((void*)NNS_G2dGetImageLocation(proxy, NNS_G2D_VRAM_TYPE_2DMAIN) + srcOffset), unkBufferSize); + GXS_LoadOBJ(unkBuffer, (u32)((void*)NNS_G2dGetImageLocation(proxy, NNS_G2D_VRAM_TYPE_2DSUB) + srcOffset), unkBufferSize); +} + +// https://decomp.me/scratch/DGOQR +#ifdef NONMATCHING +static void ov78_021E65BC(Sprite *sprite, u32 narcMemberNum, u32 a2, HeapID heapId) { + thunk_Set2dSpriteVisibleFlag(sprite, FALSE); + + NARC *narc = NARC_New(NARC_data_mmodel_mmodel, heapId); + NNSG3dResFileHeader *header = NARC_AllocAndReadWholeMember(narc, narcMemberNum, heapId); + NNSG3dResTex *tex = NNS_G3dGetTex(header); + + void *address = (void*)tex + tex->texInfo.ofsTex; + void *buffer = AllocFromHeapAtEnd(heapId, 0x200); + sub_020145B4(address + (a2 * 0x200), 4, 0, 0, 4, 4, buffer); + ov78_021E656C(sprite, buffer, 0x200, 0); + FreeToHeap(buffer); + + Sprite_GetVramType(sprite); + address = (void*)tex + tex->plttInfo.ofsPlttData; + DC_FlushRange(address, 0x20); + sub_02024B34(sprite); + GX_LoadOBJPltt(address, 0x40, 0x20); + GXS_LoadOBJPltt(address, 0x40, 0x20); + + FreeToHeap(header); + NARC_Delete(narc); + + thunk_Set2dSpriteVisibleFlag(sprite, TRUE); +} +#else +static asm void ov78_021E65BC(Sprite *sprite, u32 narcMemberNum, u32 a2, HeapID heapId) { + push {r3, r4, r5, r6, r7, lr} + sub sp, #0x18 + add r5, r1, #0 + add r4, r3, #0 + mov r1, #0 + add r6, r0, #0 + str r2, [sp, #0xc] + bl thunk_Set2dSpriteVisibleFlag + mov r0, #0x51 + add r1, r4, #0 + bl NARC_New + add r1, r5, #0 + add r2, r4, #0 + str r0, [sp, #0x10] + bl NARC_AllocAndReadWholeMember + str r0, [sp, #0x14] + bl NNS_G3dGetTex + add r5, r0, #0 + ldr r0, [r5, #0x14] + mov r1, #2 + add r7, r5, r0 + add r0, r4, #0 + lsl r1, r1, #8 + bl AllocFromHeapAtEnd + mov r1, #4 + str r1, [sp] + mov r2, #0 + add r4, r0, #0 + str r1, [sp, #4] + str r4, [sp, #8] + ldr r0, [sp, #0xc] + add r3, r2, #0 + lsl r0, r0, #9 + add r0, r7, r0 + bl sub_020145B4 + mov r2, #2 + add r0, r6, #0 + add r1, r4, #0 + lsl r2, r2, #8 + mov r3, #0 + bl ov78_021E656C + add r0, r4, #0 + bl FreeToHeap + add r0, r6, #0 + bl Sprite_GetVramType + ldr r4, [r5, #0x38] + mov r1, #0x20 + add r0, r5, r4 + bl DC_FlushRange + add r0, r6, #0 + bl sub_02024B34 + add r0, r5, r4 + mov r1, #0x40 + mov r2, #0x20 + bl GX_LoadOBJPltt + add r0, r5, r4 + mov r1, #0x40 + mov r2, #0x20 + bl GXS_LoadOBJPltt + ldr r0, [sp, #0x14] + bl FreeToHeap + ldr r0, [sp, #0x10] + bl NARC_Delete + add r0, r6, #0 + mov r1, #1 + bl thunk_Set2dSpriteVisibleFlag + add sp, #0x18 + pop {r3, r4, r5, r6, r7, pc} +} +#endif + +static void ov78_021E6664(Sprite *sprite, PlayerProfile *profile, HeapID heapId) { + u32 narcMemberNum = (PlayerProfile_GetTrainerGender(profile) == PLAYER_GENDER_MALE) ? MMODEL_HERO : MMODEL_HEROINE; + ov78_021E65BC(sprite, narcMemberNum, 21, heapId); +} + +static u32 ov78_021E6688(int species, int forme, int gender) { + u32 ret; + if (species <= SPECIES_NONE || species > MAX_SPECIES) { + ret = 1; + } else { + ret = MMODEL_FOLLOWER_MON_BASE + SpeciesToOverworldModelIndexOffset(species); + if (OverworldModelLookupHasFemaleForm(species)) { + if (gender == MON_FEMALE) { + ret++; + } + } else { + if (forme > OverworldModelLookupFormCount(species)) { + forme = 0; + } + ret += forme; + } + } + return ret; +} + +static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a3) { + u32 species = GetMonData(pokemon, MON_DATA_SPECIES, NULL); + u32 forme = GetMonData(pokemon, MON_DATA_FORM, NULL); + u32 gender = GetMonGender(pokemon); + BOOL shiny = MonIsShiny(pokemon); + + u32 bufferSize, unk; + if (a3 != 0) { + bufferSize = 0x800; + unk = 8; + } else { + bufferSize = 0x200; + unk = 4; + } + + NARC *narc = NARC_New(NARC_data_mmodel_mmodel, heapId); + + if (sub_02070438(species, forme) == 0) { + forme = 0; + } + + u32 member = ov78_021E6688(species, (u16)forme, gender); + NNSG3dResFileHeader *header = NARC_AllocAndReadWholeMember(narc, member, heapId); + NNSG3dResTex *tex = NNS_G3dGetTex(header); + void *address = (void*)tex + tex->texInfo.ofsTex; + void *buffer = AllocFromHeapAtEnd(heapId, bufferSize); + sub_020145B4(address + (bufferSize * 2), unk, 0, 0, unk, unk, buffer); + ov78_021E656C(sprite, buffer, bufferSize, 0); + FreeToHeap(buffer); + Sprite_GetVramType(sprite); + void* pointer = (void*)tex + tex->plttInfo.ofsPlttData; + if (shiny) { + pointer += 0x20; + } + + DC_FlushRange(pointer, 0x20); + sub_02024B34(sprite); + GX_LoadOBJPltt(pointer, 0x60, 0x20); + GXS_LoadOBJPltt(pointer, 0x60, 0x20); + + FreeToHeap(header); + NARC_Delete(narc); + + thunk_Set2dSpriteVisibleFlag(sprite, TRUE); +} From 6bea7194916fd9b9dcbc9fec1d170059dc7876ab Mon Sep 17 00:00:00 2001 From: tgsm Date: Wed, 15 Nov 2023 21:48:24 -0600 Subject: [PATCH 4/7] certificates_app: Match ov78_021E5EA4 Co-authored-by: cbt6 <91667135+cbt6@users.noreply.github.com> --- src/certificates_app.c | 243 +++-------------------------------------- 1 file changed, 14 insertions(+), 229 deletions(-) diff --git a/src/certificates_app.c b/src/certificates_app.c index 983c742a0..59c5d4072 100644 --- a/src/certificates_app.c +++ b/src/certificates_app.c @@ -451,37 +451,35 @@ static void ov78_021E5E54(CertificatesApp_Data *data) { } } -// https://decomp.me/scratch/52sOK -#ifdef NONMATCHING static void ov78_021E5EA4(CertificatesApp_Data *data) { + u32 nscrFileNum; u32 ncgrFileNum; u32 nclrFileNum; - u32 nscrFileNum; + u32 nscrFileNum2; u32 ncgrFileNum2; u32 nclrFileNum2; - u32 nscrFileNum2; if (data->certificateId == CERTIFICATE_JOHTO_DEX) { + nscrFileNum = 15; ncgrFileNum = 3; nclrFileNum = 9; - nscrFileNum = 15; - ncgrFileNum2 = 12; - nclrFileNum2 = 0; - nscrFileNum2 = 6; + nscrFileNum2 = 12; + ncgrFileNum2 = 0; + nclrFileNum2 = 6; } else if (data->certificateId == CERTIFICATE_NATIONAL_DEX) { + nscrFileNum = 16; ncgrFileNum = 4; nclrFileNum = 10; - nscrFileNum = 16; - ncgrFileNum2 = 13; - nclrFileNum2 = 1; - nscrFileNum2 = 7; + nscrFileNum2 = 13; + ncgrFileNum2 = 1; + nclrFileNum2 = 7; } else { // CERTIFICATE_SHINY_LEAVES + nscrFileNum = 17; ncgrFileNum = 5; nclrFileNum = 11; - nscrFileNum = 17; - ncgrFileNum2 = 14; - nclrFileNum2 = 2; - nscrFileNum2 = 8; + nscrFileNum2 = 14; + ncgrFileNum2 = 2; + nclrFileNum2 = 8; } GfGfxLoader_LoadScrnData(NARC_a_1_2_6, nscrFileNum, data->bgConfig, GF_BG_LYR_MAIN_3, 0, 0, FALSE, data->heapId); @@ -507,219 +505,6 @@ static void ov78_021E5EA4(CertificatesApp_Data *data) { LoadFontPal0(GF_BG_LYR_MAIN_0, GF_PAL_SLOT_OFFSET_2, data->heapId); LoadFontPal0(GF_BG_LYR_SUB_0, GF_PAL_SLOT_OFFSET_2, data->heapId); } -#else -static asm void ov78_021E5EA4(CertificatesApp_Data *data) { - push {r4, r5, r6, r7, lr} - sub sp, #0x1c - add r5, r0, #0 - ldr r0, [r5, #4] - cmp r0, #0 - bne _021E5EC4 - mov r0, #3 - str r0, [sp, #0x18] - mov r0, #9 - str r0, [sp, #0x14] - mov r0, #0xc - mov r7, #0xf - str r0, [sp, #0x10] - mov r6, #0 - mov r4, #6 - b _021E5EEE -_021E5EC4: - cmp r0, #1 - bne _021E5EDC - mov r0, #4 - str r0, [sp, #0x18] - mov r0, #0xa - str r0, [sp, #0x14] - mov r0, #0xd - mov r7, #0x10 - str r0, [sp, #0x10] - mov r6, #1 - mov r4, #7 - b _021E5EEE -_021E5EDC: - mov r0, #5 - str r0, [sp, #0x18] - mov r0, #0xb - str r0, [sp, #0x14] - mov r0, #0xe - mov r7, #0x11 - str r0, [sp, #0x10] - mov r6, #2 - mov r4, #8 -_021E5EEE: - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - add r1, r7, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #3 - bl GfGfxLoader_LoadScrnData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - ldr r1, [sp, #0x18] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #3 - bl GfGfxLoader_LoadCharData - mov r0, #0x20 - str r0, [sp] - ldr r0, [r5, #0] - mov r2, #0 - str r0, [sp, #4] - ldr r1, [sp, #0x14] - mov r0, #0x7e - add r3, r2, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - add r1, r7, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #7 - bl GfGfxLoader_LoadScrnData - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - ldr r1, [sp, #0x18] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #7 - bl GfGfxLoader_LoadCharData - mov r0, #0x20 - str r0, [sp] - ldr r0, [r5, #0] - ldr r1, [sp, #0x14] - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #4 - mov r3, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - ldr r1, [sp, #0x10] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #1 - bl GfGfxLoader_LoadScrnData - mov r0, #0x20 - str r0, [sp] - mov r0, #0x18 - str r0, [sp, #4] - mov r1, #1 - str r1, [sp, #8] - mov r2, #0 - ldr r0, [r5, #0x14] - add r3, r2, #0 - bl BgTilemapRectChangePalette - ldr r0, [r5, #0x14] - mov r1, #1 - bl BgCommitTilemapBufferToVram - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - add r1, r6, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #1 - bl GfGfxLoader_LoadCharData - mov r3, #0x20 - str r3, [sp] - ldr r0, [r5, #0] - add r1, r4, #0 - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #0 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - ldr r1, [sp, #0x10] - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #5 - bl GfGfxLoader_LoadScrnData - mov r0, #0x20 - str r0, [sp] - mov r0, #0x18 - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - mov r2, #0 - ldr r0, [r5, #0x14] - mov r1, #5 - add r3, r2, #0 - bl BgTilemapRectChangePalette - ldr r0, [r5, #0x14] - mov r1, #5 - bl BgCommitTilemapBufferToVram - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r5, #0] - add r1, r6, #0 - str r0, [sp, #0xc] - ldr r2, [r5, #0x14] - mov r0, #0x7e - mov r3, #5 - bl GfGfxLoader_LoadCharData - mov r3, #0x20 - str r3, [sp] - ldr r0, [r5, #0] - add r1, r4, #0 - str r0, [sp, #4] - mov r0, #0x7e - mov r2, #4 - bl GfGfxLoader_GXLoadPal - mov r0, #0 - ldr r3, [r5, #0] - mov r1, #0x20 - add r2, r0, #0 - bl BG_ClearCharDataRange - ldr r3, [r5, #0] - mov r0, #4 - mov r1, #0x20 - mov r2, #0 - bl BG_ClearCharDataRange - ldr r2, [r5, #0] - mov r0, #0 - mov r1, #0x40 - bl LoadFontPal0 - ldr r2, [r5, #0] - mov r0, #4 - mov r1, #0x40 - bl LoadFontPal0 - add sp, #0x1c - pop {r4, r5, r6, r7, pc} -} -#endif static void ov78_021E6068(CertificatesApp_Data *data) { String *string = String_New(512, data->heapId); From cecbf745011a4d0bed2ed650b0f45e65d1e8e575 Mon Sep 17 00:00:00 2001 From: tgsm Date: Wed, 15 Nov 2023 23:15:03 -0600 Subject: [PATCH 5/7] flags: Name flags 0x143, 0x144, 0x161 --- files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s | 8 ++++---- files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s | 4 ++-- include/constants/flags.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s b/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s index 68247c20b..ccbd5d9bd 100644 --- a/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s +++ b/files/fielddata/script/scr_seq/scr_seq_0798_T07R0203.s @@ -128,7 +128,7 @@ scr_seq_T07R0203_000: check_johto_dex_complete VAR_SPECIAL_RESULT compare VAR_SPECIAL_RESULT, 0 goto_if_eq _0245 - goto_if_set FLAG_UNK_143, _01ED + goto_if_set FLAG_SAW_JOHTO_DEX_CERTIFICATE, _01ED npc_msg msg_0503_T07R0203_00001 play_fanfare SEQ_ME_HYOUKA2 wait_fanfare @@ -137,7 +137,7 @@ scr_seq_T07R0203_000: wait_fade show_certificate 0 scrcmd_150 - setflag FLAG_UNK_143 + setflag FLAG_SAW_JOHTO_DEX_CERTIFICATE add_special_game_stat 25 fade_screen 6, 1, 1, RGB_BLACK wait_fade @@ -145,7 +145,7 @@ _01ED: check_national_dex_complete VAR_SPECIAL_RESULT compare VAR_SPECIAL_RESULT, 0 goto_if_eq _0245 - goto_if_set FLAG_UNK_144, _023A + goto_if_set FLAG_SAW_NATIONAL_DEX_CERTIFICATE, _023A npc_msg msg_0503_T07R0203_00002 play_fanfare SEQ_ME_HYOUKA2 wait_fanfare @@ -154,7 +154,7 @@ _01ED: wait_fade show_certificate 1 scrcmd_150 - setflag FLAG_UNK_144 + setflag FLAG_SAW_NATIONAL_DEX_CERTIFICATE add_special_game_stat 26 fade_screen 6, 1, 1, RGB_BLACK wait_fade diff --git a/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s b/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s index d20d73c43..126a76616 100644 --- a/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s +++ b/files/fielddata/script/scr_seq/scr_seq_0849_T20R0402.s @@ -44,7 +44,7 @@ _005C: _006D: get_party_lead_alive VAR_SPECIAL_x8006 get_shiny_leaf_count VAR_SPECIAL_x8006, VAR_SPECIAL_RESULT - goto_if_set FLAG_UNK_161, _00B1 + goto_if_set FLAG_SHOWED_FRIEND_A_SHINY_LEAF, _00B1 compare VAR_SPECIAL_RESULT, 1 goto_if_ge _009E _008F: @@ -56,7 +56,7 @@ _008F: end _009E: - setflag FLAG_UNK_161 + setflag FLAG_SHOWED_FRIEND_A_SHINY_LEAF buffer_players_name 0 gender_msgbox msg_0549_T20R0402_00007, msg_0549_T20R0402_00008 wait_button_or_walk_away diff --git a/include/constants/flags.h b/include/constants/flags.h index 2913eee7a..ced535ff0 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -340,8 +340,8 @@ #define FLAG_UNK_140 0x140 #define FLAG_WON_THIS_BUG_CONTEST 0x141 #define FLAG_UNK_142 0x142 -#define FLAG_UNK_143 0x143 -#define FLAG_UNK_144 0x144 +#define FLAG_SAW_JOHTO_DEX_CERTIFICATE 0x143 +#define FLAG_SAW_NATIONAL_DEX_CERTIFICATE 0x144 #define FLAG_UNK_145 0x145 #define FLAG_UNK_146 0x146 #define FLAG_UNK_147 0x147 @@ -370,7 +370,7 @@ #define FLAG_MET_MOVE_MANIAC 0x15E #define FLAG_BUG_CONTEST_OTHER_POKES_HELD 0x15F #define FLAG_ELMS_LAB_PREVENT_PLAYER_ESCAPE 0x160 -#define FLAG_UNK_161 0x161 +#define FLAG_SHOWED_FRIEND_A_SHINY_LEAF 0x161 #define FLAG_TRADE_LT_SURGE_PIKACHU 0x162 #define FLAG_GOT_RAGECANDYBAR 0x163 #define FLAG_UNK_164 0x164 From 9b1f9354b46bde3196c430e14bc357dacc4eb958 Mon Sep 17 00:00:00 2001 From: tgsm Date: Tue, 28 Nov 2023 14:58:19 -0600 Subject: [PATCH 6/7] certificates_app: Address review comments --- include/certificates_app.h | 11 ++++++++++ include/unk_02013FDC.h | 2 ++ src/certificates_app.c | 44 ++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/include/certificates_app.h b/include/certificates_app.h index b3c84d969..edd7733db 100644 --- a/include/certificates_app.h +++ b/include/certificates_app.h @@ -7,6 +7,17 @@ #define CERTIFICATE_NATIONAL_DEX 1 #define CERTIFICATE_SHINY_LEAVES 2 +typedef enum CertificatesExecStates { + CERTIFICATES_EXECSTATE_SETUP, + CERTIFICATES_EXECSTATE_FADE_IN, + CERTIFICATES_EXECSTATE_WAIT_ONE_SECOND, + CERTIFICATES_EXECSTATE_MOVE_TO_BOTTOM_SCREEN, + CERTIFICATES_EXECSTATE_WAIT_FOR_INPUT, + CERTIFICATES_EXECSTATE_FADE_OUT, + + CERTIFICATES_EXECSTATE_COUNT, +} CertificatesExecStates; + BOOL CertificatesApp_Init(OVY_MANAGER *manager, int *state); BOOL CertificatesApp_Run(OVY_MANAGER *manager, int *state); BOOL CertificatesApp_Exit(OVY_MANAGER *manager, int *state); diff --git a/include/unk_02013FDC.h b/include/unk_02013FDC.h index eca367600..1c88b7d2e 100644 --- a/include/unk_02013FDC.h +++ b/include/unk_02013FDC.h @@ -5,5 +5,7 @@ void *sub_0201442C(NarcId narcId, s32 fileId, HeapID heapId); void *sub_02014450(NarcId narcId, s32 fileId, HeapID heapId); +// FIXME: Types are probably wrong. +void sub_020145B4(void *a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, void *a6); #endif //POKEHEARTGOLD_UNK_02013FDC_H diff --git a/src/certificates_app.c b/src/certificates_app.c index 59c5d4072..1c14dbc5a 100644 --- a/src/certificates_app.c +++ b/src/certificates_app.c @@ -16,6 +16,7 @@ #include "system.h" #include "text.h" #include "unk_0200FA24.h" +#include "unk_02013FDC.h" #include "unk_0203E348.h" #include "unk_0205BB1C.h" @@ -156,9 +157,6 @@ static s16 ov78_021E6920[3][2] = { { 140, 180 }, }; -// FIXME: Types are probably wrong. -extern void sub_020145B4(void *a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, void *a6); - static void CertificatesApp_OnVBlank(CertificatesApp_Data *data); static void CertificatesApp_SetupBgConfig(CertificatesApp_Data *data); static void CertificatesApp_FreeBgConfig(CertificatesApp_Data *data); @@ -178,7 +176,7 @@ static void ov78_021E652C(CertificatesApp_Data *data); static void ov78_021E656C(Sprite *sprite, void *unkBuffer, u32 unkBufferSize, u32 srcOffset); static void ov78_021E65BC(Sprite *sprite, u32 narcMemberNum, u32 a2, HeapID heapId); static void ov78_021E6664(Sprite *sprite, PlayerProfile *profile, HeapID heapId); -static u32 ov78_021E6688(int species, int forme, int gender); +static u32 ov78_021E6688(int species, int form, int gender); static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a3); BOOL CertificatesApp_Init(OVY_MANAGER *manager, int *state) { @@ -234,7 +232,7 @@ BOOL CertificatesApp_Run(OVY_MANAGER *manager, int *state) { BOOL ret = FALSE; switch (*state) { - case 0: + case CERTIFICATES_EXECSTATE_SETUP: ov78_021E5E44(data); ov78_021E5EA4(data); ov78_021E6068(data); @@ -248,40 +246,40 @@ BOOL CertificatesApp_Run(OVY_MANAGER *manager, int *state) { BeginNormalPaletteFade(0, 1, 1, RGB_BLACK, 6, 1, data->heapId); - *state = 1; + *state = CERTIFICATES_EXECSTATE_FADE_IN; break; - case 1: + case CERTIFICATES_EXECSTATE_FADE_IN: if (IsPaletteFadeFinished() != TRUE) { break; } data->waitFrames = 0; - *state = 2; + *state = CERTIFICATES_EXECSTATE_WAIT_ONE_SECOND; break; - case 2: + case CERTIFICATES_EXECSTATE_WAIT_ONE_SECOND: if (data->waitFrames < 60) { data->waitFrames++; } else { - *state = 3; + *state = CERTIFICATES_EXECSTATE_MOVE_TO_BOTTOM_SCREEN; } break; - case 3: + case CERTIFICATES_EXECSTATE_MOVE_TO_BOTTOM_SCREEN: if (data->unk40 > -192) { data->unk40 -= 4; ov78_021E5E54(data); } else { data->unk40 = -192; ov78_021E5E54(data); - *state = 4; + *state = CERTIFICATES_EXECSTATE_WAIT_FOR_INPUT; } break; - case 4: + case CERTIFICATES_EXECSTATE_WAIT_FOR_INPUT: if ((gSystem.newKeys & PAD_BUTTON_A) == PAD_BUTTON_A || (gSystem.newKeys & PAD_BUTTON_B) == PAD_BUTTON_B || gSystem.touchNew != 0) { BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 6, 1, data->heapId); - *state = 5; + *state = CERTIFICATES_EXECSTATE_FADE_OUT; } break; - case 5: + case CERTIFICATES_EXECSTATE_FADE_OUT: if (IsPaletteFadeFinished() == TRUE) { ret = TRUE; } @@ -786,7 +784,7 @@ static void ov78_021E6664(Sprite *sprite, PlayerProfile *profile, HeapID heapId) ov78_021E65BC(sprite, narcMemberNum, 21, heapId); } -static u32 ov78_021E6688(int species, int forme, int gender) { +static u32 ov78_021E6688(int species, int form, int gender) { u32 ret; if (species <= SPECIES_NONE || species > MAX_SPECIES) { ret = 1; @@ -797,10 +795,10 @@ static u32 ov78_021E6688(int species, int forme, int gender) { ret++; } } else { - if (forme > OverworldModelLookupFormCount(species)) { - forme = 0; + if (form > OverworldModelLookupFormCount(species)) { + form = 0; } - ret += forme; + ret += form; } } return ret; @@ -808,7 +806,7 @@ static u32 ov78_021E6688(int species, int forme, int gender) { static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a3) { u32 species = GetMonData(pokemon, MON_DATA_SPECIES, NULL); - u32 forme = GetMonData(pokemon, MON_DATA_FORM, NULL); + u32 form = GetMonData(pokemon, MON_DATA_FORM, NULL); u32 gender = GetMonGender(pokemon); BOOL shiny = MonIsShiny(pokemon); @@ -823,11 +821,11 @@ static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a NARC *narc = NARC_New(NARC_data_mmodel_mmodel, heapId); - if (sub_02070438(species, forme) == 0) { - forme = 0; + if (sub_02070438(species, form) == 0) { + form = 0; } - u32 member = ov78_021E6688(species, (u16)forme, gender); + u32 member = ov78_021E6688(species, (u16)form, gender); NNSG3dResFileHeader *header = NARC_AllocAndReadWholeMember(narc, member, heapId); NNSG3dResTex *tex = NNS_G3dGetTex(header); void *address = (void*)tex + tex->texInfo.ofsTex; From c8f2b5eb9144a57f48228847af47f01df02d1ccf Mon Sep 17 00:00:00 2001 From: AtSign Date: Thu, 7 Dec 2023 08:04:05 -0800 Subject: [PATCH 7/7] Decomped unk_02018380 --- asm/include/unk_02018380.inc | 8 ---- asm/unk_02018380.s | 75 ------------------------------------ include/unk_02018380.h | 11 +++++- main.lsf | 2 +- src/unk_02018380.c | 33 ++++++++++++++++ 5 files changed, 44 insertions(+), 85 deletions(-) delete mode 100644 asm/include/unk_02018380.inc delete mode 100644 asm/unk_02018380.s create mode 100644 src/unk_02018380.c diff --git a/asm/include/unk_02018380.inc b/asm/include/unk_02018380.inc deleted file mode 100644 index 5618ece3e..000000000 --- a/asm/include/unk_02018380.inc +++ /dev/null @@ -1,8 +0,0 @@ -#include -#pragma once -.public sub_02018380 -.public sub_0201838C -.public sub_020183B0 -.public sub_020254FC -.public sub_02025504 -.public AddIGTSeconds diff --git a/asm/unk_02018380.s b/asm/unk_02018380.s deleted file mode 100644 index b9af8f43f..000000000 --- a/asm/unk_02018380.s +++ /dev/null @@ -1,75 +0,0 @@ - .include "asm/macros.inc" - .include "unk_02018380.inc" - .include "global.inc" - - .bss - -_021D10E8: - .space 0x20 - - .text - - thumb_func_start sub_02018380 -sub_02018380: ; 0x02018380 - ldr r0, _02018388 ; =_021D10E8 - mov r1, #0 - str r1, [r0] - bx lr - .balign 4, 0 -_02018388: .word _021D10E8 - thumb_func_end sub_02018380 - - thumb_func_start sub_0201838C -sub_0201838C: ; 0x0201838C - push {r3, lr} - ldr r1, _020183AC ; =_021D10E8 - mov r2, #1 - str r2, [r1] - mov r2, #0 - str r2, [r1, #0x10] - str r2, [r1, #0x14] - str r2, [r1, #8] - str r2, [r1, #0xc] - str r0, [r1, #4] - bl sub_020254FC - ldr r2, _020183AC ; =_021D10E8 - str r0, [r2, #0x18] - str r1, [r2, #0x1c] - pop {r3, pc} - .balign 4, 0 -_020183AC: .word _021D10E8 - thumb_func_end sub_0201838C - - thumb_func_start sub_020183B0 -sub_020183B0: ; 0x020183B0 - push {r3, r4, r5, lr} - ldr r0, _020183EC ; =_021D10E8 - ldr r0, [r0] - cmp r0, #0 - beq _020183EA - bl sub_020254FC - ldr r2, _020183EC ; =_021D10E8 - ldr r3, [r2, #0x18] - ldr r2, [r2, #0x1c] - sub r0, r0, r3 - sbc r1, r2 - bl sub_02025504 - add r5, r1, #0 - ldr r1, _020183EC ; =_021D10E8 - add r4, r0, #0 - ldr r3, [r1, #8] - ldr r2, [r1, #0xc] - sub r0, r3, r4 - sbc r2, r5 - bhs _020183EA - ldr r0, [r1, #4] - sub r1, r4, r3 - bl AddIGTSeconds - ldr r0, _020183EC ; =_021D10E8 - str r4, [r0, #8] - str r5, [r0, #0xc] -_020183EA: - pop {r3, r4, r5, pc} - .balign 4, 0 -_020183EC: .word _021D10E8 - thumb_func_end sub_020183B0 diff --git a/include/unk_02018380.h b/include/unk_02018380.h index 5363b6c61..6cf0f3935 100644 --- a/include/unk_02018380.h +++ b/include/unk_02018380.h @@ -3,8 +3,17 @@ #include "igt.h" +typedef struct UnkStruct_021D10E8 { + u32 unk0; + IGT *igt; + u64 unk8; + u32 unk10; + u32 unk14; + u64 unk18; +} UnkStruct_021D10E8; + void sub_02018380(void); void sub_020183B0(void); -void sub_0201838C(IGT* igt); +void sub_0201838C(IGT *igt); #endif //POKEHEARTGOLD_UNK_02018380_H diff --git a/main.lsf b/main.lsf index ba006b59b..674067d6f 100644 --- a/main.lsf +++ b/main.lsf @@ -57,7 +57,7 @@ Static main Object asm/unk_02016EDC.o Object asm/unk_02017FAC.o Object asm/unk_02018000.o - Object asm/unk_02018380.o + Object src/unk_02018380.o Object asm/unk_020183F0.o Object src/camera_translation.o Object asm/unk_020192D0.o diff --git a/src/unk_02018380.c b/src/unk_02018380.c new file mode 100644 index 000000000..8d58494c3 --- /dev/null +++ b/src/unk_02018380.c @@ -0,0 +1,33 @@ +#include "global.h" +#include "unk_02018380.h" +#include "timer_3.h" + +static UnkStruct_021D10E8 s_021D10E8; + +void sub_02018380(void) { + s_021D10E8.unk0 = 0; +} + +void sub_0201838C(IGT *igt) { + s_021D10E8.unk0 = 1; + s_021D10E8.unk10 = 0; + s_021D10E8.unk14 = 0; + s_021D10E8.unk8 = 0; + s_021D10E8.igt = igt; + s_021D10E8.unk18 = sub_020254FC(); +} + +void sub_020183B0(void) { + if (s_021D10E8.unk0 == 0) { + return; + } + + u64 val = sub_020254FC(); + u64 val2 = sub_02025504(val - s_021D10E8.unk18); + if (s_021D10E8.unk8 >= val2) { + return; + } + + AddIGTSeconds(s_021D10E8.igt, val2 - s_021D10E8.unk8); + s_021D10E8.unk8 = val2; +}