Merge branch 'master' into mystery_gift

This commit is contained in:
PikalaxALT 2023-12-09 19:14:41 -05:00 committed by GitHub
commit fdbb0d450f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 967 additions and 2082 deletions

View File

@ -1,107 +0,0 @@
#include <nitro/fs/overlay.h>
#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

View File

@ -1,8 +0,0 @@
#include <nitro/fs/overlay.h>
#pragma once
.public sub_02018380
.public sub_0201838C
.public sub_020183B0
.public sub_020254FC
.public sub_02025504
.public AddIGTSeconds

View File

@ -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
@ -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

View File

@ -2422,7 +2422,7 @@
.short \arg0
.endm
.macro scrcmd_425 arg0
.macro show_certificate arg0
.short 425
.short \arg0
.endm

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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:
@ -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
@ -3156,7 +3156,7 @@ sub_0203FA8C: ; 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,8 +3164,8 @@ sub_0203FA8C: ; 0x0203FA8C
add r0, r4, #0
pop {r4, r5, r6, pc}
.balign 4, 0
_0203FAB0: .word _020FA304
thumb_func_end sub_0203FA8C
_0203FAB0: .word sAppTemplate_Certificates
thumb_func_end LaunchCertificatesApp
thumb_func_start sub_0203FAB4
sub_0203FAB4: ; 0x0203FAB4

View File

@ -128,16 +128,16 @@ 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
closemsg
fade_screen 6, 1, 0, RGB_BLACK
wait_fade
scrcmd_425 0
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,16 +145,16 @@ _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
closemsg
fade_screen 6, 1, 0, RGB_BLACK
wait_fade
scrcmd_425 1
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

View File

@ -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
@ -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

View File

@ -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)

View File

@ -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

View File

@ -0,0 +1,25 @@
#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
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);
#endif

View File

@ -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

View File

@ -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,

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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
@ -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
{

View File

@ -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

851
src/certificates_app.c Normal file
View File

@ -0,0 +1,851 @@
#include "global.h"
#include <nitro/os/cache.h>
#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_02013FDC.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 },
};
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 form, 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 CERTIFICATES_EXECSTATE_SETUP:
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 = CERTIFICATES_EXECSTATE_FADE_IN;
break;
case CERTIFICATES_EXECSTATE_FADE_IN:
if (IsPaletteFadeFinished() != TRUE) {
break;
}
data->waitFrames = 0;
*state = CERTIFICATES_EXECSTATE_WAIT_ONE_SECOND;
break;
case CERTIFICATES_EXECSTATE_WAIT_ONE_SECOND:
if (data->waitFrames < 60) {
data->waitFrames++;
} else {
*state = CERTIFICATES_EXECSTATE_MOVE_TO_BOTTOM_SCREEN;
}
break;
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 = CERTIFICATES_EXECSTATE_WAIT_FOR_INPUT;
}
break;
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 = CERTIFICATES_EXECSTATE_FADE_OUT;
}
break;
case CERTIFICATES_EXECSTATE_FADE_OUT:
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);
}
}
static void ov78_021E5EA4(CertificatesApp_Data *data) {
u32 nscrFileNum;
u32 ncgrFileNum;
u32 nclrFileNum;
u32 nscrFileNum2;
u32 ncgrFileNum2;
u32 nclrFileNum2;
if (data->certificateId == CERTIFICATE_JOHTO_DEX) {
nscrFileNum = 15;
ncgrFileNum = 3;
nclrFileNum = 9;
nscrFileNum2 = 12;
ncgrFileNum2 = 0;
nclrFileNum2 = 6;
} else if (data->certificateId == CERTIFICATE_NATIONAL_DEX) {
nscrFileNum = 16;
ncgrFileNum = 4;
nclrFileNum = 10;
nscrFileNum2 = 13;
ncgrFileNum2 = 1;
nclrFileNum2 = 7;
} else { // CERTIFICATE_SHINY_LEAVES
nscrFileNum = 17;
ncgrFileNum = 5;
nclrFileNum = 11;
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);
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);
}
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 form, 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 (form > OverworldModelLookupFormCount(species)) {
form = 0;
}
ret += form;
}
}
return ret;
}
static void ov78_021E66D4(Sprite *sprite, Pokemon *pokemon, HeapID heapId, u32 a3) {
u32 species = GetMonData(pokemon, MON_DATA_SPECIES, NULL);
u32 form = 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, form) == 0) {
form = 0;
}
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;
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);
}

View File

@ -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,

View File

@ -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;
}

33
src/unk_02018380.c Normal file
View File

@ -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;
}

View File

@ -2635,7 +2635,7 @@
]
},
{
"name": "scrcmd_425",
"name": "show_certificate",
"args": [
2
]