diff --git a/generated/text_banks.txt b/generated/text_banks.txt index 99daf1da6ec..b91f3aa2370 100644 --- a/generated/text_banks.txt +++ b/generated/text_banks.txt @@ -546,7 +546,7 @@ TEXT_BANK_UNK_0544 TEXT_BANK_SEQ_NAMES TEXT_BANK_UNK_0546 TEXT_BANK_DAY_CARE_COMMON -TEXT_BANK_UNK_0548 +TEXT_BANK_END_CREDITS TEXT_BANK_BATTLE_HALL_SCENE TEXT_BANK_MAIN_MENU_OPTIONS TEXT_BANK_POKEMON_STAT_NAMES diff --git a/include/constants/heap.h b/include/constants/heap.h index 978ba277ba3..02c0be97f9c 100644 --- a/include/constants/heap.h +++ b/include/constants/heap.h @@ -77,7 +77,7 @@ enum HeapID { HEAP_ID_BOAT_CUTSCENE, HEAP_ID_EVOLUTION, HEAP_ID_BATTLE_TOWER_RECORDS_APP, - HEAP_ID_75, + HEAP_ID_END_CREDITS, HEAP_ID_76, HEAP_ID_GAME_START, HEAP_ID_MIGRATE_FROM_GBA, diff --git a/include/cutscenes/end_credits/common.h b/include/cutscenes/end_credits/common.h new file mode 100644 index 00000000000..67b152a9b20 --- /dev/null +++ b/include/cutscenes/end_credits/common.h @@ -0,0 +1,14 @@ +#ifndef POKEPLATINUM_END_CREDITS_COMMON_H +#define POKEPLATINUM_END_CREDITS_COMMON_H + +#include "cutscenes/end_credits/defs.h" + +#include "sprite_system.h" + +void EndCreditsCommon_Load3DModelStartingPositions(EndCreditsApp *endCreditsApp, int bikeSceneIndex); +void EndCreditsCommon_Set3DModelStartingPositions(EndCreditsApp *endCreditsApp); +BOOL EndCreditsCommon_Scroll3DModels(EndCreditsApp *endCreditsApp, s32 nightModelType); +void EndCreditsCommon_LoadMemoryImage(EndCreditsApp *endCreditsApp, int index, int bgLayer, int twinleaf); +void EndCreditsCommon_AnimatePlayerSprite(EndCreditsApp *endCreditsApp, ManagedSprite *managedSprite); + +#endif // POKEPLATINUM_END_CREDITS_COMMON_H diff --git a/include/cutscenes/end_credits/defs.h b/include/cutscenes/end_credits/defs.h new file mode 100644 index 00000000000..c9374f28c4a --- /dev/null +++ b/include/cutscenes/end_credits/defs.h @@ -0,0 +1,243 @@ +#ifndef POKEPLATINUM_END_CREDITS_DEFS_H +#define POKEPLATINUM_END_CREDITS_DEFS_H + +#include "struct_defs/clear_game_player_info.h" + +#include "bg_window.h" +#include "camera.h" +#include "easy3d_object.h" +#include "g3d_pipeline.h" +#include "message.h" +#include "narc.h" +#include "palette.h" +#include "sprite_system.h" +#include "sys_task_manager.h" + +enum EndCreditsScene { + END_CREDITS_SCENE_BIKE_MORNING = 0, + END_CREDITS_SCENE_MEMORIES_1, + END_CREDITS_SCENE_BIKE_DAY, + END_CREDITS_SCENE_MEMORIES_2, + END_CREDITS_SCENE_BIKE_NIGHT, + END_CREDITS_SCENE_TWINLEAF, + END_CREDITS_SCENE_FIN, + + END_CREDITS_SCENE_COUNT +}; + +enum EndCreditsManagedSpriteType { + END_CREDITS_SPRITE_MORNING_PLAYER = 0, + END_CREDITS_SPRITE_MORNING_SCARF, + END_CREDITS_SPRITE_MORNING_DRIFLOON_1, + END_CREDITS_SPRITE_MORNING_DRIFLOON_2, + END_CREDITS_SPRITE_MORNING_DRIFLOON_3, + + END_CREDITS_SPRITE_DAY_PLAYER = 0, + END_CREDITS_SPRITE_DAY_SCARF, + END_CREDITS_SPRITE_DAY_WINGULL_1, + END_CREDITS_SPRITE_DAY_WINGULL_2, + END_CREDITS_SPRITE_DAY_WINGULL_3, + + END_CREDITS_SPRITE_NIGHT_PLAYER = 0, + END_CREDITS_SPRITE_NIGHT_SCARF, + END_CREDITS_SPRITE_NIGHT_MAGNEZONE, + END_CREDITS_SPRITE_NIGHT_METEOR_1, + END_CREDITS_SPRITE_NIGHT_METEOR_2, + + END_CREDITS_SPRITE_COUNT +}; + +enum EndCreditsSkipState { + END_CREDITS_SKIP_STATE_NOT_SKIPPED = 0, + END_CREDITS_SKIP_STATE_SKIPPING, + END_CREDITS_SKIP_STATE_SKIPPED, +}; + +enum EndCreditsMemory { + END_CREDITS_MEMORY_ROUTE_201_STARTER = 0, + END_CREDITS_MEMORY_ROWANS_LAB, + END_CREDITS_MEMORY_POKEMON_CENTER, + END_CREDITS_MEMORY_VALLEY_WINDWORKS, + END_CREDITS_MEMORY_ROUTE_210_PSYDUCK, + END_CREDITS_MEMORY_ETERNA_FOREST, + END_CREDITS_MEMORY_PASTORIA_GREAT_MARSH, + + END_CREDITS_MEMORY_CANALAVE_BARRY, + END_CREDITS_MEMORY_LAKE_ACUITY, + END_CREDITS_MEMORY_SPEAR_PILLAR, + + END_CREDITS_MEMORY_COUNT +}; + +typedef struct Bg3DModelAnim { + s16 modelCount; + s16 speed; + fx32 startXPos; + fx32 xOffset; + fx32 startYPos; + fx32 yOffset; + fx32 startZPos; + fx32 zOffset; +} Bg3DModelAnim; + +typedef struct EndCredits3DModelManager { + Bg3DModelAnim bg3DModels[2]; +} EndCredits3DModelManager; + +typedef struct DrifloonState { + fx32 xPos; + fx32 yPos; + fx32 degrees; + s32 frame; + s16 scaleTimer; + s8 scaleDirection; +} DrifloonState; + +typedef struct EndCreditsMorningSceneData { + fx32 bgXPos; + fx32 unused_04; + DrifloonState drifloonStates[3]; +} EndCreditsMorningSceneData; + +typedef struct WingullState { + fx32 xPos; + fx32 yPos; + fx32 unused_08; + fx32 unused_0C; + fx32 degrees; + fx32 xDegrees; + fx32 yDegrees; + fx32 flyInOutSpeed; + fx32 xSpeed; + fx32 ySpeed; + fx32 xOffset; + fx32 yOffset; + s32 unused_30; + s16 startTimer; + s16 rotateTimer; + s8 rotateDirection; + u8 phase; +} WingullState; + +typedef struct EndCreditsDaySceneData { + fx32 unused_00; + fx32 bgYPos; + u16 bgPaletteBuffers[4][16]; + int currentTransitionFrame; + int fraction; + int animDirection; + WingullState wingullStates[2]; +} EndCreditsDaySceneData; + +typedef struct MagnezoneState { + fx32 xPos; + fx32 yPos; + fx32 degrees; + s16 rotateTimer; + s8 rotateDirection; +} MagnezoneState; + +typedef struct EndCreditsNightSceneData { + fx32 unused_00; + fx32 unused_04; + u16 bgPaletteBuffers[8][16]; + int currentTransitionFrame; + int fraction; + int unused_110; + int backgroundState; + u32 frames; + u8 meteorLoaded; + u8 meteorScreen; + s8 ev1; + s8 ev2; + s32 modelToRender; + MagnezoneState magnezoneStates[1]; +} EndCreditsNightSceneData; + +typedef struct EndCreditsMemoriesSceneData { + u32 framesElapsed; +} EndCreditsMemoriesSceneData; + +typedef struct EndCreditsTwinleafSceneData { + u32 framesElapsed; + u8 currentImage; + s8 ev1; + s8 ev2; + u32 plane1; +} EndCreditsTwinleafSceneData; + +typedef struct EndCreditsFinSceneData { + u32 unused_00; +} EndCreditsFinSceneData; + +typedef struct EndCreditsSceneManager { + int state; + s16 memoryCooldown; + s16 unused_06; + union { + EndCreditsMorningSceneData morningSceneData; + EndCreditsDaySceneData daySceneData; + EndCreditsNightSceneData nightSceneData; + EndCreditsMemoriesSceneData memoriesSceneData; + EndCreditsTwinleafSceneData twinleafSceneData; + EndCreditsFinSceneData finSceneData; + }; +} EndCreditsSceneManager; + +typedef struct EndCreditsStringsManager { + int topY; + int bottomY; + int bgLayer; + int entryToDraw; + int entryToErase; + BOOL unused_14; + BOOL reloadWindow; + int state; + BgConfig *bgConfig; + Window *window; + Window *window2; + MessageLoader *messageLoader; + String *string; + SysTask *sysTask; +} EndCreditsStringsManager; + +typedef struct EndCreditsPlayerAnimManager { + s16 blinkFrames; + s16 blinkState; + s16 animCount; + s16 blinkCount; +} EndCreditsPlayerAnimManager; + +typedef struct EndCreditsApp { + ClearGamePlayerInfo *clearGamePlayerInfo; + BOOL unused_04; + BgConfig *bgConfig; + PaletteData *paletteData; + G3DPipelineBuffers *g3dPipeline; + SysTask *sysTask; + SpriteSystem *spriteSystem; + SpriteManager *spriteManager; + MessageLoader *messageLoader; + Window *window; + Camera *camera; + Easy3DModel bg3DModels[4]; + Easy3DObject bg3DObjects[2][16]; + EndCredits3DModelManager modelManager; + EndCreditsSceneManager sceneManager; + ManagedSprite *managedSprites[END_CREDITS_SPRITE_COUNT]; + u8 *eyeCharData; + NARC *narc; + u32 framesElapsed; + u8 creditsSkipState; + u8 currentScene; + u8 sceneLoaded; + u8 bg3DModelLoaded; + u8 bg3DModelRows; + u8 currentMemory; + EndCreditsStringsManager *subScreenStringsManager; + EndCreditsStringsManager *mainScreenStringsManager; + BOOL creditsScrollDone; + EndCreditsPlayerAnimManager playerAnimManager; +} EndCreditsApp; + +#endif // POKEPLATINUM_END_CREDITS_DEFS_H diff --git a/include/cutscenes/end_credits/main.h b/include/cutscenes/end_credits/main.h new file mode 100644 index 00000000000..275a4c795d5 --- /dev/null +++ b/include/cutscenes/end_credits/main.h @@ -0,0 +1,14 @@ +#ifndef POKEPLATINUM_END_CREDITS_MAIN_H +#define POKEPLATINUM_END_CREDITS_MAIN_H + +#include "cutscenes/end_credits/defs.h" + +#include "overlay_manager.h" + +BOOL EndCreditsApp_Init(ApplicationManager *appMan, int *state); +BOOL EndCreditsApp_Main(ApplicationManager *appMan, int *state); +BOOL EndCreditsApp_Exit(ApplicationManager *appMan, int *state); +void EndCredits_FreeAppResources(EndCreditsApp *endCreditsApp); +void EndCredits_InitFinalScenes(EndCreditsApp *endCreditsApp); + +#endif // POKEPLATINUM_END_CREDITS_MAIN_H diff --git a/include/cutscenes/end_credits/scenes.h b/include/cutscenes/end_credits/scenes.h new file mode 100644 index 00000000000..59c65c4f83d --- /dev/null +++ b/include/cutscenes/end_credits/scenes.h @@ -0,0 +1,17 @@ +#ifndef POKEPLATINUM_END_CREDITS_SCENES_H +#define POKEPLATINUM_END_CREDITS_SCENES_H + +#include "cutscenes/end_credits/defs.h" + +void EndCreditsScenes_RunSceneLoadFuncs(EndCreditsApp *endCreditsApp, int scene); +void EndCreditsScenes_RunSceneUnloadFuncs(EndCreditsApp *endCreditsApp, int scene); +BOOL EndCreditsScenes_RunScene(EndCreditsApp *endCreditsApp, int scene); +BOOL EndCreditsMorningScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsDayScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsNightScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsMemoriesScene_Run1(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsMemoriesScene_Run2(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsTwinleafScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); +BOOL EndCreditsFinScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager); + +#endif // POKEPLATINUM_END_CREDITS_SCENES_H diff --git a/include/cutscenes/end_credits/strings.h b/include/cutscenes/end_credits/strings.h new file mode 100644 index 00000000000..9b8419fb929 --- /dev/null +++ b/include/cutscenes/end_credits/strings.h @@ -0,0 +1,14 @@ +#ifndef POKEPLATINUM_END_CREDITS_STRINGS_H +#define POKEPLATINUM_END_CREDITS_STRINGS_H + +#include "cutscenes/end_credits/defs.h" + +#include "bg_window.h" +#include "message.h" + +EndCreditsStringsManager *EndCreditsStrings_CreateManager(BgConfig *bgConfig, int startTopY, int bgLayer, int palette, MessageLoader *messageLoader); +void EndCreditsStrings_FreeManager(EndCreditsStringsManager *manager); +BOOL EndCreditsStrings_ScrollCredits(EndCreditsStringsManager *manager, int scrollSpeed); +int EndCreditsStrings_GetLastMessageID(void); + +#endif // POKEPLATINUM_END_CREDITS_STRINGS_H diff --git a/include/overlay099/const_ov99_021D4CAC.h b/include/overlay099/const_ov99_021D4CAC.h deleted file mode 100644 index 9950921e20d..00000000000 --- a/include/overlay099/const_ov99_021D4CAC.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_CONST_OV99_021D4CAC_H -#define POKEPLATINUM_CONST_OV99_021D4CAC_H - -extern const u16 Unk_ov99_021D4CAC[]; - -#endif // POKEPLATINUM_CONST_OV99_021D4CAC_H diff --git a/include/overlay099/ov99_021D0D80.h b/include/overlay099/ov99_021D0D80.h deleted file mode 100644 index b349a25f79d..00000000000 --- a/include/overlay099/ov99_021D0D80.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D0D80_H -#define POKEPLATINUM_OV99_021D0D80_H - -#include "overlay099/struct_ov99_021D2CB0.h" - -#include "overlay_manager.h" - -int ov99_021D0D80(ApplicationManager *appMan, int *param1); -int ov99_021D1028(ApplicationManager *appMan, int *param1); -int ov99_021D11A8(ApplicationManager *appMan, int *param1); -void ov99_021D1270(UnkStruct_ov99_021D2CB0 *param0); -void ov99_021D12F0(UnkStruct_ov99_021D2CB0 *param0); - -#endif // POKEPLATINUM_OV99_021D0D80_H diff --git a/include/overlay099/ov99_021D1A54.h b/include/overlay099/ov99_021D1A54.h deleted file mode 100644 index 370501c62d0..00000000000 --- a/include/overlay099/ov99_021D1A54.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D1A54_H -#define POKEPLATINUM_OV99_021D1A54_H - -#include "overlay099/struct_ov99_021D2CB0.h" - -void ov99_021D1CC8(UnkStruct_ov99_021D2CB0 *param0, int param1); -void ov99_021D1CFC(UnkStruct_ov99_021D2CB0 *param0, int param1); -BOOL ov99_021D1D30(UnkStruct_ov99_021D2CB0 *param0, int param1); - -#endif // POKEPLATINUM_OV99_021D1A54_H diff --git a/include/overlay099/ov99_021D2C08.h b/include/overlay099/ov99_021D2C08.h deleted file mode 100644 index 28d9fecf808..00000000000 --- a/include/overlay099/ov99_021D2C08.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D2C08_H -#define POKEPLATINUM_OV99_021D2C08_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D2C08(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D2C08_H diff --git a/include/overlay099/ov99_021D2E28.h b/include/overlay099/ov99_021D2E28.h deleted file mode 100644 index 24f8566095a..00000000000 --- a/include/overlay099/ov99_021D2E28.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D2E28_H -#define POKEPLATINUM_OV99_021D2E28_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D2E28(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D2E28_H diff --git a/include/overlay099/ov99_021D340C.h b/include/overlay099/ov99_021D340C.h deleted file mode 100644 index 6f4de4d835c..00000000000 --- a/include/overlay099/ov99_021D340C.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D340C_H -#define POKEPLATINUM_OV99_021D340C_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D340C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D340C_H diff --git a/include/overlay099/ov99_021D3A40.h b/include/overlay099/ov99_021D3A40.h deleted file mode 100644 index 3ad7280d512..00000000000 --- a/include/overlay099/ov99_021D3A40.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D3A40_H -#define POKEPLATINUM_OV99_021D3A40_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D3A40(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); -BOOL ov99_021D3B2C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D3A40_H diff --git a/include/overlay099/ov99_021D3C18.h b/include/overlay099/ov99_021D3C18.h deleted file mode 100644 index 5e559af43a4..00000000000 --- a/include/overlay099/ov99_021D3C18.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D3C18_H -#define POKEPLATINUM_OV99_021D3C18_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D3C18(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D3C18_H diff --git a/include/overlay099/ov99_021D3DE0.h b/include/overlay099/ov99_021D3DE0.h deleted file mode 100644 index 1f6a956f61d..00000000000 --- a/include/overlay099/ov99_021D3DE0.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D3DE0_H -#define POKEPLATINUM_OV99_021D3DE0_H - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -BOOL ov99_021D3DE0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1); - -#endif // POKEPLATINUM_OV99_021D3DE0_H diff --git a/include/overlay099/ov99_021D3E78.h b/include/overlay099/ov99_021D3E78.h deleted file mode 100644 index 5e2c44246bf..00000000000 --- a/include/overlay099/ov99_021D3E78.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D3E78_H -#define POKEPLATINUM_OV99_021D3E78_H - -#include "overlay099/struct_ov99_021D3E78_decl.h" - -#include "bg_window.h" -#include "message.h" - -UnkStruct_ov99_021D3E78 *ov99_021D3E78(BgConfig *param0, int param1, int param2, int param3, MessageLoader *param4); -void ov99_021D3F38(UnkStruct_ov99_021D3E78 *param0); -BOOL ov99_021D3F6C(UnkStruct_ov99_021D3E78 *param0, int param1); -int ov99_021D4130(void); - -#endif // POKEPLATINUM_OV99_021D3E78_H diff --git a/include/overlay099/ov99_021D4134.h b/include/overlay099/ov99_021D4134.h deleted file mode 100644 index 5cb110534f0..00000000000 --- a/include/overlay099/ov99_021D4134.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef POKEPLATINUM_OV99_021D4134_H -#define POKEPLATINUM_OV99_021D4134_H - -#include "overlay099/struct_ov99_021D2CB0.h" - -#include "sprite_system.h" - -void ov99_021D4134(UnkStruct_ov99_021D2CB0 *param0, int param1); -void ov99_021D4170(UnkStruct_ov99_021D2CB0 *param0); -BOOL ov99_021D425C(UnkStruct_ov99_021D2CB0 *param0, s32 param1); -void ov99_021D439C(UnkStruct_ov99_021D2CB0 *param0, int param1, int param2, int param3); -void ov99_021D44CC(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite *param1); - -#endif // POKEPLATINUM_OV99_021D4134_H diff --git a/include/overlay099/struct_ov99_021D2C08.h b/include/overlay099/struct_ov99_021D2C08.h deleted file mode 100644 index a4d687ff304..00000000000 --- a/include/overlay099/struct_ov99_021D2C08.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2C08_H -#define POKEPLATINUM_STRUCT_OV99_021D2C08_H - -#include "overlay099/struct_ov99_021D2D18.h" - -typedef struct { - fx32 unk_00; - fx32 unk_04; - UnkStruct_ov99_021D2D18 unk_08[3]; -} UnkStruct_ov99_021D2C08; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2C08_H diff --git a/include/overlay099/struct_ov99_021D2CB0.h b/include/overlay099/struct_ov99_021D2CB0.h deleted file mode 100644 index ec4027fc9a1..00000000000 --- a/include/overlay099/struct_ov99_021D2CB0.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2CB0_H -#define POKEPLATINUM_STRUCT_OV99_021D2CB0_H - -#include "struct_defs/clear_game_player_info.h" - -#include "overlay099/struct_ov99_021D2CB0_sub1.h" -#include "overlay099/struct_ov99_021D2CB0_sub2.h" -#include "overlay099/struct_ov99_021D3A40.h" -#include "overlay099/struct_ov99_021D3E78_decl.h" - -#include "bg_window.h" -#include "camera.h" -#include "easy3d_object.h" -#include "g3d_pipeline.h" -#include "message.h" -#include "narc.h" -#include "palette.h" -#include "sprite_system.h" -#include "sys_task_manager.h" - -typedef struct { - ClearGamePlayerInfo *unk_00; - BOOL unk_04; - BgConfig *unk_08; - PaletteData *unk_0C; - G3DPipelineBuffers *unk_10; - SysTask *unk_14; - SpriteSystem *unk_18; - SpriteManager *unk_1C; - MessageLoader *unk_20; - Window *unk_24; - Camera *camera; - Easy3DModel unk_2C[4]; - Easy3DObject unk_6C[2][16]; - UnkStruct_ov99_021D2CB0_sub1 unk_F6C; - UnkStruct_ov99_021D3A40 unk_FA4; - ManagedSprite *unk_10E0[5]; - u8 *unk_10F4; - NARC *unk_10F8; - u32 unk_10FC; - u8 unk_1100; - u8 unk_1101; - u8 unk_1102; - u8 unk_1103; - u8 unk_1104; - u8 unk_1105; - UnkStruct_ov99_021D3E78 *unk_1108; - UnkStruct_ov99_021D3E78 *unk_110C; - BOOL unk_1110; - UnkStruct_ov99_021D2CB0_sub2 unk_1114; -} UnkStruct_ov99_021D2CB0; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2CB0_H diff --git a/include/overlay099/struct_ov99_021D2CB0_sub1.h b/include/overlay099/struct_ov99_021D2CB0_sub1.h deleted file mode 100644 index fedb2ebce18..00000000000 --- a/include/overlay099/struct_ov99_021D2CB0_sub1.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB1_H -#define POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB1_H - -#include "overlay099/struct_ov99_021D5434.h" - -typedef struct { - UnkStruct_ov99_021D5434 unk_00[2]; -} UnkStruct_ov99_021D2CB0_sub1; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB1_H diff --git a/include/overlay099/struct_ov99_021D2CB0_sub2.h b/include/overlay099/struct_ov99_021D2CB0_sub2.h deleted file mode 100644 index 270f5195e60..00000000000 --- a/include/overlay099/struct_ov99_021D2CB0_sub2.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB2_H -#define POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB2_H - -typedef struct { - s16 unk_00; - s16 unk_02; - s16 unk_04; - s16 unk_06; -} UnkStruct_ov99_021D2CB0_sub2; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2CB0_SUB2_H diff --git a/include/overlay099/struct_ov99_021D2D18.h b/include/overlay099/struct_ov99_021D2D18.h deleted file mode 100644 index 7a08d819140..00000000000 --- a/include/overlay099/struct_ov99_021D2D18.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2D18_H -#define POKEPLATINUM_STRUCT_OV99_021D2D18_H - -typedef struct { - fx32 unk_00; - fx32 unk_04; - fx32 unk_08; - s32 unk_0C; - s16 unk_10; - s8 unk_12; -} UnkStruct_ov99_021D2D18; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2D18_H diff --git a/include/overlay099/struct_ov99_021D2E28.h b/include/overlay099/struct_ov99_021D2E28.h deleted file mode 100644 index 16aae0cc78a..00000000000 --- a/include/overlay099/struct_ov99_021D2E28.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2E28_H -#define POKEPLATINUM_STRUCT_OV99_021D2E28_H - -#include "overlay099/struct_ov99_021D2FD4.h" - -typedef struct { - fx32 unk_00; - fx32 unk_04; - u16 unk_08[4][16]; - int unk_88; - int unk_8C; - int unk_90; - UnkStruct_ov99_021D2FD4 unk_94[2]; -} UnkStruct_ov99_021D2E28; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2E28_H diff --git a/include/overlay099/struct_ov99_021D2FD4.h b/include/overlay099/struct_ov99_021D2FD4.h deleted file mode 100644 index 4b112ee2e7f..00000000000 --- a/include/overlay099/struct_ov99_021D2FD4.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D2FD4_H -#define POKEPLATINUM_STRUCT_OV99_021D2FD4_H - -typedef struct { - fx32 unk_00; - fx32 unk_04; - fx32 unk_08; - fx32 unk_0C; - fx32 unk_10; - fx32 unk_14; - fx32 unk_18; - fx32 unk_1C; - fx32 unk_20; - fx32 unk_24; - fx32 unk_28; - fx32 unk_2C; - s32 unk_30; - s16 unk_34; - s16 unk_36; - s8 unk_38; - u8 unk_39; -} UnkStruct_ov99_021D2FD4; - -#endif // POKEPLATINUM_STRUCT_OV99_021D2FD4_H diff --git a/include/overlay099/struct_ov99_021D340C.h b/include/overlay099/struct_ov99_021D340C.h deleted file mode 100644 index f7539ba3792..00000000000 --- a/include/overlay099/struct_ov99_021D340C.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D340C_H -#define POKEPLATINUM_STRUCT_OV99_021D340C_H - -#include "overlay099/struct_ov99_021D35E8.h" - -typedef struct { - fx32 unk_00; - fx32 unk_04; - u16 unk_08[8][16]; - int unk_108; - int unk_10C; - int unk_110; - int unk_114; - u32 unk_118; - u8 unk_11C; - u8 unk_11D; - s8 unk_11E; - s8 unk_11F; - s32 unk_120; - UnkStruct_ov99_021D35E8 unk_124[1]; -} UnkStruct_ov99_021D340C; - -#endif // POKEPLATINUM_STRUCT_OV99_021D340C_H diff --git a/include/overlay099/struct_ov99_021D35E8.h b/include/overlay099/struct_ov99_021D35E8.h deleted file mode 100644 index 470fa86bd3f..00000000000 --- a/include/overlay099/struct_ov99_021D35E8.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D35E8_H -#define POKEPLATINUM_STRUCT_OV99_021D35E8_H - -typedef struct { - fx32 unk_00; - fx32 unk_04; - fx32 unk_08; - s16 unk_0C; - s8 unk_0E; -} UnkStruct_ov99_021D35E8; - -#endif // POKEPLATINUM_STRUCT_OV99_021D35E8_H diff --git a/include/overlay099/struct_ov99_021D3A40.h b/include/overlay099/struct_ov99_021D3A40.h deleted file mode 100644 index 51fc3d62965..00000000000 --- a/include/overlay099/struct_ov99_021D3A40.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D3A40_H -#define POKEPLATINUM_STRUCT_OV99_021D3A40_H - -#include "overlay099/struct_ov99_021D2C08.h" -#include "overlay099/struct_ov99_021D2E28.h" -#include "overlay099/struct_ov99_021D340C.h" -#include "overlay099/struct_ov99_021D3B2C.h" -#include "overlay099/struct_ov99_021D3C18.h" -#include "overlay099/struct_ov99_021D3DE0.h" - -typedef struct { - int unk_00; - s16 unk_04; - s16 unk_06; - union { - UnkStruct_ov99_021D2C08 unk_08_val1; - UnkStruct_ov99_021D2E28 unk_08_val2; - UnkStruct_ov99_021D340C unk_08_val3; - UnkStruct_ov99_021D3B2C unk_08_val4; - UnkStruct_ov99_021D3C18 unk_08_val5; - UnkStruct_ov99_021D3DE0 unk_08_val6; - }; -} UnkStruct_ov99_021D3A40; - -#endif // POKEPLATINUM_STRUCT_OV99_021D3A40_H diff --git a/include/overlay099/struct_ov99_021D3B2C.h b/include/overlay099/struct_ov99_021D3B2C.h deleted file mode 100644 index 2f3475b5c44..00000000000 --- a/include/overlay099/struct_ov99_021D3B2C.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D3B2C_H -#define POKEPLATINUM_STRUCT_OV99_021D3B2C_H - -typedef struct { - u32 unk_00; -} UnkStruct_ov99_021D3B2C; - -#endif // POKEPLATINUM_STRUCT_OV99_021D3B2C_H diff --git a/include/overlay099/struct_ov99_021D3C18.h b/include/overlay099/struct_ov99_021D3C18.h deleted file mode 100644 index 5b689864b24..00000000000 --- a/include/overlay099/struct_ov99_021D3C18.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D3C18_H -#define POKEPLATINUM_STRUCT_OV99_021D3C18_H - -typedef struct { - u32 unk_00; - u8 unk_04; - s8 unk_05; - s8 unk_06; - u32 unk_08; -} UnkStruct_ov99_021D3C18; - -#endif // POKEPLATINUM_STRUCT_OV99_021D3C18_H diff --git a/include/overlay099/struct_ov99_021D3DE0.h b/include/overlay099/struct_ov99_021D3DE0.h deleted file mode 100644 index 99f90735721..00000000000 --- a/include/overlay099/struct_ov99_021D3DE0.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D3DE0_H -#define POKEPLATINUM_STRUCT_OV99_021D3DE0_H - -typedef struct { - u32 unk_00; -} UnkStruct_ov99_021D3DE0; - -#endif // POKEPLATINUM_STRUCT_OV99_021D3DE0_H diff --git a/include/overlay099/struct_ov99_021D3E78_decl.h b/include/overlay099/struct_ov99_021D3E78_decl.h deleted file mode 100644 index b451ef77405..00000000000 --- a/include/overlay099/struct_ov99_021D3E78_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D3E78_DECL_H -#define POKEPLATINUM_STRUCT_OV99_021D3E78_DECL_H - -typedef struct UnkStruct_ov99_021D3E78_t UnkStruct_ov99_021D3E78; - -#endif // POKEPLATINUM_STRUCT_OV99_021D3E78_DECL_H diff --git a/include/overlay099/struct_ov99_021D5434.h b/include/overlay099/struct_ov99_021D5434.h deleted file mode 100644 index 8948a3726ba..00000000000 --- a/include/overlay099/struct_ov99_021D5434.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV99_021D5434_H -#define POKEPLATINUM_STRUCT_OV99_021D5434_H - -typedef struct { - s16 unk_00; - s16 unk_02; - fx32 unk_04; - fx32 unk_08; - fx32 unk_0C; - fx32 unk_10; - fx32 unk_14; - fx32 unk_18; -} UnkStruct_ov99_021D5434; - -#endif // POKEPLATINUM_STRUCT_OV99_021D5434_H diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 9e14899a0c6..2feac25c715 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -95,7 +95,7 @@ void *sub_0203E1AC(FieldSystem *fieldSystem, int param1, int param2); void sub_0203E224(FieldSystem *fieldSystem); void FieldTask_StartHallOfFame(FieldSystem *fieldSystem, HallOfFameDisplayData *displayData); void *FieldTask_OpenPCHallOfFameScreen(FieldSystem *fieldSystem); -void sub_0203E274(FieldSystem *fieldSystem, ClearGamePlayerInfo *param1); +void FieldSystem_StartEndCredits(FieldSystem *fieldSystem, ClearGamePlayerInfo *clearGamePlayerInfo); void FieldSystem_OpenMoveReminderMenu(FieldSystem *fieldSystem, MoveReminderData *moveReminderData); void FieldTask_PlayBoatCutscene_CanalaveShip(FieldSystem *fieldSystem, void *taskEnv); void FieldTask_PlayBoatCutscene_SnowpointShip(FieldSystem *fieldSystem, void *taskEnv); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 7a7d9325300..16b5e39ed47 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -1482,19 +1482,19 @@ Overlay overlay98 Object main.nef.p/src_overlay098_ov98_022499C8.c.o } -Overlay overlay99 +Overlay end_credits { After main - Object main.nef.p/src_overlay099_ov99_021D0D80.c.o - Object main.nef.p/src_overlay099_ov99_021D1A54.c.o - Object main.nef.p/src_overlay099_ov99_021D2C08.c.o - Object main.nef.p/src_overlay099_ov99_021D2E28.c.o - Object main.nef.p/src_overlay099_ov99_021D340C.c.o - Object main.nef.p/src_overlay099_ov99_021D3A40.c.o - Object main.nef.p/src_overlay099_ov99_021D3C18.c.o - Object main.nef.p/src_overlay099_ov99_021D3DE0.c.o - Object main.nef.p/src_overlay099_ov99_021D3E78.c.o - Object main.nef.p/src_overlay099_ov99_021D4134.c.o + Object main.nef.p/src_cutscenes_end_credits_main.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_bike_morning.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_bike_day.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_bike_night.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_memories.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_twinleaf.c.o + Object main.nef.p/src_cutscenes_end_credits_scenes_fin.c.o + Object main.nef.p/src_cutscenes_end_credits_strings.c.o + Object main.nef.p/src_cutscenes_end_credits_common.c.o } Overlay overlay100 diff --git a/platinum.us/sbins_shared.sha1 b/platinum.us/sbins_shared.sha1 index 942f09ede0b..15069307335 100644 --- a/platinum.us/sbins_shared.sha1 +++ b/platinum.us/sbins_shared.sha1 @@ -97,7 +97,7 @@ dabd69f841fce75c91c4236925757150990af289 *cutscenes.sbin af7de8e345ff25de55130069f313b57e85d72a4f *wifi_battle_tower.sbin 138a69ea796d35f244daa36a7e9962ea2d0322e0 *main_menu.sbin 7648d3a8ca287175a5e29aef623156f11c632d98 *overlay98.sbin -e93f9eb3382856feb76c8b0ba400b7d2593db5c5 *overlay99.sbin +e93f9eb3382856feb76c8b0ba400b7d2593db5c5 *end_credits.sbin 0033be85ba8a9f1eac53e0d97090911298c7de82 *overlay100.sbin 31b95069ac95b7e75df9d29ab410dc72c14ea3b5 *overlay101.sbin 20e1299cf7365fe4e84445238d3fd3712279b1a3 *diploma.sbin diff --git a/res/text/unk_0548.json b/res/text/end_credits.json similarity index 100% rename from res/text/unk_0548.json rename to res/text/end_credits.json diff --git a/src/clear_game.c b/src/clear_game.c index 233d190bcbb..9f955e604ad 100644 --- a/src/clear_game.c +++ b/src/clear_game.c @@ -152,7 +152,7 @@ static BOOL FieldTask_DoClearGameSequence(FieldTask *task) case 8: if (IsScreenFadeDone()) { ClearGame_FreeStringRemoveWindowFreeTilemapBuffer(fieldSystem, clearGameStruct); - sub_0203E274(fieldSystem, &(clearGameStruct->playerInfo)); + FieldSystem_StartEndCredits(fieldSystem, &(clearGameStruct->playerInfo)); (*state)++; } break; diff --git a/src/cutscenes/end_credits/common.c b/src/cutscenes/end_credits/common.c new file mode 100644 index 00000000000..20aac23bb02 --- /dev/null +++ b/src/cutscenes/end_credits/common.c @@ -0,0 +1,264 @@ +#include "cutscenes/end_credits/common.h" + +#include +#include + +#include "cutscenes/end_credits/defs.h" +#include "pch/global_pch.h" + +#include "bg_window.h" +#include "easy3d_object.h" +#include "genders.h" +#include "graphics.h" +#include "heap.h" +#include "math_util.h" +#include "palette.h" +#include "sprite.h" +#include "sprite_system.h" + +typedef struct MemoryImageData { + u16 tiles; + u16 tileMap; + u16 palette; + s16 xOffset; + s16 yOffset; + u16 unused_0A[3]; +} MemoryImageData; + +static const Bg3DModelAnim sEndCredits3DModelAnims[][2] = { + { + { .modelCount = 14, .speed = 940, .startXPos = 415744, .xOffset = 116736, .startYPos = -217088, .yOffset = 178176, .startZPos = 28672, .zOffset = 290816 }, + { .modelCount = 14, .speed = 1560, .startXPos = 634880, .xOffset = 116736, .startYPos = -217088, .yOffset = 178176, .startZPos = 28672, .zOffset = 290816 }, + }, + { + { .modelCount = 14, .speed = 440, .startXPos = 415744, .xOffset = 116736, .startYPos = -217088, .yOffset = 178176, .startZPos = 28672, .zOffset = 290816 }, + { .modelCount = 0, .speed = 0, .startXPos = 0, .xOffset = 0, .startYPos = 0, .yOffset = 0, .startZPos = 0, .zOffset = 0 }, + }, + { + { .modelCount = 16, .speed = 940, .startXPos = 415744, .xOffset = 116736, .startYPos = -217088, .yOffset = 178176, .startZPos = 28672, .zOffset = 290816 }, + { .modelCount = 14, .speed = 1560, .startXPos = 634880, .xOffset = 116736, .startYPos = -217088, .yOffset = 178176, .startZPos = 28672, .zOffset = 290816 }, + }, +}; + +static const MemoryImageData sEndCreditsMaleMemories[] = { + { .tiles = 38, .tileMap = 37, .palette = 48, .xOffset = 0, .yOffset = 0 }, + { .tiles = 39, .tileMap = 37, .palette = 49, .xOffset = -32, .yOffset = -48 }, + { .tiles = 40, .tileMap = 37, .palette = 50, .xOffset = -16, .yOffset = -30 }, + { .tiles = 41, .tileMap = 37, .palette = 51, .xOffset = -42, .yOffset = -2 }, + { .tiles = 42, .tileMap = 37, .palette = 52, .xOffset = -8, .yOffset = -20 }, + { .tiles = 43, .tileMap = 37, .palette = 53, .xOffset = -50, .yOffset = -16 }, + { .tiles = 44, .tileMap = 37, .palette = 54, .xOffset = -40, .yOffset = -34 }, + { .tiles = 45, .tileMap = 37, .palette = 55, .xOffset = -16, .yOffset = -1 }, + { .tiles = 46, .tileMap = 37, .palette = 56, .xOffset = -44, .yOffset = -15 }, + { .tiles = 47, .tileMap = 37, .palette = 57, .xOffset = -30, .yOffset = -30 } +}; + +static const MemoryImageData sEndCreditsFemaleMemories[] = { + { .tiles = 58, .tileMap = 37, .palette = 68, .xOffset = 0, .yOffset = 0 }, + { .tiles = 59, .tileMap = 37, .palette = 69, .xOffset = -32, .yOffset = -48 }, + { .tiles = 60, .tileMap = 37, .palette = 70, .xOffset = -16, .yOffset = -30 }, + { .tiles = 61, .tileMap = 37, .palette = 71, .xOffset = -42, .yOffset = -2 }, + { .tiles = 62, .tileMap = 37, .palette = 72, .xOffset = -8, .yOffset = -20 }, + { .tiles = 63, .tileMap = 37, .palette = 73, .xOffset = -50, .yOffset = -16 }, + { .tiles = 64, .tileMap = 37, .palette = 74, .xOffset = -40, .yOffset = -34 }, + { .tiles = 65, .tileMap = 37, .palette = 75, .xOffset = -16, .yOffset = -1 }, + { .tiles = 66, .tileMap = 37, .palette = 76, .xOffset = -44, .yOffset = -15 }, + { .tiles = 67, .tileMap = 37, .palette = 77, .xOffset = -30, .yOffset = -30 } +}; + +static const MemoryImageData sEndCreditsMaleTwinleaf[] = { + { .tiles = 87, .tileMap = 86, .palette = 91, .xOffset = 0, .yOffset = 0 }, + { .tiles = 88, .tileMap = 86, .palette = 92, .xOffset = 0, .yOffset = 0 }, + { .tiles = 89, .tileMap = 86, .palette = 93, .xOffset = 0, .yOffset = 0 }, + { .tiles = 90, .tileMap = 86, .palette = 94, .xOffset = 0, .yOffset = 0 } +}; + +static const MemoryImageData sEndCreditsFemaleTwinleaf[] = { + { .tiles = 95, .tileMap = 86, .palette = 99, .xOffset = 0, .yOffset = 0 }, + { .tiles = 96, .tileMap = 86, .palette = 100, .xOffset = 0, .yOffset = 0 }, + { .tiles = 97, .tileMap = 86, .palette = 101, .xOffset = 0, .yOffset = 0 }, + { .tiles = 98, .tileMap = 86, .palette = 102, .xOffset = 0, .yOffset = 0 } +}; + +void EndCreditsCommon_Load3DModelStartingPositions(EndCreditsApp *endCreditsApp, int bikeSceneIndex) +{ + for (int i = 0; i < SNELEMS(endCreditsApp->modelManager.bg3DModels); i++) { + endCreditsApp->modelManager.bg3DModels[i] = sEndCredits3DModelAnims[bikeSceneIndex][i]; + } +} + +void EndCreditsCommon_Set3DModelStartingPositions(EndCreditsApp *endCreditsApp) +{ + int j; + + for (int i = 0; i < endCreditsApp->bg3DModelRows; i++) { + Bg3DModelAnim *modelAnim = &endCreditsApp->modelManager.bg3DModels[i]; + GF_ASSERT(modelAnim->modelCount <= 16); + + for (j = 0; j < modelAnim->modelCount; j++) { + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[i][j], modelAnim->startXPos - modelAnim->xOffset * j, modelAnim->startYPos - modelAnim->yOffset * j, modelAnim->startZPos - modelAnim->zOffset * j); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[i][j], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[i][j], TRUE); + } + + for (; j < SNELEMS(endCreditsApp->bg3DObjects[i]); j++) { + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[i][j], 0, (-64 * FX32_ONE), (-50 * FX32_ONE)); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[i][j], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[i][j], FALSE); + } + } +} + +BOOL EndCreditsCommon_Scroll3DModels(EndCreditsApp *endCreditsApp, s32 nightModelType) +{ + fx32 nextXPos, nextYPos, nextZPos; + fx32 currentXPos, currentYPos, currentZPos; + BOOL status = FALSE; + + for (int i = 0; i < endCreditsApp->bg3DModelRows; i++) { + Bg3DModelAnim *modelAnim = &endCreditsApp->modelManager.bg3DModels[i]; + nextXPos = modelAnim->xOffset * modelAnim->modelCount / modelAnim->speed; + nextYPos = modelAnim->yOffset * modelAnim->modelCount / modelAnim->speed; + nextZPos = modelAnim->zOffset * modelAnim->modelCount / modelAnim->speed; + + for (int j = 0; j < modelAnim->modelCount; j++) { + Easy3DObject_GetPosition(&endCreditsApp->bg3DObjects[i][j], ¤tXPos, ¤tYPos, ¤tZPos); + + if (currentXPos + nextXPos >= modelAnim->startXPos) { + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[i][j], currentXPos + nextXPos - modelAnim->xOffset * modelAnim->modelCount, currentYPos + nextYPos - modelAnim->yOffset * modelAnim->modelCount, currentZPos + nextZPos - modelAnim->zOffset * modelAnim->modelCount); + + if ((nightModelType != -1) && (i == 0)) { + MI_CpuClear8(&endCreditsApp->bg3DObjects[i][j].renderObj, sizeof(NNSG3dRenderObj)); + NNS_G3dRenderObjInit( + &endCreditsApp->bg3DObjects[i][j].renderObj, endCreditsApp->bg3DModels[nightModelType].model); + } + + status = TRUE; + } else { + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[i][j], currentXPos + nextXPos, currentYPos + nextYPos, currentZPos + nextZPos); + } + + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[i][j], TRUE); + } + } + + return status; +} + +void EndCreditsCommon_LoadMemoryImage(EndCreditsApp *endCreditsApp, int index, int bgLayer, int twinleaf) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + NNSG2dPaletteData *palette; + const MemoryImageData *memoryImage; + + GF_ASSERT(NELEMS(sEndCreditsMaleMemories) == NELEMS(sEndCreditsFemaleMemories)); + GF_ASSERT(NELEMS(sEndCreditsMaleTwinleaf) == NELEMS(sEndCreditsFemaleTwinleaf)); + + switch (twinleaf) { + case FALSE: + GF_ASSERT(NELEMS(sEndCreditsMaleMemories) > index); + + if (endCreditsApp->clearGamePlayerInfo->gender == GENDER_MALE) { + memoryImage = &sEndCreditsMaleMemories[index]; + } else { + memoryImage = &sEndCreditsFemaleMemories[index]; + } + break; + case TRUE: + GF_ASSERT(NELEMS(sEndCreditsFemaleMemories) > index); + + if (endCreditsApp->clearGamePlayerInfo->gender == GENDER_MALE) { + memoryImage = &sEndCreditsMaleTwinleaf[index]; + } else { + memoryImage = &sEndCreditsFemaleTwinleaf[index]; + } + break; + } + + void *nclrBuffer = Graphics_GetPlttDataFromOpenNARC(endCreditsApp->narc, memoryImage->palette, &palette, HEAP_ID_END_CREDITS); + + DC_FlushRange(palette->pRawData, palette->szByte); + GX_BeginLoadBGExtPltt(); + + if (bgLayer == BG_LAYER_MAIN_3) { + GX_LoadBGExtPltt(palette->pRawData, 0x6000, 0x2000); + } else { + GX_LoadBGExtPltt(palette->pRawData, 0x4000, 0x2000); + } + + GX_EndLoadBGExtPltt(); + + Heap_Free(nclrBuffer); + PaletteData_FillBufferRange(endCreditsApp->paletteData, PLTTBUF_MAIN_BG, PLTTSEL_BOTH, 0x0, 0, 1); + PaletteData_FillBufferRange(endCreditsApp->paletteData, PLTTBUF_SUB_BG, PLTTSEL_BOTH, 0x0, 0, 1); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, memoryImage->tiles, endCreditsApp->bgConfig, bgLayer, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, memoryImage->tileMap, endCreditsApp->bgConfig, bgLayer, 0, 0, 0, HEAP_ID_END_CREDITS); + Bg_SetOffset(bgConfig, bgLayer, BG_OFFSET_UPDATE_SET_X, memoryImage->xOffset); + Bg_SetOffset(bgConfig, bgLayer, BG_OFFSET_UPDATE_SET_Y, memoryImage->yOffset); +} + +void EndCreditsCommon_AnimatePlayerSprite(EndCreditsApp *endCreditsApp, ManagedSprite *managedSprite) +{ + u32 animID; + + if (endCreditsApp->eyeCharData == NULL) { + return; + } + + if (endCreditsApp->playerAnimManager.animCount == -1) { + if (endCreditsApp->playerAnimManager.blinkFrames > 0) { + endCreditsApp->playerAnimManager.blinkFrames--; + } else { + void *charPtr = G2_GetOBJCharPtr(); + NNSG2dImageProxy *image = Sprite_GetImageProxy(managedSprite->sprite); + + if (endCreditsApp->clearGamePlayerInfo->gender == GENDER_MALE) { + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2)], (void *)((u32)charPtr + 0x1d * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 32], (void *)((u32)charPtr + 0x1e * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 64], (void *)((u32)charPtr + 0x25 * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 96], (void *)((u32)charPtr + 0x26 * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + } else { + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2)], (void *)((u32)charPtr + 0x45 * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 32], (void *)((u32)charPtr + 0x46 * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 64], (void *)((u32)charPtr + 0x4d * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + MI_CpuCopy32(&endCreditsApp->eyeCharData[endCreditsApp->playerAnimManager.blinkState * ((32 * 8) / 2) + 96], (void *)((u32)charPtr + 0x4e * 32 + image->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 32); + } + + if (endCreditsApp->playerAnimManager.blinkState == 0) { + if (endCreditsApp->playerAnimManager.blinkCount % 3 == 0) { + if (LCRNG_Next() & 1) { + endCreditsApp->playerAnimManager.blinkFrames = LCRNG_Next() % 10; + endCreditsApp->playerAnimManager.blinkCount++; + } else { + endCreditsApp->playerAnimManager.blinkFrames = 40; + } + } else { + endCreditsApp->playerAnimManager.blinkFrames = 40; + endCreditsApp->playerAnimManager.blinkCount++; + } + } else { + endCreditsApp->playerAnimManager.blinkFrames = 1; + } + + endCreditsApp->playerAnimManager.blinkState ^= 1; + } + } + + if (ManagedSprite_IsAnimated(managedSprite) == FALSE) { + if (endCreditsApp->playerAnimManager.animCount != -1) { + endCreditsApp->playerAnimManager.animCount++; + + if ((endCreditsApp->playerAnimManager.animCount > 16) && (LCRNG_Next() % 5 == 0)) { + animID = 1; + endCreditsApp->playerAnimManager.animCount = -1; + } else { + animID = 0; + } + + ManagedSprite_SetAnim(managedSprite, animID); + } else { + endCreditsApp->playerAnimManager.animCount = 0; + ManagedSprite_SetAnim(managedSprite, 0); + } + } +} diff --git a/src/cutscenes/end_credits/main.c b/src/cutscenes/end_credits/main.c new file mode 100644 index 00000000000..77dc4f78ef0 --- /dev/null +++ b/src/cutscenes/end_credits/main.c @@ -0,0 +1,763 @@ +#include "cutscenes/end_credits/main.h" + +#include +#include + +#include "constants/graphics.h" +#include "constants/heap.h" + +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" +#include "cutscenes/end_credits/strings.h" +#include "pch/global_pch.h" + +#include "bg_window.h" +#include "brightness_controller.h" +#include "camera.h" +#include "easy3d_object.h" +#include "enums.h" +#include "g3d_pipeline.h" +#include "gx_layers.h" +#include "heap.h" +#include "message.h" +#include "narc.h" +#include "overlay_manager.h" +#include "palette.h" +#include "screen_fade.h" +#include "sound.h" +#include "sprite_system.h" +#include "sprite_util.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "system.h" +#include "touch_pad.h" +#include "unk_0202419C.h" +#include "vram_transfer.h" + +enum EndCreditsState { + END_CREDITS_STATE_INIT_SCENE, + END_CREDITS_STATE_RUN_SCENE, + END_CREDITS_STATE_END +}; + +static const CameraAngle sEndCreditsCameraAngle = { + .x = 0, + .y = 0, + .z = 0 +}; + +static const RenderOamTemplate sEndCreditsRenderOamTemplate = { + .mainOamStart = 0, + .mainOamCount = 128, + .mainAffineOamStart = 0, + .mainAffineOamCount = 32, + .subOamStart = 0, + .subOamCount = 128, + .subAffineOamStart = 0, + .subAffineOamCount = 32 +}; + +static const CharTransferTemplateWithModes sEndCreditsCharTransferTemplate = { + .maxTasks = 0x60, + .sizeMain = 0x10000, + .sizeSub = 0x4000, + .modeMain = GX_OBJVRAMMODE_CHAR_1D_128K, + .modeSub = GX_OBJVRAMMODE_CHAR_1D_128K +}; + +static const SpriteResourceCapacities sEndCreditsResourceCapacities = { + .asStruct = { + .charCapacity = 96, + .plttCapacity = 32, + .cellCapacity = 64, + .animCapacity = 64, + .mcellCapacity = 8, + .manimCapacity = 8, + } +}; + +static void EndCredits_DrawSprites(SysTask *sysTask, void *pEndCreditsApp); +static void EndCredits_VBlankCallback(void *pEndCreditsApp); +static void EndCredits_InitBackgrounds(BgConfig *bgConfig); +static void EndCredits_Draw3DModels(EndCreditsApp *endCreditsApp); +static void EndCredits_InitCamera(EndCreditsApp *endCreditsApp); +static void EndCredits_DeleteCamera(EndCreditsApp *endCreditsApp); +static G3DPipelineBuffers *EndCredits_InitG3DPipeline(enum HeapID heapID); +static void EndCredits_G3DPipelineCallback(void); +static void EndCredits_FreeG3DPipeline(G3DPipelineBuffers *g3dPipeline); +static void EndCredits_InitPalettes(EndCreditsApp *endCreditsApp); +static void EndCredits_FreeAppResources(EndCreditsApp *endCreditsApp); +static void EndCredits_FreeTilemapBuffers(EndCreditsApp *endCreditsApp); +static void EndCredits_InitBackgrounds2(BgConfig *bgConfig); + +BOOL EndCreditsApp_Init(ApplicationManager *appMan, int *state) +{ + SetVBlankCallback(NULL, NULL); + DisableHBlank(); + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GX_SetVisiblePlane(0); + GXS_SetVisiblePlane(0); + GX_SetVisibleWnd(GX_WNDMASK_NONE); + GXS_SetVisibleWnd(GX_WNDMASK_NONE); + G2_BlendNone(); + G2S_BlendNone(); + + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_END_CREDITS, 0x80000); + + EndCreditsApp *endCreditsApp = ApplicationManager_NewData(appMan, sizeof(EndCreditsApp), HEAP_ID_END_CREDITS); + MI_CpuClear8(endCreditsApp, sizeof(EndCreditsApp)); + + endCreditsApp->clearGamePlayerInfo = ApplicationManager_Args(appMan); + endCreditsApp->g3dPipeline = EndCredits_InitG3DPipeline(HEAP_ID_END_CREDITS); + endCreditsApp->paletteData = PaletteData_New(HEAP_ID_END_CREDITS); + + PaletteData_AllocBuffer(endCreditsApp->paletteData, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES * 16, HEAP_ID_END_CREDITS); + PaletteData_AllocBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_BG, PALETTE_SIZE_BYTES * 16, HEAP_ID_END_CREDITS); + PaletteData_AllocBuffer(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * 14, HEAP_ID_END_CREDITS); + PaletteData_AllocBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_OBJ, PALETTE_SIZE_BYTES * 16, HEAP_ID_END_CREDITS); + PaletteData_SetAutoTransparent(endCreditsApp->paletteData, 1); + + endCreditsApp->bgConfig = BgConfig_New(HEAP_ID_END_CREDITS); + + VramTransfer_New(64, HEAP_ID_END_CREDITS); + SetAutorepeat(4, 8); + + EndCredits_InitBackgrounds(endCreditsApp->bgConfig); + + EnableTouchPad(); + InitializeTouchPad(4); + + endCreditsApp->messageLoader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_END_CREDITS, HEAP_ID_END_CREDITS); + endCreditsApp->narc = NARC_ctor(NARC_INDEX_GRAPHIC__ENDING, HEAP_ID_END_CREDITS); + + EndCredits_InitCamera(endCreditsApp); + + endCreditsApp->spriteSystem = SpriteSystem_Alloc(HEAP_ID_END_CREDITS); + + SpriteSystem_Init(endCreditsApp->spriteSystem, &sEndCreditsRenderOamTemplate, &sEndCreditsCharTransferTemplate, 16 + 16); + ReserveVramForWirelessIconChars(NNS_G2D_VRAM_TYPE_2DMAIN, GX_OBJVRAMMODE_CHAR_1D_128K); + ReserveSlotsForWirelessIconPalette(NNS_G2D_VRAM_TYPE_2DMAIN); + + endCreditsApp->spriteManager = SpriteManager_New(endCreditsApp->spriteSystem); + + SpriteSystem_InitSprites(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, 64 + 64); + SpriteSystem_InitManagerWithCapacities(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsResourceCapacities); + SetSubScreenViewRect(SpriteSystem_GetRenderer(endCreditsApp->spriteSystem), 0, (192 + 80) << FX32_SHIFT); + + EndCredits_InitPalettes(endCreditsApp); + + endCreditsApp->subScreenStringsManager = EndCreditsStrings_CreateManager(endCreditsApp->bgConfig, -240, BG_LAYER_MAIN_1, 15, endCreditsApp->messageLoader); + endCreditsApp->mainScreenStringsManager = EndCreditsStrings_CreateManager(endCreditsApp->bgConfig, -240 - 192 - 16, BG_LAYER_SUB_1, 15, endCreditsApp->messageLoader); + + G2_SetWnd0Position(0, 192 - 24, 255, 192); + G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG1, 1); + G2_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); + G2S_SetWnd0Position(0, 0, 255, 24); + G2S_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG1, 1); + G2S_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); + GX_SetVisibleWnd(GX_WNDMASK_W0); + GXS_SetVisibleWnd(GX_WNDMASK_W0); + + gSystem.whichScreenIs3D = DS_SCREEN_SUB; + + GXLayers_SwapDisplay(); + GXLayers_TurnBothDispOn(); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + GXLayers_EngineBToggleLayers(GX_PLANEMASK_OBJ, TRUE); + + endCreditsApp->sysTask = SysTask_Start(EndCredits_DrawSprites, endCreditsApp, 60000); + + SetVBlankCallback(EndCredits_VBlankCallback, endCreditsApp); + Sound_SetSceneAndPlayBGM(SOUND_SCENE_14, SEQ_BLD_ENDING, 1); + + BrightnessController_SetScreenBrightness(BRIGHTNESS_BLACK, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD, BRIGHTNESS_BOTH_SCREENS); + SetScreenMasterBrightness(DS_SCREEN_MAIN, BRIGHTNESS_NORMAL); + SetScreenMasterBrightness(DS_SCREEN_SUB, BRIGHTNESS_NORMAL); + + Bg_ToggleLayer(BG_LAYER_MAIN_1, TRUE); + Bg_ToggleLayer(BG_LAYER_SUB_1, TRUE); + + return TRUE; +} + +BOOL EndCreditsApp_Main(ApplicationManager *appMan, int *state) +{ + EndCreditsApp *endCreditsApp = ApplicationManager_Data(appMan); + + if (endCreditsApp->subScreenStringsManager != NULL) { + EndCreditsStrings_ScrollCredits(endCreditsApp->subScreenStringsManager, 1); + endCreditsApp->creditsScrollDone = EndCreditsStrings_ScrollCredits(endCreditsApp->mainScreenStringsManager, 1); + } + + if (endCreditsApp->clearGamePlayerInfo->gameCompleted && (gSystem.pressedKeys & PAD_BUTTON_START)) { + if ((endCreditsApp->creditsSkipState == END_CREDITS_SKIP_STATE_NOT_SKIPPED) && (endCreditsApp->currentScene < END_CREDITS_SCENE_FIN)) { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_END_CREDITS); + endCreditsApp->creditsSkipState = END_CREDITS_SKIP_STATE_SKIPPING; + } + } + + switch (endCreditsApp->creditsSkipState) { + case END_CREDITS_SKIP_STATE_NOT_SKIPPED: + break; + case END_CREDITS_SKIP_STATE_SKIPPING: + if (IsScreenFadeDone()) { + if (endCreditsApp->sceneLoaded == TRUE) { + EndCreditsScenes_RunSceneUnloadFuncs(endCreditsApp, endCreditsApp->currentScene); + endCreditsApp->sceneLoaded = FALSE; + } + + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == FALSE) { + BrightnessController_ResetScreenController(BRIGHTNESS_BOTH_SCREENS); + } + + EndCredits_InitFinalScenes(endCreditsApp); + endCreditsApp->currentScene = END_CREDITS_SCENE_FIN; + GXLayers_EngineASetLayers(0); + GXLayers_EngineBSetLayers(0); + MI_CpuClear8(&endCreditsApp->sceneManager, sizeof(EndCreditsSceneManager)); + endCreditsApp->creditsSkipState = END_CREDITS_SKIP_STATE_SKIPPED; + *state = END_CREDITS_STATE_INIT_SCENE; + } + break; + } + + switch (*state) { + case END_CREDITS_STATE_INIT_SCENE: + if ((endCreditsApp->creditsSkipState == END_CREDITS_SKIP_STATE_NOT_SKIPPED) || (endCreditsApp->creditsSkipState == END_CREDITS_SKIP_STATE_SKIPPED)) { + EndCreditsScenes_RunSceneLoadFuncs(endCreditsApp, endCreditsApp->currentScene); + endCreditsApp->sceneLoaded = TRUE; + (*state)++; + } + break; + case END_CREDITS_STATE_RUN_SCENE: + if (EndCreditsScenes_RunScene(endCreditsApp, endCreditsApp->currentScene) == TRUE) { + EndCreditsScenes_RunSceneUnloadFuncs(endCreditsApp, endCreditsApp->currentScene); + endCreditsApp->sceneLoaded = FALSE; + endCreditsApp->currentScene++; + + if (endCreditsApp->currentScene < END_CREDITS_SCENE_COUNT) { + (*state) = END_CREDITS_STATE_INIT_SCENE; + } else { + (*state) = END_CREDITS_STATE_END; + } + } + break; + case END_CREDITS_STATE_END: + return TRUE; + } + + endCreditsApp->framesElapsed++; + + return FALSE; +} + +BOOL EndCreditsApp_Exit(ApplicationManager *appMan, int *state) +{ + EndCreditsApp *endCreditsApp = ApplicationManager_Data(appMan); + + SysTask_Done(endCreditsApp->sysTask); + + if (endCreditsApp->subScreenStringsManager != NULL) { + EndCredits_FreeAppResources(endCreditsApp); + } else { + EndCredits_FreeTilemapBuffers(endCreditsApp); + } + + MessageLoader_Free(endCreditsApp->messageLoader); + SpriteSystem_FreeResourcesAndManager(endCreditsApp->spriteSystem, endCreditsApp->spriteManager); + SpriteSystem_Free(endCreditsApp->spriteSystem); + PaletteData_FreeBuffer(endCreditsApp->paletteData, PLTTBUF_MAIN_BG); + PaletteData_FreeBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_BG); + PaletteData_FreeBuffer(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ); + PaletteData_FreeBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_OBJ); + PaletteData_Free(endCreditsApp->paletteData); + + EndCredits_DeleteCamera(endCreditsApp); + + NARC_dtor(endCreditsApp->narc); + SetVBlankCallback(NULL, NULL); + DisableHBlank(); + VramTransfer_Free(); + DisableTouchPad(); + ApplicationManager_FreeData(appMan); + Heap_Destroy(HEAP_ID_END_CREDITS); + + return TRUE; +} + +static void EndCredits_DrawSprites(SysTask *sysTask, void *pEndCreditsApp) +{ + EndCreditsApp *endCreditsApp = pEndCreditsApp; + + if (endCreditsApp->bg3DModelLoaded == TRUE) { + EndCredits_Draw3DModels(endCreditsApp); + G3_RequestSwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_Z); + } + + SpriteSystem_DrawSprites(endCreditsApp->spriteManager); + SpriteSystem_UpdateTransfer(); +} + +static void EndCredits_FreeAppResources(EndCreditsApp *endCreditsApp) +{ + GF_ASSERT(endCreditsApp->subScreenStringsManager != NULL); + + EndCreditsStrings_FreeManager(endCreditsApp->mainScreenStringsManager); + EndCreditsStrings_FreeManager(endCreditsApp->subScreenStringsManager); + + endCreditsApp->mainScreenStringsManager = NULL; + endCreditsApp->subScreenStringsManager = NULL; + + Bg_ToggleLayer(BG_LAYER_MAIN_1, FALSE); + Bg_ToggleLayer(BG_LAYER_SUB_1, FALSE); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_SUB_1); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_SUB_2); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_3); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_1); + Heap_Free(endCreditsApp->bgConfig); + + EndCredits_FreeG3DPipeline(endCreditsApp->g3dPipeline); +} + +void EndCredits_InitFinalScenes(EndCreditsApp *endCreditsApp) +{ + if (endCreditsApp->subScreenStringsManager == NULL) { + return; + } + + EndCredits_FreeAppResources(endCreditsApp); + + endCreditsApp->bgConfig = BgConfig_New(HEAP_ID_END_CREDITS); + EndCredits_InitBackgrounds2(endCreditsApp->bgConfig); +} + +static void EndCredits_FreeTilemapBuffers(EndCreditsApp *endCreditsApp) +{ + GF_ASSERT(endCreditsApp->subScreenStringsManager == NULL); + + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_1); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_MAIN_3); + Bg_FreeTilemapBuffer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); + Heap_Free(endCreditsApp->bgConfig); +} + +static void EndCredits_VBlankCallback(void *pEndCreditsApp) +{ + EndCreditsApp *endCreditsApp = pEndCreditsApp; + + VramTransfer_Process(); + SpriteSystem_TransferOam(); + PaletteData_CommitFadedBuffers(endCreditsApp->paletteData); + Bg_RunScheduledUpdates(endCreditsApp->bgConfig); + + OS_SetIrqCheckFlag(OS_IE_V_BLANK); +} + +static void EndCredits_InitBackgrounds(BgConfig *bgConfig) +{ + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GXBanks banks = { + .unk_00 = GX_VRAM_BG_128_B, + .unk_04 = GX_VRAM_BGEXTPLTT_23_G, + .unk_08 = GX_VRAM_BG_128_C, + .unk_0C = GX_VRAM_SUB_BGEXTPLTT_NONE, + .unk_10 = GX_VRAM_OBJ_64_E, + .unk_14 = GX_VRAM_OBJEXTPLTT_NONE, + .unk_18 = GX_VRAM_SUB_OBJ_16_I, + .unk_1C = GX_VRAM_SUB_OBJEXTPLTT_NONE, + .unk_20 = GX_VRAM_TEX_0_A, + .unk_24 = GX_VRAM_TEXPLTT_0_F + }; + + GXLayers_SetBanks(&banks); + + MI_CpuClear32((void *)HW_BG_VRAM, HW_BG_VRAM_SIZE); + MI_CpuClear32((void *)HW_DB_BG_VRAM, HW_DB_BG_VRAM_SIZE); + MI_CpuClear32((void *)HW_OBJ_VRAM, HW_OBJ_VRAM_SIZE); + MI_CpuClear32((void *)HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM_SIZE); + + GraphicsModes graphicsModes = { + .displayMode = GX_DISPMODE_GRAPHICS, + .mainBgMode = GX_BGMODE_3, + .subBgMode = GX_BGMODE_0, + .bg0As2DOr3D = GX_BG0_AS_3D, + }; + + SetAllGraphicsModes(&graphicsModes); + + BgTemplate bgTemplates[] = { + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x04000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x2000, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_512x512, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x1000, + .charBase = GX_BG_CHARBASE_0x0c000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0x3000, + .charBase = GX_BG_CHARBASE_0x10000, + .bgExtPltt = GX_BG_EXTPLTT_23, + .priority = 2, + .areaOver = 0, + .mosaic = FALSE, + }, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_1, &bgTemplates[0], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_1); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_1, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_1, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_2, &bgTemplates[1], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_2); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_3, &bgTemplates[2], BG_TYPE_STATIC_WITH_AFFINE); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_3, BG_OFFSET_UPDATE_SET_Y, 0); + + G2_SetBG0Priority(1); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); + + BgTemplate bgTemplates2[] = { + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x04000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x1000, + .charBase = GX_BG_CHARBASE_0x0c000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0x2000, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_512x512, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x2000, + .charBase = GX_BG_CHARBASE_0x14000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_1, &bgTemplates2[0], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_1); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_1, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_1, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_2, &bgTemplates2[1], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_2); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_2, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_3, &bgTemplates2[2], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_3); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_ClearTilesRange(BG_LAYER_MAIN_1, 32, 0, HEAP_ID_END_CREDITS); + Bg_ClearTilesRange(BG_LAYER_SUB_1, 32, 0, HEAP_ID_END_CREDITS); + Bg_ClearTilesRange(BG_LAYER_SUB_2, 32, 0, HEAP_ID_END_CREDITS); + Bg_ClearTilesRange(BG_LAYER_SUB_3, 32, 0, HEAP_ID_END_CREDITS); + + Bg_ToggleLayer(BG_LAYER_MAIN_3, FALSE); + Bg_ToggleLayer(BG_LAYER_SUB_2, FALSE); +} + +static void EndCredits_InitBackgrounds2(BgConfig *bgConfig) +{ + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GXBanks banks = { + .unk_00 = GX_VRAM_BG_256_AB, + .unk_04 = GX_VRAM_BGEXTPLTT_23_G, + .unk_08 = GX_VRAM_BG_128_C, + .unk_0C = GX_VRAM_SUB_BGEXTPLTT_NONE, + .unk_10 = GX_VRAM_OBJ_64_E, + .unk_14 = GX_VRAM_OBJEXTPLTT_NONE, + .unk_18 = GX_VRAM_SUB_OBJ_16_I, + .unk_1C = GX_VRAM_SUB_OBJEXTPLTT_NONE, + .unk_20 = GX_VRAM_TEX_NONE, + .unk_24 = GX_VRAM_TEXPLTT_NONE + }; + + GXLayers_SetBanks(&banks); + + MI_CpuClear32((void *)HW_BG_VRAM, HW_BG_VRAM_SIZE); + MI_CpuClear32((void *)HW_DB_BG_VRAM, HW_DB_BG_VRAM_SIZE); + MI_CpuClear32((void *)HW_OBJ_VRAM, HW_OBJ_VRAM_SIZE); + MI_CpuClear32((void *)HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM_SIZE); + + GraphicsModes graphicsModes = { + .displayMode = GX_DISPMODE_GRAPHICS, + .mainBgMode = GX_BGMODE_5, + .subBgMode = GX_BGMODE_0, + .bg0As2DOr3D = GX_BG0_AS_2D, + }; + + SetAllGraphicsModes(&graphicsModes); + + BgTemplate bgTemplates[] = { + { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x0c000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0x0800, + .charBase = GX_BG_CHARBASE_0x20000, + .bgExtPltt = GX_BG_EXTPLTT_23, + .priority = 2, + .areaOver = 0, + .mosaic = FALSE, + }, + { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0x2800, + .charBase = GX_BG_CHARBASE_0x30000, + .bgExtPltt = GX_BG_EXTPLTT_23, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_1, &bgTemplates[0], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_1); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_1, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_1, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_2, &bgTemplates[1], BG_TYPE_STATIC_WITH_AFFINE); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_2); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_3, &bgTemplates[2], BG_TYPE_STATIC_WITH_AFFINE); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_3); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_3, BG_OFFSET_UPDATE_SET_Y, 0); + + BgTemplate bgTemplates2[] = { + { + .x = 0, + .y = 0, + .bufferSize = 0x2000, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_512x512, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x2000, + .charBase = GX_BG_CHARBASE_0x14000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_3, &bgTemplates2[0], BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_3); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_ClearTilesRange(BG_LAYER_SUB_3, 32, 0, HEAP_ID_END_CREDITS); +} + +static void EndCredits_InitPalettes(EndCreditsApp *endCreditsApp) +{ + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 85, HEAP_ID_END_CREDITS, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, PLTT_DEST(15)); + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 85, HEAP_ID_END_CREDITS, PLTTBUF_SUB_BG, PALETTE_SIZE_BYTES, PLTT_DEST(15)); +} + +static void EndCredits_Draw3DModels(EndCreditsApp *endCreditsApp) +{ + VecFx32 scaleVec, transVec; + MtxFx33 rot; + + scaleVec.x = FX32_ONE; + scaleVec.y = FX32_ONE; + scaleVec.z = FX32_ONE; + + transVec.x = 0; + transVec.y = 0; + transVec.z = 0; + + MTX_Identity33(&rot); + + G3_ResetG3X(); + Camera_SetAsActive(endCreditsApp->camera); + Camera_ComputeProjectionMatrix(0, endCreditsApp->camera); + Camera_ComputeViewMatrix(); + + switch (endCreditsApp->currentScene) { + case END_CREDITS_SCENE_BIKE_MORNING: + NNS_G3dGlbLightVector(0, 1897, -3600, -466); + NNS_G3dGlbLightVector(2, 0, 0, 4096); + NNS_G3dGlbLightColor(0, GX_RGB(28, 12, 6)); + NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); + NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(15, 15, 15), GX_RGB(11, 12, 12), 0); + NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(17, 17, 17), GX_RGB(8, 8, 7), 0); + break; + case END_CREDITS_SCENE_BIKE_DAY: + NNS_G3dGlbLightVector(0, -2043, -3548, 110); + NNS_G3dGlbLightVector(2, 0, 0, 4096); + NNS_G3dGlbLightColor(0, GX_RGB(22, 22, 20)); + NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); + NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(15, 15, 15), GX_RGB(9, 11, 11), 0); + NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(16, 16, 16), GX_RGB(14, 14, 14), 0); + break; + case END_CREDITS_SCENE_BIKE_NIGHT: + NNS_G3dGlbLightVector(0, 1897, -3600, -466); + NNS_G3dGlbLightVector(2, 0, 0, 4096); + NNS_G3dGlbLightColor(0, GX_RGB(11, 11, 16)); + NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); + NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(14, 14, 16), GX_RGB(10, 10, 10), 0); + NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(14, 14, 16), GX_RGB(8, 8, 11), 0); + break; + default: + NNS_G3dGlbLightVector(0, 0, -FX32_ONE, 0); + NNS_G3dGlbLightColor(0, GX_RGB(28, 28, 28)); + NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), 0); + NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), 0); + break; + } + + NNS_G3dGlbLightVector(3, 0, -FX32_ONE, 0); + NNS_G3dGlbLightColor(3, GX_RGB(28, 28, 28)); + NNS_G3dGlbSetBaseTrans(&transVec); + NNS_G3dGlbSetBaseRot(&rot); + NNS_G3dGlbSetBaseScale(&scaleVec); + NNS_G3dGePushMtx(); + + for (int i = 0; i < SNELEMS(endCreditsApp->bg3DObjects); i++) { + for (int j = 0; j < SNELEMS(endCreditsApp->bg3DObjects[i]); j++) { + Easy3DObject_Draw(&endCreditsApp->bg3DObjects[i][j]); + } + } + + NNS_G3dGePopMtx(1); +} + +static void EndCredits_InitCamera(EndCreditsApp *endCreditsApp) +{ + VecFx32 target1 = { .x = 0, .y = -FX32_ONE * 8, .z = 0 }; + VecFx32 pos = { .x = -31712, .y = -142304, .z = 496744 }; + VecFx32 target2 = { .x = -31712, .y = -67780, .z = -5704 }; + + endCreditsApp->camera = Camera_Alloc(HEAP_ID_END_CREDITS); + + Camera_InitWithTarget(&target1, 0x7c000, &sEndCreditsCameraAngle, (22 * 0xffff) / 360, 0, 0, endCreditsApp->camera); + Camera_SetPosition(&pos, endCreditsApp->camera); + Camera_SetTarget(&target2, endCreditsApp->camera); + Camera_SetClipping(FX32_ONE, FX32_ONE * 900, endCreditsApp->camera); + Camera_SetAsActive(endCreditsApp->camera); +} + +static void EndCredits_DeleteCamera(EndCreditsApp *endCreditsApp) +{ + Camera_Delete(endCreditsApp->camera); +} + +static G3DPipelineBuffers *EndCredits_InitG3DPipeline(enum HeapID heapID) +{ + return G3DPipeline_Init(heapID, TEXTURE_VRAM_SIZE_128K, PALETTE_VRAM_SIZE_16K, EndCredits_G3DPipelineCallback); +} + +static void EndCredits_G3DPipelineCallback(void) +{ + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); + + G2_SetBG0Priority(1); + G3X_SetShading(GX_SHADING_TOON); + G3X_AntiAlias(1); + G3X_AlphaTest(0, 0); + G3X_AlphaBlend(1); + G3X_EdgeMarking(0); + G3X_SetFog(0, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0); + G3X_SetClearColor(GX_RGB(0, 0, 0), 0, 0x7fff, 63, 0); + G3_ViewPort(0, 0, 255, 191); +} + +static void EndCredits_FreeG3DPipeline(G3DPipelineBuffers *g3dPipeline) +{ + G3DPipelineBuffers_Free(g3dPipeline); +} diff --git a/src/cutscenes/end_credits/scenes.c b/src/cutscenes/end_credits/scenes.c new file mode 100644 index 00000000000..0710b93b177 --- /dev/null +++ b/src/cutscenes/end_credits/scenes.c @@ -0,0 +1,1114 @@ +#include "cutscenes/end_credits/scenes.h" + +#include +#include + +#include "constants/graphics.h" + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/main.h" +#include "cutscenes/end_credits/scenes.h" +#include "cutscenes/end_credits/strings.h" +#include "pch/global_pch.h" + +#include "bg_window.h" +#include "brightness_controller.h" +#include "easy3d_object.h" +#include "font.h" +#include "genders.h" +#include "graphics.h" +#include "gx_layers.h" +#include "heap.h" +#include "message.h" +#include "palette.h" +#include "screen_fade.h" +#include "sprite.h" +#include "sprite_system.h" +#include "string_gf.h" +#include "system.h" +#include "text.h" + +typedef void (*EndCreditsSceneFunc)(EndCreditsApp *); +typedef BOOL (*EndCreditsSceneRunFunc)(EndCreditsApp *, EndCreditsSceneManager *); + +typedef struct EndCreditsSceneFuncs { + EndCreditsSceneFunc load1; + EndCreditsSceneFunc load2; + EndCreditsSceneFunc load3; + EndCreditsSceneFunc load4; + EndCreditsSceneFunc load5; + EndCreditsSceneFunc load6; + EndCreditsSceneFunc unload1; + EndCreditsSceneFunc unload2; + EndCreditsSceneFunc unload3; + EndCreditsSceneFunc unload4; + EndCreditsSceneFunc unload5; + EndCreditsSceneFunc unload6; + EndCreditsSceneRunFunc run; +} EndCreditsSceneFuncs; + +static void EndCreditsScenes_LoadPlayerSprite(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerSprite(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerAnim(EndCreditsApp *endCreditsApp, ManagedSprite **pPlayerSprite, ManagedSprite **pScarfSprite); +static void EndCreditsScenes_UnloadPlayerAnim(EndCreditsApp *endCreditsApp, ManagedSprite *playerSprite, ManagedSprite *scarfSprite); +static void EndCreditsScenes_LoadBackgroundMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadBackgroundMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerSpriteMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerSpriteMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerAnimMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerAnimMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraSpritesMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraSpritesMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraAnimMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraAnimMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Load3DModelsMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Unload3DModelsMorning(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadMemories(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadMemories(EndCreditsApp *endCreditsApp); +static void Dummy_021D2158(EndCreditsApp *endCreditsApp); +static void Dummy_021D215C(EndCreditsApp *endCreditsApp); +static void Dummy_021D2160(EndCreditsApp *endCreditsApp); +static void Dummy_021D2164(EndCreditsApp *endCreditsApp); +static void Dummy_021D2168(EndCreditsApp *endCreditsApp); +static void Dummy_021D216C(EndCreditsApp *endCreditsApp); +static void Dummy_021D2170(EndCreditsApp *endCreditsApp); +static void Dummy_021D2174(EndCreditsApp *endCreditsApp); +static void Dummy_021D2178(EndCreditsApp *endCreditsApp); +static void Dummy_021D217C(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadBackgroundDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadBackgroundDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerSpriteDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerSpriteDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerAnimDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerAnimDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraSpritesDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraSpritesDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraAnimDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraAnimDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Load3DModelsDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Unload3DModelsDay(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadBackgroundNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadBackgroundNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerSpriteNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerSpriteNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadPlayerAnimNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadPlayerAnimNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraSpritesNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraSpritesNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadExtraAnimNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadExtraAnimNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Load3DModelsNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_Unload3DModelsNight(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadTwinleaf(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadTwinleaf(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A84(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A88(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A8C(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A90(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A94(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A98(EndCreditsApp *endCreditsApp); +static void Dummy_021D2A9C(EndCreditsApp *endCreditsApp); +static void Dummy_021D2AA0(EndCreditsApp *endCreditsApp); +static void Dummy_021D2AA4(EndCreditsApp *endCreditsApp); +static void Dummy_021D2AA8(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_LoadFin(EndCreditsApp *endCreditsApp); +static void EndCreditsScenes_UnloadFin(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BE0(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BE4(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BE8(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BEC(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BF0(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BF4(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BF8(EndCreditsApp *endCreditsApp); +static void Dummy_021D2BFC(EndCreditsApp *endCreditsApp); +static void Dummy_021D2C00(EndCreditsApp *endCreditsApp); +static void Dummy_021D2C04(EndCreditsApp *endCreditsApp); + +static const EndCreditsSceneFuncs sEndCreditsSceneFuncs[] = { + [END_CREDITS_SCENE_BIKE_MORNING] = { + .load1 = EndCreditsScenes_LoadBackgroundMorning, + .load2 = EndCreditsScenes_Load3DModelsMorning, + .load3 = EndCreditsScenes_LoadPlayerSpriteMorning, + .load4 = EndCreditsScenes_LoadExtraSpritesMorning, + .load5 = EndCreditsScenes_LoadPlayerAnimMorning, + .load6 = EndCreditsScenes_LoadExtraAnimMorning, + .unload1 = EndCreditsScenes_UnloadBackgroundMorning, + .unload2 = EndCreditsScenes_Unload3DModelsMorning, + .unload3 = EndCreditsScenes_UnloadPlayerSpriteMorning, + .unload4 = EndCreditsScenes_UnloadExtraSpritesMorning, + .unload5 = EndCreditsScenes_UnloadPlayerAnimMorning, + .unload6 = EndCreditsScenes_UnloadExtraAnimMorning, + .run = EndCreditsMorningScene_Run, + }, + [END_CREDITS_SCENE_MEMORIES_1] = { + .load1 = EndCreditsScenes_LoadMemories, + .load2 = Dummy_021D2178, + .load3 = Dummy_021D2158, + .load4 = Dummy_021D2168, + .load5 = Dummy_021D2160, + .load6 = Dummy_021D2170, + .unload1 = EndCreditsScenes_UnloadMemories, + .unload2 = Dummy_021D217C, + .unload3 = Dummy_021D215C, + .unload4 = Dummy_021D216C, + .unload5 = Dummy_021D2164, + .unload6 = Dummy_021D2174, + .run = EndCreditsMemoriesScene_Run1, + }, + [END_CREDITS_SCENE_BIKE_DAY] = { + .load1 = EndCreditsScenes_LoadBackgroundDay, + .load2 = EndCreditsScenes_Load3DModelsDay, + .load3 = EndCreditsScenes_LoadPlayerSpriteDay, + .load4 = EndCreditsScenes_LoadExtraSpritesDay, + .load5 = EndCreditsScenes_LoadPlayerAnimDay, + .load6 = EndCreditsScenes_LoadExtraAnimDay, + .unload1 = EndCreditsScenes_UnloadBackgroundDay, + .unload2 = EndCreditsScenes_Unload3DModelsDay, + .unload3 = EndCreditsScenes_UnloadPlayerSpriteDay, + .unload4 = EndCreditsScenes_UnloadExtraSpritesDay, + .unload5 = EndCreditsScenes_UnloadPlayerAnimDay, + .unload6 = EndCreditsScenes_UnloadExtraAnimDay, + .run = EndCreditsDayScene_Run, + }, + [END_CREDITS_SCENE_MEMORIES_2] = { + .load1 = EndCreditsScenes_LoadMemories, + .load2 = Dummy_021D2178, + .load3 = Dummy_021D2158, + .load4 = Dummy_021D2168, + .load5 = Dummy_021D2160, + .load6 = Dummy_021D2170, + .unload1 = EndCreditsScenes_UnloadMemories, + .unload2 = Dummy_021D217C, + .unload3 = Dummy_021D215C, + .unload4 = Dummy_021D216C, + .unload5 = Dummy_021D2164, + .unload6 = Dummy_021D2174, + .run = EndCreditsMemoriesScene_Run2, + }, + [END_CREDITS_SCENE_BIKE_NIGHT] = { + .load1 = EndCreditsScenes_LoadBackgroundNight, + .load2 = EndCreditsScenes_Load3DModelsNight, + .load3 = EndCreditsScenes_LoadPlayerSpriteNight, + .load4 = EndCreditsScenes_LoadExtraSpritesNight, + .load5 = EndCreditsScenes_LoadPlayerAnimNight, + .load6 = EndCreditsScenes_LoadExtraAnimNight, + .unload1 = EndCreditsScenes_UnloadBackgroundNight, + .unload2 = EndCreditsScenes_Unload3DModelsNight, + .unload3 = EndCreditsScenes_UnloadPlayerSpriteNight, + .unload4 = EndCreditsScenes_UnloadExtraSpritesNight, + .unload5 = EndCreditsScenes_UnloadPlayerAnimNight, + .unload6 = EndCreditsScenes_UnloadExtraAnimNight, + .run = EndCreditsNightScene_Run, + }, + [END_CREDITS_SCENE_TWINLEAF] = { + .load1 = EndCreditsScenes_LoadTwinleaf, + .load2 = Dummy_021D2AA4, + .load3 = Dummy_021D2A84, + .load4 = Dummy_021D2A94, + .load5 = Dummy_021D2A8C, + .load6 = Dummy_021D2A9C, + .unload1 = EndCreditsScenes_UnloadTwinleaf, + .unload2 = Dummy_021D2AA8, + .unload3 = Dummy_021D2A88, + .unload4 = Dummy_021D2A98, + .unload5 = Dummy_021D2A90, + .unload6 = Dummy_021D2AA0, + .run = EndCreditsTwinleafScene_Run, + }, + [END_CREDITS_SCENE_FIN] = { + .load1 = EndCreditsScenes_LoadFin, + .load2 = Dummy_021D2C00, + .load3 = Dummy_021D2BE0, + .load4 = Dummy_021D2BF0, + .load5 = Dummy_021D2BE8, + .load6 = Dummy_021D2BF8, + .unload1 = EndCreditsScenes_UnloadFin, + .unload2 = Dummy_021D2C04, + .unload3 = Dummy_021D2BE4, + .unload4 = Dummy_021D2BF4, + .unload5 = Dummy_021D2BEC, + .unload6 = Dummy_021D2BFC, + .run = EndCreditsFinScene_Run, + }, +}; + +static const SpriteTemplate sEndCreditsDrifloonTemplate = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 0, + .priority = 150, + .plttIdx = 1, + .vramType = NNS_G2D_VRAM_TYPE_2DSUB, + .resources = { 0x2713, 0x2713, 0x2713, 0x2713, 0xffffffff, 0xffffffff }, + .bgPriority = 2, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sEndCreditsWingullTemplate = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 1, + .priority = 150, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DSUB, + .resources = { 0x2714, 0x2714, 0x2714, 0x2714, 0xffffffff, 0xffffffff }, + .bgPriority = 2, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sEndCreditsMagnezoneTemplate = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 2, + .priority = 150, + .plttIdx = 2, + .vramType = NNS_G2D_VRAM_TYPE_2DSUB, + .resources = { 0x2715, 0x2715, 0x2715, 0x2715, 0xffffffff, 0xffffffff }, + .bgPriority = 2, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sEndCreditsMeteorTemplate1 = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 3, + .priority = 200, + .plttIdx = 3, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { 0x2712, 0x2712, 0x2712, 0x2712, 0xffffffff, 0xffffffff }, + .bgPriority = 3, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sEndCreditsMeteorTemplate2 = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 3, + .priority = 200, + .plttIdx = 3, + .vramType = NNS_G2D_VRAM_TYPE_2DSUB, + .resources = { 0x2715, 0x2715, 0x2715, 0x2715, 0xffffffff, 0xffffffff }, + .bgPriority = 3, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sEndCreditsPlayerTemplate = { + .x = 192, + .y = 160, + .z = 0, + .animIdx = 0, + .priority = 51, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { 0x2711, 0x2711, 0x2711, 0x2711, 0xffffffff, 0xffffffff }, + .bgPriority = 1, + .vramTransfer = TRUE +}; + +static void EndCreditsScenes_LoadPlayerSprite(EndCreditsApp *endCreditsApp) +{ + u8 index; + + if (endCreditsApp->clearGamePlayerInfo->gender == GENDER_MALE) { + index = SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 31, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 28, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 29, FALSE, 10001); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 30, FALSE, 10001); + } else { + index = SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 36, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 33, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 34, FALSE, 10001); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 35, FALSE, 10001); + } + + switch (endCreditsApp->currentScene) { + case END_CREDITS_SCENE_BIKE_MORNING: + PaletteData_Blend(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, index * 16, 16, 4, GX_RGB(28, 12, 6)); + break; + case END_CREDITS_SCENE_BIKE_DAY: + break; + case END_CREDITS_SCENE_BIKE_NIGHT: + PaletteData_Blend(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, index * 16, 16, 4, GX_RGB(11, 11, 16)); + break; + } +} + +static void EndCreditsScenes_UnloadPlayerSprite(EndCreditsApp *endCreditsApp) +{ + SpriteManager_UnloadCharObjById(endCreditsApp->spriteManager, 10001); + SpriteManager_UnloadPlttObjById(endCreditsApp->spriteManager, 10001); + SpriteManager_UnloadCellObjById(endCreditsApp->spriteManager, 10001); + SpriteManager_UnloadAnimObjById(endCreditsApp->spriteManager, 10001); +} + +static void EndCreditsScenes_LoadPlayerAnim(EndCreditsApp *endCreditsApp, ManagedSprite **pPlayerSprite, ManagedSprite **pScarfSprite) +{ + SpriteTemplate playerTemplate = sEndCreditsPlayerTemplate; + + MI_CpuClear8(&endCreditsApp->playerAnimManager, sizeof(EndCreditsPlayerAnimManager)); + + ManagedSprite *playerSprite = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &playerTemplate); + + ManagedSprite_SetAnimateFlag(playerSprite, TRUE); + Sprite_TickFrame(playerSprite->sprite); + + *pPlayerSprite = playerSprite; + playerTemplate.priority = 60; + ManagedSprite *scarfSprite = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &playerTemplate); + + ManagedSprite_SetAnim(scarfSprite, 2); + ManagedSprite_SetAnimateFlag(scarfSprite, TRUE); + Sprite_TickFrame(scarfSprite->sprite); + + *pScarfSprite = scarfSprite; + + NNSG2dCharacterData *charData; + u32 entryId; + + GF_ASSERT(endCreditsApp->eyeCharData == NULL); + + if (endCreditsApp->clearGamePlayerInfo->gender == GENDER_MALE) { + entryId = 27; + } else { + entryId = 32; + } + + endCreditsApp->eyeCharData = Heap_Alloc(HEAP_ID_END_CREDITS, (32 * 8)); + void *ncgrBuffer = Graphics_GetCharDataFromOpenNARC(endCreditsApp->narc, entryId, 0, &charData, HEAP_ID_END_CREDITS); + + MI_CpuCopy32(charData->pRawData, endCreditsApp->eyeCharData, (32 * 8)); + Heap_Free(ncgrBuffer); + DC_FlushRange(endCreditsApp->eyeCharData, (32 * 8)); +} + +static void EndCreditsScenes_UnloadPlayerAnim(EndCreditsApp *endCreditsApp, ManagedSprite *playerSprite, ManagedSprite *scarfSprite) +{ + Sprite_DeleteAndFreeResources(playerSprite); + Sprite_DeleteAndFreeResources(scarfSprite); + + if (endCreditsApp->eyeCharData != NULL) { + Heap_Free(endCreditsApp->eyeCharData); + endCreditsApp->eyeCharData = NULL; + } +} + +void EndCreditsScenes_RunSceneLoadFuncs(EndCreditsApp *endCreditsApp, int scene) +{ + const EndCreditsSceneFuncs *sceneFuncs = &sEndCreditsSceneFuncs[scene]; + + sceneFuncs->load1(endCreditsApp); + sceneFuncs->load2(endCreditsApp); + sceneFuncs->load3(endCreditsApp); + sceneFuncs->load4(endCreditsApp); + sceneFuncs->load5(endCreditsApp); + sceneFuncs->load6(endCreditsApp); +} + +void EndCreditsScenes_RunSceneUnloadFuncs(EndCreditsApp *endCreditsApp, int scene) +{ + const EndCreditsSceneFuncs *sceneFuncs = &sEndCreditsSceneFuncs[scene]; + + sceneFuncs->unload1(endCreditsApp); + sceneFuncs->unload2(endCreditsApp); + sceneFuncs->unload3(endCreditsApp); + sceneFuncs->unload4(endCreditsApp); + sceneFuncs->unload5(endCreditsApp); + sceneFuncs->unload6(endCreditsApp); +} + +BOOL EndCreditsScenes_RunScene(EndCreditsApp *endCreditsApp, int scene) +{ + BOOL status = sEndCreditsSceneFuncs[scene].run(endCreditsApp, &endCreditsApp->sceneManager); + + if (status == 1) { + MI_CpuClear8(&endCreditsApp->sceneManager, sizeof(EndCreditsSceneManager)); + } + + return status; +} + +static void EndCreditsScenes_LoadBackgroundMorning(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 18, HEAP_ID_END_CREDITS, PLTTBUF_MAIN_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 9, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 3, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 21, HEAP_ID_END_CREDITS, PLTTBUF_SUB_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 12, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 6, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_ToggleLayer(BG_LAYER_MAIN_2, TRUE); + Bg_ToggleLayer(BG_LAYER_SUB_3, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); +} + +static void EndCreditsScenes_UnloadBackgroundMorning(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_MAIN_2, FALSE); + Bg_ToggleLayer(BG_LAYER_SUB_3, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, FALSE); +} + +static void EndCreditsScenes_LoadPlayerSpriteMorning(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerSprite(endCreditsApp); +} + +static void EndCreditsScenes_UnloadPlayerSpriteMorning(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_UnloadPlayerSprite(endCreditsApp); +} + +static void EndCreditsScenes_LoadPlayerAnimMorning(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerAnim(endCreditsApp, &endCreditsApp->managedSprites[END_CREDITS_SPRITE_MORNING_PLAYER], &endCreditsApp->managedSprites[END_CREDITS_SPRITE_MORNING_SCARF]); +} + +static void EndCreditsScenes_UnloadPlayerAnimMorning(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_UnloadPlayerAnim(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_MORNING_PLAYER], endCreditsApp->managedSprites[END_CREDITS_SPRITE_MORNING_SCARF]); +} + +static void EndCreditsScenes_LoadExtraSpritesMorning(EndCreditsApp *endCreditsApp) +{ + SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_SUB_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10003); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10003); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 1, FALSE, 10003); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 2, FALSE, 10003); +} + +static void EndCreditsScenes_UnloadExtraSpritesMorning(EndCreditsApp *endCreditsApp) +{ + SpriteManager_UnloadCharObjById(endCreditsApp->spriteManager, 10003); + SpriteManager_UnloadPlttObjById(endCreditsApp->spriteManager, 10003); + SpriteManager_UnloadCellObjById(endCreditsApp->spriteManager, 10003); + SpriteManager_UnloadAnimObjById(endCreditsApp->spriteManager, 10003); +} + +static void EndCreditsScenes_LoadExtraAnimMorning(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 4; i++) { + endCreditsApp->managedSprites[i] = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsDrifloonTemplate); + + ManagedSprite_SetAffineOverwriteMode(endCreditsApp->managedSprites[i], AFFINE_OVERWRITE_MODE_DOUBLE); + ManagedSprite_SetAnimateFlag(endCreditsApp->managedSprites[i], TRUE); + Sprite_TickFrame(endCreditsApp->managedSprites[i]->sprite); + } +} + +static void EndCreditsScenes_UnloadExtraAnimMorning(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 4; i++) { + Sprite_DeleteAndFreeResources(endCreditsApp->managedSprites[i]); + } +} + +static void EndCreditsScenes_Load3DModelsMorning(EndCreditsApp *endCreditsApp) +{ + int i; + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[0], endCreditsApp->narc, 80, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[0].model); + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[1], endCreditsApp->narc, 81, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[1].model); + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[0]); i++) { + Easy3DObject_Init(&endCreditsApp->bg3DObjects[0][i], &endCreditsApp->bg3DModels[0]); + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[0][i], 0, 0, 0); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[0][i], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[0][i], TRUE); + } + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[1]); i++) { + Easy3DObject_Init(&endCreditsApp->bg3DObjects[1][i], &endCreditsApp->bg3DModels[1]); + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[1][i], 0, 0, 0); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[1][i], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[1][i], TRUE); + } + + endCreditsApp->bg3DModelRows = 2; + + EndCreditsCommon_Load3DModelStartingPositions(endCreditsApp, 0); + EndCreditsCommon_Set3DModelStartingPositions(endCreditsApp); + + endCreditsApp->bg3DModelLoaded = TRUE; +} + +static void EndCreditsScenes_Unload3DModelsMorning(EndCreditsApp *endCreditsApp) +{ + for (int i = 0; i < SNELEMS(endCreditsApp->bg3DModels); i++) { + Easy3DModel_Release(&endCreditsApp->bg3DModels[i]); + } + + endCreditsApp->bg3DModelLoaded = FALSE; +} + +static void EndCreditsScenes_LoadMemories(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_3, FALSE); + endCreditsApp->currentMemory++; + + Bg_ToggleLayer(BG_LAYER_MAIN_3, TRUE); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); +} + +static void EndCreditsScenes_UnloadMemories(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_MAIN_3, FALSE); +} + +static void Dummy_021D2158(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D215C(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2160(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2164(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2168(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D216C(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2170(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2174(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2178(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D217C(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void EndCreditsScenes_LoadBackgroundDay(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 19, HEAP_ID_END_CREDITS, PLTTBUF_MAIN_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 10, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 4, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 22, HEAP_ID_END_CREDITS, PLTTBUF_SUB_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 13, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 7, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + + NNSG2dPaletteData *paletteData; + + void *nclrBuffer = Graphics_GetPlttDataFromOpenNARC(endCreditsApp->narc, 16, &paletteData, HEAP_ID_END_CREDITS); + MI_CpuCopy16(paletteData->pRawData, endCreditsApp->sceneManager.daySceneData.bgPaletteBuffers, PALETTE_SIZE_BYTES * 4); + Heap_Free(nclrBuffer); + + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_ToggleLayer(BG_LAYER_MAIN_2, TRUE); + Bg_ToggleLayer(BG_LAYER_SUB_3, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); +} + +static void EndCreditsScenes_UnloadBackgroundDay(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_MAIN_2, FALSE); + Bg_ToggleLayer(BG_LAYER_SUB_3, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, FALSE); +} + +static void EndCreditsScenes_LoadPlayerSpriteDay(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerSprite(endCreditsApp); +} + +static void EndCreditsScenes_UnloadPlayerSpriteDay(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_UnloadPlayerSprite(endCreditsApp); +} + +static void EndCreditsScenes_LoadPlayerAnimDay(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerAnim(endCreditsApp, &endCreditsApp->managedSprites[END_CREDITS_SPRITE_DAY_PLAYER], &endCreditsApp->managedSprites[END_CREDITS_SPRITE_DAY_SCARF]); +} + +static void EndCreditsScenes_UnloadPlayerAnimDay(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_UnloadPlayerAnim(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_DAY_PLAYER], endCreditsApp->managedSprites[END_CREDITS_SPRITE_DAY_SCARF]); +} + +static void EndCreditsScenes_LoadExtraSpritesDay(EndCreditsApp *endCreditsApp) +{ + SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_SUB_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10004); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10004); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 1, FALSE, 10004); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 2, FALSE, 10004); +} + +static void EndCreditsScenes_UnloadExtraSpritesDay(EndCreditsApp *endCreditsApp) +{ + SpriteManager_UnloadCharObjById(endCreditsApp->spriteManager, 10004); + SpriteManager_UnloadPlttObjById(endCreditsApp->spriteManager, 10004); + SpriteManager_UnloadCellObjById(endCreditsApp->spriteManager, 10004); + SpriteManager_UnloadAnimObjById(endCreditsApp->spriteManager, 10004); +} + +static void EndCreditsScenes_LoadExtraAnimDay(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 3; i++) { + endCreditsApp->managedSprites[i] = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsWingullTemplate); + ManagedSprite_SetAnimateFlag(endCreditsApp->managedSprites[i], TRUE); + Sprite_TickFrame(endCreditsApp->managedSprites[i]->sprite); + } +} + +static void EndCreditsScenes_UnloadExtraAnimDay(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 3; i++) { + Sprite_DeleteAndFreeResources(endCreditsApp->managedSprites[i]); + } +} + +static void EndCreditsScenes_Load3DModelsDay(EndCreditsApp *endCreditsApp) +{ + int i; + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[0], endCreditsApp->narc, 78, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[0].model); + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[0]); i++) { + Easy3DObject_Init(&endCreditsApp->bg3DObjects[0][i], &endCreditsApp->bg3DModels[0]); + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[0][i], 0, 0, 0); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[0][i], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[0][i], TRUE); + } + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[1]); i++) { + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[1][i], FALSE); + } + + endCreditsApp->bg3DModelRows = 1; + + EndCreditsCommon_Load3DModelStartingPositions(endCreditsApp, 1); + EndCreditsCommon_Set3DModelStartingPositions(endCreditsApp); + + endCreditsApp->bg3DModelLoaded = TRUE; +} + +static void EndCreditsScenes_Unload3DModelsDay(EndCreditsApp *endCreditsApp) +{ + for (int i = 0; i < SNELEMS(endCreditsApp->bg3DModels); i++) { + Easy3DModel_Release(&endCreditsApp->bg3DModels[i]); + } + + endCreditsApp->bg3DModelLoaded = FALSE; +} + +static void EndCreditsScenes_LoadBackgroundNight(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 20, HEAP_ID_END_CREDITS, PLTTBUF_MAIN_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 11, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 5, endCreditsApp->bgConfig, BG_LAYER_MAIN_2, 0, 0, 0, HEAP_ID_END_CREDITS); + + PaletteData_LoadBufferFromFileStart(endCreditsApp->paletteData, NARC_INDEX_GRAPHIC__ENDING, 23, HEAP_ID_END_CREDITS, PLTTBUF_SUB_BG, 0, 0); + Graphics_LoadTilesToBgLayerFromOpenNARC(endCreditsApp->narc, 14, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + Graphics_LoadTilemapToBgLayerFromOpenNARC(endCreditsApp->narc, 8, endCreditsApp->bgConfig, BG_LAYER_SUB_3, 0, 0, 0, HEAP_ID_END_CREDITS); + + NNSG2dPaletteData *paletteData; + + void *nclrBuffer = Graphics_GetPlttDataFromOpenNARC(endCreditsApp->narc, 17, &paletteData, HEAP_ID_END_CREDITS); + MI_CpuCopy16(paletteData->pRawData, endCreditsApp->sceneManager.nightSceneData.bgPaletteBuffers, PALETTE_SIZE_BYTES * 8); + Heap_Free(nclrBuffer); + + PaletteData_LoadBuffer(endCreditsApp->paletteData, endCreditsApp->sceneManager.nightSceneData.bgPaletteBuffers, PLTTBUF_MAIN_BG, PLTT_DEST(1), PALETTE_SIZE_BYTES); + PaletteData_LoadBuffer(endCreditsApp->paletteData, endCreditsApp->sceneManager.nightSceneData.bgPaletteBuffers, PLTTBUF_SUB_BG, PLTT_DEST(1), PALETTE_SIZE_BYTES); + + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + + Bg_ToggleLayer(BG_LAYER_MAIN_2, TRUE); + Bg_ToggleLayer(BG_LAYER_SUB_3, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); +} + +static void EndCreditsScenes_UnloadBackgroundNight(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_MAIN_2, FALSE); + Bg_ToggleLayer(BG_LAYER_SUB_3, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, FALSE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, FALSE); +} + +static void EndCreditsScenes_LoadPlayerSpriteNight(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerSprite(endCreditsApp); + + SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_MAIN_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 15, FALSE, 4, NNS_G2D_VRAM_TYPE_2DMAIN, 10002); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 0, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10002); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 1, FALSE, 10002); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 2, FALSE, 10002); +} + +static void EndCreditsScenes_UnloadPlayerSpriteNight(EndCreditsApp *endCreditsApp) +{ + SpriteManager_UnloadCharObjById(endCreditsApp->spriteManager, 10002); + SpriteManager_UnloadPlttObjById(endCreditsApp->spriteManager, 10002); + SpriteManager_UnloadCellObjById(endCreditsApp->spriteManager, 10002); + SpriteManager_UnloadAnimObjById(endCreditsApp->spriteManager, 10002); + + EndCreditsScenes_UnloadPlayerSprite(endCreditsApp); +} + +static void EndCreditsScenes_LoadPlayerAnimNight(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_LoadPlayerAnim(endCreditsApp, &endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_PLAYER], &endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_SCARF]); + + endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1] = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsMeteorTemplate1); + + ManagedSprite_SetAnimateFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], TRUE); + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], FALSE); + Sprite_TickFrame(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1]->sprite); +} + +static void EndCreditsScenes_UnloadPlayerAnimNight(EndCreditsApp *endCreditsApp) +{ + EndCreditsScenes_UnloadPlayerAnim(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_PLAYER], endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_SCARF]); + Sprite_DeleteAndFreeResources(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1]); +} + +static void EndCreditsScenes_LoadExtraSpritesNight(EndCreditsApp *endCreditsApp) +{ + SpriteSystem_LoadPaletteBufferFromOpenNarc(endCreditsApp->paletteData, PLTTBUF_SUB_OBJ, endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10005); + SpriteSystem_LoadCharResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10005); + SpriteSystem_LoadCellResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 1, FALSE, 10005); + SpriteSystem_LoadAnimResObjFromOpenNarc(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, endCreditsApp->narc, 2, FALSE, 10005); +} + +static void EndCreditsScenes_UnloadExtraSpritesNight(EndCreditsApp *endCreditsApp) +{ + SpriteManager_UnloadCharObjById(endCreditsApp->spriteManager, 10005); + SpriteManager_UnloadPlttObjById(endCreditsApp->spriteManager, 10005); + SpriteManager_UnloadCellObjById(endCreditsApp->spriteManager, 10005); + SpriteManager_UnloadAnimObjById(endCreditsApp->spriteManager, 10005); +} + +static void EndCreditsScenes_LoadExtraAnimNight(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 2; i++) { + endCreditsApp->managedSprites[i] = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsMagnezoneTemplate); + ManagedSprite_SetAnimateFlag(endCreditsApp->managedSprites[i], TRUE); + Sprite_TickFrame(endCreditsApp->managedSprites[i]->sprite); + } + + endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2] = SpriteSystem_NewSprite(endCreditsApp->spriteSystem, endCreditsApp->spriteManager, &sEndCreditsMeteorTemplate2); + + ManagedSprite_SetAnimateFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], TRUE); + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], FALSE); + Sprite_TickFrame(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2]->sprite); +} + +static void EndCreditsScenes_UnloadExtraAnimNight(EndCreditsApp *endCreditsApp) +{ + for (int i = 2; i <= 2; i++) { + Sprite_DeleteAndFreeResources(endCreditsApp->managedSprites[i]); + } + + Sprite_DeleteAndFreeResources(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2]); +} + +static void EndCreditsScenes_Load3DModelsNight(EndCreditsApp *endCreditsApp) +{ + int i; + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[0], endCreditsApp->narc, 82, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[0].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[0].model); + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[1], endCreditsApp->narc, 83, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[1].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[1].model); + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[2], endCreditsApp->narc, 84, HEAP_ID_END_CREDITS); + + NNS_G3dMdlUseGlbDiff(endCreditsApp->bg3DModels[2].model); + NNS_G3dMdlUseGlbAmb(endCreditsApp->bg3DModels[2].model); + NNS_G3dMdlUseGlbSpec(endCreditsApp->bg3DModels[2].model); + NNS_G3dMdlUseGlbEmi(endCreditsApp->bg3DModels[2].model); + + Easy3DModel_LoadFrom(&endCreditsApp->bg3DModels[3], endCreditsApp->narc, 79, HEAP_ID_END_CREDITS); + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[0]); i++) { + Easy3DObject_Init(&endCreditsApp->bg3DObjects[0][i], &endCreditsApp->bg3DModels[0]); + + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[0][i], 0, 0, 0); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[0][i], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[0][i], TRUE); + } + + for (i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[1]); i++) { + Easy3DObject_Init(&endCreditsApp->bg3DObjects[1][i], &endCreditsApp->bg3DModels[2]); + + Easy3DObject_SetPosition(&endCreditsApp->bg3DObjects[1][i], 0, 0, 0); + Easy3DObject_SetScale(&endCreditsApp->bg3DObjects[1][i], FX32_ONE, FX32_ONE, FX32_ONE); + Easy3DObject_SetVisible(&endCreditsApp->bg3DObjects[1][i], TRUE); + } + + endCreditsApp->bg3DModelRows = 2; + + EndCreditsCommon_Load3DModelStartingPositions(endCreditsApp, 2); + EndCreditsCommon_Set3DModelStartingPositions(endCreditsApp); + + endCreditsApp->bg3DModelLoaded = TRUE; +} + +static void EndCreditsScenes_Unload3DModelsNight(EndCreditsApp *endCreditsApp) +{ + for (int i = 0; i < SNELEMS(endCreditsApp->bg3DModels); i++) { + Easy3DModel_Release(&endCreditsApp->bg3DModels[i]); + } + + endCreditsApp->bg3DModelLoaded = FALSE; +} + +static void EndCreditsScenes_LoadTwinleaf(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + EndCredits_InitFinalScenes(endCreditsApp); + + endCreditsApp->currentMemory = END_CREDITS_MEMORY_ROUTE_201_STARTER; + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_2, TRUE); + endCreditsApp->currentMemory++; + + Bg_ToggleLayer(BG_LAYER_MAIN_2, TRUE); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_MAIN_2); +} + +static void EndCreditsScenes_UnloadTwinleaf(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_MAIN_2, FALSE); + Bg_ToggleLayer(BG_LAYER_MAIN_3, FALSE); +} + +static void Dummy_021D2A84(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A88(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A8C(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A90(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A94(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A98(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2A9C(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2AA0(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2AA4(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2AA8(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void EndCreditsScenes_LoadFin(EndCreditsApp *endCreditsApp) +{ + BgConfig *bgConfig = endCreditsApp->bgConfig; + + gSystem.whichScreenIs3D = DS_SCREEN_MAIN; + + GXLayers_SwapDisplay(); + PaletteData_FillBufferRange(endCreditsApp->paletteData, PLTTBUF_MAIN_BG, PLTTSEL_BOTH, 0x0, 0, 1); + + endCreditsApp->window = Window_New(HEAP_ID_END_CREDITS, 1); + + Window_Add(bgConfig, endCreditsApp->window, BG_LAYER_SUB_3, 0, 0, 32, 32, 15, 0); + Window_FillTilemap(endCreditsApp->window, 15); + Window_PutToTilemap(endCreditsApp->window); + + String *finalString = MessageLoader_GetNewString(endCreditsApp->messageLoader, EndCreditsStrings_GetLastMessageID()); + int xOffset = (256 - Font_CalcStringWidth(FONT_SYSTEM, finalString, 0)) / 2; + + Text_AddPrinterWithParamsColorAndSpacing(endCreditsApp->window, FONT_SYSTEM, finalString, xOffset, 80, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 15), 3, 0, NULL); + Window_LoadTiles(endCreditsApp->window); + String_Free(finalString); + + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, 0); + Bg_SetOffset(bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, 0); + Bg_ToggleLayer(BG_LAYER_SUB_3, TRUE); + + GX_SetVisibleWnd(GX_WNDMASK_NONE); + GXS_SetVisibleWnd(GX_WNDMASK_NONE); + + SetScreenMasterBrightness(DS_SCREEN_MAIN, BRIGHTNESS_BLACK); + SetScreenMasterBrightness(DS_SCREEN_SUB, BRIGHTNESS_BLACK); + BrightnessController_SetScreenBrightness(BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + Bg_ScheduleTilemapTransfer(endCreditsApp->bgConfig, BG_LAYER_SUB_3); +} + +static void EndCreditsScenes_UnloadFin(EndCreditsApp *endCreditsApp) +{ + Bg_ToggleLayer(BG_LAYER_SUB_3, FALSE); + + if (endCreditsApp->window != NULL) { + Window_Remove(endCreditsApp->window); + Heap_Free(endCreditsApp->window); + endCreditsApp->window = NULL; + } +} + +static void Dummy_021D2BE0(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BE4(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BE8(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BEC(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BF0(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BF4(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BF8(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2BFC(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2C00(EndCreditsApp *endCreditsApp) +{ + return; +} + +static void Dummy_021D2C04(EndCreditsApp *endCreditsApp) +{ + return; +} diff --git a/src/cutscenes/end_credits/scenes/bike_day.c b/src/cutscenes/end_credits/scenes/bike_day.c new file mode 100644 index 00000000000..57bb58a5369 --- /dev/null +++ b/src/cutscenes/end_credits/scenes/bike_day.c @@ -0,0 +1,333 @@ +#include +#include + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" + +#include "bg_window.h" +#include "brightness_controller.h" +#include "math_util.h" +#include "palette.h" +#include "sprite_system.h" + +enum EndCreditsDaySceneState { + END_CREDITS_DAY_SCENE_STATE_INIT = 0, + END_CREDITS_DAY_SCENE_STATE_RUNNING, + END_CREDITS_DAY_SCENE_STATE_END +}; + +enum EndCreditsDaySceneWingullPhase { + END_CREDITS_DAY_SCENE_WINGULL_PHASE_INIT = 0, + END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_IN, + END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_AROUND_INIT, + END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_AROUND, + END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_OUT_INIT, + END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_OUT +}; + +typedef struct WingullAnim { + s32 animStartFrame; + fx32 flyInXAmplitude; + fx32 flyInYAmplitude; + fx32 startFlyInSpeed; + fx32 startDegrees; + fx32 startDecelDegree; + fx32 endDecelDegree; + fx32 decelSpeed; + fx32 minSpeed; + fx32 xAmplitude; + fx32 yAmplitude; + fx32 xSpeed; + fx32 ySpeed; + fx32 flyOutXAmplitude; + fx32 flyOutYAmplitude; + fx32 flyOutSpeed; + fx32 startXPos; + fx32 startYPos; + fx32 moveUpSpeed; + s32 rotateSpeed; + u16 rotateDuration; + u16 unused_52; +} WingullAnim; + +static void EndCreditsDayScene_SetWingullStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data); +static void EndCreditsDayScene_AnimateAllWingull(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data); +static void EndCreditsDayScene_AnimateBackground(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data); +static void EndCreditsDayScene_AnimateBackgroundSun(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data); +static void EndCreditsDayScene_AnimateWingull(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data, ManagedSprite *managedSprite, int index); + +static const WingullAnim sEndCreditsWingullAnims[] = { + { + .animStartFrame = 90, + .flyInXAmplitude = 160 * FX32_ONE, + .flyInYAmplitude = 32 * FX32_ONE, + .startFlyInSpeed = 9984, + .startDegrees = 0 * FX32_ONE, + .startDecelDegree = 70 * FX32_ONE, + .endDecelDegree = 90 * FX32_ONE, + .decelSpeed = 512, + .minSpeed = 6144, + .xAmplitude = -24 * FX32_ONE, + .yAmplitude = 7 * FX32_ONE, + .xSpeed = 6912, + .ySpeed = 30720, + .flyOutXAmplitude = 160 * FX32_ONE, + .flyOutYAmplitude = 60 * FX32_ONE, + .flyOutSpeed = 12288, + .startXPos = (128 - 54) * FX32_ONE, + .startYPos = (96 + 16) * FX32_ONE, + .moveUpSpeed = 128, + .rotateSpeed = 80, + .rotateDuration = 30, + }, + { + .animStartFrame = 100, + .flyInXAmplitude = -160 * FX32_ONE, + .flyInYAmplitude = -48 * FX32_ONE, + .startFlyInSpeed = 9216, + .startDegrees = 0 * FX32_ONE, + .startDecelDegree = 80 * FX32_ONE, + .endDecelDegree = 90 * FX32_ONE, + .decelSpeed = 64, + .minSpeed = 6144, + .xAmplitude = 24 * FX32_ONE, + .yAmplitude = 6 * FX32_ONE, + .xSpeed = 7424, + .ySpeed = 28672, + .flyOutXAmplitude = -160 * FX32_ONE, + .flyOutYAmplitude = -52 * FX32_ONE, + .flyOutSpeed = 10240, + .startXPos = (128 + 62) * FX32_ONE, + .startYPos = (96 + 10) * FX32_ONE, + .moveUpSpeed = 128, + .rotateSpeed = 70, + .rotateDuration = 35, + }, +}; + +BOOL EndCreditsDayScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsDaySceneData *data = &sceneManager->daySceneData; + + switch (sceneManager->state) { + case END_CREDITS_DAY_SCENE_STATE_INIT: + EndCreditsDayScene_SetWingullStartingPositions(endCreditsApp, data); + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_DAY_SCENE_STATE_RUNNING: + if (endCreditsApp->framesElapsed >= 6000) { + BrightnessController_StartTransition(24, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + } + break; + case END_CREDITS_DAY_SCENE_STATE_END: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + return TRUE; + } + break; + } + + EndCreditsCommon_AnimatePlayerSprite(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_DAY_PLAYER]); + EndCreditsDayScene_AnimateAllWingull(endCreditsApp, data); + EndCreditsCommon_Scroll3DModels(endCreditsApp, -1); + EndCreditsDayScene_AnimateBackground(endCreditsApp, data); + EndCreditsDayScene_AnimateBackgroundSun(endCreditsApp, data); + + return FALSE; +} + +static void EndCreditsDayScene_SetWingullStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data) +{ + int j = 0; + + GF_ASSERT(NELEMS(sEndCreditsWingullAnims) == 3 - 2 + 1); + + for (int i = 2; i <= 3; i++, j++) { + data->wingullStates[j].xPos = sEndCreditsWingullAnims[j].startXPos - sEndCreditsWingullAnims[j].flyInXAmplitude; + data->wingullStates[j].yPos = sEndCreditsWingullAnims[j].startYPos; + data->wingullStates[j].degrees = sEndCreditsWingullAnims[j].startDegrees; + data->wingullStates[j].flyInOutSpeed = sEndCreditsWingullAnims[j].startFlyInSpeed; + data->wingullStates[j].xOffset = FX_Mul(CalcSineDegrees_FX32(sEndCreditsWingullAnims[j].startDegrees), sEndCreditsWingullAnims[j].flyInXAmplitude); + data->wingullStates[j].yOffset = FX_Mul(CalcCosineDegrees_FX32(sEndCreditsWingullAnims[j].startDegrees), sEndCreditsWingullAnims[j].flyInYAmplitude); + data->wingullStates[j].startTimer = sEndCreditsWingullAnims[j].animStartFrame; + + ManagedSprite_SetPositionFxXYWithSubscreenOffset(endCreditsApp->managedSprites[i], data->wingullStates[j].xPos + data->wingullStates[j].xOffset, data->wingullStates[j].yPos + data->wingullStates[j].yOffset, ((192 + 80) << FX32_SHIFT)); + ManagedSprite_SetAffineOverwriteMode(endCreditsApp->managedSprites[i], AFFINE_OVERWRITE_MODE_DOUBLE); + } +} + +static void EndCreditsDayScene_AnimateAllWingull(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data) +{ + int j = 0; + + for (int i = 2; i <= 3; i++, j++) { + EndCreditsDayScene_AnimateWingull(endCreditsApp, data, endCreditsApp->managedSprites[i], j); + } +} + +static void EndCreditsDayScene_AnimateWingull(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data, ManagedSprite *managedSprite, int index) +{ + WingullState *currentState = &data->wingullStates[index]; + const WingullAnim *wingullAnim = &sEndCreditsWingullAnims[index]; + fx32 unused1 = 0, unused2 = 0; + + if (currentState->startTimer > 0) { + currentState->startTimer--; + return; + } + + switch (currentState->phase) { + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_INIT: + currentState->phase++; + // fallthrough + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_IN: + if (currentState->degrees > wingullAnim->startDecelDegree) { + currentState->flyInOutSpeed -= wingullAnim->decelSpeed; + + if (currentState->flyInOutSpeed < wingullAnim->minSpeed) { + currentState->flyInOutSpeed = wingullAnim->minSpeed; + } + } + + currentState->degrees += currentState->flyInOutSpeed; + + if (currentState->degrees >= wingullAnim->endDecelDegree) { + currentState->degrees = wingullAnim->endDecelDegree; + currentState->phase++; + } + + currentState->xOffset = FX_Mul(CalcSineDegrees_FX32(currentState->degrees), wingullAnim->flyInXAmplitude); + currentState->yOffset = FX_Mul(CalcCosineDegrees_FX32(currentState->degrees), wingullAnim->flyInYAmplitude); + break; + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_AROUND_INIT: + currentState->xPos += currentState->xOffset; + currentState->yPos += currentState->yOffset; + currentState->xOffset = 0; + currentState->yOffset = 0; + currentState->xSpeed = wingullAnim->xSpeed; + currentState->ySpeed = wingullAnim->ySpeed; + currentState->phase++; + // fallthrough + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_AROUND: + currentState->xDegrees += currentState->xSpeed; + currentState->yDegrees += currentState->ySpeed; + + if (currentState->xDegrees >= (360 << FX32_SHIFT)) { + currentState->xDegrees -= 360 << FX32_SHIFT; + } + + if (currentState->yDegrees >= (360 << FX32_SHIFT)) { + currentState->yDegrees -= 360 << FX32_SHIFT; + } + + currentState->xOffset = FX_Mul(CalcSineDegrees_FX32(currentState->xDegrees), wingullAnim->xAmplitude); + currentState->yOffset = FX_Mul(CalcSineDegrees_FX32(currentState->yDegrees), wingullAnim->yAmplitude); + + if (endCreditsApp->framesElapsed >= 5970) { + currentState->xSpeed -= wingullAnim->xSpeed / 20; + currentState->ySpeed -= wingullAnim->ySpeed / 20; + + if (currentState->xSpeed <= wingullAnim->xSpeed / 20) { + currentState->phase++; + } + } + break; + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_OUT_INIT: + currentState->xPos = (currentState->xPos + currentState->xOffset) - wingullAnim->flyOutXAmplitude; + currentState->yPos = currentState->yPos + currentState->yOffset; + currentState->degrees = 0; + currentState->flyInOutSpeed = wingullAnim->flyOutSpeed; + currentState->xOffset = FX_Mul(CalcSineDegrees_FX32(0), wingullAnim->flyOutXAmplitude); + currentState->yOffset = FX_Mul(CalcCosineDegrees_FX32(0), wingullAnim->flyOutYAmplitude); + currentState->phase++; + // fallthrough + case END_CREDITS_DAY_SCENE_WINGULL_PHASE_FLY_OUT: + currentState->degrees += currentState->flyInOutSpeed; + currentState->xOffset = FX_Mul(CalcCosineDegrees_FX32(currentState->degrees), wingullAnim->flyOutXAmplitude); + currentState->yOffset = FX_Mul(CalcSineDegrees_FX32(currentState->degrees), wingullAnim->flyOutYAmplitude); + + if (currentState->degrees >= (180 << FX32_SHIFT)) { + currentState->phase++; + } + break; + default: + break; + } + + if (currentState->rotateDirection == 0) { + ManagedSprite_OffsetAffineZRotation(managedSprite, wingullAnim->rotateSpeed); + } else { + ManagedSprite_OffsetAffineZRotation(managedSprite, -wingullAnim->rotateSpeed); + } + + currentState->rotateTimer++; + + if (currentState->rotateTimer >= wingullAnim->rotateDuration) { + currentState->rotateTimer = 0; + currentState->rotateDirection ^= 1; + } + + currentState->yPos -= wingullAnim->moveUpSpeed; + ManagedSprite_SetPositionFxXYWithSubscreenOffset(managedSprite, currentState->xPos + currentState->xOffset, currentState->yPos + currentState->yOffset, ((192 + 80) << FX32_SHIFT)); +} + +static void EndCreditsDayScene_AnimateBackground(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data) +{ + data->bgYPos += 96; + + Bg_SetOffset(endCreditsApp->bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_Y, data->bgYPos / FX32_ONE); + Bg_SetOffset(endCreditsApp->bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_Y, data->bgYPos / FX32_ONE); +} + +static void EndCreditsDayScene_AnimateBackgroundSun(EndCreditsApp *endCreditsApp, EndCreditsDaySceneData *data) +{ + int unused, fraction, nextFrame; + + int frames = data->currentTransitionFrame; + data->fraction += 512; + + if (data->fraction >= (16 << 8)) { + fraction = 16; + data->fraction = 0; + + if (data->animDirection == 0) { + data->currentTransitionFrame++; + + if (data->currentTransitionFrame >= 4) { + data->currentTransitionFrame = 4 - 2; + data->animDirection ^= 1; + } + } else { + data->currentTransitionFrame--; + + if (data->currentTransitionFrame < 0) { + data->currentTransitionFrame = 1; + data->animDirection ^= 1; + } + } + } else { + fraction = data->fraction >> 8; + } + + if (data->animDirection == 0) { + nextFrame = frames + 1; + + if (nextFrame >= 4) { + nextFrame = frames - 1; + } + } else { + nextFrame = frames - 1; + + if (nextFrame < 0) { + nextFrame = 1; + } + } + + u16 *fadedBuffer = PaletteData_GetFadedBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_BG); + + for (int i = 0; i < 16; i++) { + BlendPalette(&data->bgPaletteBuffers[frames][i], &fadedBuffer[(2 * 16) + i], 1, fraction, data->bgPaletteBuffers[nextFrame][i]); + } +} diff --git a/src/cutscenes/end_credits/scenes/bike_morning.c b/src/cutscenes/end_credits/scenes/bike_morning.c new file mode 100644 index 00000000000..73c389ac91c --- /dev/null +++ b/src/cutscenes/end_credits/scenes/bike_morning.c @@ -0,0 +1,169 @@ +#include +#include + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" + +#include "bg_window.h" +#include "brightness_controller.h" +#include "math_util.h" +#include "sprite_system.h" + +enum EndCreditsMorningSceneState { + END_CREDITS_MORNING_SCENE_STATE_INIT = 0, + END_CREDITS_MORNING_SCENE_STATE_RUNNING, + END_CREDITS_MORNING_SCENE_STATE_END +}; + +typedef struct DrifloonAnim { + s32 animStartFrame; + fx32 startXPos; + fx32 startYPos; + fx32 speedX; + fx32 speedY; + fx32 bobbingSpeed; + fx32 yAmplitude; + f32 scaleSpeed; + u16 scaleDuration; + u16 unused_22; +} DrifloonAnim; + +static void EndCreditsMorningScene_SetDrifloonStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data); +static void EndCreditsMorningScene_AnimateDrifloon(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data); +static void EndCreditsMorningScene_AnimateBackground(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data); +static void EndCreditsMorningScene_UpdateDrifloonAnim(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data, ManagedSprite *managedSprite, int index); + +static const DrifloonAnim sEndCreditsDrifloonAnims[] = { + { + .animStartFrame = 900, + .startXPos = -64 * FX32_ONE, + .startYPos = 80 * FX32_ONE, + .speedX = 1536, + .speedY = -128, + .bobbingSpeed = 3584, + .yAmplitude = 32768, + .scaleSpeed = 0.0030, + .scaleDuration = 60, + }, + { + .animStartFrame = 1350, + .startXPos = -64 * FX32_ONE, + .startYPos = 190 * FX32_ONE, + .speedX = 1920, + .speedY = -160, + .bobbingSpeed = 4096, + .yAmplitude = 49152, + .scaleSpeed = -0.0040, + .scaleDuration = 50, + }, + { + .animStartFrame = 1590, + .startXPos = -64 * FX32_ONE, + .startYPos = 120 * FX32_ONE, + .speedX = 1600, + .speedY = -144, + .bobbingSpeed = 3072, + .yAmplitude = 32768, + .scaleSpeed = -0.0045, + .scaleDuration = 60, + }, +}; + +BOOL EndCreditsMorningScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsMorningSceneData *data = &sceneManager->morningSceneData; + + switch (sceneManager->state) { + case END_CREDITS_MORNING_SCENE_STATE_INIT: + EndCreditsMorningScene_SetDrifloonStartingPositions(endCreditsApp, data); + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_MORNING_SCENE_STATE_RUNNING: + if (endCreditsApp->framesElapsed >= 1830) { + BrightnessController_StartTransition(24, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + } + break; + case END_CREDITS_MORNING_SCENE_STATE_END: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + return TRUE; + } + break; + } + + EndCreditsCommon_AnimatePlayerSprite(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_MORNING_PLAYER]); + EndCreditsMorningScene_AnimateDrifloon(endCreditsApp, data); + EndCreditsCommon_Scroll3DModels(endCreditsApp, -1); + EndCreditsMorningScene_AnimateBackground(endCreditsApp, data); + + return FALSE; +} + +static void EndCreditsMorningScene_SetDrifloonStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data) +{ + int j = 0; + + GF_ASSERT(NELEMS(sEndCreditsDrifloonAnims) == 4 - 2 + 1); + + for (int i = 2; i <= 4; i++, j++) { + ManagedSprite_SetPositionFxXYWithSubscreenOffset(endCreditsApp->managedSprites[i], sEndCreditsDrifloonAnims[j].startXPos, sEndCreditsDrifloonAnims[j].startYPos, ((192 + 80) << FX32_SHIFT)); + data->drifloonStates[j].xPos = sEndCreditsDrifloonAnims[j].startXPos; + data->drifloonStates[j].yPos = sEndCreditsDrifloonAnims[j].startYPos; + } +} + +static void EndCreditsMorningScene_AnimateDrifloon(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data) +{ + int j = 0; + + for (int i = 2; i <= 4; i++, j++) { + EndCreditsMorningScene_UpdateDrifloonAnim(endCreditsApp, data, endCreditsApp->managedSprites[i], j); + } +} + +static void EndCreditsMorningScene_UpdateDrifloonAnim(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data, ManagedSprite *managedSprite, int index) +{ + DrifloonState *currentState = &data->drifloonStates[index]; + const DrifloonAnim *drifloonAnim = &sEndCreditsDrifloonAnims[index]; + + if (currentState->frame < drifloonAnim->animStartFrame) { + currentState->frame++; + return; + } + + currentState->degrees += drifloonAnim->bobbingSpeed; + + if (currentState->degrees >= (360 << FX32_SHIFT)) { + currentState->degrees -= 360 << FX32_SHIFT; + } + + fx32 yOffset = FX_Mul(CalcSineDegrees_FX32(currentState->degrees), drifloonAnim->yAmplitude); + + currentState->xPos += drifloonAnim->speedX; + currentState->yPos += drifloonAnim->speedY; + + ManagedSprite_SetPositionFxXYWithSubscreenOffset(managedSprite, currentState->xPos, currentState->yPos + yOffset, ((192 + 80) << FX32_SHIFT)); + + if (currentState->scaleDirection == 0) { + ManagedSprite_OffsetAffineScale(managedSprite, drifloonAnim->scaleSpeed, drifloonAnim->scaleSpeed); + } else { + ManagedSprite_OffsetAffineScale(managedSprite, -drifloonAnim->scaleSpeed, -drifloonAnim->scaleSpeed); + } + + currentState->scaleTimer++; + + if (currentState->scaleTimer >= drifloonAnim->scaleDuration) { + currentState->scaleTimer = 0; + currentState->scaleDirection ^= 1; + } +} + +static void EndCreditsMorningScene_AnimateBackground(EndCreditsApp *endCreditsApp, EndCreditsMorningSceneData *data) +{ + data->bgXPos += -64; + + Bg_SetOffset(endCreditsApp->bgConfig, BG_LAYER_MAIN_2, BG_OFFSET_UPDATE_SET_X, data->bgXPos / FX32_ONE); + Bg_SetOffset(endCreditsApp->bgConfig, BG_LAYER_SUB_3, BG_OFFSET_UPDATE_SET_X, data->bgXPos / FX32_ONE); +} diff --git a/src/cutscenes/end_credits/scenes/bike_night.c b/src/cutscenes/end_credits/scenes/bike_night.c new file mode 100644 index 00000000000..cbf78f4623b --- /dev/null +++ b/src/cutscenes/end_credits/scenes/bike_night.c @@ -0,0 +1,369 @@ +#include +#include + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" +#include "pch/global_pch.h" + +#include "brightness_controller.h" +#include "coordinates.h" +#include "math_util.h" +#include "palette.h" +#include "sprite_system.h" + +enum EndCreditsNightSceneState { + END_CREDITS_NIGHT_SCENE_STATE_INIT = 0, + END_CREDITS_NIGHT_SCENE_STATE_WAIT, + END_CREDITS_NIGHT_SCENE_STATE_RUNNING, + END_CREDITS_NIGHT_SCENE_STATE_END +}; + +enum EndCreditsNightSceneModelType { + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE = 0, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_LAMPPOST = 3 +}; + +enum EndCreditsNightBackgroundState { + END_CREDITS_NIGHT_BACKGROUND_STATE_STATIC = 0, + END_CREDITS_NIGHT_BACKGROUND_STATE_TRANSITION +}; + +typedef struct MagnezoneAnim { + s16 startXPos; + s16 startYPos; + fx32 xSpeed; + fx32 ySpeed; + fx32 bobbingSpeed; + fx32 amplitude; + s32 rotateSpeed; + u16 rotateDuration; +} MagnezoneAnim; + +static void EndCreditsNightScene_SetMagnezoneStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data); +static void EndCreditsNightScene_AnimateMagnezone(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data); +static void EndCreditsNightScene_UpdateMagnezoneAnim(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data, ManagedSprite *managedSprite, int index); +static void EndCreditsNightScene_AnimateBackgroundSprite(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data); +static void EndCreditsNightScene_InitMeteors(EndCreditsApp *endCreditsApp); +static void EndCreditsNightScene_AnimateMeteors(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data); +static void EndCreditsNightScene_SetMeteorStartingPosition(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data, int index); +static void EndCreditsNightScene_UpdateMeteorAnim(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data); + +static const MagnezoneAnim sEndCreditsMagnezoneAnims[] = { + { .startXPos = 304, .startYPos = -10, .xSpeed = -3584, .ySpeed = 1536, .bobbingSpeed = 32768, .amplitude = 49152, .rotateSpeed = 150, .rotateDuration = 20 } +}; + +static const CoordinatesU16 sEndCreditsMeteorAnims[] = { + { .x = 200, .y = 0 }, + { .x = 144, .y = 0 }, + { .x = 180, .y = 0 } +}; + +ALIGN_4 const u16 sEndCreditsNightTreeTypes[] = { + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_NORMAL_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE, + END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE +}; + +BOOL EndCreditsNightScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsNightSceneData *data = &sceneManager->nightSceneData; + s32 modelType; + + switch (sceneManager->state) { + case END_CREDITS_NIGHT_SCENE_STATE_INIT: + for (int i = 0; i < SNELEMS(endCreditsApp->bg3DObjects[0]); i++) { + MI_CpuClear8(&endCreditsApp->bg3DObjects[0][i].renderObj, sizeof(NNSG3dRenderObj)); + + if (i % 8 == 0) { + modelType = END_CREDITS_NIGHT_SCENE_MODEL_TYPE_LAMPPOST; + } else if (i >= NELEMS(sEndCreditsNightTreeTypes)) { + modelType = END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE; + } else { + modelType = sEndCreditsNightTreeTypes[i]; + } + + NNS_G3dRenderObjInit(&endCreditsApp->bg3DObjects[0][i].renderObj, endCreditsApp->bg3DModels[modelType].model); + } + + data->modelToRender = 16; + + EndCreditsNightScene_SetMagnezoneStartingPositions(endCreditsApp, data); + EndCreditsNightScene_InitMeteors(endCreditsApp); + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_NIGHT_SCENE_STATE_WAIT: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + G2_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, 31, 0); + sceneManager->state++; + } + break; + case END_CREDITS_NIGHT_SCENE_STATE_RUNNING: + if (endCreditsApp->framesElapsed >= 7980) { + BrightnessController_StartTransition(24, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + } + break; + case END_CREDITS_NIGHT_SCENE_STATE_END: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + return TRUE; + } + break; + } + + if (data->modelToRender % 8 == 0) { + modelType = END_CREDITS_NIGHT_SCENE_MODEL_TYPE_LAMPPOST; + } else if (data->modelToRender >= NELEMS(sEndCreditsNightTreeTypes)) { + modelType = END_CREDITS_NIGHT_SCENE_MODEL_TYPE_SNOW_TREE; + } else { + modelType = sEndCreditsNightTreeTypes[data->modelToRender]; + } + + if (EndCreditsCommon_Scroll3DModels(endCreditsApp, modelType) == TRUE) { + data->modelToRender++; + } + + EndCreditsCommon_AnimatePlayerSprite(endCreditsApp, endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_PLAYER]); + EndCreditsNightScene_AnimateMagnezone(endCreditsApp, data); + EndCreditsNightScene_AnimateMeteors(endCreditsApp, data); + EndCreditsNightScene_AnimateBackgroundSprite(endCreditsApp, data); + + return FALSE; +} + +static void EndCreditsNightScene_SetMagnezoneStartingPositions(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data) +{ + int j = 0; + + GF_ASSERT(NELEMS(sEndCreditsMagnezoneAnims) == 2 - 2 + 1); + + for (int i = 2; i <= 2; i++, j++) { + ManagedSprite_SetAffineOverwriteMode(endCreditsApp->managedSprites[i], AFFINE_OVERWRITE_MODE_DOUBLE); + ManagedSprite_SetPositionXYWithSubscreenOffset(endCreditsApp->managedSprites[i], sEndCreditsMagnezoneAnims[j].startXPos, sEndCreditsMagnezoneAnims[j].startYPos, ((192 + 80) << FX32_SHIFT)); + data->magnezoneStates[j].xPos = sEndCreditsMagnezoneAnims[j].startXPos * FX32_ONE; + data->magnezoneStates[j].yPos = sEndCreditsMagnezoneAnims[j].startYPos * FX32_ONE; + } +} + +static void EndCreditsNightScene_AnimateMagnezone(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data) +{ + int j = 0; + + if (endCreditsApp->framesElapsed < 7440) { + return; + } + + for (int i = 2; i <= 2; i++, j++) { + EndCreditsNightScene_UpdateMagnezoneAnim(endCreditsApp, data, endCreditsApp->managedSprites[i], j); + } +} + +static void EndCreditsNightScene_UpdateMagnezoneAnim(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data, ManagedSprite *managedSprite, int index) +{ + MagnezoneState *currentState = &data->magnezoneStates[index]; + const MagnezoneAnim *magnezoneAnim = &sEndCreditsMagnezoneAnims[index]; + + if (currentState->xPos < -64 * FX32_ONE) { + return; + } + + currentState->degrees += magnezoneAnim->bobbingSpeed; + + if (currentState->degrees >= (360 << FX32_SHIFT)) { + currentState->degrees -= 360 << FX32_SHIFT; + } + + fx32 yOffset = FX_Mul(CalcSineDegrees_FX32(currentState->degrees), magnezoneAnim->amplitude); + + currentState->xPos += magnezoneAnim->xSpeed; + currentState->yPos += magnezoneAnim->ySpeed; + + ManagedSprite_SetPositionFxXYWithSubscreenOffset(managedSprite, currentState->xPos, currentState->yPos + yOffset, ((192 + 80) << FX32_SHIFT)); + + if (currentState->rotateDirection == 0) { + ManagedSprite_OffsetAffineZRotation(managedSprite, magnezoneAnim->rotateSpeed); + } else { + ManagedSprite_OffsetAffineZRotation(managedSprite, -magnezoneAnim->rotateSpeed); + } + + currentState->rotateTimer++; + + if (currentState->rotateTimer >= magnezoneAnim->rotateDuration) { + currentState->rotateTimer = 0; + currentState->rotateDirection ^= 1; + } +} + +static void EndCreditsNightScene_InitMeteors(EndCreditsApp *endCreditsApp) +{ + ManagedSprite_SetExplicitOamMode(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], GX_OAM_MODE_XLU); + ManagedSprite_SetExplicitOamMode(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], GX_OAM_MODE_XLU); +} + +static void EndCreditsNightScene_AnimateMeteors(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data) +{ + if (endCreditsApp->framesElapsed == 7200) { + EndCreditsNightScene_SetMeteorStartingPosition(endCreditsApp, data, 0); + } + + if (endCreditsApp->framesElapsed == 7380) { + EndCreditsNightScene_SetMeteorStartingPosition(endCreditsApp, data, 1); + } + + if (endCreditsApp->framesElapsed == 7440) { + EndCreditsNightScene_SetMeteorStartingPosition(endCreditsApp, data, 2); + } + + EndCreditsNightScene_UpdateMeteorAnim(endCreditsApp, data); +} + +static void EndCreditsNightScene_SetMeteorStartingPosition(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data, int index) +{ + GF_ASSERT(data->meteorLoaded == FALSE); + GF_ASSERT(NELEMS(sEndCreditsMeteorAnims) > index); + + data->meteorLoaded = TRUE; + data->meteorScreen = 0; + data->ev1 = 0; + data->ev2 = 31; + + ManagedSprite_SetPositionXYWithSubscreenOffset(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], sEndCreditsMeteorAnims[index].x, sEndCreditsMeteorAnims[index].y, ((192 + 80) << FX32_SHIFT)); + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], TRUE); + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], FALSE); + + G2S_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, data->ev1, data->ev2); + G2_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, data->ev2, data->ev1); +} + +static void EndCreditsNightScene_UpdateMeteorAnim(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data) +{ + s16 xPos, yPos; + + if (data->meteorLoaded == FALSE) { + return; + } + + if (data->meteorScreen == 0) { + data->ev1 += 3; + data->ev2 -= 3; + + if (data->ev1 > 31) { + data->ev1 = 31; + } + + if (data->ev2 < 0) { + data->ev2 = 0; + } + + G2S_ChangeBlendAlpha(data->ev1, data->ev2); + + ManagedSprite_OffsetPositionFxXY(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], -24576, 53248); + Sprite_GetPositionXYWithSubscreenOffset2(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], &xPos, &yPos, ((192 + 80) << FX32_SHIFT)); + + if (yPos > 192 + 32) { + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_2], FALSE); + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], TRUE); + ManagedSprite_SetPositionXYWithSubscreenOffset(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], xPos, -32, ((192 + 80) << FX32_SHIFT)); + data->meteorScreen = 1; + } + } else { + data->ev2 += 3; + data->ev1 -= 3; + + if (data->ev2 > 31) { + data->ev2 = 31; + } + + if (data->ev1 < 0) { + data->ev1 = 0; + } + + G2_ChangeBlendAlpha(data->ev1, data->ev2); + + ManagedSprite_OffsetPositionFxXY(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], -24576, 53248); + Sprite_GetPositionXYWithSubscreenOffset2(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], &xPos, &yPos, ((192 + 80) << FX32_SHIFT)); + + if (yPos > 192 + 32) { + ManagedSprite_SetDrawFlag(endCreditsApp->managedSprites[END_CREDITS_SPRITE_NIGHT_METEOR_1], FALSE); + data->meteorScreen = 0; + data->meteorLoaded = FALSE; + } + } +} + +static void EndCreditsNightScene_AnimateBackgroundSprite(EndCreditsApp *endCreditsApp, EndCreditsNightSceneData *data) +{ + int unused, frames, fraction; + + switch (data->backgroundState) { + case END_CREDITS_NIGHT_BACKGROUND_STATE_STATIC: + if (endCreditsApp->framesElapsed < 7620) { + return; + } + + if (data->currentTransitionFrame >= 8) { + return; + } + + if (data->frames > 0 * (data->currentTransitionFrame + 1)) { + data->backgroundState++; + } + break; + case END_CREDITS_NIGHT_BACKGROUND_STATE_TRANSITION: + frames = data->currentTransitionFrame; + data->fraction += 1024; + + if (data->fraction >= (16 << 8)) { + fraction = 16; + data->fraction = 0; + data->currentTransitionFrame++; + data->backgroundState = END_CREDITS_NIGHT_BACKGROUND_STATE_STATIC; + } else { + fraction = data->fraction >> 8; + } + + int nextFrame = frames + 1; + + if (nextFrame >= 8) { + nextFrame = 8 - 1; + } + + u16 *mainFadedBuffer = PaletteData_GetFadedBuffer(endCreditsApp->paletteData, PLTTBUF_MAIN_BG); + u16 *subFadedBuffer = PaletteData_GetFadedBuffer(endCreditsApp->paletteData, PLTTBUF_SUB_BG); + + for (int i = 0; i < SNELEMS(data->bgPaletteBuffers[frames]); i++) { + BlendPalette(&data->bgPaletteBuffers[frames][i], &mainFadedBuffer[i + 16 * 1], 1, fraction, data->bgPaletteBuffers[nextFrame][i]); + BlendPalette(&data->bgPaletteBuffers[frames][i], &subFadedBuffer[i + 16 * 1], 1, fraction, data->bgPaletteBuffers[nextFrame][i]); + } + break; + } + + data->frames++; +} diff --git a/src/cutscenes/end_credits/scenes/fin.c b/src/cutscenes/end_credits/scenes/fin.c new file mode 100644 index 00000000000..4907766cea2 --- /dev/null +++ b/src/cutscenes/end_credits/scenes/fin.c @@ -0,0 +1,41 @@ +#include +#include + +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" + +#include "screen_fade.h" +#include "system.h" + +enum EndCreditsFinSceneState { + END_CREDITS_FIN_SCENE_STATE_INIT = 0, + END_CREDITS_FIN_SCENE_STATE_WAIT_FOR_PRESS, + END_CREDITS_FIN_SCENE_STATE_END +}; + +BOOL EndCreditsFinScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsFinSceneData *data = &sceneManager->finSceneData; + + switch (sceneManager->state) { + case END_CREDITS_FIN_SCENE_STATE_INIT: + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 30, 1, HEAP_ID_END_CREDITS); + sceneManager->state++; + break; + case END_CREDITS_FIN_SCENE_STATE_WAIT_FOR_PRESS: + if (IsScreenFadeDone() == TRUE) { + if ((endCreditsApp->framesElapsed > 10080) || (gSystem.pressedKeys & PAD_BUTTON_A) || (gSystem.pressedKeys & PAD_BUTTON_START)) { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 45, 1, HEAP_ID_END_CREDITS); + sceneManager->state++; + } + } + break; + case END_CREDITS_FIN_SCENE_STATE_END: + if (IsScreenFadeDone() == TRUE) { + return TRUE; + } + break; + } + + return FALSE; +} diff --git a/src/cutscenes/end_credits/scenes/memories.c b/src/cutscenes/end_credits/scenes/memories.c new file mode 100644 index 00000000000..894b6dc4c8e --- /dev/null +++ b/src/cutscenes/end_credits/scenes/memories.c @@ -0,0 +1,111 @@ +#include +#include + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" + +#include "bg_window.h" +#include "brightness_controller.h" + +enum EndCreditsTwinleafSceneState { + END_CREDITS_MEMORIES_SCENE_STATE_INIT = 0, + END_CREDITS_MEMORIES_SCENE_STATE_SHOW_IMAGE, + END_CREDITS_MEMORIES_SCENE_STATE_FADE_OUT, + END_CREDITS_MEMORIES_SCENE_STATE_COOLDOWN, + END_CREDITS_MEMORIES_SCENE_STATE_END +}; + +BOOL EndCreditsMemoriesScene_Run1(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsMemoriesSceneData *data = &sceneManager->memoriesSceneData; + + switch (sceneManager->state) { + case END_CREDITS_MEMORIES_SCENE_STATE_INIT: + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_MEMORIES_SCENE_STATE_SHOW_IMAGE: + if (data->framesElapsed > ((4815 - 1830 - 30 * (7 - 1)) / 7)) { + BrightnessController_StartTransition(32, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + data->framesElapsed = 0; + sceneManager->state++; + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_FADE_OUT: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + if (endCreditsApp->currentMemory < END_CREDITS_MEMORY_CANALAVE_BARRY) { + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_COOLDOWN; + } else { + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_END; + } + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_COOLDOWN: + sceneManager->memoryCooldown++; + + if (sceneManager->memoryCooldown > 30) { + sceneManager->memoryCooldown = 0; + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_3, FALSE); + endCreditsApp->currentMemory++; + BrightnessController_StartTransition(32, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_SHOW_IMAGE; + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_END: + if (endCreditsApp->framesElapsed >= 4815) { + return TRUE; + } + break; + } + + data->framesElapsed++; + return FALSE; +} + +BOOL EndCreditsMemoriesScene_Run2(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsMemoriesSceneData *data = &sceneManager->memoriesSceneData; + + switch (sceneManager->state) { + case END_CREDITS_MEMORIES_SCENE_STATE_INIT: + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_MEMORIES_SCENE_STATE_SHOW_IMAGE: + if (data->framesElapsed > ((6960 - 6000 - 30 * (10 - 7 - 1)) / (10 - 7))) { + BrightnessController_StartTransition(32, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + data->framesElapsed = 0; + sceneManager->state++; + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_FADE_OUT: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + if (endCreditsApp->currentMemory < END_CREDITS_MEMORY_COUNT) { + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_COOLDOWN; + } else { + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_END; + } + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_COOLDOWN: + sceneManager->memoryCooldown++; + + if (sceneManager->memoryCooldown > 30) { + sceneManager->memoryCooldown = 0; + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_3, FALSE); + endCreditsApp->currentMemory++; + BrightnessController_StartTransition(32, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state = END_CREDITS_MEMORIES_SCENE_STATE_SHOW_IMAGE; + } + break; + case END_CREDITS_MEMORIES_SCENE_STATE_END: + if (endCreditsApp->framesElapsed >= 4815) { + return TRUE; + } + break; + } + + data->framesElapsed++; + return FALSE; +} diff --git a/src/cutscenes/end_credits/scenes/twinleaf.c b/src/cutscenes/end_credits/scenes/twinleaf.c new file mode 100644 index 00000000000..837d78b1d4a --- /dev/null +++ b/src/cutscenes/end_credits/scenes/twinleaf.c @@ -0,0 +1,120 @@ +#include +#include + +#include "cutscenes/end_credits/common.h" +#include "cutscenes/end_credits/defs.h" +#include "cutscenes/end_credits/scenes.h" + +#include "bg_window.h" +#include "brightness_controller.h" + +enum EndCreditsTwinleafSceneState { + END_CREDITS_TWINLEAF_SCENE_STATE_INIT = 0, + END_CREDITS_TWINLEAF_SCENE_STATE_SHOW_IMAGE, + END_CREDITS_TWINLEAF_SCENE_STATE_FADE_OUT, + END_CREDITS_TWINLEAF_SCENE_STATE_FADE_IN, + END_CREDITS_TWINLEAF_SCENE_STATE_END +}; + +static void EndCreditsTwinleafScene_InitBGsTransition(EndCreditsTwinleafSceneData *data, u32 plane1); +static BOOL EndCreditsTwinleafScene_TransitionBGs(EndCreditsTwinleafSceneData *data); + +BOOL EndCreditsTwinleafScene_Run(EndCreditsApp *endCreditsApp, EndCreditsSceneManager *sceneManager) +{ + EndCreditsTwinleafSceneData *data = &sceneManager->twinleafSceneData; + + switch (sceneManager->state) { + case END_CREDITS_TWINLEAF_SCENE_STATE_INIT: + BrightnessController_StartTransition(24, BRIGHTNESS_NORMAL, BRIGHTNESS_BLACK, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state++; + break; + case END_CREDITS_TWINLEAF_SCENE_STATE_SHOW_IMAGE: + data->framesElapsed++; + + if (data->framesElapsed > ((8280 - 7980 - (4 * 16) * (4 - 1)) / 4)) { + data->framesElapsed = 0; + sceneManager->state++; + } + break; + case END_CREDITS_TWINLEAF_SCENE_STATE_FADE_OUT: + if (data->currentImage >= 4 - 1) { + BrightnessController_StartTransition(32, BRIGHTNESS_BLACK, BRIGHTNESS_NORMAL, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); + sceneManager->state = END_CREDITS_TWINLEAF_SCENE_STATE_END; + } else { + if (data->currentImage & 1) { + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_2, TRUE); + EndCreditsTwinleafScene_InitBGsTransition(data, (GX_BLEND_PLANEMASK_BG3)); + } else { + EndCreditsCommon_LoadMemoryImage(endCreditsApp, endCreditsApp->currentMemory, BG_LAYER_MAIN_3, TRUE); + EndCreditsTwinleafScene_InitBGsTransition(data, (GX_BLEND_PLANEMASK_BG2)); + } + + endCreditsApp->currentMemory++; + data->currentImage++; + sceneManager->state = END_CREDITS_TWINLEAF_SCENE_STATE_FADE_IN; + } + break; + case END_CREDITS_TWINLEAF_SCENE_STATE_FADE_IN: + if (EndCreditsTwinleafScene_TransitionBGs(data) == TRUE) { + sceneManager->state = END_CREDITS_TWINLEAF_SCENE_STATE_SHOW_IMAGE; + } + break; + case END_CREDITS_TWINLEAF_SCENE_STATE_END: + if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { + return TRUE; + } + break; + } + + return FALSE; +} + +static void EndCreditsTwinleafScene_InitBGsTransition(EndCreditsTwinleafSceneData *data, u32 plane1) +{ + data->plane1 = plane1; + data->ev1 = 16; + data->ev2 = 0; + + if (plane1 == (GX_BLEND_PLANEMASK_BG2)) { + G2_SetBlendAlpha((GX_BLEND_PLANEMASK_BG2), (GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD), data->ev1, data->ev2); + Bg_ToggleLayer(BG_LAYER_MAIN_3, TRUE); + } else { + G2_SetBlendAlpha((GX_BLEND_PLANEMASK_BG3), (GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BD), data->ev1, data->ev2); + Bg_ToggleLayer(BG_LAYER_MAIN_2, TRUE); + } +} + +static BOOL EndCreditsTwinleafScene_TransitionBGs(EndCreditsTwinleafSceneData *data) +{ + data->ev1 -= 1; + + if (data->ev1 < 16) { + data->ev2 += 1; + } + + if (data->ev1 < 0) { + data->ev1 = 0; + } + + if (data->ev2 > 16) { + data->ev2 = 16; + } + + G2_ChangeBlendAlpha(data->ev1, data->ev2); + + if ((data->ev1 == 0) && (data->ev2 == 16)) { + if (data->plane1 == (GX_BLEND_PLANEMASK_BG2)) { + Bg_ToggleLayer(BG_LAYER_MAIN_2, FALSE); + Bg_SetPriority(BG_LAYER_MAIN_2, 3); + Bg_SetPriority(BG_LAYER_MAIN_3, 2); + } else { + Bg_ToggleLayer(BG_LAYER_MAIN_3, FALSE); + Bg_SetPriority(BG_LAYER_MAIN_2, 2); + Bg_SetPriority(BG_LAYER_MAIN_3, 3); + } + + return TRUE; + } + + return FALSE; +} diff --git a/src/cutscenes/end_credits/strings.c b/src/cutscenes/end_credits/strings.c new file mode 100644 index 00000000000..4f398978a29 --- /dev/null +++ b/src/cutscenes/end_credits/strings.c @@ -0,0 +1,400 @@ +#include "cutscenes/end_credits/strings.h" + +#include +#include + +#include "constants/graphics.h" + +#include "text/bank/end_credits.h" + +#include "bg_window.h" +#include "font.h" +#include "heap.h" +#include "message.h" +#include "string_gf.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "text.h" + +enum EndCreditsStringsState { + END_CREDITS_STRINGS_STATE_PRINTING = 0, + END_CREDITS_STRINGS_STATE_ALL_PRINTED, + END_CREDITS_STRINGS_STATE_ALL_ERASED +}; + +static const struct { + u16 messageID; + u16 yOffset; + u16 centered; +} sEndCreditStringProps[] = { + { .messageID = pl_msg_00000548_00000, .yOffset = 0, .centered = TRUE }, + { .messageID = pl_msg_00000548_00001, .yOffset = 16, .centered = TRUE }, + { .messageID = pl_msg_00000548_00002, .yOffset = 146, .centered = FALSE }, + { .messageID = pl_msg_00000548_00003, .yOffset = 167, .centered = FALSE }, + { .messageID = pl_msg_00000548_00004, .yOffset = 297, .centered = FALSE }, + { .messageID = pl_msg_00000548_00005, .yOffset = 318, .centered = FALSE }, + { .messageID = pl_msg_00000548_00006, .yOffset = 448, .centered = FALSE }, + { .messageID = pl_msg_00000548_00007, .yOffset = 469, .centered = FALSE }, + { .messageID = pl_msg_00000548_00008, .yOffset = 525, .centered = FALSE }, + { .messageID = pl_msg_00000548_00009, .yOffset = 546, .centered = FALSE }, + { .messageID = pl_msg_00000548_00010, .yOffset = 602, .centered = FALSE }, + { .messageID = pl_msg_00000548_00011, .yOffset = 623, .centered = FALSE }, + { .messageID = pl_msg_00000548_00012, .yOffset = 679, .centered = FALSE }, + { .messageID = pl_msg_00000548_00013, .yOffset = 700, .centered = FALSE }, + { .messageID = pl_msg_00000548_00014, .yOffset = 721, .centered = FALSE }, + { .messageID = pl_msg_00000548_00015, .yOffset = 742, .centered = FALSE }, + { .messageID = pl_msg_00000548_00016, .yOffset = 763, .centered = FALSE }, + { .messageID = pl_msg_00000548_00017, .yOffset = 784, .centered = FALSE }, + { .messageID = pl_msg_00000548_00018, .yOffset = 805, .centered = FALSE }, + { .messageID = pl_msg_00000548_00019, .yOffset = 826, .centered = FALSE }, + { .messageID = pl_msg_00000548_00020, .yOffset = 847, .centered = FALSE }, + { .messageID = pl_msg_00000548_00021, .yOffset = 868, .centered = FALSE }, + { .messageID = pl_msg_00000548_00022, .yOffset = 889, .centered = FALSE }, + { .messageID = pl_msg_00000548_00023, .yOffset = 910, .centered = FALSE }, + { .messageID = pl_msg_00000548_00024, .yOffset = 931, .centered = FALSE }, + { .messageID = pl_msg_00000548_00025, .yOffset = 952, .centered = FALSE }, + { .messageID = pl_msg_00000548_00026, .yOffset = 973, .centered = FALSE }, + { .messageID = pl_msg_00000548_00027, .yOffset = 994, .centered = FALSE }, + { .messageID = pl_msg_00000548_00028, .yOffset = 1124, .centered = FALSE }, + { .messageID = pl_msg_00000548_00029, .yOffset = 1140, .centered = FALSE }, + { .messageID = pl_msg_00000548_00030, .yOffset = 1156, .centered = FALSE }, + { .messageID = pl_msg_00000548_00031, .yOffset = 1177, .centered = FALSE }, + { .messageID = pl_msg_00000548_00032, .yOffset = 1198, .centered = FALSE }, + { .messageID = pl_msg_00000548_00033, .yOffset = 1219, .centered = FALSE }, + { .messageID = pl_msg_00000548_00034, .yOffset = 1240, .centered = FALSE }, + { .messageID = pl_msg_00000548_00035, .yOffset = 1261, .centered = FALSE }, + { .messageID = pl_msg_00000548_00036, .yOffset = 1282, .centered = FALSE }, + { .messageID = pl_msg_00000548_00037, .yOffset = 1303, .centered = FALSE }, + { .messageID = pl_msg_00000548_00038, .yOffset = 1324, .centered = FALSE }, + { .messageID = pl_msg_00000548_00039, .yOffset = 1345, .centered = FALSE }, + { .messageID = pl_msg_00000548_00040, .yOffset = 1366, .centered = FALSE }, + { .messageID = pl_msg_00000548_00041, .yOffset = 1387, .centered = FALSE }, + { .messageID = pl_msg_00000548_00042, .yOffset = 1408, .centered = FALSE }, + { .messageID = pl_msg_00000548_00043, .yOffset = 1429, .centered = FALSE }, + { .messageID = pl_msg_00000548_00044, .yOffset = 1485, .centered = FALSE }, + { .messageID = pl_msg_00000548_00045, .yOffset = 1506, .centered = FALSE }, + { .messageID = pl_msg_00000548_00046, .yOffset = 1562, .centered = FALSE }, + { .messageID = pl_msg_00000548_00047, .yOffset = 1583, .centered = FALSE }, + { .messageID = pl_msg_00000548_00048, .yOffset = 1713, .centered = FALSE }, + { .messageID = pl_msg_00000548_00049, .yOffset = 1734, .centered = FALSE }, + { .messageID = pl_msg_00000548_00050, .yOffset = 1755, .centered = FALSE }, + { .messageID = pl_msg_00000548_00051, .yOffset = 1776, .centered = FALSE }, + { .messageID = pl_msg_00000548_00052, .yOffset = 1797, .centered = FALSE }, + { .messageID = pl_msg_00000548_00053, .yOffset = 1853, .centered = FALSE }, + { .messageID = pl_msg_00000548_00054, .yOffset = 1874, .centered = FALSE }, + { .messageID = pl_msg_00000548_00055, .yOffset = 1930, .centered = FALSE }, + { .messageID = pl_msg_00000548_00056, .yOffset = 1951, .centered = FALSE }, + { .messageID = pl_msg_00000548_00057, .yOffset = 2081, .centered = FALSE }, + { .messageID = pl_msg_00000548_00058, .yOffset = 2102, .centered = FALSE }, + { .messageID = pl_msg_00000548_00059, .yOffset = 2123, .centered = FALSE }, + { .messageID = pl_msg_00000548_00060, .yOffset = 2144, .centered = FALSE }, + { .messageID = pl_msg_00000548_00061, .yOffset = 2165, .centered = FALSE }, + { .messageID = pl_msg_00000548_00062, .yOffset = 2186, .centered = FALSE }, + { .messageID = pl_msg_00000548_00063, .yOffset = 2207, .centered = FALSE }, + { .messageID = pl_msg_00000548_00064, .yOffset = 2228, .centered = FALSE }, + { .messageID = pl_msg_00000548_00065, .yOffset = 2249, .centered = FALSE }, + { .messageID = pl_msg_00000548_00066, .yOffset = 2270, .centered = FALSE }, + { .messageID = pl_msg_00000548_00067, .yOffset = 2291, .centered = FALSE }, + { .messageID = pl_msg_00000548_00068, .yOffset = 2312, .centered = FALSE }, + { .messageID = pl_msg_00000548_00069, .yOffset = 2368, .centered = FALSE }, + { .messageID = pl_msg_00000548_00070, .yOffset = 2389, .centered = FALSE }, + { .messageID = pl_msg_00000548_00071, .yOffset = 2410, .centered = FALSE }, + { .messageID = pl_msg_00000548_00072, .yOffset = 2431, .centered = FALSE }, + { .messageID = pl_msg_00000548_00073, .yOffset = 2452, .centered = FALSE }, + { .messageID = pl_msg_00000548_00074, .yOffset = 2473, .centered = FALSE }, + { .messageID = pl_msg_00000548_00075, .yOffset = 2529, .centered = FALSE }, + { .messageID = pl_msg_00000548_00076, .yOffset = 2550, .centered = FALSE }, + { .messageID = pl_msg_00000548_00077, .yOffset = 2571, .centered = FALSE }, + { .messageID = pl_msg_00000548_00078, .yOffset = 2592, .centered = FALSE }, + { .messageID = pl_msg_00000548_00079, .yOffset = 2613, .centered = FALSE }, + { .messageID = pl_msg_00000548_00080, .yOffset = 2669, .centered = FALSE }, + { .messageID = pl_msg_00000548_00081, .yOffset = 2690, .centered = FALSE }, + { .messageID = pl_msg_00000548_00082, .yOffset = 2711, .centered = FALSE }, + { .messageID = pl_msg_00000548_00083, .yOffset = 2732, .centered = FALSE }, + { .messageID = pl_msg_00000548_00084, .yOffset = 2753, .centered = FALSE }, + { .messageID = pl_msg_00000548_00085, .yOffset = 2774, .centered = FALSE }, + { .messageID = pl_msg_00000548_00086, .yOffset = 2795, .centered = FALSE }, + { .messageID = pl_msg_00000548_00087, .yOffset = 2816, .centered = FALSE }, + { .messageID = pl_msg_00000548_00088, .yOffset = 2872, .centered = FALSE }, + { .messageID = pl_msg_00000548_00089, .yOffset = 2893, .centered = FALSE }, + { .messageID = pl_msg_00000548_00090, .yOffset = 2914, .centered = FALSE }, + { .messageID = pl_msg_00000548_00091, .yOffset = 2970, .centered = FALSE }, + { .messageID = pl_msg_00000548_00092, .yOffset = 2991, .centered = FALSE }, + { .messageID = pl_msg_00000548_00093, .yOffset = 3012, .centered = FALSE }, + { .messageID = pl_msg_00000548_00094, .yOffset = 3033, .centered = FALSE }, + { .messageID = pl_msg_00000548_00095, .yOffset = 3054, .centered = FALSE }, + { .messageID = pl_msg_00000548_00096, .yOffset = 3184, .centered = FALSE }, + { .messageID = pl_msg_00000548_00097, .yOffset = 3205, .centered = FALSE }, + { .messageID = pl_msg_00000548_00098, .yOffset = 3226, .centered = FALSE }, + { .messageID = pl_msg_00000548_00099, .yOffset = 3247, .centered = FALSE }, + { .messageID = pl_msg_00000548_00100, .yOffset = 3268, .centered = FALSE }, + { .messageID = pl_msg_00000548_00101, .yOffset = 3324, .centered = FALSE }, + { .messageID = pl_msg_00000548_00102, .yOffset = 3345, .centered = FALSE }, + { .messageID = pl_msg_00000548_00103, .yOffset = 3366, .centered = FALSE }, + { .messageID = pl_msg_00000548_00104, .yOffset = 3387, .centered = FALSE }, + { .messageID = pl_msg_00000548_00105, .yOffset = 3408, .centered = FALSE }, + { .messageID = pl_msg_00000548_00106, .yOffset = 3429, .centered = FALSE }, + { .messageID = pl_msg_00000548_00107, .yOffset = 3450, .centered = FALSE }, + { .messageID = pl_msg_00000548_00108, .yOffset = 3471, .centered = FALSE }, + { .messageID = pl_msg_00000548_00109, .yOffset = 3527, .centered = FALSE }, + { .messageID = pl_msg_00000548_00110, .yOffset = 3548, .centered = FALSE }, + { .messageID = pl_msg_00000548_00111, .yOffset = 3678, .centered = FALSE }, + { .messageID = pl_msg_00000548_00112, .yOffset = 3710, .centered = FALSE }, + { .messageID = pl_msg_00000548_00113, .yOffset = 3731, .centered = FALSE }, + { .messageID = pl_msg_00000548_00114, .yOffset = 3752, .centered = FALSE }, + { .messageID = pl_msg_00000548_00115, .yOffset = 3784, .centered = FALSE }, + { .messageID = pl_msg_00000548_00116, .yOffset = 3805, .centered = FALSE }, + { .messageID = pl_msg_00000548_00117, .yOffset = 3826, .centered = FALSE }, + { .messageID = pl_msg_00000548_00118, .yOffset = 3847, .centered = FALSE }, + { .messageID = pl_msg_00000548_00119, .yOffset = 3977, .centered = FALSE }, + { .messageID = pl_msg_00000548_00120, .yOffset = 3998, .centered = FALSE }, + { .messageID = pl_msg_00000548_00121, .yOffset = 4019, .centered = FALSE }, + { .messageID = pl_msg_00000548_00122, .yOffset = 4040, .centered = FALSE }, + { .messageID = pl_msg_00000548_00123, .yOffset = 4061, .centered = FALSE }, + { .messageID = pl_msg_00000548_00124, .yOffset = 4082, .centered = FALSE }, + { .messageID = pl_msg_00000548_00125, .yOffset = 4138, .centered = FALSE }, + { .messageID = pl_msg_00000548_00126, .yOffset = 4159, .centered = FALSE }, + { .messageID = pl_msg_00000548_00127, .yOffset = 4289, .centered = FALSE }, + { .messageID = pl_msg_00000548_00128, .yOffset = 4310, .centered = FALSE }, + { .messageID = pl_msg_00000548_00129, .yOffset = 4331, .centered = FALSE }, + { .messageID = pl_msg_00000548_00130, .yOffset = 4352, .centered = FALSE }, + { .messageID = pl_msg_00000548_00131, .yOffset = 4408, .centered = FALSE }, + { .messageID = pl_msg_00000548_00132, .yOffset = 4429, .centered = FALSE }, + { .messageID = pl_msg_00000548_00133, .yOffset = 4485, .centered = FALSE }, + { .messageID = pl_msg_00000548_00134, .yOffset = 4506, .centered = FALSE }, + { .messageID = pl_msg_00000548_00135, .yOffset = 4527, .centered = FALSE }, + { .messageID = pl_msg_00000548_00136, .yOffset = 4548, .centered = FALSE }, + { .messageID = pl_msg_00000548_00137, .yOffset = 4604, .centered = FALSE }, + { .messageID = pl_msg_00000548_00138, .yOffset = 4625, .centered = FALSE }, + { .messageID = pl_msg_00000548_00139, .yOffset = 4646, .centered = FALSE }, + { .messageID = pl_msg_00000548_00140, .yOffset = 4667, .centered = FALSE }, + { .messageID = pl_msg_00000548_00141, .yOffset = 4797, .centered = FALSE }, + { .messageID = pl_msg_00000548_00142, .yOffset = 4818, .centered = FALSE }, + { .messageID = pl_msg_00000548_00143, .yOffset = 4839, .centered = FALSE }, + { .messageID = pl_msg_00000548_00144, .yOffset = 4860, .centered = FALSE }, + { .messageID = pl_msg_00000548_00145, .yOffset = 4916, .centered = FALSE }, + { .messageID = pl_msg_00000548_00146, .yOffset = 4937, .centered = FALSE }, + { .messageID = pl_msg_00000548_00147, .yOffset = 4958, .centered = FALSE }, + { .messageID = pl_msg_00000548_00148, .yOffset = 4979, .centered = FALSE }, + { .messageID = pl_msg_00000548_00149, .yOffset = 5000, .centered = FALSE }, + { .messageID = pl_msg_00000548_00150, .yOffset = 5021, .centered = FALSE }, + { .messageID = pl_msg_00000548_00151, .yOffset = 5042, .centered = FALSE }, + { .messageID = pl_msg_00000548_00152, .yOffset = 5063, .centered = FALSE }, + { .messageID = pl_msg_00000548_00153, .yOffset = 5084, .centered = FALSE }, + { .messageID = pl_msg_00000548_00154, .yOffset = 5105, .centered = FALSE }, + { .messageID = pl_msg_00000548_00155, .yOffset = 5126, .centered = FALSE }, + { .messageID = pl_msg_00000548_00156, .yOffset = 5147, .centered = FALSE }, + { .messageID = pl_msg_00000548_00157, .yOffset = 5168, .centered = FALSE }, + { .messageID = pl_msg_00000548_00158, .yOffset = 5189, .centered = FALSE }, + { .messageID = pl_msg_00000548_00159, .yOffset = 5210, .centered = FALSE }, + { .messageID = pl_msg_00000548_00160, .yOffset = 5266, .centered = FALSE }, + { .messageID = pl_msg_00000548_00161, .yOffset = 5287, .centered = FALSE }, + { .messageID = pl_msg_00000548_00162, .yOffset = 5308, .centered = FALSE }, + { .messageID = pl_msg_00000548_00163, .yOffset = 5329, .centered = FALSE }, + { .messageID = pl_msg_00000548_00164, .yOffset = 5350, .centered = FALSE }, + { .messageID = pl_msg_00000548_00165, .yOffset = 5371, .centered = FALSE }, + { .messageID = pl_msg_00000548_00166, .yOffset = 5392, .centered = FALSE }, + { .messageID = pl_msg_00000548_00167, .yOffset = 5413, .centered = FALSE }, + { .messageID = pl_msg_00000548_00168, .yOffset = 5434, .centered = FALSE }, + { .messageID = pl_msg_00000548_00169, .yOffset = 5564, .centered = FALSE }, + { .messageID = pl_msg_00000548_00170, .yOffset = 5585, .centered = FALSE }, + { .messageID = pl_msg_00000548_00171, .yOffset = 5606, .centered = FALSE }, + { .messageID = pl_msg_00000548_00172, .yOffset = 5627, .centered = FALSE }, + { .messageID = pl_msg_00000548_00173, .yOffset = 5648, .centered = FALSE }, + { .messageID = pl_msg_00000548_00174, .yOffset = 5669, .centered = FALSE }, + { .messageID = pl_msg_00000548_00175, .yOffset = 5690, .centered = FALSE }, + { .messageID = pl_msg_00000548_00176, .yOffset = 5711, .centered = FALSE }, + { .messageID = pl_msg_00000548_00177, .yOffset = 5732, .centered = FALSE }, + { .messageID = pl_msg_00000548_00178, .yOffset = 5753, .centered = FALSE }, + { .messageID = pl_msg_00000548_00179, .yOffset = 5774, .centered = FALSE }, + { .messageID = pl_msg_00000548_00180, .yOffset = 5795, .centered = FALSE }, + { .messageID = pl_msg_00000548_00181, .yOffset = 5816, .centered = FALSE }, + { .messageID = pl_msg_00000548_00182, .yOffset = 5837, .centered = FALSE }, + { .messageID = pl_msg_00000548_00183, .yOffset = 5858, .centered = FALSE }, + { .messageID = pl_msg_00000548_00184, .yOffset = 5879, .centered = FALSE }, + { .messageID = pl_msg_00000548_00185, .yOffset = 5900, .centered = FALSE }, + { .messageID = pl_msg_00000548_00186, .yOffset = 5921, .centered = FALSE }, + { .messageID = pl_msg_00000548_00187, .yOffset = 5942, .centered = FALSE }, + { .messageID = pl_msg_00000548_00188, .yOffset = 5963, .centered = FALSE }, + { .messageID = pl_msg_00000548_00189, .yOffset = 5984, .centered = FALSE }, + { .messageID = pl_msg_00000548_00190, .yOffset = 6005, .centered = FALSE }, + { .messageID = pl_msg_00000548_00191, .yOffset = 6026, .centered = FALSE }, + { .messageID = pl_msg_00000548_00192, .yOffset = 6047, .centered = FALSE }, + { .messageID = pl_msg_00000548_00193, .yOffset = 6068, .centered = FALSE }, + { .messageID = pl_msg_00000548_00194, .yOffset = 6089, .centered = FALSE }, + { .messageID = pl_msg_00000548_00195, .yOffset = 6110, .centered = FALSE }, + { .messageID = pl_msg_00000548_00196, .yOffset = 6131, .centered = FALSE }, + { .messageID = pl_msg_00000548_00197, .yOffset = 6152, .centered = FALSE }, + { .messageID = pl_msg_00000548_00198, .yOffset = 6173, .centered = FALSE }, + { .messageID = pl_msg_00000548_00199, .yOffset = 6194, .centered = FALSE }, + { .messageID = pl_msg_00000548_00200, .yOffset = 6215, .centered = FALSE }, + { .messageID = pl_msg_00000548_00201, .yOffset = 6236, .centered = FALSE }, + { .messageID = pl_msg_00000548_00202, .yOffset = 6257, .centered = FALSE }, + { .messageID = pl_msg_00000548_00203, .yOffset = 6278, .centered = FALSE }, + { .messageID = pl_msg_00000548_00204, .yOffset = 6299, .centered = FALSE }, + { .messageID = pl_msg_00000548_00205, .yOffset = 6320, .centered = FALSE }, + { .messageID = pl_msg_00000548_00206, .yOffset = 6341, .centered = FALSE }, + { .messageID = pl_msg_00000548_00207, .yOffset = 6362, .centered = FALSE }, + { .messageID = pl_msg_00000548_00208, .yOffset = 6383, .centered = FALSE }, + { .messageID = pl_msg_00000548_00209, .yOffset = 6404, .centered = FALSE }, + { .messageID = pl_msg_00000548_00210, .yOffset = 6425, .centered = FALSE }, + { .messageID = pl_msg_00000548_00211, .yOffset = 6446, .centered = FALSE }, + { .messageID = pl_msg_00000548_00212, .yOffset = 6576, .centered = FALSE }, + { .messageID = pl_msg_00000548_00213, .yOffset = 6597, .centered = FALSE }, + { .messageID = pl_msg_00000548_00214, .yOffset = 6618, .centered = FALSE }, + { .messageID = pl_msg_00000548_00215, .yOffset = 6639, .centered = FALSE }, + { .messageID = pl_msg_00000548_00216, .yOffset = 6660, .centered = FALSE }, + { .messageID = pl_msg_00000548_00217, .yOffset = 6790, .centered = FALSE }, + { .messageID = pl_msg_00000548_00218, .yOffset = 6811, .centered = FALSE }, + { .messageID = pl_msg_00000548_00219, .yOffset = 6832, .centered = FALSE }, + { .messageID = pl_msg_00000548_00220, .yOffset = 6853, .centered = FALSE }, + { .messageID = pl_msg_00000548_00221, .yOffset = 6983, .centered = FALSE }, + { .messageID = pl_msg_00000548_00222, .yOffset = 7004, .centered = FALSE }, + { .messageID = pl_msg_00000548_00223, .yOffset = 7025, .centered = FALSE }, + { .messageID = pl_msg_00000548_00224, .yOffset = 7046, .centered = FALSE }, + { .messageID = pl_msg_00000548_00225, .yOffset = 7176, .centered = FALSE }, + { .messageID = pl_msg_00000548_00226, .yOffset = 7197, .centered = FALSE }, + { .messageID = pl_msg_00000548_00227, .yOffset = 7218, .centered = FALSE }, + { .messageID = pl_msg_00000548_00228, .yOffset = 7239, .centered = FALSE }, + { .messageID = pl_msg_00000548_00229, .yOffset = 7260, .centered = FALSE }, + { .messageID = pl_msg_00000548_00230, .yOffset = 7390, .centered = FALSE }, + { .messageID = pl_msg_00000548_00231, .yOffset = 7411, .centered = FALSE }, + { .messageID = pl_msg_00000548_00232, .yOffset = 7467, .centered = FALSE }, + { .messageID = pl_msg_00000548_00233, .yOffset = 7488, .centered = FALSE }, + { .messageID = pl_msg_00000548_00234, .yOffset = 7544, .centered = FALSE }, + { .messageID = pl_msg_00000548_00235, .yOffset = 7565, .centered = FALSE }, + { .messageID = pl_msg_00000548_00236, .yOffset = 7581, .centered = FALSE } +}; + +static void EndCreditsStrings_VBlankCallback(SysTask *sysTask, void *pManager); + +EndCreditsStringsManager *EndCreditsStrings_CreateManager(BgConfig *bgConfig, int startTopY, int bgLayer, int palette, MessageLoader *messageLoader) +{ + EndCreditsStringsManager *manager = Heap_Alloc(HEAP_ID_END_CREDITS, sizeof(EndCreditsStringsManager)); + + if (manager) { + manager->bgConfig = bgConfig; + manager->topY = startTopY; + manager->bottomY = startTopY + 192; + manager->bgLayer = bgLayer; + manager->messageLoader = messageLoader; + manager->entryToDraw = 0; + manager->entryToErase = 0; + manager->unused_14 = 0; + manager->reloadWindow = 0; + manager->state = END_CREDITS_STRINGS_STATE_PRINTING; + manager->string = String_Init(256, HEAP_ID_END_CREDITS); + manager->window = Window_New(HEAP_ID_END_CREDITS, 1); + + Window_Add(bgConfig, manager->window, bgLayer, 0, 0, 32, 32, palette, 0); + Window_FillTilemap(manager->window, 0x0); + Window_PutToTilemap(manager->window); + Window_CopyToVRAM(manager->window); + + manager->window2 = Window_New(HEAP_ID_END_CREDITS, 1); + Window_Add(bgConfig, manager->window2, bgLayer, 0, 0, 32, 2, palette, 0); + manager->sysTask = SysTask_ExecuteAfterVBlank(EndCreditsStrings_VBlankCallback, manager, 0); + } + + return manager; +} + +void EndCreditsStrings_FreeManager(EndCreditsStringsManager *manager) +{ + if (manager->sysTask) { + SysTask_Done(manager->sysTask); + } + + String_Free(manager->string); + Window_Remove(manager->window); + Window_Remove(manager->window2); + Heap_Free(manager->window); + Heap_Free(manager->window2); + Heap_Free(manager); +} + +BOOL EndCreditsStrings_ScrollCredits(EndCreditsStringsManager *manager, int scrollSpeed) +{ + if (manager->state == END_CREDITS_STRINGS_STATE_ALL_ERASED) { + return TRUE; + } else { + int nextBottomY = manager->bottomY + scrollSpeed; + + if (manager->state == END_CREDITS_STRINGS_STATE_PRINTING) { + if (nextBottomY >= sEndCreditStringProps[manager->entryToDraw].yOffset) { + int xOffset, yOffset; + + MessageLoader_GetString(manager->messageLoader, sEndCreditStringProps[manager->entryToDraw].messageID, manager->string); + + if (sEndCreditStringProps[manager->entryToDraw].centered) { + xOffset = (256 - Font_CalcStringWidth(FONT_SYSTEM, manager->string, 0)) / 2; + } else { + xOffset = 32; + } + + yOffset = sEndCreditStringProps[manager->entryToDraw].yOffset & 0xff; + Text_AddPrinterWithParamsAndColor(manager->window, FONT_SYSTEM, manager->string, xOffset, yOffset, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); + + if (yOffset > (256 - 16)) { + Window_FillTilemap(manager->window2, 0x0); + Text_AddPrinterWithParamsAndColor(manager->window2, FONT_SYSTEM, manager->string, xOffset, 0, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); + + yOffset = 16 - (yOffset - (256 - 16)); + Window_BlitBitmapRect(manager->window, manager->window2->pixels, 0, yOffset, manager->window2->width * 8, manager->window2->height * 8, 0, 0, TILE_SIZE_4BPP * 8, (16 - yOffset)); + } + + manager->reloadWindow = TRUE; + + if (++(manager->entryToDraw) >= (NELEMS(sEndCreditStringProps) - 1)) { + manager->state = END_CREDITS_STRINGS_STATE_ALL_PRINTED; + } + } + } + + manager->bottomY = nextBottomY; + + if (manager->topY > (sEndCreditStringProps[manager->entryToErase].yOffset + 16)) { + int yOffset = sEndCreditStringProps[manager->entryToErase].yOffset & 0xff; + + if (yOffset <= (256 - 16)) { + Window_FillRectWithColor(manager->window, 0x0, 0, yOffset, TILE_SIZE_4BPP * 8, 16); + } else { + int height1, height2; + + height1 = 16 - (yOffset - (256 - 16)); + height2 = 16 - height1; + + Window_FillRectWithColor(manager->window, 0x0, 0, yOffset, TILE_SIZE_4BPP * 8, height1); + Window_FillRectWithColor(manager->window, 0x0, 0, 0, TILE_SIZE_4BPP * 8, height2); + } + + manager->reloadWindow = TRUE; + + if (++(manager->entryToErase) >= NELEMS(sEndCreditStringProps)) { + manager->state = END_CREDITS_STRINGS_STATE_ALL_ERASED; + } + } + + manager->topY += scrollSpeed; + + return FALSE; + } +} + +static void EndCreditsStrings_VBlankCallback(SysTask *sysTask, void *pManager) +{ + EndCreditsStringsManager *manager = pManager; + + if (manager->reloadWindow) { + Window_LoadTiles(manager->window); + manager->reloadWindow = FALSE; + } + + int yPos = manager->topY & 255; + Bg_SetOffset(manager->bgConfig, manager->bgLayer, BG_OFFSET_UPDATE_SET_Y, yPos); +} + +int EndCreditsStrings_GetLastMessageID(void) +{ + return sEndCreditStringProps[NELEMS(sEndCreditStringProps) - 1].messageID; +} diff --git a/src/meson.build b/src/meson.build index d3036511024..06adde70f20 100644 --- a/src/meson.build +++ b/src/meson.build @@ -894,16 +894,16 @@ pokeplatinum_c = files( 'overlay098/ov98_02246C20.c', 'overlay098/ov98_022471C8.c', 'overlay098/ov98_022499C8.c', - 'overlay099/ov99_021D0D80.c', - 'overlay099/ov99_021D1A54.c', - 'overlay099/ov99_021D2C08.c', - 'overlay099/ov99_021D2E28.c', - 'overlay099/ov99_021D340C.c', - 'overlay099/ov99_021D3A40.c', - 'overlay099/ov99_021D3C18.c', - 'overlay099/ov99_021D3DE0.c', - 'overlay099/ov99_021D3E78.c', - 'overlay099/ov99_021D4134.c', + 'cutscenes/end_credits/main.c', + 'cutscenes/end_credits/scenes.c', + 'cutscenes/end_credits/scenes/bike_morning.c', + 'cutscenes/end_credits/scenes/bike_day.c', + 'cutscenes/end_credits/scenes/bike_night.c', + 'cutscenes/end_credits/scenes/memories.c', + 'cutscenes/end_credits/scenes/twinleaf.c', + 'cutscenes/end_credits/scenes/fin.c', + 'cutscenes/end_credits/strings.c', + 'cutscenes/end_credits/common.c', 'overlay100/ov100_021D0D80.c', 'overlay100/ov100_021D13E4.c', 'overlay100/ov100_021D1C44.c', diff --git a/src/overlay099/ov99_021D0D80.c b/src/overlay099/ov99_021D0D80.c deleted file mode 100644 index a5c47448c17..00000000000 --- a/src/overlay099/ov99_021D0D80.c +++ /dev/null @@ -1,780 +0,0 @@ -#include "overlay099/ov99_021D0D80.h" - -#include -#include - -#include "constants/graphics.h" - -#include "overlay099/ov99_021D1A54.h" -#include "overlay099/ov99_021D3E78.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" - -#include "bg_window.h" -#include "brightness_controller.h" -#include "camera.h" -#include "easy3d_object.h" -#include "enums.h" -#include "g3d_pipeline.h" -#include "gx_layers.h" -#include "heap.h" -#include "message.h" -#include "narc.h" -#include "overlay_manager.h" -#include "palette.h" -#include "screen_fade.h" -#include "sound.h" -#include "sprite_system.h" -#include "sprite_util.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "system.h" -#include "touch_pad.h" -#include "unk_0202419C.h" -#include "vram_transfer.h" - -static const CameraAngle Unk_ov99_021D46CC = { - ((0 * 0xffff) / 360), - (0 * 0xffff) / 360, - ((0 * 0xffff) / 360) -}; - -static const RenderOamTemplate Unk_ov99_021D4760 = { - 0x0, - 0x80, - 0x0, - 0x20, - 0x0, - 0x80, - 0x0, - 0x20 -}; - -static const CharTransferTemplateWithModes Unk_ov99_021D4718 = { - 0x60, - 0x10000, - 0x4000, - GX_OBJVRAMMODE_CHAR_1D_128K, - GX_OBJVRAMMODE_CHAR_1D_128K -}; - -static const SpriteResourceCapacities Unk_ov99_021D472C = { - 0x60, - 0x20, - 0x40, - 0x40, - 0x8, - 0x8 -}; - -static void ov99_021D1244(SysTask *param0, void *param1); -static void ov99_021D1350(void *param0); -static void ov99_021D1380(BgConfig *param0); -static void ov99_021D1720(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1918(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D19A0(UnkStruct_ov99_021D2CB0 *param0); -static G3DPipelineBuffers *ov99_021D19AC(enum HeapID heapID); -static void ov99_021D19C8(void); -static void ov99_021D1A4C(G3DPipelineBuffers *param0); -static void ov99_021D16E4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1270(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1314(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1580(BgConfig *param0); - -int ov99_021D0D80(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov99_021D2CB0 *v0; - - SetVBlankCallback(NULL, NULL); - DisableHBlank(); - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - GX_SetVisiblePlane(0); - GXS_SetVisiblePlane(0); - GX_SetVisibleWnd(GX_WNDMASK_NONE); - GXS_SetVisibleWnd(GX_WNDMASK_NONE); - G2_BlendNone(); - G2S_BlendNone(); - - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_75, 0x80000); - - v0 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov99_021D2CB0), HEAP_ID_75); - MI_CpuClear8(v0, sizeof(UnkStruct_ov99_021D2CB0)); - - v0->unk_00 = ApplicationManager_Args(appMan); - v0->unk_10 = ov99_021D19AC(HEAP_ID_75); - v0->unk_0C = PaletteData_New(HEAP_ID_75); - - PaletteData_AllocBuffer(v0->unk_0C, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES * 16, HEAP_ID_75); - PaletteData_AllocBuffer(v0->unk_0C, PLTTBUF_SUB_BG, PALETTE_SIZE_BYTES * 16, HEAP_ID_75); - PaletteData_AllocBuffer(v0->unk_0C, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * 14, HEAP_ID_75); - PaletteData_AllocBuffer(v0->unk_0C, PLTTBUF_SUB_OBJ, PALETTE_SIZE_BYTES * 16, HEAP_ID_75); - PaletteData_SetAutoTransparent(v0->unk_0C, TRUE); - - v0->unk_08 = BgConfig_New(HEAP_ID_75); - - VramTransfer_New(64, HEAP_ID_75); - SetAutorepeat(4, 8); - - ov99_021D1380(v0->unk_08); - - EnableTouchPad(); - InitializeTouchPad(4); - - v0->unk_20 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNK_0548, HEAP_ID_75); - v0->unk_10F8 = NARC_ctor(NARC_INDEX_GRAPHIC__ENDING, HEAP_ID_75); - - ov99_021D1918(v0); - - v0->unk_18 = SpriteSystem_Alloc(HEAP_ID_75); - - SpriteSystem_Init(v0->unk_18, &Unk_ov99_021D4760, &Unk_ov99_021D4718, 16 + 16); - ReserveVramForWirelessIconChars(NNS_G2D_VRAM_TYPE_2DMAIN, GX_OBJVRAMMODE_CHAR_1D_128K); - ReserveSlotsForWirelessIconPalette(NNS_G2D_VRAM_TYPE_2DMAIN); - - v0->unk_1C = SpriteManager_New(v0->unk_18); - - SpriteSystem_InitSprites(v0->unk_18, v0->unk_1C, 64 + 64); - SpriteSystem_InitManagerWithCapacities(v0->unk_18, v0->unk_1C, &Unk_ov99_021D472C); - SetSubScreenViewRect(SpriteSystem_GetRenderer(v0->unk_18), 0, (192 + 80) << FX32_SHIFT); - - ov99_021D16E4(v0); - - v0->unk_1108 = ov99_021D3E78(v0->unk_08, -240, 1, 15, v0->unk_20); - v0->unk_110C = ov99_021D3E78(v0->unk_08, -240 - 192 - 16, 5, 15, v0->unk_20); - - G2_SetWnd0Position(0, 192 - 24, 255, 192); - G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG1, 1); - G2_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); - G2S_SetWnd0Position(0, 0, 255, 24); - G2S_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG1, 1); - G2S_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); - GX_SetVisibleWnd(GX_WNDMASK_W0); - GXS_SetVisibleWnd(GX_WNDMASK_W0); - - gSystem.whichScreenIs3D = DS_SCREEN_SUB; - - GXLayers_SwapDisplay(); - GXLayers_TurnBothDispOn(); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - GXLayers_EngineBToggleLayers(GX_PLANEMASK_OBJ, 1); - - v0->unk_14 = SysTask_Start(ov99_021D1244, v0, 60000); - - SetVBlankCallback(ov99_021D1350, v0); - Sound_SetSceneAndPlayBGM(SOUND_SCENE_14, SEQ_BLD_ENDING, 1); - - BrightnessController_SetScreenBrightness(-16, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD, BRIGHTNESS_BOTH_SCREENS); - SetScreenMasterBrightness(DS_SCREEN_MAIN, 0); - SetScreenMasterBrightness(DS_SCREEN_SUB, 0); - - Bg_ToggleLayer(BG_LAYER_MAIN_1, 1); - Bg_ToggleLayer(BG_LAYER_SUB_1, 1); - - return 1; -} - -int ov99_021D1028(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov99_021D2CB0 *v0 = ApplicationManager_Data(appMan); - - if (v0->unk_1108 != NULL) { - ov99_021D3F6C(v0->unk_1108, 1); - v0->unk_1110 = ov99_021D3F6C(v0->unk_110C, 1); - } - - if (v0->unk_00->gameCompleted && (gSystem.pressedKeys & PAD_BUTTON_START)) { - if ((v0->unk_1100 == 0) && (v0->unk_1101 < 6)) { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_75); - v0->unk_1100 = 1; - } - } - - switch (v0->unk_1100) { - case 0: - break; - case 1: - if (IsScreenFadeDone()) { - if (v0->unk_1102 == 1) { - ov99_021D1CFC(v0, v0->unk_1101); - v0->unk_1102 = 0; - } - - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == FALSE) { - BrightnessController_ResetScreenController(BRIGHTNESS_BOTH_SCREENS); - } - - ov99_021D12F0(v0); - v0->unk_1101 = 6; - GXLayers_EngineASetLayers(0); - GXLayers_EngineBSetLayers(0); - MI_CpuClear8(&v0->unk_FA4, sizeof(UnkStruct_ov99_021D3A40)); - v0->unk_1100 = 2; - *param1 = 0; - } - break; - } - - switch (*param1) { - case 0: - if ((v0->unk_1100 == 0) || (v0->unk_1100 == 2)) { - ov99_021D1CC8(v0, v0->unk_1101); - v0->unk_1102 = 1; - (*param1)++; - } - break; - case 1: - if (ov99_021D1D30(v0, v0->unk_1101) == 1) { - ov99_021D1CFC(v0, v0->unk_1101); - v0->unk_1102 = 0; - v0->unk_1101++; - - if (v0->unk_1101 < 7) { - (*param1) = 0; - } else { - (*param1) = 2; - } - } - break; - case 2: - return 1; - } - - v0->unk_10FC++; - - if (v0->unk_10FC % 30 == 0) { - (void)0; - } - - return 0; -} - -int ov99_021D11A8(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov99_021D2CB0 *v0 = ApplicationManager_Data(appMan); - - SysTask_Done(v0->unk_14); - - if (v0->unk_1108 != NULL) { - ov99_021D1270(v0); - } else { - ov99_021D1314(v0); - } - - MessageLoader_Free(v0->unk_20); - SpriteSystem_FreeResourcesAndManager(v0->unk_18, v0->unk_1C); - SpriteSystem_Free(v0->unk_18); - PaletteData_FreeBuffer(v0->unk_0C, PLTTBUF_MAIN_BG); - PaletteData_FreeBuffer(v0->unk_0C, PLTTBUF_SUB_BG); - PaletteData_FreeBuffer(v0->unk_0C, PLTTBUF_MAIN_OBJ); - PaletteData_FreeBuffer(v0->unk_0C, PLTTBUF_SUB_OBJ); - PaletteData_Free(v0->unk_0C); - - ov99_021D19A0(v0); - - NARC_dtor(v0->unk_10F8); - SetVBlankCallback(NULL, NULL); - DisableHBlank(); - VramTransfer_Free(); - DisableTouchPad(); - ApplicationManager_FreeData(appMan); - Heap_Destroy(HEAP_ID_75); - - return 1; -} - -static void ov99_021D1244(SysTask *param0, void *param1) -{ - UnkStruct_ov99_021D2CB0 *v0 = param1; - - if (v0->unk_1103 == 1) { - ov99_021D1720(v0); - G3_RequestSwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_Z); - } - - SpriteSystem_DrawSprites(v0->unk_1C); - SpriteSystem_UpdateTransfer(); -} - -static void ov99_021D1270(UnkStruct_ov99_021D2CB0 *param0) -{ - GF_ASSERT(param0->unk_1108 != NULL); - - ov99_021D3F38(param0->unk_110C); - ov99_021D3F38(param0->unk_1108); - - param0->unk_110C = NULL; - param0->unk_1108 = NULL; - - Bg_ToggleLayer(BG_LAYER_MAIN_1, 0); - Bg_ToggleLayer(BG_LAYER_SUB_1, 0); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_SUB_3); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_SUB_1); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_SUB_2); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_3); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_2); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_1); - Heap_Free(param0->unk_08); - - ov99_021D1A4C(param0->unk_10); -} - -void ov99_021D12F0(UnkStruct_ov99_021D2CB0 *param0) -{ - if (param0->unk_1108 == NULL) { - return; - } - - ov99_021D1270(param0); - - param0->unk_08 = BgConfig_New(HEAP_ID_75); - ov99_021D1580(param0->unk_08); -} - -static void ov99_021D1314(UnkStruct_ov99_021D2CB0 *param0) -{ - GF_ASSERT(param0->unk_1108 == NULL); - - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_1); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_2); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_MAIN_3); - Bg_FreeTilemapBuffer(param0->unk_08, BG_LAYER_SUB_3); - Heap_Free(param0->unk_08); -} - -static void ov99_021D1350(void *param0) -{ - UnkStruct_ov99_021D2CB0 *v0 = param0; - - VramTransfer_Process(); - SpriteSystem_TransferOam(); - PaletteData_CommitFadedBuffers(v0->unk_0C); - Bg_RunScheduledUpdates(v0->unk_08); - - OS_SetIrqCheckFlag(OS_IE_V_BLANK); -} - -static void ov99_021D1380(BgConfig *param0) -{ - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - { - GXBanks v0 = { - GX_VRAM_BG_128_B, - GX_VRAM_BGEXTPLTT_23_G, - GX_VRAM_BG_128_C, - GX_VRAM_SUB_BGEXTPLTT_NONE, - GX_VRAM_OBJ_64_E, - GX_VRAM_OBJEXTPLTT_NONE, - GX_VRAM_SUB_OBJ_16_I, - GX_VRAM_SUB_OBJEXTPLTT_NONE, - GX_VRAM_TEX_0_A, - GX_VRAM_TEXPLTT_0_F - }; - - GXLayers_SetBanks(&v0); - - MI_CpuClear32((void *)HW_BG_VRAM, HW_BG_VRAM_SIZE); - MI_CpuClear32((void *)HW_DB_BG_VRAM, HW_DB_BG_VRAM_SIZE); - MI_CpuClear32((void *)HW_OBJ_VRAM, HW_OBJ_VRAM_SIZE); - MI_CpuClear32((void *)HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM_SIZE); - } - - { - GraphicsModes v1 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_3, - GX_BGMODE_0, - GX_BG0_AS_3D, - }; - - SetAllGraphicsModes(&v1); - } - - { - BgTemplate v2[] = { - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x0000, - .charBase = GX_BG_CHARBASE_0x04000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x2000, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_512x512, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x1000, - .charBase = GX_BG_CHARBASE_0x0c000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0x3000, - .charBase = GX_BG_CHARBASE_0x10000, - .bgExtPltt = GX_BG_EXTPLTT_23, - .priority = 2, - .areaOver = 0, - .mosaic = FALSE, - }, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_1, &v2[0], 0); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_1); - Bg_SetOffset(param0, BG_LAYER_MAIN_1, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_1, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_2, &v2[1], 0); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_2); - Bg_SetOffset(param0, BG_LAYER_MAIN_2, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_2, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_3, &v2[2], 2); - Bg_SetOffset(param0, BG_LAYER_MAIN_3, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_3, 3, 0); - - G2_SetBG0Priority(1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - } - - { - BgTemplate v3[] = { - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x0000, - .charBase = GX_BG_CHARBASE_0x04000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x1000, - .charBase = GX_BG_CHARBASE_0x0c000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 1, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0x2000, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_512x512, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x2000, - .charBase = GX_BG_CHARBASE_0x14000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_SUB_1, &v3[0], 0); - Bg_ClearTilemap(param0, BG_LAYER_SUB_1); - Bg_SetOffset(param0, BG_LAYER_SUB_1, 0, 0); - Bg_SetOffset(param0, BG_LAYER_SUB_1, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_SUB_2, &v3[1], 0); - Bg_ClearTilemap(param0, BG_LAYER_SUB_2); - Bg_SetOffset(param0, BG_LAYER_SUB_2, 0, 0); - Bg_SetOffset(param0, BG_LAYER_SUB_2, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_SUB_3, &v3[2], 0); - Bg_ClearTilemap(param0, BG_LAYER_SUB_3); - Bg_SetOffset(param0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(param0, BG_LAYER_SUB_3, 3, 0); - } - - Bg_ClearTilesRange(BG_LAYER_MAIN_1, 32, 0, HEAP_ID_75); - Bg_ClearTilesRange(5, 32, 0, HEAP_ID_75); - Bg_ClearTilesRange(6, 32, 0, HEAP_ID_75); - Bg_ClearTilesRange(7, 32, 0, HEAP_ID_75); - - Bg_ToggleLayer(BG_LAYER_MAIN_3, 0); - Bg_ToggleLayer(BG_LAYER_SUB_2, 0); -} - -static void ov99_021D1580(BgConfig *param0) -{ - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - { - GXBanks v0 = { - GX_VRAM_BG_256_AB, - GX_VRAM_BGEXTPLTT_23_G, - GX_VRAM_BG_128_C, - GX_VRAM_SUB_BGEXTPLTT_NONE, - GX_VRAM_OBJ_64_E, - GX_VRAM_OBJEXTPLTT_NONE, - GX_VRAM_SUB_OBJ_16_I, - GX_VRAM_SUB_OBJEXTPLTT_NONE, - GX_VRAM_TEX_NONE, - GX_VRAM_TEXPLTT_NONE - }; - - GXLayers_SetBanks(&v0); - - MI_CpuClear32((void *)HW_BG_VRAM, HW_BG_VRAM_SIZE); - MI_CpuClear32((void *)HW_DB_BG_VRAM, HW_DB_BG_VRAM_SIZE); - MI_CpuClear32((void *)HW_OBJ_VRAM, HW_OBJ_VRAM_SIZE); - MI_CpuClear32((void *)HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM_SIZE); - } - - { - GraphicsModes v1 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_5, - GX_BGMODE_0, - GX_BG0_AS_2D, - }; - - SetAllGraphicsModes(&v1); - } - - { - BgTemplate v2[] = { - { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x0000, - .charBase = GX_BG_CHARBASE_0x0c000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0x0800, - .charBase = GX_BG_CHARBASE_0x20000, - .bgExtPltt = GX_BG_EXTPLTT_23, - .priority = 2, - .areaOver = 0, - .mosaic = FALSE, - }, - { - .x = 0, - .y = 0, - .bufferSize = 0, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0x2800, - .charBase = GX_BG_CHARBASE_0x30000, - .bgExtPltt = GX_BG_EXTPLTT_23, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_1, &v2[0], 0); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_1); - Bg_SetOffset(param0, BG_LAYER_MAIN_1, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_1, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_2, &v2[1], 2); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_2); - Bg_SetOffset(param0, BG_LAYER_MAIN_2, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_2, 3, 0); - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_3, &v2[2], 2); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_3); - Bg_SetOffset(param0, BG_LAYER_MAIN_3, 0, 0); - Bg_SetOffset(param0, BG_LAYER_MAIN_3, 3, 0); - } - - { - BgTemplate v3[] = { - { - .x = 0, - .y = 0, - .bufferSize = 0x2000, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_512x512, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x2000, - .charBase = GX_BG_CHARBASE_0x14000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_SUB_3, &v3[0], 0); - Bg_ClearTilemap(param0, BG_LAYER_SUB_3); - Bg_SetOffset(param0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(param0, BG_LAYER_SUB_3, 3, 0); - } - - Bg_ClearTilesRange(7, 32, 0, HEAP_ID_75); -} - -static void ov99_021D16E4(UnkStruct_ov99_021D2CB0 *param0) -{ - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 85, HEAP_ID_75, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES, PLTT_DEST(15)); - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 85, HEAP_ID_75, PLTTBUF_SUB_BG, PALETTE_SIZE_BYTES, PLTT_DEST(15)); -} - -static void ov99_021D1720(UnkStruct_ov99_021D2CB0 *param0) -{ - VecFx32 v0, v1; - MtxFx33 v2; - - v0.x = FX32_ONE; - v0.y = FX32_ONE; - v0.z = FX32_ONE; - - v1.x = 0; - v1.y = 0; - v1.z = 0; - - MTX_Identity33(&v2); - - G3_ResetG3X(); - Camera_SetAsActive(param0->camera); - Camera_ComputeProjectionMatrix(0, param0->camera); - Camera_ComputeViewMatrix(); - - switch (param0->unk_1101) { - case 0: - NNS_G3dGlbLightVector(0, 1897, -3600, -466); - NNS_G3dGlbLightVector(2, 0, 0, 4096); - NNS_G3dGlbLightColor(0, GX_RGB(28, 12, 6)); - NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); - NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(15, 15, 15), GX_RGB(11, 12, 12), 0); - NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(17, 17, 17), GX_RGB(8, 8, 7), 0); - break; - case 2: - NNS_G3dGlbLightVector(0, -2043, -3548, 110); - NNS_G3dGlbLightVector(2, 0, 0, 4096); - NNS_G3dGlbLightColor(0, GX_RGB(22, 22, 20)); - NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); - NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(15, 15, 15), GX_RGB(9, 11, 11), 0); - NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(16, 16, 16), GX_RGB(14, 14, 14), 0); - break; - case 4: - NNS_G3dGlbLightVector(0, 1897, -3600, -466); - NNS_G3dGlbLightVector(2, 0, 0, 4096); - NNS_G3dGlbLightColor(0, GX_RGB(11, 11, 16)); - NNS_G3dGlbLightColor(2, GX_RGB(0, 0, 0)); - NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(14, 14, 16), GX_RGB(10, 10, 10), 0); - NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(14, 14, 16), GX_RGB(8, 8, 11), 0); - break; - default: - NNS_G3dGlbLightVector(0, 0, -FX32_ONE, 0); - NNS_G3dGlbLightColor(0, GX_RGB(28, 28, 28)); - NNS_G3dGlbMaterialColorDiffAmb(GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), 0); - NNS_G3dGlbMaterialColorSpecEmi(GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), 0); - break; - } - - NNS_G3dGlbLightVector(3, 0, -FX32_ONE, 0); - NNS_G3dGlbLightColor(3, GX_RGB(28, 28, 28)); - NNS_G3dGlbSetBaseTrans(&v1); - NNS_G3dGlbSetBaseRot(&v2); - NNS_G3dGlbSetBaseScale(&v0); - NNS_G3dGePushMtx(); - - { - int v3, v4; - - for (v3 = 0; v3 < 2; v3++) { - for (v4 = 0; v4 < 16; v4++) { - Easy3DObject_Draw(¶m0->unk_6C[v3][v4]); - } - } - } - - NNS_G3dGePopMtx(1); -} - -static void ov99_021D1918(UnkStruct_ov99_021D2CB0 *param0) -{ - VecFx32 v0 = { 0, -FX32_ONE * 8, 0 }; - VecFx32 v1 = { -31712, -142304, 496744 }; - VecFx32 v2 = { -31712, -67780, -5704 }; - - param0->camera = Camera_Alloc(HEAP_ID_75); - - Camera_InitWithTarget(&v0, 0x7c000, &Unk_ov99_021D46CC, (22 * 0xffff) / 360, 0, 0, param0->camera); - Camera_SetPosition(&v1, param0->camera); - Camera_SetTarget(&v2, param0->camera); - Camera_SetClipping(FX32_ONE, FX32_ONE * 900, param0->camera); - Camera_SetAsActive(param0->camera); -} - -static void ov99_021D19A0(UnkStruct_ov99_021D2CB0 *param0) -{ - Camera_Delete(param0->camera); -} - -static G3DPipelineBuffers *ov99_021D19AC(enum HeapID heapID) -{ - return G3DPipeline_Init(heapID, TEXTURE_VRAM_SIZE_128K, PALETTE_VRAM_SIZE_16K, ov99_021D19C8); -} - -static void ov99_021D19C8(void) -{ - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - - G2_SetBG0Priority(1); - G3X_SetShading(GX_SHADING_TOON); - G3X_AntiAlias(1); - G3X_AlphaTest(0, 0); - G3X_AlphaBlend(1); - G3X_EdgeMarking(0); - G3X_SetFog(0, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0); - G3X_SetClearColor(GX_RGB(0, 0, 0), 0, 0x7fff, 63, 0); - G3_ViewPort(0, 0, 255, 191); -} - -static void ov99_021D1A4C(G3DPipelineBuffers *param0) -{ - G3DPipelineBuffers_Free(param0); -} diff --git a/src/overlay099/ov99_021D1A54.c b/src/overlay099/ov99_021D1A54.c deleted file mode 100644 index a686a41ff8d..00000000000 --- a/src/overlay099/ov99_021D1A54.c +++ /dev/null @@ -1,1153 +0,0 @@ -#include "overlay099/ov99_021D1A54.h" - -#include -#include - -#include "constants/graphics.h" - -#include "overlay099/ov99_021D0D80.h" -#include "overlay099/ov99_021D2C08.h" -#include "overlay099/ov99_021D2E28.h" -#include "overlay099/ov99_021D340C.h" -#include "overlay099/ov99_021D3A40.h" -#include "overlay099/ov99_021D3C18.h" -#include "overlay099/ov99_021D3DE0.h" -#include "overlay099/ov99_021D3E78.h" -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D2CB0_sub2.h" -#include "overlay099/struct_ov99_021D3A40.h" - -#include "bg_window.h" -#include "brightness_controller.h" -#include "easy3d_object.h" -#include "font.h" -#include "graphics.h" -#include "gx_layers.h" -#include "heap.h" -#include "message.h" -#include "palette.h" -#include "screen_fade.h" -#include "sprite.h" -#include "sprite_system.h" -#include "string_gf.h" -#include "system.h" -#include "text.h" - -typedef void (*UnkFuncPtr_ov99_021D4A04)(UnkStruct_ov99_021D2CB0 *); -typedef BOOL (*UnkFuncPtr_ov99_021D4A04_1)(UnkStruct_ov99_021D2CB0 *, UnkStruct_ov99_021D3A40 *); - -typedef struct { - UnkFuncPtr_ov99_021D4A04 unk_00; - UnkFuncPtr_ov99_021D4A04 unk_04; - UnkFuncPtr_ov99_021D4A04 unk_08; - UnkFuncPtr_ov99_021D4A04 unk_0C; - UnkFuncPtr_ov99_021D4A04 unk_10; - UnkFuncPtr_ov99_021D4A04 unk_14; - UnkFuncPtr_ov99_021D4A04 unk_18; - UnkFuncPtr_ov99_021D4A04 unk_1C; - UnkFuncPtr_ov99_021D4A04 unk_20; - UnkFuncPtr_ov99_021D4A04 unk_24; - UnkFuncPtr_ov99_021D4A04 unk_28; - UnkFuncPtr_ov99_021D4A04 unk_2C; - UnkFuncPtr_ov99_021D4A04_1 unk_30; -} UnkStruct_ov99_021D4A04; - -static void ov99_021D1A54(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1B98(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1BC4(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite **param1, ManagedSprite **param2); -static void ov99_021D1C9C(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite *param1, ManagedSprite *param2); -static void ov99_021D1D68(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1E6C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1E90(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1E98(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1EA0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1EB4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1EC8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1F44(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1F70(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1FB8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D1FD8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D20F8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D211C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D214C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2158(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D215C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2160(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2164(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2168(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D216C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2170(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2174(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2178(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D217C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2180(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D22AC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D22D0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D22D8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D22E0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D22F4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2308(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2384(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D23B0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D23F0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2410(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D24CC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D24F0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2640(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2664(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D26E4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2714(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D275C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2780(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D27FC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2828(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D288C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D28AC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A14(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A38(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A70(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A84(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A88(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A8C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A90(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A94(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A98(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2A9C(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2AA0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2AA4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2AA8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2AAC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BBC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BE0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BE4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BE8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BEC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BF0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BF4(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BF8(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2BFC(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2C00(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D2C04(UnkStruct_ov99_021D2CB0 *param0); - -static const UnkStruct_ov99_021D4A04 Unk_ov99_021D4A04[] = { - { - ov99_021D1D68, - ov99_021D1FD8, - ov99_021D1E90, - ov99_021D1EC8, - ov99_021D1EA0, - ov99_021D1F70, - ov99_021D1E6C, - ov99_021D20F8, - ov99_021D1E98, - ov99_021D1F44, - ov99_021D1EB4, - ov99_021D1FB8, - ov99_021D2C08, - }, - { - ov99_021D211C, - ov99_021D2178, - ov99_021D2158, - ov99_021D2168, - ov99_021D2160, - ov99_021D2170, - ov99_021D214C, - ov99_021D217C, - ov99_021D215C, - ov99_021D216C, - ov99_021D2164, - ov99_021D2174, - ov99_021D3A40, - }, - { - ov99_021D2180, - ov99_021D2410, - ov99_021D22D0, - ov99_021D2308, - ov99_021D22E0, - ov99_021D23B0, - ov99_021D22AC, - ov99_021D24CC, - ov99_021D22D8, - ov99_021D2384, - ov99_021D22F4, - ov99_021D23F0, - ov99_021D2E28, - }, - { - ov99_021D211C, - ov99_021D2178, - ov99_021D2158, - ov99_021D2168, - ov99_021D2160, - ov99_021D2170, - ov99_021D214C, - ov99_021D217C, - ov99_021D215C, - ov99_021D216C, - ov99_021D2164, - ov99_021D2174, - ov99_021D3B2C, - }, - { - ov99_021D24F0, - ov99_021D28AC, - ov99_021D2664, - ov99_021D2780, - ov99_021D2714, - ov99_021D2828, - ov99_021D2640, - ov99_021D2A14, - ov99_021D26E4, - ov99_021D27FC, - ov99_021D275C, - ov99_021D288C, - ov99_021D340C, - }, - { - ov99_021D2A38, - ov99_021D2AA4, - ov99_021D2A84, - ov99_021D2A94, - ov99_021D2A8C, - ov99_021D2A9C, - ov99_021D2A70, - ov99_021D2AA8, - ov99_021D2A88, - ov99_021D2A98, - ov99_021D2A90, - ov99_021D2AA0, - ov99_021D3C18, - }, - { - ov99_021D2AAC, - ov99_021D2C00, - ov99_021D2BE0, - ov99_021D2BF0, - ov99_021D2BE8, - ov99_021D2BF8, - ov99_021D2BBC, - ov99_021D2C04, - ov99_021D2BE4, - ov99_021D2BF4, - ov99_021D2BEC, - ov99_021D2BFC, - ov99_021D3DE0, - }, -}; - -static const SpriteTemplate Unk_ov99_021D499C = { - 0x0, - 0x0, - 0x0, - 0x0, - 0x96, - 0x1, - NNS_G2D_VRAM_TYPE_2DSUB, - { 0x2713, 0x2713, 0x2713, 0x2713, 0xffffffff, 0xffffffff }, - 0x2, - 0x0 -}; - -static const SpriteTemplate Unk_ov99_021D4968 = { - 0x0, - 0x0, - 0x0, - 0x1, - 0x96, - 0x0, - NNS_G2D_VRAM_TYPE_2DSUB, - { 0x2714, 0x2714, 0x2714, 0x2714, 0xffffffff, 0xffffffff }, - 0x2, - 0x0 -}; - -static const SpriteTemplate Unk_ov99_021D4934 = { - 0x0, - 0x0, - 0x0, - 0x2, - 0x96, - 0x2, - NNS_G2D_VRAM_TYPE_2DSUB, - { 0x2715, 0x2715, 0x2715, 0x2715, 0xffffffff, 0xffffffff }, - 0x2, - 0x0 -}; - -static const SpriteTemplate Unk_ov99_021D49D0 = { - 0x0, - 0x0, - 0x0, - 0x3, - 0xC8, - 0x3, - NNS_G2D_VRAM_TYPE_2DMAIN, - { 0x2712, 0x2712, 0x2712, 0x2712, 0xffffffff, 0xffffffff }, - 0x3, - 0x0 -}; - -static const SpriteTemplate Unk_ov99_021D48CC = { - 0x0, - 0x0, - 0x0, - 0x3, - 0xC8, - 0x3, - NNS_G2D_VRAM_TYPE_2DSUB, - { 0x2715, 0x2715, 0x2715, 0x2715, 0xffffffff, 0xffffffff }, - 0x3, - 0x0 -}; - -static const SpriteTemplate Unk_ov99_021D4900 = { - 0xC0, - 0xA0, - 0x0, - 0x0, - 0x33, - 0x0, - NNS_G2D_VRAM_TYPE_2DMAIN, - { 0x2711, 0x2711, 0x2711, 0x2711, 0xffffffff, 0xffffffff }, - 0x1, - 0x1 -}; - -static void ov99_021D1A54(UnkStruct_ov99_021D2CB0 *param0) -{ - u8 v0; - - if (param0->unk_00->gender == 0) { - v0 = SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_MAIN_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 31, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 28, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 29, FALSE, 10001); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 30, FALSE, 10001); - } else { - v0 = SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_MAIN_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 36, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 33, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10001); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 34, FALSE, 10001); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 35, FALSE, 10001); - } - - switch (param0->unk_1101) { - case 0: - PaletteData_Blend(param0->unk_0C, PLTTBUF_MAIN_OBJ, v0 * 16, 16, 4, GX_RGB(28, 12, 6)); - break; - case 2: - break; - case 4: - PaletteData_Blend(param0->unk_0C, PLTTBUF_MAIN_OBJ, v0 * 16, 16, 4, GX_RGB(11, 11, 16)); - break; - } -} - -static void ov99_021D1B98(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteManager_UnloadCharObjById(param0->unk_1C, 10001); - SpriteManager_UnloadPlttObjById(param0->unk_1C, 10001); - SpriteManager_UnloadCellObjById(param0->unk_1C, 10001); - SpriteManager_UnloadAnimObjById(param0->unk_1C, 10001); -} - -static void ov99_021D1BC4(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite **param1, ManagedSprite **param2) -{ - ManagedSprite *v0; - ManagedSprite *v1; - SpriteTemplate v2 = Unk_ov99_021D4900; - - MI_CpuClear8(¶m0->unk_1114, sizeof(UnkStruct_ov99_021D2CB0_sub2)); - - v0 = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &v2); - - ManagedSprite_SetAnimateFlag(v0, 1); - Sprite_TickFrame(v0->sprite); - - *param1 = v0; - v2.priority = 60; - v1 = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &v2); - - ManagedSprite_SetAnim(v1, 2); - ManagedSprite_SetAnimateFlag(v1, 1); - Sprite_TickFrame(v1->sprite); - - *param2 = v1; - - { - void *v3; - NNSG2dCharacterData *v4; - u32 v5; - - GF_ASSERT(param0->unk_10F4 == NULL); - - if (param0->unk_00->gender == 0) { - v5 = 27; - } else { - v5 = 32; - } - - param0->unk_10F4 = Heap_Alloc(HEAP_ID_75, (0x20 * 8)); - v3 = Graphics_GetCharDataFromOpenNARC(param0->unk_10F8, v5, 0, &v4, HEAP_ID_75); - - MI_CpuCopy32(v4->pRawData, param0->unk_10F4, (0x20 * 8)); - Heap_Free(v3); - DC_FlushRange(param0->unk_10F4, (0x20 * 8)); - } -} - -static void ov99_021D1C9C(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite *param1, ManagedSprite *param2) -{ - Sprite_DeleteAndFreeResources(param1); - Sprite_DeleteAndFreeResources(param2); - - if (param0->unk_10F4 != NULL) { - Heap_Free(param0->unk_10F4); - param0->unk_10F4 = NULL; - } -} - -void ov99_021D1CC8(UnkStruct_ov99_021D2CB0 *param0, int param1) -{ - const UnkStruct_ov99_021D4A04 *v0 = &Unk_ov99_021D4A04[param1]; - - v0->unk_00(param0); - v0->unk_04(param0); - v0->unk_08(param0); - v0->unk_0C(param0); - v0->unk_10(param0); - v0->unk_14(param0); -} - -void ov99_021D1CFC(UnkStruct_ov99_021D2CB0 *param0, int param1) -{ - const UnkStruct_ov99_021D4A04 *v0 = &Unk_ov99_021D4A04[param1]; - - v0->unk_18(param0); - v0->unk_1C(param0); - v0->unk_20(param0); - v0->unk_24(param0); - v0->unk_28(param0); - v0->unk_2C(param0); -} - -BOOL ov99_021D1D30(UnkStruct_ov99_021D2CB0 *param0, int param1) -{ - BOOL v0 = Unk_ov99_021D4A04[param1].unk_30(param0, ¶m0->unk_FA4); - - if (v0 == 1) { - MI_CpuClear8(¶m0->unk_FA4, sizeof(UnkStruct_ov99_021D3A40)); - } - - return v0; -} - -static void ov99_021D1D68(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 18, HEAP_ID_75, PLTTBUF_MAIN_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 9, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 3, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 21, HEAP_ID_75, PLTTBUF_SUB_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 12, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 6, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 0, 0); - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 3, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 3, 0); - - Bg_ToggleLayer(BG_LAYER_MAIN_2, 1); - Bg_ToggleLayer(BG_LAYER_SUB_3, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - - Bg_ScheduleTilemapTransfer(param0->unk_08, 2); - Bg_ScheduleTilemapTransfer(param0->unk_08, 7); -} - -static void ov99_021D1E6C(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_MAIN_2, 0); - Bg_ToggleLayer(BG_LAYER_SUB_3, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 0); -} - -static void ov99_021D1E90(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1A54(param0); -} - -static void ov99_021D1E98(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1B98(param0); -} - -static void ov99_021D1EA0(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1BC4(param0, ¶m0->unk_10E0[0], ¶m0->unk_10E0[1]); -} - -static void ov99_021D1EB4(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1C9C(param0, param0->unk_10E0[0], param0->unk_10E0[1]); -} - -static void ov99_021D1EC8(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_SUB_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10003); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10003); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 1, FALSE, 10003); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 2, FALSE, 10003); -} - -static void ov99_021D1F44(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteManager_UnloadCharObjById(param0->unk_1C, 10003); - SpriteManager_UnloadPlttObjById(param0->unk_1C, 10003); - SpriteManager_UnloadCellObjById(param0->unk_1C, 10003); - SpriteManager_UnloadAnimObjById(param0->unk_1C, 10003); -} - -static void ov99_021D1F70(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 4; v0++) { - param0->unk_10E0[v0] = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &Unk_ov99_021D499C); - - ManagedSprite_SetAffineOverwriteMode(param0->unk_10E0[v0], AFFINE_OVERWRITE_MODE_DOUBLE); - ManagedSprite_SetAnimateFlag(param0->unk_10E0[v0], TRUE); - Sprite_TickFrame(param0->unk_10E0[v0]->sprite); - } -} - -static void ov99_021D1FB8(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 4; v0++) { - Sprite_DeleteAndFreeResources(param0->unk_10E0[v0]); - } -} - -static void ov99_021D1FD8(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - Easy3DModel_LoadFrom(¶m0->unk_2C[0], param0->unk_10F8, 80, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[0].model); - - Easy3DModel_LoadFrom(¶m0->unk_2C[1], param0->unk_10F8, 81, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[1].model); - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_Init(¶m0->unk_6C[0][v0], ¶m0->unk_2C[0]); - Easy3DObject_SetPosition(¶m0->unk_6C[0][v0], 0, 0, 0); - Easy3DObject_SetScale(¶m0->unk_6C[0][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[0][v0], 1); - } - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_Init(¶m0->unk_6C[1][v0], ¶m0->unk_2C[1]); - Easy3DObject_SetPosition(¶m0->unk_6C[1][v0], 0, 0, 0); - Easy3DObject_SetScale(¶m0->unk_6C[1][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[1][v0], 1); - } - - param0->unk_1104 = 2; - - ov99_021D4134(param0, 0); - ov99_021D4170(param0); - - param0->unk_1103 = 1; -} - -static void ov99_021D20F8(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - Easy3DModel_Release(¶m0->unk_2C[v0]); - } - - param0->unk_1103 = 0; -} - -static void ov99_021D211C(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - ov99_021D439C(param0, param0->unk_1105, 3, 0); - param0->unk_1105++; - - Bg_ToggleLayer(BG_LAYER_MAIN_3, 1); - Bg_ScheduleTilemapTransfer(param0->unk_08, 2); -} - -static void ov99_021D214C(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_MAIN_3, 0); -} - -static void ov99_021D2158(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D215C(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2160(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2164(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2168(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D216C(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2170(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2174(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2178(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D217C(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2180(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 19, HEAP_ID_75, PLTTBUF_MAIN_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 10, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 4, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 22, HEAP_ID_75, PLTTBUF_SUB_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 13, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 7, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - - { - NNSG2dPaletteData *v1; - void *v2; - - v2 = Graphics_GetPlttDataFromOpenNARC(param0->unk_10F8, 16, &v1, HEAP_ID_75); - MI_CpuCopy16(v1->pRawData, param0->unk_FA4.unk_08_val2.unk_08, 0x20 * 4); - Heap_Free(v2); - } - - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 0, 0); - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 3, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 3, 0); - - Bg_ToggleLayer(BG_LAYER_MAIN_2, 1); - Bg_ToggleLayer(BG_LAYER_SUB_3, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - - Bg_ScheduleTilemapTransfer(param0->unk_08, 2); - Bg_ScheduleTilemapTransfer(param0->unk_08, 7); -} - -static void ov99_021D22AC(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_MAIN_2, 0); - Bg_ToggleLayer(BG_LAYER_SUB_3, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 0); -} - -static void ov99_021D22D0(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1A54(param0); -} - -static void ov99_021D22D8(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1B98(param0); -} - -static void ov99_021D22E0(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1BC4(param0, ¶m0->unk_10E0[0], ¶m0->unk_10E0[1]); -} - -static void ov99_021D22F4(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1C9C(param0, param0->unk_10E0[0], param0->unk_10E0[1]); -} - -static void ov99_021D2308(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_SUB_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10004); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10004); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 1, FALSE, 10004); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 2, FALSE, 10004); -} - -static void ov99_021D2384(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteManager_UnloadCharObjById(param0->unk_1C, 10004); - SpriteManager_UnloadPlttObjById(param0->unk_1C, 10004); - SpriteManager_UnloadCellObjById(param0->unk_1C, 10004); - SpriteManager_UnloadAnimObjById(param0->unk_1C, 10004); -} - -static void ov99_021D23B0(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 3; v0++) { - param0->unk_10E0[v0] = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &Unk_ov99_021D4968); - ManagedSprite_SetAnimateFlag(param0->unk_10E0[v0], 1); - Sprite_TickFrame(param0->unk_10E0[v0]->sprite); - } -} - -static void ov99_021D23F0(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 3; v0++) { - Sprite_DeleteAndFreeResources(param0->unk_10E0[v0]); - } -} - -static void ov99_021D2410(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - Easy3DModel_LoadFrom(¶m0->unk_2C[0], param0->unk_10F8, 78, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[0].model); - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_Init(¶m0->unk_6C[0][v0], ¶m0->unk_2C[0]); - Easy3DObject_SetPosition(¶m0->unk_6C[0][v0], 0, 0, 0); - Easy3DObject_SetScale(¶m0->unk_6C[0][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[0][v0], 1); - } - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_SetVisible(¶m0->unk_6C[1][v0], 0); - } - - param0->unk_1104 = 1; - - ov99_021D4134(param0, 1); - ov99_021D4170(param0); - - param0->unk_1103 = 1; -} - -static void ov99_021D24CC(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - Easy3DModel_Release(¶m0->unk_2C[v0]); - } - - param0->unk_1103 = 0; -} - -static void ov99_021D24F0(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 20, HEAP_ID_75, PLTTBUF_MAIN_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 11, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 5, param0->unk_08, 2, 0, 0, 0, HEAP_ID_75); - - PaletteData_LoadBufferFromFileStart(param0->unk_0C, NARC_INDEX_GRAPHIC__ENDING, 23, HEAP_ID_75, PLTTBUF_SUB_BG, 0, 0); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, 14, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, 8, param0->unk_08, 7, 0, 0, 0, HEAP_ID_75); - - { - NNSG2dPaletteData *v1; - void *v2; - - v2 = Graphics_GetPlttDataFromOpenNARC(param0->unk_10F8, 17, &v1, HEAP_ID_75); - MI_CpuCopy16(v1->pRawData, param0->unk_FA4.unk_08_val3.unk_08, PALETTE_SIZE_BYTES * 8); - Heap_Free(v2); - - PaletteData_LoadBuffer(param0->unk_0C, param0->unk_FA4.unk_08_val3.unk_08, PLTTBUF_MAIN_BG, PLTT_DEST(1), PALETTE_SIZE_BYTES); - PaletteData_LoadBuffer(param0->unk_0C, param0->unk_FA4.unk_08_val3.unk_08, PLTTBUF_SUB_BG, PLTT_DEST(1), PALETTE_SIZE_BYTES); - } - - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 0, 0); - Bg_SetOffset(v0, BG_LAYER_MAIN_2, 3, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 3, 0); - - Bg_ToggleLayer(BG_LAYER_MAIN_2, 1); - Bg_ToggleLayer(BG_LAYER_SUB_3, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - - Bg_ScheduleTilemapTransfer(param0->unk_08, 2); - Bg_ScheduleTilemapTransfer(param0->unk_08, 7); -} - -static void ov99_021D2640(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_MAIN_2, 0); - Bg_ToggleLayer(BG_LAYER_SUB_3, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 0); -} - -static void ov99_021D2664(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1A54(param0); - - SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_MAIN_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 15, FALSE, 4, NNS_G2D_VRAM_TYPE_2DMAIN, 10002); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 0, FALSE, NNS_G2D_VRAM_TYPE_2DMAIN, 10002); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 1, FALSE, 10002); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 2, FALSE, 10002); -} - -static void ov99_021D26E4(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteManager_UnloadCharObjById(param0->unk_1C, 10002); - SpriteManager_UnloadPlttObjById(param0->unk_1C, 10002); - SpriteManager_UnloadCellObjById(param0->unk_1C, 10002); - SpriteManager_UnloadAnimObjById(param0->unk_1C, 10002); - - ov99_021D1B98(param0); -} - -static void ov99_021D2714(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1BC4(param0, ¶m0->unk_10E0[0], ¶m0->unk_10E0[1]); - - param0->unk_10E0[3] = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &Unk_ov99_021D49D0); - - ManagedSprite_SetAnimateFlag(param0->unk_10E0[3], 1); - ManagedSprite_SetDrawFlag(param0->unk_10E0[3], 0); - Sprite_TickFrame(param0->unk_10E0[3]->sprite); -} - -static void ov99_021D275C(UnkStruct_ov99_021D2CB0 *param0) -{ - ov99_021D1C9C(param0, param0->unk_10E0[0], param0->unk_10E0[1]); - Sprite_DeleteAndFreeResources(param0->unk_10E0[3]); -} - -static void ov99_021D2780(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteSystem_LoadPaletteBufferFromOpenNarc(param0->unk_0C, PLTTBUF_SUB_OBJ, param0->unk_18, param0->unk_1C, param0->unk_10F8, 15, FALSE, 10, NNS_G2D_VRAM_TYPE_2DSUB, 10005); - SpriteSystem_LoadCharResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 0, FALSE, NNS_G2D_VRAM_TYPE_2DSUB, 10005); - SpriteSystem_LoadCellResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 1, FALSE, 10005); - SpriteSystem_LoadAnimResObjFromOpenNarc(param0->unk_18, param0->unk_1C, param0->unk_10F8, 2, FALSE, 10005); -} - -static void ov99_021D27FC(UnkStruct_ov99_021D2CB0 *param0) -{ - SpriteManager_UnloadCharObjById(param0->unk_1C, 10005); - SpriteManager_UnloadPlttObjById(param0->unk_1C, 10005); - SpriteManager_UnloadCellObjById(param0->unk_1C, 10005); - SpriteManager_UnloadAnimObjById(param0->unk_1C, 10005); -} - -static void ov99_021D2828(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 2; v0++) { - param0->unk_10E0[v0] = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &Unk_ov99_021D4934); - ManagedSprite_SetAnimateFlag(param0->unk_10E0[v0], 1); - Sprite_TickFrame(param0->unk_10E0[v0]->sprite); - } - - param0->unk_10E0[4] = SpriteSystem_NewSprite(param0->unk_18, param0->unk_1C, &Unk_ov99_021D48CC); - - ManagedSprite_SetAnimateFlag(param0->unk_10E0[4], 1); - ManagedSprite_SetDrawFlag(param0->unk_10E0[4], 0); - Sprite_TickFrame(param0->unk_10E0[4]->sprite); -} - -static void ov99_021D288C(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 2; v0 <= 2; v0++) { - Sprite_DeleteAndFreeResources(param0->unk_10E0[v0]); - } - - Sprite_DeleteAndFreeResources(param0->unk_10E0[4]); -} - -static void ov99_021D28AC(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - Easy3DModel_LoadFrom(¶m0->unk_2C[0], param0->unk_10F8, 82, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[0].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[0].model); - - Easy3DModel_LoadFrom(¶m0->unk_2C[1], param0->unk_10F8, 83, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[1].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[1].model); - - Easy3DModel_LoadFrom(¶m0->unk_2C[2], param0->unk_10F8, 84, HEAP_ID_75); - - NNS_G3dMdlUseGlbDiff(param0->unk_2C[2].model); - NNS_G3dMdlUseGlbAmb(param0->unk_2C[2].model); - NNS_G3dMdlUseGlbSpec(param0->unk_2C[2].model); - NNS_G3dMdlUseGlbEmi(param0->unk_2C[2].model); - - Easy3DModel_LoadFrom(¶m0->unk_2C[3], param0->unk_10F8, 79, HEAP_ID_75); - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_Init(¶m0->unk_6C[0][v0], ¶m0->unk_2C[0]); - - Easy3DObject_SetPosition(¶m0->unk_6C[0][v0], 0, 0, 0); - Easy3DObject_SetScale(¶m0->unk_6C[0][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[0][v0], 1); - } - - for (v0 = 0; v0 < 16; v0++) { - Easy3DObject_Init(¶m0->unk_6C[1][v0], ¶m0->unk_2C[2]); - - Easy3DObject_SetPosition(¶m0->unk_6C[1][v0], 0, 0, 0); - Easy3DObject_SetScale(¶m0->unk_6C[1][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[1][v0], 1); - } - - param0->unk_1104 = 2; - - ov99_021D4134(param0, 2); - ov99_021D4170(param0); - - param0->unk_1103 = 1; -} - -static void ov99_021D2A14(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - Easy3DModel_Release(¶m0->unk_2C[v0]); - } - - param0->unk_1103 = 0; -} - -static void ov99_021D2A38(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - ov99_021D12F0(param0); - - param0->unk_1105 = 0; - ov99_021D439C(param0, param0->unk_1105, 2, 1); - param0->unk_1105++; - - Bg_ToggleLayer(BG_LAYER_MAIN_2, 1); - Bg_ScheduleTilemapTransfer(param0->unk_08, 2); -} - -static void ov99_021D2A70(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_MAIN_2, 0); - Bg_ToggleLayer(BG_LAYER_MAIN_3, 0); -} - -static void ov99_021D2A84(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A88(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A8C(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A90(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A94(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A98(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2A9C(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2AA0(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2AA4(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2AA8(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2AAC(UnkStruct_ov99_021D2CB0 *param0) -{ - BgConfig *v0 = param0->unk_08; - - gSystem.whichScreenIs3D = DS_SCREEN_MAIN; - - GXLayers_SwapDisplay(); - PaletteData_FillBufferRange(param0->unk_0C, PLTTBUF_MAIN_BG, PLTTSEL_BOTH, 0x0, 0, 1); - - { - String *v1; - int v2; - - param0->unk_24 = Window_New(HEAP_ID_75, 1); - - Window_Add(v0, param0->unk_24, 7, 0, 0, 32, 32, 15, 0); - Window_FillTilemap(param0->unk_24, 15); - Window_PutToTilemap(param0->unk_24); - - v1 = MessageLoader_GetNewString(param0->unk_20, ov99_021D4130()); - v2 = (256 - Font_CalcStringWidth(FONT_SYSTEM, v1, 0)) / 2; - - Text_AddPrinterWithParamsColorAndSpacing(param0->unk_24, FONT_SYSTEM, v1, v2, 80, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 15), 3, 0, NULL); - Window_LoadTiles(param0->unk_24); - String_Free(v1); - } - - Bg_SetOffset(v0, BG_LAYER_SUB_3, 0, 0); - Bg_SetOffset(v0, BG_LAYER_SUB_3, 3, 0); - Bg_ToggleLayer(BG_LAYER_SUB_3, 1); - - GX_SetVisibleWnd(GX_WNDMASK_NONE); - GXS_SetVisibleWnd(GX_WNDMASK_NONE); - - SetScreenMasterBrightness(DS_SCREEN_MAIN, BRIGHTNESS_BLACK); - SetScreenMasterBrightness(DS_SCREEN_SUB, BRIGHTNESS_BLACK); - BrightnessController_SetScreenBrightness(0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - Bg_ScheduleTilemapTransfer(param0->unk_08, 7); -} - -static void ov99_021D2BBC(UnkStruct_ov99_021D2CB0 *param0) -{ - Bg_ToggleLayer(BG_LAYER_SUB_3, 0); - - if (param0->unk_24 != NULL) { - Window_Remove(param0->unk_24); - Heap_Free(param0->unk_24); - param0->unk_24 = NULL; - } -} - -static void ov99_021D2BE0(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BE4(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BE8(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BEC(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BF0(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BF4(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BF8(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2BFC(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2C00(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} - -static void ov99_021D2C04(UnkStruct_ov99_021D2CB0 *param0) -{ - return; -} diff --git a/src/overlay099/ov99_021D2C08.c b/src/overlay099/ov99_021D2C08.c deleted file mode 100644 index a9061a60687..00000000000 --- a/src/overlay099/ov99_021D2C08.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "overlay099/ov99_021D2C08.h" - -#include -#include - -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2C08.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D2D18.h" -#include "overlay099/struct_ov99_021D3A40.h" - -#include "bg_window.h" -#include "brightness_controller.h" -#include "math_util.h" -#include "sprite_system.h" - -typedef struct { - s32 unk_00; - fx32 unk_04; - fx32 unk_08; - fx32 unk_0C; - fx32 unk_10; - fx32 unk_14; - fx32 unk_18; - f32 unk_1C; - u16 unk_20; - u16 unk_22; -} UnkStruct_ov99_021D4B70; - -static void ov99_021D2CB0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1); -static void ov99_021D2CEC(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1); -static void ov99_021D2DF4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1); -static void ov99_021D2D18(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1, ManagedSprite *param2, int param3); - -static const UnkStruct_ov99_021D4B70 Unk_ov99_021D4B70[] = { - { - 900, - -64 * FX32_ONE, - 80 * FX32_ONE, - 0x600, - -0x80, - 0xe00, - 0x8000, - 0.0030, - 60, - }, - { - 1350, - -64 * FX32_ONE, - 190 * FX32_ONE, - 0x780, - -0xa0, - 0x1000, - 0xc000, - -0.0040, - 50, - }, - { - 1590, - -64 * FX32_ONE, - 120 * FX32_ONE, - 0x640, - -0x90, - 0xc00, - 0x8000, - -0.0045, - 60, - }, -}; - -BOOL ov99_021D2C08(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D2C08 *v0 = ¶m1->unk_08_val1; - - switch (param1->unk_00) { - case 0: - ov99_021D2CB0(param0, v0); - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - if (param0->unk_10FC >= 1830) { - BrightnessController_StartTransition(24, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - } - break; - case 2: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - return 1; - } - break; - } - - ov99_021D44CC(param0, param0->unk_10E0[0]); - ov99_021D2CEC(param0, v0); - ov99_021D425C(param0, -1); - ov99_021D2DF4(param0, v0); - - return 0; -} - -static void ov99_021D2CB0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1) -{ - int v0, v1 = 0; - - GF_ASSERT(NELEMS(Unk_ov99_021D4B70) == 4 - 2 + 1); - - for (v0 = 2; v0 <= 4; v0++, v1++) { - ManagedSprite_SetPositionFxXYWithSubscreenOffset(param0->unk_10E0[v0], Unk_ov99_021D4B70[v1].unk_04, Unk_ov99_021D4B70[v1].unk_08, ((192 + 80) << FX32_SHIFT)); - param1->unk_08[v1].unk_00 = Unk_ov99_021D4B70[v1].unk_04; - param1->unk_08[v1].unk_04 = Unk_ov99_021D4B70[v1].unk_08; - } -} - -static void ov99_021D2CEC(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1) -{ - int v0, v1 = 0; - - for (v0 = 2; v0 <= 4; v0++, v1++) { - ov99_021D2D18(param0, param1, param0->unk_10E0[v0], v1); - } -} - -static void ov99_021D2D18(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1, ManagedSprite *param2, int param3) -{ - UnkStruct_ov99_021D2D18 *v0 = ¶m1->unk_08[param3]; - const UnkStruct_ov99_021D4B70 *v1 = &Unk_ov99_021D4B70[param3]; - fx32 v2; - - if (v0->unk_0C < v1->unk_00) { - v0->unk_0C++; - return; - } - - v0->unk_08 += v1->unk_14; - - if (v0->unk_08 >= (360 << FX32_SHIFT)) { - v0->unk_08 -= 360 << FX32_SHIFT; - } - - v2 = FX_Mul(CalcSineDegrees_FX32(v0->unk_08), v1->unk_18); - - v0->unk_00 += v1->unk_0C; - v0->unk_04 += v1->unk_10; - - ManagedSprite_SetPositionFxXYWithSubscreenOffset(param2, v0->unk_00, v0->unk_04 + v2, ((192 + 80) << FX32_SHIFT)); - - if (v0->unk_12 == 0) { - ManagedSprite_OffsetAffineScale(param2, v1->unk_1C, v1->unk_1C); - } else { - ManagedSprite_OffsetAffineScale(param2, -v1->unk_1C, -v1->unk_1C); - } - - v0->unk_10++; - - if (v0->unk_10 >= v1->unk_20) { - v0->unk_10 = 0; - v0->unk_12 ^= 1; - } -} - -static void ov99_021D2DF4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2C08 *param1) -{ - param1->unk_00 += -0x40; - - Bg_SetOffset(param0->unk_08, BG_LAYER_MAIN_2, 0, param1->unk_00 / FX32_ONE); - Bg_SetOffset(param0->unk_08, BG_LAYER_SUB_3, 0, param1->unk_00 / FX32_ONE); -} diff --git a/src/overlay099/ov99_021D2E28.c b/src/overlay099/ov99_021D2E28.c deleted file mode 100644 index e0743b0d47b..00000000000 --- a/src/overlay099/ov99_021D2E28.c +++ /dev/null @@ -1,321 +0,0 @@ -#include "overlay099/ov99_021D2E28.h" - -#include -#include - -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D2E28.h" -#include "overlay099/struct_ov99_021D2FD4.h" -#include "overlay099/struct_ov99_021D3A40.h" - -#include "bg_window.h" -#include "brightness_controller.h" -#include "math_util.h" -#include "palette.h" -#include "sprite_system.h" - -typedef struct { - s32 unk_00; - fx32 unk_04; - fx32 unk_08; - fx32 unk_0C; - fx32 unk_10; - fx32 unk_14; - fx32 unk_18; - fx32 unk_1C; - fx32 unk_20; - fx32 unk_24; - fx32 unk_28; - fx32 unk_2C; - fx32 unk_30; - fx32 unk_34; - fx32 unk_38; - fx32 unk_3C; - fx32 unk_40; - fx32 unk_44; - fx32 unk_48; - s32 unk_4C; - u16 unk_50; - u16 unk_52; -} UnkStruct_ov99_021D4BDC; - -static void ov99_021D2ED8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1); -static void ov99_021D2FA8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1); -static void ov99_021D32D8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1); -static void ov99_021D330C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1); -static void ov99_021D2FD4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1, ManagedSprite *param2, int param3); - -static const UnkStruct_ov99_021D4BDC Unk_ov99_021D4BDC[] = { - { - 90, - 160 * FX32_ONE, - 32 * FX32_ONE, - 0x2700, - 0 * FX32_ONE, - 70 * FX32_ONE, - 90 * FX32_ONE, - 0x200, - 0x1800, - -24 * FX32_ONE, - 7 * FX32_ONE, - 0x1b00, - 0x7800, - 160 * FX32_ONE, - 60 * FX32_ONE, - 0x3000, - (128 - 54) * FX32_ONE, - (96 + 16) * FX32_ONE, - 0x80, - 80, - 30, - }, - { - 100, - -160 * FX32_ONE, - -48 * FX32_ONE, - 0x2400, - 0 * FX32_ONE, - 80 * FX32_ONE, - 90 * FX32_ONE, - 0x40, - 0x1800, - 24 * FX32_ONE, - 6 * FX32_ONE, - 0x1d00, - 0x7000, - -160 * FX32_ONE, - -52 * FX32_ONE, - 0x2800, - (128 + 62) * FX32_ONE, - (96 + 10) * FX32_ONE, - 0x80, - 70, - 35, - }, -}; - -BOOL ov99_021D2E28(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D2E28 *v0 = ¶m1->unk_08_val2; - - switch (param1->unk_00) { - case 0: - ov99_021D2ED8(param0, v0); - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - if (param0->unk_10FC >= 6000) { - BrightnessController_StartTransition(24, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - } - break; - case 2: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - return 1; - } - break; - } - - ov99_021D44CC(param0, param0->unk_10E0[0]); - ov99_021D2FA8(param0, v0); - ov99_021D425C(param0, -1); - ov99_021D32D8(param0, v0); - ov99_021D330C(param0, v0); - - return 0; -} - -static void ov99_021D2ED8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1) -{ - int v0, v1 = 0; - - GF_ASSERT(NELEMS(Unk_ov99_021D4BDC) == 3 - 2 + 1); - - for (v0 = 2; v0 <= 3; v0++, v1++) { - param1->unk_94[v1].unk_00 = Unk_ov99_021D4BDC[v1].unk_40 - Unk_ov99_021D4BDC[v1].unk_04; - param1->unk_94[v1].unk_04 = Unk_ov99_021D4BDC[v1].unk_44; - param1->unk_94[v1].unk_10 = Unk_ov99_021D4BDC[v1].unk_10; - param1->unk_94[v1].unk_1C = Unk_ov99_021D4BDC[v1].unk_0C; - param1->unk_94[v1].unk_28 = FX_Mul(CalcSineDegrees_FX32(Unk_ov99_021D4BDC[v1].unk_10), Unk_ov99_021D4BDC[v1].unk_04); - param1->unk_94[v1].unk_2C = FX_Mul(CalcCosineDegrees_FX32(Unk_ov99_021D4BDC[v1].unk_10), Unk_ov99_021D4BDC[v1].unk_08); - param1->unk_94[v1].unk_34 = Unk_ov99_021D4BDC[v1].unk_00; - - ManagedSprite_SetPositionFxXYWithSubscreenOffset(param0->unk_10E0[v0], param1->unk_94[v1].unk_00 + param1->unk_94[v1].unk_28, param1->unk_94[v1].unk_04 + param1->unk_94[v1].unk_2C, ((192 + 80) << FX32_SHIFT)); - ManagedSprite_SetAffineOverwriteMode(param0->unk_10E0[v0], AFFINE_OVERWRITE_MODE_DOUBLE); - } -} - -static void ov99_021D2FA8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1) -{ - int v0, v1 = 0; - - for (v0 = 2; v0 <= 3; v0++, v1++) { - ov99_021D2FD4(param0, param1, param0->unk_10E0[v0], v1); - } -} - -static void ov99_021D2FD4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1, ManagedSprite *param2, int param3) -{ - UnkStruct_ov99_021D2FD4 *v0 = ¶m1->unk_94[param3]; - const UnkStruct_ov99_021D4BDC *v1 = &Unk_ov99_021D4BDC[param3]; - fx32 v2 = 0, v3 = 0; - - if (v0->unk_34 > 0) { - v0->unk_34--; - return; - } - - switch (v0->unk_39) { - case 0: - v0->unk_39++; - case 1: - if (v0->unk_10 > v1->unk_14) { - v0->unk_1C -= v1->unk_1C; - - if (v0->unk_1C < v1->unk_20) { - v0->unk_1C = v1->unk_20; - } - } - - v0->unk_10 += v0->unk_1C; - - if (v0->unk_10 >= v1->unk_18) { - v0->unk_10 = v1->unk_18; - v0->unk_39++; - } - - v0->unk_28 = FX_Mul(CalcSineDegrees_FX32(v0->unk_10), v1->unk_04); - v0->unk_2C = FX_Mul(CalcCosineDegrees_FX32(v0->unk_10), v1->unk_08); - break; - case 2: - v0->unk_00 += v0->unk_28; - v0->unk_04 += v0->unk_2C; - v0->unk_28 = 0; - v0->unk_2C = 0; - v0->unk_20 = v1->unk_2C; - v0->unk_24 = v1->unk_30; - v0->unk_39++; - case 3: - v0->unk_14 += v0->unk_20; - v0->unk_18 += v0->unk_24; - - if (v0->unk_14 >= (360 << FX32_SHIFT)) { - v0->unk_14 -= 360 << FX32_SHIFT; - } - - if (v0->unk_18 >= (360 << FX32_SHIFT)) { - v0->unk_18 -= 360 << FX32_SHIFT; - } - - v0->unk_28 = FX_Mul(CalcSineDegrees_FX32(v0->unk_14), v1->unk_24); - v0->unk_2C = FX_Mul(CalcSineDegrees_FX32(v0->unk_18), v1->unk_28); - - if (param0->unk_10FC >= 5970) { - v0->unk_20 -= v1->unk_2C / 20; - v0->unk_24 -= v1->unk_30 / 20; - - if (v0->unk_20 <= v1->unk_2C / 20) { - v0->unk_39++; - } - } - break; - case 4: - v0->unk_00 = (v0->unk_00 + v0->unk_28) - v1->unk_34; - v0->unk_04 = v0->unk_04 + v0->unk_2C; - v0->unk_10 = 0; - v0->unk_1C = v1->unk_3C; - v0->unk_28 = FX_Mul(CalcSineDegrees_FX32(0), v1->unk_34); - v0->unk_2C = FX_Mul(CalcCosineDegrees_FX32(0), v1->unk_38); - v0->unk_39++; - case 5: - v0->unk_10 += v0->unk_1C; - v0->unk_28 = FX_Mul(CalcCosineDegrees_FX32(v0->unk_10), v1->unk_34); - v0->unk_2C = FX_Mul(CalcSineDegrees_FX32(v0->unk_10), v1->unk_38); - - if (v0->unk_10 >= (180 << FX32_SHIFT)) { - v0->unk_39++; - } - break; - default: - break; - } - - if (v0->unk_38 == 0) { - ManagedSprite_OffsetAffineZRotation(param2, v1->unk_4C); - } else { - ManagedSprite_OffsetAffineZRotation(param2, -v1->unk_4C); - } - - v0->unk_36++; - - if (v0->unk_36 >= v1->unk_50) { - v0->unk_36 = 0; - v0->unk_38 ^= 1; - } - - v0->unk_04 -= v1->unk_48; - ManagedSprite_SetPositionFxXYWithSubscreenOffset(param2, v0->unk_00 + v0->unk_28, v0->unk_04 + v0->unk_2C, ((192 + 80) << FX32_SHIFT)); -} - -static void ov99_021D32D8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1) -{ - param1->unk_04 += 0x60; - - Bg_SetOffset(param0->unk_08, BG_LAYER_MAIN_2, 3, param1->unk_04 / FX32_ONE); - Bg_SetOffset(param0->unk_08, BG_LAYER_SUB_3, 3, param1->unk_04 / FX32_ONE); -} - -static void ov99_021D330C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D2E28 *param1) -{ - int v0, v1; - int v2, v3, v4; - u16 *v5; - - v2 = param1->unk_88; - param1->unk_8C += 0x200; - - if (param1->unk_8C >= (16 << 8)) { - v3 = 16; - param1->unk_8C = 0; - - if (param1->unk_90 == 0) { - param1->unk_88++; - - if (param1->unk_88 >= 4) { - param1->unk_88 = 4 - 2; - param1->unk_90 ^= 1; - } - } else { - param1->unk_88--; - - if (param1->unk_88 < 0) { - param1->unk_88 = 1; - param1->unk_90 ^= 1; - } - } - } else { - v3 = param1->unk_8C >> 8; - } - - if (param1->unk_90 == 0) { - v4 = v2 + 1; - - if (v4 >= 4) { - v4 = v2 - 1; - } - } else { - v4 = v2 - 1; - - if (v4 < 0) { - v4 = 1; - } - } - - v5 = PaletteData_GetFadedBuffer(param0->unk_0C, 1); - - for (v1 = 0; v1 < 16; v1++) { - BlendPalette(¶m1->unk_08[v2][v1], &v5[(2 * 16) + v1], 1, v3, param1->unk_08[v4][v1]); - } -} diff --git a/src/overlay099/ov99_021D340C.c b/src/overlay099/ov99_021D340C.c deleted file mode 100644 index 220d440d8de..00000000000 --- a/src/overlay099/ov99_021D340C.c +++ /dev/null @@ -1,364 +0,0 @@ -#include "overlay099/ov99_021D340C.h" - -#include -#include - -#include "overlay099/const_ov99_021D4CAC.h" -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D340C.h" -#include "overlay099/struct_ov99_021D35E8.h" -#include "overlay099/struct_ov99_021D3A40.h" - -#include "brightness_controller.h" -#include "math_util.h" -#include "palette.h" -#include "sprite_system.h" - -typedef struct { - s16 unk_00; - s16 unk_02; - fx32 unk_04; - fx32 unk_08; - fx32 unk_0C; - fx32 unk_10; - s32 unk_14; - u16 unk_18; -} UnkStruct_ov99_021D4C90; - -typedef struct { - s16 unk_00; - s16 unk_02; -} UnkStruct_ov99_021D4C84; - -static void ov99_021D3588(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1); -static void ov99_021D35C8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1); -static void ov99_021D35E8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1, ManagedSprite *param2, int param3); -static void ov99_021D3930(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1); -static void ov99_021D36B0(UnkStruct_ov99_021D2CB0 *param0); -static void ov99_021D36D4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1); -static void ov99_021D372C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1, int param2); -static void ov99_021D37E0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1); - -static const UnkStruct_ov99_021D4C90 Unk_ov99_021D4C90[] = { - { 0x130, -10, -0xe00, 0x600, 0x8000, 0xC000, 0x96, 0x14 } -}; - -static const UnkStruct_ov99_021D4C84 Unk_ov99_021D4C84[] = { - { 0xC8, 0x0 }, - { 0x90, 0x0 }, - { 0xB4, 0x0 } -}; - -__attribute__((aligned(4))) const u16 Unk_ov99_021D4CAC[] = { - 0x0, - 0x0, - 0x0, - 0x0, - 0x0, - 0x1, - 0x0, - 0x0, - 0x1, - 0x0, - 0x0, - 0x1, - 0x1, - 0x0, - 0x0, - 0x1, - 0x0, - 0x1, - 0x0, - 0x1, - 0x1, - 0x1, - 0x1, - 0x0, - 0x1, - 0x1, - 0x1, - 0x1 -}; - -BOOL ov99_021D340C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D340C *v0 = ¶m1->unk_08_val3; - s32 v1; - - switch (param1->unk_00) { - case 0: { - int v2; - - for (v2 = 0; v2 < 16; v2++) { - MI_CpuClear8(¶m0->unk_6C[0][v2].renderObj, sizeof(NNSG3dRenderObj)); - - if (v2 % 8 == 0) { - v1 = 3; - } else if (v2 >= NELEMS(Unk_ov99_021D4CAC)) { - v1 = 1; - } else { - v1 = Unk_ov99_021D4CAC[v2]; - } - - NNS_G3dRenderObjInit(¶m0->unk_6C[0][v2].renderObj, param0->unk_2C[v1].model); - } - - v0->unk_120 = 16; - } - ov99_021D3588(param0, v0); - ov99_021D36B0(param0); - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - G2_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, 31, 0); - param1->unk_00++; - } - break; - case 2: - if (param0->unk_10FC >= 7980) { - BrightnessController_StartTransition(24, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - } - break; - case 3: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - return 1; - } - break; - } - - if (v0->unk_120 % 8 == 0) { - v1 = 3; - } else if (v0->unk_120 >= NELEMS(Unk_ov99_021D4CAC)) { - v1 = 1; - } else { - v1 = Unk_ov99_021D4CAC[v0->unk_120]; - } - - if (ov99_021D425C(param0, v1) == 1) { - v0->unk_120++; - } - - ov99_021D44CC(param0, param0->unk_10E0[0]); - ov99_021D35C8(param0, v0); - ov99_021D36D4(param0, v0); - ov99_021D3930(param0, v0); - - return 0; -} - -static void ov99_021D3588(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1) -{ - int v0, v1 = 0; - - GF_ASSERT(NELEMS(Unk_ov99_021D4C90) == 2 - 2 + 1); - - for (v0 = 2; v0 <= 2; v0++, v1++) { - ManagedSprite_SetAffineOverwriteMode(param0->unk_10E0[v0], AFFINE_OVERWRITE_MODE_DOUBLE); - ManagedSprite_SetPositionXYWithSubscreenOffset(param0->unk_10E0[v0], Unk_ov99_021D4C90[v1].unk_00, Unk_ov99_021D4C90[v1].unk_02, ((192 + 80) << FX32_SHIFT)); - param1->unk_124[v1].unk_00 = Unk_ov99_021D4C90[v1].unk_00 * FX32_ONE; - param1->unk_124[v1].unk_04 = Unk_ov99_021D4C90[v1].unk_02 * FX32_ONE; - } -} - -static void ov99_021D35C8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1) -{ - int v0, v1 = 0; - - if (param0->unk_10FC < 7440) { - return; - } - - for (v0 = 2; v0 <= 2; v0++, v1++) { - ov99_021D35E8(param0, param1, param0->unk_10E0[v0], v1); - } -} - -static void ov99_021D35E8(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1, ManagedSprite *param2, int param3) -{ - UnkStruct_ov99_021D35E8 *v0 = ¶m1->unk_124[param3]; - const UnkStruct_ov99_021D4C90 *v1 = &Unk_ov99_021D4C90[param3]; - fx32 v2; - - if (v0->unk_00 < -64 * FX32_ONE) { - return; - } - - v0->unk_08 += v1->unk_0C; - - if (v0->unk_08 >= (360 << FX32_SHIFT)) { - v0->unk_08 -= 360 << FX32_SHIFT; - } - - v2 = FX_Mul(CalcSineDegrees_FX32(v0->unk_08), v1->unk_10); - - v0->unk_00 += v1->unk_04; - v0->unk_04 += v1->unk_08; - - ManagedSprite_SetPositionFxXYWithSubscreenOffset(param2, v0->unk_00, v0->unk_04 + v2, ((192 + 80) << FX32_SHIFT)); - - if (v0->unk_0E == 0) { - ManagedSprite_OffsetAffineZRotation(param2, v1->unk_14); - } else { - ManagedSprite_OffsetAffineZRotation(param2, -v1->unk_14); - } - - v0->unk_0C++; - - if (v0->unk_0C >= v1->unk_18) { - v0->unk_0C = 0; - v0->unk_0E ^= 1; - } -} - -static void ov99_021D36B0(UnkStruct_ov99_021D2CB0 *param0) -{ - ManagedSprite_SetExplicitOamMode(param0->unk_10E0[3], GX_OAM_MODE_XLU); - ManagedSprite_SetExplicitOamMode(param0->unk_10E0[4], GX_OAM_MODE_XLU); -} - -static void ov99_021D36D4(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1) -{ - if (param0->unk_10FC == 7200) { - ov99_021D372C(param0, param1, 0); - } - - if (param0->unk_10FC == 7380) { - ov99_021D372C(param0, param1, 1); - } - - if (param0->unk_10FC == 7440) { - ov99_021D372C(param0, param1, 2); - } - - ov99_021D37E0(param0, param1); -} - -static void ov99_021D372C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1, int param2) -{ - GF_ASSERT(param1->unk_11C == 0); - GF_ASSERT(NELEMS(Unk_ov99_021D4C84) > param2); - - param1->unk_11C = 1; - param1->unk_11D = 0; - param1->unk_11E = 0; - param1->unk_11F = 31; - - ManagedSprite_SetPositionXYWithSubscreenOffset(param0->unk_10E0[4], Unk_ov99_021D4C84[param2].unk_00, Unk_ov99_021D4C84[param2].unk_02, ((192 + 80) << FX32_SHIFT)); - ManagedSprite_SetDrawFlag(param0->unk_10E0[4], 1); - ManagedSprite_SetDrawFlag(param0->unk_10E0[3], 0); - - G2S_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, param1->unk_11E, param1->unk_11F); - G2_SetBlendAlpha(0, GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ, param1->unk_11F, param1->unk_11E); -} - -static void ov99_021D37E0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1) -{ - s16 v0, v1; - - if (param1->unk_11C == 0) { - return; - } - - if (param1->unk_11D == 0) { - param1->unk_11E += 3; - param1->unk_11F -= 3; - - if (param1->unk_11E > 31) { - param1->unk_11E = 31; - } - - if (param1->unk_11F < 0) { - param1->unk_11F = 0; - } - - G2S_ChangeBlendAlpha(param1->unk_11E, param1->unk_11F); - - ManagedSprite_OffsetPositionFxXY(param0->unk_10E0[4], -0x6000, 0xd000); - Sprite_GetPositionXYWithSubscreenOffset2(param0->unk_10E0[4], &v0, &v1, ((192 + 80) << FX32_SHIFT)); - - if (v1 > 192 + 32) { - ManagedSprite_SetDrawFlag(param0->unk_10E0[4], 0); - ManagedSprite_SetDrawFlag(param0->unk_10E0[3], 1); - ManagedSprite_SetPositionXYWithSubscreenOffset(param0->unk_10E0[3], v0, -32, ((192 + 80) << FX32_SHIFT)); - param1->unk_11D = 1; - } - } else { - param1->unk_11F += 3; - param1->unk_11E -= 3; - - if (param1->unk_11F > 31) { - param1->unk_11F = 31; - } - - if (param1->unk_11E < 0) { - param1->unk_11E = 0; - } - - G2_ChangeBlendAlpha(param1->unk_11E, param1->unk_11F); - - ManagedSprite_OffsetPositionFxXY(param0->unk_10E0[3], -0x6000, 0xd000); - Sprite_GetPositionXYWithSubscreenOffset2(param0->unk_10E0[3], &v0, &v1, ((192 + 80) << FX32_SHIFT)); - - if (v1 > 192 + 32) { - ManagedSprite_SetDrawFlag(param0->unk_10E0[3], 0); - param1->unk_11D = 0; - param1->unk_11C = 0; - } - } -} - -static void ov99_021D3930(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D340C *param1) -{ - int v0, v1; - int v2, v3, v4; - u16 *v5, *v6; - - switch (param1->unk_114) { - case 0: - if (param0->unk_10FC < 7620) { - return; - } - - if (param1->unk_108 >= 8) { - return; - } - - if (param1->unk_118 > 0 * (param1->unk_108 + 1)) { - param1->unk_114++; - } - break; - case 1: - v2 = param1->unk_108; - param1->unk_10C += 0x400; - - if (param1->unk_10C >= (16 << 8)) { - v3 = 16; - param1->unk_10C = 0; - param1->unk_108++; - param1->unk_114 = 0; - } else { - v3 = param1->unk_10C >> 8; - } - - v4 = v2 + 1; - - if (v4 >= 8) { - v4 = 8 - 1; - } - - v5 = PaletteData_GetFadedBuffer(param0->unk_0C, 0); - v6 = PaletteData_GetFadedBuffer(param0->unk_0C, 1); - - for (v1 = 0; v1 < 16; v1++) { - BlendPalette(¶m1->unk_08[v2][v1], &v5[v1 + 16 * 1], 1, v3, param1->unk_08[v4][v1]); - BlendPalette(¶m1->unk_08[v2][v1], &v6[v1 + 16 * 1], 1, v3, param1->unk_08[v4][v1]); - } - break; - } - - param1->unk_118++; -} diff --git a/src/overlay099/ov99_021D3A40.c b/src/overlay099/ov99_021D3A40.c deleted file mode 100644 index d875c148347..00000000000 --- a/src/overlay099/ov99_021D3A40.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "overlay099/ov99_021D3A40.h" - -#include -#include - -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" -#include "overlay099/struct_ov99_021D3B2C.h" - -#include "brightness_controller.h" - -BOOL ov99_021D3A40(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D3B2C *v0 = ¶m1->unk_08_val4; - - switch (param1->unk_00) { - case 0: - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - if (v0->unk_00 > ((4815 - 1830 - 30 * (7 - 1)) / 7)) { - BrightnessController_StartTransition(32, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - v0->unk_00 = 0; - param1->unk_00++; - } - break; - case 2: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - if (param0->unk_1105 < 7) { - param1->unk_00 = 3; - } else { - param1->unk_00 = 4; - } - } - break; - case 3: - param1->unk_04++; - - if (param1->unk_04 > 30) { - param1->unk_04 = 0; - ov99_021D439C(param0, param0->unk_1105, 3, 0); - param0->unk_1105++; - BrightnessController_StartTransition(32, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00 = 1; - } - break; - case 4: - if (param0->unk_10FC >= 4815) { - return 1; - } - break; - } - - v0->unk_00++; - return 0; -} - -BOOL ov99_021D3B2C(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D3B2C *v0 = ¶m1->unk_08_val4; - - switch (param1->unk_00) { - case 0: - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - if (v0->unk_00 > ((6960 - 6000 - 30 * (10 - 7 - 1)) / (10 - 7))) { - BrightnessController_StartTransition(32, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - v0->unk_00 = 0; - param1->unk_00++; - } - break; - case 2: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - if (param0->unk_1105 < 10) { - param1->unk_00 = 3; - } else { - param1->unk_00 = 4; - } - } - break; - case 3: - param1->unk_04++; - - if (param1->unk_04 > 30) { - param1->unk_04 = 0; - ov99_021D439C(param0, param0->unk_1105, 3, 0); - param0->unk_1105++; - BrightnessController_StartTransition(32, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00 = 1; - } - break; - case 4: - if (param0->unk_10FC >= 4815) { - return 1; - } - break; - } - - v0->unk_00++; - return 0; -} diff --git a/src/overlay099/ov99_021D3C18.c b/src/overlay099/ov99_021D3C18.c deleted file mode 100644 index f4326925246..00000000000 --- a/src/overlay099/ov99_021D3C18.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "overlay099/ov99_021D3C18.h" - -#include -#include - -#include "overlay099/ov99_021D4134.h" -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" -#include "overlay099/struct_ov99_021D3C18.h" - -#include "bg_window.h" -#include "brightness_controller.h" - -static void ov99_021D3CF8(UnkStruct_ov99_021D3C18 *param0, u32 param1); -static BOOL ov99_021D3D50(UnkStruct_ov99_021D3C18 *param0); - -BOOL ov99_021D3C18(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D3C18 *v0 = ¶m1->unk_08_val5; - - switch (param1->unk_00) { - case 0: - BrightnessController_StartTransition(24, 0, -16, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00++; - break; - case 1: - v0->unk_00++; - - if (v0->unk_00 > ((8280 - 7980 - (4 * 16) * (4 - 1)) / 4)) { - v0->unk_00 = 0; - param1->unk_00++; - } - break; - case 2: - if (v0->unk_04 >= 4 - 1) { - BrightnessController_StartTransition(32, -16, 0, (GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD), BRIGHTNESS_BOTH_SCREENS); - param1->unk_00 = 4; - } else { - if (v0->unk_04 & 1) { - ov99_021D439C( - param0, param0->unk_1105, 2, 1); - ov99_021D3CF8(v0, (GX_BLEND_PLANEMASK_BG3)); - } else { - ov99_021D439C( - param0, param0->unk_1105, 3, 1); - ov99_021D3CF8(v0, (GX_BLEND_PLANEMASK_BG2)); - } - - param0->unk_1105++; - v0->unk_04++; - param1->unk_00 = 3; - } - break; - case 3: - if (ov99_021D3D50(v0) == 1) { - param1->unk_00 = 1; - } - break; - case 4: - if (BrightnessController_IsTransitionComplete(BRIGHTNESS_BOTH_SCREENS) == TRUE) { - return 1; - } - break; - } - - return 0; -} - -static void ov99_021D3CF8(UnkStruct_ov99_021D3C18 *param0, u32 param1) -{ - param0->unk_08 = param1; - param0->unk_05 = 16; - param0->unk_06 = 0; - - if (param1 == (GX_BLEND_PLANEMASK_BG2)) { - G2_SetBlendAlpha((GX_BLEND_PLANEMASK_BG2), (GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BD), param0->unk_05, param0->unk_06); - Bg_ToggleLayer(BG_LAYER_MAIN_3, 1); - } else { - G2_SetBlendAlpha((GX_BLEND_PLANEMASK_BG3), (GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BD), param0->unk_05, param0->unk_06); - Bg_ToggleLayer(BG_LAYER_MAIN_2, 1); - } -} - -static BOOL ov99_021D3D50(UnkStruct_ov99_021D3C18 *param0) -{ - param0->unk_05 -= 1; - - if (param0->unk_05 < 16) { - param0->unk_06 += 1; - } - - if (param0->unk_05 < 0) { - param0->unk_05 = 0; - } - - if (param0->unk_06 > 16) { - param0->unk_06 = 16; - } - - G2_ChangeBlendAlpha(param0->unk_05, param0->unk_06); - - if ((param0->unk_05 == 0) && (param0->unk_06 == 16)) { - if (param0->unk_08 == (GX_BLEND_PLANEMASK_BG2)) { - Bg_ToggleLayer(BG_LAYER_MAIN_2, 0); - Bg_SetPriority(BG_LAYER_MAIN_2, 3); - Bg_SetPriority(BG_LAYER_MAIN_3, 2); - } else { - Bg_ToggleLayer(BG_LAYER_MAIN_3, 0); - Bg_SetPriority(BG_LAYER_MAIN_2, 2); - Bg_SetPriority(BG_LAYER_MAIN_3, 3); - } - - return 1; - } - - return 0; -} diff --git a/src/overlay099/ov99_021D3DE0.c b/src/overlay099/ov99_021D3DE0.c deleted file mode 100644 index b77cd9654fc..00000000000 --- a/src/overlay099/ov99_021D3DE0.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "overlay099/ov99_021D3DE0.h" - -#include -#include - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D3A40.h" -#include "overlay099/struct_ov99_021D3DE0.h" - -#include "screen_fade.h" -#include "system.h" - -BOOL ov99_021D3DE0(UnkStruct_ov99_021D2CB0 *param0, UnkStruct_ov99_021D3A40 *param1) -{ - UnkStruct_ov99_021D3DE0 *v0 = ¶m1->unk_08_val6; - - switch (param1->unk_00) { - case 0: - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 30, 1, HEAP_ID_75); - param1->unk_00++; - break; - case 1: - if (IsScreenFadeDone() == TRUE) { - if ((param0->unk_10FC > 10080) || (gSystem.pressedKeys & PAD_BUTTON_A) || (gSystem.pressedKeys & PAD_BUTTON_START)) { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 45, 1, HEAP_ID_75); - param1->unk_00++; - } - } - break; - case 2: - if (IsScreenFadeDone() == TRUE) { - return 1; - } - break; - } - - return 0; -} diff --git a/src/overlay099/ov99_021D3E78.c b/src/overlay099/ov99_021D3E78.c deleted file mode 100644 index a9de5dd7f7d..00000000000 --- a/src/overlay099/ov99_021D3E78.c +++ /dev/null @@ -1,411 +0,0 @@ -#include "overlay099/ov99_021D3E78.h" - -#include -#include - -#include "overlay099/struct_ov99_021D3E78_decl.h" - -#include "bg_window.h" -#include "font.h" -#include "heap.h" -#include "message.h" -#include "string_gf.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "text.h" - -static const struct { - u16 unk_00; - u16 unk_02; - u16 unk_04; -} Unk_ov99_021D4CE4[] = { - { 0x0, 0x0, 0x1 }, - { 0x1, 0x10, 0x1 }, - { 0x2, 0x92, 0x0 }, - { 0x3, 0xA7, 0x0 }, - { 0x4, 0x129, 0x0 }, - { 0x5, 0x13E, 0x0 }, - { 0x6, 0x1C0, 0x0 }, - { 0x7, 0x1D5, 0x0 }, - { 0x8, 0x20D, 0x0 }, - { 0x9, 0x222, 0x0 }, - { 0xA, 0x25A, 0x0 }, - { 0xB, 0x26F, 0x0 }, - { 0xC, 0x2A7, 0x0 }, - { 0xD, 0x2BC, 0x0 }, - { 0xE, 0x2D1, 0x0 }, - { 0xF, 0x2E6, 0x0 }, - { 0x10, 0x2FB, 0x0 }, - { 0x11, 0x310, 0x0 }, - { 0x12, 0x325, 0x0 }, - { 0x13, 0x33A, 0x0 }, - { 0x14, 0x34F, 0x0 }, - { 0x15, 0x364, 0x0 }, - { 0x16, 0x379, 0x0 }, - { 0x17, 0x38E, 0x0 }, - { 0x18, 0x3A3, 0x0 }, - { 0x19, 0x3B8, 0x0 }, - { 0x1A, 0x3CD, 0x0 }, - { 0x1B, 0x3E2, 0x0 }, - { 0x1C, 0x464, 0x0 }, - { 0x1D, 0x474, 0x0 }, - { 0x1E, 0x484, 0x0 }, - { 0x1F, 0x499, 0x0 }, - { 0x20, 0x4AE, 0x0 }, - { 0x21, 0x4C3, 0x0 }, - { 0x22, 0x4D8, 0x0 }, - { 0x23, 0x4ED, 0x0 }, - { 0x24, 0x502, 0x0 }, - { 0x25, 0x517, 0x0 }, - { 0x26, 0x52C, 0x0 }, - { 0x27, 0x541, 0x0 }, - { 0x28, 0x556, 0x0 }, - { 0x29, 0x56B, 0x0 }, - { 0x2A, 0x580, 0x0 }, - { 0x2B, 0x595, 0x0 }, - { 0x2C, 0x5CD, 0x0 }, - { 0x2D, 0x5E2, 0x0 }, - { 0x2E, 0x61A, 0x0 }, - { 0x2F, 0x62F, 0x0 }, - { 0x30, 0x6B1, 0x0 }, - { 0x31, 0x6C6, 0x0 }, - { 0x32, 0x6DB, 0x0 }, - { 0x33, 0x6F0, 0x0 }, - { 0x34, 0x705, 0x0 }, - { 0x35, 0x73D, 0x0 }, - { 0x36, 0x752, 0x0 }, - { 0x37, 0x78A, 0x0 }, - { 0x38, 0x79F, 0x0 }, - { 0x39, 0x821, 0x0 }, - { 0x3A, 0x836, 0x0 }, - { 0x3B, 0x84B, 0x0 }, - { 0x3C, 0x860, 0x0 }, - { 0x3D, 0x875, 0x0 }, - { 0x3E, 0x88A, 0x0 }, - { 0x3F, 0x89F, 0x0 }, - { 0x40, 0x8B4, 0x0 }, - { 0x41, 0x8C9, 0x0 }, - { 0x42, 0x8DE, 0x0 }, - { 0x43, 0x8F3, 0x0 }, - { 0x44, 0x908, 0x0 }, - { 0x45, 0x940, 0x0 }, - { 0x46, 0x955, 0x0 }, - { 0x47, 0x96A, 0x0 }, - { 0x48, 0x97F, 0x0 }, - { 0x49, 0x994, 0x0 }, - { 0x4A, 0x9A9, 0x0 }, - { 0x4B, 0x9E1, 0x0 }, - { 0x4C, 0x9F6, 0x0 }, - { 0x4D, 0xA0B, 0x0 }, - { 0x4E, 0xA20, 0x0 }, - { 0x4F, 0xA35, 0x0 }, - { 0x50, 0xA6D, 0x0 }, - { 0x51, 0xA82, 0x0 }, - { 0x52, 0xA97, 0x0 }, - { 0x53, 0xAAC, 0x0 }, - { 0x54, 0xAC1, 0x0 }, - { 0x55, 0xAD6, 0x0 }, - { 0x56, 0xAEB, 0x0 }, - { 0x57, 0xB00, 0x0 }, - { 0x58, 0xB38, 0x0 }, - { 0x59, 0xB4D, 0x0 }, - { 0x5A, 0xB62, 0x0 }, - { 0x5B, 0xB9A, 0x0 }, - { 0x5C, 0xBAF, 0x0 }, - { 0x5D, 0xBC4, 0x0 }, - { 0x5E, 0xBD9, 0x0 }, - { 0x5F, 0xBEE, 0x0 }, - { 0x60, 0xC70, 0x0 }, - { 0x61, 0xC85, 0x0 }, - { 0x62, 0xC9A, 0x0 }, - { 0x63, 0xCAF, 0x0 }, - { 0x64, 0xCC4, 0x0 }, - { 0x65, 0xCFC, 0x0 }, - { 0x66, 0xD11, 0x0 }, - { 0x67, 0xD26, 0x0 }, - { 0x68, 0xD3B, 0x0 }, - { 0x69, 0xD50, 0x0 }, - { 0x6A, 0xD65, 0x0 }, - { 0x6B, 0xD7A, 0x0 }, - { 0x6C, 0xD8F, 0x0 }, - { 0x6D, 0xDC7, 0x0 }, - { 0x6E, 0xDDC, 0x0 }, - { 0x6F, 0xE5E, 0x0 }, - { 0x70, 0xE7E, 0x0 }, - { 0x71, 0xE93, 0x0 }, - { 0x72, 0xEA8, 0x0 }, - { 0x73, 0xEC8, 0x0 }, - { 0x74, 0xEDD, 0x0 }, - { 0x75, 0xEF2, 0x0 }, - { 0x76, 0xF07, 0x0 }, - { 0x77, 0xF89, 0x0 }, - { 0x78, 0xF9E, 0x0 }, - { 0x79, 0xFB3, 0x0 }, - { 0x7A, 0xFC8, 0x0 }, - { 0x7B, 0xFDD, 0x0 }, - { 0x7C, 0xFF2, 0x0 }, - { 0x7D, 0x102A, 0x0 }, - { 0x7E, 0x103F, 0x0 }, - { 0x7F, 0x10C1, 0x0 }, - { 0x80, 0x10D6, 0x0 }, - { 0x81, 0x10EB, 0x0 }, - { 0x82, 0x1100, 0x0 }, - { 0x83, 0x1138, 0x0 }, - { 0x84, 0x114D, 0x0 }, - { 0x85, 0x1185, 0x0 }, - { 0x86, 0x119A, 0x0 }, - { 0x87, 0x11AF, 0x0 }, - { 0x88, 0x11C4, 0x0 }, - { 0x89, 0x11FC, 0x0 }, - { 0x8A, 0x1211, 0x0 }, - { 0x8B, 0x1226, 0x0 }, - { 0x8C, 0x123B, 0x0 }, - { 0x8D, 0x12BD, 0x0 }, - { 0x8E, 0x12D2, 0x0 }, - { 0x8F, 0x12E7, 0x0 }, - { 0x90, 0x12FC, 0x0 }, - { 0x91, 0x1334, 0x0 }, - { 0x92, 0x1349, 0x0 }, - { 0x93, 0x135E, 0x0 }, - { 0x94, 0x1373, 0x0 }, - { 0x95, 0x1388, 0x0 }, - { 0x96, 0x139D, 0x0 }, - { 0x97, 0x13B2, 0x0 }, - { 0x98, 0x13C7, 0x0 }, - { 0x99, 0x13DC, 0x0 }, - { 0x9A, 0x13F1, 0x0 }, - { 0x9B, 0x1406, 0x0 }, - { 0x9C, 0x141B, 0x0 }, - { 0x9D, 0x1430, 0x0 }, - { 0x9E, 0x1445, 0x0 }, - { 0x9F, 0x145A, 0x0 }, - { 0xA0, 0x1492, 0x0 }, - { 0xA1, 0x14A7, 0x0 }, - { 0xA2, 0x14BC, 0x0 }, - { 0xA3, 0x14D1, 0x0 }, - { 0xA4, 0x14E6, 0x0 }, - { 0xA5, 0x14FB, 0x0 }, - { 0xA6, 0x1510, 0x0 }, - { 0xA7, 0x1525, 0x0 }, - { 0xA8, 0x153A, 0x0 }, - { 0xA9, 0x15BC, 0x0 }, - { 0xAA, 0x15D1, 0x0 }, - { 0xAB, 0x15E6, 0x0 }, - { 0xAC, 0x15FB, 0x0 }, - { 0xAD, 0x1610, 0x0 }, - { 0xAE, 0x1625, 0x0 }, - { 0xAF, 0x163A, 0x0 }, - { 0xB0, 0x164F, 0x0 }, - { 0xB1, 0x1664, 0x0 }, - { 0xB2, 0x1679, 0x0 }, - { 0xB3, 0x168E, 0x0 }, - { 0xB4, 0x16A3, 0x0 }, - { 0xB5, 0x16B8, 0x0 }, - { 0xB6, 0x16CD, 0x0 }, - { 0xB7, 0x16E2, 0x0 }, - { 0xB8, 0x16F7, 0x0 }, - { 0xB9, 0x170C, 0x0 }, - { 0xBA, 0x1721, 0x0 }, - { 0xBB, 0x1736, 0x0 }, - { 0xBC, 0x174B, 0x0 }, - { 0xBD, 0x1760, 0x0 }, - { 0xBE, 0x1775, 0x0 }, - { 0xBF, 0x178A, 0x0 }, - { 0xC0, 0x179F, 0x0 }, - { 0xC1, 0x17B4, 0x0 }, - { 0xC2, 0x17C9, 0x0 }, - { 0xC3, 0x17DE, 0x0 }, - { 0xC4, 0x17F3, 0x0 }, - { 0xC5, 0x1808, 0x0 }, - { 0xC6, 0x181D, 0x0 }, - { 0xC7, 0x1832, 0x0 }, - { 0xC8, 0x1847, 0x0 }, - { 0xC9, 0x185C, 0x0 }, - { 0xCA, 0x1871, 0x0 }, - { 0xCB, 0x1886, 0x0 }, - { 0xCC, 0x189B, 0x0 }, - { 0xCD, 0x18B0, 0x0 }, - { 0xCE, 0x18C5, 0x0 }, - { 0xCF, 0x18DA, 0x0 }, - { 0xD0, 0x18EF, 0x0 }, - { 0xD1, 0x1904, 0x0 }, - { 0xD2, 0x1919, 0x0 }, - { 0xD3, 0x192E, 0x0 }, - { 0xD4, 0x19B0, 0x0 }, - { 0xD5, 0x19C5, 0x0 }, - { 0xD6, 0x19DA, 0x0 }, - { 0xD7, 0x19EF, 0x0 }, - { 0xD8, 0x1A04, 0x0 }, - { 0xD9, 0x1A86, 0x0 }, - { 0xDA, 0x1A9B, 0x0 }, - { 0xDB, 0x1AB0, 0x0 }, - { 0xDC, 0x1AC5, 0x0 }, - { 0xDD, 0x1B47, 0x0 }, - { 0xDE, 0x1B5C, 0x0 }, - { 0xDF, 0x1B71, 0x0 }, - { 0xE0, 0x1B86, 0x0 }, - { 0xE1, 0x1C08, 0x0 }, - { 0xE2, 0x1C1D, 0x0 }, - { 0xE3, 0x1C32, 0x0 }, - { 0xE4, 0x1C47, 0x0 }, - { 0xE5, 0x1C5C, 0x0 }, - { 0xE6, 0x1CDE, 0x0 }, - { 0xE7, 0x1CF3, 0x0 }, - { 0xE8, 0x1D2B, 0x0 }, - { 0xE9, 0x1D40, 0x0 }, - { 0xEA, 0x1D78, 0x0 }, - { 0xEB, 0x1D8D, 0x0 }, - { 0xEC, 0x1D9D, 0x0 } -}; - -struct UnkStruct_ov99_021D3E78_t { - int unk_00; - int unk_04; - int unk_08; - int unk_0C; - int unk_10; - BOOL unk_14; - BOOL unk_18; - int unk_1C; - BgConfig *unk_20; - Window *unk_24; - Window *unk_28; - MessageLoader *unk_2C; - String *unk_30; - SysTask *unk_34; -}; - -static void ov99_021D4104(SysTask *param0, void *param1); - -UnkStruct_ov99_021D3E78 *ov99_021D3E78(BgConfig *param0, int param1, int param2, int param3, MessageLoader *param4) -{ - UnkStruct_ov99_021D3E78 *v0 = Heap_Alloc(HEAP_ID_75, sizeof(UnkStruct_ov99_021D3E78)); - - if (v0) { - v0->unk_20 = param0; - v0->unk_00 = param1; - v0->unk_04 = param1 + 192; - v0->unk_08 = param2; - v0->unk_2C = param4; - v0->unk_0C = 0; - v0->unk_10 = 0; - v0->unk_14 = 0; - v0->unk_18 = 0; - v0->unk_1C = 0; - v0->unk_30 = String_Init(256, HEAP_ID_75); - v0->unk_24 = Window_New(HEAP_ID_75, 1); - - Window_Add(param0, v0->unk_24, param2, 0, 0, 32, 32, param3, 0); - Window_FillTilemap(v0->unk_24, 0x0); - Window_PutToTilemap(v0->unk_24); - Window_CopyToVRAM(v0->unk_24); - - v0->unk_28 = Window_New(HEAP_ID_75, 1); - Window_Add(param0, v0->unk_28, param2, 0, 0, 32, 2, param3, 0); - v0->unk_34 = SysTask_ExecuteAfterVBlank(ov99_021D4104, v0, 0); - } - - return v0; -} - -void ov99_021D3F38(UnkStruct_ov99_021D3E78 *param0) -{ - if (param0->unk_34) { - SysTask_Done(param0->unk_34); - } - - String_Free(param0->unk_30); - Window_Remove(param0->unk_24); - Window_Remove(param0->unk_28); - Heap_Free(param0->unk_24); - Heap_Free(param0->unk_28); - Heap_Free(param0); -} - -BOOL ov99_021D3F6C(UnkStruct_ov99_021D3E78 *param0, int param1) -{ - if (param0->unk_1C == 2) { - return 1; - } else { - int v0 = param0->unk_04 + param1; - - if (param0->unk_1C == 0) { - if (v0 >= Unk_ov99_021D4CE4[param0->unk_0C].unk_02) { - int v1, v2; - - MessageLoader_GetString(param0->unk_2C, Unk_ov99_021D4CE4[param0->unk_0C].unk_00, param0->unk_30); - - if (Unk_ov99_021D4CE4[param0->unk_0C].unk_04) { - v1 = (256 - Font_CalcStringWidth(FONT_SYSTEM, param0->unk_30, 0)) / 2; - } else { - v1 = 32; - } - - v2 = Unk_ov99_021D4CE4[param0->unk_0C].unk_02 & 0xff; - Text_AddPrinterWithParamsAndColor(param0->unk_24, FONT_SYSTEM, param0->unk_30, v1, v2, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); - - if (v2 > (256 - 16)) { - Window_FillTilemap(param0->unk_28, 0x0); - Text_AddPrinterWithParamsAndColor(param0->unk_28, FONT_SYSTEM, param0->unk_30, v1, 0, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); - - v2 = 16 - (v2 - (256 - 16)); - Window_BlitBitmapRect(param0->unk_24, param0->unk_28->pixels, 0, v2, param0->unk_28->width * 8, param0->unk_28->height * 8, 0, 0, 32 * 8, (16 - v2)); - } - - param0->unk_18 = 1; - - if (++(param0->unk_0C) >= (NELEMS(Unk_ov99_021D4CE4) - 1)) { - param0->unk_1C = 1; - } - } - } - - param0->unk_04 = v0; - - if (param0->unk_00 > (Unk_ov99_021D4CE4[param0->unk_10].unk_02 + 16)) { - int v3 = Unk_ov99_021D4CE4[param0->unk_10].unk_02 & 0xff; - - if (v3 <= (256 - 16)) { - Window_FillRectWithColor(param0->unk_24, 0x0, 0, v3, 32 * 8, 16); - } else { - int v4, v5; - - v4 = 16 - (v3 - (256 - 16)); - v5 = 16 - v4; - - Window_FillRectWithColor(param0->unk_24, 0x0, 0, v3, 32 * 8, v4); - Window_FillRectWithColor(param0->unk_24, 0x0, 0, 0, 32 * 8, v5); - } - - param0->unk_18 = 1; - - if (++(param0->unk_10) >= NELEMS(Unk_ov99_021D4CE4)) { - param0->unk_1C = 2; - } - } - - param0->unk_00 += param1; - - return 0; - } -} - -static void ov99_021D4104(SysTask *param0, void *param1) -{ - UnkStruct_ov99_021D3E78 *v0 = param1; - - if (v0->unk_18) { - Window_LoadTiles(v0->unk_24); - v0->unk_18 = 0; - } - - { - int v1 = v0->unk_00 & 255; - Bg_SetOffset(v0->unk_20, v0->unk_08, 3, v1); - } -} - -int ov99_021D4130(void) -{ - return Unk_ov99_021D4CE4[NELEMS(Unk_ov99_021D4CE4) - 1].unk_00; -} diff --git a/src/overlay099/ov99_021D4134.c b/src/overlay099/ov99_021D4134.c deleted file mode 100644 index 29cbcce9615..00000000000 --- a/src/overlay099/ov99_021D4134.c +++ /dev/null @@ -1,271 +0,0 @@ -#include "overlay099/ov99_021D4134.h" - -#include -#include - -#include "overlay099/struct_ov99_021D2CB0.h" -#include "overlay099/struct_ov99_021D5434.h" - -#include "bg_window.h" -#include "easy3d_object.h" -#include "graphics.h" -#include "heap.h" -#include "math_util.h" -#include "palette.h" -#include "sprite.h" -#include "sprite_system.h" - -typedef struct { - u16 unk_00; - u16 unk_02; - u16 unk_04; - s16 unk_06; - s16 unk_08; - u16 unk_0A[3]; -} UnkStruct_ov99_021D5394; - -static const UnkStruct_ov99_021D5434 Unk_ov99_021D5434[][2] = { - { - { 0xE, 0x3AC, 0x65800, 0x1C800, -217088, 0x2B800, 0x7000, 0x47000 }, - { 0xE, 0x618, 0x9B000, 0x1C800, -217088, 0x2B800, 0x7000, 0x47000 }, - }, - { - { 0xE, 0x1B8, 0x65800, 0x1C800, -217088, 0x2B800, 0x7000, 0x47000 }, - { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, - }, - { - { 0x10, 0x3AC, 0x65800, 0x1C800, -217088, 0x2B800, 0x7000, 0x47000 }, - { 0xE, 0x618, 0x9B000, 0x1C800, -217088, 0x2B800, 0x7000, 0x47000 }, - }, -}; - -static const UnkStruct_ov99_021D5394 Unk_ov99_021D5394[] = { - { 0x26, 0x25, 0x30, 0x0, 0x0 }, - { 0x27, 0x25, 0x31, -32, -48 }, - { 0x28, 0x25, 0x32, -16, -30 }, - { 0x29, 0x25, 0x33, -42, -2 }, - { 0x2A, 0x25, 0x34, -8, -20 }, - { 0x2B, 0x25, 0x35, -50, -16 }, - { 0x2C, 0x25, 0x36, -40, -34 }, - { 0x2D, 0x25, 0x37, -16, -1 }, - { 0x2E, 0x25, 0x38, -44, -15 }, - { 0x2F, 0x25, 0x39, -30, -30 } -}; - -static const UnkStruct_ov99_021D5394 Unk_ov99_021D52F4[] = { - { 0x3A, 0x25, 0x44, 0x0, 0x0 }, - { 0x3B, 0x25, 0x45, -32, -48 }, - { 0x3C, 0x25, 0x46, -16, -30 }, - { 0x3D, 0x25, 0x47, -42, -2 }, - { 0x3E, 0x25, 0x48, -8, -20 }, - { 0x3F, 0x25, 0x49, -50, -16 }, - { 0x40, 0x25, 0x4A, -40, -34 }, - { 0x41, 0x25, 0x4B, -16, -1 }, - { 0x42, 0x25, 0x4C, -44, -15 }, - { 0x43, 0x25, 0x4D, -30, -30 } -}; - -static const UnkStruct_ov99_021D5394 Unk_ov99_021D5274[] = { - { 0x57, 0x56, 0x5B, 0x0, 0x0 }, - { 0x58, 0x56, 0x5C, 0x0, 0x0 }, - { 0x59, 0x56, 0x5D, 0x0, 0x0 }, - { 0x5A, 0x56, 0x5E, 0x0, 0x0 } -}; - -static const UnkStruct_ov99_021D5394 Unk_ov99_021D52B4[] = { - { 0x5F, 0x56, 0x63, 0x0, 0x0 }, - { 0x60, 0x56, 0x64, 0x0, 0x0 }, - { 0x61, 0x56, 0x65, 0x0, 0x0 }, - { 0x62, 0x56, 0x66, 0x0, 0x0 } -}; - -void ov99_021D4134(UnkStruct_ov99_021D2CB0 *param0, int param1) -{ - int v0; - - for (v0 = 0; v0 < 2; v0++) { - param0->unk_F6C.unk_00[v0] = Unk_ov99_021D5434[param1][v0]; - } -} - -void ov99_021D4170(UnkStruct_ov99_021D2CB0 *param0) -{ - int v0, v1; - UnkStruct_ov99_021D5434 *v2; - - for (v1 = 0; v1 < param0->unk_1104; v1++) { - v2 = ¶m0->unk_F6C.unk_00[v1]; - GF_ASSERT(v2->unk_00 <= 16); - - for (v0 = 0; v0 < v2->unk_00; v0++) { - Easy3DObject_SetPosition(¶m0->unk_6C[v1][v0], v2->unk_04 - v2->unk_08 * v0, v2->unk_0C - v2->unk_10 * v0, v2->unk_14 - v2->unk_18 * v0); - Easy3DObject_SetScale(¶m0->unk_6C[v1][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[v1][v0], 1); - } - - for (; v0 < 16; v0++) { - Easy3DObject_SetPosition(¶m0->unk_6C[v1][v0], 0, (-64 * FX32_ONE), (-50 * FX32_ONE)); - Easy3DObject_SetScale(¶m0->unk_6C[v1][v0], FX32_ONE, FX32_ONE, FX32_ONE); - Easy3DObject_SetVisible(¶m0->unk_6C[v1][v0], 0); - } - } -} - -BOOL ov99_021D425C(UnkStruct_ov99_021D2CB0 *param0, s32 param1) -{ - fx32 v0, v1, v2; - fx32 v3, v4, v5; - int v6, v7; - UnkStruct_ov99_021D5434 *v8; - BOOL v9 = 0; - - for (v6 = 0; v6 < param0->unk_1104; v6++) { - v8 = ¶m0->unk_F6C.unk_00[v6]; - v0 = v8->unk_08 * v8->unk_00 / v8->unk_02; - v1 = v8->unk_10 * v8->unk_00 / v8->unk_02; - v2 = v8->unk_18 * v8->unk_00 / v8->unk_02; - - for (v7 = 0; v7 < v8->unk_00; v7++) { - Easy3DObject_GetPosition(¶m0->unk_6C[v6][v7], &v3, &v4, &v5); - - if (v3 + v0 >= v8->unk_04) { - Easy3DObject_SetPosition(¶m0->unk_6C[v6][v7], v3 + v0 - v8->unk_08 * v8->unk_00, v4 + v1 - v8->unk_10 * v8->unk_00, v5 + v2 - v8->unk_18 * v8->unk_00); - - if ((param1 != -1) && (v6 == 0)) { - MI_CpuClear8(¶m0->unk_6C[v6][v7].renderObj, sizeof(NNSG3dRenderObj)); - NNS_G3dRenderObjInit( - ¶m0->unk_6C[v6][v7].renderObj, param0->unk_2C[param1].model); - } - - v9 = 1; - } else { - Easy3DObject_SetPosition(¶m0->unk_6C[v6][v7], v3 + v0, v4 + v1, v5 + v2); - } - - Easy3DObject_SetVisible(¶m0->unk_6C[v6][v7], 1); - } - } - - return v9; -} - -void ov99_021D439C(UnkStruct_ov99_021D2CB0 *param0, int param1, int param2, int param3) -{ - BgConfig *v0 = param0->unk_08; - NNSG2dPaletteData *v1; - void *v2; - const UnkStruct_ov99_021D5394 *v3; - - GF_ASSERT(NELEMS(Unk_ov99_021D5394) == NELEMS(Unk_ov99_021D52F4)); - GF_ASSERT(NELEMS(Unk_ov99_021D5274) == NELEMS(Unk_ov99_021D52B4)); - - switch (param3) { - case 0: - GF_ASSERT(NELEMS(Unk_ov99_021D5394) > param1); - - if (param0->unk_00->gender == 0) { - v3 = &Unk_ov99_021D5394[param1]; - } else { - v3 = &Unk_ov99_021D52F4[param1]; - } - break; - case 1: - GF_ASSERT(NELEMS(Unk_ov99_021D52F4) > param1); - - if (param0->unk_00->gender == 0) { - v3 = &Unk_ov99_021D5274[param1]; - } else { - v3 = &Unk_ov99_021D52B4[param1]; - } - break; - } - - v2 = Graphics_GetPlttDataFromOpenNARC(param0->unk_10F8, v3->unk_04, &v1, HEAP_ID_75); - - DC_FlushRange(v1->pRawData, v1->szByte); - GX_BeginLoadBGExtPltt(); - - if (param2 == 3) { - GX_LoadBGExtPltt(v1->pRawData, 0x6000, 0x2000); - } else { - GX_LoadBGExtPltt(v1->pRawData, 0x4000, 0x2000); - } - - GX_EndLoadBGExtPltt(); - - Heap_Free(v2); - PaletteData_FillBufferRange(param0->unk_0C, PLTTBUF_MAIN_BG, PLTTSEL_BOTH, 0x0, 0, 1); - PaletteData_FillBufferRange(param0->unk_0C, PLTTBUF_SUB_BG, PLTTSEL_BOTH, 0x0, 0, 1); - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_10F8, v3->unk_00, param0->unk_08, param2, 0, 0, 0, HEAP_ID_75); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_10F8, v3->unk_02, param0->unk_08, param2, 0, 0, 0, HEAP_ID_75); - Bg_SetOffset(v0, param2, 0, v3->unk_06); - Bg_SetOffset(v0, param2, 3, v3->unk_08); -} - -void ov99_021D44CC(UnkStruct_ov99_021D2CB0 *param0, ManagedSprite *param1) -{ - void *v0; - u32 v1; - NNSG2dImageProxy *v2; - - if (param0->unk_10F4 == NULL) { - return; - } - - if (param0->unk_1114.unk_04 == -1) { - if (param0->unk_1114.unk_00 > 0) { - param0->unk_1114.unk_00--; - } else { - v0 = G2_GetOBJCharPtr(); - v2 = Sprite_GetImageProxy(param1->sprite); - - if (param0->unk_00->gender == 0) { - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2)], (void *)((u32)v0 + 0x1d * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x20], (void *)((u32)v0 + 0x1e * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x40], (void *)((u32)v0 + 0x25 * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x60], (void *)((u32)v0 + 0x26 * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - } else { - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2)], (void *)((u32)v0 + 0x45 * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x20], (void *)((u32)v0 + 0x46 * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x40], (void *)((u32)v0 + 0x4d * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - MI_CpuCopy32(¶m0->unk_10F4[param0->unk_1114.unk_02 * ((0x20 * 8) / 2) + 0x60], (void *)((u32)v0 + 0x4e * 0x20 + v2->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20); - } - - if (param0->unk_1114.unk_02 == 0) { - if (param0->unk_1114.unk_06 % 3 == 0) { - if (LCRNG_Next() & 1) { - param0->unk_1114.unk_00 = LCRNG_Next() % 10; - param0->unk_1114.unk_06++; - } else { - param0->unk_1114.unk_00 = 40; - } - } else { - param0->unk_1114.unk_00 = 40; - param0->unk_1114.unk_06++; - } - } else { - param0->unk_1114.unk_00 = 1; - } - - param0->unk_1114.unk_02 ^= 1; - } - } - - if (ManagedSprite_IsAnimated(param1) == 0) { - if (param0->unk_1114.unk_04 != -1) { - param0->unk_1114.unk_04++; - - if ((param0->unk_1114.unk_04 > 16) && (LCRNG_Next() % 5 == 0)) { - v1 = 1; - param0->unk_1114.unk_04 = -1; - } else { - v1 = 0; - } - - ManagedSprite_SetAnim(param1, v1); - } else { - param0->unk_1114.unk_04 = 0; - ManagedSprite_SetAnim(param1, 0); - } - } -} diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index eba7d7bdc85..e99e3fae1b8 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -49,6 +49,7 @@ #include "battle/battle_main.h" #include "choose_starter/choose_starter_app.h" #include "cutscenes/boat_cutscene.h" +#include "cutscenes/end_credits/main.h" #include "cutscenes/hall_of_fame.h" #include "dw_warp/dw_warp.h" #include "field/field_system.h" @@ -66,7 +67,6 @@ #include "overlay088/struct_ov88_0223C370.h" #include "overlay092/ov92_021D0D80.h" #include "overlay095/ov95_02246C20.h" -#include "overlay099/ov99_021D0D80.h" #include "overlay101/ov101_021D0D80.h" #include "overlay111/ov111_021D0D80.h" #include "savedata/save_table.h" @@ -160,7 +160,7 @@ FS_EXTERN_OVERLAY(cutscenes); FS_EXTERN_OVERLAY(overlay94); FS_EXTERN_OVERLAY(overlay95); FS_EXTERN_OVERLAY(wifi_battle_tower); -FS_EXTERN_OVERLAY(overlay99); +FS_EXTERN_OVERLAY(end_credits); FS_EXTERN_OVERLAY(overlay101); FS_EXTERN_OVERLAY(frontier_records_app); FS_EXTERN_OVERLAY(overlay111); @@ -1409,18 +1409,18 @@ void *FieldTask_OpenPCHallOfFameScreen(FieldSystem *fieldSystem) return hallOfFame; } -void sub_0203E274(FieldSystem *fieldSystem, ClearGamePlayerInfo *param1) +void FieldSystem_StartEndCredits(FieldSystem *fieldSystem, ClearGamePlayerInfo *clearGamePlayerInfo) { - FS_EXTERN_OVERLAY(overlay99); + FS_EXTERN_OVERLAY(end_credits); - static const ApplicationManagerTemplate v0 = { - ov99_021D0D80, - ov99_021D1028, - ov99_021D11A8, - FS_OVERLAY_ID(overlay99) + static const ApplicationManagerTemplate template = { + EndCreditsApp_Init, + EndCreditsApp_Main, + EndCreditsApp_Exit, + FS_OVERLAY_ID(end_credits) }; - FieldSystem_StartChildProcess(fieldSystem, &v0, param1); + FieldSystem_StartChildProcess(fieldSystem, &template, clearGamePlayerInfo); } void FieldSystem_OpenMoveReminderMenu(FieldSystem *fieldSystem, MoveReminderData *moveReminderData)