diff --git a/assets/xml/interface/icon_item_vtx_static.xml b/assets/xml/interface/icon_item_vtx_static.xml
new file mode 100644
index 000000000..37ccb0063
--- /dev/null
+++ b/assets/xml/interface/icon_item_vtx_static.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_f40_obj.xml b/assets/xml/objects/object_f40_obj.xml
index 17e7210de..636a80682 100644
--- a/assets/xml/objects/object_f40_obj.xml
+++ b/assets/xml/objects/object_f40_obj.xml
@@ -1,17 +1,25 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hakugin_demo.xml b/assets/xml/objects/object_hakugin_demo.xml
index 24c7a2ba2..8c8b5837c 100644
--- a/assets/xml/objects/object_hakugin_demo.xml
+++ b/assets/xml/objects/object_hakugin_demo.xml
@@ -1,8 +1,9 @@
+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_moonend.xml b/assets/xml/objects/object_moonend.xml
index e677f9c3f..666e9e07c 100644
--- a/assets/xml/objects/object_moonend.xml
+++ b/assets/xml/objects/object_moonend.xml
@@ -1,6 +1,7 @@
-
+
+
@@ -19,7 +20,8 @@
-
+
+
diff --git a/assets/xml/objects/object_taisou.xml b/assets/xml/objects/object_taisou.xml
index 696285927..0143f2444 100644
--- a/assets/xml/objects/object_taisou.xml
+++ b/assets/xml/objects/object_taisou.xml
@@ -1,12 +1,13 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_fbdemo_wipe3.xml b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
new file mode 100644
index 000000000..fe4804689
--- /dev/null
+++ b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 518a11275..b361c9f65 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -1069,17 +1069,6 @@ u16 QuestHint_GetTatlTextId(PlayState* play);
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet);
-s32 func_800F3940(PlayState* play);
-// void func_800F39B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
-// void func_800F3A64(void);
-void func_800F3B2C(PlayState* play);
-// void func_800F3B68(void);
-// void func_800F3C44(void);
-// void func_800F3ED4(void);
-void func_800F40A0(GameState* gameState, Player* player);
-void func_800F415C(Actor* actor, Vec3f* arg1, s16 arg2);
-UNK_TYPE func_800F41E4(PlayState* play, ActorContext* actorCtx);
-
void func_800F4A10(PlayState* play);
void KaleidoSetup_Update(PlayState* play);
void KaleidoSetup_Init(PlayState* play);
@@ -1090,7 +1079,7 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset);
void Font_LoadMessageBoxEndIcon(Font* font, u16 icon);
void Font_LoadOrderedFont(Font* font);
// void func_800F5090(void);
-// void func_800F50D4(void);
+s32 Environment_ZBufValToFixedPoint(s32 zBufferVal);
void Environment_Init(PlayState* play, EnvironmentContext* envCtx, s32 arg2);
u32 func_800F5954(u8* param_1, u32 param_2, u32 param_3, u8 param_4, u8 param_5);
f32 Environment_LerpWeight(u16 max, u16 min, u16 val);
@@ -1724,22 +1713,23 @@ void SkinMatrix_SetYRotation(MtxF* mf, s16 a);
void SkinMatrix_MulYRotation(MtxF* mf, s16 a);
void SkinMatrix_SetZRotation(MtxF* mf, s16 a);
-void func_80140260(OSViMode* vimode);
-// void func_8014026C(OSViMode* param_1, UNK_TYPE1 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6, s32 param_7, s32 param_8, UNK_TYPE4 param_9, s32 param_10, s16 param_11, u32 param_12, UNK_TYPE4 param_13);
-// void func_80140730(void);
-// void func_80140810(void);
-void func_80140898(void* arg0);
-void func_80140900(void* arg0);
-// void func_8014090C(void);
-// void func_80140970(void);
-void func_80140CE0(void* arg0);
-void func_80140D04(void* arg0);
-void func_80140D10(void* arg0, Gfx** gfx, u32 arg2);
+void ViMode_LogPrint(OSViMode* vimode);
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust);
+void ViMode_Save(ViMode* viMode);
+void ViMode_Load(ViMode* viMode);
+void ViMode_Init(ViMode* viMode);
+void ViMode_Destroy(ViMode* viMode);
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures);
+void ViMode_Update(ViMode* viMode, Input* input);
+void VisCvg_Init(struct_801F8010* this);
+void VisCvg_Destroy(struct_801F8010* this);
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp);
void func_80140E80(Struct_80140E80* arg0);
void func_80140EA0(Struct_80140E80* arg0);
// void func_80140EAC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80141008(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
-void func_8014116C(Gfx** gfxP, u16* arg1, u16* arg2, s32 width, s32 height, s32 arg5);
+void func_8014116C(Gfx** gfxP, u16* arg1, u16* workBuffer, s32 width, s32 height, s32 arg5);
// void func_801411B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
// void func_80141200(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_8014151C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
@@ -2048,15 +2038,14 @@ void Mtx_SetTranslateScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, f32
void Mtx_SetRotationMtx(Mtx* mtx, s32 angle, f32 axisX, f32 axisY, f32 axisZ);
void Mtx_SetTranslationRotationScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, s32 angle, f32 axisX, f32 axisY, f32 axisZ,f32 translateX, f32 translateY, f32 translateZ);
-void func_80178750(void);
-void func_80178818(void);
-void func_80178978(void);
-// void func_801789D4(void);
-void* SysCfb_GetFbPtr(s32 index);
+void SysCfb_SetLoResMode(void);
+void SysCfb_SetHiResMode(void);
+void SysCfb_Init(void);
+void* SysCfb_GetFramebuffer(s32 index);
void* SysCfb_GetZBuffer(void);
-// UNK_TYPE4 func_80178A24(void);
-// void func_80178A34(void);
-s32 func_80178A94(s32 param_1, s32 param_2);
+void* SysCfb_GetWorkBuffer(void);
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y);
+s32 SysCfb_GetZBufferInt(s32 x, s32 y);
void CmpDma_LoadFile(uintptr_t segmentVrom, s32 id, void* dst, size_t size);
void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_WriteRGBA16Pixel(u16* buffer, u32 x, u32 y, u32 value);
@@ -2222,21 +2211,13 @@ void func_8018450C(PlayState* play, SkeletonInfo* skeleton, Mtx* mtx, OverrideKe
// void func_801853C8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80185460(void);
-// void func_801857C0(void);
-// char* func_801857D0(void);
-// void func_80185864(void);
-u32 func_80185908(void);
-UNK_TYPE func_80185968(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
-// void func_801859F0(void);
-// void func_80185A2C(void);
-// void func_80185B1C(void);
-// void func_80185BE4(void);
-// void func_80185C24(void);
-void SysFlashrom_ThreadEntry(s80185D40* param_1);
-void func_80185DDC(u8* arg0, u32 arg1, u32 arg2);
-s32 func_80185EC4(void);
-s32 func_80185F04(void);
-void func_80185F64(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
+s32 SysFlashrom_InitFlash(void);
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount);
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount);
+s32 SysFlashrom_IsBusy(void);
+s32 SysFlashrom_AwaitResult(void);
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount);
+
s32 func_80185F90(u32 param_1);
u32 osFlashGetAddr(u32 pageNum);
OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 pageSize, u8 relDuration, u32 start);
diff --git a/include/macros.h b/include/macros.h
index f2bcb07dd..25ccb3d37 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -7,9 +7,11 @@
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
+#define SCREEN_WIDTH_HIRES 640
+#define SCREEN_HEIGHT_HIRES 480
-#define SCREEN_WIDTH_HIGH_RES 576
-#define SCREEN_HEIGHT_HIGH_RES 454
+#define HIRES_BUFFER_WIDTH 576
+#define HIRES_BUFFER_HEIGHT 454
#define PROJECTED_TO_SCREEN_X(projectedPos, invW) ((projectedPos).x * (invW) * (SCREEN_WIDTH / 2) + (SCREEN_WIDTH / 2))
#define PROJECTED_TO_SCREEN_Y(projectedPos, invW) ((projectedPos).y * (invW) * (-SCREEN_HEIGHT / 2) + (SCREEN_HEIGHT / 2))
diff --git a/include/regs.h b/include/regs.h
index 56b31ed47..5dc82d38f 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -65,6 +65,13 @@ extern RegEditor* gRegEditor;
#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
#define R_ROOM_IMAGE_NODRAW_FLAGS SREG(25)
#define R_UPDATE_RATE SREG(30)
+#define R_VI_MODE_EDIT_STATE SREG(48)
+#define R_VI_MODE_EDIT_WIDTH SREG(49)
+#define R_VI_MODE_EDIT_HEIGHT SREG(50)
+#define R_VI_MODE_EDIT_ULY_ADJ SREG(51)
+#define R_VI_MODE_EDIT_LRY_ADJ SREG(52)
+#define R_VI_MODE_EDIT_ULX_ADJ SREG(53)
+#define R_VI_MODE_EDIT_LRX_ADJ SREG(54)
#define R_FB_FILTER_TYPE SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
#define R_FB_FILTER_A SREG(84)
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index 9fc49a6cb..a8e88e794 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -124,56 +124,44 @@ DECLARE_ROM_SEGMENT(d2_fine_pal_static)
DECLARE_ROM_SEGMENT(elf_message_field)
DECLARE_ROM_SEGMENT(elf_message_ydan)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI2)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_02)
-DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP)
DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_BS)
DECLARE_ROM_SEGMENT(Z2_LAST_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKASHITA)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_02)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_03)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_04)
-DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_00)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_01)
-DECLARE_ROM_SEGMENT(Z2_OMOYA)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_02)
-DECLARE_ROM_SEGMENT(Z2_BOWLING)
DECLARE_ROM_SEGMENT(Z2_BOWLING_room_00)
-DECLARE_ROM_SEGMENT(Z2_SONCHONOIE)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_00)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_01)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_02)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_03)
-DECLARE_ROM_SEGMENT(Z2_IKANA)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_00)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_01)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_02)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_03)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KAIZOKU)
DECLARE_ROM_SEGMENT(Z2_KAIZOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MILK_BAR)
DECLARE_ROM_SEGMENT(Z2_MILK_BAR_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_N)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_02)
@@ -187,10 +175,8 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_11)
-DECLARE_ROM_SEGMENT(Z2_TAKARAYA)
DECLARE_ROM_SEGMENT(Z2_TAKARAYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_R)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_02)
@@ -204,14 +190,11 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_11)
-DECLARE_ROM_SEGMENT(Z2_OKUJOU)
DECLARE_ROM_SEGMENT(Z2_OKUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_OPENINGDAN)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_00)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_01)
-DECLARE_ROM_SEGMENT(Z2_MITURIN)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_00)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_01)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_02)
@@ -226,10 +209,8 @@ DECLARE_ROM_SEGMENT(Z2_MITURIN_room_10)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_11)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_12)
-DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI)
DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_CASTLE)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_00)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_01)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_02)
@@ -241,16 +222,12 @@ DECLARE_ROM_SEGMENT(Z2_CASTLE_room_07)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_08)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_09)
-DECLARE_ROM_SEGMENT(Z2_DEKUTES)
DECLARE_ROM_SEGMENT(Z2_DEKUTES_room_00)
-DECLARE_ROM_SEGMENT(Z2_MITURIN_BS)
DECLARE_ROM_SEGMENT(Z2_MITURIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_02)
@@ -266,10 +243,8 @@ DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_11)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_12)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_13)
-DECLARE_ROM_SEGMENT(Z2_ROMANYMAE)
DECLARE_ROM_SEGMENT(Z2_ROMANYMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_PIRATE)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_00)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_01)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_02)
@@ -286,20 +261,16 @@ DECLARE_ROM_SEGMENT(Z2_PIRATE_room_12)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_13)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_14)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI_room_00)
-DECLARE_ROM_SEGMENT(Z2_SINKAI)
DECLARE_ROM_SEGMENT(Z2_SINKAI_room_00)
-DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_00)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_01)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_02)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_03)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_04)
-DECLARE_ROM_SEGMENT(Z2_KINSTA1)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_00)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_01)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_02)
@@ -307,7 +278,6 @@ DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_03)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_04)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_05)
-DECLARE_ROM_SEGMENT(Z2_KINDAN2)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_00)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_01)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_02)
@@ -315,108 +285,77 @@ DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_03)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_04)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_05)
-DECLARE_ROM_SEGMENT(Z2_TENMON_DAI)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_00)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_01)
-DECLARE_ROM_SEGMENT(Z2_LAST_DEKU)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_01)
-DECLARE_ROM_SEGMENT(Z2_22DEKUCITY)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_00)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_01)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_02)
-DECLARE_ROM_SEGMENT(Z2_KAJIYA)
DECLARE_ROM_SEGMENT(Z2_KAJIYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_00KEIKOKU)
DECLARE_ROM_SEGMENT(Z2_00KEIKOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_POSTHOUSE)
DECLARE_ROM_SEGMENT(Z2_POSTHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LABO)
DECLARE_ROM_SEGMENT(Z2_LABO_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_01)
-DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_00)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_01)
-DECLARE_ROM_SEGMENT(Z2_33ZORACITY)
DECLARE_ROM_SEGMENT(Z2_33ZORACITY_room_00)
-DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP)
DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01)
DECLARE_ROM_SEGMENT(Z2_F01_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_BS)
DECLARE_ROM_SEGMENT(Z2_INISIE_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_30GYOSON)
DECLARE_ROM_SEGMENT(Z2_30GYOSON_room_00)
-DECLARE_ROM_SEGMENT(Z2_31MISAKI)
DECLARE_ROM_SEGMENT(Z2_31MISAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI)
DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TORIDE)
DECLARE_ROM_SEGMENT(Z2_TORIDE_room_00)
-DECLARE_ROM_SEGMENT(Z2_FISHERMAN)
DECLARE_ROM_SEGMENT(Z2_FISHERMAN_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONSHOP)
DECLARE_ROM_SEGMENT(Z2_GORONSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_DEKU_KING)
DECLARE_ROM_SEGMENT(Z2_DEKU_KING_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_GORON)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_01)
-DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI)
DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01_B)
DECLARE_ROM_SEGMENT(Z2_F01_B_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01C)
DECLARE_ROM_SEGMENT(Z2_F01C_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOTI)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_00)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_01)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_02)
-DECLARE_ROM_SEGMENT(Z2_21MITURINMAE)
DECLARE_ROM_SEGMENT(Z2_21MITURINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_ZORA)
DECLARE_ROM_SEGMENT(Z2_LAST_ZORA_room_00)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_01)
-DECLARE_ROM_SEGMENT(Z2_SEA)
DECLARE_ROM_SEGMENT(Z2_SEA_room_00)
DECLARE_ROM_SEGMENT(Z2_SEA_room_01)
DECLARE_ROM_SEGMENT(Z2_SEA_room_02)
@@ -434,10 +373,8 @@ DECLARE_ROM_SEGMENT(Z2_SEA_room_13)
DECLARE_ROM_SEGMENT(Z2_SEA_room_14)
DECLARE_ROM_SEGMENT(Z2_SEA_room_15)
-DECLARE_ROM_SEGMENT(Z2_35TAKI)
DECLARE_ROM_SEGMENT(Z2_35TAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_REDEAD)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_00)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_01)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_02)
@@ -453,31 +390,24 @@ DECLARE_ROM_SEGMENT(Z2_REDEAD_room_11)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_12)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_13)
-DECLARE_ROM_SEGMENT(Z2_BANDROOM)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_00)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_01)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_02)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_03)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_04)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_01)
-DECLARE_ROM_SEGMENT(Z2_GORON_HAKA)
DECLARE_ROM_SEGMENT(Z2_GORON_HAKA_room_00)
-DECLARE_ROM_SEGMENT(Z2_SECOM)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_00)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_01)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOUGITES)
DECLARE_ROM_SEGMENT(Z2_TOUGITES_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_01)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_02)
@@ -488,48 +418,34 @@ DECLARE_ROM_SEGMENT(Z2_DANPEI_room_06)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_07)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_08)
-DECLARE_ROM_SEGMENT(Z2_IKANAMAE)
DECLARE_ROM_SEGMENT(Z2_IKANAMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_DOUJOU)
DECLARE_ROM_SEGMENT(Z2_DOUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE)
DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_IKNINSIDE)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_00)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_01)
-DECLARE_ROM_SEGMENT(Z2_MAP_SHOP)
DECLARE_ROM_SEGMENT(Z2_MAP_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F40)
DECLARE_ROM_SEGMENT(Z2_F40_room_00)
-DECLARE_ROM_SEGMENT(Z2_F41)
DECLARE_ROM_SEGMENT(Z2_F41_room_00)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_00)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_01)
-DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI)
DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE)
DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN2)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN2_room_00)
-DECLARE_ROM_SEGMENT(Z2_SEA_BS)
DECLARE_ROM_SEGMENT(Z2_SEA_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_RANDOM)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_00)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_01)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_02)
@@ -537,21 +453,17 @@ DECLARE_ROM_SEGMENT(Z2_RANDOM_room_03)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_04)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_05)
-DECLARE_ROM_SEGMENT(Z2_YADOYA)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_02)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_03)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT)
DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT_room_00)
-DECLARE_ROM_SEGMENT(Z2_INSIDETOWER)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_00)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_01)
-DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_00)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_01)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_02)
@@ -562,12 +474,10 @@ DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_06)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_07)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_08)
-DECLARE_ROM_SEGMENT(Z2_LOST_WOODS)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_00)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_01)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_02)
-DECLARE_ROM_SEGMENT(Z2_LAST_LINK)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_01)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_02)
@@ -577,40 +487,28 @@ DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_05)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_06)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_07)
-DECLARE_ROM_SEGMENT(Z2_SOUGEN)
DECLARE_ROM_SEGMENT(Z2_SOUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOMYA)
DECLARE_ROM_SEGMENT(Z2_BOMYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA)
DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KOEPONARACE)
DECLARE_ROM_SEGMENT(Z2_KOEPONARACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONRACE)
DECLARE_ROM_SEGMENT(Z2_GORONRACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOWN)
DECLARE_ROM_SEGMENT(Z2_TOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_ICHIBA)
DECLARE_ROM_SEGMENT(Z2_ICHIBA_room_00)
-DECLARE_ROM_SEGMENT(Z2_BACKTOWN)
DECLARE_ROM_SEGMENT(Z2_BACKTOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER)
DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER_room_00)
-DECLARE_ROM_SEGMENT(Z2_ALLEY)
DECLARE_ROM_SEGMENT(Z2_ALLEY_room_00)
-DECLARE_ROM_SEGMENT(SPOT00)
DECLARE_ROM_SEGMENT(SPOT00_room_00)
-DECLARE_ROM_SEGMENT(KAKUSIANA)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_00)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_01)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_02)
diff --git a/include/tables/scene_table.h b/include/tables/scene_table.h
new file mode 100644
index 000000000..ebd8cdb03
--- /dev/null
+++ b/include/tables/scene_table.h
@@ -0,0 +1,229 @@
+/**
+ * Scene Table
+ *
+ * DEFINE_SCENE should be used for non-empty scenes
+ * - Argument 0: Name of the scene segment in spec
+ * - Argument 1: Enum value for this scene
+ * - Argument 2: Title card's text id, or zero for no title card
+ * - Argument 3: Scene draw config index
+ * - Argument 4: Restriction flags. See `RESTRICTIONS_SET` on z_parameter.c
+ * - Argument 5: Persistent cycle flag set: bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ *
+ * DEFINE_SCENE_UNSET is needed to define empty entries from the original game
+ * - Argument 0: Enum value for this scene
+ */
+// Southern Swamp (Clear)
+/* 0x00 */ DEFINE_SCENE(Z2_20SICHITAI2, SCENE_20SICHITAI2, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+/* 0x01 */ DEFINE_SCENE_UNSET(SCENE_UNSET_01)
+/* 0x02 */ DEFINE_SCENE_UNSET(SCENE_UNSET_02)
+/* 0x03 */ DEFINE_SCENE_UNSET(SCENE_UNSET_03)
+/* 0x04 */ DEFINE_SCENE_UNSET(SCENE_UNSET_04)
+/* 0x05 */ DEFINE_SCENE_UNSET(SCENE_UNSET_05)
+/* 0x06 */ DEFINE_SCENE_UNSET(SCENE_UNSET_06)
+// Lone Peak Shrine & Grottos
+/* 0x07 */ DEFINE_SCENE(KAKUSIANA, SCENE_KAKUSIANA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 2) | (1 << 10) | (1 << 11)))
+// Cutscene Scene
+/* 0x08 */ DEFINE_SCENE(SPOT00, SCENE_SPOT00, 0, SCENE_DRAW_CFG_NOTHING, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x09 */ DEFINE_SCENE_UNSET(SCENE_UNSET_09)
+// Magic Hags' Potion Shop
+/* 0x0A */ DEFINE_SCENE(Z2_WITCH_SHOP, SCENE_WITCH_SHOP, 0x11A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Majora's Lair
+/* 0x0B */ DEFINE_SCENE(Z2_LAST_BS, SCENE_LAST_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Beneath the Graveyard
+/* 0x0C */ DEFINE_SCENE(Z2_HAKASHITA, SCENE_HAKASHITA, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Curiosity Shop
+/* 0x0D */ DEFINE_SCENE(Z2_AYASHIISHOP, SCENE_AYASHIISHOP, 0x10E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x0E */ DEFINE_SCENE_UNSET(SCENE_UNSET_0E)
+/* 0x0F */ DEFINE_SCENE_UNSET(SCENE_UNSET_0F)
+// Mama's House (Ranch House in PAL) & Barn
+/* 0x10 */ DEFINE_SCENE(Z2_OMOYA, SCENE_OMOYA, 0x132, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Honey & Darling's Shop
+/* 0x11 */ DEFINE_SCENE(Z2_BOWLING, SCENE_BOWLING, 0x108, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// The Mayor's Residence
+/* 0x12 */ DEFINE_SCENE(Z2_SONCHONOIE, SCENE_SONCHONOIE, 0x10B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Canyon
+/* 0x13 */ DEFINE_SCENE(Z2_IKANA, SCENE_IKANA, 0x141, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 1) | (1 << 30)))
+// Pirates' Fortress
+/* 0x14 */ DEFINE_SCENE(Z2_KAIZOKU, SCENE_KAIZOKU, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Milk Bar
+/* 0x15 */ DEFINE_SCENE(Z2_MILK_BAR, SCENE_MILK_BAR, 0x10C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower Temple
+/* 0x16 */ DEFINE_SCENE(Z2_INISIE_N, SCENE_INISIE_N, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Treasure Chest Shop
+/* 0x17 */ DEFINE_SCENE(Z2_TAKARAYA, SCENE_TAKARAYA, 0x109, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_SET(2, 0, 0, 0))
+// Inverted Stone Tower Temple
+/* 0x18 */ DEFINE_SCENE(Z2_INISIE_R, SCENE_INISIE_R, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Clock Tower Rooftop
+/* 0x19 */ DEFINE_SCENE(Z2_OKUJOU, SCENE_OKUJOU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Before Clock Town
+/* 0x1A */ DEFINE_SCENE(Z2_OPENINGDAN, SCENE_OPENINGDAN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3), 0, 0, 0))
+// Woodfall Temple
+/* 0x1B */ DEFINE_SCENE(Z2_MITURIN, SCENE_MITURIN, 0x11F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 12) | (1 << 13) | (1 << 15) | (1 << 20) | (1 << 21) | (1 << 22), 0, 0, 0))
+// Path to Mountain Village
+/* 0x1C */ DEFINE_SCENE(Z2_13HUBUKINOMITI, SCENE_13HUBUKINOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ancient Castle of Ikana
+/* 0x1D */ DEFINE_SCENE(Z2_CASTLE, SCENE_CASTLE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, (1 << 31), 0, (1 << 10)))
+// Deku Scrub Playground
+/* 0x1E */ DEFINE_SCENE(Z2_DEKUTES, SCENE_DEKUTES, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Odolwa's Lair
+/* 0x1F */ DEFINE_SCENE(Z2_MITURIN_BS, SCENE_MITURIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Town Shooting Gallery
+/* 0x20 */ DEFINE_SCENE(Z2_SYATEKI_MIZU, SCENE_SYATEKI_MIZU, 0x107, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Snowhead Temple
+/* 0x21 */ DEFINE_SCENE(Z2_HAKUGIN, SCENE_HAKUGIN, 0x12B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 5) | (1 << 21) | (1 << 23) | (1 << 24), 0, 0, 0))
+// Milk Road
+/* 0x22 */ DEFINE_SCENE(Z2_ROMANYMAE, SCENE_ROMANYMAE, 0x149, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Pirates' Fortress Interior
+/* 0x23 */ DEFINE_SCENE(Z2_PIRATE, SCENE_PIRATE, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 12)))
+// Swamp Shooting Gallery
+/* 0x24 */ DEFINE_SCENE(Z2_SYATEKI_MORI, SCENE_SYATEKI_MORI, 0x11B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Pinnacle Rock
+/* 0x25 */ DEFINE_SCENE(Z2_SINKAI, SCENE_SINKAI, 0x135, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Fairy's Fountain
+/* 0x26 */ DEFINE_SCENE(Z2_YOUSEI_IZUMI, SCENE_YOUSEI_IZUMI, 0x13E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Swamp Spider House
+/* 0x27 */ DEFINE_SCENE(Z2_KINSTA1, SCENE_KINSTA1, 0x11E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Oceanside Spider House
+/* 0x28 */ DEFINE_SCENE(Z2_KINDAN2, SCENE_KINDAN2, 0x13F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Astral Observatory
+/* 0x29 */ DEFINE_SCENE(Z2_TENMON_DAI, SCENE_TENMON_DAI, 0x114, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Deku Trial
+/* 0x2A */ DEFINE_SCENE(Z2_LAST_DEKU, SCENE_LAST_DEKU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Deku Palace
+/* 0x2B */ DEFINE_SCENE(Z2_22DEKUCITY, SCENE_22DEKUCITY, 0x118, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Mountain Smithy
+/* 0x2C */ DEFINE_SCENE(Z2_KAJIYA, SCENE_KAJIYA, 0x127, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Termina Field
+/* 0x2D */ DEFINE_SCENE(Z2_00KEIKOKU, SCENE_00KEIKOKU, 0x100, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4), 0, 0, 0))
+// Post Office
+/* 0x2E */ DEFINE_SCENE(Z2_POSTHOUSE, SCENE_POSTHOUSE, 0x111, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_SET(3, 0, 0, 0))
+// Marine Research Lab
+/* 0x2F */ DEFINE_SCENE(Z2_LABO, SCENE_LABO, 0x13A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Graveyard (Day 3) and Dampe's House
+/* 0x30 */ DEFINE_SCENE(Z2_DANPEI2TEST, SCENE_DANPEI2TEST, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+/* 0x31 */ DEFINE_SCENE_UNSET(SCENE_UNSET_31)
+// Goron Shrine
+/* 0x32 */ DEFINE_SCENE(Z2_16GORON_HOUSE, SCENE_16GORON_HOUSE, 0x124, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall
+/* 0x33 */ DEFINE_SCENE(Z2_33ZORACITY, SCENE_33ZORACITY, 0x136, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Trading Post
+/* 0x34 */ DEFINE_SCENE(Z2_8ITEMSHOP, SCENE_8ITEMSHOP, 0x10F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Romani Ranch
+/* 0x35 */ DEFINE_SCENE(Z2_F01, SCENE_F01, 0x12E, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Twinmold's Lair
+/* 0x36 */ DEFINE_SCENE(Z2_INISIE_BS, SCENE_INISIE_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Great Bay Coast
+/* 0x37 */ DEFINE_SCENE(Z2_30GYOSON, SCENE_30GYOSON, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 20), 0, 0, (1 << 1) | (1 << 5)))
+// Zora Cape
+/* 0x38 */ DEFINE_SCENE(Z2_31MISAKI, SCENE_31MISAKI, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, (1 << 7)))
+// Lottery Shop
+/* 0x39 */ DEFINE_SCENE(Z2_TAKARAKUJI, SCENE_TAKARAKUJI, 0x112, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x3A */ DEFINE_SCENE_UNSET(SCENE_UNSET_3A)
+// Pirates' Fortress Moat
+/* 0x3B */ DEFINE_SCENE(Z2_TORIDE, SCENE_TORIDE, 0x138, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Fisherman's Hut
+/* 0x3C */ DEFINE_SCENE(Z2_FISHERMAN, SCENE_FISHERMAN, 0x13B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Shop
+/* 0x3D */ DEFINE_SCENE(Z2_GORONSHOP, SCENE_GORONSHOP, 0x129, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku King's Chamber
+/* 0x3E */ DEFINE_SCENE(Z2_DEKU_KING, SCENE_DEKU_KING, 0x11C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Goron Trial
+/* 0x3F */ DEFINE_SCENE(Z2_LAST_GORON, SCENE_LAST_GORON, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Road to Southern Swamp
+/* 0x40 */ DEFINE_SCENE(Z2_24KEMONOMITI, SCENE_24KEMONOMITI, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 1) | (1 << 31)))
+// Doggy Racetrack
+/* 0x41 */ DEFINE_SCENE(Z2_F01_B, SCENE_F01_B, 0x130, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Cucco Shack
+/* 0x42 */ DEFINE_SCENE(Z2_F01C, SCENE_F01C, 0x12F, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Graveyard
+/* 0x43 */ DEFINE_SCENE(Z2_BOTI, SCENE_BOTI, 0x106, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goht's Lair
+/* 0x44 */ DEFINE_SCENE(Z2_HAKUGIN_BS, SCENE_HAKUGIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Southern Swamp (poison)
+/* 0x45 */ DEFINE_SCENE(Z2_20SICHITAI, SCENE_20SICHITAI, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+// Woodfall
+/* 0x46 */ DEFINE_SCENE(Z2_21MITURINMAE, SCENE_21MITURINMAE, 0x117, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0x102, 0, 0, (1 << 10)))
+// Moon Zora Trial
+/* 0x47 */ DEFINE_SCENE(Z2_LAST_ZORA, SCENE_LAST_ZORA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Goron Village (spring)
+/* 0x48 */ DEFINE_SCENE(Z2_11GORONNOSATO2, SCENE_11GORONNOSATO2, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Great Bay Temple
+/* 0x49 */ DEFINE_SCENE(Z2_SEA, SCENE_SEA, 0x13D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4) | (1 << 5) | (1 << 6), 0, 0, 0))
+// Waterfall Rapids
+/* 0x4A */ DEFINE_SCENE(Z2_35TAKI, SCENE_35TAKI, 0x137, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Well
+/* 0x4B */ DEFINE_SCENE(Z2_REDEAD, SCENE_REDEAD, 0x145, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall Rooms
+/* 0x4C */ DEFINE_SCENE(Z2_BANDROOM, SCENE_BANDROOM, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Village (winter)
+/* 0x4D */ DEFINE_SCENE(Z2_11GORONNOSATO, SCENE_11GORONNOSATO, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Graveyard
+/* 0x4E */ DEFINE_SCENE(Z2_GORON_HAKA, SCENE_GORON_HAKA, 0x12A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Sakon's Hideout
+/* 0x4F */ DEFINE_SCENE(Z2_SECOM, SCENE_SECOM, 0x143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Mountain Village (winter)
+/* 0x50 */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA, SCENE_10YUKIYAMANOMURA, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Ghost Hut
+/* 0x51 */ DEFINE_SCENE(Z2_TOUGITES, SCENE_TOUGITES, 0x146, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku Shrine
+/* 0x52 */ DEFINE_SCENE(Z2_DANPEI, SCENE_DANPEI, 0x120, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Road to Ikana
+/* 0x53 */ DEFINE_SCENE(Z2_IKANAMAE, SCENE_IKANAMAE, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Swordsman's School
+/* 0x54 */ DEFINE_SCENE(Z2_DOUJOU, SCENE_DOUJOU, 0x110, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Music Box House
+/* 0x55 */ DEFINE_SCENE(Z2_MUSICHOUSE, SCENE_MUSICHOUSE, 0x147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Igos du Ikana's Lair
+/* 0x56 */ DEFINE_SCENE(Z2_IKNINSIDE, SCENE_IKNINSIDE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Tourist Information
+/* 0x57 */ DEFINE_SCENE(Z2_MAP_SHOP, SCENE_MAP_SHOP, 0x119, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower
+/* 0x58 */ DEFINE_SCENE(Z2_F40, SCENE_F40, 0x140, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Inverted Stone Tower
+/* 0x59 */ DEFINE_SCENE(Z2_F41, SCENE_F41, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Mountain Village (spring)
+/* 0x5A */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA2, SCENE_10YUKIYAMANOMURA2, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Path to Snowhead
+/* 0x5B */ DEFINE_SCENE(Z2_14YUKIDAMANOMITI, SCENE_14YUKIDAMANOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 8)))
+// Snowhead
+/* 0x5C */ DEFINE_SCENE(Z2_12HAKUGINMAE, SCENE_12HAKUGINMAE, 0x125, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Path to Goron Village (winter)
+/* 0x5D */ DEFINE_SCENE(Z2_17SETUGEN, SCENE_17SETUGEN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Path to Goron Village (spring)
+/* 0x5E */ DEFINE_SCENE(Z2_17SETUGEN2, SCENE_17SETUGEN2, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Gyorg's Lair
+/* 0x5F */ DEFINE_SCENE(Z2_SEA_BS, SCENE_SEA_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Secret Shrine
+/* 0x60 */ DEFINE_SCENE(Z2_RANDOM, SCENE_RANDOM, 0x12C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// Stock Pot Inn
+/* 0x61 */ DEFINE_SCENE(Z2_YADOYA, SCENE_YADOYA, 0x10A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Great Bay Cutscene
+/* 0x62 */ DEFINE_SCENE(Z2_KONPEKI_ENT, SCENE_KONPEKI_ENT, 0x139, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Clock Tower Interior
+/* 0x63 */ DEFINE_SCENE(Z2_INSIDETOWER, SCENE_INSIDETOWER, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(1 << 0, 0, 0, 0))
+// Woods of Mystery
+/* 0x64 */ DEFINE_SCENE(Z2_26SARUNOMORI, SCENE_26SARUNOMORI, 0x11D, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Lost Woods (Intro)
+/* 0x65 */ DEFINE_SCENE(Z2_LOST_WOODS, SCENE_LOST_WOODS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Link Trial
+/* 0x66 */ DEFINE_SCENE(Z2_LAST_LINK, SCENE_LAST_LINK, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// The Moon
+/* 0x67 */ DEFINE_SCENE(Z2_SOUGEN, SCENE_SOUGEN, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_NONE)
+// Bomb Shop
+/* 0x68 */ DEFINE_SCENE(Z2_BOMYA, SCENE_BOMYA, 0x10D, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Giants' Chamber
+/* 0x69 */ DEFINE_SCENE(Z2_KYOJINNOMA, SCENE_KYOJINNOMA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Gorman Track
+/* 0x6A */ DEFINE_SCENE(Z2_KOEPONARACE, SCENE_KOEPONARACE, 0x131, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Racetrack
+/* 0x6B */ DEFINE_SCENE(Z2_GORONRACE, SCENE_GORONRACE, 0x126, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// East Clock Town
+/* 0x6C */ DEFINE_SCENE(Z2_TOWN, SCENE_TOWN, 0x101, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(1, 0, 0, 0))
+// West Clock Town
+/* 0x6D */ DEFINE_SCENE(Z2_ICHIBA, SCENE_ICHIBA, 0x102, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// North Clock Town
+/* 0x6E */ DEFINE_SCENE(Z2_BACKTOWN, SCENE_BACKTOWN, 0x103, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// South Clock Town
+/* 0x6F */ DEFINE_SCENE(Z2_CLOCKTOWER, SCENE_CLOCKTOWER, 0x104, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 10)))
+// Laundry Pool
+/* 0x70 */ DEFINE_SCENE(Z2_ALLEY, SCENE_ALLEY, 0x105, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 1, 0))
diff --git a/include/ultra64/viint.h b/include/ultra64/viint.h
new file mode 100644
index 000000000..4fea2259a
--- /dev/null
+++ b/include/ultra64/viint.h
@@ -0,0 +1,37 @@
+#ifndef ULTRA64_VIINT_H
+#define ULTRA64_VIINT_H
+
+#define VI_STATE_MODE_SET (1 << 0)
+#define VI_STATE_XSCALE_SET (1 << 1)
+#define VI_STATE_YSCALE_FACTOR_SET (1 << 2)
+#define VI_STATE_CTRL_SET (1 << 3)
+#define VI_STATE_BUFFER_SET (1 << 4)
+#define VI_STATE_BLACK (1 << 5)
+#define VI_STATE_REPEATLINE (1 << 6)
+#define VI_STATE_FADE (1 << 7)
+
+#define VI_SCALE_MASK 0xFFF
+#define VI_2_10_FPART_MASK 0x3FF
+#define VI_SUBPIXEL_SH 0x10
+
+// For use in initializing OSViMode structures
+
+#define BURST(hsync_width, color_width, vsync_width, color_start) \
+ (hsync_width | (color_width << 8) | (vsync_width << 16) | (color_start << 20))
+#define WIDTH(v) v
+#define VSYNC(v) v
+#define HSYNC(duration, leap) (duration | (leap << 16))
+#define LEAP(upper, lower) ((upper << 16) | lower)
+#define START(start, end) ((start << 16) | end)
+
+#define FTOFIX(val, i, f) ((u32)(val * (f32)(1 << f)) & ((1 << (i + f)) - 1))
+
+#define F210(val) FTOFIX(val, 2, 10)
+#define SCALE(scaleup, off) (F210((1.0f / (f32)scaleup)) | (F210((f32)off) << 16))
+
+#define VCURRENT(v) v
+#define ORIGIN(v) v
+#define VINTR(v) v
+#define HSTART START
+
+#endif
diff --git a/include/variables.h b/include/variables.h
index 0979bf26d..24030fd99 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -419,21 +419,7 @@ extern u8 gOpeningEntranceIndex;
extern ActorCutscene sGlobalCutsceneList[8];
extern GameStateOverlay gGameStateOverlayTable[];
extern s32 gGraphNumGameStates;
-// extern UNK_TYPE2 D_801BDA70;
-// extern UNK_TYPE2 D_801BDA74;
-// extern UNK_TYPE2 D_801BDA78;
-// extern UNK_TYPE2 D_801BDA7C;
-extern s32 D_801BDA9C;
-extern UNK_TYPE4 D_801BDAA0;
-extern s32 D_801BDAA4;
-// extern UNK_TYPE2 D_801BDAA8;
-// extern UNK_TYPE2 D_801BDAAA;
-// extern UNK_TYPE2 D_801BDAAC;
-// extern UNK_TYPE2 D_801BDAAE;
-// extern UNK_TYPE2 D_801BDAB0;
-// extern UNK_TYPE2 D_801BDAB2;
-// extern UNK_TYPE2 D_801BDAB4;
-// extern UNK_TYPE2 D_801BDAB6;
+
// extern UNK_TYPE4 D_801BDAC0;
// extern UNK_TYPE4 D_801BDAC4;
// extern UNK_TYPE4 D_801BDAC8;
@@ -581,7 +567,7 @@ extern s16 gPlayerFormObjectIndices[PLAYER_FORM_MAX];
extern ObjectId gObjectTableSize;
extern RomFile gObjectTable[OBJECT_ID_MAX];
-extern SceneTableEntry gSceneTable[];
+extern SceneTableEntry gSceneTable[SCENE_MAX];
extern UNK_PTR D_801C5C50;
// extern UNK_TYPE1 D_801C5C9C;
extern UNK_PTR D_801C5CB0;
@@ -600,7 +586,7 @@ extern UNK_PTR D_801C5CB0;
// extern UNK_TYPE2 D_801C6A8C;
// extern UNK_TYPE2 D_801C6A90;
// extern UNK_TYPE2 D_801C6A94;
-extern u8 D_801C6A98[5][5];
+extern u8 gPageSwitchNextButtonStatus[6][5];
// extern UNK_TYPE1 D_801C6AB8;
// extern UNK_TYPE1 D_801C6B28;
// extern UNK_TYPE1 D_801CED40;
@@ -1605,10 +1591,6 @@ extern f32 D_801DD774;
extern f32 D_801DD780;
extern f32 D_801DD7B0;
extern f32 D_801DD7C0;
-extern f32 D_801DD7E0;
-extern f32 D_801DD7E4;
-extern f32 D_801DD7E8;
-extern f32 D_801DD7EC;
// extern UNK_TYPE2 D_801DD880;
// extern UNK_TYPE1 D_801DD8E0;
// extern UNK_TYPE4 D_801DD900;
@@ -2393,7 +2375,7 @@ extern UNK_TYPE1 D_801F7FF0;
extern struct_801F8010 D_801F8010;
extern VisZbuf sVisZbuf;
extern VisMono sMonoColors;
-extern UNK_TYPE1 D_801F8048;
+extern ViMode D_801F8048;
extern FaultAddrConvClient sGraphFaultAddrConvClient;
extern FaultClient sGraphFaultClient;
extern GfxMasterList* gGfxMasterDL;
@@ -2422,30 +2404,32 @@ extern volatile OSTime sRSPOtherTotalTime;
// extern UNK_TYPE1 D_801FBB18;
extern volatile OSTime gRDPTotalTime;
// extern UNK_TYPE1 D_801FBB28;
-extern OSViMode D_801FBB30;
-extern u32* gFramebuffers[2];
-extern OSViMode* D_801FBB88;
+
+extern OSViMode sNotebookViMode;
+extern void* gFramebuffers[2];
+extern OSViMode* gActiveViMode;
extern u16* gZBufferPtr;
-extern u8* D_801FBB90;
+extern void* gWorkBuffer;
extern u64* gGfxSPTaskOutputBufferPtr;
-extern size_t gGfxSPTaskOutputBufferSize;
-// extern UNK_TYPE1 D_801FBB9C;
-// extern UNK_TYPE1 D_801FBBA0;
-extern u16 (*gZBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u16 (*gWorkBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u64 (*gGfxSPTaskOutputBuffer)[0x3000];
extern void* gGfxSPTaskOutputBufferEnd;
-// extern UNK_TYPE1 D_801FBBB4;
-// extern UNK_TYPE1 D_801FBBB8;
-// extern UNK_TYPE1 D_801FBBBC;
-// extern UNK_TYPE1 D_801FBBC0;
-extern u64 (*gGfxSPTaskOutputBuffer2)[0x3000];
-extern void* gGfxSPTaskOutputBufferEnd2;
-extern UNK_TYPE2 D_801FBBCC;
-extern UNK_TYPE2 D_801FBBCE;
-// extern UNK_TYPE1 D_801FBBD0;
-// extern UNK_TYPE1 D_801FBBD2;
-extern u8 D_801FBBD4;
+extern void* sCfbLoRes1;
+extern void* sCfbLoRes0;
+extern u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndLoRes;
+extern void* sCfbHiRes1;
+extern void* sCfbHiRes0;
+extern u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndHiRes;
+extern s16 gCfbWidth;
+extern s16 gCfbHeight;
+extern s16 gCfbLeftAdjust;
+extern s16 gCfbUpperAdjust;
+extern u8 gSysCfbHiResEnabled;
+
extern Vec3f D_801FBBF0;
extern LineSegment Math3D_ColSphereTri_line;
extern Vec3f Math3D_ColSphereTri_point;
diff --git a/include/z64.h b/include/z64.h
index 2bb2653ea..aeea1594e 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -68,6 +68,7 @@
#define Z_THREAD_ID_MAIN 3
#define Z_THREAD_ID_GRAPH 4
#define Z_THREAD_ID_SCHED 5
+#define Z_THREAD_ID_FLASHROM 13
#define Z_THREAD_ID_DMAMGR 18
#define Z_THREAD_ID_IRQMGR 19
@@ -76,6 +77,7 @@
#define Z_PRIORITY_AUDIOMGR 11
#define Z_PRIORITY_IDLE 12
#define Z_PRIORITY_MAIN 12
+#define Z_PRIORITY_FLASHROM 13
#define Z_PRIORITY_PADMGR 15
#define Z_PRIORITY_SCHED 16
#define Z_PRIORITY_DMAMGR 17
@@ -118,13 +120,13 @@ typedef struct {
} NmiBuff; // size >= 0x18
typedef struct {
- /* 0x00 */ int unk0;
- /* 0x04 */ void* unk4;
- /* 0x08 */ int unk8;
- /* 0x0C */ int unkC;
- /* 0x10 */ int unk10;
- /* 0x14 */ OSMesgQueue unk14;
-} s80185D40; // size = 0x2C
+ /* 0x00 */ s32 requestType;
+ /* 0x04 */ OSMesg response;
+ /* 0x08 */ void* addr;
+ /* 0x0C */ s32 pageNum;
+ /* 0x10 */ s32 pageCount;
+ /* 0x14 */ OSMesgQueue messageQueue;
+} FlashromRequest; // size = 0x2C
// End of RDRAM without the Expansion Pak installed
#define NORMAL_RDRAM_END 0x80400000
@@ -200,7 +202,7 @@ typedef struct {
/* 0x204 */ u16 pageIndex;
/* 0x206 */ u16 switchPageTimer;
/* 0x208 */ u16 savePromptState;
- /* 0x20C */ f32 unk_20C;
+ /* 0x20C */ f32 unk_20C; // set to 936.0f, unused remnant from OoT
/* 0x210 */ f32 itemPageRoll; // rotation (-z) of the item page into the screen
/* 0x214 */ f32 mapPageRoll; // rotation (+x) of the map page into the screen
/* 0x218 */ f32 questPageRoll; // rotation (+z) of the quest page into the screen
@@ -216,7 +218,7 @@ typedef struct {
/* 0x24C */ s16 cursorYIndex[5];
/* 0x256 */ s16 unk_256; // Uses DungeonItem enum
/* 0x258 */ s16 cursorSpecialPos;
- /* 0x25A */ s16 pageSwitchTimer;
+ /* 0x25A */ s16 pageSwitchInputTimer; // Used to introduce a delay before switching page when arriving on the "scroll left/right" positions while holding stick left/right.
/* 0x25C */ u16 namedItem;
/* 0x25E */ u16 cursorItem[5];
/* 0x268 */ u16 cursorSlot[5];
@@ -227,15 +229,15 @@ typedef struct {
/* 0x27A */ s16 equipAnimY;
/* 0x27C */ s16 equipAnimAlpha;
/* 0x27E */ s16 infoPanelOffsetY;
- /* 0x280 */ u16 unk_280;
+ /* 0x280 */ u16 nameDisplayTimer;
/* 0x282 */ u16 nameColorSet;
/* 0x284 */ s16 cursorColorSet;
- /* 0x286 */ s16 unk_286;
- /* 0x288 */ f32 unk_288;
- /* 0x28C */ f32 unk_28C;
- /* 0x290 */ f32 unk_290;
- /* 0x294 */ f32 unk_294;
- /* 0x298 */ f32 unk_298;
+ /* 0x286 */ s16 cursorSpinPhase;
+ /* 0x288 */ f32 cursorX;
+ /* 0x28C */ f32 cursorY;
+ /* 0x290 */ f32 cursorWidth;
+ /* 0x294 */ f32 cursorHeight;
+ /* 0x298 */ f32 cursorShrinkRate;
/* 0x29C */ s16 promptChoice; // save/continue choice: 0 = yes; 4 = no
/* 0x29E */ s16 promptAlpha;
/* 0x2A0 */ s16 ocarinaSongIndex;
@@ -612,7 +614,7 @@ typedef struct {
typedef struct {
/* 0x0 */ u32 type;
/* 0x4 */ u32 setScissor;
- /* 0x8 */ Color_RGBA8 color;
+ /* 0x8 */ Color_RGBA8_u32 color;
/* 0xC */ Color_RGBA8 envColor;
} struct_801F8010; // size = 0x10
@@ -642,6 +644,19 @@ typedef struct {
#define FRAM_STATUS_REGISTER FRAM_BASE_ADDRESS // FRAM Base Address in Cart Memory
#define FRAM_COMMAND_REGISTER 0x10000 // Located at 0x08010000 on the Cart
+#define FLASH_VERSION_MX_PROTO_A 0x00C20000
+#define FLASH_VERSION_MX_A 0x00C20001
+#define FLASH_VERSION_MX_C 0x00C2001E
+#define FLASH_VERSION_MX_B_AND_D 0x00C2001D
+#define FLASH_VERSION_MEI 0x003200F1
+
+#define FLASH_TYPE_MAGIC 0x11118001
+
+#define FLASH_PAGE_SIZE 128
+
+#define FLASHROM_REQUEST_WRITE 1
+#define FLASHROM_REQUEST_READ 2
+
enum fram_command {
/* Does nothing for FRAM_COMMAND_SET_MODE_READ_AND_STATUS, FRAM_MODE_NOP, FRAM_COMMAND_SET_MODE_STATUS_AND_STATUS
Initializes fram to 0xFF in FRAM_MODE_ERASE
@@ -676,4 +691,29 @@ enum fram_mode {
FRAM_MODE_STATUS
};
+typedef enum {
+ /* 0 */ VI_MODE_EDIT_STATE_INACTIVE,
+ /* 1 */ VI_MODE_EDIT_STATE_ACTIVE,
+ /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments
+ /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode
+} ViModeEditState;
+
+typedef struct {
+ /* 0x00 */ OSViMode customViMode;
+ /* 0x50 */ s32 viHeight;
+ /* 0x54 */ s32 viWidth;
+ /* 0x58 */ s32 rightAdjust;
+ /* 0x5C */ s32 leftAdjust;
+ /* 0x60 */ s32 lowerAdjust;
+ /* 0x64 */ s32 upperAdjust;
+ /* 0x68 */ s32 editState;
+ /* 0x6C */ s32 tvType;
+ /* 0x70 */ u32 loRes;
+ /* 0x74 */ u32 antialiasOff;
+ /* 0x78 */ u32 modeN;
+ /* 0x7C */ u32 fb16Bit;
+ /* 0x80 */ u32 viFeatures;
+ /* 0x84 */ u32 unk_84;
+} ViMode; // size = 0x88
+
#endif
diff --git a/include/z64animation.h b/include/z64animation.h
index 316dfe341..67c9d7641 100644
--- a/include/z64animation.h
+++ b/include/z64animation.h
@@ -304,7 +304,7 @@ typedef struct SkeletonInfo {
typedef s32 (*OverrideKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
-typedef void (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
+typedef s32 (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
void SkelAnime_DrawLod(struct PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, struct Actor* actor, s32 lod);
diff --git a/include/z64horse.h b/include/z64horse.h
new file mode 100644
index 000000000..bae439868
--- /dev/null
+++ b/include/z64horse.h
@@ -0,0 +1,21 @@
+#ifndef Z64_HORSE_H
+#define Z64_HORSE_H
+
+#include "ultra64.h"
+#include "z64.h"
+
+
+s32 Horse_GetJumpingFencePathIndex(PlayState* play);
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4);
+s32 Horse_IsValidSpawn(s16 sceneId);
+void Horse_ResetHorseData(PlayState* play);
+void Horse_Spawn(PlayState* play, Player* player);
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw);
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx);
+
+
+extern s32 gHorseIsMounted;
+extern s32 D_801BDAA0;
+extern s32 gHorsePlayedEponasSong;
+
+#endif
diff --git a/include/z64interface.h b/include/z64interface.h
index 0f2e01e17..aac675a65 100644
--- a/include/z64interface.h
+++ b/include/z64interface.h
@@ -132,7 +132,7 @@ typedef struct {
/* 0x1FC */ OSMesg loadMsg;
/* 0x200 */ Viewport viewport;
/* 0x210 */ s16 aButtonState;
- /* 0x212 */ u16 aButtonHorseDoAction; // TODO: Confirm. Only seems to be used for Epona and "DO_ACTION_FASTER"
+ /* 0x212 */ u16 aButtonHorseDoAction; // TODO: Confirm. Only seems to be used for Epona and "DO_ACTION_FASTER". Also Kaleido?
/* 0x214 */ u16 aButtonDoAction;
/* 0x218 */ f32 aButtonRoll;
/* 0x21C */ s16 bButtonDoActionActive;
diff --git a/include/z64save.h b/include/z64save.h
index 20f7db40e..264cfbb36 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -696,7 +696,9 @@ typedef enum {
#define WEEKEVENTREG_18_10 PACK_WEEKEVENTREG_FLAG(18, 0x10)
#define WEEKEVENTREG_18_20 PACK_WEEKEVENTREG_FLAG(18, 0x20)
#define WEEKEVENTREG_18_40 PACK_WEEKEVENTREG_FLAG(18, 0x40)
-#define WEEKEVENTREG_18_80 PACK_WEEKEVENTREG_FLAG(18, 0x80)
+
+// Player has Powder Keg purchasing privileges.
+#define WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES PACK_WEEKEVENTREG_FLAG(18, 0x80)
#define WEEKEVENTREG_19_01 PACK_WEEKEVENTREG_FLAG(19, 0x01)
#define WEEKEVENTREG_19_02 PACK_WEEKEVENTREG_FLAG(19, 0x02)
#define WEEKEVENTREG_19_04 PACK_WEEKEVENTREG_FLAG(19, 0x04)
@@ -718,8 +720,12 @@ typedef enum {
#define WEEKEVENTREG_20_80 PACK_WEEKEVENTREG_FLAG(20, 0x80)
#define WEEKEVENTREG_21_01 PACK_WEEKEVENTREG_FLAG(21, 0x01)
#define WEEKEVENTREG_21_02 PACK_WEEKEVENTREG_FLAG(21, 0x02)
-#define WEEKEVENTREG_21_04 PACK_WEEKEVENTREG_FLAG(21, 0x04)
-#define WEEKEVENTREG_21_08 PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
+// Player has spoken to Goron Graveyard's gravemaker while in Goron form.
+#define WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON PACK_WEEKEVENTREG_FLAG(21, 0x04)
+// Player has spoken to formerly frozen Goron outside Goron Graveyard.
+#define WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
#define WEEKEVENTREG_21_10 PACK_WEEKEVENTREG_FLAG(21, 0x10)
#define WEEKEVENTREG_21_20 PACK_WEEKEVENTREG_FLAG(21, 0x20)
#define WEEKEVENTREG_21_40 PACK_WEEKEVENTREG_FLAG(21, 0x40)
@@ -730,7 +736,10 @@ typedef enum {
#define WEEKEVENTREG_22_01 PACK_WEEKEVENTREG_FLAG(22, 0x01)
#define WEEKEVENTREG_22_02 PACK_WEEKEVENTREG_FLAG(22, 0x02)
-#define WEEKEVENTREG_22_04 PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
+// Goron Elder's son has been calmed from Goron's Lullaby.
+#define WEEKEVENTREG_CALMED_GORON_ELDERS_SON PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
#define WEEKEVENTREG_22_08 PACK_WEEKEVENTREG_FLAG(22, 0x08)
#define WEEKEVENTREG_22_10 PACK_WEEKEVENTREG_FLAG(22, 0x10)
#define WEEKEVENTREG_22_20 PACK_WEEKEVENTREG_FLAG(22, 0x20)
@@ -1294,11 +1303,17 @@ typedef enum {
#define WEEKEVENTREG_88_08 PACK_WEEKEVENTREG_FLAG(88, 0x08)
#define WEEKEVENTREG_88_10 PACK_WEEKEVENTREG_FLAG(88, 0x10)
#define WEEKEVENTREG_88_20 PACK_WEEKEVENTREG_FLAG(88, 0x20)
-#define WEEKEVENTREG_88_40 PACK_WEEKEVENTREG_FLAG(88, 0x40)
-#define WEEKEVENTREG_88_80 PACK_WEEKEVENTREG_FLAG(88, 0x80)
-#define WEEKEVENTREG_89_01 PACK_WEEKEVENTREG_FLAG(89, 0x01)
-#define WEEKEVENTREG_89_02 PACK_WEEKEVENTREG_FLAG(89, 0x02)
-#define WEEKEVENTREG_89_04 PACK_WEEKEVENTREG_FLAG(89, 0x04)
+
+// Goron shrine Gatekeeper has opened shrine.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE PACK_WEEKEVENTREG_FLAG(88, 0x40)
+// Goron shrine Gatekeeper has opened shrine for player in Human form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN PACK_WEEKEVENTREG_FLAG(88, 0x80)
+// Goron shrine Gatekeeper has opened shrine for player in Deku form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU PACK_WEEKEVENTREG_FLAG(89, 0x01)
+// Goron shrine Gatekeeper has opened shrine for player in Zora form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA PACK_WEEKEVENTREG_FLAG(89, 0x02)
+// Goron shrine Gatekeeper has opened shrine for player in Goron form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON PACK_WEEKEVENTREG_FLAG(89, 0x04)
// Unconfirmed: "Postman has delivered priority mail"
#define WEEKEVENTREG_89_08 PACK_WEEKEVENTREG_FLAG(89, 0x08)
diff --git a/include/z64scene.h b/include/z64scene.h
index c31b7ce58..387d584f5 100644
--- a/include/z64scene.h
+++ b/include/z64scene.h
@@ -584,123 +584,17 @@ typedef enum {
/* 6 */ TINGLE_MAP_MAX
} TingleMapId;
-typedef enum {
- /* 0x00 */ SCENE_20SICHITAI2, // Southern Swamp (Clear)
- /* 0x01 */ SCENE_UNSET_1,
- /* 0x02 */ SCENE_UNSET_2,
- /* 0x03 */ SCENE_UNSET_3,
- /* 0x04 */ SCENE_UNSET_4,
- /* 0x05 */ SCENE_UNSET_5,
- /* 0x06 */ SCENE_UNSET_6,
- /* 0x07 */ SCENE_KAKUSIANA, // Lone Peak Shrine & Grottos
- /* 0x08 */ SCENE_SPOT00, // Cutscene Scene
- /* 0x09 */ SCENE_UNSET_9,
- /* 0x0A */ SCENE_WITCH_SHOP, // Magic Hags' Potion Shop
- /* 0x0B */ SCENE_LAST_BS, // Majora's Lair
- /* 0x0C */ SCENE_HAKASHITA, // Beneath the Graveyard
- /* 0x0D */ SCENE_AYASHIISHOP, // Curiosity Shop
- /* 0x0E */ SCENE_UNSET_E,
- /* 0x0F */ SCENE_UNSET_F,
- /* 0x10 */ SCENE_OMOYA, // Mama's House (Ranch House in PAL) & Barn
- /* 0x11 */ SCENE_BOWLING, // Honey & Darling's Shop
- /* 0x12 */ SCENE_SONCHONOIE, // The Mayor's Residence
- /* 0x13 */ SCENE_IKANA, // Ikana Canyon
- /* 0x14 */ SCENE_KAIZOKU, // Pirates' Fortress
- /* 0x15 */ SCENE_MILK_BAR, // Milk Bar
- /* 0x16 */ SCENE_INISIE_N, // Stone Tower Temple
- /* 0x17 */ SCENE_TAKARAYA, // Treasure Chest Shop
- /* 0x18 */ SCENE_INISIE_R, // Inverted Stone Tower Temple
- /* 0x19 */ SCENE_OKUJOU, // Clock Tower Rooftop
- /* 0x1A */ SCENE_OPENINGDAN, // Before Clock Town
- /* 0x1B */ SCENE_MITURIN, // Woodfall Temple
- /* 0x1C */ SCENE_13HUBUKINOMITI, // Path to Mountain Village
- /* 0x1D */ SCENE_CASTLE, // Ancient Castle of Ikana
- /* 0x1E */ SCENE_DEKUTES, // Deku Scrub Playground
- /* 0x1F */ SCENE_MITURIN_BS, // Odolwa's Lair
- /* 0x20 */ SCENE_SYATEKI_MIZU, // Town Shooting Gallery
- /* 0x21 */ SCENE_HAKUGIN, // Snowhead Temple
- /* 0x22 */ SCENE_ROMANYMAE, // Milk Road
- /* 0x23 */ SCENE_PIRATE, // Pirates' Fortress Interior
- /* 0x24 */ SCENE_SYATEKI_MORI, // Swamp Shooting Gallery
- /* 0x25 */ SCENE_SINKAI, // Pinnacle Rock
- /* 0x26 */ SCENE_YOUSEI_IZUMI, // Fairy's Fountain
- /* 0x27 */ SCENE_KINSTA1, // Swamp Spider House
- /* 0x28 */ SCENE_KINDAN2, // Oceanside Spider House
- /* 0x29 */ SCENE_TENMON_DAI, // Astral Observatory
- /* 0x2A */ SCENE_LAST_DEKU, // Moon Deku Trial
- /* 0x2B */ SCENE_22DEKUCITY, // Deku Palace
- /* 0x2C */ SCENE_KAJIYA, // Mountain Smithy
- /* 0x2D */ SCENE_00KEIKOKU, // Termina Field
- /* 0x2E */ SCENE_POSTHOUSE, // Post Office
- /* 0x2F */ SCENE_LABO, // Marine Research Lab
- /* 0x30 */ SCENE_DANPEI2TEST, // Beneath the Graveyard (Day 3) and Dampe's House
- /* 0x31 */ SCENE_UNSET_31,
- /* 0x32 */ SCENE_16GORON_HOUSE, // Goron Shrine
- /* 0x33 */ SCENE_33ZORACITY, // Zora Hall
- /* 0x34 */ SCENE_8ITEMSHOP, // Trading Post
- /* 0x35 */ SCENE_F01, // Romani Ranch
- /* 0x36 */ SCENE_INISIE_BS, // Twinmold's Lair
- /* 0x37 */ SCENE_30GYOSON, // Great Bay Coast
- /* 0x38 */ SCENE_31MISAKI, // Zora Cape
- /* 0x39 */ SCENE_TAKARAKUJI, // Lottery Shop
- /* 0x3A */ SCENE_UNSET_3A,
- /* 0x3B */ SCENE_TORIDE, // Pirates' Fortress Moat
- /* 0x3C */ SCENE_FISHERMAN, // Fisherman's Hut
- /* 0x3D */ SCENE_GORONSHOP, // Goron Shop
- /* 0x3E */ SCENE_DEKU_KING, // Deku King's Chamber
- /* 0x3F */ SCENE_LAST_GORON, // Moon Goron Trial
- /* 0x40 */ SCENE_24KEMONOMITI, // Road to Southern Swamp
- /* 0x41 */ SCENE_F01_B, // Doggy Racetrack
- /* 0x42 */ SCENE_F01C, // Cucco Shack
- /* 0x43 */ SCENE_BOTI, // Ikana Graveyard
- /* 0x44 */ SCENE_HAKUGIN_BS, // Goht's Lair
- /* 0x45 */ SCENE_20SICHITAI, // Southern Swamp (poison)
- /* 0x46 */ SCENE_21MITURINMAE, // Woodfall
- /* 0x47 */ SCENE_LAST_ZORA, // Moon Zora Trial
- /* 0x48 */ SCENE_11GORONNOSATO2, // Goron Village (spring)
- /* 0x49 */ SCENE_SEA, // Great Bay Temple
- /* 0x4A */ SCENE_35TAKI, // Waterfall Rapids
- /* 0x4B */ SCENE_REDEAD, // Beneath the Well
- /* 0x4C */ SCENE_BANDROOM, // Zora Hall Rooms
- /* 0x4D */ SCENE_11GORONNOSATO, // Goron Village (winter)
- /* 0x4E */ SCENE_GORON_HAKA, // Goron Graveyard
- /* 0x4F */ SCENE_SECOM, // Sakon's Hideout
- /* 0x50 */ SCENE_10YUKIYAMANOMURA, // Mountain Village (winter)
- /* 0x51 */ SCENE_TOUGITES, // Ghost Hut
- /* 0x52 */ SCENE_DANPEI, // Deku Shrine
- /* 0x53 */ SCENE_IKANAMAE, // Road to Ikana
- /* 0x54 */ SCENE_DOUJOU, // Swordsman's School
- /* 0x55 */ SCENE_MUSICHOUSE, // Music Box House
- /* 0x56 */ SCENE_IKNINSIDE, // Igos du Ikana's Lair
- /* 0x57 */ SCENE_MAP_SHOP, // Tourist Information
- /* 0x58 */ SCENE_F40, // Stone Tower
- /* 0x59 */ SCENE_F41, // Inverted Stone Tower
- /* 0x5A */ SCENE_10YUKIYAMANOMURA2, // Mountain Village (spring)
- /* 0x5B */ SCENE_14YUKIDAMANOMITI, // Path to Snowhead
- /* 0x5C */ SCENE_12HAKUGINMAE, // Snowhead
- /* 0x5D */ SCENE_17SETUGEN, // Path to Goron Village (winter)
- /* 0x5E */ SCENE_17SETUGEN2, // Path to Goron Village (spring)
- /* 0x5F */ SCENE_SEA_BS, // Gyorg's Lair
- /* 0x60 */ SCENE_RANDOM, // Secret Shrine
- /* 0x61 */ SCENE_YADOYA, // Stock Pot Inn
- /* 0x62 */ SCENE_KONPEKI_ENT, // Great Bay Cutscene
- /* 0x63 */ SCENE_INSIDETOWER, // Clock Tower Interior
- /* 0x64 */ SCENE_26SARUNOMORI, // Woods of Mystery
- /* 0x65 */ SCENE_LOST_WOODS, // Lost Woods (Intro)
- /* 0x66 */ SCENE_LAST_LINK, // Moon Link Trial
- /* 0x67 */ SCENE_SOUGEN, // The Moon
- /* 0x68 */ SCENE_BOMYA, // Bomb Shop
- /* 0x69 */ SCENE_KYOJINNOMA, // Giants' Chamber
- /* 0x6A */ SCENE_KOEPONARACE, // Gorman Track
- /* 0x6B */ SCENE_GORONRACE, // Goron Racetrack
- /* 0x6C */ SCENE_TOWN, // East Clock Town
- /* 0x6D */ SCENE_ICHIBA, // West Clock Town
- /* 0x6E */ SCENE_BACKTOWN, // North Clock Town
- /* 0x6F */ SCENE_CLOCKTOWER, // South Clock Town
- /* 0x70 */ SCENE_ALLEY, // Laundry Pool
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, _restrictionFlags, _persistentCycleFlags) enumValue,
+#define DEFINE_SCENE_UNSET(enumValue) enumValue,
+
+typedef enum SceneId {
+ #include "tables/scene_table.h"
/* 0x71 */ SCENE_MAX
} SceneId;
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
typedef enum {
/* 0x00 */ ENTR_SCENE_MAYORS_RESIDENCE,
/* 0x01 */ ENTR_SCENE_MAJORAS_LAIR,
diff --git a/spec b/spec
index 9bfbc750c..12fce05ce 100644
--- a/spec
+++ b/spec
@@ -325,7 +325,8 @@ beginseg
name "icon_item_vtx_static"
compress
romalign 0x1000
- include "build/baserom/icon_item_vtx_static.o"
+ include "build/assets/interface/icon_item_vtx_static/icon_item_vtx_static.o"
+ number 11
endseg
beginseg
@@ -473,7 +474,6 @@ beginseg
include "build/src/code/z_fireobj.o"
include "build/src/code/z_game_dlftbls.o"
include "build/src/code/z_horse.o"
- include "build/data/code/z_horse.data.o"
include "build/src/code/z_jpeg.o"
include "build/src/code/z_kaleido_setup.o"
include "build/src/code/z_kanfont.o"
@@ -522,8 +522,7 @@ beginseg
include "build/src/code/z_rumble.o"
include "build/src/code/z_view.o"
include "build/src/code/z_vimode.o"
- include "build/src/code/code_80140CE0.o"
- include "build/data/code/code_80140CE0.data.o"
+ include "build/src/code/z_viscvg.o"
include "build/src/code/code_80140E80.o"
include "build/src/code/z_vismono.o"
include "build/src/code/z_viszbuf.o"
@@ -573,7 +572,6 @@ beginseg
include "build/data/code/speed_meter.bss.o"
include "build/src/code/su_mtx.o"
include "build/src/code/sys_cfb.o"
- include "build/data/code/sys_cfb.bss.o"
include "build/src/code/sys_cmpdma.o"
include "build/src/code/sys_initial_check.o"
include "build/src/code/sys_math.o"
@@ -589,7 +587,6 @@ beginseg
include "build/src/code/c_keyframe.o"
include "build/src/code/sys_slowly.o"
include "build/src/code/sys_flashrom.o"
- include "build/data/code/sys_flashrom.bss.o"
include "build/asm/code/code_80185F90.text.o" // handwritten
include "build/src/libultra/flash/osFlash.o"
pad_text
@@ -692,8 +689,7 @@ beginseg
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.bss.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.reloc.o"
+ include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/ovl_kaleido_scope_reloc.o"
endseg
beginseg
@@ -1030,8 +1026,7 @@ beginseg
name "ovl_Bg_Keikoku_Spr"
compress
include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.data.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr_reloc.o"
endseg
beginseg
@@ -1122,11 +1117,7 @@ beginseg
name "ovl_Object_Kankyo"
compress
include "build/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_Object_Kankyo/ovl_Object_Kankyo_reloc.o"
-#else
- include "build/data/ovl_Object_Kankyo/ovl_Object_Kankyo.reloc.o"
-#endif
endseg
beginseg
@@ -1526,11 +1517,7 @@ beginseg
name "ovl_En_Kanban"
compress
include "build/src/overlays/actors/ovl_En_Kanban/z_en_kanban.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Kanban/ovl_En_Kanban_reloc.o"
-#else
- include "build/data/ovl_En_Kanban/ovl_En_Kanban.reloc.o"
-#endif
endseg
beginseg
@@ -1650,9 +1637,7 @@ beginseg
name "ovl_Bg_F40_Swlift"
compress
include "build/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.data.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.bss.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift_reloc.o"
endseg
beginseg
@@ -2415,11 +2400,7 @@ beginseg
name "ovl_En_Go"
compress
include "build/src/overlays/actors/ovl_En_Go/z_en_go.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Go/ovl_En_Go_reloc.o"
-#else
- include "build/data/ovl_En_Go/ovl_En_Go.reloc.o"
-#endif
endseg
beginseg
@@ -3198,8 +3179,7 @@ beginseg
name "ovl_fbdemo_wipe3"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.data.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3_reloc.o"
endseg
beginseg
@@ -4856,8 +4836,7 @@ beginseg
name "ovl_Demo_Moonend"
compress
include "build/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.data.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.reloc.o"
+ include "build/src/overlays/actors/ovl_Demo_Moonend/ovl_Demo_Moonend_reloc.o"
endseg
beginseg
diff --git a/src/boot_O2/padutils.c b/src/boot_O2/padutils.c
index 95f1dfa3b..accd09e11 100644
--- a/src/boot_O2/padutils.c
+++ b/src/boot_O2/padutils.c
@@ -66,11 +66,10 @@ s8 PadUtils_GetRelY(Input* input) {
}
void PadUtils_UpdateRelXY(Input* input) {
- s32 curX, curY;
- s32 relX, relY;
-
- curX = PadUtils_GetCurX(input);
- curY = PadUtils_GetCurY(input);
+ s32 curX = PadUtils_GetCurX(input);
+ s32 curY = PadUtils_GetCurY(input);
+ s32 relX;
+ s32 relY;
if (curX > 7) {
relX = (curX < 0x43) ? curX - 7 : 0x43 - 7;
diff --git a/src/boot_O2_g3/CIC6105.c b/src/boot_O2_g3/CIC6105.c
index 4745ad5c8..78eed1a77 100644
--- a/src/boot_O2_g3/CIC6105.c
+++ b/src/boot_O2_g3/CIC6105.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
UNK_TYPE4 D_8009BE30;
diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c
index 6e1656170..eb190859e 100644
--- a/src/boot_O2_g3/fault.c
+++ b/src/boot_O2_g3/fault.c
@@ -447,7 +447,7 @@ void osSyncPrintfThreadContext(OSThread* t) {
OSThread* Fault_FindFaultedThread() {
OSThread* iter = __osGetActiveQueue();
while (iter->priority != -1) {
- if (iter->priority > 0 && iter->priority < 0x7F && (iter->flags & 3)) {
+ if ((iter->priority > 0) && (iter->priority < 0x7F) && (iter->flags & 3)) {
return iter;
}
iter = iter->tlnext;
diff --git a/src/boot_O2_g3/fault_drawer.c b/src/boot_O2_g3/fault_drawer.c
index 8efc930ec..f694be8aa 100644
--- a/src/boot_O2_g3/fault_drawer.c
+++ b/src/boot_O2_g3/fault_drawer.c
@@ -57,7 +57,7 @@ void FaultDrawer_DrawRecImpl(s32 xStart, s32 yStart, s32 xEnd, s32 yEnd, u16 col
s32 xSize = xEnd - xStart + 1;
s32 ySize = yEnd - yStart + 1;
- if (xDiff > 0 && yDiff > 0) {
+ if ((xDiff > 0) && (yDiff > 0)) {
if (xDiff < xSize) {
xSize = xDiff;
}
@@ -127,11 +127,11 @@ void FaultDrawer_UpdatePrintColor() {
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf(VT_RST);
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->foreColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("3%d"), idx);
}
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->backColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("4%d"), idx);
}
}
@@ -180,7 +180,7 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
for (; count != 0; count--, str++) {
if (sFaultDrawContext->escCode) {
sFaultDrawContext->escCode = false;
- if (*str >= '1' && *str <= '9') {
+ if ((*str >= '1') && (*str <= '9')) {
FaultDrawer_SetForeColor(sFaultDrawContext->printColors[*str - '0']);
}
} else {
@@ -192,9 +192,11 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
sFaultDrawContext->cursorX = sFaultDrawContext->w;
break;
+
case '\x1A':
sFaultDrawContext->escCode = true;
break;
+
default:
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf("%c", *str);
diff --git a/src/boot_O2_g3/yaz0.c b/src/boot_O2_g3/yaz0.c
index 3517b97ae..aa7ecdfe1 100644
--- a/src/boot_O2_g3/yaz0.c
+++ b/src/boot_O2_g3/yaz0.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
u8 sYaz0DataBuffer[0x400];
diff --git a/src/code/code_80140CE0.c b/src/code/code_80140CE0.c
deleted file mode 100644
index f3d487fab..000000000
--- a/src/code/code_80140CE0.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D10.s")
diff --git a/src/code/game.c b/src/code/game.c
index bc8b9e39f..c98241177 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -31,7 +31,7 @@ void GameState_SetFBFilter(Gfx** gfx, void* zbuffer) {
D_801F8010.color.g = R_FB_FILTER_PRIM_COLOR(1);
D_801F8010.color.b = R_FB_FILTER_PRIM_COLOR(2);
D_801F8010.color.a = R_FB_FILTER_A;
- func_80140D10(&D_801F8010, &dlist, zbuffer);
+ VisCvg_Draw(&D_801F8010, &dlist);
} else if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) {
sVisZbuf.useRgba = (R_FB_FILTER_TYPE == 6);
sVisZbuf.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
@@ -194,7 +194,7 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
gameState->main = NULL;
gameState->destroy = NULL;
gameState->running = 1;
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -210,10 +210,10 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
init(gameState);
- func_80140CE0(&D_801F8010);
+ VisCvg_Init(&D_801F8010);
VisZbuf_Init(&sVisZbuf);
VisMono_Init(&sMonoColors);
- func_80140898(&D_801F8048);
+ ViMode_Init(&D_801F8048);
func_801773A0(&D_801F7FF0);
Rumble_Init();
@@ -232,10 +232,10 @@ void GameState_Destroy(GameState* gameState) {
Rumble_Destroy();
func_801773C4(&D_801F7FF0);
- func_80140D04(&D_801F8010);
+ VisCvg_Destroy(&D_801F8010);
VisZbuf_Destroy(&sVisZbuf);
VisMono_Destroy(&sMonoColors);
- func_80140900(&D_801F8048);
+ ViMode_Destroy(&D_801F8048);
THA_Destroy(&gameState->heap);
GameAlloc_Cleanup(&gameState->alloc);
}
diff --git a/src/code/graph.c b/src/code/graph.c
index 59ba03a09..bf9067b69 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -16,12 +16,12 @@ OSTime sGraphTaskStartTime;
void Graph_FaultClient(void) {
FaultDrawer_DrawText(30, 100, "ShowFrameBuffer PAGE 0/1");
- osViSwapBuffer(SysCfb_GetFbPtr(0));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(0));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
Fault_WaitForInput();
- osViSwapBuffer(SysCfb_GetFbPtr(1));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(1));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
}
@@ -50,7 +50,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) {
gfxCtx->workBuffer = pool->workBuffer;
gfxCtx->debugBuffer = pool->debugBuffer;
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gSegments[0x0F] = gfxCtx->curFrameBuffer;
gfxCtx->zbuffer = SysCfb_GetZBuffer();
@@ -179,7 +179,7 @@ retry:
task->dramStack = (u64*)gGfxSPTaskStack;
task->dramStackSize = sizeof(gGfxSPTaskStack);
task->outputBuff = gGfxSPTaskOutputBufferPtr;
- task->outputBuffSize = gGfxSPTaskOutputBufferSize;
+ task->outputBuffSize = gGfxSPTaskOutputBufferEnd;
task->dataPtr = (u64*)gGfxMasterDL;
task->dataSize = 0;
task->yieldDataPtr = (u64*)gGfxSPTaskYieldBuffer;
@@ -340,18 +340,19 @@ void Graph_ThreadEntry(void* arg) {
u32 size;
s32 pad[2];
- gZBuffer = SystemArena_Malloc(sizeof(*gZBuffer) + sizeof(*gWorkBuffer) + 64 - 1);
- gZBuffer = (void*)ALIGN64((u32)gZBuffer);
+ gZBufferLoRes = SystemArena_Malloc(sizeof(*gZBufferLoRes) + sizeof(*gWorkBufferLoRes) + 64 - 1);
+ gZBufferLoRes = (void*)ALIGN64((u32)gZBufferLoRes);
- gWorkBuffer = (void*)((u8*)gZBuffer + sizeof(*gZBuffer));
+ gWorkBufferLoRes = (void*)((u8*)gZBufferLoRes + sizeof(*gZBufferLoRes));
- gGfxSPTaskOutputBuffer2 = gGfxSPTaskOutputBuffer = SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBuffer));
+ gGfxSPTaskOutputBufferHiRes = gGfxSPTaskOutputBufferLoRes =
+ SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBufferLoRes));
- gGfxSPTaskOutputBufferEnd = (u8*)gGfxSPTaskOutputBuffer + sizeof(*gGfxSPTaskOutputBuffer);
- gGfxSPTaskOutputBufferEnd2 = (u8*)gGfxSPTaskOutputBuffer2 + sizeof(*gGfxSPTaskOutputBuffer2);
+ gGfxSPTaskOutputBufferEndLoRes = (u8*)gGfxSPTaskOutputBufferLoRes + sizeof(*gGfxSPTaskOutputBufferLoRes);
+ gGfxSPTaskOutputBufferEndHiRes = (u8*)gGfxSPTaskOutputBufferHiRes + sizeof(*gGfxSPTaskOutputBufferHiRes);
- func_80178978();
- Fault_SetFB((void*)D_801FBB90, SCREEN_WIDTH, SCREEN_HEIGHT);
+ SysCfb_Init();
+ Fault_SetFB(gWorkBuffer, SCREEN_WIDTH, SCREEN_HEIGHT);
Graph_Init(&gfxCtx);
while (nextOvl) {
diff --git a/src/code/sched.c b/src/code/sched.c
index c2630677c..9e2016833 100644
--- a/src/code/sched.c
+++ b/src/code/sched.c
@@ -396,7 +396,7 @@ void Sched_HandleRetrace(SchedContext* sched) {
if (sched->curBuf->updateRate2 > 0) {
sched->curBuf->updateRate2--;
}
- if (sched->curBuf->updateRate2 <= 0 && sched->pendingSwapBuf1 != NULL) {
+ if ((sched->curBuf->updateRate2 <= 0) && (sched->pendingSwapBuf1 != NULL)) {
Sched_RetraceUpdateFramebuffer(sched, sched->pendingSwapBuf1);
}
}
diff --git a/src/code/sys_cfb.c b/src/code/sys_cfb.c
index 25d92227c..29d6e39c4 100644
--- a/src/code/sys_cfb.c
+++ b/src/code/sys_cfb.c
@@ -1,21 +1,129 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178750.s")
+extern u16 gFramebufferHiRes0[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
+extern u16 gFramebufferHiRes1[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178818.s")
+OSViMode sNotebookViMode; // placeholder name
+void* gFramebuffers[2];
+OSViMode* gActiveViMode;
+u16* gZBufferPtr;
+void* gWorkBuffer;
+u64* gGfxSPTaskOutputBufferPtr;
+void* gGfxSPTaskOutputBufferEnd;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178978.s")
+void* sCfbLoRes1;
+void* sCfbLoRes0;
+u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndLoRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_801789D4.s")
+void* sCfbHiRes1;
+void* sCfbHiRes0;
+u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndHiRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetFbPtr.s")
+s16 gCfbWidth;
+s16 gCfbHeight;
+s16 gCfbLeftAdjust;
+s16 gCfbUpperAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetZBuffer.s")
+u8 gSysCfbHiResEnabled;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A24.s")
+void SysCfb_SetLoResMode(void) {
+ gFramebuffers[1] = sCfbLoRes1;
+ gFramebuffers[0] = sCfbLoRes0;
+ gZBufferPtr = *gZBufferLoRes;
+ gWorkBuffer = gWorkBufferLoRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferLoRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndLoRes;
+ gCfbWidth = SCREEN_WIDTH;
+ gCfbHeight = SCREEN_HEIGHT;
+ gCfbLeftAdjust = 0;
+ gCfbUpperAdjust = 0;
+ gSysCfbHiResEnabled = false;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ gActiveViMode = &osViModeNtscLan1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A34.s")
+void SysCfb_SetHiResMode(void) {
+ gFramebuffers[1] = sCfbHiRes1;
+ gFramebuffers[0] = sCfbHiRes0;
+ gZBufferPtr = *gZBufferHiRes;
+ gWorkBuffer = gWorkBufferHiRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferHiRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndHiRes;
+ if (1) {}
+ gCfbWidth = HIRES_BUFFER_WIDTH;
+ gCfbHeight = HIRES_BUFFER_HEIGHT;
+ gCfbLeftAdjust = 30;
+ gCfbUpperAdjust = 10;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ if ((gCfbWidth == SCREEN_WIDTH_HIRES) && (gCfbHeight == SCREEN_HEIGHT_HIRES)) {
+ gActiveViMode = &osViModeNtscHpf1;
+ } else {
+ s32 rightAdjust;
+ s32 lowerAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A94.s")
+ //! FAKE:
+ l1:
+ rightAdjust = gCfbWidth - 610;
+ lowerAdjust = gCfbHeight - 470;
+ ViMode_Configure(&sNotebookViMode, -1, osTvType, 0, 1, 0, 1, gCfbWidth, gCfbHeight, 30, rightAdjust, 10,
+ lowerAdjust);
+ gActiveViMode = &sNotebookViMode;
+ }
+ gSysCfbHiResEnabled = true;
+}
+
+void SysCfb_Init(void) {
+ sCfbLoRes1 = gFramebuffer1;
+ sCfbLoRes0 = gFramebuffer0;
+ sCfbHiRes1 = gFramebufferHiRes1;
+ sCfbHiRes0 = gFramebufferHiRes0;
+ SysCfb_SetLoResMode();
+}
+
+// Unused
+void SysCfb_Reset(void) {
+ gFramebuffers[0] = NULL;
+ gFramebuffers[1] = NULL;
+}
+
+void* SysCfb_GetFramebuffer(s32 index) {
+ if (index < 2) {
+ return gFramebuffers[index];
+ }
+ return NULL;
+}
+
+void* SysCfb_GetZBuffer(void) {
+ return gZBufferPtr;
+}
+
+void* SysCfb_GetWorkBuffer(void) {
+ return gWorkBuffer;
+}
+
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y) {
+ u16* zBuff = SysCfb_GetZBuffer();
+ u16 val;
+
+ if (zBuff != NULL) {
+ val = (&zBuff[x])[y * gCfbWidth];
+ } else {
+ val = 0;
+ }
+ return val;
+}
+
+s32 SysCfb_GetZBufferInt(s32 x, s32 y) {
+ return Environment_ZBufValToFixedPoint(SysCfb_GetZBufferPixel(x, y) << 2) >> 3;
+}
diff --git a/src/code/sys_flashrom.c b/src/code/sys_flashrom.c
index 0db0b8744..c2665741e 100644
--- a/src/code/sys_flashrom.c
+++ b/src/code/sys_flashrom.c
@@ -1,44 +1,253 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
#include "stackcheck.h"
#include "system_malloc.h"
-// extern UNK_TYPE1 D_801FBE10;
-// extern UNK_TYPE1 D_801FBE28;
-// extern UNK_TYPE1 D_801FBE2C;
-// extern UNK_TYPE4 D_801FBE30;
-extern STACK(sSysFlashromStack, 0x1000);
-extern StackEntry sSysFlashromStackInfo;
-extern OSThread sSysFlashromThread;
-extern s80185D40 D_801FD008;
-extern OSMesg D_801FD034[1];
+OSMesgQueue sFlashromMesgQueue;
+OSMesg sFlashromMesg[1];
+s32 sFlashromIsInit;
+s32 sFlashromVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s")
+STACK(sSysFlashromStack, 0x1000);
+StackEntry sSysFlashromStackInfo;
+OSThread sSysFlashromThread;
+FlashromRequest sFlashromRequest;
+OSMesg sSysFlashromMsgBuf[1];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857D0.s")
+s32 SysFlashrom_IsInit(void) {
+ return sFlashromIsInit;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185864.s")
+const char* SysFlashrom_GetVendorStr(void) {
+ switch (sFlashromVendor) {
+ case FLASH_VERSION_MX_PROTO_A:
+ return "PROTO A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185908.s")
+ case FLASH_VERSION_MX_A:
+ return "A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185968.s")
+ case FLASH_VERSION_MX_C:
+ return "C";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801859F0.s")
+ case FLASH_VERSION_MEI:
+ return "D(NEW)";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185A2C.s")
+ case FLASH_VERSION_MX_B_AND_D:
+ return "B or D";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185B1C.s")
+ default:
+ return "UNKNOWN";
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185BE4.s")
+s32 SysFlashrom_CheckFlashType(void) {
+ u32 flashType;
+ u32 flashVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185C24.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osFlashReadId(&flashType, &flashVendor);
+ sFlashromVendor = flashVendor;
+ if (flashType == FLASH_TYPE_MAGIC) {
+ if ((flashVendor == FLASH_VERSION_MX_PROTO_A) || (flashVendor == FLASH_VERSION_MX_A) ||
+ (flashVendor == FLASH_VERSION_MX_C) || (flashVendor == FLASH_VERSION_MEI) ||
+ (flashVendor == FLASH_VERSION_MX_B_AND_D)) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s")
+s32 SysFlashrom_InitFlash(void) {
+ osCreateMesgQueue(&sFlashromMesgQueue, sFlashromMesg, ARRAY_COUNT(sFlashromMesg));
+ osFlashInit();
+ sFlashromIsInit = true;
+ if (SysFlashrom_CheckFlashType() != 0) {
+ sFlashromIsInit = false;
+ return -1;
+ }
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185DDC.s")
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185EC4.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osInvalDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ osFlashReadArray(&msg, OS_MESG_PRI_NORMAL, pageNum, addr, pageCount, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F04.s")
+s32 SysFlashrom_EraseSector(u32 page) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return osFlashSectorErase(page);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F64.s")
+s32 SysFlashrom_ExecWrite(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
+ s32 result;
+ u32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ // Ensure the page is always aligned to a sector boundary.
+ if ((pageNum % FLASH_PAGE_SIZE) != 0) {
+ Fault_AddHungupAndCrash("../sys_flashrom.c", 275);
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ for (i = 0; i < pageCount; i++) {
+ osFlashWriteBuffer(&msg, OS_MESG_PRI_NORMAL, (u8*)addr + i * FLASH_PAGE_SIZE, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ result = osFlashWriteArray(i + pageNum);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return 0;
+}
+
+s32 SysFlashrom_AttemptWrite(void* addr, u32 pageNum, u32 pageCount) {
+ s32 result;
+ s32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ i = 0;
+failRetry:
+ result = SysFlashrom_EraseSector(pageNum);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ result = SysFlashrom_ExecWrite(addr, pageNum, pageCount);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ return 0;
+}
+
+// Flash bits can only by flipped with a write from 1 -> 0. Going from 0 -> 1 requires an erasure.
+// This function will try to determine if any sectors need to be erased before writing saving erase cycles.
+s32 SysFlashrom_NeedsToErase(void* data, void* addr, u32 pageCount) {
+ u32 size;
+ u32 i;
+
+ for (i = 0; i < pageCount * FLASH_PAGE_SIZE; i += 4) {
+ if ((*(s32*)data & *(s32*)addr) != *(s32*)addr) {
+ return false;
+ }
+ }
+ return true;
+}
+
+s32 SysFlashrom_WriteData(void* addr, u32 pageNum, u32 pageCount) {
+ void* data;
+ size_t size;
+ s32 ret;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ size = pageCount * FLASH_PAGE_SIZE;
+ data = SystemArena_Malloc(size);
+ if (data == NULL) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ // Will always erase the sector even if it wouldn't normally need to.
+ if (SysFlashrom_NeedsToErase(data, addr, pageCount)) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ }
+ if (ret == 0) {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ ret = -1;
+ }
+ }
+ }
+ SystemArena_Free(data);
+ }
+ return ret;
+}
+
+void SysFlashrom_ThreadEntry(void* arg) {
+ FlashromRequest* req = (FlashromRequest*)arg;
+
+ switch (req->requestType) {
+ case FLASHROM_REQUEST_WRITE:
+ req->response = SysFlashrom_WriteData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+
+ case FLASHROM_REQUEST_READ:
+ req->response = SysFlashrom_ReadData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+ }
+}
+
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount) {
+ FlashromRequest* req = &sFlashromRequest;
+ if (SysFlashrom_IsInit()) {
+ req->requestType = FLASHROM_REQUEST_WRITE;
+ req->addr = addr;
+ req->pageNum = pageNum;
+ req->pageCount = pageCount;
+ osCreateMesgQueue(&req->messageQueue, sSysFlashromMsgBuf, ARRAY_COUNT(sSysFlashromMsgBuf));
+ StackCheck_Init(&sSysFlashromStackInfo, sSysFlashromStack, STACK_TOP(sSysFlashromStack), 0, 0x100,
+ "sys_flashrom");
+ osCreateThread(&sSysFlashromThread, Z_THREAD_ID_FLASHROM, SysFlashrom_ThreadEntry, req,
+ STACK_TOP(sSysFlashromStack), Z_PRIORITY_FLASHROM);
+ osStartThread(&sSysFlashromThread);
+ }
+}
+
+s32 SysFlashrom_IsBusy(void) {
+ OSMesgQueue* queue = &sFlashromRequest.messageQueue;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return MQ_IS_FULL(queue);
+}
+
+s32 SysFlashrom_AwaitResult(void) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osRecvMesg(&sFlashromRequest.messageQueue, NULL, OS_MESG_BLOCK);
+ osDestroyThread(&sSysFlashromThread);
+ StackCheck_Cleanup(&sSysFlashromStackInfo);
+ return sFlashromRequest.response;
+}
+
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount) {
+ SysFlashrom_WriteDataAsync(addr, pageNum, pageCount);
+ SysFlashrom_AwaitResult();
+}
diff --git a/src/code/title_setup.c b/src/code/title_setup.c
index 84ae58c07..16953101f 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -48,7 +48,7 @@ void Setup_SetRegs(void) {
}
void Setup_InitImpl(SetupState* this) {
- func_80185908();
+ SysFlashrom_InitFlash();
SaveContext_Init();
Setup_SetRegs();
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index e86a341fd..c7e2c4574 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -4,6 +4,7 @@
*/
#include "global.h"
+#include "z64horse.h"
#include "z64load.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -694,7 +695,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
* Tests if current scene switch flag is set.
*/
s32 Flags_GetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -704,7 +705,7 @@ s32 Flags_GetSwitch(PlayState* play, s32 flag) {
* Sets current scene switch flag.
*/
void Flags_SetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -713,7 +714,7 @@ void Flags_SetSwitch(PlayState* play, s32 flag) {
* Unsets current scene switch flag.
*/
void Flags_UnsetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] &= ~(1 << (flag & 0x1F));
}
}
@@ -792,7 +793,7 @@ void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) {
* Tests if current scene collectible flag is set.
*/
s32 Flags_GetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -802,7 +803,7 @@ s32 Flags_GetCollectible(PlayState* play, s32 flag) {
* Sets current scene collectible flag.
*/
void Flags_SetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -849,17 +850,12 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
if (titleCtx->alpha != 0) {
s32 width = titleCtx->width;
s32 height = titleCtx->height;
- s32 unk1;
- s32 spC0;
- s32 sp38;
- s32 spB8;
- s32 spB4;
- s32 temp;
-
- temp = width * 2;
- spC0 = (titleCtx->x * 4) - temp;
- spB8 = (titleCtx->y * 4) - (height * 2);
- sp38 = width * 2;
+ s32 doubleWidth = width * 2;
+ s32 titleX = (titleCtx->x * 4) - doubleWidth;
+ s32 doubleHeight = height * 2;
+ s32 titleY = (titleCtx->y * 4) - doubleHeight;
+ s32 titleSecondY;
+ s32 textureLanguageOffset;
OPEN_DISPS(gameState->gfxCtx);
@@ -867,29 +863,30 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
height = TMEM_SIZE / width;
}
- spB4 = spB8 + (height * 4);
+ titleSecondY = titleY + (height * 4);
OVERLAY_DISP = Gfx_SetupDL52_NoCD(OVERLAY_DISP);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32*)titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
+ gDPLoadTextureBlock(OVERLAY_DISP++, titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB8, ((sp38 * 2) + spC0) - 4, spB8 + (height * 4) - 1,
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
height = titleCtx->height - height;
+ // If texture is bigger than 0x1000, display the rest
if (height > 0) {
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
+ gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB4, ((sp38 * 2) + spC0) - 4, spB4 + (height * 4) - 1,
- G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
+ titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
CLOSE_DISPS(gameState->gfxCtx);
@@ -1361,8 +1358,8 @@ s32 func_800B7200(Player* player) {
return (player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) || (player->csMode != PLAYER_CSMODE_0);
}
-void func_800B722C(GameState* gameState, Player* player) {
- func_800F40A0(gameState, player);
+void Actor_SpawnHorse(PlayState* play, Player* player) {
+ Horse_Spawn(play, player);
}
s32 func_800B724C(PlayState* play, Actor* actor, u8 csMode) {
@@ -2308,7 +2305,7 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
Actor_TargetContextInit(&actorCtx->targetContext, actorCtx->actorLists[ACTORCAT_PLAYER].first, play);
Actor_InitHalfDaysBit(actorCtx);
Fault_AddClient(&sActorFaultClient, (void*)Actor_PrintLists, actorCtx, NULL);
- func_800B722C(&play->state, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
+ Actor_SpawnHorse(play, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
}
/**
@@ -2709,7 +2706,7 @@ void Actor_DrawLensActors(PlayState* play, s32 numLensActors, Actor** lensActors
spA4 = play->unk_18E68;
if (dbgVar2) {
- PreRender_SetValues(&play->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, zbuffer);
+ PreRender_SetValues(&play->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, zbuffer);
gfxTemp = gfx;
func_80170200(&play->pauseBgPreRender, &gfxTemp, zbuffer, spA4);
@@ -3271,12 +3268,12 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
for (i = 0; i < numTransitionActors; transitionActorList++, i++) {
if (transitionActorList->id >= 0) {
- if ((transitionActorList->sides[0].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[0].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[0].room)) ||
- (transitionActorList->sides[1].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[1].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[1].room))) {
+ if (((transitionActorList->sides[0].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[0].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[0].room))) ||
+ ((transitionActorList->sides[1].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[1].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[1].room)))) {
s16 rotY = DEG_TO_BINANG((transitionActorList->rotY >> 7) & 0x1FF);
if (Actor_SpawnAsChildAndCutscene(actorCtx, play, transitionActorList->id & 0x1FFF,
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index 2fc1852ab..e30dec5d5 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -1920,12 +1920,14 @@ s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResul
s32 bgId;
f32 temp_f0_2;
f32 f32temp;
- f32 nx2, nz2;
+ f32 nx2;
+ f32 nz2;
Vec3f checkLineNext;
Vec3f checkLinePrev;
f32 n2XZDist;
f32 n3XZDist;
- f32 nx3, nz3;
+ f32 nx3;
+ f32 nz3;
s32 bccFlags;
Vec3f posIntersect2;
s32 bgId2;
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index 89b148942..7fac2a2b2 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -42,6 +42,7 @@
* -Y +Z -Y
*
*/
+
#include "global.h"
#include "z64quake.h"
#include "z64shrink_window.h"
@@ -6776,8 +6777,9 @@ s32 Camera_Special5(Camera* camera) {
spA4 = BINANG_SUB(focalActorPosRot->rot.y, sp6C.yaw);
sp74.r = roData->eyeDist;
rand = Rand_ZeroOne();
- sp74.yaw = BINANG_ROT180(focalActorPosRot->rot.y) +
- (s16)(spA4 < 0 ? -(s16)(0x1553 + (s16)(rand * 2730.0f)) : (s16)(0x1553 + (s16)(rand * 2730.0f)));
+ sp74.yaw =
+ BINANG_ROT180(focalActorPosRot->rot.y) +
+ (s16)((spA4 < 0) ? -(s16)(0x1553 + (s16)(rand * 2730.0f)) : (s16)(0x1553 + (s16)(rand * 2730.0f)));
sp74.pitch = roData->pitch;
OLib_AddVecGeoToVec3f(eyeNext, &spA8.pos, &sp74);
*eye = *eyeNext;
diff --git a/src/code/z_collision_btltbls.c b/src/code/z_collision_btltbls.c
index c9f014f4f..36528e467 100644
--- a/src/code/z_collision_btltbls.c
+++ b/src/code/z_collision_btltbls.c
@@ -790,7 +790,7 @@ DamageTable sDamageTablePresets[] = {
* is out of range.
*/
DamageTable* DamageTable_Get(s32 index) {
- if (index < 0 || index > ARRAY_COUNT(sDamageTablePresets) - 1) {
+ if ((index < 0) || (index >= ARRAY_COUNT(sDamageTablePresets))) {
return NULL;
}
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index da965969f..733ec4bc1 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64quake.h"
#include "z64rumble.h"
diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c
index f25273279..370ca9481 100644
--- a/src/code/z_eff_blure.c
+++ b/src/code/z_eff_blure.c
@@ -753,7 +753,7 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
j = 0;
- for (i = 0; i < this->numElements - 1; i++) {
+ for (i = 0; i < this->numElements - 1; i++, j += 4) {
if (this->drawMode == 1) {
alphaRatio = (f32)this->elements[i].timer / (f32)this->elemDuration;
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x80, this->altPrimColor.r, this->altPrimColor.g,
@@ -761,45 +761,43 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
gDPPipeSync(POLY_XLU_DISP++);
}
- if (1) {} // Necessary to match
-
gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- if (this->flags & 4) {
- sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) * 0.5f;
- sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) * 0.5f;
- sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) * 0.5f;
- sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) * 0.5f;
- sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) * 0.5f;
- sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) * 0.5f;
-
- Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
- scale = sqrtf(SQXYZ(sp198));
-
- if (fabsf(scale) > 0.0005f) {
- scale = 1.0f / scale;
- Math_Vec3f_Scale(&sp198, scale);
-
- SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
- SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
- SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
- SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
- SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
-
- mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
- if (mtx == NULL) {
- break;
- }
-
- gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
- gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- }
+ if (!(this->flags & 4)) {
+ continue;
}
- j += 4;
+ sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) / 2.0f;
+ sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) / 2.0f;
+ sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) / 2.0f;
+ sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) / 2.0f;
+ sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) / 2.0f;
+ sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) / 2.0f;
+
+ Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
+ scale = sqrtf(SQXYZ(sp198));
+
+ if (fabsf(scale) > 0.0005f) {
+ scale = 1.0f / scale;
+ Math_Vec3f_Scale(&sp198, scale);
+
+ SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
+ SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
+ SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
+ SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
+ SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
+ if (mtx == NULL) {
+ break;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
}
}
diff --git a/src/code/z_effect.c b/src/code/z_effect.c
index b4a76380e..60a98c4d9 100644
--- a/src/code/z_effect.c
+++ b/src/code/z_effect.c
@@ -187,33 +187,31 @@ void Effect_DrawAll(GraphicsContext* gfxCtx) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {
- if (gfxCtx) {}
- } // necessary to match
- if (sEffectContext.blures[i].status.active) {
- sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
}
- if (1) {} // necessary to match
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (sEffectContext.tireMarks[i].status.active) {
- sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
}
}
@@ -221,38 +219,38 @@ void Effect_UpdateAll(PlayState* play) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
- Effect_Destroy(play, i);
- }
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
+ Effect_Destroy(play, i);
}
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.blures[i].status.active) {
- if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT);
- }
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT);
}
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
- }
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
}
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.tireMarks[i].status.active) {
- if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
- }
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
}
}
}
diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c
index 775b68f01..186608729 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -273,6 +273,7 @@ void EffectSS_DrawAllParticles(PlayState* play) {
s16 func_800B096C(s16 arg0, s16 arg1, s32 arg2) {
s16 ret = (arg2 == 0) ? arg1 : arg0 + (s32)((arg1 - arg0) / (f32)arg2);
+
return ret;
}
diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c
index aec6fdbb0..e3defb402 100644
--- a/src/code/z_eventmgr.c
+++ b/src/code/z_eventmgr.c
@@ -371,7 +371,7 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
Camera* retCam;
s32 csType = 0;
- if ((csId < 0) || (sCutsceneMgr.csId != CS_ID_NONE)) {
+ if ((csId <= CS_ID_NONE) || (sCutsceneMgr.csId != CS_ID_NONE)) {
return csId;
}
@@ -437,7 +437,7 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
s16 CutsceneManager_Stop(s16 csId) {
ActorCutscene* csEntry;
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return csId;
}
@@ -468,28 +468,28 @@ ActorCutscene* CutsceneManager_GetCutsceneEntry(s16 csId) {
}
s16 CutsceneManager_GetAdditionalCsId(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return CS_ID_NONE;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->additionalCsId;
}
s16 CutsceneManager_GetLength(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->length;
}
s16 CutsceneManager_GetCutsceneScriptIndex(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->scriptIndex;
}
s16 CutsceneManager_GetCutsceneCustomValue(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->customValue;
diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c
index bc07df883..addfe6b67 100644
--- a/src/code/z_fbdemo_circle.c
+++ b/src/code/z_fbdemo_circle.c
@@ -82,8 +82,8 @@ void TransitionCircle_SetType(void* thisx, s32 type) {
void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, s32 arg3, s32 masks, s32 maskt,
f32 arg6) {
Gfx* gfx = *gfxp;
- s32 xh = D_801FBBCC;
- s32 yh = D_801FBBCE;
+ s32 xh = gCfbWidth;
+ s32 yh = gCfbHeight;
s32 width = 1 << masks;
s32 height = 1 << maskt;
f32 s;
diff --git a/src/code/z_horse.c b/src/code/z_horse.c
index 976ea2948..ac0142fae 100644
--- a/src/code/z_horse.c
+++ b/src/code/z_horse.c
@@ -1,21 +1,233 @@
#include "global.h"
+#include "z64horse.h"
+#include "overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3940.s")
+s32 Horse_GetJumpingFencePathIndex(PlayState* play) {
+ Actor* actor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F39B4.s")
+ for (actor = NULL;; actor = actor->next) {
+ actor = SubS_FindActor(play, actor, ACTORCAT_PROP, ACTOR_BG_UMAJUMP);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3A64.s")
+ if (actor == NULL) {
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B2C.s")
+ if (actor->params == BG_UMAJUMP_TYPE_2) {
+ return ((BgUmajump*)actor)->pathIndex;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B68.s")
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3C44.s")
+// unused
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4) {
+ Path* path = &play->setupPathList[pathIndex];
+ Vec3s* points;
+ s32 count = path->count;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3ED4.s")
+ dst->x = 0;
+ dst->y = 0;
+ dst->z = 0;
+ *arg4 = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F40A0.s")
+ if (count == 0) {
+ return false;
+ }
+ if (pointIndex >= count) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F415C.s")
+ points = Lib_SegmentedToVirtual(path->points);
+ points += pointIndex;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F41E4.s")
+ dst->x = points->x;
+ dst->y = points->y;
+ dst->z = points->z;
+ *arg4 = 0;
+
+ return true;
+}
+
+typedef struct HorseValidScene {
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ s16 sceneLayerMinusOne;
+} HorseValidScene; // size = 0x4
+
+HorseValidScene sHorseValidScenes[] = {
+ { SCENE_00KEIKOKU, 0 }, // Termina Field
+ { SCENE_24KEMONOMITI, 0 }, // Road to southern swap
+ { SCENE_F01, 0 }, // Romani ranch
+ { SCENE_KOEPONARACE, 0 }, // Gorman track
+ { SCENE_20SICHITAI, 0 }, // Southern swamp poisoned
+ { SCENE_20SICHITAI2, 0 }, // Souther swamp clear
+ { SCENE_30GYOSON, 0 }, // Great bay coast
+ { SCENE_31MISAKI, 0 }, // Zora cape
+ { SCENE_ROMANYMAE, 0 }, // Milk road
+ { SCENE_IKANAMAE, 0 }, // Road to Ikana
+ { SCENE_13HUBUKINOMITI, 0 }, // Path to Mountain Village
+};
+
+s32 Horse_IsValidSpawn(s16 sceneId) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidScenes); i++) {
+ if (sceneId == sHorseValidScenes[i].sceneId) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Horse_ResetHorseData(PlayState* play) {
+ gSaveContext.save.saveInfo.horseData.sceneId = SCENE_F01;
+ gSaveContext.save.saveInfo.horseData.pos.x = -1420;
+ gSaveContext.save.saveInfo.horseData.pos.y = 257;
+ gSaveContext.save.saveInfo.horseData.pos.z = -1285;
+ gSaveContext.save.saveInfo.horseData.yaw = 0x2AAA;
+}
+
+s32 gHorseIsMounted = false;
+s32 D_801BDAA0 = false;
+s32 gHorsePlayedEponasSong = false;
+
+HorseValidScene sHorseValidSceneLayers[] = {
+ { SCENE_00KEIKOKU, 5 - 1 }, // Termina Field - First Cycle
+ { SCENE_30GYOSON, 1 - 1 }, // Great Bay Coast - Post-Gyorg
+ { SCENE_31MISAKI, 1 - 1 }, // Zora Cape - Post-Gyorg
+ { SCENE_13HUBUKINOMITI, 1 - 1 }, // Path to Mountain Village - Post-Goht
+};
+
+s32 Horse_IsValidSceneLayer(PlayState* play, Player* player) {
+ s32 i;
+
+ if (gSaveContext.sceneLayer == 0) {
+ return true;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidSceneLayers); i++) {
+ if ((sHorseValidSceneLayers[i].sceneId == play->sceneId) &&
+ (gSaveContext.sceneLayer == sHorseValidSceneLayers[i].sceneLayerMinusOne + 1)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void Horse_SpawnOverworld(PlayState* play, Player* player) {
+ if (!Horse_IsValidSceneLayer(play, player)) {
+ return;
+ }
+
+ if (gHorseIsMounted && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ s32 pad;
+ Vec3f pos = player->actor.world.pos;
+ f32 yIntersect;
+ CollisionPoly* poly;
+ s32 pad2[3];
+
+ pos.y += 5.0f;
+ yIntersect = BgCheck_EntityRaycastFloor1(&play->colCtx, &poly, &pos);
+ if (yIntersect == BGCHECK_Y_MIN) {
+ yIntersect = player->actor.world.pos.y;
+ }
+
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, yIntersect,
+ player->actor.world.pos.z, player->actor.shape.rot.x, player->actor.shape.rot.y,
+ player->actor.shape.rot.z, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_11));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == gSaveContext.save.saveInfo.horseData.sceneId) && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ if (Horse_IsValidSpawn(gSaveContext.save.saveInfo.horseData.sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, gSaveContext.save.saveInfo.horseData.pos.x,
+ gSaveContext.save.saveInfo.horseData.pos.y, gSaveContext.save.saveInfo.horseData.pos.z, 0,
+ gSaveContext.save.saveInfo.horseData.yaw, 0, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else {
+ Horse_ResetHorseData(play);
+ }
+ } else if ((play->sceneId == SCENE_F01) && !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1420.0f, 257.0f, -1285.0f, 0, 0x2AAA, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && Horse_IsValidSpawn(play->sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, player->actor.world.pos.y,
+ player->actor.world.pos.z, 0, player->actor.shape.rot.y, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_2));
+ }
+}
+
+void Horse_SpawnMinigame(PlayState* play, Player* player) {
+ if ((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1262.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_13));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == SCENE_KOEPONARACE) &&
+ ((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2))) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1741.0f, -106.0f, -641.0f, 0, -0x4FA4, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if ((gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) && (Cutscene_GetSceneLayer(play) != 0) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1106.0f, 260.0f, -1185.0f, 0, 0x13, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_7));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ }
+}
+
+void Horse_Spawn(PlayState* play, Player* player) {
+ if (((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) ||
+ ((play->sceneId == SCENE_F01) && (((gSaveContext.sceneLayer == 1)) || (gSaveContext.sceneLayer == 5)) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) ||
+ ((play->sceneId == SCENE_KOEPONARACE) &&
+ (((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3)) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2)))) {
+ // Gorman Track and horse state is either STATE_START, STATE_2 or STATE_3
+ // or Romani Ranch, Player is Human and scene layer is either 1 or 5
+ Horse_SpawnMinigame(play, player);
+ } else {
+ Horse_SpawnOverworld(play, player);
+ }
+
+ D_801BDAA0 = false;
+}
+
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw) {
+ s16 yaw = Math_Vec3f_Yaw(&actor->world.pos, pos) - actor->world.rot.y;
+
+ if (yaw > turnYaw) {
+ actor->world.rot.y += turnYaw;
+ } else if (yaw < -turnYaw) {
+ actor->world.rot.y -= turnYaw;
+ } else {
+ actor->world.rot.y += yaw;
+ }
+
+ actor->shape.rot.y = actor->world.rot.y;
+}
+
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx) {
+ Actor* bgActor = actorCtx->actorLists[ACTORCAT_BG].first;
+
+ if (bgActor != NULL) {
+ while (true) {
+ if ((bgActor->update != NULL) && (bgActor->init == NULL)) {
+ if (Object_IsLoaded(&play->objectCtx, bgActor->objBankIndex)) {
+ if ((bgActor->id == ACTOR_EN_HORSE) && (((EnHorse*)bgActor)->action != ENHORSE_ACTION_INACTIVE)) {
+ return true;
+ }
+ }
+ }
+ bgActor = bgActor->next;
+ if (bgActor == NULL) {
+ break;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index 59fde2f2d..d0f757125 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -40,13 +40,13 @@ void KaleidoScopeCall_Update(PlayState* play) {
if (ShrinkWindow_Letterbox_GetSize() == 0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
}
} else if (pauseCtx->state == PAUSE_STATE_GAMEOVER_0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
} else if ((pauseCtx->state == PAUSE_STATE_OPENING_1) || (pauseCtx->state == PAUSE_STATE_GAMEOVER_1) ||
(pauseCtx->state == PAUSE_STATE_OWLWARP_1)) {
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 5f8eadc98..476084096 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -145,7 +145,7 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
- pauseCtx->pageSwitchTimer = 0;
+ pauseCtx->pageSwitchInputTimer = 0;
pauseCtx->cursorItem[PAUSE_ITEM] = PAUSE_ITEM_NONE;
pauseCtx->cursorItem[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c
index d6d38f9d6..2191498a3 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -2,7 +2,7 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5090.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F50D4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Init.s")
diff --git a/src/code/z_lights.c b/src/code/z_lights.c
index 860d04ae9..534ec6dfc 100644
--- a/src/code/z_lights.c
+++ b/src/code/z_lights.c
@@ -360,12 +360,9 @@ Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambient
lights = GRAPH_ALLOC(gfxCtx, sizeof(Lights));
- lights->l.a.l.col[0] = ambientR;
- lights->l.a.l.colc[0] = ambientR;
- lights->l.a.l.col[1] = ambientG;
- lights->l.a.l.colc[1] = ambientG;
- lights->l.a.l.col[2] = ambientB;
- lights->l.a.l.colc[2] = ambientB;
+ lights->l.a.l.col[0] = lights->l.a.l.colc[0] = ambientR;
+ lights->l.a.l.col[1] = lights->l.a.l.colc[1] = ambientG;
+ lights->l.a.l.col[2] = lights->l.a.l.colc[2] = ambientB;
lights->enablePosLights = 0;
lights->numLights = 0;
@@ -394,7 +391,7 @@ void Lights_GlowCheck(PlayState* play) {
s32 screenPosX = PROJECTED_TO_SCREEN_X(projectedPos, invW);
s32 screenPosY = PROJECTED_TO_SCREEN_Y(projectedPos, invW);
s32 wZ = (s32)((projectedPos.z * invW) * 16352.0f) + 16352;
- s32 zBuf = func_80178A94(screenPosX, screenPosY);
+ s32 zBuf = SysCfb_GetZBufferInt(screenPosX, screenPosY);
if (wZ < zBuf) {
params->drawGlow = 1;
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index 558b39a80..918c969d5 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -73,125 +73,21 @@ Input sPostmanTimerInput[MAXCONTROLLERS];
#define RESTRICTIONS_MOON RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0)
#define RESTRICTIONS_NO_DOUBLE_TIME RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0)
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, restrictionFlags, _persistentCycleFlags) \
+ { enumValue, restrictionFlags },
+
+#define DEFINE_SCENE_UNSET(enumValue) { enumValue, RESTRICTIONS_NONE },
+
RestrictionFlags sRestrictionFlags[] = {
- { SCENE_20SICHITAI2, RESTRICTIONS_NONE },
- { SCENE_UNSET_1, RESTRICTIONS_NONE },
- { SCENE_UNSET_2, RESTRICTIONS_NONE },
- { SCENE_UNSET_3, RESTRICTIONS_NONE },
- { SCENE_UNSET_4, RESTRICTIONS_NONE },
- { SCENE_UNSET_5, RESTRICTIONS_NONE },
- { SCENE_UNSET_6, RESTRICTIONS_NONE },
- { SCENE_KAKUSIANA, RESTRICTIONS_NONE },
- { SCENE_SPOT00, RESTRICTIONS_NONE },
- { SCENE_UNSET_9, RESTRICTIONS_NONE },
- { SCENE_WITCH_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_LAST_BS, RESTRICTIONS_MOON },
- { SCENE_HAKASHITA, RESTRICTIONS_NONE },
- { SCENE_AYASHIISHOP, RESTRICTIONS_INDOORS },
- { SCENE_UNSET_E, RESTRICTIONS_NONE },
- { SCENE_UNSET_F, RESTRICTIONS_NONE },
- { SCENE_OMOYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0) },
- { SCENE_BOWLING, RESTRICTIONS_INDOORS },
- { SCENE_SONCHONOIE, RESTRICTIONS_INDOORS },
- { SCENE_IKANA, RESTRICTIONS_NONE },
- { SCENE_KAIZOKU, RESTRICTIONS_NONE },
- { SCENE_MILK_BAR, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_N, RESTRICTIONS_NONE },
- { SCENE_TAKARAYA, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_R, RESTRICTIONS_NONE },
- { SCENE_OKUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_OPENINGDAN, RESTRICTIONS_NONE },
- { SCENE_MITURIN, RESTRICTIONS_NONE },
- { SCENE_13HUBUKINOMITI, RESTRICTIONS_NONE },
- { SCENE_CASTLE, RESTRICTIONS_NONE },
- { SCENE_DEKUTES, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1) },
- { SCENE_MITURIN_BS, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MIZU, RESTRICTIONS_INDOORS },
- { SCENE_HAKUGIN, RESTRICTIONS_NONE },
- { SCENE_ROMANYMAE, RESTRICTIONS_NONE },
- { SCENE_PIRATE, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MORI, RESTRICTIONS_INDOORS },
- { SCENE_SINKAI, RESTRICTIONS_NONE },
- { SCENE_YOUSEI_IZUMI, RESTRICTIONS_NONE },
- { SCENE_KINSTA1, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_KINDAN2, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_TENMON_DAI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0) },
- { SCENE_LAST_DEKU, RESTRICTIONS_MOON },
- { SCENE_22DEKUCITY, RESTRICTIONS_NONE },
- { SCENE_KAJIYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_00KEIKOKU, RESTRICTIONS_NONE },
- { SCENE_POSTHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_LABO, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_DANPEI2TEST, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_UNSET_31, RESTRICTIONS_NONE },
- { SCENE_16GORON_HOUSE, RESTRICTIONS_NONE },
- { SCENE_33ZORACITY, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0) },
- { SCENE_8ITEMSHOP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_F01, RESTRICTIONS_NONE },
- { SCENE_INISIE_BS, RESTRICTIONS_NONE },
- { SCENE_30GYOSON, RESTRICTIONS_NONE },
- { SCENE_31MISAKI, RESTRICTIONS_NONE },
- { SCENE_TAKARAKUJI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_UNSET_3A, RESTRICTIONS_NONE },
- { SCENE_TORIDE, RESTRICTIONS_NONE },
- { SCENE_FISHERMAN, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_GORONSHOP, RESTRICTIONS_INDOORS },
- { SCENE_DEKU_KING, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_LAST_GORON, RESTRICTIONS_MOON },
- { SCENE_24KEMONOMITI, RESTRICTIONS_NONE },
- { SCENE_F01_B, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_F01C, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_BOTI, RESTRICTIONS_NONE },
- { SCENE_HAKUGIN_BS, RESTRICTIONS_NONE },
- { SCENE_20SICHITAI, RESTRICTIONS_NONE },
- { SCENE_21MITURINMAE, RESTRICTIONS_NONE },
- { SCENE_LAST_ZORA, RESTRICTIONS_MOON },
- { SCENE_11GORONNOSATO2, RESTRICTIONS_NONE },
- { SCENE_SEA, RESTRICTIONS_NONE },
- { SCENE_35TAKI, RESTRICTIONS_NONE },
- { SCENE_REDEAD, RESTRICTIONS_NONE },
- { SCENE_BANDROOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_11GORONNOSATO, RESTRICTIONS_NONE },
- { SCENE_GORON_HAKA, RESTRICTIONS_NONE },
- { SCENE_SECOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0) },
- { SCENE_10YUKIYAMANOMURA, RESTRICTIONS_NONE },
- { SCENE_TOUGITES, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_DANPEI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_IKANAMAE, RESTRICTIONS_NONE },
- { SCENE_DOUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_MUSICHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_IKNINSIDE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_MAP_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_F40, RESTRICTIONS_NONE },
- { SCENE_F41, RESTRICTIONS_NONE },
- { SCENE_10YUKIYAMANOMURA2, RESTRICTIONS_NONE },
- { SCENE_14YUKIDAMANOMITI, RESTRICTIONS_NONE },
- { SCENE_12HAKUGINMAE, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN2, RESTRICTIONS_NONE },
- { SCENE_SEA_BS, RESTRICTIONS_NONE },
- { SCENE_RANDOM, RESTRICTIONS_NONE },
- { SCENE_YADOYA, RESTRICTIONS_INDOORS },
- { SCENE_KONPEKI_ENT, RESTRICTIONS_NONE },
- { SCENE_INSIDETOWER, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_26SARUNOMORI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_LOST_WOODS, RESTRICTIONS_NONE },
- { SCENE_LAST_LINK, RESTRICTIONS_MOON },
- { SCENE_SOUGEN, RESTRICTIONS_MOON },
- { SCENE_BOMYA, RESTRICTIONS_INDOORS },
- { SCENE_KYOJINNOMA, RESTRICTIONS_NONE },
- { SCENE_KOEPONARACE, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_GORONRACE, RESTRICTIONS_NONE },
- { SCENE_TOWN, RESTRICTIONS_NONE },
- { SCENE_ICHIBA, RESTRICTIONS_NONE },
- { SCENE_BACKTOWN, RESTRICTIONS_NONE },
- { SCENE_CLOCKTOWER, RESTRICTIONS_NONE },
- { SCENE_ALLEY, RESTRICTIONS_NONE },
+#include "tables/scene_table.h"
// { RESTRICTIONS_TABLE_END, RESTRICTIONS_NONE }, // See note below
};
//! @note: in `Interface_SetSceneRestrictions`, `RESTRICTIONS_TABLE_END` act as a terminating value to
// stop looping through the array. If a scene is missing, then this will cause issues.
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
s16 sPictoState = PICTO_BOX_STATE_OFF;
s16 sPictoPhotoBeingTaken = false;
@@ -2420,7 +2316,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
// Related to pictograph
if (sPictoState == PICTO_BOX_STATE_LENS) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -2459,7 +2355,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
sPictoState = PICTO_BOX_STATE_OFF;
if (sPictoPhotoBeingTaken) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
Snap_RecordPictographedActors(play);
@@ -2492,7 +2388,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
sPictoState = PICTO_BOX_STATE_LENS;
} else {
Play_DecompressI5ToI8((u8*)((void)0, gSaveContext.pictoPhotoI5),
- (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
play->haltAllActors = true;
sPictoState = PICTO_BOX_STATE_SETUP_PHOTO;
@@ -4067,7 +3963,6 @@ void Interface_DrawItemButtons(PlayState* play) {
OVERLAY_DISP = Gfx_DrawTexRectIA8_DropShadow(OVERLAY_DISP, gButtonBackgroundTex, 0x20, 0x20, D_801BF9D4[0],
D_801BF9DC[0], D_801BFAF4[0], D_801BFAF4[0], D_801BF9E4[0] * 2,
D_801BF9E4[0] * 2, 100, 255, 120, interfaceCtx->bAlpha);
- if (1) {}
gDPPipeSync(OVERLAY_DISP++);
// C-Left Button Color & Texture
@@ -4510,11 +4405,10 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
/**
* Draws either the analog three-day clock or the digital final-hours clock
*/
-#ifdef NON_MATCHING
void Interface_DrawClock(PlayState* play) {
static s16 sThreeDayClockAlpha = 255;
- static s16 D_801BFB30 = 0; // sClockAlphaTimer1
- static s16 D_801BFB34 = 0; // sClockAlphaTimer2
+ static s16 sClockAlphaTimer1 = 0;
+ static s16 sClockAlphaTimer2 = 0;
static u16 sThreeDayClockHours[] = {
CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
@@ -4530,31 +4424,30 @@ void Interface_DrawClock(PlayState* play) {
gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
};
- static s16 D_801BFBCC = 0; // sClockInvDiamondPrimRed
- static s16 D_801BFBD0 = 0; // sClockInvDiamondPrimGreen
- static s16 D_801BFBD4 = 255; // sClockInvDiamondPrimBlue
- static s16 D_801BFBD8 = 0; // sClockInvDiamondEnvRed
- static s16 D_801BFBDC = 0; // sClockInvDiamondEnvGreen
- static s16 D_801BFBE0 = 0; // sClockInvDiamondEnvBlue
- static s16 D_801BFBE4 = 15; // sClockInvDiamondTimer
- static s16 D_801BFBE8 = 0; // sClockInvDiamondTargetIndex
- static s16 D_801BFBEC[] = { 100, 0 }; // sClockInvDiamondPrimRedTargets
- static s16 D_801BFBF0[] = { 205, 155 }; // sClockInvDiamondPrimGreenTargets
- static s16 D_801BFBF4[] = { 255, 255 }; // sClockInvDiamondPrimBlueTargets
- static s16 D_801BFBF8[] = { 30, 0 }; // sClockInvDiamondEnvRedTargets
- static s16 D_801BFBFC[] = { 30, 0 }; // sClockInvDiamondEnvGreenTargets
- static s16 D_801BFC00[] = { 100, 0 }; // sClockInvDiamondEnvBlueTargets
- static s16 D_801BFC04[] = { 255, 0 }; // sFinalHoursClockDigitsRed
- static s16 D_801BFC08[] = { 100, 0 }; // sFinalHoursClockFrameEnvRedTargets
- static s16 D_801BFC0C[] = { 30, 0 }; // sFinalHoursClockFrameEnvGreenTargets
- static s16 D_801BFC10[] = { 100, 0 }; // sFinalHoursClockFrameEnvBlueTargets
+ static s16 sClockInvDiamondPrimRed = 0;
+ static s16 sClockInvDiamondPrimGreen = 155;
+ static s16 sClockInvDiamondPrimBlue = 255;
+ static s16 sClockInvDiamondEnvRed = 0;
+ static s16 sClockInvDiamondEnvGreen = 0;
+ static s16 sClockInvDiamondEnvBlue = 0;
+ static s16 sClockInvDiamondTimer = 15;
+ static s16 sClockInvDiamondTargetIndex = 0;
+ static s16 sClockInvDiamondPrimRedTargets[] = { 100, 0 };
+ static s16 sClockInvDiamondPrimGreenTargets[] = { 205, 155 };
+ static s16 sClockInvDiamondPrimBlueTargets[] = { 255, 255 };
+ static s16 sClockInvDiamondEnvRedTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvGreenTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvBlueTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockDigitsRedTargets[] = { 255, 0 };
+ static s16 sFinalHoursClockFrameEnvRedTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockFrameEnvGreenTargets[] = { 30, 0 };
+ static s16 sFinalHoursClockFrameEnvBlueTargets[] = { 100, 0 };
static TexturePtr sFinalHoursDigitTextures[] = {
gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
};
- // sFinalHoursDigitSlotPosXOffset
- static s16 D_801BFC40[] = {
+ static s16 sFinalHoursDigitSlotPosXOffset[] = {
127, 136, 144, 151, 160, 168, 175, 184,
};
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -4566,527 +4459,492 @@ void Interface_DrawClock(PlayState* play) {
f32 timeInMinutes;
f32 timeInSeconds;
f32 sp1CC;
- s32 new_var;
+ s32 pad1;
s16 sp1C6;
s16 currentHour;
u16 time;
- s16 temp;
+ s16 pad2;
s16 colorStep;
- s16 finalHoursClockSlots[8]; // sp1AC
+ s16 finalHoursClockSlots[8];
s16 index;
OPEN_DISPS(play->state.gfxCtx);
- if (R_TIME_SPEED != 0) {
- if ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
- (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
- (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) {
- if (!FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day < 4)) {
- /**
- * Changes Clock's transparancy depending if Player is moving or not and possibly other things
- */
- if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
- if (func_801234D4(play)) {
- sThreeDayClockAlpha = 80;
- D_801BFB30 = 5;
- D_801BFB34 = 20;
- } else if (D_801BFB34 != 0) {
- D_801BFB34--;
- } else if (D_801BFB30 != 0) {
- colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30;
- sThreeDayClockAlpha += colorStep;
+ if ((R_TIME_SPEED != 0) &&
+ ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
+ (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
+ (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) &&
+ !FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day <= 3)) {
+ /**
+ * Section: Changes Clock's transparancy depending if Player is moving or not and possibly other things
+ */
+ if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
+ if (func_801234D4(play)) {
+ sThreeDayClockAlpha = 80;
+ sClockAlphaTimer1 = 5;
+ sClockAlphaTimer2 = 20;
+ } else if (sClockAlphaTimer2 != 0) {
+ sClockAlphaTimer2--;
+ } else if (sClockAlphaTimer1 != 0) {
+ colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / sClockAlphaTimer1;
+ sThreeDayClockAlpha += colorStep;
- if (sThreeDayClockAlpha >= 255) {
- sThreeDayClockAlpha = 255;
- D_801BFB30 = 0;
- }
- } else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
- } else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
- }
- D_801BFB34 = 0;
- D_801BFB30 = 0;
- }
+ if (sThreeDayClockAlpha >= 255) {
+ sThreeDayClockAlpha = 255;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
} else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
+ } else {
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+
+ if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draw Clock's Hour Lines
+ */
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128, 35, 1,
+ 6, 0, 1 << 10, 1 << 10);
+
+ /**
+ * Section: Draw Clock's Border
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ //! @bug A texture height of 50 is given below. The texture is only 48 units height
+ //! resulting in this reading into the next texture. This results in a white
+ //! dot in the bottom center of the clock. For the three-day clock, this is
+ //! covered by the diamond. However, it can be seen by the final-hours clock.
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50, 1, 6,
+ 0, 1 << 10, 1 << 10);
+
+ if (((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ } else {
+ /**
+ * Section: Draw Three-Day Clock's Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // Time is slowed down to half speed with inverted song of time
+ if (gSaveContext.save.timeSpeedOffset == -2) {
+ // Clock diamond is blue and flashes white
+ colorStep =
+ ABS_ALT(sClockInvDiamondPrimRed - sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimRed >= sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimRed -= colorStep;
} else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ sClockInvDiamondPrimRed += colorStep;
}
- D_801BFB34 = 0;
- D_801BFB30 = 0;
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimGreen -
+ sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimGreen >= sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimGreen -= colorStep;
+ } else {
+ sClockInvDiamondPrimGreen += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimBlue -
+ sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimBlue >= sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimBlue -= colorStep;
+ } else {
+ sClockInvDiamondPrimBlue += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvRed - sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvRed >= sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvRed -= colorStep;
+ } else {
+ sClockInvDiamondEnvRed += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondEnvGreen -
+ sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvGreen >= sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvGreen -= colorStep;
+ } else {
+ sClockInvDiamondEnvGreen += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvBlue - sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvBlue >= sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvBlue -= colorStep;
+ } else {
+ sClockInvDiamondEnvBlue += colorStep;
+ }
+
+ sClockInvDiamondTimer--;
+
+ if (sClockInvDiamondTimer == 0) {
+ sClockInvDiamondPrimRed = sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimGreen = sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimBlue = sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvRed = sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvGreen = sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvBlue = sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondTimer = 15;
+ sClockInvDiamondTargetIndex ^= 1;
+ }
+
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
+ 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sClockInvDiamondPrimRed, sClockInvDiamondPrimGreen, 255,
+ sThreeDayClockAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, sClockInvDiamondEnvRed, sClockInvDiamondEnvGreen,
+ sClockInvDiamondEnvBlue, 0);
+ } else {
+ // Clock diamond is green for regular timeSpeedOffset
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
}
- if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40, 32,
+ 1 << 10, 1 << 10);
- Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+ /**
+ * Section: Draw Three-Day Clock's Day-Number over Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- /**
- * Draw Clock's Hour Lines
- */
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27, 137, 192,
+ 48, 27, 1 << 10, 1 << 10);
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128,
- 35, 1, 6, 0, 1 << 10, 1 << 10);
+ /**
+ * Section: Draw Three-Day Clock's Star (for the Minute Tracker)
+ */
+ gDPPipeSync(OVERLAY_DISP++);
- /**
- * Draw Clock's Border
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ if (D_801BF974 != 0) {
+ D_801BF980 += 0.02f;
+ D_801BF97C += 11;
+ } else {
+ D_801BF980 -= 0.02f;
+ D_801BF97C -= 11;
+ }
- //! @bug A texture height of 50 is given below. The texture is only 48 units height
- //! resulting in this reading into the next texture. This results in a white
- //! dot in the bottom center of the clock. For the three-day clock, this is
- //! covered by the diamond. However, it can be seen by the final-hours clock.
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50,
- 1, 6, 0, 1 << 10, 1 << 10);
+ D_801BF978--;
+ if (D_801BF978 == 0) {
+ D_801BF978 = 10;
+ D_801BF974 ^= 1;
+ }
- if (((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
- Gfx_SetupDL42_Overlay(play->state.gfxCtx);
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
+ timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
+
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (sThreeDayClockAlpha != 255) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
+ }
+
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
+ Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ }
+
+ /**
+ * Section: Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
+
+ // determines the current hour
+ for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
+ if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
+ break;
+ }
+ }
+
+ /**
+ * Section: Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
+ */
+ time = gSaveContext.save.time;
+ sp1D8 = Math_SinS(time) * -40.0f;
+ temp_f14 = Math_CosS(time) * -34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
+
+ /**
+ * Section: Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
+ */
+ sp1D8 = Math_SinS(time) * 40.0f;
+ temp_f14 = Math_CosS(time) * 34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
+
+ /**
+ * Section: Cuts off Three-Day Clock's Hour Digits when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Sun
+ */
+ sp1CC = gSaveContext.save.time * 0.000096131f; // (2.0f * 3.15f / 0x10000)
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Sun
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Moon
+ */
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Moon
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
+
+ // Final Hours
+ if ((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
+ if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
+ // The Final Hours clock will flash red
+
+ colorStep = ABS_ALT(sFinalHoursClockDigitsRed -
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockDigitsRed >=
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockDigitsRed -= colorStep;
} else {
- /**
- * Draw Three-Day Clock's Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- // Time is slowed down to half speed with inverted song of time
- if (gSaveContext.save.timeSpeedOffset == -2) {
- // Clock diamond is blue and flashes white
- colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) {
- D_801BFBCC -= colorStep;
- } else {
- D_801BFBCC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) {
- D_801BFBD0 -= colorStep;
- } else {
- D_801BFBD0 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) {
- D_801BFBD4 -= colorStep;
- } else {
- D_801BFBD4 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) {
- D_801BFBD8 -= colorStep;
- } else {
- D_801BFBD8 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) {
- D_801BFBDC -= colorStep;
- } else {
- D_801BFBDC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) {
- D_801BFBE0 -= colorStep;
- } else {
- D_801BFBE0 += colorStep;
- }
-
- D_801BFBE4--;
-
- if (D_801BFBE4 == 0) {
- D_801BFBCC = D_801BFBEC[D_801BFBE8];
- D_801BFBD0 = D_801BFBF0[D_801BFBE8];
- D_801BFBD4 = D_801BFBF4[D_801BFBE8];
- D_801BFBD8 = D_801BFBF8[D_801BFBE8];
- D_801BFBDC = D_801BFBFC[D_801BFBE8];
- D_801BFBE0 = D_801BFC00[D_801BFBE8];
- D_801BFBE4 = 15;
- D_801BFBE8 ^= 1;
- }
-
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255, sThreeDayClockAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0);
- } else {
- // Clock diamond is green for regular timeSpeedOffset
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
- }
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40,
- 32, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Day-Number over Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27,
- 137, 192, 48, 27, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Star (for the Minute Tracker)
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- if (D_801BF974 != 0) {
- D_801BF980 += 0.02f;
- D_801BF97C += 11;
- } else {
- D_801BF980 -= 0.02f;
- D_801BF97C -= 11;
- }
-
- D_801BF978--;
- if (D_801BF978 == 0) {
- D_801BF978 = 10;
- D_801BF974 ^= 1;
- }
-
- timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
- timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
-
- Gfx_SetupDL42_Overlay(play->state.gfxCtx);
-
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- if (sThreeDayClockAlpha != 255) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
- } else {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
- }
-
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
-
- Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
- Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
- gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
- G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
- G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ sFinalHoursClockDigitsRed += colorStep;
}
- /**
- * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
-
- // determines the current hour
- for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
- if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
- break;
- }
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvRed -
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvRed >=
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvRed -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvRed += colorStep;
}
- /**
- * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
- */
- time = gSaveContext.save.time;
- sp1D8 = Math_SinS(time) * -40.0f;
- temp_f14 = Math_CosS(time) * -34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
-
- /**
- * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
- */
- sp1D8 = Math_SinS(time) * 40.0f;
- temp_f14 = Math_CosS(time) * 34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
-
- /**
- * Cuts off Three-Day Clock's Hour Digits when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Sun
- */
- sp1CC = gSaveContext.save.time * 0.000096131f;
-
- // Rotates Three-Day Clock's Hour Digit To Above the Sun
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Moon
- */
- // Rotates Three-Day Clock's Hour Digit To Above the Moon
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
-
- // Final Hours
- if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
- if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
- // The Final Hours clock will flash red
-
- colorStep =
- ABS_ALT(sFinalHoursClockDigitsRed - D_801BFC04[sFinalHoursClockColorTargetIndex]) /
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvGreen -
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) /
sFinalHoursClockColorTimer;
- if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockDigitsRed -= colorStep;
- } else {
- sFinalHoursClockDigitsRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvRed - D_801BFC08[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvRed -= colorStep;
- } else {
- sFinalHoursClockFrameEnvRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvGreen - D_801BFC0C[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvGreen -= colorStep;
- } else {
- sFinalHoursClockFrameEnvGreen += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvBlue - D_801BFC10[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvBlue -= colorStep;
- } else {
- sFinalHoursClockFrameEnvBlue += colorStep;
- }
-
- sFinalHoursClockColorTimer--;
-
- if (sFinalHoursClockColorTimer == 0) {
- sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockColorTimer = 6;
- sFinalHoursClockColorTargetIndex ^= 1;
- }
- }
-
- sp1E6 = sThreeDayClockAlpha;
- if (sp1E6 != 0) {
- sp1E6 = 255;
- }
-
- Gfx_SetupDL39_Overlay(play->state.gfxCtx);
-
- /**
- * Draws Final-Hours Clock's Frame
- */
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
- sFinalHoursClockFrameEnvBlue, 0);
-
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202,
- 80, 13, 0, 0, 0, 1 << 10, 1 << 10);
-
- finalHoursClockSlots[0] = 0;
-
- timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
-
- timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
-
- // digits for hours
- finalHoursClockSlots[1] = timeInMinutes / 60.0f;
- finalHoursClockSlots[2] = timeInMinutes / 60.0f;
-
- temp = (s32)timeInMinutes % 60;
-
- while (finalHoursClockSlots[1] >= 10) {
- finalHoursClockSlots[0]++;
- finalHoursClockSlots[1] -= 10;
- }
-
- // digits for minutes
- finalHoursClockSlots[3] = 0;
- finalHoursClockSlots[4] = temp;
-
- while (finalHoursClockSlots[4] >= 10) {
- finalHoursClockSlots[3]++;
- finalHoursClockSlots[4] -= 10;
- }
-
- // digits for seconds
- finalHoursClockSlots[6] = 0;
- finalHoursClockSlots[7] =
- timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
- (((void)0, temp) * ((f32)0x10000 / (24 * 60))));
-
- while (finalHoursClockSlots[7] >= 10) {
- finalHoursClockSlots[6]++;
- finalHoursClockSlots[7] -= 10;
- }
-
- // Colon separating hours from minutes and minutes from seconds
- finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
-
- /**
- * Draws Final-Hours Clock's Digits
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
-
- for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
- index = D_801BFC40[sp1C6];
-
- OVERLAY_DISP =
- Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]],
- 8, 8, index, 205, 8, 8, 1 << 10, 1 << 10);
- }
+ if (sFinalHoursClockFrameEnvGreen >=
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvGreen -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvGreen += colorStep;
}
+
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvBlue -
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvBlue >=
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvBlue -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvBlue += colorStep;
+ }
+
+ sFinalHoursClockColorTimer--;
+
+ if (sFinalHoursClockColorTimer == 0) {
+ sFinalHoursClockDigitsRed = sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvRed =
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvGreen =
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvBlue =
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockColorTimer = 6;
+ sFinalHoursClockColorTargetIndex ^= 1;
+ }
+ }
+
+ sp1E6 = sThreeDayClockAlpha;
+ if (sp1E6 != 0) {
+ sp1E6 = 255;
+ }
+
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draws Final-Hours Clock's Frame
+ */
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
+ sFinalHoursClockFrameEnvBlue, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202, 80, 13, 0,
+ 0, 0, 1 << 10, 1 << 10);
+
+ timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
+ timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
+
+ // digits for hours
+ finalHoursClockSlots[0] = 0;
+ finalHoursClockSlots[1] = timeInMinutes / 60.0f;
+ finalHoursClockSlots[2] = timeInMinutes / 60.0f;
+
+ while (finalHoursClockSlots[1] >= 10) {
+ finalHoursClockSlots[0]++;
+ finalHoursClockSlots[1] -= 10;
+ }
+
+ // digits for minutes
+ finalHoursClockSlots[3] = 0;
+ finalHoursClockSlots[4] = (s32)timeInMinutes % 60;
+ finalHoursClockSlots[5] = (s32)timeInMinutes % 60;
+
+ while (finalHoursClockSlots[4] >= 10) {
+ finalHoursClockSlots[3]++;
+ finalHoursClockSlots[4] -= 10;
+ }
+
+ // digits for seconds
+ finalHoursClockSlots[6] = 0;
+ finalHoursClockSlots[7] =
+ timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
+ (finalHoursClockSlots[5] * ((f32)0x10000 / (24 * 60))));
+
+ while (finalHoursClockSlots[7] >= 10) {
+ finalHoursClockSlots[6]++;
+ finalHoursClockSlots[7] -= 10;
+ }
+
+ // Colon separating hours from minutes and minutes from seconds
+ finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
+
+ /**
+ * Section: Draws Final-Hours Clock's Digits
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
+
+ for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
+ index = sFinalHoursDigitSlotPosXOffset[sp1C6];
+
+ OVERLAY_DISP =
+ Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]], 8, 8,
+ index, 205, 8, 8, 1 << 10, 1 << 10);
}
}
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-s16 sThreeDayClockAlpha = 255;
-s16 D_801BFB30 = 0;
-s16 D_801BFB34 = 0;
-u16 sThreeDayClockHours[] = {
- CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
- CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
- CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0),
- CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0),
- CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1,
-};
-TexturePtr sThreeDayClockHourTextures[] = {
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
-};
-s16 D_801BFBCC = 0; // color R
-s16 D_801BFBD0 = 155; // color G
-s16 D_801BFBD4 = 255;
-s16 D_801BFBD8 = 0;
-s16 D_801BFBDC = 0;
-s16 D_801BFBE0 = 0;
-s16 D_801BFBE4 = 0xF;
-u32 D_801BFBE8 = 0;
-s16 D_801BFBEC[] = { 100, 0 };
-s16 D_801BFBF0[] = { 205, 155 };
-s16 D_801BFBF4[] = { 255, 255 };
-s16 D_801BFBF8[] = { 30, 0 };
-s16 D_801BFBFC[] = { 30, 0 };
-s16 D_801BFC00[] = { 100, 0 };
-s16 D_801BFC04[] = { 255, 0 };
-s16 D_801BFC08[] = { 100, 0 };
-s16 D_801BFC0C[] = { 30, 0 };
-s16 D_801BFC10[] = { 100, 0 };
-TexturePtr sFinalHoursDigitTextures[] = {
- gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
- gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
- gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
-};
-s16 D_801BFC40[] = {
- 127, 136, 144, 151, 160, 168, 175, 184,
-};
-void Interface_DrawClock(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_DrawClock.s")
-#endif
void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -6727,7 +6585,7 @@ void Interface_Draw(PlayState* play) {
// Draw pictograph photo
if (sPictoState >= PICTO_BOX_STATE_SETUP_PHOTO) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)gSaveContext.pictoPhotoI5, PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -6763,7 +6621,7 @@ void Interface_Draw(PlayState* play) {
for (sp2CC = 0; sp2CC < (PICTO_PHOTO_HEIGHT / 8); sp2CC++, pictoRectTop += 8) {
pictoRectLeft = PICTO_PHOTO_TOPLEFT_X;
gDPLoadTextureBlock(OVERLAY_DISP++,
- (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90) +
+ (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer) +
(0x500 * sp2CC),
G_IM_FMT_I, G_IM_SIZ_8b, PICTO_PHOTO_WIDTH, 8, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
diff --git a/src/code/z_play.c b/src/code/z_play.c
index e25b50b4b..dd06a461e 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -358,10 +358,10 @@ void Play_Destroy(GameState* thisx) {
if (sBombersNotebookOpen) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gfxCtx->zbuffer = SysCfb_GetZBuffer();
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -1242,7 +1242,7 @@ void Play_DrawMain(PlayState* this) {
goto PostWorldDraw;
}
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_PROCESS) {
MsgEvent_SendNullTask();
@@ -1442,24 +1442,24 @@ void Play_Draw(PlayState* this) {
GraphicsContext* gfxCtx2 = this->state.gfxCtx;
if (sBombersNotebookOpen) {
- if (D_801FBBD4 != 1) {
+ if (gSysCfbHiResEnabled != 1) {
MsgEvent_SendNullTask();
- func_80178818();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetHiResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
gfxCtx2->updateViMode = true;
}
} else {
- if (D_801FBBD4 != 0) {
+ if (gSysCfbHiResEnabled != 0) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
@@ -2252,10 +2252,10 @@ void Play_Init(GameState* thisx) {
R_PICTO_PHOTO_STATE = PICTO_PHOTO_STATE_OFF;
PreRender_Init(&this->pauseBgPreRender);
- PreRender_SetValuesSave(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL, NULL);
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL);
+ PreRender_SetValuesSave(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL, NULL);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL);
- this->unk_18E64 = D_801FBB90;
+ this->unk_18E64 = gWorkBuffer;
this->pictoPhotoI8 = gPictoPhotoI8;
this->unk_18E68 = D_80784600;
this->unk_18E58 = D_80784600;
diff --git a/src/code/z_player_call.c b/src/code/z_player_call.c
index a109dab17..6aee18baf 100644
--- a/src/code/z_player_call.c
+++ b/src/code/z_player_call.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define FLAGS \
diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c
index 299639e98..4b5787129 100644
--- a/src/code/z_rcp.c
+++ b/src/code/z_rcp.c
@@ -1459,7 +1459,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(&masterGfx[0], D_0E000000.syncSegments);
gSPDisplayList(&masterGfx[1], sFillSetupDL);
- gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
if (zbuffer != NULL) {
gDPSetDepthImage(&masterGfx[3], zbuffer);
} else {
@@ -1471,7 +1471,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->setScissor;
- gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, gCfbWidth, gCfbHeight);
gSPEndDisplayList(&masterGfx[1]);
// Clear Z-Buffer
@@ -1481,13 +1481,13 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
if (zbuffer == NULL) {
gSPEndDisplayList(&masterGfx[0]);
} else {
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, zbuffer);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, zbuffer);
gDPPipeSync(&masterGfx[1]);
gDPSetCycleType(&masterGfx[2], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[3], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[4], (GPACK_RGBA5551(255, 255, 240, 0) << 16) | GPACK_RGBA5551(255, 255, 240, 0));
gSPDisplayList(&masterGfx[5], D_0E000000.clearFillRect);
- gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gSPEndDisplayList(&masterGfx[7]);
}
@@ -1495,7 +1495,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFrameBuffer;
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetCycleType(&masterGfx[1], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[2], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[3], (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
@@ -1505,7 +1505,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC - 1, D_801FBBCE - 1);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth - 1, gCfbHeight - 1);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
@@ -1513,7 +1513,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->fillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth, gCfbHeight);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 26dc39507..623db6b24 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -89,7 +89,7 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) {
s32 i;
for (i = 0; i < objectCtx->num; i++) {
- if ((objectCtx->status[i].id < 0 ? -objectCtx->status[i].id : objectCtx->status[i].id) == objectId) {
+ if (ABS_ALT(objectCtx->status[i].id) == objectId) {
return i;
}
}
diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c
index 6ec3f2b80..b4597a5c2 100644
--- a/src/code/z_scene_proc.c
+++ b/src/code/z_scene_proc.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
s32 sMatAnimStep;
@@ -401,7 +400,7 @@ void AnimatedMat_DrawMain(PlayState* play, AnimatedMaterial* matAnim, f32 alphaR
if ((matAnim != NULL) && (matAnim->segment != 0)) {
do {
segment = matAnim->segment;
- segmentAbs = ((segment < 0) ? -segment : segment) + 7;
+ segmentAbs = ABS_ALT(segment) + 7;
matAnimDrawHandlers[matAnim->type](play, segmentAbs, Lib_SegmentedToVirtual(matAnim->params));
matAnim++;
} while (segment >= 0);
diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c
index f80ad551d..e31e4b185 100644
--- a/src/code/z_scene_table.c
+++ b/src/code/z_scene_table.c
@@ -1,127 +1,27 @@
#include "global.h"
-#define SCENE_ENTRY(name, textId, config) \
- { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, config, 0, 0 }
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ DECLARE_ROM_SEGMENT(name)
-#define SCENE_ENTRY_NONE() \
- { { 0, 0 }, 0, 0, 0, 0, 0 }
+#define DEFINE_SCENE_UNSET(_enumValue)
-SceneTableEntry gSceneTable[] = {
- /* 0x00 */ SCENE_ENTRY(Z2_20SICHITAI2, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x01 */ SCENE_ENTRY_NONE(),
- /* 0x02 */ SCENE_ENTRY_NONE(),
- /* 0x03 */ SCENE_ENTRY_NONE(),
- /* 0x04 */ SCENE_ENTRY_NONE(),
- /* 0x05 */ SCENE_ENTRY_NONE(),
- /* 0x06 */ SCENE_ENTRY_NONE(),
- /* 0x07 */ SCENE_ENTRY(KAKUSIANA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x08 */ SCENE_ENTRY(SPOT00, 0x0000, SCENE_DRAW_CFG_NOTHING),
- /* 0x09 */ SCENE_ENTRY_NONE(),
- /* 0x0A */ SCENE_ENTRY(Z2_WITCH_SHOP, 0x011A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0B */ SCENE_ENTRY(Z2_LAST_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0C */ SCENE_ENTRY(Z2_HAKASHITA, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0D */ SCENE_ENTRY(Z2_AYASHIISHOP, 0x010E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0E */ SCENE_ENTRY_NONE(),
- /* 0x0F */ SCENE_ENTRY_NONE(),
- /* 0x10 */ SCENE_ENTRY(Z2_OMOYA, 0x0132, SCENE_DRAW_CFG_DEFAULT),
- /* 0x11 */ SCENE_ENTRY(Z2_BOWLING, 0x0108, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x12 */ SCENE_ENTRY(Z2_SONCHONOIE, 0x010B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x13 */ SCENE_ENTRY(Z2_IKANA, 0x0141, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x14 */ SCENE_ENTRY(Z2_KAIZOKU, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x15 */ SCENE_ENTRY(Z2_MILK_BAR, 0x010C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x16 */ SCENE_ENTRY(Z2_INISIE_N, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x17 */ SCENE_ENTRY(Z2_TAKARAYA, 0x0109, SCENE_DRAW_CFG_DEFAULT),
- /* 0x18 */ SCENE_ENTRY(Z2_INISIE_R, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x19 */ SCENE_ENTRY(Z2_OKUJOU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1A */ SCENE_ENTRY(Z2_OPENINGDAN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1B */ SCENE_ENTRY(Z2_MITURIN, 0x011F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1C */ SCENE_ENTRY(Z2_13HUBUKINOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1D */ SCENE_ENTRY(Z2_CASTLE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1E */ SCENE_ENTRY(Z2_DEKUTES, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1F */ SCENE_ENTRY(Z2_MITURIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x20 */ SCENE_ENTRY(Z2_SYATEKI_MIZU, 0x0107, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x21 */ SCENE_ENTRY(Z2_HAKUGIN, 0x012B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x22 */ SCENE_ENTRY(Z2_ROMANYMAE, 0x0149, SCENE_DRAW_CFG_DEFAULT),
- /* 0x23 */ SCENE_ENTRY(Z2_PIRATE, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x24 */ SCENE_ENTRY(Z2_SYATEKI_MORI, 0x011B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x25 */ SCENE_ENTRY(Z2_SINKAI, 0x0135, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x26 */ SCENE_ENTRY(Z2_YOUSEI_IZUMI, 0x013E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x27 */ SCENE_ENTRY(Z2_KINSTA1, 0x011E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x28 */ SCENE_ENTRY(Z2_KINDAN2, 0x013F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x29 */ SCENE_ENTRY(Z2_TENMON_DAI, 0x0114, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2A */ SCENE_ENTRY(Z2_LAST_DEKU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2B */ SCENE_ENTRY(Z2_22DEKUCITY, 0x0118, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2C */ SCENE_ENTRY(Z2_KAJIYA, 0x0127, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2D */ SCENE_ENTRY(Z2_00KEIKOKU, 0x0100, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2E */ SCENE_ENTRY(Z2_POSTHOUSE, 0x0111, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2F */ SCENE_ENTRY(Z2_LABO, 0x013A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x30 */ SCENE_ENTRY(Z2_DANPEI2TEST, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x31 */ SCENE_ENTRY_NONE(),
- /* 0x32 */ SCENE_ENTRY(Z2_16GORON_HOUSE, 0x0124, SCENE_DRAW_CFG_DEFAULT),
- /* 0x33 */ SCENE_ENTRY(Z2_33ZORACITY, 0x0136, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x34 */ SCENE_ENTRY(Z2_8ITEMSHOP, 0x010F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x35 */ SCENE_ENTRY(Z2_F01, 0x012E, SCENE_DRAW_CFG_DEFAULT),
- /* 0x36 */ SCENE_ENTRY(Z2_INISIE_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x37 */ SCENE_ENTRY(Z2_30GYOSON, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x38 */ SCENE_ENTRY(Z2_31MISAKI, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x39 */ SCENE_ENTRY(Z2_TAKARAKUJI, 0x0112, SCENE_DRAW_CFG_DEFAULT),
- /* 0x3A */ SCENE_ENTRY_NONE(),
- /* 0x3B */ SCENE_ENTRY(Z2_TORIDE, 0x0138, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3C */ SCENE_ENTRY(Z2_FISHERMAN, 0x013B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3D */ SCENE_ENTRY(Z2_GORONSHOP, 0x0129, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3E */ SCENE_ENTRY(Z2_DEKU_KING, 0x011C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3F */ SCENE_ENTRY(Z2_LAST_GORON, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x40 */ SCENE_ENTRY(Z2_24KEMONOMITI, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x41 */ SCENE_ENTRY(Z2_F01_B, 0x0130, SCENE_DRAW_CFG_DEFAULT),
- /* 0x42 */ SCENE_ENTRY(Z2_F01C, 0x012F, SCENE_DRAW_CFG_DEFAULT),
- /* 0x43 */ SCENE_ENTRY(Z2_BOTI, 0x0106, SCENE_DRAW_CFG_DEFAULT),
- /* 0x44 */ SCENE_ENTRY(Z2_HAKUGIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x45 */ SCENE_ENTRY(Z2_20SICHITAI, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x46 */ SCENE_ENTRY(Z2_21MITURINMAE, 0x0117, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x47 */ SCENE_ENTRY(Z2_LAST_ZORA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x48 */ SCENE_ENTRY(Z2_11GORONNOSATO2, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x49 */ SCENE_ENTRY(Z2_SEA, 0x013D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE),
- /* 0x4A */ SCENE_ENTRY(Z2_35TAKI, 0x0137, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4B */ SCENE_ENTRY(Z2_REDEAD, 0x0145, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4C */ SCENE_ENTRY(Z2_BANDROOM, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4D */ SCENE_ENTRY(Z2_11GORONNOSATO, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4E */ SCENE_ENTRY(Z2_GORON_HAKA, 0x012A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4F */ SCENE_ENTRY(Z2_SECOM, 0x0143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x50 */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x51 */ SCENE_ENTRY(Z2_TOUGITES, 0x0146, SCENE_DRAW_CFG_DEFAULT),
- /* 0x52 */ SCENE_ENTRY(Z2_DANPEI, 0x0120, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x53 */ SCENE_ENTRY(Z2_IKANAMAE, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x54 */ SCENE_ENTRY(Z2_DOUJOU, 0x0110, SCENE_DRAW_CFG_DEFAULT),
- /* 0x55 */ SCENE_ENTRY(Z2_MUSICHOUSE, 0x0147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x56 */ SCENE_ENTRY(Z2_IKNINSIDE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x57 */ SCENE_ENTRY(Z2_MAP_SHOP, 0x0119, SCENE_DRAW_CFG_DEFAULT),
- /* 0x58 */ SCENE_ENTRY(Z2_F40, 0x0140, SCENE_DRAW_CFG_DEFAULT),
- /* 0x59 */ SCENE_ENTRY(Z2_F41, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5A */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA2, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5B */ SCENE_ENTRY(Z2_14YUKIDAMANOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5C */ SCENE_ENTRY(Z2_12HAKUGINMAE, 0x0125, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5D */ SCENE_ENTRY(Z2_17SETUGEN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5E */ SCENE_ENTRY(Z2_17SETUGEN2, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5F */ SCENE_ENTRY(Z2_SEA_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x60 */ SCENE_ENTRY(Z2_RANDOM, 0x012C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x61 */ SCENE_ENTRY(Z2_YADOYA, 0x010A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x62 */ SCENE_ENTRY(Z2_KONPEKI_ENT, 0x0139, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x63 */ SCENE_ENTRY(Z2_INSIDETOWER, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x64 */ SCENE_ENTRY(Z2_26SARUNOMORI, 0x011D, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x65 */ SCENE_ENTRY(Z2_LOST_WOODS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x66 */ SCENE_ENTRY(Z2_LAST_LINK, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x67 */ SCENE_ENTRY(Z2_SOUGEN, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x68 */ SCENE_ENTRY(Z2_BOMYA, 0x010D, SCENE_DRAW_CFG_DEFAULT),
- /* 0x69 */ SCENE_ENTRY(Z2_KYOJINNOMA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6A */ SCENE_ENTRY(Z2_KOEPONARACE, 0x0131, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6B */ SCENE_ENTRY(Z2_GORONRACE, 0x0126, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6C */ SCENE_ENTRY(Z2_TOWN, 0x0101, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6D */ SCENE_ENTRY(Z2_ICHIBA, 0x0102, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6E */ SCENE_ENTRY(Z2_BACKTOWN, 0x0103, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6F */ SCENE_ENTRY(Z2_CLOCKTOWER, 0x0104, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x70 */ SCENE_ENTRY(Z2_ALLEY, 0x0105, SCENE_DRAW_CFG_MAT_ANIM),
+#include "tables/scene_table.h"
+
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, drawConfig, 0, 0 },
+
+#define DEFINE_SCENE_UNSET(_enumValue) { 0 },
+
+SceneTableEntry gSceneTable[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
static EntranceTableEntry sMayorsResidenceEntrance0[] = {
{ SCENE_SONCHONOIE, 0, 0x4102 },
};
diff --git a/src/code/z_skin.c b/src/code/z_skin.c
index 9bfd8d566..0d3e0bf85 100644
--- a/src/code/z_skin.c
+++ b/src/code/z_skin.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64skin.h"
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index 9361cc1e0..3524fe3ab 100644
--- a/src/code/z_snap.c
+++ b/src/code/z_snap.c
@@ -42,9 +42,6 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
break;
}
- //! FAKE:
- if (1) {}
-
// Actors which may be pictographed anywhere
switch (actor->id) {
case ACTOR_EN_KAKASI:
@@ -71,15 +68,20 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
case ACTOR_EN_GE2:
seen |= PICTO_SEEN_ANYWHERE;
break;
+
+ default:
+ break;
+ }
+
+ if (!seen) {
+ continue;
}
// If actor is recordable, run its validity function and record if valid
- if (seen) {
- pictoActor = (PictoActor*)actor;
- if (pictoActor->validationFunc != NULL) {
- if ((pictoActor->validationFunc)(play, actor) == 0) {
- validCount++;
- }
+ pictoActor = (PictoActor*)actor;
+ if (pictoActor->validationFunc != NULL) {
+ if (pictoActor->validationFunc(play, actor) == 0) {
+ validCount++;
}
}
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index c10c1943e..f47a8e201 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h"
#include "global.h"
+#include "z64horse.h"
#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages);
@@ -10,128 +11,30 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \
(newf)[5] != '3')
-// default scene flags (?)
-// indices of subarray:
-// - 0: switch0
-// - 1: switch1
-// - 2: chest
-// - 3: collectible
-u32 D_801C5FC0[SCENE_MAX][4] = {
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI2
- { 0, 0, 0, 0 }, // SCENE_UNSET_1
- { 0, 0, 0, 0 }, // SCENE_UNSET_2
- { 0, 0, 0, 0 }, // SCENE_UNSET_3
- { 0, 0, 0, 0 }, // SCENE_UNSET_4
- { 0, 0, 0, 0 }, // SCENE_UNSET_5
- { 0, 0, 0, 0 }, // SCENE_UNSET_6
- { 0, 0, 0, 0xC04 }, // SCENE_KAKUSIANA
- { 0, 0, 0, 0 }, // SCENE_SPOT00
- { 0, 0, 0, 0 }, // SCENE_UNSET_9
- { 0, 0, 0, 0 }, // SCENE_WITCH_SHOP
- { 0, 0, 0, 0x80000000 }, // SCENE_LAST_BS
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKASHITA
- { 0, 0, 0, 0 }, // SCENE_AYASHIISHOP
- { 0, 0, 0, 0 }, // SCENE_UNSET_E
- { 0, 0, 0, 0 }, // SCENE_UNSET_F
- { 0, 0, 0, 0 }, // SCENE_OMOYA
- { 0, 0, 0, 0 }, // SCENE_BOWLING
- { 0, 0, 0, 0 }, // SCENE_SONCHONOIE
- { 0x100000, 0, 0, 0x40000002 }, // SCENE_IKANA
- { 0, 0, 0, 0 }, // SCENE_KAIZOKU
- { 0, 0, 0, 0 }, // SCENE_MILK_BAR
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_N
- { 2, 0, 0, 0 }, // SCENE_TAKARAYA
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_R
- { 0, 0, 0, 0 }, // SCENE_OKUJOU
- { 0xF, 0, 0, 0 }, // SCENE_OPENINGDAN
- { 0x70B000, 0, 0, 0 }, // SCENE_MITURIN
- { 0, 0, 0, 0 }, // SCENE_13HUBUKINOMITI
- { 0, 0x80000000, 0, 0x400 }, // SCENE_CASTLE
- { 0, 0, 0, 0 }, // SCENE_DEKUTES
- { 0, 0, 0, 0x80000000 }, // SCENE_MITURIN_BS
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MIZU
- { 0x1A00020, 0, 0, 0 }, // SCENE_HAKUGIN
- { 0x400, 0, 0, 0 }, // SCENE_ROMANYMAE
- { 0, 0, 0, 0x1000 }, // SCENE_PIRATE
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MORI
- { 0, 0, 0, 2 }, // SCENE_SINKAI
- { 0x400, 0, 0, 0 }, // SCENE_YOUSEI_IZUMI
- { 0, 0, 0, 0 }, // SCENE_KINSTA1
- { 0, 0, 0, 0x80000000 }, // SCENE_KINDAN2
- { 0, 0, 0, 0 }, // SCENE_TENMON_DAI
- { 0, 0, 0, 2 }, // SCENE_LAST_DEKU
- { 0, 0, 0, 0x40000000 }, // SCENE_22DEKUCITY
- { 0, 0, 0, 0 }, // SCENE_KAJIYA
- { 0x10, 0, 0, 0 }, // SCENE_00KEIKOKU
- { 3, 0, 0, 0 }, // SCENE_POSTHOUSE
- { 0, 0, 0, 0 }, // SCENE_LABO
- { 0, 0, 0, 0x80000000 }, // SCENE_DANPEI2TEST
- { 0, 0, 0, 0 }, // SCENE_UNSET_31
- { 0, 0, 0, 0 }, // SCENE_16GORON_HOUSE
- { 0, 0, 0, 0 }, // SCENE_33ZORACITY
- { 0, 0, 0, 0 }, // SCENE_8ITEMSHOP
- { 0, 0, 0, 0 }, // SCENE_F01
- { 0, 0, 0, 0x80000000 }, // SCENE_INISIE_BS
- { 0x100400, 0, 0, 0x22 }, // SCENE_30GYOSON
- { 0x400, 0, 0, 0x80 }, // SCENE_31MISAKI
- { 0, 0, 0, 0 }, // SCENE_TAKARAKUJI
- { 0, 0, 0, 0 }, // SCENE_UNSET_3A
- { 0x400, 0, 0, 0 }, // SCENE_TORIDE
- { 0, 0, 0, 0 }, // SCENE_FISHERMAN
- { 0, 0, 0, 0 }, // SCENE_GORONSHOP
- { 0, 0, 0, 0 }, // SCENE_DEKU_KING
- { 0, 0, 0, 2 }, // SCENE_LAST_GORON
- { 0, 0, 0, 0x80000002 }, // SCENE_24KEMONOMITI
- { 0, 0, 0, 0 }, // SCENE_F01_B
- { 0, 0, 0, 0 }, // SCENE_F01C
- { 0, 0, 0, 0 }, // SCENE_BOTI
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKUGIN_BS
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI
- { 0x102, 0, 0, 0x400 }, // SCENE_21MITURINMAE
- { 0, 0, 0, 2 }, // SCENE_LAST_ZORA
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO2
- { 0x70, 0, 0, 0 }, // SCENE_SEA
- { 0, 0, 0, 0 }, // SCENE_35TAKI
- { 0, 0, 0, 0 }, // SCENE_REDEAD
- { 0, 0, 0, 0x40000000 }, // SCENE_BANDROOM
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO
- { 0, 0, 0, 0 }, // SCENE_GORON_HAKA
- { 0, 0, 0, 0 }, // SCENE_SECOM
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA
- { 0, 0, 0, 0 }, // SCENE_TOUGITES
- { 0, 0, 0, 0 }, // SCENE_DANPEI
- { 0, 0, 0, 0 }, // SCENE_IKANAMAE
- { 0, 0, 0, 0 }, // SCENE_DOUJOU
- { 0, 0, 0, 0 }, // SCENE_MUSICHOUSE
- { 0, 0, 0, 0 }, // SCENE_IKNINSIDE
- { 0, 0, 0, 0 }, // SCENE_MAP_SHOP
- { 0x400, 0, 0, 0 }, // SCENE_F40
- { 0x400, 0, 0, 0 }, // SCENE_F41
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA2
- { 0, 0, 0, 0x100 }, // SCENE_14YUKIDAMANOMITI
- { 0x400, 0, 0, 0 }, // SCENE_12HAKUGINMAE
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN2
- { 0, 0, 0, 0x80000000 }, // SCENE_SEA_BS
- { 0, 0, 0, 0x400 }, // SCENE_RANDOM
- { 0, 0, 0, 0 }, // SCENE_YADOYA
- { 0, 0, 0, 0 }, // SCENE_KONPEKI_ENT
- { 1, 0, 0, 0 }, // SCENE_INSIDETOWER
- { 0, 0, 0, 0 }, // SCENE_26SARUNOMORI
- { 0, 0, 0, 0 }, // SCENE_LOST_WOODS
- { 0, 0, 0, 2 }, // SCENE_LAST_LINK
- { 0, 0, 0, 0 }, // SCENE_SOUGEN
- { 0, 0, 0, 0 }, // SCENE_BOMYA
- { 0, 0, 0, 0 }, // SCENE_KYOJINNOMA
- { 0, 0, 0, 0 }, // SCENE_KOEPONARACE
- { 0, 0, 0, 0 }, // SCENE_GORONRACE
- { 1, 0, 0, 0 }, // SCENE_TOWN
- { 0, 0, 0, 0 }, // SCENE_ICHIBA
- { 0, 0, 0, 0x400 }, // SCENE_BACKTOWN
- { 0x100000, 0, 0, 0x400 }, // SCENE_CLOCKTOWER
- { 0, 0, 1, 0 }, // SCENE_ALLEY
+typedef struct PersistentCycleFlags {
+ /* 0x0 */ u32 switch0;
+ /* 0x4 */ u32 switch1;
+ /* 0x8 */ u32 chest;
+ /* 0xC */ u32 collectible;
+} PersistentCycleFlags; // size = 0x10
+
+#define PERSISTENT_CYCLE_FLAGS_SET(switch0, switch1, chest, collectible) { switch0, switch1, chest, collectible },
+#define PERSISTENT_CYCLE_FLAGS_NONE PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 0)
+
+#define DEFINE_SCENE(_name, _enumValue, _textId, _drawConfig, _restrictionFlags, persistentCycleFlags) \
+ persistentCycleFlags
+#define DEFINE_SCENE_UNSET(_enumValue) PERSISTENT_CYCLE_FLAGS_NONE
+
+/**
+ * Array of bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ */
+PersistentCycleFlags sPersistentCycleFlags[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
// TODO: figure out a way to use the WEEKEVENTREG defines here
// weekEventReg flags which will be not be cleared on a cycle reset
u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = {
@@ -350,18 +253,21 @@ void Sram_SaveEndOfCycle(PlayState* play) {
sceneId = Play_GetOriginalSceneId(play->sceneId);
Play_SaveCycleSceneFlags(&play->state);
- play->actorCtx.sceneFlags.chest &= D_801C5FC0[sceneId][2];
- play->actorCtx.sceneFlags.switches[0] &= D_801C5FC0[sceneId][0];
- play->actorCtx.sceneFlags.switches[1] &= D_801C5FC0[sceneId][1];
- play->actorCtx.sceneFlags.collectible[0] &= D_801C5FC0[sceneId][3];
+ play->actorCtx.sceneFlags.chest &= sPersistentCycleFlags[sceneId].chest;
+ play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleFlags[sceneId].switch0;
+ play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleFlags[sceneId].switch1;
+ play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleFlags[sceneId].collectible;
play->actorCtx.sceneFlags.clearedRoom = 0;
for (i = 0; i < SCENE_MAX; i++) {
- gSaveContext.cycleSceneFlags[i].switch0 = ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & D_801C5FC0[i][0];
- gSaveContext.cycleSceneFlags[i].switch1 = ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & D_801C5FC0[i][1];
- gSaveContext.cycleSceneFlags[i].chest = ((void)0, gSaveContext.cycleSceneFlags[i].chest) & D_801C5FC0[i][2];
+ gSaveContext.cycleSceneFlags[i].switch0 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].chest =
+ ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleFlags[i].chest;
gSaveContext.cycleSceneFlags[i].collectible =
- ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & D_801C5FC0[i][3];
+ ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleFlags[i].collectible;
gSaveContext.cycleSceneFlags[i].clearedRoom = 0;
gSaveContext.save.saveInfo.permanentSceneFlags[i].unk_14 = 0;
gSaveContext.save.saveInfo.permanentSceneFlags[i].rooms = 0;
@@ -549,7 +455,7 @@ void Sram_SaveEndOfCycle(PlayState* play) {
gSaveContext.jinxTimer = 0;
gSaveContext.rupeeAccumulator = 0;
- func_800F3B2C(play);
+ Horse_ResetHorseData(play);
}
void Sram_IncrementDay(void) {
@@ -642,7 +548,7 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
gSaveContext.save.saveInfo.bomberCode[0] = randBombers;
@@ -652,7 +558,7 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
sp2A = 0;
do {
@@ -945,15 +851,15 @@ void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]) !=
- 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2],
+ D_801C67F0[gSaveContext.fileNum * 2]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
+ D_801C67F0[gSaveContext.fileNum * 2 + 1]);
}
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
+ D_801C67F0[gSaveContext.fileNum * 2 + 1]);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
}
gSaveContext.save.cutsceneIndex = cutsceneIndex;
@@ -979,8 +885,8 @@ void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) {
gSaveContext.timerPausedOsTimes[i] = 0;
}
- D_801BDAA0 = 1;
- D_801BDA9C = 0;
+ D_801BDAA0 = true;
+ gHorseIsMounted = false;
gSaveContext.powderKegTimer = 0;
gSaveContext.unk_1014 = 0;
gSaveContext.jinxTimer = 0;
@@ -1005,27 +911,27 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
if (gSaveContext.fileNum == 0xFF) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
} else if (fileSelect->unk_2446A[gSaveContext.fileNum] != 0) {
phi_t1 = gSaveContext.fileNum + 2;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
}
} else {
phi_t1 = gSaveContext.fileNum;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
}
}
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
}
}
@@ -1185,9 +1091,9 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
phi_s2 = false;
sp6E = 0;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) {
sp6E = 1;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
phi_s2 = true;
}
}
@@ -1210,7 +1116,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
if (CHECK_NEWF2(gSaveContext.save.saveInfo.playerData.newf)) {}
phi_s2 = false;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
phi_s2 = true;
}
@@ -1266,7 +1172,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
} else if (sp6E == 0) { // TODO: == 0?
temp_s2 = gSaveContext.save.saveInfo.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
phi_s2_3 = 1;
} else {
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
@@ -1277,7 +1183,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) ||
(phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
@@ -1305,7 +1211,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
phi_s2 = false;
}
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
phi_s2 = true;
}
@@ -1362,7 +1268,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
} else if (!sp6E) { // TODO: == 0?
temp_s2 = gSaveContext.save.saveInfo.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
phi_s2_3 = 1;
} else {
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
@@ -1374,7 +1280,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) ||
(phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
@@ -1476,11 +1382,12 @@ void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
// clear buffer
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// read to buffer
- func_80185968(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2], D_801C67F0[fileSelect->unk_2448E * 2]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2],
+ D_801C67F0[fileSelect->unk_2448E * 2]);
if (1) {}
- func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1],
- D_801C67F0[fileSelect->unk_2448E * 2 + 1]);
+ SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1],
+ D_801C67F0[fileSelect->unk_2448E * 2 + 1]);
if (1) {}
// copy buffer to save context
@@ -1613,7 +1520,7 @@ void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
- func_80185F64(sramCtx->saveBuf, curPage, numPages);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, curPage, numPages);
}
/**
@@ -1626,7 +1533,8 @@ void Sram_SaveSpecialEnterClockTown(PlayState* play) {
gSaveContext.save.isFirstCycle = true;
gSaveContext.save.isOwlSave = false;
func_80145698(sramCtx);
- func_80185F64(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C6818[gSaveContext.fileNum * 2]);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2],
+ D_801C6818[gSaveContext.fileNum * 2]);
}
/**
@@ -1647,7 +1555,8 @@ void Sram_SaveSpecialNewDay(PlayState* play) {
gSaveContext.save.day = day;
gSaveContext.save.time = time;
gSaveContext.save.cutsceneIndex = cutsceneIndex;
- func_80185F64(play->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]);
+ SysFlashrom_WriteDataSync(play->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2],
+ D_801C67F0[gSaveContext.fileNum * 2]);
}
void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) {
@@ -1658,7 +1567,7 @@ void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) {
void func_80147020(SramContext* sramCtx) {
// async flash write
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
sramCtx->unk_18 = osGetTime();
sramCtx->status = 2;
@@ -1666,8 +1575,8 @@ void func_80147020(SramContext* sramCtx) {
void func_80147068(SramContext* sramCtx) {
if (sramCtx->status == 2) {
- if (func_80185EC4() != 0) { // if task running
- if (func_80185F04() == 0) { // wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // if task running
+ if (SysFlashrom_AwaitResult() == 0) { // wait for task done
// task success
sramCtx->status = 4;
} else {
@@ -1687,7 +1596,7 @@ void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages) {
}
void func_80147150(SramContext* sramCtx) {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
sramCtx->unk_18 = osGetTime();
sramCtx->status = 7;
@@ -1695,18 +1604,18 @@ void func_80147150(SramContext* sramCtx) {
void func_80147198(SramContext* sramCtx) {
if (sramCtx->status == 7) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
} else {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
}
}
} else if (sramCtx->status == 8) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
sramCtx->status = 4;
} else {
sramCtx->status = 4;
@@ -1718,7 +1627,7 @@ void func_80147198(SramContext* sramCtx) {
gSaveContext.save.isOwlSave = false;
gSaveContext.save.saveInfo.checksum = 0;
// flash read to buffer then copy to save context
- func_80185968(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_ReadData(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
}
}
@@ -1759,9 +1668,9 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// Read save file
- if (func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) {
// If failed, read backup save file
- func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]);
}
// Copy buffer to save context
diff --git a/src/code/z_view.c b/src/code/z_view.c
index 105e6643a..4adc00b8d 100644
--- a/src/code/z_view.c
+++ b/src/code/z_view.c
@@ -18,8 +18,8 @@ void View_ViewportToVp(Vp* dest, Viewport* src) {
dest->vp.vtrans[2] = 0x01FF;
dest->vp.vtrans[3] = 0;
- if ((src->leftX == 0) && (src->rightX == SCREEN_WIDTH_HIGH_RES) && (src->topY == 0) &&
- (src->bottomY == SCREEN_HEIGHT_HIGH_RES)) {}
+ if ((src->leftX == 0) && (src->rightX == HIRES_BUFFER_WIDTH) && (src->topY == 0) &&
+ (src->bottomY == HIRES_BUFFER_HEIGHT)) {}
}
void View_Init(View* view, GraphicsContext* gfxCtx) {
diff --git a/src/code/z_vimode.c b/src/code/z_vimode.c
index b7d2dea64..2ddd27775 100644
--- a/src/code/z_vimode.c
+++ b/src/code/z_vimode.c
@@ -1,17 +1,377 @@
#include "global.h"
+#include "ultra64/viint.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140260.s")
+typedef struct {
+ /* 0x00 */ u32 burst;
+ /* 0x04 */ u32 vSync;
+ /* 0x08 */ u32 hSync;
+ /* 0x0C */ u32 leap;
+ /* 0x10 */ u32 hStart;
+ /* 0x14 */ u32 vStart;
+ /* 0x18 */ u32 vBurst;
+} ViModeStruct; // size = 0x1C
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014026C.s")
+void ViMode_LogPrint(OSViMode* osViMode) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140730.s")
+/**
+ * Configures the custom OSViMode for this ViMode
+ *
+ * @param viMode ViMode to configure the custom OSViMode for
+ * @param type Identifying type for the OSViMode
+ * @param tvType TV Type: NTSC, PAL, MPAL or FPAL
+ * @param loRes Boolean: true = low resolution, false = high resolution.
+ * Corresponds to "L" or "H" in libultra VI mode names
+ * @param antialiasOff Boolean: true = point-sampling, false = anti-aliasing.
+ * Corresponds to "P" or "A" in libultra VI mode names
+ * @param modeN Boolean: controls interlacing mode, different based on resolution.
+ * Corresponds to "N" or "F" in libultra VI mode names
+ * @param fb16Bit Bolean: true = 16-bit framebuffer, false = 32-bit framebuffer.
+ * Corresponds to "1" or "2" in libultra VI mode names
+ * @param width Screen width
+ * @param height Screen height
+ * @param leftAdjust Left edge adjustment
+ * @param rightAdjust Right edge adjustment
+ * @param upperAdjust Upper edge adjustment
+ * @param lowerAdjust Lower edge adjustment
+ */
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust) {
+ s32 hiRes;
+ s32 antialiasOn;
+ s32 modeF;
+ s32 fb32Bit;
+ s32 hiResDeflicker; // deflickered interlacing
+ s32 hiResInterlaced;
+ s32 loResDeinterlaced;
+ s32 loResInterlaced;
+ s32 modeLAN1; // L=(lo res) A=(antialias) N=(deinterlace) 1=(16-bit)
+ s32 modeLPN2; // L=(lo res) P=(point-sampled) N=(deinterlace) 2=(32-bit)
+ s32 modeHPN2; // H=(hi res) P=(point-sampled) N=(normal interlacing) 2=(32-bit)
+ s32 yScaleLo;
+ s32 yScaleHiEvenField;
+ s32 yScaleHiOddField;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140810.s")
+ hiRes = !loRes;
+ antialiasOn = !antialiasOff;
+ modeF = !modeN;
+ fb32Bit = !fb16Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140898.s")
+ hiResDeflicker = hiRes && modeF;
+ hiResInterlaced = hiRes && modeN;
+ loResDeinterlaced = loRes && modeN;
+ loResInterlaced = loRes && modeF;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140900.s")
+ modeLAN1 = loRes && antialiasOn && modeN && fb16Bit;
+ modeLPN2 = loRes && antialiasOff && modeN && fb32Bit;
+ modeHPN2 = hiRes && antialiasOff && modeN && fb32Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014090C.s")
+ upperAdjust &= ~1;
+ lowerAdjust &= ~1;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140970.s")
+ yScaleLo = (hiResDeflicker ? 2 : 1) * (((SCREEN_HEIGHT << 11) / SCREEN_HEIGHT) / (loRes ? 1 : 2));
+
+ yScaleHiEvenField = modeF ? (loResInterlaced ? 0x1000000 : 0x2000000) : 0;
+ yScaleHiOddField = modeF ? (loResInterlaced ? 0x3000000 : 0x2000000) : 0;
+
+ viMode->type = type;
+ viMode->comRegs.ctrl = OS_VI_UNK2000 | OS_VI_UNK1000 | OS_VI_GAMMA | OS_VI_GAMMA_DITHER |
+ (!loResDeinterlaced ? OS_VI_UNK40 : 0) | (antialiasOn ? OS_VI_DIVOT : 0) |
+ (fb32Bit ? OS_VI_UNK2 | OS_VI_UNK1 : OS_VI_UNK2);
+
+ if (modeLAN1) {
+ // Anti-aliased, fetch extra lines as-needed
+ viMode->comRegs.ctrl |= 0x100;
+ } else if (modeLPN2 | modeHPN2) {
+ // Point-sampled, resampling disabled
+ viMode->comRegs.ctrl |= 0x300;
+ } else {
+ if (antialiasOff) {
+ // Point-sampled, resampling enabled
+ viMode->comRegs.ctrl |= 0x200;
+ } else {
+ // Anti-aliased, always fetch extra lines
+ viMode->comRegs.ctrl |= 0;
+ }
+ }
+
+ viMode->comRegs.width = width * (hiResInterlaced ? 2 : 1);
+
+ if (tvType < 3) {
+ static const ViModeStruct D_801DF0C0[] = {
+ {
+ // OS_TV_PAL
+ BURST(58, 35, 4, 64),
+ VSYNC(624),
+ HSYNC(3177, 21),
+ LEAP(3183, 3182),
+ HSTART(128, 768),
+ START(95, 569),
+ BURST(107, 2, 9, 0),
+ },
+ {
+ // OS_TV_NTSC
+ BURST(57, 34, 5, 62),
+ VSYNC(524),
+ HSYNC(3093, 0),
+ LEAP(3093, 3093),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ {
+ // OS_TV_MPAL
+ BURST(57, 30, 5, 70),
+ VSYNC(524),
+ HSYNC(3088, 0),
+ LEAP(3100, 3100),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ };
+ const ViModeStruct* ptr = &D_801DF0C0[tvType];
+
+ viMode->comRegs.burst = ptr->burst;
+ viMode->comRegs.vSync = ptr->vSync;
+ viMode->comRegs.hSync = ptr->hSync;
+ viMode->comRegs.leap = ptr->leap;
+ viMode->comRegs.hStart = ptr->hStart;
+ viMode->fldRegs[0].vStart = ptr->vStart;
+ viMode->fldRegs[1].vStart = ptr->vStart;
+ viMode->fldRegs[0].vBurst = ptr->vBurst;
+ viMode->fldRegs[1].vBurst = ptr->vBurst;
+ } else {
+ __assert("../z_vimode.c", 216);
+ }
+
+ viMode->comRegs.hStart += (leftAdjust << 16) + (s16)rightAdjust;
+ viMode->fldRegs[0].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+ viMode->fldRegs[1].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+
+ if (loResDeinterlaced) {
+ viMode->comRegs.vSync++;
+ if (tvType == OS_TV_MPAL) {
+ viMode->comRegs.hSync += HSYNC(1, 4);
+ viMode->comRegs.leap += LEAP((u16)-4, (u16)-2);
+ }
+ } else {
+ viMode->fldRegs[0].vStart += START((u16)-3, (u16)-2);
+ if (tvType == OS_TV_MPAL) {
+ viMode->fldRegs[0].vBurst += BURST((u8)-2, (u8)-1, 12, -1);
+ } else if (tvType == OS_TV_PAL) {
+ viMode->fldRegs[1].vBurst += BURST((u8)-2, (u8)-1, 2, 0);
+ }
+ }
+
+ viMode->comRegs.xScale = (SCREEN_WIDTH << 10) / SCREEN_WIDTH;
+ viMode->comRegs.vCurrent = 0;
+
+ viMode->fldRegs[0].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2));
+ viMode->fldRegs[1].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2) * (loRes ? 1 : 2));
+
+ viMode->fldRegs[0].yScale = yScaleLo | yScaleHiEvenField;
+ viMode->fldRegs[1].yScale = yScaleLo | yScaleHiOddField;
+
+ viMode->fldRegs[0].vIntr = 2;
+ viMode->fldRegs[1].vIntr = 2;
+}
+
+void ViMode_Save(ViMode* viMode) {
+ R_VI_MODE_EDIT_STATE = viMode->editState;
+ R_VI_MODE_EDIT_WIDTH = viMode->viWidth;
+ R_VI_MODE_EDIT_HEIGHT = viMode->viHeight;
+ R_VI_MODE_EDIT_ULY_ADJ = viMode->upperAdjust;
+ R_VI_MODE_EDIT_LRY_ADJ = viMode->lowerAdjust;
+ R_VI_MODE_EDIT_ULX_ADJ = viMode->leftAdjust;
+ R_VI_MODE_EDIT_LRX_ADJ = viMode->rightAdjust;
+
+ if (SREG(58) == 1) {
+ SREG(58) = 0;
+ switch (SREG(59)) {
+ case 1:
+ ViMode_LogPrint(&osViModePalLan1);
+ break;
+
+ case 2:
+ ViMode_LogPrint(&osViModeFpalLan1);
+ break;
+
+ default:
+ ViMode_LogPrint(&viMode->customViMode);
+ break;
+ }
+ }
+}
+
+void ViMode_Load(ViMode* viMode) {
+ //! @bug This condition always fails as the lowest bit is masked out to 0
+ if ((R_VI_MODE_EDIT_WIDTH & ~3) == 1) {
+ R_VI_MODE_EDIT_WIDTH += 4;
+ }
+
+ viMode->editState = R_VI_MODE_EDIT_STATE;
+ viMode->viWidth = R_VI_MODE_EDIT_WIDTH & ~3;
+ viMode->viHeight = R_VI_MODE_EDIT_HEIGHT;
+ viMode->upperAdjust = R_VI_MODE_EDIT_ULY_ADJ;
+ viMode->lowerAdjust = R_VI_MODE_EDIT_LRY_ADJ;
+ viMode->leftAdjust = R_VI_MODE_EDIT_ULX_ADJ;
+ viMode->rightAdjust = R_VI_MODE_EDIT_LRX_ADJ;
+}
+
+void ViMode_Init(ViMode* viMode) {
+ viMode->editState = VI_MODE_EDIT_STATE_INACTIVE;
+ viMode->viWidth = SCREEN_WIDTH;
+ viMode->viHeight = SCREEN_HEIGHT;
+ viMode->leftAdjust = 0;
+ viMode->rightAdjust = 0;
+ viMode->upperAdjust = 0;
+ viMode->lowerAdjust = 0;
+ viMode->viFeatures = OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF;
+ viMode->tvType = osTvType;
+ viMode->fb16Bit = true;
+ viMode->modeN = true;
+ viMode->antialiasOff = false;
+ viMode->loRes = true;
+
+ ViMode_Save(viMode);
+}
+
+void ViMode_Destroy(ViMode* viMode) {
+}
+
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures) {
+ u32 ctrl = viMode->customViMode.comRegs.ctrl;
+
+ if (viFeatures & OS_VI_GAMMA_ON) {
+ ctrl |= OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_OFF) {
+ ctrl &= ~OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_ON) {
+ ctrl |= OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_OFF) {
+ ctrl &= ~OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_DIVOT_ON) {
+ ctrl |= OS_VI_DIVOT;
+ }
+ if (viFeatures & OS_VI_DIVOT_OFF) {
+ ctrl &= ~OS_VI_DIVOT;
+ }
+ viMode->customViMode.comRegs.ctrl = ctrl;
+}
+
+/**
+ * Updates the custom VI mode with controller input and any edits made with the REG editor
+ * (through R_VI_MODE_EDIT_* entries)
+ */
+void ViMode_Update(ViMode* viMode, Input* input) {
+ ViMode_Load(viMode);
+
+ if ((viMode->editState == VI_MODE_EDIT_STATE_ACTIVE) || (viMode->editState == VI_MODE_EDIT_STATE_2) ||
+ (viMode->editState == VI_MODE_EDIT_STATE_3)) {
+ gScreenWidth = viMode->viWidth;
+ gScreenHeight = viMode->viHeight;
+
+ // Controls to reset the ViMode to defaults
+ if (CHECK_BTN_ALL(input->cur.button, BTN_START | BTN_CUP | BTN_CRIGHT)) {
+ ViMode_Init(viMode);
+ }
+
+ // Controls to adjust the screen dimensions (upper-left)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CUP)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->upperAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->upperAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->leftAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->leftAdjust++;
+ }
+ }
+
+ // Controls to adjust the screen dimensions (lower-right)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->lowerAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->lowerAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->rightAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->rightAdjust++;
+ }
+ }
+
+ // Controls to adjust key features
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CDOWN)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) {
+ viMode->loRes = !viMode->loRes;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
+ viMode->antialiasOff = !viMode->antialiasOff;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) {
+ viMode->modeN = !viMode->modeN;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) {
+ viMode->fb16Bit = !viMode->fb16Bit;
+ }
+ }
+
+ // Clamp adjustments
+ if (viMode->editState >= VI_MODE_EDIT_STATE_2) {
+ // Allow parts of the framebuffer to possibly be offscreen by a small margin
+ if (viMode->leftAdjust < -16) {
+ viMode->leftAdjust = -16;
+ }
+ if (viMode->upperAdjust < -50) {
+ viMode->upperAdjust = -50;
+ }
+ if (viMode->rightAdjust > 16) {
+ viMode->rightAdjust = 16;
+ }
+ if (viMode->lowerAdjust > 50) {
+ viMode->lowerAdjust = 50;
+ }
+ } else {
+ // Do not allow parts of the framebuffer to end up offscreen
+ if (viMode->leftAdjust < 0) {
+ viMode->leftAdjust = 0;
+ }
+ if (viMode->upperAdjust < 0) {
+ viMode->upperAdjust = 0;
+ }
+ if (viMode->rightAdjust > 0) {
+ viMode->rightAdjust = 0;
+ }
+ if (viMode->lowerAdjust > 0) {
+ viMode->lowerAdjust = 0;
+ }
+ }
+
+ ViMode_Configure(&viMode->customViMode, OS_VI_UNK28, osTvType, viMode->loRes, viMode->antialiasOff,
+ viMode->modeN, viMode->fb16Bit, viMode->viWidth, viMode->viHeight, viMode->leftAdjust,
+ viMode->rightAdjust, viMode->upperAdjust, viMode->lowerAdjust);
+ ViMode_ConfigureFeatures(viMode, viMode->viFeatures);
+
+ if (viMode->editState == VI_MODE_EDIT_STATE_3) {
+ // Log comparison between the NTSC LAN1 mode and the custom mode
+ ViMode_LogPrint(&osViModeNtscLan1);
+ ViMode_LogPrint(&viMode->customViMode);
+ viMode->editState = VI_MODE_EDIT_STATE_2;
+ }
+ }
+
+ ViMode_Save(viMode);
+}
diff --git a/src/code/z_viscvg.c b/src/code/z_viscvg.c
new file mode 100644
index 000000000..888fa19b3
--- /dev/null
+++ b/src/code/z_viscvg.c
@@ -0,0 +1,90 @@
+#include "global.h"
+
+Gfx D_801C5DD0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_VISCVG | G_RM_VISCVG2),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DE0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DF0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5E00[] = {
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPDisplayList(D_0E000000.fillRect),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+void VisCvg_Init(struct_801F8010* this) {
+ this->type = 0;
+ this->setScissor = false;
+ this->color.r = 255;
+ this->color.g = 255;
+ this->color.b = 255;
+ this->color.a = 255;
+}
+
+void VisCvg_Destroy(struct_801F8010* this) {
+}
+
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp) {
+ Gfx* gfx = *gfxp;
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimDepth(gfx++, -1, -1);
+
+ if (this->setScissor == true) {
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+ }
+
+ switch (this->type) {
+ case 1:
+ gSPDisplayList(gfx++, D_801C5DF0);
+ break;
+
+ case 2:
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5E00);
+ break;
+
+ case 3:
+ gDPSetColor(gfx++, G_SETBLENDCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DD0);
+ break;
+
+ case 4:
+ gDPSetColor(gfx++, G_SETFOGCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DE0);
+ break;
+
+ default:
+ break;
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxp = gfx;
+}
diff --git a/src/code/z_viszbuf.c b/src/code/z_viszbuf.c
index 9970a1e1b..cf603f324 100644
--- a/src/code/z_viszbuf.c
+++ b/src/code/z_viszbuf.c
@@ -1,6 +1,6 @@
#include "global.h"
-#define VISZBUF_ZBUFFRAG_HEIGHT (TMEM_SIZE / (D_801FBBCC * G_IM_SIZ_16b_BYTES))
+#define VISZBUF_ZBUFFRAG_HEIGHT (TMEM_SIZE / (gCfbWidth * G_IM_SIZ_16b_BYTES))
void VisZbuf_Init(VisZbuf* this) {
this->useRgba = false;
@@ -42,12 +42,12 @@ void VisZbuf_Draw(VisZbuf* this, Gfx** gfxP, void* zbuffer) {
gDPSetColor(gfx++, G_SETPRIMCOLOR, this->primColor.rgba);
gDPSetColor(gfx++, G_SETENVCOLOR, this->envColor.rgba);
- for (y = 0; y < (D_801FBBCE - height) + 1; y += height) {
- gDPLoadTextureTile(gfx++, zbuffer, fmt, G_IM_SIZ_16b, D_801FBBCC, 0, 0, y, D_801FBBCC - 1, (y + height) - 1, 0,
+ for (y = 0; y < (gCfbHeight - height) + 1; y += height) {
+ gDPLoadTextureTile(gfx++, zbuffer, fmt, G_IM_SIZ_16b, gCfbWidth, 0, 0, y, gCfbWidth - 1, (y + height) - 1, 0,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
- gSPTextureRectangle(gfx++, 0, y << 2, D_801FBBCC << 2, (y + height) << 2, G_TX_RENDERTILE, 0, y << 5, 1 << 10,
+ gSPTextureRectangle(gfx++, 0, y << 2, gCfbWidth << 2, (y + height) << 2, G_TX_RENDERTILE, 0, y << 5, 1 << 10,
1 << 10);
}
diff --git a/src/libultra/flash/osFlash.c b/src/libultra/flash/osFlash.c
index 3ed33f45d..cd4420c4a 100644
--- a/src/libultra/flash/osFlash.c
+++ b/src/libultra/flash/osFlash.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "ultra64.h"
#include "global.h"
diff --git a/src/libultra/gu/position.c b/src/libultra/gu/position.c
index 4af6dadc4..9ba9d3570 100644
--- a/src/libultra/gu/position.c
+++ b/src/libultra/gu/position.c
@@ -6,8 +6,12 @@
*/
void guPositionF(f32 mf[4][4], f32 rot, f32 pitch, f32 yaw, f32 scale, f32 x, f32 y, f32 z) {
static f32 D_80134D00 = M_PI / 180.0f;
- f32 sinr, sinp, sinh;
- f32 cosr, cosp, cosh;
+ f32 sinr;
+ f32 sinp;
+ f32 sinh;
+ f32 cosr;
+ f32 cosp;
+ f32 cosh;
rot *= D_80134D00;
pitch *= D_80134D00;
diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c
index fd4c4e459..e9431a741 100644
--- a/src/libultra/io/contpfs.c
+++ b/src/libultra/io/contpfs.c
@@ -66,7 +66,8 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
u8 buf[BLOCKSIZE];
u8 comp[BLOCKSIZE];
u8 mask = 0;
- s32 i, j = 0;
+ s32 i = 0;
+ s32 j = 0;
u16 index[4];
newid->repaired = 0xFFFFFFFF;
diff --git a/src/libultra/io/osViModeMpalLan1.c b/src/libultra/io/osViModeMpalLan1.c
index c7c09f659..ccccf68ae 100644
--- a/src/libultra/io/osViModeMpalLan1.c
+++ b/src/libultra/io/osViModeMpalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeMpalLan1 = {
OS_VI_MPAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4651E39, // burst
- 0x20D, // vSync
- 0x40C11, // hSync
- 0xC190C1A, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 30, 5, 70), // burst
+ VSYNC(525), // vSync
+ HSYNC(3089, 4), // hSync
+ LEAP(3097, 3098), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscHpf1.c b/src/libultra/io/osViModeNtscHpf1.c
index ac0a1fa2b..5f88f4e94 100644
--- a/src/libultra/io/osViModeNtscHpf1.c
+++ b/src/libultra/io/osViModeNtscHpf1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscHpf1 = {
OS_VI_NTSC_HPF1, // type
{
// comRegs
- 0x324E, // ctrl
- 640, // width
- 0x3E52239, // burst
- 0x20C, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x400, // xScale
- 0, // vCurrent
+ 0x324E, // ctrl
+ WIDTH(640), // width
+ BURST(57, 34, 5, 62), // 0x3E52239, // burst
+ VSYNC(524), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // 0x6C02EC, // hStart
+ SCALE(1, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x500, // origin
- 0x2000800, // yScale
- 0x2301FD, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(1280), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(35, 509), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0xA00, // origin
- 0x2000800, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2 // vIntr
+ ORIGIN(2560), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2) // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscLan1.c b/src/libultra/io/osViModeNtscLan1.c
index 632d763f4..86eb473b7 100644
--- a/src/libultra/io/osViModeNtscLan1.c
+++ b/src/libultra/io/osViModeNtscLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscLan1 = {
OS_VI_NTSC_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x3E52239, // burst
- 0x20D, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 34, 5, 62), // burst
+ VSYNC(525), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModePalLan1.c b/src/libultra/io/osViModePalLan1.c
index 174cbf142..f875bb731 100644
--- a/src/libultra/io/osViModePalLan1.c
+++ b/src/libultra/io/osViModePalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModePalLan1 = {
OS_VI_PAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4541E3A, // burst
- 0x271, // vSync
- 0x170C69, // hSync
- 0xC6F0C6D, // leap
- 0x800300, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(58, 30, 4, 69), // burst
+ VSYNC(625), // vSync
+ HSYNC(3177, 23), // hSync
+ LEAP(3183, 3181), // leap
+ HSTART(128, 768), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2 // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/pfschecker.c b/src/libultra/io/pfschecker.c
index bf885a1a4..d3a635768 100644
--- a/src/libultra/io/pfschecker.c
+++ b/src/libultra/io/pfschecker.c
@@ -18,8 +18,10 @@ s32 osPfsChecker(OSPfs* pfs) {
__OSInodeUnit nextNodeInFile[16];
__OSInodeCache cache;
s32 fixed = 0;
- u8 bank, prevBank = 254;
- s32 cc, cl;
+ u8 bank = 254;
+ u8 prevBank = 254;
+ s32 cc;
+ s32 cl;
s32 offset;
ret = __osCheckId(pfs);
diff --git a/src/libultra/libc/ldiv.c b/src/libultra/libc/ldiv.c
index 21fe84e80..9f9d75031 100644
--- a/src/libultra/libc/ldiv.c
+++ b/src/libultra/libc/ldiv.c
@@ -5,7 +5,7 @@ ldiv_t ldiv(long numer, long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
@@ -18,7 +18,7 @@ lldiv_t lldiv(long long numer, long long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c
index 399d2caf4..0fd42d1ed 100644
--- a/src/libultra/libc/ll.c
+++ b/src/libultra/libc/ll.c
@@ -36,7 +36,7 @@ void __ull_divremi(unsigned long long* quotient, unsigned long long* remainder,
long long __ll_mod(long long left, long long right) {
long long rem = left % right;
- if ((rem < 0 && right > 0) || (rem > 0 && right < 0)) {
+ if (((rem < 0) && (right > 0)) || ((rem > 0) && (right < 0))) {
rem += right;
}
return rem;
diff --git a/src/libultra/rmon/xldtob.c b/src/libultra/rmon/xldtob.c
index 460d0951c..e943e51e2 100644
--- a/src/libultra/rmon/xldtob.c
+++ b/src/libultra/rmon/xldtob.c
@@ -107,7 +107,7 @@ void _Ldtob(_Pft* args, u8 type) {
val = (val - lo) * 1.0e8;
}
ptr = ptr + 8;
- for (j = 8; lo > 0 && --j >= 0;) {
+ for (j = 8; (lo > 0) && (--j >= 0);) {
qr = ldiv(lo, 10);
*--ptr = qr.rem + '0';
lo = qr.quot;
diff --git a/src/libultra/rmon/xprintf.c b/src/libultra/rmon/xprintf.c
index ddb83652d..813520f01 100644
--- a/src/libultra/rmon/xprintf.c
+++ b/src/libultra/rmon/xprintf.c
@@ -206,7 +206,7 @@ void _Putfld(_Pft* px, va_list* pap, unsigned char code, unsigned char* ac) {
case 's':
px->s = va_arg(*pap, char*);
px->n1 = strlen(px->s);
- if (px->prec >= 0 && px->n1 > px->prec) {
+ if ((px->prec >= 0) && (px->n1 > px->prec)) {
px->n1 = px->prec;
}
break;
diff --git a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
index be1958cb4..134e7227a 100644
--- a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
+++ b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
@@ -229,7 +229,7 @@ void BgF40Block_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004640);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerBlockCol);
if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
@@ -373,5 +373,5 @@ void BgF40Block_Update(Actor* thisx, PlayState* play) {
}
void BgF40Block_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_0043D0);
+ Gfx_DrawDListOpa(play, gStoneTowerBlockDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
index 075f38607..2c9919728 100644
--- a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
@@ -42,7 +42,7 @@ void BgF40Flift_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004240);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerTempleSquareElevatorCol);
this->dyna.actor.params = 1;
this->actionFunc = func_808D75F0;
}
@@ -91,5 +91,5 @@ void BgF40Flift_Update(Actor* thisx, PlayState* play) {
}
void BgF40Flift_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_004038);
+ Gfx_DrawDListOpa(play, gStoneTowerTempleSquareElevatorDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
index 97fd3f068..bf6244efe 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
@@ -5,6 +5,7 @@
*/
#include "z_bg_f40_swlift.h"
+#include "objects/object_f40_obj/object_f40_obj.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -12,11 +13,13 @@
void BgF40Swlift_Init(Actor* thisx, PlayState* play);
void BgF40Swlift_Destroy(Actor* thisx, PlayState* play);
-void BgF40Swlift_Update(Actor* thisx, PlayState* play);
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2);
void BgF40Swlift_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Bg_F40_Swlift_InitVars = {
+static s32 sSwitchFlags[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+static s32 sHeights[4];
+
+const ActorInit Bg_F40_Swlift_InitVars = {
ACTOR_BG_F40_SWLIFT,
ACTORCAT_BG,
FLAGS,
@@ -28,24 +31,86 @@ ActorInit Bg_F40_Swlift_InitVars = {
(ActorFunc)BgF40Swlift_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_8096F540[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 550, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 5000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-#endif
+void BgF40Swlift_Init(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+ s32 index;
+ s32 pad;
-extern InitChainEntry D_8096F540[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ index = BG_F40_SWLIFT_GET_INDEX(thisx);
+ if ((index < 0) || (index >= 5)) { //! @bug An index greater than 3 will cause an out of bounds array access.
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-extern UNK_TYPE D_06003B08;
-extern UNK_TYPE D_06003E80;
+ sHeights[index] = this->dyna.actor.world.pos.y;
+ sSwitchFlags[index] = BG_F40_SWLIFT_GET_SWITCHFLAG(thisx);
+ if (index != 0) {
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Init.s")
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerVerticallyOscillatingPlatformCol);
+ this->dyna.actor.params = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Destroy.s")
+void BgF40Swlift_Destroy(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Update.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Draw.s")
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ BgF40Swlift* this = THIS;
+ s32 i;
+
+ for (i = 1; i < ARRAY_COUNT(sSwitchFlags); i++) {
+ if ((sSwitchFlags[i] == 0xFF) || !Flags_GetSwitch(play, sSwitchFlags[i])) {
+ break;
+ }
+ }
+
+ i--;
+ if (i != this->dyna.actor.params) {
+ f32 heightOffset;
+
+ this->dyna.actor.params = -1;
+ heightOffset = (sHeights[i] - this->dyna.actor.world.pos.y) * 0.1f;
+ if (heightOffset > 0.0f) {
+ heightOffset = CLAMP(heightOffset, 0.5f, 15.0f);
+ } else {
+ heightOffset = CLAMP(heightOffset, -15.0f, -0.5f);
+ }
+
+ if (Math_StepToF(&this->dyna.actor.speed, heightOffset, 1.0f) && (fabsf(heightOffset) <= 0.5f)) {
+ if (Math_StepToF(&this->dyna.actor.world.pos.y, sHeights[i], fabsf(this->dyna.actor.speed))) {
+ this->dyna.actor.params = i;
+ this->timer = 48;
+ this->dyna.actor.speed = 0.0f;
+ }
+ } else {
+ this->dyna.actor.world.pos.y += this->dyna.actor.speed;
+ }
+ } else {
+ if (this->timer == 0) {
+ this->timer = 48;
+ }
+ this->timer--;
+ this->dyna.actor.world.pos.y =
+ sHeights[this->dyna.actor.params] + (sin_rad(this->timer * (M_PI / 24.0f)) * 5.0f);
+ }
+}
+
+void BgF40Swlift_Draw(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+
+ Gfx_DrawDListOpa(play, gStoneTowerVerticallyOscillatingPlatformDL);
+}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
index a687fc642..e377b73e0 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
@@ -1,13 +1,16 @@
#ifndef Z_BG_F40_SWLIFT_H
#define Z_BG_F40_SWLIFT_H
+#define BG_F40_SWLIFT_GET_SWITCHFLAG(thisx) ((thisx)->params & 0xFF)
+#define BG_F40_SWLIFT_GET_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+
#include "global.h"
struct BgF40Swlift;
typedef struct BgF40Swlift {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x1C];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ s32 timer;
} BgF40Swlift; // size = 0x160
#endif // Z_BG_F40_SWLIFT_H
diff --git a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
index 693fff484..c226c89f3 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
@@ -85,7 +85,7 @@ void func_80BD66AC(BgHakaTomb* this, PlayState* play) {
if (Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
}
- if (!func_80BD6638(&csId, this->csIdList, ARRAY_COUNT(this->csIdList)) && (csId < 0) &&
+ if (!func_80BD6638(&csId, this->csIdList, ARRAY_COUNT(this->csIdList)) && (csId <= CS_ID_NONE) &&
Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= ACTOR_FLAG_1;
if (this->dyna.actor.isTargeted) {
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
index c7fa3d69e..bcc662c9f 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
@@ -4,6 +4,7 @@
* Description: Goron Link Switch
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_hakugin_switch.h"
#include "z64rumble.h"
#include "objects/object_goronswitch/object_goronswitch.h"
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
index 48045527f..6ce5f7d81 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
@@ -93,7 +93,10 @@ s32 func_80C0A95C(BgIkninSusceil* this, PlayState* play) {
f32 new_var;
Player* player = GET_PLAYER(play);
Vec3f offset;
- f32 temp1, temp2, temp3, temp4;
+ f32 temp1;
+ f32 temp2;
+ f32 temp3;
+ f32 temp4;
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
for (i = 0; i < 7; i++) {
diff --git a/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
index 8246a0298..ac9d089a4 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_bg_keikoku_spr.c
+ * Overlay: ovl_Bg_Keikoku_Spr
+ * Description: Termina Field Fountain Water
+ */
+
#include "z_bg_keikoku_spr.h"
#include "objects/object_keikoku_obj/object_keikoku_obj.h"
@@ -10,7 +16,6 @@ void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Update(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play);
-/*
const ActorInit Bg_Keikoku_Spr_InitVars = {
ACTOR_BG_KEIKOKU_SPR,
ACTORCAT_PROP,
@@ -20,14 +25,42 @@ const ActorInit Bg_Keikoku_Spr_InitVars = {
(ActorFunc)BgKeikokuSpr_Init,
(ActorFunc)BgKeikokuSpr_Destroy,
(ActorFunc)BgKeikokuSpr_Update,
- (ActorFunc)BgKeikokuSpr_Draw
+ (ActorFunc)BgKeikokuSpr_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Init.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_CONTINUE),
+ ICHAIN_VEC3F_DIV1000(scale, 20, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Destroy.s")
+void BgKeikokuSpr_Init(Actor* thisx, PlayState* play) {
+ BgKeikokuSpr* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Update.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Draw.s")
+void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Update(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0001F8));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000100);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0003F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000300);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0005F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000500);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
index 920842b0b..5302c6a90 100644
--- a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
+++ b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
@@ -38,12 +38,12 @@ void BgTobira01_Action(BgTobira01* this, PlayState* play) {
CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
} else if (CutsceneManager_IsNext(csId)) {
CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
this->cutsceneRequested = false;
} else {
CutsceneManager_Queue(csId);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) && (this->posYTick == 0) &&
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) && (this->posYTick == 0) &&
(play->actorCtx.playerImpact.timer != 0) &&
(play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND) &&
(SurfaceType_GetSceneExitIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId) == 6)) {
@@ -52,7 +52,7 @@ void BgTobira01_Action(BgTobira01* this, PlayState* play) {
}
prevPosYTick = this->posYTick;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE)) {
this->posYTick++;
} else {
this->posYTick--;
@@ -65,9 +65,9 @@ void BgTobira01_Action(BgTobira01* this, PlayState* play) {
this->timer = 180;
}
- if (!(player->stateFlags1 & PLAYER_STATE1_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_88_40) &&
+ if (!(player->stateFlags1 & PLAYER_STATE1_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) &&
(DECR(this->timer) == 0)) {
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
}
}
@@ -76,7 +76,7 @@ void BgTobira01_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gGoronDoorCol);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
Actor_SetScale(&this->dyna.actor, 1.0f);
this->timer = gSaveContext.save.isNight;
this->posYTick = 0;
diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
index d4d2c7274..8bf39145c 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
@@ -89,13 +89,12 @@ void BgUmajump_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- this->objectIndex = BG_UMAJUMP_GET_OBJECT_INDEX(thisx);
- thisx->params = BG_UMAJUMP_GET_FF(thisx);
+ this->pathIndex = BG_UMAJUMP_GET_PATH_INDEX(thisx);
+ thisx->params = BG_UMAJUMP_GET_TYPE(thisx);
- if ((thisx->params == BG_UMAJUMP_TYPE_2)) {
- if ((((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20)) &&
- !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) &&
- (thisx->csId != CS_ID_NONE)) {
+ if (thisx->params == BG_UMAJUMP_TYPE_2) {
+ if ((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20) &&
+ !CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && (thisx->csId != CS_ID_NONE)) {
this->actionFunc = BgUmajump_CheckDistance;
thisx->update = func_8091A5A0;
thisx->flags |= ACTOR_FLAG_10;
diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
index 62aaf6cb7..fe29e34cb 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
@@ -3,8 +3,8 @@
#include "global.h"
-#define BG_UMAJUMP_GET_OBJECT_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
-#define BG_UMAJUMP_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define BG_UMAJUMP_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+#define BG_UMAJUMP_GET_TYPE(thisx) ((thisx)->params & 0xFF)
typedef enum {
BG_UMAJUMP_TYPE_1 = 1,
@@ -24,7 +24,8 @@ typedef struct BgUmajump {
/* 0x15C */ BgUmajumpActionFunc actionFunc;
/* 0x160 */ union {
s32 objectIndex;
- s32 rotationTimer; // y rotation
+ s32 rotationTimer; // y rotation
+ s32 pathIndex;
};
/* 0x164 */ s32 hasSoundPlayed;
/* 0x168 */ Actor* horse;
diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
index aa6291aae..aa2929f28 100644
--- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c
+++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
@@ -4,7 +4,6 @@
* Description: Igos du Ikana window - curtains and ray effects
*/
-#include "prevent_bss_reordering.h"
#include "z_boss_06.h"
#include "z64shrink_window.h"
#include "overlays/actors/ovl_En_Knight/z_en_knight.h"
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
index 76a4230f5..ba8d1b834 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
@@ -15,8 +15,12 @@ void DemoMoonend_Destroy(Actor* thisx, PlayState* play);
void DemoMoonend_Update(Actor* thisx, PlayState* play);
void DemoMoonend_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Demo_Moonend_InitVars = {
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play);
+void func_80C17B60(DemoMoonend* this, PlayState* play);
+void func_80C17C48(DemoMoonend* this, PlayState* play);
+void func_80C17FCC(Actor* thisx, PlayState* play);
+
+const ActorInit Demo_Moonend_InitVars = {
ACTOR_DEMO_MOONEND,
ACTORCAT_ITEMACTION,
FLAGS,
@@ -28,28 +32,185 @@ ActorInit Demo_Moonend_InitVars = {
(ActorFunc)DemoMoonend_Draw,
};
-#endif
+void DemoMoonend_Init(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-extern UNK_TYPE D_06001214;
-extern UNK_TYPE D_0600B540;
-extern UNK_TYPE D_060129F0;
+ Actor_SetScale(&this->actor, 0.1f);
+ this->actionFunc = DemoMoonend_DoNothing;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Init.s")
+ if (DEMOMOONEND_GET_PARAMS_F(thisx) == 1) {
+ Actor_SetScale(&this->actor, 0.05f);
+ Actor_SetScale(&this->actor, 6.0f);
+ this->actor.draw = NULL;
+ this->cueType = CS_CMD_ACTOR_CUE_558;
+ this->actionFunc = func_80C17B60;
+ } else {
+ Actor_SetScale(&this->actor, 0.095f);
+ func_80183430(&this->skeletonInfo, &object_moonend_Blob_00B5A0, &object_moonend_Blob_001214, this->jointTable,
+ this->morphTable, NULL);
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->cueType = CS_CMD_ACTOR_CUE_560;
+ this->actionFunc = func_80C17C48;
+ this->actor.home.rot.z = 0;
+ this->actor.draw = NULL;
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Destroy.s")
+void DemoMoonend_Destroy(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B50.s")
+ if (DEMOMOONEND_GET_PARAMS_F(thisx) != 1) {
+ func_8018349C(&this->skeletonInfo);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B60.s")
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17C48.s")
+void func_80C17B60(DemoMoonend* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Update.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = NULL;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17E70.s")
+ case 2:
+ this->actor.draw = func_80C17FCC;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17EE0.s")
+ default:
+ break;
+ }
+ }
+ if (this->cueId == 2) {
+ func_800B9010(&this->actor, NA_SE_EV_RAINBOW - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Draw.s")
+void func_80C17C48(DemoMoonend* this, PlayState* play) {
+ if (func_80183DE0(&this->skeletonInfo)) {
+ this->actor.home.rot.z = 0;
+ }
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17FCC.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 0.0f;
+ break;
+
+ case 2:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_EXPLOSION);
+ this->actor.home.rot.z = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (this->actor.home.rot.z != 0) {
+ func_800B9010(&this->actor, NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+ if ((play->csCtx.state != CS_STATE_IDLE) && (gSaveContext.sceneLayer == 8) && (play->csCtx.scriptIndex == 0)) {
+ switch (play->csCtx.curFrame) {
+ case 5:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
+ break;
+
+ case 50:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 100:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM3);
+ break;
+
+ case 150:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 200:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM4);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void DemoMoonend_Update(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+s32 func_80C17E70(PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 2) {
+ Matrix_Push();
+ Matrix_RotateYS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000, MTXMODE_APPLY);
+ }
+
+ return true;
+}
+
+s32 func_80C17EE0(PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 8) {
+ Matrix_Pop();
+ }
+
+ return true;
+}
+
+void DemoMoonend_Draw(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+ Mtx* mtx;
+
+ AnimatedMat_Draw(play, (AnimatedMaterial*)Lib_SegmentedToVirtual(object_moonend_Matanimheader_00B540));
+
+ mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
+
+ if (mtx != NULL) {
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ func_8018450C(play, &this->skeletonInfo, mtx, func_80C17E70, func_80C17EE0, &this->actor);
+ }
+}
+
+void func_80C17FCC(Actor* thisx, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_moonend_Matanimheader_0129F0));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_moonend_DL_010C40);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
index d36dcb284..fd229e004 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
@@ -2,14 +2,21 @@
#define Z_DEMO_MOONEND_H
#include "global.h"
+#include "objects/object_moonend/object_moonend.h"
struct DemoMoonend;
typedef void (*DemoMoonendActionFunc)(struct DemoMoonend*, PlayState*);
+#define DEMOMOONEND_GET_PARAMS_F(thisx) (((thisx)->params) & 0xF)
+
typedef struct DemoMoonend {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x19C];
+ /* 0x144 */ SkeletonInfo skeletonInfo;
+ /* 0x174 */ Vec3s jointTable[30];
+ /* 0x228 */ Vec3s morphTable[30];
+ /* 0x2DC */ u16 cueType;
+ /* 0x2DE */ u16 cueId;
/* 0x2E0 */ DemoMoonendActionFunc actionFunc;
} DemoMoonend; // size = 0x2E4
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
index 66f70d9c6..36415d7db 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -843,9 +843,10 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
case 594:
Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL24_SCREAM2);
break;
- }
- if (1) {}
+ default:
+ break;
+ }
if ((play->csCtx.curFrame >= 62) && (play->csCtx.curFrame < 273)) {
if ((Rand_ZeroOne() < 0.75f) && ((play->state.frames % 2) != 0)) {
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index 64899a807..de20e6f63 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -572,6 +572,9 @@ void func_808B9CE8(DoorWarp1* this, PlayState* play) {
gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0x00FFFFFF) |
((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF) << 0x18);
break;
+
+ default:
+ break;
}
gSaveContext.save.saveInfo.unk_EA8[1] = (gSaveContext.save.saveInfo.unk_EA8[1] & 0xFFFFFF00) |
@@ -810,6 +813,9 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
case PLAYER_FORM_HUMAN:
temp_f0 = -25.0f;
break;
+
+ default:
+ break;
}
temp_f2 = this->dyna.actor.world.pos.y + (this->dyna.actor.shape.yOffset * 0.1f) + temp_f0;
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
index e18751369..9165b9392 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.c
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
@@ -203,7 +203,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
}
Math_ScaledStepToS(&this->actor.world.rot.y, sp72,
- (this->unk_1CF > 0) ? 1000 : (s16)(((sp70 < 0) ? -sp70 : sp70) * sp64));
+ (this->unk_1CF > 0) ? 1000 : (s16)(ABS_ALT(sp70) * sp64));
}
Math_ScaledStepToS(&this->actor.world.rot.x, sp6E, ABS_ALT(sp6C) * sp64);
diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
index 677c029cb..266e2c47b 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -5,6 +5,7 @@
*/
#include "z_en_cow.h"
+#include "z64horse.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -130,7 +131,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->animationCycle = 0;
this->actor.targetMode = 6;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
func_801A5080(4);
break;
case EN_COW_TYPE_TAIL:
@@ -264,13 +265,13 @@ void EnCow_Talk(EnCow* this, PlayState* play) {
void EnCow_Idle(EnCow* this, PlayState* play) {
if ((play->msgCtx.ocarinaMode == 0) || (play->msgCtx.ocarinaMode == 4)) {
- if (D_801BDAA4 != 0) {
+ if (gHorsePlayedEponasSong) {
if (this->flags & EN_COW_FLAG_WONT_GIVE_MILK) {
this->flags &= ~EN_COW_FLAG_WONT_GIVE_MILK;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
} else if ((this->actor.xzDistToPlayer < 150.0f) &&
ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 25000) {
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
this->actionFunc = EnCow_Talk;
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 170.0f);
diff --git a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
index 558824ad8..8a8770371 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
@@ -197,7 +197,8 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
}
if (this->unk_278 == ENDAIKU_PARAMS_FF_3) {
- f32 sq, abs;
+ f32 xzDist;
+ f32 yawDiff;
Math_ApproachF(&this->actor.world.pos.x, this->unk_26C.x, 0.5f,
fabsf(2.0f * Math_SinS(this->actor.world.rot.y)));
@@ -205,9 +206,9 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
fabsf(2.0f * Math_CosS(this->actor.world.rot.y)));
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_282, 1, 0x7D0, 0xA);
- sq = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
- abs = fabsf(this->actor.world.rot.y - this->unk_282);
- if ((sq < SQ(2.0f)) && (this->unk_258 != NULL) && (abs < 10.0f)) {
+ xzDist = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
+ yawDiff = fabsf(this->actor.world.rot.y - this->unk_282);
+ if ((xzDist < 4.0f) && (this->unk_258 != NULL) && (yawDiff < 10.0f)) {
this->unk_25C++;
if (this->unk_25C >= this->unk_258->count) {
this->unk_25C = 0;
diff --git a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
index 2496a4cc2..cef97a8b0 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -667,7 +667,9 @@ void EnDekunuts_Update(Actor* thisx, PlayState* play) {
s32 EnDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDekunuts* this = THIS;
- f32 arg1, arg2, arg3;
+ f32 arg1;
+ f32 arg2;
+ f32 arg3;
f32 currentFrame;
if (this->actionFunc == func_808BDA4C) {
diff --git a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
index 2a5198d1f..c7dbd8888 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -266,34 +266,33 @@ s32 func_80A50950(EnDnbUnkStruct* arg0, PlayState* play2) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 256; i++, arg0++) {
- if (arg0->isEnabled == 1) {
- if (!isGfxSetup) {
- POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
- isGfxSetup = true;
- }
- Matrix_Push();
-
- //! FAKE:
- if (1) {}
-
- arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
-
- Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
- Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
-
- Matrix_Pop();
- sp5C += 1;
+ if (arg0->isEnabled != 1) {
+ continue;
}
+
+ if (!isGfxSetup) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
+ isGfxSetup = true;
+ }
+ Matrix_Push();
+
+ arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
+
+ Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
+ Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
+ gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
+
+ Matrix_Pop();
+ sp5C += 1;
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
index 503ce584e..8ee28ad7d 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -62,8 +62,10 @@ static Color_RGBAf sOuterColors[] = {
};
typedef struct {
- u8 r, g, b;
-} FairyColorFlags;
+ /* 0x0 */ u8 r;
+ /* 0x1 */ u8 g;
+ /* 0x2 */ u8 b;
+} FairyColorFlags; // size = 0x3
static FairyColorFlags sColorFlags[] = {
{ 0, 0, 0 }, { 1, 0, 0 }, { 1, 2, 0 }, { 1, 0, 2 }, { 0, 1, 0 }, { 2, 1, 0 }, { 0, 1, 2 },
diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
index 6a7e96b81..9c5bbf42e 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
@@ -114,7 +114,7 @@ void EnEndingHero6_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
OPEN_DISPS(play->state.gfxCtx);
- if (this->npcIndex >= 4 && limbIndex == 15) {
+ if ((this->npcIndex >= 4) && (limbIndex == 15)) {
index = this->npcIndex - 4;
gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[index]);
}
@@ -136,25 +136,32 @@ void EnEndingHero6_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
- if (this->objectIndex >= 0 && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ if ((this->objectIndex >= 0) && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectIndex].segment);
switch (this->npcIndex) {
case 4:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
+
case 5:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
+
case 6:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
+
case 7:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
+
case 8:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
if (this->npcIndex == 0) {
diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.c b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
index d23e6b9ee..645a757a0 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -502,7 +502,7 @@ void EnFamos_Chase(EnFamos* this, PlayState* play) {
surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
if ((this->actor.xzDistToPlayer < 30.0f) && (this->actor.floorHeight > BGCHECK_Y_MIN) && // close enough
- (surfaceType != FLOOR_PROPERTY_12 && surfaceType != FLOOR_PROPERTY_13)) {
+ ((surfaceType != FLOOR_PROPERTY_12) && (surfaceType != FLOOR_PROPERTY_13))) {
EnFamos_SetupAttackAim(this);
} else if ((Player_GetMask(play) == PLAYER_MASK_STONE) ||
@@ -545,7 +545,8 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) {
surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
hitFloor = this->actor.bgCheckFlags & BGCHECKFLAG_GROUND;
- if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == 0xC) || (surfaceType == 0xD)) {
+ if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == FLOOR_PROPERTY_12) ||
+ (surfaceType == FLOOR_PROPERTY_13)) {
this->collider1.base.atFlags &= ~AT_ON;
this->collider2.base.atFlags |= AT_ON;
if (hitFloor) {
@@ -747,7 +748,7 @@ void EnFamos_Update(Actor* thisx, PlayState* play) {
f32 oldHeight;
s32 oldHoverTimer; // save old value to test if changed
- if (this->debrisTimer <= 0 ||
+ if ((this->debrisTimer <= 0) ||
(this->debrisTimer--, EnFamos_UpdateDebrisPosRot(this), (this->actionFunc != EnFamos_DeathFade))) {
oldHoverTimer = this->hoverTimer;
EnFamos_UpdateFlipStatus(this);
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.c b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
index 925dc93df..0f9b7594e 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -107,7 +107,7 @@ s32 EnFg_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s32 ret;
ret = false;
- if (animIndex >= 0 && animIndex < 4) {
+ if ((animIndex >= 0) && (animIndex < 4)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -151,15 +151,19 @@ s32 EnFg_GetDamageEffect(EnFg* this) {
case 1:
ret = FG_DMGEFFECT_DEKUSTICK;
break;
+
case 15:
ret = FG_DMGEFFECT_HOOKSHOT;
break;
+
case 14:
ret = FG_DMGEFFECT_ARROW;
break;
+
case 3:
ret = FG_DMGEFFECT_ICEARROW;
break;
+
default:
ret = FG_DMGEFFECT_EXPLOSION;
break;
@@ -187,8 +191,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.world.pos.y = this->actor.floorHeight + 2.0f;
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_ARROW:
this->actor.flags &= ~ACTOR_FLAG_1;
this->skelAnime.playSpeed = 0.0f;
@@ -202,10 +208,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
- if (1) {}
this->actor.params = FG_BLACK;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
@@ -218,6 +224,7 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (DECR(this->timer) == 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_JUMP);
@@ -251,8 +258,10 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
@@ -269,6 +278,7 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
this->skelAnime.curFrame = 8.0f;
@@ -461,26 +471,28 @@ void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 10; i++, dustEffect++) {
- if (dustEffect->type) {
- if (!firstDone) {
- POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
- firstDone = true;
- }
-
- if (1) {}
- alpha = (255.0f / 16.0f) * dustEffect->timer;
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
- gDPPipeSync(POLY_XLU_DISP++);
- Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- index = 0.5f * dustEffect->timer;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
+ if (dustEffect->type == 0) {
+ continue;
}
+
+ if (!firstDone) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
+ firstDone = true;
+ }
+
+ alpha = (255.0f / 16.0f) * dustEffect->timer;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
+ gDPPipeSync(POLY_XLU_DISP++);
+ Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ index = 0.5f * dustEffect->timer;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
+ gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
index ef15c27a9..010106fe5 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -3,7 +3,7 @@
* Overlay: ovl_En_Fishing
* Description: Fishing Pond Elements (Owner, Fish, Props, Effects...)
*/
-#include "prevent_bss_reordering.h"
+
#include "z_en_fishing.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
index 3cf468a88..b39a41836 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -126,7 +126,7 @@ static Vec3f sShopItemPositions[3] = {
s32 EnFsn_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -138,13 +138,17 @@ u16 EnFsn_GetWelcome(PlayState* play) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_NONE:
return 0x29CC;
+
case PLAYER_MASK_DEKU:
return 0x29FC;
+
case PLAYER_MASK_GORON:
case PLAYER_MASK_ZORA:
return 0x29FD;
+
case PLAYER_MASK_KAFEIS_MASK:
return 0x2364;
+
default:
return 0x29FE;
}
@@ -159,8 +163,9 @@ void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
} else {
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
- break;
}
+ break;
+
case 0x29E0:
if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
this->flags |= ENFSN_GIVE_ITEM;
@@ -171,17 +176,20 @@ void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
break;
} else {
this->textId = 0x29E1;
- break;
}
+ break;
+
case 0x29E1:
this->textId = 0x29E2;
break;
+
case 0x29E2:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_KEATONS_MASK;
this->getItemId = GI_MASK_KEATON;
this->textId = 0x29E3;
break;
+
case 0x29E3:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_LETTER_TO_MAMA;
@@ -189,10 +197,14 @@ void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_80_10);
this->textId = 0x29F1;
break;
+
case 0x29F1:
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->textId, &this->actor);
if (this->flags & ENFSN_END_CONVERSATION) {
@@ -210,7 +222,7 @@ void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
void EnFsn_HandleSetupResumeInteraction(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play) &&
- this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
+ (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED)) {
Actor_ProcessTalkRequest(&this->actor, &play->state);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
if (ENFSN_IS_SHOP(&this->actor)) {
@@ -301,7 +313,7 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
}
s16 EnFsn_GetThirdDayItemId(void) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && CURRENT_DAY == 3) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && (CURRENT_DAY == 3)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
return SI_BOMB_BAG_30_1;
}
@@ -314,16 +326,22 @@ s16 EnFsn_GetStolenItemId(u32 stolenItem) {
switch (stolenItem) {
case ITEM_BOTTLE:
return SI_BOTTLE;
+
case ITEM_SWORD_GREAT_FAIRY:
return SI_SWORD_GREAT_FAIRY;
+
case ITEM_SWORD_KOKIRI:
return SI_SWORD_KOKIRI;
+
case ITEM_SWORD_RAZOR:
return SI_SWORD_RAZOR;
+
case ITEM_SWORD_GILDED:
return SI_SWORD_GILDED;
+
+ default:
+ return SI_NONE;
}
- return SI_NONE;
}
s32 EnFsn_HasItemsToSell(void) {
@@ -450,6 +468,7 @@ s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
return true;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
@@ -457,8 +476,10 @@ s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, PlayState* play) {
func_80151BB4(play, 3);
this->actionFunc = EnFsn_SetupEndInteraction;
return true;
+
+ default:
+ return false;
}
- return false;
}
s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, PlayState* play, Input* input) {
@@ -487,10 +508,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -503,10 +524,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -765,7 +786,7 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
this->animIndex = FSN_ANIM_SLAM_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
} else {
- if (this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP && Animation_OnFrame(&this->skelAnime, 18.0f)) {
+ if ((this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP) && Animation_OnFrame(&this->skelAnime, 18.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
if (this->flags & ENFSN_CALM_DOWN) {
@@ -828,20 +849,26 @@ void EnFsn_StartBuying(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29CD;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CD:
this->actor.textId = 0x29CE;
EnFsn_HandleLookToShopkeeperBuyingCutscene(this);
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CE:
this->actor.textId = 0xFF;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 0x29CF:
player->exchangeItemId = PLAYER_IA_NONE;
this->actionFunc = EnFsn_SetupDeterminePrice;
break;
+
+ default:
+ break;
}
}
}
@@ -860,6 +887,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
this->actor.textId = 0x2A01;
@@ -870,6 +898,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D3:
case 0x29D4:
case 0x29FA:
@@ -877,6 +906,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29D5;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
+ default:
+ break;
}
}
} else if (talkState == TEXT_STATE_CHOICE) {
@@ -892,6 +924,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
break;
+
case 1:
func_8019F208();
this->isSelling = false;
@@ -900,6 +933,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
+ default:
+ break;
}
}
}
@@ -965,21 +1001,29 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
case 5:
this->getItemId = GI_RUPEE_BLUE;
break;
+
case 10:
this->getItemId = GI_RUPEE_10;
break;
+
case 20:
this->getItemId = GI_RUPEE_RED;
break;
+
case 50:
this->getItemId = GI_RUPEE_PURPLE;
break;
+
case 200:
this->getItemId = GI_RUPEE_HUGE;
break;
+
+ default:
+ break;
}
this->actionFunc = EnFsn_GiveItem;
break;
+
case 1:
func_8019F230();
player->exchangeItemId = PLAYER_IA_NONE;
@@ -1146,6 +1190,7 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
SET_WEEKEVENTREG(WEEKEVENTREG_33_04);
+ // fallthrough
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
CutsceneManager_Stop(this->csId);
@@ -1171,16 +1216,21 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
this->itemIds[this->cursorIndex] = -1;
this->actionFunc = EnFsn_GiveItem;
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29F0);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29DD);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
+ default:
+ break;
}
}
@@ -1211,10 +1261,15 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
case 0:
EnFsn_HandleCanPlayerBuyItem(this, play);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ break;
+
+ default:
+ break;
}
}
}
@@ -1251,12 +1306,16 @@ void EnFsn_AskCanBuyMore(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
func_80151BB4(play, 3);
break;
+
+ default:
+ break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
@@ -1298,12 +1357,16 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
func_80151BB4(play, 3);
break;
+
+ default:
+ break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
@@ -1341,6 +1404,7 @@ void EnFsn_FaceShopkeeperSelling(EnFsn* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.textId = 0x29D6;
Message_StartTextbox(play, this->actor.textId, &this->actor);
+ //! FAKE:
if (play) {}
}
}
@@ -1576,12 +1640,15 @@ s32 EnFsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
case FSN_LIMB_TORSO:
limbRotTableIdx = 0;
break;
+
case FSN_LIMB_LEFT_HAND:
limbRotTableIdx = 1;
break;
+
case FSN_LIMB_HEAD:
limbRotTableIdx = 2;
break;
+
default:
limbRotTableIdx = 9;
break;
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index 3866c4fb1..6fe9bf291 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -426,23 +426,24 @@ void func_80962340(EnFu* this, PlayState* play) {
}
void func_80962588(EnFu* this, PlayState* play) {
- if (Message_ShouldAdvance(play) && (this->unk_552 == 0x2871)) {
- if (1) {}
- if (play->msgCtx.choiceIndex == 0) {
- if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
- func_8019F208();
- Rupees_ChangeBy(-10);
- func_80963DE4(this, play);
- } else {
- play_sound(NA_SE_SY_ERROR);
- Message_StartTextbox(play, 0x2873, &this->actor);
- this->unk_552 = 0x2873;
- }
+ if (!Message_ShouldAdvance(play) || (this->unk_552 != 0x2871)) {
+ return;
+ }
+
+ if (play->msgCtx.choiceIndex == 0) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
+ func_8019F208();
+ Rupees_ChangeBy(-10);
+ func_80963DE4(this, play);
} else {
- func_8019F230();
- Message_StartTextbox(play, 0x2872, &this->actor);
- this->unk_552 = 0x2872;
+ play_sound(NA_SE_SY_ERROR);
+ Message_StartTextbox(play, 0x2873, &this->actor);
+ this->unk_552 = 0x2873;
}
+ } else {
+ func_8019F230();
+ Message_StartTextbox(play, 0x2872, &this->actor);
+ this->unk_552 = 0x2872;
}
}
diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.c b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
index 0362fb4e3..6621ecc93 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
@@ -135,17 +135,17 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.c b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
index c561035aa..28d5c344d 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -830,7 +830,7 @@ void func_80B51EA4(EnGk* this, PlayState* play) {
}
void func_80B51FD0(EnGk* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (this->unk_1E4 & 2) {
func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
} else {
@@ -897,7 +897,7 @@ void func_80B5227C(EnGk* this, PlayState* play) {
func_800B14D4(play, 20.0f, &this->actor.home.pos);
this->unk_350 = 60;
if (!(this->unk_1E4 & 0x80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
this->unk_350 = 0x4000;
@@ -987,7 +987,7 @@ void func_80B525E0(EnGk* this, PlayState* play) {
void func_80B52654(EnGk* this, PlayState* play) {
this->unk_350 += 0x400;
if ((this->unk_1E4 & 0x80) && (play->csCtx.curFrame == 250)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
this->unk_354 = Math_SinS(this->unk_350) * 0.006f * 0.06f;
@@ -1044,7 +1044,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
} else if (ENGK_GET_F(&this->actor) == ENGK_F_2) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFunc = func_80B51FD0;
this->actor.draw = NULL;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1052,7 +1052,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
} else {
Actor_Kill(&this->actor);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->unk_2E4 = 0;
this->csId = this->actor.csId;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1076,7 +1076,7 @@ void EnGk_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((ENGK_GET_F(&this->actor) == ENGK_F_1) ||
- ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
func_80B507A0(this, play);
SkelAnime_Update(&this->skelAnime);
Actor_TrackPlayer(play, &this->actor, &this->unk_1D8, &this->unk_1DE, this->actor.focus.pos);
@@ -1235,7 +1235,7 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
- if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c
index 67cbf327a..f70628930 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -2,42 +2,208 @@
* File: z_en_go.c
* Overlay: ovl_En_Go
* Description: Goron
+ *
+ * This actor handles multiple (but not all) Gorons. The Gorons included are:
+ * - Athletics Goron: Gorons in the racetrack performing stretches before/after a race.
+ * - Spectator Goron: Gorons scattered throughout the racetrack watching the race.
+ * - Gatekeeper Goron: The Gatekeeper of the Goron Shrine.
+ * - Graveyard Goron: Both Gorons outside the Goron Graveyard (one of which is initially frozen).
+ * - Shrine Goron: Gorons in the Goron Shrine (specifically, one in the elders room, one outside the elder's room, and
+ * one outside the shop, not all Gorons in the Goron Shrine are covered by this actor).
+ * - Medigoron: The Powder Keg making Medigoron in Goron Village.
*/
-
#include "z_en_go.h"
#include "z64quake.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
-#include "objects/object_oF1d_map/object_oF1d_map.h"
#include "objects/object_hakugin_demo/object_hakugin_demo.h"
#include "objects/object_taisou/object_taisou.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+#include "overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
-
#define THIS ((EnGo*)thisx)
+#define ENGO_STANDING_Y_OFFSET 0.0f // Actor shape offset in use when a Goron is in any standing state.
+#define ENGO_ROLLEDUP_Y_OFFSET 14.0f // Actor shape offset in use when a Goron is "rolled up".
+#define ENGO_SNOWBALL_Y_OFFSET 46.0f // Actor shape offset in use when a Goron is in a snowball.
+
+#define ENGO_NORMAL_SCALE 0.01f // "Unit Scale" of a normal Goron.
+#define ENGO_MEDIGORON_SCALE_MULTIPLIER 5.0f // Scale factor for the Medigoron in the Powder Keg Shop.
+
+#define ENGO_POUND_INITIAL_RISE_VEL 10.0f // Velocity at which the Gatekeeper's pound surges into the air.
+#define ENGO_POUND_INITIAL_FALL_VEL -6.0f // Velocity at which the Gatekeeper's pound surges to the ground.
+
+#define ENGO_DUST_STEAM_LIFETIME 16 // Lifetime in frames of the Dust and Steam effects.
+
+#define ENGO_FLAG_ENGAGED (1 << 3)
+#define ENGO_FLAG_FACE_TARGET (1 << 4)
+#define ENGO_FLAG_EYES_OPEN (1 << 5)
+#define ENGO_FLAG_LOST_ATTENTION (1 << 6)
+#define ENGO_FLAG_STANDING (1 << 7)
+#define ENGO_FLAG_SNOWBALLED (1 << 8)
+#define ENGO_FLAG_ROLLED_UP (1 << 9)
+#define ENGO_FLAG_FROZEN (1 << 10)
+#define ENGO_FLAG_HIT_OTHER (1 << 11)
+#define ENGO_FLAG_HIT_BY_OTHER (1 << 12)
+#define ENGO_FLAG_HIT_OBJ (1 << 13)
+#define ENGO_FLAG_ROLLING_UP (1 << 14)
+#define ENGO_FLAG_UNROLLING (1 << 15)
+
void EnGo_Init(Actor* thisx, PlayState* play);
void EnGo_Destroy(Actor* thisx, PlayState* play);
void EnGo_Update(Actor* thisx, PlayState* play);
+void EnGo_Draw(Actor* thisx, PlayState* play);
-void func_80A14798(EnGo* this, PlayState* play);
-void func_80A149B0(EnGo* this, PlayState* play);
-void func_80A14B30(EnGo* this, PlayState* play);
-void func_80A14E14(EnGo* this, PlayState* play);
-void func_80A14E74(EnGo* this, PlayState* play);
-void func_80A14EB0(EnGo* this, PlayState* play);
-void func_80A14FC8(EnGo* this, PlayState* play);
-void func_80A153FC(EnGo* this, PlayState* play);
-void func_80A157C4(EnGo* this, PlayState* play);
-void func_80A15FEC(Actor* thisx, PlayState* play);
+typedef enum EnGoEyeTexture {
+ /* 0 */ ENGO_EYETEX_OPEN,
+ /* 1 */ ENGO_EYETEX_HALF,
+ /* 2 */ ENGO_EYETEX_CLOSED,
+ /* 3 */ ENGO_EYETEX_HALF2,
+ /* 4 */ ENGO_EYETEX_CLOSED2
+} EnGoEyeTexture;
-static s32 D_80A16100[] = {
+typedef enum EnGoSleepState {
+ /* -1 */ ENGO_ASLEEP_NEG = -1,
+ /* 0 */ ENGO_AWAKE,
+ /* 1 */ ENGO_ASLEEP_POS
+} EnGoSleepState;
+
+typedef enum EnGoEffectType {
+ /* 0 */ ENGO_EFFECT_NONE,
+ /* 1 */ ENGO_EFFECT_SNOW1,
+ /* 2 */ ENGO_EFFECT_SNOW2,
+ /* 3 */ ENGO_EFFECT_SNOW3,
+ /* 4 */ ENGO_EFFECT_DUST_MIN,
+ /* 4 */ ENGO_EFFECT_DUST1 = ENGO_EFFECT_DUST_MIN,
+ /* 5 */ ENGO_EFFECT_DUST2,
+ /* 6 */ ENGO_EFFECT_DUST3,
+ /* 7 */ ENGO_EFFECT_STEAM_MIN,
+ /* 7 */ ENGO_EFFECT_STEAM = ENGO_EFFECT_STEAM_MIN
+} EnGoEffectType;
+
+typedef enum EnGoAnimationIndex {
+ /* -1 */ ENGO_ANIM_INVALID = -1,
+ /* 0 */ ENGO_ANIM_GORON_MIN,
+ /* 0 */ ENGO_ANIM_LYINGDOWNIDLE = ENGO_ANIM_GORON_MIN,
+ /* 1 */ ENGO_ANIM_LYINGDOWNIDLE_IMM,
+ /* 2 */ ENGO_ANIM_UNROLL,
+ /* 3 */ ENGO_ANIM_UNROLL_IMM,
+ /* 4 */ ENGO_ANIM_ROLL,
+ /* 5 */ ENGO_ANIM_SHIVER,
+ /* 6 */ ENGO_ANIM_SHIVER_IMM,
+ /* 7 */ ENGO_ANIM_DROPKEG,
+ /* 8 */ ENGO_ANIM_COVEREARS,
+ /* 9 */ ENGO_ANIM_SHIVERINGSURPRISED,
+ /* 10 */ ENGO_ANIM_ATHLETICS_MIN,
+ /* 10 */ ENGO_ANIM_DOUBLE_ARM_SIDEBEND = ENGO_ANIM_ATHLETICS_MIN,
+ /* 11 */ ENGO_ANIM_SQUAT_SIDE_TO_SIDE,
+ /* 12 */ ENGO_ANIM_SHAKE_LIMBS,
+ /* 13 */ ENGO_ANIM_SINGLE_ARM_SIDEBEND,
+ /* 14 */ ENGO_ANIM_SITTING_STRETCH,
+ /* 15 */ ENGO_ANIM_CHEER,
+ /* 16 */ ENGO_ANIM_SHOUT,
+ /* 17 */ ENGO_ANIM_HELP_SITTING_STRETCH,
+ /* 18 */ ENGO_ANIM_SPRING_MIN,
+ /* 18 */ ENGO_ANIM_SHOW = ENGO_ANIM_SPRING_MIN,
+ /* 19 */ ENGO_ANIM_SHOW_LOOPED,
+ /* 20 */ ENGO_ANIM_LOOK_AROUND,
+ /* 21 */ ENGO_ANIM_LOOK_AROUND_LOOPED
+} EnGoAnimationIndex;
+
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f velocity, f32 scale, f32 deltaScale,
+ s32 maxFrames);
+void EnGo_DrawSteam(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitDust(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale, f32 deltaScale, s32 maxFrames,
+ EnGoEffectType parentEffectType);
+void EnGo_DrawDust(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitSnow(EnGoEffect effect[], Vec3f pos);
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight);
+void EnGo_DrawSnow(EnGoEffect effect[], PlayState* play, Gfx* material, Gfx* model, u8 effectType);
+
+void EnGo_UpdateEffects(EnGo* this);
+void EnGo_DrawEffects(EnGo* this, PlayState* play);
+
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play);
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateFocus(EnGo* this);
+
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateCollider(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play);
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play);
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex);
+void EnGo_UpdateEyes(EnGo* this);
+
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play);
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play);
+
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play);
+void EnGo_FrozenIdle(EnGo* this, PlayState* play);
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play);
+
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg);
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId);
+
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime);
+void EnGo_AddGatekeeperPoundQuake(PlayState* play, s16 speed, s16 verticalMag, s16 countdown);
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play);
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha);
+void EnGo_MakeSteam(EnGo* this);
+
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play);
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play);
+
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play);
+
+void EnGo_SetupAthletic(EnGo* this, PlayState* play);
+void EnGo_SetupSpectator(EnGo* this, PlayState* play);
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play);
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play);
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play);
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play);
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play);
+
+void EnGo_Idle(EnGo* this, PlayState* play);
+void EnGo_Sleep(EnGo* this, PlayState* play);
+void EnGo_Frozen(EnGo* this, PlayState* play);
+void EnGo_AwaitThaw(EnGo* this, PlayState* play);
+void EnGo_Thaw(EnGo* this, PlayState* play);
+
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play);
+
+void EnGo_Snowball(EnGo* this, PlayState* play);
+
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play);
+
+void EnGo_Talk(EnGo* this, PlayState* play);
+
+// MsgEvent script for the Goron who made Darmani's grave in the mountain village.
+static s32 sMsgScriptGoronGravemaker[] = {
0x00150800, 0x40010022, 0x00150200, 0x180E0E10, 0x0C0F0E11, 0x0C0F0E12, 0x0C0F0E13, 0x0C0F0E14, 0x0C111502,
0x100E0E15, 0x0C100015, 0x0400110E, 0x0E160C0F, 0x0E170C0F, 0x0E180C11, 0x15041610, 0x0E0E190C, 0x10001504,
0x000D0100, 0x050E0E31, 0x0C100E0E, 0x2F0C1001, 0x00050E0E, 0x2D0C100E, 0x0E2B0C10,
};
-static s32 D_80A16164[] = {
+// MsgEvent script for the frozen Goron aside the gravemaker in the mountain village.
+static s32 sMsgScriptGoronFrozen[] = {
0x00150800, 0x7E01004D, 0x00150400, 0x180E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C12, 0x16111508,
0x100E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C17, 0x0F0E260C, 0x180F0E27, 0x0C170F0E, 0x280C180F,
0x0E290C17, 0x0F0E2A0C, 0x16111508, 0x100E0E1A, 0x0C170F0E, 0x1B0C180F, 0x0E1C0C0F, 0x0E1D0C0F, 0x0E1E0C17,
@@ -45,19 +211,23 @@ static s32 D_80A16164[] = {
0x0E0E300C, 0x10010005, 0x0E0E2E0C, 0x100E0E2C, 0x0C100000,
};
-static s32 D_80A16208[2] = { 0xE0E520C, 0x10000000 };
+// MsgEvent script for the shrine Goron standing aside the store.
+static s32 sMsgScriptGoronAsideStore[] = { 0xE0E520C, 0x10000000 };
-static s32 D_80A16210[17] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's son.
+static s32 sMsgScriptGoronAsideEldersSon[] = {
0x160400, 0x38010010, 0xE0E430C, 0xF0E440C, 0xF0E450C, 0x11188010, 0x160800, 0x1B0E0E46, 0xC0F0E47,
0xC0F0E48, 0xC0F0E49, 0xC0F0E4A, 0xC111608, 0x11188010, 0xE0E4B0C, 0x100E0E42, 0xC100000,
};
-static s32 D_80A16254[11] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's room.
+static s32 sMsgScriptGoronAsideEldersRoom[] = {
0x160400, 0x22010009, 0xE0E4D0C, 0xF0E4E0C, 0x10001701, 0xC0E0E,
0x4F0C0F0E, 0x500C1117, 0x1100E0E, 0x510C100E, 0xE4C0C10,
};
-static s32 D_80A16280[52] = {
+// MsgEvent script for the Goron in Goron Village who sells Powder Kegs.
+static s32 sMsgScriptGoronMedigoron[] = {
0x1001200, 0x12200008, 0xE0C8E0C, 0x11122010, 0xE0C8F0C, 0x10001240, 0x1D0E0C, 0x800C1112, 0x40001280,
0x742500, 0xC006F00, 0x13010045, 0xF0C810C, 0x19001300, 0x1280005E, 0x25000C00, 0x59001301, 0x2F0E0C,
0x810C0F0C, 0x820C0500, 0x1A00, 0x1A300E0C, 0x830C1209, 0x700, 0xE0C84, 0x160C1113, 0x1100E0C,
@@ -66,18 +236,30 @@ static s32 D_80A16280[52] = {
0x14FF9C12, 0x6003400, 0x130034, 0x700000E, 0xC870C16, 0x100E0C8B, 0xC100000,
};
-static s32 D_80A16350[27] = {
+// MsgEvent script for the gatekeeper Goron in Goron Village who opens the shrine gate.
+static s32 sMsgScriptGoronGatekeeper[] = {
0x584000, 0x2903000E, 0x2001301, 0x180058, 0x80005119, 0x1E0059, 0x1004919, 0x160059, 0x2004119,
0xE0059, 0x4003919, 0x2F0E0D, 0x4D0C1210, 0xE0D480C, 0xF0D490C, 0xF0D4A0C, 0x5000000, 0xF000F30,
0xE0D4B0C, 0x15090000, 0xE0D4D0C, 0x1210310E, 0xD4C0C12, 0x100E0D4E, 0xC19FFD8, 0xE0D4F0C, 0x19FFD500,
};
-static s32 D_80A163BC[4] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
-static s32 D_80A163CC[4] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
-static s32 D_80A163DC[4] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
-static s32 D_80A163EC[4] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
-static s32 D_80A163FC[4] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
-static s32 D_80A1640C[2] = { 0xE023A0C, 0x12100000 };
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially stretching side to side while squatting).
+static s32 sMsgScriptGoronAthleticA[] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially doing sidebend stretches with one arm).
+static s32 sMsgScriptGoronAthleticB[] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially shaking out their limbs).
+static s32 sMsgScriptGoronAthleticC[] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers (Initially doing sidebend stretches with both arms).
+static s32 sMsgScriptGoronAthleticD[] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
+
+// MsgEvent script for the pair of Gorons stretching one Goron's hamstrings.
+static s32 sMsgScriptGoronAthleticHamstring[] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
+
+// MsgEvent script for any sleeping Goron.
+static s32 sMsgScriptGoronSleeping[] = { 0xE023A0C, 0x12100000 };
ActorInit En_Go_InitVars = {
ACTOR_EN_GO,
@@ -111,7 +293,8 @@ static ColliderSphereInit sSphereInit = {
{ 0, { { 0, 0, 0 }, 0 }, 100 },
};
-static ColliderCylinderInit sCylinderInit1 = {
+// Collider for the frozen solid Gorons.
+static ColliderCylinderInit sCylinderInitFrozen = {
{
COLTYPE_METAL,
AT_ON | AT_TYPE_ENEMY,
@@ -131,7 +314,8 @@ static ColliderCylinderInit sCylinderInit1 = {
{ 0, 0, 0, { 0, 0, 0 } },
};
-static ColliderCylinderInit sCylinderInit2 = {
+// Collider for normal Gorons.
+static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT1,
AT_NONE,
@@ -153,42 +337,55 @@ static ColliderCylinderInit sCylinderInit2 = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
+typedef enum {
+ /* 0x0 */ ENGO_DMGEFF_NONE,
+ /* 0x2 */ ENGO_DMGEFF_FIRE = 0x2,
+ /* 0xF */ ENGO_DMGEFF_BREAK = 0xF
+} EnGoDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(1, 0x0),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0x0),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(1, 0x0),
- /* Hookshot */ DMG_ENTRY(1, 0x0),
- /* Goron punch */ DMG_ENTRY(1, 0xF),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(1, 0xF),
- /* Fire arrow */ DMG_ENTRY(1, 0x2),
- /* Ice arrow */ DMG_ENTRY(1, 0x0),
- /* Light arrow */ DMG_ENTRY(1, 0x0),
- /* Goron spikes */ DMG_ENTRY(1, 0xF),
- /* Deku spin */ DMG_ENTRY(1, 0x0),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(1, 0x0),
- /* Zora barrier */ DMG_ENTRY(1, 0x0),
- /* Normal shield */ DMG_ENTRY(1, 0x0),
- /* Light ray */ DMG_ENTRY(1, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0x0),
- /* Sword beam */ DMG_ENTRY(1, 0x0),
- /* Normal Roll */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(1, 0x0),
- /* Unblockable */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(1, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0x0),
+ /* Deku Nut */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Sword */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Fire arrow */ DMG_ENTRY(1, ENGO_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron spikes */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Deku spin */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
};
+/**
+ * Animations used in the actor.
+ *
+ * @see EnGoAnimationIndex
+ */
static AnimationInfoS sAnimationInfo[] = {
+
+ /* Animations for generic Goron actions */
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 },
@@ -200,366 +397,453 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ /* Animations for stretching Gorons at the racetrack */
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_001420, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_001A4C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ /* Animations for the Goron during the spring arrival cutscene */
+ { &gGoronSpringShowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringShowLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
-EnGoStruct* func_80A10FD0(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6) {
+/**
+ * Initialize the latter section of the effects in 'effectTable' to be of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be between 'maxFrames / 3' and
+ * 'maxFrames'
+ */
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f velocity,
+ f32 scale, f32 deltaScale, s32 maxFrames) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = 7;
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Steam effects are from the end of the snow effects to the end of all effects
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
- }
- return ptr;
+ effect->type = ENGO_EFFECT_STEAM;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = velocity;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
+ }
+ return effect;
}
-void func_80A11144(EnGoStruct* ptr, PlayState* play) {
- s32 pad;
+/**
+ * Draw all effects of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawSteam(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
+ PlayState* play = play2;
s32 i;
- s32 flag = false;
- f32 temp;
+ s32 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
-
- for (i = 0; i < 32; i++, ptr++) {
-
- if (ptr->unk_00 == 7) {
- gDPPipeSync(POLY_XLU_DISP++);
-
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
- flag = true;
- }
-
- Matrix_Push();
-
- temp = ((f32)ptr->unk_02 / ptr->unk_01);
- temp *= 255;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)temp);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, (ptr->unk_02 + (i * 3)) * 3,
- (ptr->unk_02 + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
-
- Matrix_Pop();
- if (play->state.gfxCtx) {}
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_STEAM) {
+ continue;
}
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ alpha *= 255.0f;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)alpha);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, (effect->alphaNumer + (i * 3)) * 3,
+ (effect->alphaNumer + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A1143C(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6, s32 arg7) {
+/**
+ * Initialize the first available effect to be of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be 1/3 * maxFrames -> maxFrames
+ * @param parentEffectType Type of the parent effect, determines which of the possible dust effects correspond
+ */
+void EnGo_InitDust(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale,
+ f32 deltaScale, s32 maxFrames, EnGoEffectType parentEffectType) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = arg7 + 4;
-
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
-
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Dust effects are from the end of the snow effects to the end of all effects.
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->type = parentEffectType + ENGO_EFFECT_DUST_MIN;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = vel;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
}
}
-void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawDust(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
static TexturePtr sDustTextures[] = {
gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
- static Color_RGBA8 D_80A16664[] = {
- { 255, 255, 255, 0 },
- { 170, 130, 90, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustPrimColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 170, 130, 90, 0 }, // Light Brown
+ { 0, 0, 0, 0 }, // Black
};
- static Color_RGBA8 D_80A16670[] = {
- { 255, 255, 255, 0 },
- { 100, 60, 20, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustEnvColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 100, 60, 20, 0 }, // Dark Brown
+ { 0, 0, 0, 0 }, // Black
};
+ PlayState* play = play2;
s32 i;
- u8 flag = false;
- f32 temp;
+ u8 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
-
- for (i = 0; i < 32; i++, ptr++) {
- if ((ptr->unk_00 >= 4) && (ptr->unk_00 < 7)) {
- if (!flag) {
- POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
- flag = true;
- }
- Matrix_Push();
-
- temp = (f32)ptr->unk_02 / ptr->unk_01;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A16664[(s32)ptr->unk_00 - 4].r,
- D_80A16664[(s32)ptr->unk_00 - 4].g, D_80A16664[(s32)ptr->unk_00 - 4].b, (u8)(temp * 255));
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A16670[(s32)ptr->unk_00 - 4].r, D_80A16670[(s32)ptr->unk_00 - 4].g,
- D_80A16670[(s32)ptr->unk_00 - 4].b, 0);
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(temp * 7.0f)]));
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
-
- Matrix_Pop();
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if ((effect->type < ENGO_EFFECT_DUST_MIN) || (effect->type >= ENGO_EFFECT_STEAM_MIN)) {
+ continue;
}
- if (play->state.gfxCtx) {}
+
+ if (!isMaterialSet) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, (u8)(alpha * UINT8_MAX));
+ gDPSetEnvColor(POLY_XLU_DISP++, sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, 0);
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(alpha * 7.0f)]));
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#ifdef NON_MATCHING
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1) {
- static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
+/**
+ * Initialize the snowball break effects.
+ *
+ * Half of the elements will be 'ENGO_EFFECT_SNOW1'/'2'/'3' randomly generated around the character. The second half
+ * will be dedicated 'ENGO_EFFECT_DUST1'/'2'/'3' paired with the snow.
+ *
+ * @param effect The EnGoEffect table
+ * @param pos Position around which the effects appear
+ */
+void EnGo_InitSnow(EnGoEffect effect[ENGO_EFFECT_COUNT], Vec3f pos) {
+ static u8 effectIndexToSnowEffectTable[] = {
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
};
- EnGoStruct* ptr2 = &ptr[16];
+
+ EnGoEffect* dustEffects = &effect[ENGO_SNOW_EFFECT_COUNT];
s32 i;
- Vec3f spB4;
- Vec3f spA8;
- f32 temp_f20;
+ Vec3f randRelativeToWorldPos;
+ Vec3f randYOneToFour;
+ f32 velMagnitude;
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_10 = arg1;
- ptr->unk_10.y += 56.0f;
-
- ptr->unk_04.x = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.y = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.z = (Rand_ZeroOne() - 0.5f) * 5460.0f;
-
- temp_f20 = (Rand_ZeroOne() * 4.0f) + 6.0f;
- ptr->unk_28.x = Math_SinS(i * 0x1000) * temp_f20;
- ptr->unk_28.z = Math_CosS(i * 0x1000) * temp_f20;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
-
- ptr->unk_1C = gZeroVec3f;
- ptr->unk_1C.y = -0.8f;
-
- ptr->unk_01 = ptr->unk_02 = 1;
- ptr->unk_00 = D_80A1667C[i];
-
- spB4.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.x;
- spB4.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + ptr->unk_10.y;
- spB4.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.z;
-
- spA8 = gZeroVec3f;
- spA8.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
-
- func_80A1143C(ptr2, spB4, gZeroVec3f, spA8, 0.6f, 0.2f, 16, 0);
+ // Snow effects consume the first part of the effects table, and are paired with dust effects in the latter part
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->pos = pos;
+ effect->pos.y += 56.0f;
+
+ // Generate a +-15 degree rotational velocity
+ effect->rotVelocity.x = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.y = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.z = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+
+ // Generate a radially outward velocity for each of the effects
+ velMagnitude = (Rand_ZeroOne() * 4.0f) + 6.0f;
+ effect->velocity.x = Math_SinS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.z = Math_CosS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
+
+ // No acceleration on the X,Z axis, negative acceleration on the Y axis
+ effect->accel = gZeroVec3f;
+ effect->accel.y = -0.8f;
+
+ // Full visibility (1/1)
+ effect->alphaDenom = effect->alphaNumer = 1;
+
+ // Assign a snow effect value of 'ENGO_EFFECT_SNOW1'/'2'/'3'
+ effect->type = effectIndexToSnowEffectTable[i];
+
+ // Initialize the parameters for the paired element
+ randRelativeToWorldPos.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.x;
+ randRelativeToWorldPos.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + effect->pos.y;
+ randRelativeToWorldPos.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.z;
+
+ randYOneToFour = gZeroVec3f;
+ randYOneToFour.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+
+ // Initialize the paired element.
+ EnGo_InitDust(dustEffects, randRelativeToWorldPos, gZeroVec3f, randYOneToFour, 0.6f, 0.2f,
+ ENGO_DUST_STEAM_LIFETIME, 0);
}
}
-#else
-static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
-};
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A118F8.s")
-#endif
-void func_80A11BF8(EnGoStruct* ptr, f32 arg1) {
- f32 test;
- f32 test2;
+/**
+ * Update the snow effect's movement.
+ *
+ * When the snow drops to the ground, it is converted to dust.
+ *
+ * @param effect Pointer to the effect to update
+ * @param dustConversionHeight Height above the ground at which to convert the effect to dust
+ */
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight) {
f32 x;
f32 z;
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_34 += ptr->unk_38;
+ effect->velocity.y += effect->accel.y;
+ effect->scaleXY += effect->scaleXYDelta;
- if (ptr->unk_10.y < arg1) {
- ptr->unk_10.y = arg1;
+ if (effect->pos.y < dustConversionHeight) {
+ effect->pos.y = dustConversionHeight;
- ptr->unk_00 = 4;
- ptr->unk_01 = (Rand_ZeroOne() * 8.0f) + 4.0f;
- ptr->unk_02 = ptr->unk_01;
+ effect->type = ENGO_EFFECT_DUST1;
+ effect->alphaDenom = (Rand_ZeroOne() * 8.0f) + 4.0f;
+ effect->alphaNumer = effect->alphaDenom;
- ptr->unk_28 = gZeroVec3f;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+ effect->velocity = gZeroVec3f;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
- ptr->unk_34 = 0.4f;
- ptr->unk_38 = 0.1f;
+ effect->scaleXY = 0.4f;
+ effect->scaleXYDelta = 0.1f;
return;
}
- if (ptr->unk_28.x != 0.0f) {
- x = ptr->unk_28.x / fabsf(ptr->unk_28.x);
- x *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.x, x, (sREG(14) + 40) * 0.01f);
+ if (effect->velocity.x != 0.0f) {
+ x = effect->velocity.x / fabsf(effect->velocity.x);
+ x *= (sREG(13) + 140) * 0.01f;
+ Math_StepToF(&effect->velocity.x, x, (sREG(14) + 40) * 0.01f);
}
- if (ptr->unk_28.z != 0.0f) {
- z = ptr->unk_28.z / fabsf(ptr->unk_28.z);
+ if (effect->velocity.z != 0.0f) {
+ z = effect->velocity.z / fabsf(effect->velocity.z);
z *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.z, z, (sREG(14) + 40) * 0.01f);
+ Math_StepToF(&effect->velocity.z, z, (sREG(14) + 40) * 0.01f);
}
- ptr->unk_0A.x += ptr->unk_04.x;
- ptr->unk_0A.y += ptr->unk_04.y;
- ptr->unk_0A.z += ptr->unk_04.z;
+ effect->rotAngle.x += effect->rotVelocity.x;
+ effect->rotAngle.y += effect->rotVelocity.y;
+ effect->rotAngle.z += effect->rotVelocity.z;
}
-#ifdef NON_MATCHING
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_SNOW1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ * @param material Snow Material
+ * @param model Snow Model
+ * @param type Snow Effect type to draw
+ */
+void EnGo_DrawSnow(EnGoEffect effect[ENGO_SNOW_EFFECT_COUNT], PlayState* play, Gfx* material, Gfx* model,
+ u8 effectType) {
s32 i;
- u8 flag = false;
+ u8 isMaterialSet = false;
OPEN_DISPS(play->state.gfxCtx);
-
Gfx_SetupDL25_Opa(play->state.gfxCtx);
-
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == arg4) {
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, arg2);
- flag = true;
- }
-
- Matrix_Push();
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
- Matrix_RotateZS(ptr->unk_0A.z, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_0A.x, MTXMODE_APPLY);
- Matrix_RotateYS(ptr->unk_0A.y, MTXMODE_APPLY);
-
- if (1) {
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, arg3);
- }
-
- Matrix_Pop();
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != effectType) {
+ continue;
}
+
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_OPA_DISP++, material);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rotAngle.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rotAngle.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rotAngle.y, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, model);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A11EC0.s")
-#endif
-void func_80A1203C(EnGo* this) {
- EnGoStruct* ptr = this->unk_3F8;
+/**
+ * Update all effects, potentially fading them away to nothing.
+ */
+void EnGo_UpdateEffects(EnGo* this) {
+ EnGoEffect* effect = this->effectTable;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
- if (ptr->unk_00 != 0) {
- if (ptr->unk_02 == 0) {
- ptr->unk_00 = 0;
- } else if ((ptr->unk_00 > 0) && (ptr->unk_00 < 4)) {
- func_80A11BF8(ptr, this->actor.world.pos.y);
- } else {
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == ENGO_EFFECT_NONE) {
+ continue;
+ }
- ptr->unk_28.x += ptr->unk_1C.x;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_28.z += ptr->unk_1C.z;
+ if (effect->alphaNumer == 0) {
+ // End usage of the effect
+ effect->type = ENGO_EFFECT_NONE;
+ } else if ((effect->type > ENGO_EFFECT_NONE) && (effect->type < ENGO_EFFECT_DUST_MIN)) {
+ // Snow rotates, and changes to dust upon dropping below the actor position
+ EnGo_UpdateSnow(effect, this->actor.world.pos.y);
+ } else {
+ // Dust and steam move according to their initial values
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_34 += ptr->unk_38;
- ptr->unk_02--;
- }
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
+
+ effect->scaleXY += effect->scaleXYDelta;
+ effect->alphaNumer--;
}
}
}
-void func_80A1213C(EnGo* this, PlayState* play) {
- func_80A11EC0(this->unk_3F8, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL, 1);
- func_80A11EC0(this->unk_3F8, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL, 2);
- func_80A11EC0(this->unk_3F8, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL, 3);
- func_80A11144(this->unk_3F8, play);
- func_80A115B4(this->unk_3F8, play);
+/**
+ * Draw all effects.
+ */
+void EnGo_DrawEffects(EnGo* this, PlayState* play) {
+ EnGo_DrawSnow(this->effectTable, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW1);
+ EnGo_DrawSnow(this->effectTable, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW2);
+ EnGo_DrawSnow(this->effectTable, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW3);
+ EnGo_DrawSteam(this->effectTable, play);
+ EnGo_DrawDust(this->effectTable, play);
}
-s32 func_80A121F4(PlayState* play) {
+/**
+ * Check if the Goron can hurt the player.
+ */
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->transformation == PLAYER_FORM_GORON) && (player->stateFlags3 & PLAYER_STATE3_2000000)) {
return false;
+ } else {
+ return true;
}
- return true;
}
-s32 func_80A1222C(EnGo* this, PlayState* play) {
+/**
+ * Check if the Goron is falling asleep.
+ */
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 ret = false;
+ s32 isFallingAsleep = false;
if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->unk_3EC == 0) &&
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->sleepState == ENGO_AWAKE) &&
(this->actor.xzDistToPlayer < 400.0f)) ||
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04) && (play->sceneId == SCENE_16GORON_HOUSE) &&
- (gSaveContext.sceneLayer == 0) && (this->unk_3EC == 0) && (play->csCtx.scriptIndex == 1))) {
- ret = true;
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON) && (play->sceneId == SCENE_16GORON_HOUSE) &&
+ (gSaveContext.sceneLayer == 0) && (this->sleepState == ENGO_AWAKE) && (play->csCtx.scriptIndex == 1))) {
+ isFallingAsleep = true;
}
- return ret;
+ return isFallingAsleep;
}
-s32 func_80A122EC(EnGo* this) {
- static Vec3f D_80A1668C = { 0.0f, 100.0f, 160.0f };
+/**
+ * Update the actor's focus.
+ */
+s32 EnGo_UpdateFocus(EnGo* this) {
+ static Vec3f sMedigoronPos = { 0.0f, 100.0f, 160.0f };
s32 pad;
- f32 sp20 = 58.0f;
+ f32 yAxisOffsetToFocusPoint = 58.0f;
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A1668C,
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sMedigoronPos,
&this->actor.focus.pos);
} else {
- if ((this->unk_390 & 0x200) || (this->unk_390 & 0x100)) {
- sp20 = this->actor.shape.yOffset;
+ if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) || (this->actionFlags & ENGO_FLAG_SNOWBALLED)) {
+ yAxisOffsetToFocusPoint = this->actor.shape.yOffset;
}
Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
- this->actor.focus.pos.y += sp20;
+ this->actor.focus.pos.y += yAxisOffsetToFocusPoint;
}
this->actor.focus.rot.x = this->actor.world.rot.x;
@@ -568,21 +852,24 @@ s32 func_80A122EC(EnGo* this) {
return false;
}
-void func_80A123A0(EnGo* this, PlayState* play) {
- Vec3f sp2C;
+/**
+ * Update the collider for the snowball form of the Goron Shrine gatekeeper.
+ */
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp2C, &this->actor.world.pos);
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
- this->colliderSphere.dim.worldSphere.center.x = sp2C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp2C.y;
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp2C.z;
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 48;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
- if (func_80A121F4(play)) {
+ if (EnGo_CanSnowballHurtPlayer(play)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderSphere.base);
}
@@ -590,175 +877,203 @@ void func_80A123A0(EnGo* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124A0(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Medigoron in the Powder Keg Shop.
+ */
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play) {
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124FC(EnGo* this, PlayState* play) {
- Vec3f sp1C;
+/**
+ * Update the collider for the rolled up form of a Goron.
+ */
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp1C, &this->actor.world.pos);
-
- this->colliderSphere.dim.worldSphere.center.x = sp1C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp1C.y;
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp1C.z;
-
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 20;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
-
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A125BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the frozen form of a Goron.
+ */
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play) {
s32 pad;
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
-
this->colliderCylinder.dim.radius = 46;
this->colliderCylinder.dim.height = 78;
-
- if (this->unk_3C6 == 0) {
+ if (this->harmlessTimer == 0) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderCylinder.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderCylinder.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A12660(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for all standing forms of a Goron.
+ */
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play) {
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
this->colliderCylinder.dim.radius = 24;
this->colliderCylinder.dim.height = 62;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A126BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Goron.
+ *
+ * Both the rolling snowball and frozen forms can hurt Player on collision, others do not.
+ */
+void EnGo_UpdateCollider(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!(player->stateFlags2 & PLAYER_STATE2_4000)) {
- if (this->unk_3C6 != 0) {
- this->unk_3C6--;
- }
+ DECR(this->harmlessTimer);
}
-
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- func_80A124A0(this, play);
- } else if (this->unk_390 & 0x100) {
- func_80A123A0(this, play);
- } else if (this->unk_390 & 0x200) {
- func_80A124FC(this, play);
- } else if (this->unk_390 & 0x400) {
- func_80A125BC(this, play);
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ EnGo_UpdateMedigoronCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
+ EnGo_UpdateSnowballCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ EnGo_UpdateRolledUpCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_UpdateFrozenCollider(this, play);
} else {
- func_80A12660(this, play);
+ EnGo_UpdateStandingCollider(this, play);
}
}
-s32 func_80A12774(EnGo* this, PlayState* play) {
- if (!(this->unk_390 & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+/**
+ * Check if the actor is talking, and if so set the action function to handle it.
+ *
+ * @return True if talking
+ */
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play) {
+ if (!(this->actionFlags & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
return false;
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
- if (!(this->unk_390 & 0x200)) {
- this->unk_390 |= 8;
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
+ if (!(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
}
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_390 |= 0x20;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3C0 = 0;
- this->unk_3C4 = 0;
- this->unk_18C = this->actionFunc;
- this->actionFunc = func_80A157C4;
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->cutsceneState = 0;
+ this->gatekeeperAnimState = 0;
+ this->interruptedActionFunc = this->actionFunc;
+ this->actionFunc = EnGo_Talk;
return true;
}
-s32 func_80A12868(EnGo* this, PlayState* play) {
- this->unk_390 &= ~0x800;
- this->unk_390 &= ~0x1000;
- this->unk_390 &= ~0x2000;
+/**
+ * Detect any collisions, and convert detections to object specific 'actionFlags'.
+ */
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play) {
+ this->actionFlags &= ~ENGO_FLAG_HIT_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_BY_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_OBJ;
if ((this->colliderCylinder.base.atFlags & AT_HIT) || (this->colliderSphere.base.atFlags & AT_HIT)) {
this->colliderCylinder.base.atFlags &= ~AT_HIT;
this->colliderSphere.base.atFlags &= ~AT_HIT;
- this->unk_390 |= 0x800;
- this->unk_3C6 = 0x28;
+ this->actionFlags |= ENGO_FLAG_HIT_OTHER;
+ this->harmlessTimer = 40;
}
if ((this->colliderCylinder.base.acFlags & AC_HIT) || (this->colliderSphere.base.acFlags & AC_HIT)) {
this->colliderCylinder.base.acFlags &= ~AC_HIT;
this->colliderSphere.base.acFlags &= ~AC_HIT;
- this->unk_390 |= 0x1000;
+ this->actionFlags |= ENGO_FLAG_HIT_BY_OTHER;
}
if ((this->colliderCylinder.base.ocFlags1 & OC1_HIT) || (this->colliderSphere.base.ocFlags1 & OC1_HIT)) {
this->colliderCylinder.base.ocFlags1 &= ~OC1_HIT;
this->colliderSphere.base.ocFlags1 &= ~OC1_HIT;
- this->unk_390 |= 0x2000;
+ this->actionFlags |= ENGO_FLAG_HIT_OBJ;
}
return false;
}
-s32 func_80A12954(EnGo* this, PlayState* play) {
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (play->csCtx.state != CS_STATE_IDLE) && (this->actor.draw != NULL) &&
- (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
+/**
+ * Start, or finish, the cutscene for the arrival of springtime.
+ */
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) && (play->csCtx.state != CS_STATE_IDLE) &&
+ (this->actor.draw != NULL) && (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
(play->csCtx.scriptIndex == 0)) {
- if (this->unk_3F0 == 0) {
+ if (this->springArrivalCutsceneActive == false) {
this->actor.flags &= ~ACTOR_FLAG_1;
- this->cueId = 255;
- this->unk_3F0 = 1;
- this->unk_18C = this->actionFunc;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = true;
+ this->interruptedActionFunc = this->actionFunc;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->actionFunc = func_80A14FC8;
- } else if (this->unk_3F0 != 0) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->actionFunc = EnGo_HandleSpringArrivalCutscene;
+ } else if (this->springArrivalCutsceneActive) {
this->actor.flags |= ACTOR_FLAG_1;
- this->cueId = 255;
- this->unk_3F0 = 0;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->actionFunc = this->unk_18C;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = false;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFunc = this->interruptedActionFunc;
}
return false;
}
-s32 func_80A12A64(EnGo* this, PlayState* play) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
- s32 ret = 0;
+/**
+ * Update the animation to the actor's currently set value.
+ *
+ * @return True if non-repeating animation has finished
+ */
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
+ s32 ret = false;
- if ((this->unk_3DC >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((this->unk_3DC >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (this->unk_3DC < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((this->curAnimIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((this->curAnimIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (this->curAnimIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->skelAnime.playSpeed = this->unk_398;
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->skelAnime.playSpeed = this->curAnimPlaySpeed;
ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-s32 func_80A12B78(EnGo* this, PlayState* play) {
+/**
+ * Update sound effects based on animation.
+ */
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) {
if (play->csCtx.state == CS_STATE_IDLE) {
- if (this->unk_3DC == 4) {
+ if (this->curAnimIndex == ENGO_ANIM_ROLL) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
@@ -766,7 +1081,7 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
- } else if ((this->unk_3DC == 2) || (this->unk_3DC == 3)) {
+ } else if ((this->curAnimIndex == ENGO_ANIM_UNROLL) || (this->curAnimIndex == ENGO_ANIM_UNROLL_IMM)) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF);
}
@@ -779,189 +1094,231 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
return 0;
}
-s32 func_80A12C48(EnGo* this, PlayState* play, s32 arg2) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
+/**
+ * Change the Goron's animation.
+ *
+ * Goron animations come from one of three categories:
+ * - Basic Goron animations
+ * - Goron athletics like stretches, cheers, etc...
+ * - Spring arrival cutscene animations
+ * Changing animations with this function handles the transitions between the three categories.
+ *
+ * @return True if animation was changed
+ */
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
s32 ret = false;
- if ((arg2 >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((arg2 >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (arg2 < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((animIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (animIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->unk_3DC = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- this->unk_398 = this->skelAnime.playSpeed;
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->curAnimIndex = animIndex;
+ ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->curAnimPlaySpeed = this->skelAnime.playSpeed;
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-void func_80A12D6C(EnGo* this) {
- if ((this->unk_390 & 0x20) && (DECR(this->unk_3BC) == 0)) {
- this->unk_3BE++;
- if (this->unk_3BE >= 4) {
- this->unk_3BC = Rand_S16Offset(30, 30);
- this->unk_3BE = 0;
+/**
+ * Update the eye textures to blink.
+ */
+void EnGo_UpdateEyes(EnGo* this) {
+ if (this->actionFlags & ENGO_FLAG_EYES_OPEN) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= ENGO_EYETEX_CLOSED2) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ }
}
}
}
-void func_80A12DF4(EnGo* this, PlayState* play) {
- if (this->unk_3D4 == 0) {
- func_80A12C48(this, play, 9);
- this->unk_3D4++;
- } else if ((this->unk_3D4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 6);
- this->unk_3D4++;
+/**
+ * Play the surprise animation then return to shivering.
+ */
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play) {
+ if (this->surprisePhase == 0) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVERINGSURPRISED);
+ this->surprisePhase++;
+ } else if ((this->surprisePhase == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER_IMM);
+ this->surprisePhase++;
}
}
-s32 func_80A12E80(EnGo* this, PlayState* play) {
- u16 temp = play->msgCtx.currentTextId;
+/**
+ * Change the attention target, and dialog reactions of the Gorons outside Darmani's grave.
+ */
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ u16 textId = play->msgCtx.currentTextId;
Player* player = GET_PLAYER(play);
- if (ENGO_GET_F(&this->actor) != ENGO_F_4) {
+ if (ENGO_GET_TYPE(&this->actor) != ENGO_GRAVEYARD) {
return false;
}
if (player->stateFlags1 & PLAYER_STATE1_40) {
- if (this->unk_392 != temp) {
- switch (temp) {
- case 0xE1A:
- this->unk_390 |= 8;
- this->unk_38C = this->actor.child;
+ if (this->lastTextId != textId) {
+ switch (textId) {
+ case 0xE1A: // Awakening from frozen form, confused, turn to other Goron
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
+ this->attentionTarget = this->actor.child;
break;
- case 0xE1D:
- case 0xE25:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1D: // Turn to player (Goron form) while stating Darmani is dead
+ case 0xE25: // Turn to player (Other form) while thanking player
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
- case 0xE27:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = this->actor.child;
+ case 0xE27: // (spoken) "What's this?..."
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = this->actor.child;
}
- case 0xE16:
- case 0xE1E:
- this->unk_190 = func_80A12DF4;
+ case 0xE16: // Surprised, questioning if player is Darmani
+ case 0xE1E: // Surprised, seeing Darmani
+ this->graveyardDialogActionFunc = EnGo_UpdateShiverSurprisedAnimation;
break;
- case 0xE1F:
- if (ENGO_GET_70(&this->actor) == ENGO_70_0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1F: // Turn to player stating Darmani is not dead
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_GRAVEMAKER) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
+
+ default:
+ break;
}
}
- this->unk_3F4 = 1;
- this->unk_392 = temp;
- } else if (this->unk_3F4 != 0) {
- this->unk_3F4 = 0;
- this->unk_190 = NULL;
- this->unk_392 = 0;
- func_80A12C48(this, play, 5);
- this->unk_390 &= ~8;
+ this->changedText = true;
+ this->lastTextId = textId;
+ } else if (this->changedText) {
+ // If the player isn't talking, and the text has changed, its the last text.
+ // Set everything back to the "Idle" behavior.
+ this->changedText = false;
+ this->graveyardDialogActionFunc = NULL;
+ this->lastTextId = 0;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
}
- if (this->unk_190 != NULL) {
- this->unk_190(this, play);
+ if (this->graveyardDialogActionFunc != NULL) {
+ this->graveyardDialogActionFunc(this, play);
}
return false;
}
-s32 func_80A12FE8(EnGo* this, PlayState* play) {
+/**
+ * Update the actor's rotation to point towards the target.
+ */
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
- s16 sp32;
+ Vec3f targetPos;
+ Vec3f thisPos;
+ s16 desiredYaw;
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- sp32 = Math_Vec3f_Yaw(&sp34, &sp40);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ desiredYaw = Math_Vec3f_Yaw(&thisPos, &targetPos);
- Math_ApproachS(&this->unk_3B2, (sp32 - this->unk_3B6) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B2 = CLAMP(this->unk_3B2, -0x1FFE, 0x1FFE);
+ Math_ApproachS(&this->headRotY, (desiredYaw - this->bodyRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->headRotY = CLAMP(this->headRotY, -0x1FFE, 0x1FFE);
- Math_ApproachS(&this->unk_3B6, (sp32 - this->unk_3B2) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B6 = CLAMP(this->unk_3B6, -0x1C70, 0x1C70);
+ Math_ApproachS(&this->bodyRotY, (desiredYaw - this->headRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->bodyRotY = CLAMP(this->bodyRotY, -0x1C70, 0x1C70);
- Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
-
- if (this->unk_38C->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_38C)->bodyPartsPos[7].y + 3.0f;
+ Math_Vec3f_Copy(&thisPos, &this->actor.focus.pos);
+ if (this->attentionTarget->id == ACTOR_PLAYER) {
+ targetPos.y = ((Player*)this->attentionTarget)->bodyPartsPos[7].y + 3.0f;
} else {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->focus.pos);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->focus.pos);
}
- Math_ApproachS(&this->unk_3B0, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B4, 4, 0x2AA8);
- this->unk_3B0 = CLAMP(this->unk_3B0, -0x1554, 0x1554);
+ Math_ApproachS(&this->headRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->bodyRotZ, 4, 0x2AA8);
+ this->headRotZ = CLAMP(this->headRotZ, -0x1554, 0x1554);
- Math_ApproachS(&this->unk_3B4, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B0, 4, 0x2AA8);
- this->unk_3B4 = CLAMP(this->unk_3B4, -0xE38, 0xE38);
+ Math_ApproachS(&this->bodyRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->headRotZ, 4, 0x2AA8);
+ this->bodyRotZ = CLAMP(this->bodyRotZ, -0xE38, 0xE38);
return false;
}
-s32 func_80A131F8(EnGo* this, PlayState* play) {
- if (this->unk_3F4 == 0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+/**
+ * Handle updating of Goron's attention target, and reactions during dialog.
+ */
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ if (!this->changedText) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
- func_80A12E80(this, play);
+ EnGo_UpdateGraveyardAttentionTargetAndReactions(this, play);
- if (this->unk_390 & 8) {
- this->unk_390 &= ~0x40;
- this->unk_390 |= 0x10;
- func_80A12FE8(this, play);
- } else if (this->unk_390 & 0x10) {
- this->unk_390 &= ~0x10;
- this->unk_3B0 = 0;
- this->unk_3B2 = 0;
- this->unk_3B4 = 0;
- this->unk_3B6 = 0;
- this->unk_3BA = 0x14;
- } else if (DECR(this->unk_3BA) == 0) {
- this->unk_390 |= 0x40;
- this->unk_3BA = 0x14;
+ if (this->actionFlags & ENGO_FLAG_ENGAGED) {
+ this->actionFlags &= ~ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FACE_TARGET;
+ EnGo_UpdateRotationToTarget(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
+ this->actionFlags &= ~ENGO_FLAG_FACE_TARGET;
+ this->headRotZ = 0;
+ this->headRotY = 0;
+ this->bodyRotZ = 0;
+ this->bodyRotY = 0;
+ this->loseAttentionTimer = 20;
+ } else if (DECR(this->loseAttentionTimer) == 0) {
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->loseAttentionTimer = 20;
}
return true;
}
-void func_80A132C8(EnGo* this, PlayState* play) {
+/**
+ * Idle action function for the gravemaker at the Goron Graveyard.
+ */
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 temp_v1 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
+ s16 deltaYaw = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
if ((fabsf(this->actor.playerHeightRel) > 20.0f) || (this->actor.xzDistToPlayer > 300.0f)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(temp_v1) >= 0x1C70) ||
- CHECK_WEEKEVENTREG(WEEKEVENTREG_21_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(deltaYaw) >= 0x1C70) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-void func_80A133A8(EnGo* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+/**
+ * Idle action function for the Goron frozen at the Goron Graveyard
+ */
+void EnGo_FrozenIdle(EnGo* this, PlayState* play) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-Actor* func_80A13400(EnGo* this, PlayState* play) {
+/**
+ * Obtain a pointer to the gravemaker at the Goron Graveyard.
+ */
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play) {
Actor* actor;
Actor* retActor = NULL;
@@ -969,8 +1326,8 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
actor = SubS_FindActor(play, retActor, ACTORCAT_NPC, ACTOR_EN_GO);
retActor = actor;
- if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_F(actor) == ENGO_F_4) &&
- (ENGO_GET_70(actor) == ENGO_70_0)) {
+ if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_TYPE(actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(actor) == ENGO_GRAVEYARD_GRAVEMAKER)) {
return retActor;
}
@@ -988,15 +1345,27 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
return NULL;
}
-void func_80A134B0(EnGo* this, PlayState* play, s32 arg2) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_80) || (play->actorCtx.flags & ACTORCTX_FLAG_0) || arg2) {
+/**
+ * The Medigoron's collider radius is greater when it needs to be able to drop the Powder Keg in front of the player.
+ */
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES) ||
+ (play->actorCtx.flags & ACTORCTX_FLAG_0) // Same check occurs in Powder Keg ammo check MsgScript Command
+ || isGivenPowderKeg) {
this->colliderSphere.dim.modelSphere.radius = 300;
} else {
this->colliderSphere.dim.modelSphere.radius = 380;
}
}
-s32 func_80A134F4(EnGo* this, s16 csId) {
+/**
+ * Helper to change a cutscene.
+ *
+ * @returns Status of cutscene change
+ * @retval true Cutscene has started
+ * @retval false Cutscene is queued to start
+ */
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId) {
if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
} else if (CutsceneManager_IsNext(csId)) {
@@ -1007,44 +1376,66 @@ s32 func_80A134F4(EnGo* this, s16 csId) {
return false;
}
-s32 func_80A13564(EnGo* this, f32 arg1, f32 arg2, s32 arg3) {
+/**
+ * Handle the animation of the "Goron Pound".
+ *
+ * There are Several Phases to the pound:
+ * - Phase 1: (Once in Rolled-Up form) the pound starts by leaping into the air.
+ * - The Goron rotates until its back faces the ground at its peak.
+ * - The Goron distorts shape until at its peak.
+ * - Transition: At the peak, all movement is halted.
+ * - Phase 2: While hanging, the Goron reverts back to normal shape.
+ * - Transition: At reaching maxHangTime, ENGO_POUND_INITIAL_FALL_VEL is applied.
+ * - Phase 3: The Goron falls to the ground.
+ * - Transition: At reaching the ground.
+ *
+ * @param initialVelocity Initial +Y velocity of the pound.
+ * @param maxDistortion Maximum distortion of the Goron's shape.
+ * @param maxHangtime Maximum hangtime at the peak of the pound.
+ * @returns True when pound finishes.
+ */
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime) {
s32 pad;
- f32 temp_f0 = 1.0f;
- f32 temp_f14 = this->actor.velocity.y + this->actor.gravity;
- s32 ret;
+ f32 rotAndDistortFactor = 1.0f;
+ f32 velocity = this->actor.velocity.y + this->actor.gravity;
+ s32 isFinished;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- ret = true;
+ // Transition 3->DONE
+ isFinished = true;
} else {
- if (temp_f14 > 0.0f) {
- temp_f0 = temp_f14 / arg1;
- this->actor.shape.rot.x += (s16)(9100.0f * temp_f0);
- this->unk_3AE = 0;
+ if (velocity > 0.0f) {
+ // PHASE 1: Goron is rising
+ rotAndDistortFactor = velocity / initialVelocity;
+ this->actor.shape.rot.x += (s16)(0x238C * rotAndDistortFactor);
+ this->elapsedHangtime = 0;
} else if ((s32)this->actor.velocity.y == 0) {
- if (arg3 >= this->unk_3AE) {
- temp_f0 = (f32)this->unk_3AE / arg3;
+ if (maxHangtime >= this->elapsedHangtime) {
+ // PHASE 2: Goron is hanging in the air
+ rotAndDistortFactor = (f32)this->elapsedHangtime / maxHangtime;
} else {
- this->actor.gravity = -6.0f;
+ // Transition 2->3: Hanging is complete
+ this->actor.gravity = ENGO_POUND_INITIAL_FALL_VEL;
}
- this->unk_3AE++;
- } else if (this->unk_3AE == 0) {
+ this->elapsedHangtime++;
+ } else if (this->elapsedHangtime == 0) {
+ // Transition 1->2: Goron has reached the peak
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
- temp_f0 = temp_f14 / arg1;
+ rotAndDistortFactor = velocity / initialVelocity;
+ } else {
+ // PHASE 3: Goron is falling (Just letting gravity take effect)
}
- ret = false;
+ isFinished = false;
}
- this->unk_3A8 = (1.0f - temp_f0) * arg2;
- this->actor.scale.x = this->unk_3A4 - this->unk_3A8;
- this->actor.scale.y = this->unk_3A4 + this->unk_3A8;
+ // Handle shape distortions
+ this->scaleFactorPoundDistortion = (1.0f - rotAndDistortFactor) * maxDistortion;
+ this->actor.scale.x = this->scaleFactor - this->scaleFactorPoundDistortion;
+ this->actor.scale.y = this->scaleFactor + this->scaleFactorPoundDistortion;
+ this->actor.scale.z = MAX(this->actor.scale.x, this->actor.scale.y);
- if (this->actor.scale.y < this->actor.scale.x) {
- this->actor.scale.z = this->actor.scale.x;
- } else {
- this->actor.scale.z = this->actor.scale.y;
- }
- return ret;
+ return isFinished;
}
void EnGo_RequestQuake(PlayState* play, s16 speed, s16 y, s16 duration) {
@@ -1055,7 +1446,10 @@ void EnGo_RequestQuake(PlayState* play, s16 speed, s16 y, s16 duration) {
Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
}
-void func_80A13728(EnGo* this, PlayState* play) {
+/**
+ * Create the visual effects caused by the gatekeeper's pound.
+ */
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play) {
EnGo_RequestQuake(play, 27767, 7, 20);
play->actorCtx.unk2 = 4;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, this->actor.world.pos.x, this->actor.world.pos.y,
@@ -1063,11 +1457,14 @@ void func_80A13728(EnGo* this, PlayState* play) {
EffectSsBlast_SpawnWhiteShockwave(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f);
}
-void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
- u32 frames1;
- u32 frames2;
+/**
+ * Draw the ice encasing a frozen Goron.
+ */
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha) {
+ u32 y1;
+ u32 y2;
- if (this->unk_390 & 0x400) {
+ if (this->actionFlags & ENGO_FLAG_FROZEN) {
Matrix_Push();
OPEN_DISPS(play->state.gfxCtx);
@@ -1075,15 +1472,15 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
- Matrix_Scale(arg2 * 0.7f, arg2 * 0.8f, arg2, MTXMODE_APPLY);
+ Matrix_Scale(scale * 0.7f, scale * 0.8f, scale, MTXMODE_APPLY);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- frames1 = play->gameplayFrames % 256;
- frames2 = (play->gameplayFrames * 2) % 256;
+ y1 = play->gameplayFrames % 256;
+ y2 = (play->gameplayFrames * 2) % 256;
gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, frames1, 0x20, 0x10, 1, 0, frames2, 0x40, 0x20));
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)arg3);
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, y1, 0x20, 0x10, 1, 0, y2, 0x40, 0x20));
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)alpha);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
CLOSE_DISPS(play->state.gfxCtx);
@@ -1092,154 +1489,172 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
}
}
-void func_80A139E4(EnGo* this) {
- static Vec3f D_80A16698 = { 0.0f, 0.06f, 0.0f };
- Vec3f sp54;
- Vec3f sp48;
- s16 sp46 = Rand_ZeroOne() * 360.0f * 182.0f;
+/**
+ * Initialize the steam effect used for melting ice.
+ */
+void EnGo_MakeSteam(EnGo* this) {
+ static Vec3f sAccel = { 0.0f, 0.06f, 0.0f };
+ Vec3f tempPos;
+ Vec3f effectPos;
+ s16 rotAngle = Rand_ZeroOne() * 360.0f * 182.0f;
- Math_Vec3f_Copy(&sp54, &gZeroVec3f);
- sp54.z = 28.0f;
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, sp46, &sp54, &sp48);
- sp48.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
- sp48.y += this->actor.floorHeight;
- func_80A10FD0(&this->unk_3F8[16], sp48, D_80A16698, gZeroVec3f, 0.01f, 0.002f, 16);
+ Math_Vec3f_Copy(&tempPos, &gZeroVec3f);
+ tempPos.z = 28.0f;
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, rotAngle, &tempPos, &effectPos);
+ effectPos.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
+ effectPos.y += this->actor.floorHeight;
+ EnGo_InitSteam(&this->effectTable[ENGO_SNOW_EFFECT_COUNT], effectPos, sAccel, gZeroVec3f, ENGO_NORMAL_SCALE,
+ (0.2f * ENGO_NORMAL_SCALE), ENGO_DUST_STEAM_LIFETIME);
}
-s32 func_80A13B1C(EnGo* this, PlayState* play) {
+/**
+ * Transition through the cutscenes when the gatekeeper is opening the shrine.
+ *
+ * @return True when cutscenes end.
+ */
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 pad;
+ EnGo* this = THIS;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C4 = 1;
- this->unk_3C0 = 1;
- } else {
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->gatekeeperAnimState = 1;
+ this->cutsceneState = 1;
+ // fallthrough
case 1:
- if (CutsceneManager_GetCurrentCsId() != this->csId) {
- this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
- this->unk_3C0 = 2;
- } else {
+ if (CutsceneManager_GetCurrentCsId() == this->csId) {
break;
}
-
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ this->cutsceneState = 2;
+ // fallthrough
case 2:
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C0 = 3;
- } else {
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->cutsceneState = 3;
+ // fallthrough
case 3:
if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
CutsceneManager_StartWithPlayerCs(CS_ID_GLOBAL_TALK, NULL);
- this->unk_3C0 = 4;
+ this->cutsceneState = 4;
} else if (CutsceneManager_GetCurrentCsId() == this->csId) {
CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
+ // fallthrough
+ default:
+ break;
}
- switch (this->unk_3C4) {
+ switch (this->gatekeeperAnimState) {
case 1:
- func_80A12C48(this, play, 4);
- this->unk_390 |= 0x4000;
- this->unk_3C4++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->gatekeeperAnimState++;
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 &= ~0x80;
- this->unk_390 |= 0x200;
- this->unk_3C4++;
- this->unk_3C2 = 0;
- this->actor.shape.yOffset = 14.0f;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
break;
case 3:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_JUMP);
- this->actor.velocity.y = 10.0f;
+ this->actor.velocity.y = ENGO_POUND_INITIAL_RISE_VEL;
this->actor.gravity = -1.0f;
- this->unk_3C4++;
+ this->gatekeeperAnimState++;
}
break;
case 4:
- if (func_80A13564(this, 10.0f, 0.004f, 6)) {
+ if (EnGo_HandleGatekeeperPoundCutscene(this, ENGO_POUND_INITIAL_RISE_VEL, (0.4f) * ENGO_NORMAL_SCALE, 6)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
- func_80A13728(this, play);
- this->unk_3C4++;
- this->unk_3C2 = 0;
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ EnGo_CreateGatekeeperPoundEffects(this, play);
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
}
break;
case 5:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
- func_80A12C48(this, play, 5);
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
this->actor.shape.rot.x = 0;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x80;
- this->unk_3C4++;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->gatekeeperAnimState++;
}
break;
case 6:
- this->unk_3C0++;
- if (this->unk_3C0 >= 65) {
+ this->cutsceneState++;
+ if (this->cutsceneState >= 65) {
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
- SET_WEEKEVENTREG(WEEKEVENTREG_88_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN);
break;
case PLAYER_FORM_GORON:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON);
break;
case PLAYER_FORM_ZORA:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_02);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA);
break;
case PLAYER_FORM_DEKU:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_01);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU);
+ break;
+
+ default:
break;
}
ret = true;
}
break;
+
+ default:
+ break;
}
Actor_MoveWithGravity(&this->actor);
return ret;
}
-s32 func_80A13E80(EnGo* this, PlayState* play) {
- static Vec3f D_80A166A4 = { 0.0f, 200.0f, 280.0f };
- s32 pad;
- Vec3f sp48;
+/**
+ * Medigoron's MsgEvent callback to give the Powder Keg for the test.
+ */
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play) {
+ static Vec3f sPowderKegSpawnOffset = { 0.0f, 200.0f, 280.0f };
+ EnGo* this = THIS;
+ Vec3f powderKegSpawnPos;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
this->csId = this->actor.csId;
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C0++;
+ if (EnGo_ChangeCutscene(this, this->csId)) {
+ this->cutsceneState++;
}
break;
case 1:
- func_80A12C48(this, play, 7);
- this->unk_3C0++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_DROPKEG);
+ this->cutsceneState++;
case 2:
if (Animation_OnFrame(&this->skelAnime, 16.0f)) {
@@ -1247,263 +1662,348 @@ s32 func_80A13E80(EnGo* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 1);
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166A4, &sp48);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE_IMM);
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sPowderKegSpawnOffset,
+ &powderKegSpawnPos);
gSaveContext.powderKegTimer = 2400;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, sp48.x, sp48.y, sp48.z, BOMB_EXPLOSIVE_TYPE_POWDER_KEG,
- 0, 0, BOMB_TYPE_BODY);
- func_80A134B0(this, play, 1);
- this->unk_3C2 = 0;
- this->unk_3C0++;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, powderKegSpawnPos.x, powderKegSpawnPos.y,
+ powderKegSpawnPos.z, BOMB_EXPLOSIVE_TYPE_POWDER_KEG, 0, 0, BOMB_TYPE_BODY);
+ EnGo_UpdateMedigoronColliderRadius(this, play, true);
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState++;
}
break;
case 3:
- if (this->unk_3C2 >= 60) {
+ if (this->cutsceneDelayTimer >= 60) {
CutsceneManager_Stop(this->csId);
- this->unk_3C2 = 0;
- this->unk_3C0 = 0;
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState = 0;
ret = true;
} else {
- this->unk_3C2++;
+ this->cutsceneDelayTimer++;
}
break;
+
+ default:
+ break;
}
return ret;
}
-void func_80A14018(EnGo* this, PlayState* play) {
- static Vec3f D_80A166B0 = { 0.0f, 0.0f, 40.0f };
- static s32 D_80A166BC[] = { 11, 10, 12, 13, 14, 17 };
- Vec3f sp2C;
- s32 phi_v0 = ENGO_GET_70(&this->actor) % 6;
+/**
+ * Update the stretching racer's animation and actionFlags.
+ *
+ * 'ENGO_ATHLETIC_A' through 'ENGO_ATHLETIC_D' exchange animations before and after the race, while the hamstring
+ * stretchers have the same animation every time.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play) {
+ static Vec3f sStretchingGoronOffset = { 0.0f, 0.0f, 40.0f };
+ static s32 sSubtypeToAnimIndex[] = {
+ ENGO_ANIM_SQUAT_SIDE_TO_SIDE, ENGO_ANIM_DOUBLE_ARM_SIDEBEND, ENGO_ANIM_SHAKE_LIMBS,
+ ENGO_ANIM_SINGLE_ARM_SIDEBEND, ENGO_ANIM_SITTING_STRETCH, ENGO_ANIM_HELP_SITTING_STRETCH,
+ };
+ Vec3f newSittingStretcherPos;
- if (phi_v0 < 4) {
- phi_v0 = ((gSaveContext.eventInf[2] & 0xF) + phi_v0) % 4;
+ // The first four Racer Gorons have different stretches depending on context
+ // The last two remain the same (since they are dependent on one-another)
+ s32 subtypeLookup = ENGO_GET_SUBTYPE(&this->actor) % 6;
+
+ if (subtypeLookup < 4) {
+ subtypeLookup = ((gSaveContext.eventInf[2] & 0xF) + subtypeLookup) % 4;
}
- func_80A12C48(this, play, D_80A166BC[phi_v0]);
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[subtypeLookup]);
- if (this->unk_3DC == 14) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166B0, &sp2C);
- Math_Vec3f_Copy(&this->actor.world.pos, &sp2C);
+ // Move the sitting Goron forward, since their spawn location is the same as their standing counterpart.
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
+
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sStretchingGoronOffset,
+ &newSittingStretcherPos);
+ Math_Vec3f_Copy(&this->actor.world.pos, &newSittingStretcherPos);
}
+
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= (0x40 | 0x20);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= (ENGO_FLAG_LOST_ATTENTION | ENGO_FLAG_EYES_OPEN);
this->actor.gravity = 0.0f;
}
-void func_80A14104(EnGo* this, PlayState* play) {
- static s32 D_80A166D4[] = { 15, 16 };
- s16 temp;
+/**
+ * Update the Goron's animation and actionFlags to 'spectating'.
+ *
+ * Spectators engage in one of two cheering animations. Either cheering with their hands above their head, or
+ * cupping their hands infront of their face and shouting.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play) {
+ static s32 sSubtypeToAnimIndex[] = { ENGO_ANIM_CHEER, ENGO_ANIM_SHOUT };
+ s16 animFrame;
+
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[ENGO_GET_SUBTYPE(&this->actor) % 2]);
+ animFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
+ this->skelAnime.curFrame = animFrame;
- func_80A12C48(this, play, D_80A166D4[ENGO_GET_70(&this->actor) % 2]);
- temp = Rand_ZeroOne() * this->skelAnime.endFrame;
- this->skelAnime.curFrame = temp;
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
this->actor.gravity = 0.0f;
}
-void func_80A141D4(EnGo* this, PlayState* play) {
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit1);
+/**
+ * Update the Goron's animation and actionFlags to 'frozen'.
+ *
+ * The Goron will shiver upon awakening, but is otherwise encased in a block of ice which deals damage upon contact.
+ *
+ * @see EnGo_Frozen
+ */
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play) {
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInitFrozen);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 5);
- this->unk_3EC = 0;
- this->unk_39C = (this->unk_3A4 / 0.01f) * 0.9f;
- this->unk_3BE = 2;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x400;
- this->unk_3A0 = 100.0f;
+ this->curAnimIndex = -1;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->sleepState = ENGO_AWAKE;
+ this->iceBlockScale = (this->scaleFactor / 0.01f) * 0.9f;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FROZEN;
+ this->iceBlockAlpha = 100.0f;
}
-void func_80A1428C(EnGo* this, PlayState* play) {
- s16 temp;
- Vec3f sp30;
- Vec3f sp24;
+/**
+ * Update the Goron Gatekeeper's animation and actionFlags to 'snowball'.
+ *
+ * @see EnGo_Snowball
+ */
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play) {
+ s16 yawToPathPoint;
+ Vec3f currentPos;
+ Vec3f startingPathPoint;
- Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
- if (this->unk_284 != NULL) {
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ if (this->gatekeeperPath != NULL) {
this->actor.flags &= ~ACTOR_FLAG_2000000;
- SubS_CopyPointFromPathCheckBounds(this->unk_284, 0, &sp24);
- temp = Math_Vec3f_Yaw(&sp30, &sp24);
- this->actor.shape.rot.y = temp;
- this->actor.world.rot.y = temp;
+ SubS_CopyPointFromPathCheckBounds(this->gatekeeperPath, 0, &startingPathPoint);
+ yawToPathPoint = Math_Vec3f_Yaw(¤tPos, &startingPathPoint);
+ this->actor.shape.rot.y = yawToPathPoint;
+ this->actor.world.rot.y = yawToPathPoint;
}
- this->unk_390 = 0;
- this->unk_390 |= 0x100;
- this->actor.shape.yOffset = 46.0f;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_SNOWBALLED;
+ this->actor.shape.yOffset = ENGO_SNOWBALL_Y_OFFSET;
this->actor.gravity = -1.0f;
}
-void func_80A14324(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 8);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'covering ears'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_COVEREARS);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_3BC = 0;
- this->unk_3BE = 4;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A143A8(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 5);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'shivering'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A14430(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron stretching at the racetrack.
+ *
+ * Stretching Gorons placed in the starting area of the racetrack doing various stretches.
+ */
+void EnGo_SetupAthletic(EnGo* this, PlayState* play) {
if (((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 0)) ||
(gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 2))) &&
(CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE))) {
- func_80A14018(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToStretchingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A1449C(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron spectating at the racetrack.
+ *
+ * Spectators to the Goron races cannot be engaged, they simply stand idle and cheer.
+ */
+void EnGo_SetupSpectator(EnGo* this, PlayState* play) {
if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) ||
(gSaveContext.save.entrance == ENTRANCE(CUTSCENE, 0))) {
- func_80A14104(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToSpectatingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A144F4(EnGo* this, PlayState* play) {
+/**
+ * Setup the Goron Shrine's Gatekeeper.
+ *
+ * When spoken to, can open the Goron Shrine for the player.
+ * - On Day 1: Can be found in the open, shivering.
+ * - On Days 2,3: Can be found in a snowball.
+ */
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play) {
if (gSaveContext.save.day >= 2) {
- this->unk_284 = SubS_GetDayDependentPath(play, ENGO_GET_7F80(&this->actor), 0xFF, &this->unk_3E4);
- if (this->unk_284 != NULL) {
- this->unk_3E4 = 1;
+ this->gatekeeperPath = SubS_GetDayDependentPath(play, ENGO_GET_PATH(&this->actor), 0xFF, &this->indexPathPoint);
+ if (this->gatekeeperPath != NULL) {
+ this->indexPathPoint = 1;
}
- func_80A1428C(this, play);
- this->actionFunc = func_80A153FC;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToSnowballAnimation(this, play);
+ this->actionFunc = EnGo_Snowball;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
}
}
-void func_80A145AC(EnGo* this, PlayState* play) {
- if ((ENGO_GET_70(&this->actor) == ENGO_70_1) &&
+/**
+ * Setup a Goron at the graveyard
+ *
+ * The Gorons are together, one shivering from the cold, another frozen solid.
+ */
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) &&
(((play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
(play->csCtx.scriptIndex == 0)) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08))) {
- this->actor.child = func_80A13400(this, play);
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON))) {
+ this->actor.child = EnGo_FindGravemaker(this, play);
this->actor.child->child = &this->actor;
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14668(EnGo* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- func_80A14324(this, play);
- this->actionFunc = func_80A149B0;
+/**
+ * Setup a shrine Goron.
+ *
+ * There are three, but they all behave the same way aside from dialog.
+ */
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ EnGo_ChangeToCoveringEarsAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A146CC(EnGo* this, PlayState* play) {
- func_80A134B0(this, play, 0);
- func_80A12C48(this, play, 0);
- this->unk_3A4 *= 5.0f;
- Actor_SetScale(&this->actor, this->unk_3A4);
+/**
+ * Setup the Medigoron in the Powder Keg Shop.
+ *
+ * This Goron sells Powder Kegs, and gives the player a Powder Keg as part of a challenge to gain
+ * the privilege to buy them.
+ */
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play) {
+ EnGo_UpdateMedigoronColliderRadius(this, play, false);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE);
+ this->scaleFactor *= ENGO_MEDIGORON_SCALE_MULTIPLIER;
+ Actor_SetScale(&this->actor, this->scaleFactor);
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.targetMode = 3;
- this->unk_390 = 0;
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3D8 = func_80A13E80;
- this->actionFunc = func_80A149B0;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->msgEventFunc = EnGo_HandleGivePowderKegCutscene;
+ this->actionFunc = EnGo_Idle;
}
-void func_80A14798(EnGo* this, PlayState* play) {
- EffectTireMarkInit sp38 = {
- 0,
- 62,
- { 0, 0, 15, 100 },
- };
+/**
+ * Default setup function as the initial action function.
+ */
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play) {
+ EffectTireMarkInit tireMarkInit = { 0, 62, { 0, 0, 15, 100 } };
- if ((this->unk_288 < 0) || SubS_IsObjectLoaded(this->unk_288, play) || (this->unk_289 < 0) ||
- SubS_IsObjectLoaded(this->unk_289, play)) {
+ if (((this->taisouObjIndex < 0) || SubS_IsObjectLoaded(this->taisouObjIndex, play)) ||
+ ((this->hakuginDemoObjIndex < 0) || SubS_IsObjectLoaded(this->hakuginDemoObjIndex, play))) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable,
GORON_LIMB_MAX);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 2);
- this->actor.draw = func_80A15FEC;
+ this->curAnimIndex = ENGO_ANIM_INVALID;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL);
+ this->actor.draw = EnGo_Draw;
Collider_InitAndSetSphere(play, &this->colliderSphere, &this->actor, &sSphereInit);
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit2);
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- Effect_Add(play, &this->unk_3E8, EFFECT_TIRE_MARK, 0, 0, &sp38);
+ Effect_Add(play, &this->indexEffect, EFFECT_TIRE_MARK, 0, 0, &tireMarkInit);
this->actor.targetMode = 1;
- this->unk_3A4 = 0.01f;
- this->unk_3D8 = NULL;
+ this->scaleFactor = ENGO_NORMAL_SCALE;
+ this->msgEventFunc = NULL;
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_1:
- func_80A14430(this, play);
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_ATHLETIC:
+ EnGo_SetupAthletic(this, play);
break;
- case ENGO_F_2:
- func_80A1449C(this, play);
+ case ENGO_SPECTATOR:
+ EnGo_SetupSpectator(this, play);
break;
- case ENGO_F_3:
- func_80A144F4(this, play);
+ case ENGO_GATEKEEPER:
+ EnGo_SetupGatekeeper(this, play);
break;
- case ENGO_F_4:
- func_80A145AC(this, play);
+ case ENGO_GRAVEYARD:
+ EnGo_SetupGraveyardGoron(this, play);
break;
- case ENGO_F_5:
- case ENGO_F_6:
- case ENGO_F_7:
- func_80A14668(this, play);
+ case ENGO_ASIDE_STORE:
+ case ENGO_ASIDE_ELDERSROOM:
+ case ENGO_ASIDE_ELDERSSON:
+ EnGo_SetupShrineGoron(this, play);
break;
- case ENGO_F_8:
- func_80A146CC(this, play);
+ case ENGO_MEDIGORON:
+ EnGo_SetupMedigoron(this, play);
break;
default:
@@ -1513,147 +2013,192 @@ void func_80A14798(EnGo* this, PlayState* play) {
}
}
-void func_80A149B0(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Default action for the Gorons. Different types have different default actions.
+ *
+ * The default action possibilities include:
+ * - Shivering
+ * - Covering ears
+ * - Spectating (cheering or shouting)
+ * - Stretching (side-to-side squatting, two-arm side bend, limb shake, one-arm side bend, hamstring stretching while
+ * sitting, and helping the hamstring stretching Goron.)
+ */
+void EnGo_Idle(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_2) && (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_SPECTATOR) &&
+ (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ // Spectators only cheer. No other interactions
Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_CHEER - SFX_FLAG);
- } else if (ENGO_GET_F(&this->actor) != ENGO_F_8) {
- if (func_80A1222C(this, play)) {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3EC = 1;
- this->actionFunc = func_80A14B30;
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_4) {
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
- func_80A132C8(this, play);
+ } else if (ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) {
+ // All others besides the Medigoron in the Powder Keg Shop can fall asleep
+ if (EnGo_IsFallingAsleep(this, play)) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->sleepState = ENGO_ASLEEP_POS;
+ this->actionFunc = EnGo_Sleep;
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) {
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
+ EnGo_GravemakerIdle(this, play);
break;
- case ENGO_70_1:
- func_80A133A8(this, play);
+ case ENGO_GRAVEYARD_FROZEN:
+ EnGo_FrozenIdle(this, play);
+ break;
+
+ default:
break;
}
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
if (ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 0x3FFC) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
}
}
}
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14B30(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Handles falling asleep, as well as snoring while asleep.
+ */
+void EnGo_Sleep(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
u16 sfxId;
- if (func_80A1222C(this, play)) {
- this->unk_3EC = 1;
+ if (EnGo_IsFallingAsleep(this, play)) {
+ this->sleepState = ENGO_ASLEEP_POS;
}
- if (this->unk_390 & 0x4000) {
+ if (this->actionFlags & ENGO_FLAG_ROLLING_UP) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 |= 0x200;
- if (this->unk_3EC != 0) {
- this->unk_3AE = 0;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ if (this->sleepState != ENGO_AWAKE) {
+ this->snorePhase = 0;
}
- this->actor.shape.yOffset = 14.0f;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
- } else if (this->unk_390 & 0x8000) {
+ } else if (this->actionFlags & ENGO_FLAG_UNROLLING) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 |= 0x80;
- this->unk_390 &= ~0x8000;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_UNROLLING;
}
- } else if (this->unk_390 & 0x200) {
- if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) && (this->unk_3EC == 0)) {
- func_80A12C48(this, play, 3);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x8000;
- this->actor.shape.yOffset = 0.0f;
- } else if ((this->unk_3EC != 0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- this->actor.scale.x = this->unk_3A4 - (Math_SinS(this->unk_3AE) * 0.001f);
- this->actor.scale.y = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- this->actor.scale.z = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- if (this->unk_3AE == 0) {
- this->unk_3EC = -this->unk_3EC;
- if (this->unk_3EC > 0) {
- sfxId = NA_SE_EN_GOLON_SNORE1;
- } else {
- sfxId = NA_SE_EN_GOLON_SNORE2;
- }
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) &&
+ (this->sleepState == ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL_IMM);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_UNROLLING;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
+ } else if ((this->sleepState != ENGO_AWAKE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ // While asleep, rhythmicallly snore and change shape to show breathing.
+ this->actor.scale.x = this->scaleFactor - (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.y = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.z = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+
+ if (this->snorePhase == 0) {
+ this->sleepState = -this->sleepState;
+ sfxId = (this->sleepState > ENGO_AWAKE) ? NA_SE_EN_GOLON_SNORE1 : NA_SE_EN_GOLON_SNORE2;
Actor_PlaySfx(&this->actor, sfxId);
}
- this->unk_3AE += 0x400;
- this->actor.shape.yOffset = (this->actor.scale.y / this->unk_3A4) * 14.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ this->snorePhase += 0x400;
+ this->actor.shape.yOffset = (this->actor.scale.y / this->scaleFactor) * ENGO_ROLLEDUP_Y_OFFSET;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
}
} else if ((this->actor.xzDistToPlayer >= 240.0f) || (this->actor.playerHeightRel >= 20.0f) ||
- (this->unk_3EC != 0)) {
- func_80A12C48(this, play, 4);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x4000;
- this->actor.shape.yOffset = 0.0f;
+ (this->sleepState != ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14E14(EnGo* this, PlayState* play) {
- Actor* actor = this->colliderCylinder.base.ac;
+/**
+ * Action function for a frozen Goron.
+ *
+ * Transitions to the thawing cutscene when colliding with hot water or fire effect.
+ */
+void EnGo_Frozen(EnGo* this, PlayState* play) {
+ Actor* actorCollidedWith = this->colliderCylinder.base.ac;
- if ((this->unk_390 & 0x1000) && (((actor != NULL) && (actor->id == ACTOR_OBJ_AQUA) && (actor->params & 1)) ||
- (this->actor.colChkInfo.damageEffect == 2))) {
- this->actionFunc = func_80A14E74;
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) &&
+ (((actorCollidedWith != NULL) && (actorCollidedWith->id == ACTOR_OBJ_AQUA) && AQUA_HOT(actorCollidedWith)) ||
+ (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_FIRE))) {
+ this->actionFunc = EnGo_AwaitThaw;
}
}
-void func_80A14E74(EnGo* this, PlayState* play) {
- if (func_80A134F4(this, this->actor.csId)) {
- this->actionFunc = func_80A14EB0;
+/**
+ * Action function for transitioning to thawing.
+ */
+void EnGo_AwaitThaw(EnGo* this, PlayState* play) {
+ if (EnGo_ChangeCutscene(this, this->actor.csId)) {
+ this->actionFunc = EnGo_Thaw;
}
}
-void func_80A14EB0(EnGo* this, PlayState* play) {
- EnGo* sp24 = (EnGo*)this->actor.child;
+/**
+ * Action function for thawing of the Goron, melting sounds, and steam.
+ */
+void EnGo_Thaw(EnGo* this, PlayState* play) {
+ EnGo* otherGoron = (EnGo*)this->actor.child;
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
} else {
CutsceneManager_Stop(this->actor.csId);
- func_80A143A8(this, play);
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (ENGO_GET_70(&this->actor) == ENGO_70_1)) {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
- func_80A143A8(sp24, play);
- sp24->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN)) {
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
+ EnGo_ChangeToShiveringAnimation(otherGoron, play);
+ otherGoron->actionFunc = EnGo_Idle;
}
- this->actionFunc = func_80A149B0;
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14FC8(EnGo* this, PlayState* play) {
- s32 sp38[] = {
- 0, 2, 6, 20, 18, 5, 5, 15,
+/**
+ * Cutscene action function for the arrival of springtime.
+ *
+ * This cutscene consists of:
+ * - The gravemaker stops shivering and looks around.
+ * - The other Goron thaws and shivers briefly.
+ * - The gravemaker pats the other's back and gestures broadly.
+ * - They both look around.
+ * - They both cheer.
+ */
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ s32 animationIndices[] = {
+ ENGO_ANIM_LYINGDOWNIDLE, ENGO_ANIM_UNROLL, ENGO_ANIM_SHIVER_IMM, ENGO_ANIM_LOOK_AROUND,
+ ENGO_ANIM_SHOW, ENGO_ANIM_SHIVER, ENGO_ANIM_SHIVER, ENGO_ANIM_CHEER,
};
u16 cueType = 0;
s32 cueId;
s32 cueChannel;
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
cueType = CS_CMD_ACTOR_CUE_128;
break;
- case ENGO_70_1:
+ case ENGO_GRAVEYARD_FROZEN:
cueType = CS_CMD_ACTOR_CUE_129;
break;
+
+ default:
+ break;
}
if ((cueType == CS_CMD_ACTOR_CUE_128) || (cueType == CS_CMD_ACTOR_CUE_129)) {
@@ -1661,51 +2206,59 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
cueChannel = Cutscene_GetCueChannel(play, cueType);
cueId = play->csCtx.actorCues[cueChannel]->id;
- if (this->cueId != (u8)cueId) {
- this->cueId = cueId;
- func_80A12C48(this, play, sp38[cueId]);
- this->unk_390 = 0;
- this->unk_390 |= 0x20;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ if (this->springArrivalCueId != (u8)cueId) {
+ this->springArrivalCueId = cueId;
+ EnGo_ChangeAnim(this, play, animationIndices[cueId]);
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
switch (cueId) {
case 1:
- this->unk_390 |= 0x80;
+ this->actionFlags |= ENGO_FLAG_STANDING;
this->skelAnime.curFrame = this->skelAnime.endFrame;
break;
case 5:
case 6:
- func_80A141D4(this, play);
+ EnGo_ChangeToFrozenAnimation(this, play);
+ break;
+
+ default:
break;
}
}
- switch (this->cueId) {
+ switch (this->springArrivalCueId) {
case 3:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 20)) {
- func_80A12C48(this, play, 21);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_LOOK_AROUND)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LOOK_AROUND_LOOPED);
}
break;
case 4:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 18)) {
- func_80A12C48(this, play, 19);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_SHOW)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHOW_LOOPED);
}
break;
case 6:
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
- } else if (this->unk_390 & 0x400) {
- func_80A143A8(this, play);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_ChangeToShiveringAnimation(this, play);
}
break;
+
+ default:
+ break;
}
if (cueType == 128) {
@@ -1731,6 +2284,9 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 490:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
} else if (cueType == 129) {
switch (play->csCtx.curFrame) {
@@ -1750,65 +2306,72 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 480:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
}
-void func_80A153FC(EnGo* this, PlayState* play) {
- Vec3s* sp5C;
- Vec3f sp50;
- Vec3f sp44;
+/**
+ * Action function for the Gatekeeper while they're in a snowball.
+ *
+ * On Day 2, they'll roll along a set path, and can be halted with certain attacks.
+ * On Day 3, they're frozen solid.
+ */
+void EnGo_Snowball(EnGo* this, PlayState* play) {
+ Vec3s* pathPoints;
+ Vec3f currentPos;
+ Vec3f currentPathPoint;
- if ((this->unk_390 & 0x1000) && (this->actor.colChkInfo.damageEffect == 0xF)) {
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) && (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_BREAK)) {
+ // Stop the Gatekeeper when hit by an appropriate effect
Actor_PlaySfx(&this->actor, NA_SE_EV_SNOWBALL_BROKEN);
-
this->actor.flags &= ~ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
-
- func_80A118F8(this->unk_3F8, this->actor.world.pos);
+ EnGo_InitSnow(this->effectTable, this->actor.world.pos);
this->actor.shape.rot.x = 0;
this->actor.speed = 0.0f;
-
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
if (gSaveContext.save.day == 3) {
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
- } else if (this->unk_284 != NULL) {
- if (this->unk_390 & 0x800) {
+ } else if (this->gatekeeperPath != NULL) {
+ if (this->actionFlags & ENGO_FLAG_HIT_OTHER) {
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
func_800B8D50(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
}
- sp5C = Lib_SegmentedToVirtual(this->unk_284->points);
- if (SubS_HasReachedPoint(&this->actor, this->unk_284, this->unk_3E4)) {
- if (this->unk_3E4 >= (this->unk_284->count - 1)) {
- this->unk_3E4 = 0;
+ pathPoints = Lib_SegmentedToVirtual(this->gatekeeperPath->points);
+ if (SubS_HasReachedPoint(&this->actor, this->gatekeeperPath, this->indexPathPoint)) {
+ if (this->indexPathPoint >= (this->gatekeeperPath->count - 1)) {
+ this->indexPathPoint = 0;
} else {
- this->unk_3E4++;
+ this->indexPathPoint++;
}
}
- Math_Vec3s_ToVec3f(&sp44, &sp5C[this->unk_3E4]);
- Math_Vec3f_Copy(&sp50, &this->actor.world.pos);
- Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&sp50, &sp44), 4, 0x38E);
+ Math_Vec3s_ToVec3f(¤tPathPoint, &pathPoints[this->indexPathPoint]);
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(¤tPos, ¤tPathPoint), 4, 0x38E);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BIGBALL_ROLL - SFX_FLAG);
- func_800AE930(&play->colCtx, Effect_GetByIndex(this->unk_3E8), &this->actor.world.pos, 18.0f,
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->indexEffect), &this->actor.world.pos, 18.0f,
this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
} else {
- func_800AEF44(Effect_GetByIndex(this->unk_3E8));
+ func_800AEF44(Effect_GetByIndex(this->indexEffect));
}
this->actor.speed = 4.0f;
@@ -1817,86 +2380,107 @@ void func_80A153FC(EnGo* this, PlayState* play) {
}
}
-s32* func_80A15684(EnGo* this, PlayState* play) {
- static s32* D_80A16704[] = {
- D_80A16100,
- D_80A16164,
+/**
+ * Return the MsgEvent script appropriate for the actor.
+ */
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play) {
+ static s32 sMsgScriptGraveyard[] = {
+ sMsgScriptGoronGravemaker,
+ sMsgScriptGoronFrozen,
};
- if (this->unk_3EC != 0) {
- return D_80A1640C;
+ if (this->sleepState != ENGO_AWAKE) {
+ return sMsgScriptGoronSleeping; // Lullaby hint
}
- if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
- switch (ENGO_GET_70(&this->actor) % 6) {
- case ENGO_70_0:
- return D_80A163BC;
- case ENGO_70_1:
- return D_80A163CC;
- case ENGO_70_2:
- return D_80A163DC;
- case ENGO_70_3:
- return D_80A163EC;
- case ENGO_70_4:
- return D_80A163FC;
- case ENGO_70_5:
- return D_80A163FC;
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
+ switch (ENGO_GET_SUBTYPE(&this->actor) % 6) {
+ case ENGO_ATHLETIC_A:
+ return sMsgScriptGoronAthleticA;
+
+ case ENGO_ATHLETIC_B: // Unused!
+ return sMsgScriptGoronAthleticB;
+
+ case ENGO_ATHLETIC_C:
+ return sMsgScriptGoronAthleticC;
+
+ case ENGO_ATHLETIC_D:
+ return sMsgScriptGoronAthleticD;
+
+ case ENGO_ATHLETIC_HAMSTRINGSIT:
+ return sMsgScriptGoronAthleticHamstring;
+
+ case ENGO_ATHLETIC_HAMSTRINGSTAND:
+ return sMsgScriptGoronAthleticHamstring;
+
+ default:
+ break;
}
}
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_3:
- return D_80A16350;
- case ENGO_F_4:
- return D_80A16704[ENGO_GET_70(&this->actor)];
- case ENGO_F_5:
- return D_80A16208;
- case ENGO_F_6:
- return D_80A16254;
- case ENGO_F_7:
- return D_80A16210;
- case ENGO_F_8:
- return D_80A16280;
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_GATEKEEPER:
+ return sMsgScriptGoronGatekeeper;
+
+ case ENGO_GRAVEYARD:
+ return sMsgScriptGraveyard[ENGO_GET_SUBTYPE(&this->actor)];
+
+ case ENGO_ASIDE_STORE:
+ return sMsgScriptGoronAsideStore;
+
+ case ENGO_ASIDE_ELDERSROOM:
+ return sMsgScriptGoronAsideEldersRoom;
+
+ case ENGO_ASIDE_ELDERSSON:
+ return sMsgScriptGoronAsideEldersSon;
+
+ case ENGO_MEDIGORON:
+ return sMsgScriptGoronMedigoron;
+
default:
- return D_80A16208;
+ return sMsgScriptGoronAsideStore;
}
}
-void func_80A157C4(EnGo* this, PlayState* play) {
+/**
+ * Action function for dialog, movement due to dialog, and ending dialog
+ */
+void EnGo_Talk(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
+ Vec3f targetPos;
+ Vec3f thisPos;
- if (!func_8010BF58(&this->actor, play, func_80A15684(this, play), this->unk_3D8, &this->unk_28C)) {
- if ((ENGO_GET_F(&this->actor) != ENGO_F_1) && !(this->unk_390 & 0x200)) {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp34, &sp40), 4, 0x2AA8);
+ if (!func_8010BF58(&this->actor, play, EnGo_GetMsgEventScript(this, play), this->msgEventFunc,
+ &this->msgScriptResumePos)) {
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&thisPos, &targetPos), 4, 0x2AA8);
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
return;
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_390 &= ~0x20;
- this->unk_3BE = 4;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->actionFlags &= ~ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
}
- this->unk_390 &= ~0x8;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_28C = 0;
- this->unk_390 |= 0x40;
- this->actionFunc = this->unk_18C;
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->msgScriptResumePos = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFunc = this->interruptedActionFunc;
}
void EnGo_Init(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- this->unk_288 = SubS_GetObjectIndex(OBJECT_TAISOU, play);
- this->unk_289 = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
- this->actionFunc = func_80A14798;
+ this->taisouObjIndex = SubS_GetObjectIndex(OBJECT_TAISOU, play);
+ this->hakuginDemoObjIndex = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
+ this->actionFunc = EnGo_SetupInitialAction;
}
void EnGo_Destroy(Actor* thisx, PlayState* play) {
@@ -1904,50 +2488,55 @@ void EnGo_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->colliderCylinder);
Collider_DestroySphere(play, &this->colliderSphere);
- Effect_Destroy(play, this->unk_3E8);
+ Effect_Destroy(play, this->indexEffect);
}
void EnGo_Update(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- f32 phi_f0;
+ f32 xzRange;
- func_80A12868(this, play);
- if (!func_80A12774(this, play)) {
- func_80A12954(this, play);
+ EnGo_DetectCollisions(this, play);
+
+ if (!EnGo_UpdateTalking(this, play)) {
+ EnGo_UpdateSpringArrivalCutscene(this, play);
}
this->actionFunc(this, play);
- if (!(this->unk_390 & 0x400)) {
- func_80A12D6C(this);
- func_80A12A64(this, play);
- func_80A131F8(this, play);
- func_80A12B78(this, play);
+ if (!(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ EnGo_UpdateEyes(this);
+ EnGo_UpdateAnimationToCurrent(this, play);
+ EnGo_UpdateAttentionTargetAndReactions(this, play);
+ EnGo_UpdateSfx(this, play);
}
- if (!(this->unk_390 & 0x100) && !(this->unk_390 & 0x200) && !(this->unk_390 & 0x400)) {
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- phi_f0 = this->colliderSphere.dim.worldSphere.radius + 60;
+ if (!(this->actionFlags & ENGO_FLAG_SNOWBALLED) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP) &&
+ !(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ xzRange = this->colliderSphere.dim.worldSphere.radius + 60;
} else {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
+ xzRange = this->colliderCylinder.dim.radius + 40;
}
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
- } else if ((this->unk_390 & 0x200) && (this->unk_3EC != 0)) {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
+ } else if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) && (this->sleepState != ENGO_AWAKE)) {
+ xzRange = this->colliderCylinder.dim.radius + 40;
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_2) &&
- (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_SPECTATOR) &&
+ (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
- func_80A122EC(this);
- func_80A126BC(this, play);
- func_80A1203C(this);
+ EnGo_UpdateFocus(this);
+ EnGo_UpdateCollider(this, play);
+ EnGo_UpdateEffects(this);
}
-void func_80A15B80(EnGo* this, PlayState* play) {
+/**
+ * Draw function for a snowballed or rolled up Goron (no need to draw limbs).
+ */
+void EnGo_Draw_NoSkeleton(EnGo* this, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
@@ -1961,7 +2550,7 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
Matrix_Translate(0.0f, this->actor.shape.yOffset, 0.0f, MTXMODE_APPLY);
- if (this->unk_390 & 0x100) {
+ if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
Matrix_Scale(this->actor.scale.x * 8.0f, this->actor.scale.y * 8.0f, this->actor.scale.z * 8.0f, MTXMODE_APPLY);
} else {
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
@@ -1970,60 +2559,59 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, (this->unk_390 & 0x100) ? gGoronSnowballDL : gGoronRolledUpDL);
+ gSPDisplayList(POLY_OPA_DISP++, (this->actionFlags & ENGO_FLAG_SNOWBALLED) ? gGoronSnowballDL : gGoronRolledUpDL);
CLOSE_DISPS(play->state.gfxCtx);
}
s32 EnGo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnGo* this = THIS;
- Vec3f sp30;
- s32 idx;
+ Vec3f worldPos;
+ s32 rotTableIndex;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_8) && (limbIndex == 10)) {
- Matrix_MultZero(&sp30);
- sp30.y = this->actor.world.pos.y;
- Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) && (limbIndex == GORON_LIMB_BODY)) {
+ Matrix_MultZero(&worldPos);
+ worldPos.y = this->actor.world.pos.y;
+ Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &worldPos);
}
switch (limbIndex) {
- case 10:
- idx = 0;
+ case GORON_LIMB_BODY:
+ rotTableIndex = 0;
break;
- case 11:
- idx = 1;
+ case GORON_LIMB_LEFT_UPPER_ARM:
+ rotTableIndex = 1;
break;
- case 14:
- idx = 2;
+ case GORON_LIMB_RIGHT_UPPER_ARM:
+ rotTableIndex = 2;
break;
default:
- idx = 9;
+ rotTableIndex = 9;
break;
}
- if ((this->unk_390 & 0x80) && (idx < 9)) {
- rot->y += (s16)(Math_SinS(this->unk_3CE[idx]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk_3C8[idx]) * 200.0f);
+ if ((this->actionFlags & ENGO_FLAG_STANDING) && (rotTableIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->limbRotTableY[rotTableIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->limbRotTableZ[rotTableIndex]) * 200.0f);
}
return false;
}
void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnGo* this = THIS;
- u16 temp_v0;
s32 stepRot;
s32 overrideRot;
- if (this->unk_390 & 0x40) {
+ if (this->actionFlags & ENGO_FLAG_LOST_ATTENTION) {
stepRot = false;
} else {
stepRot = true;
}
- if (this->unk_390 & 0x10) {
+ if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
overrideRot = true;
} else {
overrideRot = false;
@@ -2034,47 +2622,50 @@ void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
}
switch (limbIndex) {
- case 17:
- SubS_UpdateLimb(this->unk_3B0 + this->unk_3B4 + 0x4000,
- this->unk_3B2 + this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_290,
- &this->unk_2A8, stepRot, overrideRot);
+ case GORON_LIMB_HEAD:
+ SubS_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000,
+ this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->headPos,
+ &this->headRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_290.x, this->unk_290.y, this->unk_290.z, MTXMODE_NEW);
+ Matrix_Translate(this->headPos.x, this->headPos.y, this->headPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2A8.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2A8.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2A8.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
- case 10:
- SubS_UpdateLimb(this->unk_3B4 + 0x4000, this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_29C,
- &this->unk_2AE, stepRot, overrideRot);
+ case GORON_LIMB_BODY:
+ SubS_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->bodyPos,
+ &this->bodyRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_29C.x, this->unk_29C.y, this->unk_29C.z, MTXMODE_NEW);
+ Matrix_Translate(this->bodyPos.x, this->bodyPos.y, this->bodyPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2AE.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2AE.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2AE.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->bodyRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->bodyRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->bodyRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
+
+ default:
+ break;
}
}
-void func_80A15FEC(Actor* thisx, PlayState* play) {
- static TexturePtr D_80A1670C[] = {
+void EnGo_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
gGoronEyeOpenTex, gGoronEyeHalfTex, gGoronEyeClosedTex, gGoronEyeHalfTex, gGoronEyeClosed2Tex,
};
EnGo* this = THIS;
- if (!(this->unk_390 & 0x300)) {
+ if (!(this->actionFlags & (ENGO_FLAG_SNOWBALLED | ENGO_FLAG_ROLLED_UP))) {
OPEN_DISPS(play->state.gfxCtx);
Gfx_SetupDL25_Opa(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A1670C[this->unk_3BE]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
- if (this->unk_3DC == 14) {
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
Matrix_Translate(0.0f, 0.0f, -4000.0f, MTXMODE_APPLY);
}
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
@@ -2083,8 +2674,8 @@ void func_80A15FEC(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
} else {
- func_80A15B80(this, play);
+ EnGo_Draw_NoSkeleton(this, play);
}
- func_80A137C0(this, play, this->unk_39C, this->unk_3A0);
- func_80A1213C(this, play);
+ EnGo_DrawIceBlockWhenFrozen(this, play, this->iceBlockScale, this->iceBlockAlpha);
+ EnGo_DrawEffects(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.h b/src/overlays/actors/ovl_En_Go/z_en_go.h
index 9d12dfdce..a1c96214b 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.h
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.h
@@ -2,103 +2,141 @@
#define Z_EN_GO_H
#include "global.h"
+#include "objects/object_oF1d_map/object_oF1d_map.h"
struct EnGo;
typedef void (*EnGoActionFunc)(struct EnGo*, PlayState*);
+typedef s32 (*MsgEventFunc)(Actor*, PlayState*);
-#define ENGO_GET_F(thisx) (((thisx)->params & 0xF) & 0xFF)
-#define ENGO_GET_70(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
-#define ENGO_GET_7F80(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+#define ENGO_GET_TYPE(thisx) (((thisx)->params & 0xF) & 0xFF)
+#define ENGO_GET_SUBTYPE(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
-enum {
+#define ENGO_GET_PATH(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+
+#define ENGO_SNOW_EFFECT_COUNT 16
+#define ENGO_OTHER_EFFECT_COUNT 16
+#define ENGO_EFFECT_COUNT (ENGO_SNOW_EFFECT_COUNT + ENGO_OTHER_EFFECT_COUNT)
+
+/**
+ * Struct to track the state of various visual effects.
+ *
+ * A Goron's 'effectTable' is comprised of a number of these effects, which depending on the context in which they are
+ * used, take on the form of snow, dust, or steam. The functions using these objects have an expectation that they are
+ * iterating through the full effectTable, or half of the effectTable. See individual functions containing 'EnGoEffect*'
+ * parameters for more details.
+ */
+typedef struct EnGoEffect {
+ /* 0x00 */ u8 type;
+ /* 0x01 */ u8 alphaDenom;
+ /* 0x02 */ u8 alphaNumer;
+ /* 0x04 */ Vec3s rotVelocity;
+ /* 0x0A */ Vec3s rotAngle;
+ /* 0x10 */ Vec3f pos;
+ /* 0x1C */ Vec3f accel;
+ /* 0x28 */ Vec3f velocity;
+ /* 0x34 */ f32 scaleXY;
+ /* 0x38 */ f32 scaleXYDelta;
+} EnGoEffect; // size = 0x3C;
+
+/**
+ * Goron Type, identified by bits [3..0] of the actor's params
+ *
+ * - The ENGO_ATHLETIC and ENGO_SPECTATOR types share the same subtype domain (EnGoRacetrackSubtype: [0,7])
+ * - ENGO_GRAVEYARD types have their own subtype domain (EnGoGraveyardSubtype: [0,1])
+ * - Others have no subtypes.
+ */
+typedef enum EnGoType {
/* 0 */ ENGO_F_0,
- /* 1 */ ENGO_F_1,
- /* 2 */ ENGO_F_2,
- /* 3 */ ENGO_F_3,
- /* 4 */ ENGO_F_4,
- /* 5 */ ENGO_F_5,
- /* 6 */ ENGO_F_6,
- /* 7 */ ENGO_F_7,
- /* 8 */ ENGO_F_8,
-};
+ /* 1 */ ENGO_ATHLETIC, // Racers stretching before the race
+ /* 2 */ ENGO_SPECTATOR, // Spectators to the race
+ /* 3 */ ENGO_GATEKEEPER, // Gatekeeper to the Goron Shrine
+ /* 4 */ ENGO_GRAVEYARD, // Gravemaker and other
+ /* 5 */ ENGO_ASIDE_STORE, // Shrine Goron outside store
+ /* 6 */ ENGO_ASIDE_ELDERSROOM, // Shrine Goron outside Elder's room
+ /* 7 */ ENGO_ASIDE_ELDERSSON, // Shrine Goron aside the Elder's Son
+ /* 8 */ ENGO_MEDIGORON, // Medigoron selling Powder Kegs
+} EnGoType;
-enum {
- /* 0 */ ENGO_70_0,
- /* 1 */ ENGO_70_1,
- /* 2 */ ENGO_70_2,
- /* 3 */ ENGO_70_3,
- /* 4 */ ENGO_70_4,
- /* 5 */ ENGO_70_5,
-};
+/**
+ * Subtype for Gorons at the racetrack (ENGO_ATHLETIC and ENGO_SPECTATOR)
+ */
+typedef enum EnGoRacetrackSubtype {
+ /* 0 */ ENGO_ATHLETIC_A,
+ /* 1 */ ENGO_ATHLETIC_B,
+ /* 2 */ ENGO_ATHLETIC_C,
+ /* 3 */ ENGO_ATHLETIC_D,
+ /* 4 */ ENGO_ATHLETIC_HAMSTRINGSIT,
+ /* 5 */ ENGO_ATHLETIC_HAMSTRINGSTAND,
+ /* 6 */ ENGO_SPECTATOR_CHEER,
+ /* 7 */ ENGO_SPECTATOR_SHOUTING,
+} EnGoRacetrackSubtype;
-typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
- /* 0x02 */ u8 unk_02;
- /* 0x04 */ Vec3s unk_04;
- /* 0x0A */ Vec3s unk_0A;
- /* 0x10 */ Vec3f unk_10;
- /* 0x1C */ Vec3f unk_1C;
- /* 0x28 */ Vec3f unk_28;
- /* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38;
-} EnGoStruct; // size = 0x3C;
+/**
+ * Subtype for Gorons outside the Goron Graveyard (ENGO_GRAVEYARD)
+ */
+typedef enum EnGoGraveyardSubtype {
+ /* 0 */ ENGO_GRAVEYARD_GRAVEMAKER,
+ /* 1 */ ENGO_GRAVEYARD_FROZEN,
+} EnGoGraveyardSubtype;
typedef struct EnGo {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnGoActionFunc actionFunc;
- /* 0x18C */ EnGoActionFunc unk_18C;
- /* 0x190 */ EnGoActionFunc unk_190;
+ /* 0x18C */ EnGoActionFunc interruptedActionFunc;
+ /* 0x190 */ EnGoActionFunc graveyardDialogActionFunc;
/* 0x194 */ ColliderCylinder colliderCylinder;
- /* 0x1E0 */ UNK_TYPE1 unk1E0[0x4C];
+ /* 0x1E0 */ ColliderCylinder unusedCylinder;
/* 0x22C */ ColliderSphere colliderSphere;
- /* 0x284 */ Path* unk_284;
- /* 0x288 */ s8 unk_288;
- /* 0x289 */ s8 unk_289;
- /* 0x28C */ s32 unk_28C;
- /* 0x290 */ Vec3f unk_290;
- /* 0x29C */ Vec3f unk_29C;
- /* 0x2A8 */ Vec3s unk_2A8;
- /* 0x2AE */ Vec3s unk_2AE;
- /* 0x2B4 */ Vec3s jointTable[18];
- /* 0x320 */ Vec3s morphTable[18];
- /* 0x38C */ Actor* unk_38C;
- /* 0x390 */ u16 unk_390;
- /* 0x392 */ u16 unk_392;
- /* 0x394 */ u8 cueId;
- /* 0x398 */ f32 unk_398;
- /* 0x39C */ f32 unk_39C;
- /* 0x3A0 */ f32 unk_3A0;
- /* 0x3A4 */ f32 unk_3A4;
- /* 0x3A8 */ f32 unk_3A8;
+ /* 0x284 */ Path* gatekeeperPath;
+ /* 0x288 */ s8 taisouObjIndex;
+ /* 0x289 */ s8 hakuginDemoObjIndex;
+ /* 0x28C */ s32 msgScriptResumePos;
+ /* 0x290 */ Vec3f headPos;
+ /* 0x29C */ Vec3f bodyPos;
+ /* 0x2A8 */ Vec3s headRot;
+ /* 0x2AE */ Vec3s bodyRot;
+ /* 0x2B4 */ Vec3s jointTable[GORON_LIMB_MAX];
+ /* 0x320 */ Vec3s morphTable[GORON_LIMB_MAX];
+ /* 0x38C */ Actor* attentionTarget;
+ /* 0x390 */ u16 actionFlags;
+ /* 0x392 */ u16 lastTextId;
+ /* 0x394 */ u8 springArrivalCueId;
+ /* 0x398 */ f32 curAnimPlaySpeed;
+ /* 0x39C */ f32 iceBlockScale;
+ /* 0x3A0 */ f32 iceBlockAlpha;
+ /* 0x3A4 */ f32 scaleFactor;
+ /* 0x3A8 */ f32 scaleFactorPoundDistortion;
/* 0x3AC */ UNK_TYPE1 unk3AC[0x2];
- /* 0x3AE */ s16 unk_3AE;
- /* 0x3B0 */ s16 unk_3B0;
- /* 0x3B2 */ s16 unk_3B2;
- /* 0x3B4 */ s16 unk_3B4;
- /* 0x3B6 */ s16 unk_3B6;
+ /* 0x3AE */ union {
+ s16 snorePhase; // Used whilst a Goron is sleeping, +0x400 at a time
+ s16 elapsedHangtime; // Hangtime at the top of a pound.
+ };
+ /* 0x3B0 */ s16 headRotZ;
+ /* 0x3B2 */ s16 headRotY;
+ /* 0x3B4 */ s16 bodyRotZ;
+ /* 0x3B6 */ s16 bodyRotY;
/* 0x3B8 */ s16 csId;
- /* 0x3BA */ s16 unk_3BA;
- /* 0x3BC */ s16 unk_3BC;
- /* 0x3BE */ s16 unk_3BE;
- /* 0x3C0 */ s16 unk_3C0;
- /* 0x3C2 */ s16 unk_3C2;
- /* 0x3C4 */ s16 unk_3C4;
- /* 0x3C6 */ s16 unk_3C6;
- /* 0x3C8 */ s16 unk_3C8[3];
- /* 0x3CE */ s16 unk_3CE[3];
- /* 0x3D4 */ s16 unk_3D4;
- /* 0x3D8 */ void* unk_3D8;
- /* 0x3DC */ s32 unk_3DC;
+ /* 0x3BA */ s16 loseAttentionTimer;
+ /* 0x3BC */ s16 blinkTimer;
+ /* 0x3BE */ s16 eyeTexIndex;
+ /* 0x3C0 */ s16 cutsceneState;
+ /* 0x3C2 */ s16 cutsceneDelayTimer;
+ /* 0x3C4 */ s16 gatekeeperAnimState;
+ /* 0x3C6 */ s16 harmlessTimer;
+ /* 0x3C8 */ s16 limbRotTableZ[3];
+ /* 0x3CE */ s16 limbRotTableY[3];
+ /* 0x3D4 */ s16 surprisePhase;
+ /* 0x3D8 */ MsgEventFunc msgEventFunc;
+ /* 0x3DC */ s32 curAnimIndex;
/* 0x3E0 */ UNK_TYPE1 unk3E0[0x4];
- /* 0x3E4 */ s32 unk_3E4;
- /* 0x3E8 */ s32 unk_3E8;
- /* 0x3EC */ s32 unk_3EC;
- /* 0x3F0 */ s32 unk_3F0;
- /* 0x3F4 */ s32 unk_3F4;
- /* 0x3F8 */ EnGoStruct unk_3F8[32];
+ /* 0x3E4 */ s32 indexPathPoint;
+ /* 0x3E8 */ s32 indexEffect;
+ /* 0x3EC */ s32 sleepState;
+ /* 0x3F0 */ s32 springArrivalCutsceneActive;
+ /* 0x3F4 */ s32 changedText;
+ /* 0x3F8 */ EnGoEffect effectTable[ENGO_EFFECT_COUNT];
} EnGo; // size = 0xB78
#endif // Z_EN_GO_H
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
index e4d37016a..6245c82dc 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse.h"
+#include "z64horse.h"
#include "z64rumble.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "overlays/actors/ovl_Obj_Um/z_obj_um.h"
@@ -278,8 +279,8 @@ void EnHorse_RaceWaypointPos(RaceWaypoint* waypoints, s32 idx, Vec3f* pos) {
pos->z = waypoints[idx].z;
}
-void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnAmount) {
- func_800F415C(&this->actor, pos, turnAmount);
+void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnYaw) {
+ Horse_RotateToPoint(&this->actor, pos, turnYaw);
}
void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) {
@@ -582,15 +583,15 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) {
f32 minDist = 1.0e+38;
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
- s32 pathIdx = func_800F3940(play);
+ s32 pathIndex = Horse_GetJumpingFencePathIndex(play);
s32 pathCount;
Vec3s* pathPoints;
- if (pathIdx == -1) {
+ if (pathIndex == -1) {
return false;
}
- path = &play->setupPathList[pathIdx];
+ path = &play->setupPathList[pathIndex];
pathCount = path->count;
pathPoints = Lib_SegmentedToVirtual(path->points);
@@ -691,7 +692,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
EnHorse_ClearDustFlags(&this->dustFlags);
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Skin_Setup(&this->skin);
this->riderPos = thisx->world.pos;
this->unk_52C = 0;
@@ -1874,8 +1875,8 @@ void EnHorse_InitInactive(EnHorse* this) {
}
void EnHorse_Inactive(EnHorse* this, PlayState* play) {
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -1954,8 +1955,8 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
this->actor.speed = 0.0f;
EnHorse_IdleAnimSounds(this, play);
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (!func_8087C38C(play, this, &this->actor.world.pos)) {
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
@@ -2050,7 +2051,7 @@ void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play) {
void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
f32 distToPlayer;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
if (((this->playerDir == PLAYER_DIR_BACK_R) || (this->playerDir == PLAYER_DIR_BACK_L)) && (distToPlayer > 300.0f) &&
@@ -2959,7 +2960,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
s32 animFinished;
s16 yaw;
- if ((D_801BDAA4 != 0) || (this->type == HORSE_TYPE_HNI)) {
+ if (gHorsePlayedEponasSong || (this->type == HORSE_TYPE_HNI)) {
EnHorse_StartIdleRidable(this);
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -3318,7 +3319,7 @@ void func_808848C8(EnHorse* this, PlayState* play) {
EnHorse_PlayWalkingSound(this);
this->actor.speed = 4.0f;
- func_800F415C(&this->actor, &sp24, 2000);
+ Horse_RotateToPoint(&this->actor, &sp24, 0x7D0);
this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
SkelAnime_Update(&this->skin.skelAnime);
if (Math3D_Distance(&sp24, &this->actor.world.pos) < 30.0f) {
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.h b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
index 9f8cd2063..0574b3198 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.h
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
@@ -112,7 +112,7 @@ typedef enum HorseType {
#define ENHORSE_IS_4000_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_4000)
#define ENHORSE_IS_DONKEY_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_DONKEY)
-typedef enum {
+typedef enum EnHorseParam {
/* 0 */ ENHORSE_0,
/* 1 */ ENHORSE_1,
/* 2 */ ENHORSE_2,
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
index d37fb8f23..c7a2edaaa 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_game_check.h"
+#include "z64horse.h"
#include "objects/object_horse_game_check/object_horse_game_check.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -168,9 +169,9 @@ s32 func_808F8EB0(EnHorseGameCheck* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
}
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 2);
play->transitionTrigger = TRANS_TRIGGER_START;
diff --git a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
index 10d4a6826..0217e8fa8 100644
--- a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
+++ b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_link_child.h"
+#include "z64horse.h"
#include "objects/object_horse_link_child/object_horse_link_child.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
@@ -417,7 +418,7 @@ void func_808DF560(EnHorseLinkChild* this) {
this->unk_148 = 1;
}
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, 0.0f);
}
@@ -425,8 +426,8 @@ void func_808DF560(EnHorseLinkChild* this) {
void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
s16 sp36;
- if (D_801BDAA4 != 0) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong) {
+ gHorsePlayedEponasSong = false;
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
func_808DF788(this);
return;
@@ -436,7 +437,7 @@ void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
sp36 = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
if ((Math_CosS(sp36) < 0.7071f) && (this->unk_148 == 2)) {
- func_800F415C(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
@@ -472,9 +473,9 @@ void func_808DF838(EnHorseLinkChild* this, PlayState* play) {
if ((this->unk_148 == 4) || (this->unk_148 == 3) || (this->unk_148 == 2)) {
if (this->unk_1E0 == 0) {
- func_800F415C(&this->actor, &player->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &player->actor.world.pos, 0x12C);
} else {
- func_800F415C(&this->actor, &this->actor.home.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &this->actor.home.pos, 0x12C);
}
}
diff --git a/src/overlays/actors/ovl_En_In/z_en_in.c b/src/overlays/actors/ovl_En_In/z_en_in.c
index 0e103de63..cbdc2ba19 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -5,6 +5,7 @@
*/
#include "z_en_in.h"
+#include "z64horse.h"
#include "objects/object_in/object_in.h"
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h"
@@ -150,7 +151,7 @@ s32 EnIn_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s16 frameCount;
s32 ret = false;
- if (animIndex >= 0 && animIndex < 18) {
+ if ((animIndex >= 0) && (animIndex < 18)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -1286,7 +1287,7 @@ void func_808F5A34(EnIn* this, PlayState* play) {
}
void func_808F5A94(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if (gSaveContext.save.day == 3) {
func_808F5728(play, this, 7, &this->unk48C);
} else {
@@ -1302,7 +1303,7 @@ void func_808F5A94(EnIn* this, PlayState* play) {
}
void func_808F5B58(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) {
if (gSaveContext.save.day == 3) {
@@ -1394,7 +1395,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->unk4AC |= 2;
func_808F35AC(this, play);
this->unk23C = 0;
- D_801BDAA0 = 0;
+ D_801BDAA0 = false;
if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_6);
diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
index 202ed6637..da813182e 100644
--- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
+++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
@@ -685,7 +685,7 @@ void func_8095F180(EnIshi* this) {
}
void func_8095F194(EnIshi* this, PlayState* play) {
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
Actor_Kill(&this->actor);
} else if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
Actor_Kill(&this->actor);
diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
index 07e4990bf..ee6e28de2 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
@@ -1531,7 +1531,7 @@ void func_80B88D6C(EnKaizoku* this, PlayState* play) {
temp_ft4 = this->skelAnime.curFrame - this->skelAnime.playSpeed;
temp_ft5 = this->skelAnime.curFrame + this->skelAnime.playSpeed;
if (this->skelAnime.curFrame != 0.0f) {
- if (((temp_ft4 < 0 && temp_ft5 > 0) || (temp_ft4 < 5 && temp_ft5 > 5))) {
+ if ((((temp_ft4 < 0) && (temp_ft5 > 0)) || ((temp_ft4 < 5) && (temp_ft5 > 5)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
index 7d54f3ed3..73de78707 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -348,8 +348,8 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
}
if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
Actor_GetScreenPos(play, &this->picto.actor, &x, &y);
- if (this->picto.actor.projectedPos.z > -20.0f && x > 0 && x < SCREEN_WIDTH && y > 0 && y < SCREEN_HEIGHT &&
- this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
+ if ((this->picto.actor.projectedPos.z > -20.0f) && (x > 0) && (x < SCREEN_WIDTH) && (y > 0) &&
+ (y < SCREEN_HEIGHT) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) {
// faster shaking
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
this->skelanime.playSpeed = 2.0f;
diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
index 804854f53..e1d9df24c 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -198,20 +198,16 @@ void func_80954BE8(EnKanban* this, PlayState* play) {
}
}
-#ifdef NON_MATCHING
-// Lots of branch likely stuff
void EnKanban_Update(Actor* thisx, PlayState* play) {
- // PlayState* play = play2;
u8 bounced = false;
- s32 pad;
EnKanban* this = THIS;
+ s32 pad;
+ FloorType floorType;
+ f32 phi_f0;
Player* player = GET_PLAYER(play);
Vec3f offset;
EnKanban* piece;
EnKanban* signpost;
- FloorType floorType;
- f32 phi_f0;
- s32 pad2;
this->frameCount++;
@@ -423,8 +419,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
f32 tempY;
f32 tempZ;
f32 tempWaterDepth;
+ s32 pad2;
u16 bgCheckFlags;
- u8 onGround;
if (this->unk_198 != 0) {
this->actor.velocity.y = -2.0f;
@@ -452,103 +448,103 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.bgCheckFlags = bgCheckFlags;
this->actor.depthInWater = tempWaterDepth;
- if (1) {}
+ if (1) {
+ u8 onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
- onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
-
- if (this->spinXFlag != 0) {
- this->spinRot.x += this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x <= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- } else {
- this->spinRot.x -= this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x >= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- }
-
- if (this->spinVel.x < -0xC00) {
- this->spinVel.x = -0xC00;
- }
-
- if (this->spinZFlag != 0) {
- this->spinRot.z += this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z <= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- } else {
- this->spinRot.z -= this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z >= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- }
-
- if (this->spinVel.z < -0xC00) {
- this->spinVel.z = -0xC00;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- }
- this->actor.speed *= -0.5f;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
- this->actionState = ENKANBAN_WATER;
- Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
- this->bounceX = this->bounceZ = 0;
- this->actor.world.pos.y += this->actor.depthInWater;
- EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
- this->actor.velocity.y = 0.0f;
- this->actor.gravity = 0.0f;
- break;
- }
-
- if (onGround) {
- floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
-
- if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
- this->unk_197 = 1;
- } else if (floorType == FLOOR_TYPE_5) {
- this->unk_197 = -1;
- }
-
- if (this->bounceCount <= 0) {
- this->bounceCount++;
- if (this->unk_197 != 0) {
- this->actor.velocity.y = 0.0f;
- } else {
- this->actor.velocity.y *= -0.3f;
- this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x4000);
+ if (this->spinXFlag != 0) {
+ this->spinRot.x += this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x <= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
}
- bounced = true;
} else {
- this->actor.velocity.y = 0.0f;
+ this->spinRot.x -= this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x >= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
+ }
}
- if (this->unk_197 != 0) {
- if (this->unk_197 > 0) {
- this->actor.speed = 0.0f;
- } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
- this->airTimer = 10;
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- this->actionState = ENKANBAN_GROUND;
- this->actor.speed = 0.0f;
- goto nextCase;
+ if (this->spinVel.x < -0xC00) {
+ this->spinVel.x = -0xC00;
+ }
+
+ if (this->spinZFlag != 0) {
+ this->spinRot.z += this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z <= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ } else {
+ this->spinRot.z -= this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z >= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ }
+
+ if (this->spinVel.z < -0xC00) {
+ this->spinVel.z = -0xC00;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
+ }
+ this->actor.speed *= -0.5f;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ this->actionState = ENKANBAN_WATER;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
+ this->bounceX = this->bounceZ = 0;
+ this->actor.world.pos.y += this->actor.depthInWater;
+ EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ break;
+ }
+
+ if (onGround) {
+ floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+
+ if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
+ this->unk_197 = 1;
+ } else if (floorType == FLOOR_TYPE_5) {
+ this->unk_197 = -1;
+ }
+
+ if (this->bounceCount <= 0) {
+ this->bounceCount++;
+ if (this->unk_197 != 0) {
+ this->actor.velocity.y = 0.0f;
} else {
- Vec3f spC8;
+ this->actor.velocity.y *= -0.3f;
+ this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x4000);
+ }
+ bounced = true;
+ } else {
+ this->actor.velocity.y = 0.0f;
+ }
+
+ if (this->unk_197 != 0) {
+ Vec3f spC8;
+
+ if (this->unk_197 > 0) {
+ this->actor.speed = 0.0f;
+ } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
+ this->airTimer = 10;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actionState = ENKANBAN_GROUND;
+ this->actor.speed = 0.0f;
+ goto nextCase;
+ }
Matrix_RotateXFNew(this->floorRot.x);
Matrix_RotateZF(this->floorRot.z, MTXMODE_APPLY);
@@ -558,67 +554,67 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.world.rot.y = Math_Atan2S(spC8.x, spC8.z);
this->unk_198 = 1;
this->actor.speed = sqrtf(SQXZ(this->actor.velocity));
+ } else {
+ this->unk_198 = 0;
+ Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
}
} else {
- this->unk_198 = 0;
- Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
+ this->actor.speed *= 0.7f;
}
+
+ if (this->spinRot.x == 0) {
+ if (this->bounceX != 0) {
+ bounced = true;
+ if (this->unk_197 != 0) {
+ this->spinRot.x = 0;
+ this->bounceX = 0;
+ } else {
+ this->spinVel.x = this->bounceX << 9;
+ if (this->bounceX != 0) {
+ this->bounceX -= 5;
+ if (this->bounceX <= 0) {
+ this->bounceX = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinXFlag = 1;
+ } else {
+ this->spinXFlag = 0;
+ }
+ }
+ }
+ }
+
+ if (this->spinRot.z == 0) {
+ if (this->bounceZ != 0) {
+ bounced = 1;
+ if (this->unk_197 != 0) {
+ this->spinRot.z = 0;
+ this->bounceZ = 0;
+ } else {
+ this->spinVel.z = this->bounceZ << 9;
+ if (this->bounceZ != 0) {
+ this->bounceZ -= 5;
+ if (this->bounceZ <= 0) {
+ this->bounceZ = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinZFlag = 1;
+ } else {
+ this->spinZFlag = 0;
+ }
+ }
+ }
+ }
+
+ Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
} else {
- this->actor.speed *= 0.7f;
+ this->actor.shape.rot.y += this->spinVel.y;
+ this->actor.shape.rot.x += this->direction * 0x7D0;
}
-
- if (this->spinRot.x == 0) {
- if (this->bounceX != 0) {
- bounced = true;
- if (this->unk_197 != 0) {
- this->spinRot.x = 0;
- this->bounceX = 0;
- } else {
- this->spinVel.x = this->bounceX << 9;
- if (this->bounceX != 0) {
- this->bounceX -= 5;
- if (this->bounceX <= 0) {
- this->bounceX = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinXFlag = 1;
- } else {
- this->spinXFlag = 0;
- }
- }
- }
- }
-
- if (this->spinRot.z == 0) {
- if (this->bounceZ != 0) {
- bounced = 1;
- if (this->unk_197 != 0) {
- this->spinRot.z = 0;
- this->bounceZ = 0;
- } else {
- this->spinVel.z = this->bounceZ << 9;
- if (this->bounceZ != 0) {
- this->bounceZ -= 5;
- if (this->bounceZ <= 0) {
- this->bounceZ = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinZFlag = 1;
- } else {
- this->spinZFlag = 0;
- }
- }
- }
- }
-
- Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
- } else {
- this->actor.shape.rot.y += this->spinVel.y;
- this->actor.shape.rot.x += this->direction * 0x7D0;
}
if (bounced) {
@@ -630,15 +626,16 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
if (bounced && (this->unk_197 >= 0)) {
+ static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
+ static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
s16 dustCount;
s16 j;
Vec3f velocity = { 0.0f, 0.0f, 0.0f };
- static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
- static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
Vec3f accel;
Vec3f pos;
Color_RGBA8 primColor;
Color_RGBA8 envColor;
+ s32 pad3;
if (this->unk_197 != 0) {
primColor = D_8095754C;
@@ -667,10 +664,10 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actionState = ENKANBAN_GROUND;
}
}
-
+ nextCase:
+ // fallthrough
case ENKANBAN_GROUND:
case ENKANBAN_WATER:
- nextCase:
signpost = (EnKanban*)this->actor.parent;
if (signpost->partFlags == 0xFFFF) {
@@ -839,6 +836,9 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
}
break;
+
+ default:
+ break;
}
break;
@@ -883,14 +883,11 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
break;
}
+
+ default:
+ break;
}
}
-#else
-static Vec3f D_8095753C = { 0.0f, 0.0f, 0.0f };
-static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
-static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kanban/EnKanban_Update.s")
-#endif
static Gfx* sDisplayLists[] = {
object_kanban_DL_000CB0, object_kanban_DL_000DB8, object_kanban_DL_000E78, object_kanban_DL_000F38,
diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
index f400d157f..5d7a5fd5b 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -4,7 +4,6 @@
* Description: Keaton grass
*/
-#include "prevent_bss_reordering.h"
#include "z_en_kusa2.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/gameplay_keep/gameplay_keep.h"
diff --git a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
index 02f77693d..fd7795f7c 100644
--- a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
+++ b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
@@ -316,7 +316,7 @@ void func_80AEA128(EnLiftNuts* this, PlayState* play) {
}
void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
- if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && this->unk_34E == 1) {
+ if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && (this->unk_34E == 1)) {
this->actor.flags |= ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer > 120.0f) {
func_80AE9FC8(this);
@@ -326,7 +326,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
if (func_80AE9B4C(0, 0)) {
switch (CURRENT_DAY) {
case 1:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10)) {
@@ -339,7 +340,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 2:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else {
@@ -360,7 +362,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 3:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_40)) {
@@ -383,7 +386,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Flags_UnsetSwitch(play, 0x40);
Inventory_SaveDekuPlaygroundHighScore(4);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) &&
- CURRENT_DAY == 3) {
+ (CURRENT_DAY == 3)) {
this->unk_354 = 0;
Message_StartTextbox(play, 0x27F4, &this->actor);
this->textId = 0x27F4;
@@ -394,7 +397,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
} else {
if (((void)0, gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2]) >=
gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < 0x2EE0) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < SECONDS_TO_TIMER(120)) {
Message_StartTextbox(play, 0x27F9, &this->actor);
this->textId = 0x27F9;
} else {
@@ -428,6 +431,9 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
}
} else {
@@ -435,7 +441,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
this->textId = 0x27D8;
}
func_80AEABF0(this);
- } else if (func_80AE9AC4(this, 0) || this->unk_34E == 1) {
+ } else if (func_80AE9AC4(this, 0) || (this->unk_34E == 1)) {
if (this->unk_34E == 1) {
func_800B8614(&this->actor, play, 200.0f);
} else if (this->actor.playerHeightRel >= -13.0f) {
@@ -533,6 +539,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
break;
@@ -589,6 +598,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27ED, &this->actor);
this->textId = 0x27ED;
break;
+
+ default:
+ break;
}
}
}
@@ -644,6 +656,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x2000, 0x500);
@@ -668,6 +683,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
this->unk_354++;
}
break;
+
+ default:
+ break;
}
}
func_80AEB974(this);
@@ -759,7 +777,7 @@ void func_80AEB1C8(EnLiftNuts* this) {
void func_80AEB230(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > 0) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > SECONDS_TO_TIMER(0)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
func_80AEB280(this);
}
@@ -773,8 +791,8 @@ void func_80AEB294(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (player->actor.floorBgId == BG_ACTOR_MAX) &&
- player->actor.world.pos.y < 20.0f) ||
- gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= 0x2EE0) {
+ (player->actor.world.pos.y < 20.0f)) ||
+ (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= SECONDS_TO_TIMER(120))) {
player->stateFlags1 |= PLAYER_STATE1_20;
Flags_SetSwitch(play, 0x41);
func_80AEB3E0(this, play);
@@ -986,9 +1004,9 @@ void EnLiftNuts_Update(Actor* thisx, PlayState* play) {
s32 EnLiftNuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnLiftNuts* this = THIS;
- if (limbIndex == OBJECT_DNT_LIMB_0F || limbIndex == OBJECT_DNT_LIMB_10 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_17 || limbIndex == OBJECT_DNT_LIMB_18 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_1B) {
+ if ((limbIndex == OBJECT_DNT_LIMB_0F) || (limbIndex == OBJECT_DNT_LIMB_10) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_17) || (limbIndex == OBJECT_DNT_LIMB_18) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_1B)) {
*dList = NULL;
}
diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
index d76ed870f..737161825 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -198,7 +198,7 @@ void EnOssan_SetupAction(EnOssan* this, EnOssanActionFunc action) {
s32 EnOssan_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -210,7 +210,7 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
switch (gSaveContext.save.day) {
case 1:
case 2:
- if (gSaveContext.save.time <= CLOCK_TIME(21, 30) && gSaveContext.save.time > CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.time <= CLOCK_TIME(21, 30)) && (gSaveContext.save.time > CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
@@ -218,16 +218,20 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
Actor_Kill(&this->actor);
}
break;
+
case 3:
if (this->actor.params == ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
- if (!(gSaveContext.save.time <= CLOCK_TIME(22, 00) && gSaveContext.save.time >= CLOCK_TIME(6, 00))) {
+ if ((gSaveContext.save.time > CLOCK_TIME(22, 00)) || (gSaveContext.save.time < CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
}
break;
+
+ default:
+ break;
}
}
@@ -377,9 +381,9 @@ void EnOssan_Idle(EnOssan* this, PlayState* play) {
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
}
} else {
- if (this->actor.xzDistToPlayer < 100.0f &&
- (player->actor.world.pos.x >= -40.0f && player->actor.world.pos.x <= 40.0f) &&
- (player->actor.world.pos.z >= -91.0f && player->actor.world.pos.z <= -60.0f)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && (player->actor.world.pos.x >= -40.0f) &&
+ (player->actor.world.pos.x <= 40.0f) && (player->actor.world.pos.z >= -91.0f) &&
+ (player->actor.world.pos.z <= -60.0f)) {
func_800B8614(&this->actor, play, 100.0f);
}
if (this->actor.params == ENOSSAN_PART_TIME_WORKER) {
@@ -411,11 +415,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_FORWARD;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_FORWARD);
break;
+
case FSN_ANIM_TURN_AROUND_FORWARD:
EnOssan_SetHaveMet(this);
this->textId = EnOssan_CuriosityShopMan_GetWelcome(this, play);
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, this->animIndex);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_START:
case FSN_ANIM_HAND_ON_FACE_START:
case FSN_ANIM_LEAN_FORWARD_START:
@@ -425,6 +431,7 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, false);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_LOOP:
case FSN_ANIM_HAND_ON_FACE_LOOP:
case FSN_ANIM_LEAN_FORWARD_LOOP:
@@ -432,11 +439,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_REVERSE;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_REVERSE);
break;
+
case FSN_ANIM_TURN_AROUND_REVERSE:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
EnOssan_SetupAction(this, EnOssan_Idle);
break;
+
default:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
@@ -459,11 +468,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
this->moveHorizontal = this->moveVertical = false;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
this->moveHorizontal = true;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -477,11 +486,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
this->moveVertical = true;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -533,9 +542,9 @@ u8 EnOssan_SetCursorIndexFromNeutral(EnOssan* this, u8 shelfOffset) {
u8 EnOssan_CursorRight(EnOssan* this, u8 cursorIndex, u8 shelfSlotMin) {
u8 end = shelfSlotMin + 4;
- while (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ while ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
cursorIndex -= 2;
- if (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ if ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
if (this->items[cursorIndex] != NULL) {
return cursorIndex;
}
@@ -607,12 +616,15 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, PlayState* play) {
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
return true;
+
case 1:
func_8019F230();
EnOssan_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
@@ -656,7 +668,7 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
return;
}
}
- if (this->actor.params == ENOSSAN_PART_TIME_WORKER && player->transformation != PLAYER_FORM_ZORA) {
+ if ((this->actor.params == ENOSSAN_PART_TIME_WORKER) && (player->transformation != PLAYER_FORM_ZORA)) {
Math_SmoothStepToS(&this->partTimerHeadRot.y, 8000, 3, 2000, 0);
}
}
@@ -871,7 +883,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -879,7 +891,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ } else if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 8);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -929,7 +941,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -937,7 +949,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ } else if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -1016,6 +1028,7 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -1024,27 +1037,35 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
case CANBUY_RESULT_NO_ROOM_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sCannotGetNowTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
+ default:
+ break;
}
}
@@ -1058,11 +1079,15 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
case 0:
EnOssan_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
break;
+
+ default:
+ break;
}
}
}
@@ -1134,6 +1159,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
EnOssan_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
@@ -1142,7 +1168,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
}
}
}
- } else if (talkState == TEXT_STATE_5 && Message_ShouldAdvance(play)) {
+ } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
EnOssan_ResetItemPosition(this);
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
@@ -1241,11 +1267,11 @@ void EnOssan_UpdateItemSelectedProperty(EnOssan* this) {
for (i = 0; i < ARRAY_COUNT(this->items); i++, items++) {
item = *items;
if (item != NULL) {
- if (this->actionFunc != EnOssan_SelectItem && this->actionFunc != EnOssan_CannotBuy &&
- this->drawCursor == 0) {
+ if ((this->actionFunc != EnOssan_SelectItem) && (this->actionFunc != EnOssan_CannotBuy) &&
+ (this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIndex == i ? true : false;
+ item->isSelected = (this->cursorIndex == i) ? true : false;
}
}
}
@@ -1383,6 +1409,7 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
this->animIndex = FSN_ANIM_SLAM_COUNTER_START;
@@ -1390,21 +1417,25 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
return sWelcomeDekuTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_ZORA:
this->animIndex = FSN_ANIM_LEAN_FORWARD_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_08)) {
return sWelcomeZoraTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_GORON:
this->animIndex = FSN_ANIM_HAND_ON_FACE_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_04)) {
return sWelcomeGoronTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
+ default:
+ this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
+ return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
- this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
- return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
@@ -1415,24 +1446,29 @@ u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_10)) {
return sWelcomeDekuTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_ZORA:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_08)) {
return sWelcomeZoraTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_GORON:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_04)) {
return sWelcomeGoronTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
+ default:
+ return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
- return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
void EnOssan_SetHaveMet(EnOssan* this) {
@@ -1440,21 +1476,29 @@ void EnOssan_SetHaveMet(EnOssan* this) {
case 0x06A9:
SET_WEEKEVENTREG(WEEKEVENTREG_18_10);
break;
+
case 0x06C6:
SET_WEEKEVENTREG(WEEKEVENTREG_55_10);
break;
+
case 0x06A7:
SET_WEEKEVENTREG(WEEKEVENTREG_18_08);
break;
+
case 0x06C4:
SET_WEEKEVENTREG(WEEKEVENTREG_55_08);
break;
+
case 0x06A5:
SET_WEEKEVENTREG(WEEKEVENTREG_18_04);
break;
+
case 0x06C2:
SET_WEEKEVENTREG(WEEKEVENTREG_55_04);
break;
+
+ default:
+ break;
}
}
@@ -1698,7 +1742,8 @@ s32 EnOssan_PartTimer_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
void EnOssan_CuriosityShopMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnOssan* this = THIS;
- if (limbIndex == FSN_LIMB_PELVIS || limbIndex == FSN_LIMB_LEFT_UPPER_ARM || limbIndex == FSN_LIMB_RIGHT_UPPER_ARM) {
+ if ((limbIndex == FSN_LIMB_PELVIS) || (limbIndex == FSN_LIMB_LEFT_UPPER_ARM) ||
+ (limbIndex == FSN_LIMB_RIGHT_UPPER_ARM)) {
rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
}
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
index 1e1a36d74..df6d3708f 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -671,6 +671,9 @@ void func_80B5CD40(EnOt* this, PlayState* play) {
func_80B5CE6C(this, play);
}
break;
+
+ default:
+ break;
}
}
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
index b78c9a314..e64e09cbc 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -154,8 +154,6 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
func_80BD8588(this, play);
func_80BD8658(this);
- if (1) {}
-
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || (gSaveContext.save.entrance == ENTRANCE(IKANA_CANYON, 9))) {
Actor_Kill(&this->actor);
@@ -601,7 +599,6 @@ void func_80BD9938(EnPamera* this) {
void func_80BD994C(EnPamera* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
- if (1) {}
func_80BD93CC(this, 0, 1);
Message_StartTextbox(play, 0x15A8, &this->actor);
diff --git a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
index 27c3279e6..54fe2698d 100644
--- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
+++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
@@ -171,12 +171,12 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronStandingHandTappingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronSleepyAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
@@ -235,7 +235,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
switch (EN_S_GORO_GET_MAIN_TYPE(&this->actor)) {
case EN_S_GORO_TYPE_SHRINE_WINTER_A:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_02)) {
switch (this->textId) {
@@ -302,7 +302,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_B:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_40)) {
switch (this->textId) {
@@ -367,7 +367,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_C:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_37_02)) {
switch (this->textId) {
@@ -771,7 +771,7 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE1);
}
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_SUPPRESS_SNORE;
}
@@ -842,7 +842,7 @@ s32 EnSGoro_CheckGKBehavior(EnSGoro* this, PlayState* play) {
return false;
}
if ((!(this->actionFlags & EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED)) &&
- ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->animInfoIndex = EN_S_GORO_ANIM_ROLLUP;
@@ -1026,7 +1026,7 @@ void EnSGoro_SetupAction(EnSGoro* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->loadedObjIndex)) {
this->actionFlags = 0;
if (EN_S_GORO_OFTYPE_WSHRINE) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->actionFlags |= EN_S_GORO_ACTIONFLAG_EYESOPEN;
this->animInfoIndex = EN_S_GORO_ANIM_SHIVER_A;
diff --git a/src/overlays/actors/ovl_En_Sda/z_en_sda.c b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
index 3390f4f0c..909510329 100644
--- a/src/overlays/actors/ovl_En_Sda/z_en_sda.c
+++ b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
@@ -228,7 +228,8 @@ void func_8094702C(EnSda* this, u8* shadowTexture, Player* player, PlayState* pl
if (BREG(57) != 0) {
for (shadowTextureTemp = shadowTexture, i = 0; i < 0x1000; i++, shadowTextureTemp++) {
- if ((i >= 0 && i < 0x40) || (i >= 0xFC0 && i < 0x1000) || ((i & 0x3F) == 0) || ((i & 0x3F) == 0x3F)) {
+ if (((i >= 0) && (i < 0x40)) || ((i >= 0xFC0) && (i < 0x1000)) || ((i & 0x3F) == 0) ||
+ ((i & 0x3F) == 0x3F)) {
*shadowTextureTemp = 255;
} else {
*shadowTextureTemp = 0;
@@ -352,6 +353,4 @@ void func_80947668(u8* shadowTexture, Player* player, PlayState* play) {
}
CLOSE_DISPS(gfxCtx);
-
- if (1) {}
}
diff --git a/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
index cf829bda0..e67808d38 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -742,11 +742,11 @@ void func_809961E4(EnSkb* this, PlayState* play) {
}
void func_80996284(EnSkb* this, PlayState* play) {
- if (this->unk_3D8 & 0x80) {
- if (1) {}
- Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
- func_80996474(this);
+ if (!(this->unk_3D8 & 0x80)) {
+ return;
}
+ Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
+ func_80996474(this);
}
void func_809962D4(EnSkb* this) {
@@ -982,22 +982,22 @@ void func_8099672C(EnSkb* this, PlayState* play) {
}
void func_80996AD0(EnSkb* this, PlayState* play) {
- if (1) {}
+ if ((this->actionFunc == func_80996284) || (this->unk_3E2 == 1)) {
+ return;
+ }
- if ((this->actionFunc != func_80996284) && (this->unk_3E2 != 1)) {
- if (this->unk_3E4 != 0) {
- CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
- }
+ if (this->unk_3E4 != 0) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+ }
- if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
- (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
- ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
+ (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
+ ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
- if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
diff --git a/src/overlays/actors/ovl_En_Talk/z_en_talk.c b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
index 4f9b2a53d..7c639c44a 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.c
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
@@ -32,7 +32,7 @@ void EnTalk_Init(Actor* thisx, PlayState* play) {
EnTalk* this = THIS;
s8 targetMode = this->actor.home.rot.x - 0x1;
- if (targetMode >= 0 && targetMode < 7) {
+ if ((targetMode >= 0) && (targetMode < 7)) {
this->actor.targetMode = targetMode;
}
@@ -56,7 +56,7 @@ void func_80BDE090(EnTalk* this, PlayState* play) {
return;
}
- if ((this->actor.xzDistToPlayer < 40.0f && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
+ if (((this->actor.xzDistToPlayer < 40.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
this->actor.isTargeted) {
func_800B8614(&this->actor, play, 120.0f);
}
diff --git a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
index 4c2d3eaaf..495c16c13 100644
--- a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
+++ b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
@@ -390,26 +390,23 @@ void func_80BB5AAC(EnTanron1* this, PlayState* play) {
flag = 0;
ptr = ptrBase;
for (i = 0; i < this->actor.params; i++, ptr++) {
- if (ptr->unk_24 != 2) {
- continue;
+ if (ptr->unk_24 == 2) {
+ if (!flag) {
+ gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD,
+ G_TX_NOLOD);
+ flag++;
+ }
+
+ Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
+ Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
+ Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, ptr->unk_2C, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001900);
}
-
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
- gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
- G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD, G_TX_NOLOD);
- flag++;
- }
-
- Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
- Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
- Matrix_Scale(1.0f, ptr->unk_2C, 1.0f, MTXMODE_APPLY);
-
- if (1) {}
-
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001900);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
index 444142715..7de134218 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -4,6 +4,7 @@
* Description: Kafei
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test3.h"
#include "objects/object_test3/object_test3.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
index b2297ec7b..263e52e97 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
@@ -6,6 +6,7 @@
#include "prevent_bss_reordering.h"
#include "z_en_test4.h"
+#include "z64horse.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
@@ -410,9 +411,9 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if ((rideActor->type == HORSE_TYPE_EPONA) || (rideActor->type == HORSE_TYPE_2)) {
if (CURRENT_DAY < 3) {
- D_801BDA9C = 1;
+ gHorseIsMounted = true;
} else {
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
}
}
}
diff --git a/src/overlays/actors/ovl_En_Test7/z_en_test7.c b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
index fa378ec68..2606331e2 100644
--- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c
+++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
@@ -4,6 +4,7 @@
* Description: Soaring effects (wings, sphere, etc)
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test7.h"
#include "objects/gameplay_keep/gameplay_keep.h"
diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.c b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
index c1902a83a..f13be3cc3 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -126,7 +126,7 @@ void EnTrt_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animationInfo, s32 a
s32 EnTrt_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -274,10 +274,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -290,10 +290,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -351,10 +351,12 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_53_08);
Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
break;
+
case 0x888:
this->textId = 0x889;
Message_StartTextbox(play, this->textId, &this->actor);
break;
+
case 0x889:
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
CutsceneManager_Stop(this->csId);
@@ -364,6 +366,7 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_PayForMushroom;
break;
+
default:
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_EndInteraction(play, this);
@@ -389,10 +392,14 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
this->textId = 0x887;
Message_ContinueTextbox(play, this->textId);
break;
+
case 0x887:
case 0x88B:
EnTrt_EndInteraction(play, this);
break;
+
+ default:
+ break;
}
}
}
@@ -504,12 +511,15 @@ s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play) {
func_8019F208();
EnTrt_SetupTalkToShopkeeper(play, this);
return true;
+
case 1:
func_8019F230();
EnTrt_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
@@ -603,7 +613,7 @@ s32 EnTrt_HasPlayerSelectedItem(PlayState* play, EnTrt* this, Input* input) {
return true;
}
if (EnTrt_TestItemSelected(play)) {
- if (item->actor.params != SI_POTION_BLUE || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
+ if ((item->actor.params != SI_POTION_BLUE) || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
this->prevActionFunc = this->actionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemChoiceTextId(this));
play_sound(NA_SE_SY_DECIDE);
@@ -733,11 +743,15 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
case 0:
EnTrt_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
break;
+
+ default:
+ break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
@@ -904,19 +918,25 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_StartRedPotionConversation;
}
break;
+
case 0x83E:
Interface_SetAButtonDoAction(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
this->actionFunc = EnTrt_FaceShopkeeper;
break;
+
case 0x850:
case 0x890:
this->actionFunc = EnTrt_SetupEndInteraction;
break;
+
case 0x88F:
this->actionFunc = EnTrt_StartRedPotionConversation;
break;
+
+ default:
+ break;
}
}
}
@@ -1015,16 +1035,20 @@ void EnTrt_ItemGiven(EnTrt* this, PlayState* play) {
case 0x889:
this->textId = 0x88A;
break;
+
case 0x881:
this->textId = 0x88C;
break;
+
case 0x838:
case 0x83C:
case 0x88E:
case 0x88F:
this->textId = 0x83A;
break;
+
default:
+ //! FAKE:
if (1) {}
this->textId = 0x849;
break;
@@ -1048,8 +1072,8 @@ void EnTrt_ShopkeeperGone(EnTrt* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, this->textId, &this->actor);
} else {
- if ((player->actor.world.pos.x >= -50.0f && player->actor.world.pos.x <= 50.0f) &&
- (player->actor.world.pos.z >= -19.0f && player->actor.world.pos.z <= 30.0f)) {
+ if ((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= 50.0f) &&
+ (player->actor.world.pos.z >= -19.0f) && (player->actor.world.pos.z <= 30.0f)) {
func_800B8614(&this->actor, play, 200.0f);
}
}
@@ -1129,6 +1153,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
EnTrt_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
index a61e7e8df..06893449e 100644
--- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
+++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
@@ -149,8 +149,8 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
u8 playerForm;
s16 playerParams;
- if (play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON] >= 0 &&
- CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]) {
+ if ((play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON] >= 0) &&
+ (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]);
@@ -245,7 +245,6 @@ void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
func_801A4058(5);
- if (1) {}
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
index fb00fdae3..10be4ec3c 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
@@ -76,24 +76,26 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->unk158 = this->actor.world.rot.y;
EnWeatherTag_SetupAction(this, func_80966A08);
break;
+
case WEATHERTAG_TYPE_UNK1:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
EnWeatherTag_SetupAction(this, func_80966B08);
break;
+
case WEATHERTAG_TYPE_WINTERFOG:
EnWeatherTag_SetupAction(this, func_80966E0C);
break;
- case WEATHERTAG_TYPE_UNK3:
- //! FAKE: this can move to different locations and still match
- if (1) {}
+ case WEATHERTAG_TYPE_UNK3:
EnWeatherTag_SetupAction(this, func_80966EF0);
break;
+
case WEATHERTAG_TYPE_UNK4:
EnWeatherTag_SetupAction(this, func_80966FEC);
break;
+
case WEATHERTAG_TYPE_UNK5:
func_800BC154(play, &play->actorCtx, &this->actor, 7);
play->skyboxId = SKYBOX_3;
@@ -102,6 +104,7 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
D_801F4E74 = 1.0f;
EnWeatherTag_SetupAction(this, func_80966BF4);
break;
+
case WEATHERTAG_TYPE_WATERMURK:
pathID = WEATHER_TAG_PATHID(&this->actor);
path = &play->setupPathList[pathID];
@@ -109,8 +112,13 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->pathCount = path->count;
EnWeatherTag_SetupAction(this, func_809672DC);
break;
+
case WEATHERTAG_TYPE_LOCALDAY2RAIN:
EnWeatherTag_SetupAction(this, func_809674C8);
+ break;
+
+ default:
+ break;
}
}
@@ -255,11 +263,13 @@ void func_80966BF4(EnWeatherTag* this, PlayState* play) {
case 0:
case 1:
default:
+
newUnk20 = 0;
break;
case 2:
newUnk20 = 3;
break;
+
case 3:
newUnk20 = 4;
break;
@@ -287,9 +297,11 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
default:
newUnk20 = 0;
break;
+
case 2:
newUnk20 = 3;
break;
+
case 3:
newUnk20 = 4;
break;
diff --git a/src/overlays/actors/ovl_En_Zot/z_en_zot.c b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
index 2e9fe8b3f..ab97962de 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
@@ -757,8 +757,6 @@ void func_80B97E0C(EnZot* this, PlayState* play) {
}
void func_80B97E4C(EnZot* this, PlayState* play) {
- if (1) {}
-
if (this->unk_2F2 & 0x40) {
func_80B96BEC(this, 0, ANIMMODE_LOOP);
}
@@ -768,33 +766,38 @@ void func_80B97E4C(EnZot* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
}
- if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- switch (play->msgCtx.currentTextId) {
- case 0x128C:
- this->unk_2F2 &= ~4;
- func_80B96BEC(this, 6, ANIMMODE_ONCE);
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ if ((Message_GetState(&play->msgCtx) != TEXT_STATE_5) || !Message_ShouldAdvance(play)) {
+ return;
+ }
- case 0x128D:
- case 0x128E:
- case 0x128F:
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ switch (play->msgCtx.currentTextId) {
+ case 0x128C:
+ this->unk_2F2 &= ~4;
+ func_80B96BEC(this, 6, ANIMMODE_ONCE);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1290:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97D6C;
- this->unk_2F2 |= 4;
- func_80B96BEC(this, 3, ANIMMODE_LOOP);
- SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
- break;
+ case 0x128D:
+ case 0x128E:
+ case 0x128F:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x128B:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97FD0;
- break;
- }
+ case 0x1290:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97D6C;
+ this->unk_2F2 |= 4;
+ func_80B96BEC(this, 3, ANIMMODE_LOOP);
+ SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
+ break;
+
+ case 0x128B:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97FD0;
+ break;
+
+ default:
+ break;
}
}
diff --git a/src/overlays/actors/ovl_En_Zow/z_en_zow.c b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
index 3e9ef53f4..334b8fc05 100644
--- a/src/overlays/actors/ovl_En_Zow/z_en_zow.c
+++ b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
@@ -185,23 +185,24 @@ void func_80BDC830(EnZowStruct* ptr, PlayState* play) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 1) {
- if (!flag) {
- gDPPipeSync(POLY_XLU_DISP++);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
- gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
+ if (ptr->unk_00 != 1) {
+ continue;
}
+
+ if (!flag) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
+ gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -216,23 +217,24 @@ void func_80BDC9DC(EnZowStruct* ptr, PlayState* play) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 3) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- if (1) {}
- flag = true;
- }
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
+ if (ptr->unk_00 != 3) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
+ flag = true;
+ }
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -247,24 +249,25 @@ void func_80BDCB84(EnZowStruct* ptr, PlayState* play) {
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 2) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
+ if (ptr->unk_00 != 2) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
index a7d2714db..b5547fdad 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -671,13 +671,14 @@ void func_80A24B74(ObjIceblock* this, PlayState* play) {
s32 pad;
Vec3f sp20;
- if (this->dyna.actor.flags & ACTOR_FLAG_40) {
- if (1) {}
- sp20.x = this->dyna.actor.world.pos.x;
- sp20.y = this->unk_244;
- sp20.z = this->dyna.actor.world.pos.z;
- EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
+ if (!(this->dyna.actor.flags & ACTOR_FLAG_40)) {
+ return;
}
+
+ sp20.x = this->dyna.actor.world.pos.x;
+ sp20.y = this->unk_244;
+ sp20.z = this->dyna.actor.world.pos.z;
+ EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
}
void func_80A24BDC(ObjIceblock* this, PlayState* play, f32 arg2, f32 arg3, s32 arg4) {
diff --git a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
index eb14dff6a..4d3bdc348 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
@@ -65,7 +65,7 @@ s32 ObjKibako2_ContainsSkulltula(ObjKibako2* this, PlayState* play) {
if ((u16)actorSpawnParam & 3) {
flag = ((actorSpawnParam & 0x3FC) >> 2) & 0xFF;
}
- return !(flag >= 0 && Flags_GetTreasure(play, flag));
+ return !((flag >= 0) && Flags_GetTreasure(play, flag));
}
void ObjKibako2_Break(ObjKibako2* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
index b0ac87b4e..d08f2d638 100644
--- a/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
+++ b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
@@ -64,7 +64,7 @@ void func_80C06B70(ObjMuPict* this, PlayState* play) {
s16 yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80C06DC8(this, play);
func_80C06CC4(this);
} else {
diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
index d5dfed84d..4710b8908 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
@@ -130,7 +130,7 @@ void func_80BA2514(ObjNozoki* this, PlayState* play) {
}
s32 func_80BA26A8(ObjNozoki* this) {
- if (this->csId < 0) {
+ if (this->csId <= CS_ID_NONE) {
return true;
}
diff --git a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
index cd9eed10b..a4378d92b 100644
--- a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
+++ b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
@@ -549,7 +549,7 @@ void func_80B04350(ObjSnowball* this, PlayState* play) {
this->unk_20A = 0;
}
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80B03FF8(this, play);
if (this->unk_20A == 0) {
func_80B04608(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
index 9deee12ac..05f1cc636 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_um.h"
+#include "z64horse.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -835,7 +836,7 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_31_80);
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 11);
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
@@ -1093,7 +1094,7 @@ ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
if (this->donkey != NULL) {
this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp50);
- func_800F415C(&this->donkey->actor, &sp50, 0x190);
+ Horse_RotateToPoint(&this->donkey->actor, &sp50, 0x190);
if (1) {}
diff --git a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
index ca72d1854..cc47113a5 100644
--- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
+++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
@@ -97,7 +97,7 @@ s32 ObjWarpstone_ClosedIdle(ObjWarpstone* this, PlayState* play) {
}
s32 ObjWarpstone_BeginOpeningCutscene(ObjWarpstone* this, PlayState* play) {
- if ((this->dyna.actor.csId < 0) || CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ if ((this->dyna.actor.csId <= CS_ID_NONE) || CutsceneManager_IsNext(this->dyna.actor.csId)) {
CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ObjWarpstone_SetupAction(this, ObjWarpstone_PlayOpeningCutscene);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_OWL_WARP_SWITCH_ON);
diff --git a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
index b8a7b3b16..1c05a0981 100644
--- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
+++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
@@ -647,8 +647,6 @@ f32 func_808DDE74(void) {
return Rand_ZeroOne() - 0.5f;
}
-#ifdef NON_MATCHING
-// s2/s3 swapped
void func_808DDE9C(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
ObjectKankyo* this = THIS;
@@ -674,25 +672,23 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = this->unk_14C[0].unk_04 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
temp_f2 = this->unk_14C[0].unk_08 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+
+ gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+
+ Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
+ Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
+
+ if (this->unk_114C == 0) {
+ Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
+ } else {
+ Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
-
- gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
-
- Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
- Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
-
- if (this->unk_114C == 0) {
- Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
- } else {
- Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
- }
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
phi_s5 = false;
@@ -710,21 +706,17 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = player->actor.floorHeight + 2.0f;
temp_f2 = this->unk_14C[1].unk_08 + (func_808DDE74() * 220.0f);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+ temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
+ Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
- temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
- Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Object_Kankyo/func_808DDE9C.s")
-#endif
diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
index f237bed47..69f56ef2d 100644
--- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
+++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
@@ -145,13 +145,14 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
s32 pad;
Vec3f spawnPos;
+ //! FAKE:
+ if (1) {}
+
if (this->collider.base.acFlags & AC_HIT) {
play_sound(NA_SE_SY_CORRECT_CHIME);
- if (1) {}
if (INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE) {
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_ETCETERA, 700.0f, -800.0f, 7261.0f, 0, 0, 0,
ITEM_ETC_ARROW_FIRE);
- if (1) {}
gSaveContext.cutsceneTrigger = 1;
} else {
spawnPos.x = 700.0f;
@@ -168,19 +169,19 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
return;
}
- if (!(this->actor.xzDistToPlayer > 120.0f)) {
- if ((gSaveContext.save.time >= CLOCK_TIME(6, 30)) && (gSaveContext.save.time < CLOCK_TIME(7, 30))) {
- cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
- cylinderPos.y =
- (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
- cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
-
- this->hitboxPos = cylinderPos;
-
- Collider_SetCylinderPosition(&this->collider, &cylinderPos);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actor.xzDistToPlayer > 120.0f) || (gSaveContext.save.time < CLOCK_TIME(6, 30)) ||
+ (gSaveContext.save.time >= CLOCK_TIME(7, 30))) {
+ return;
}
+
+ cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
+ cylinderPos.y = (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
+ cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
+
+ this->hitboxPos = cylinderPos;
+
+ Collider_SetCylinderPosition(&this->collider, &cylinderPos);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
void ShotSun_Update(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c
index 04f7a6286..270094562 100644
--- a/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/src/overlays/actors/ovl_player_actor/z_player.c
@@ -4,7 +4,9 @@
* Description: Player
*/
+#include "prevent_bss_reordering.h"
#include "global.h"
+#include "z64horse.h"
#include "z64quake.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
@@ -3994,7 +3996,7 @@ s32 func_80830F9C(PlayState* play) {
s32 func_80830FD4(PlayState* play) {
return (play->bButtonAmmoPlusOne != 0) &&
- (play->bButtonAmmoPlusOne < 0 ||
+ ((play->bButtonAmmoPlusOne < 0) ||
CHECK_BTN_ANY(sPlayerControlInput->cur.button,
BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A));
}
@@ -5796,7 +5798,7 @@ s32 func_8083562C(PlayState* play, Player* this, CollisionPoly* poly, s32 bgId)
if (D_801BDAA0) {
D_801BDAA0 = false;
} else {
- D_801BDA9C = true;
+ gHorseIsMounted = true;
}
}
}
@@ -15791,7 +15793,7 @@ void func_808505D0(Player* this, PlayState* play) {
this->stateFlags1 &= ~PLAYER_STATE1_800000;
this->actor.parent = NULL;
- D_801BDA9C = false;
+ gHorseIsMounted = false;
if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) || (DREG(1) != 0)) {
gSaveContext.save.saveInfo.horseData.sceneId = play->sceneId;
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
index 759e1511c..03bc1e81d 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "z_fbdemo_wipe3.h"
+#define THIS ((TransitionWipe3*)thisx)
+
void* TransitionWipe3_Init(void* thisx);
void TransitionWipe3_Destroy(void* thisx);
void TransitionWipe3_Update(void* thisx, s32 updateRate);
@@ -17,37 +19,159 @@ void TransitionWipe3_SetColor(void* thisx, u32 color);
void TransitionWipe3_SetEnvColor(void* thisx, u32 color);
s32 TransitionWipe3_IsDone(void* thisx);
-#if 0
-TransitionInit TransitionWipe3_InitVars = {
- TransitionWipe3_Init,
- TransitionWipe3_Destroy,
- TransitionWipe3_Update,
- TransitionWipe3_Draw,
- TransitionWipe3_Start,
- TransitionWipe3_SetType,
- TransitionWipe3_SetColor,
- TransitionWipe3_SetEnvColor,
- TransitionWipe3_IsDone,
+#include "assets/overlays/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.c"
+
+TexturePtr sTransWipe3Textures[] = {
+ fbdemo_tex_000520, fbdemo_tex_000920, fbdemo_tex_000D20, fbdemo_tex_001120,
+ fbdemo_tex_001520, fbdemo_tex_000520, fbdemo_tex_000520, fbdemo_tex_000520,
};
-#endif
+TransitionInit TransitionWipe3_InitVars = {
+ TransitionWipe3_Init, TransitionWipe3_Destroy, TransitionWipe3_Update,
+ TransitionWipe3_Draw, TransitionWipe3_Start, TransitionWipe3_SetType,
+ TransitionWipe3_SetColor, TransitionWipe3_SetEnvColor, TransitionWipe3_IsDone,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Start.s")
+#define TRANS3_GET_SPEED(type) (type & 1)
+#define TRANS3_GET_TEX_INDEX(type) ((type >> 1) & 7)
+#define TRANS3_GET_COLOR(type) ((type >> 4) & 3)
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Init.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_DIR_IN,
+ /* 1 */ TRANS_WIPE3_DIR_OUT
+} TransitionWipe3Direction;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Destroy.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_SPEED_SLOW,
+ /* 1 */ TRANS_WIPE3_SPEED_FAST
+} TransitionWipe3Speed;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/func_80AC68B4.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_COLOR_BLACK,
+ /* 1 */ TRANS_WIPE3_COLOR_WHITE,
+ /* 2 */ TRANS_WIPE3_COLOR_GRAY
+} TransitionWipe3Color;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Update.s")
+void TransitionWipe3_Start(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Draw.s")
+ this->isDone = false;
+ this->curTexture = sTransWipe3Textures[this->texIndex % ARRAY_COUNTU(sTransWipe3Textures)];
+ if (this->speedType == TRANS_WIPE3_SPEED_SLOW) {
+ this->wipeSpeed = 20;
+ } else {
+ this->wipeSpeed = 10;
+ }
+ if (this->colorType == TRANS_WIPE3_COLOR_BLACK) {
+ this->color.rgba = RGBA8(0, 0, 0, 255);
+ } else if (this->colorType == TRANS_WIPE3_COLOR_WHITE) {
+ this->color.rgba = RGBA8(255, 255, 255, 255);
+ } else {
+ this->color.rgba = RGBA8(160, 160, 160, 255);
+ }
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ this->scrollY = 0;
+ } else {
+ this->scrollY = 500;
+ if (this->texIndex == 2) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_OUT);
+ }
+ }
+ guPerspective(&this->projection, &this->normal, 60.0f, 4.0f / 3.0f, 10.0f, 12800.0f, 1.0f);
+ guLookAt(&this->lookAt, 0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_IsDone.s")
+void* TransitionWipe3_Init(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetType.s")
+ bzero(this, sizeof(TransitionWipe3));
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetColor.s")
+void TransitionWipe3_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetEnvColor.s")
+void TransitionWipe3_UpdateScrollY(void* thisx, f32 scroll) {
+ TransitionWipe3* this = THIS;
+
+ this->scrollY = (s32)(500.0f * scroll);
+}
+
+void TransitionWipe3_Update(void* thisx, s32 updateRate) {
+ TransitionWipe3* this = THIS;
+
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ if ((this->scrollY == 0) && (this->texIndex == 2)) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ }
+ this->scrollY += (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY >= 500) {
+ this->scrollY = 500;
+ this->isDone = true;
+ }
+ } else {
+ this->scrollY -= (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY <= 0) {
+ this->scrollY = 0;
+ this->isDone = true;
+ }
+ }
+}
+
+void TransitionWipe3_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView = &THIS->modelView[THIS->frame];
+ f32 scale = 14.8f;
+ Gfx* texScroll;
+
+ THIS->frame ^= 1;
+ gDPPipeSync(gfx++);
+ texScroll = Gfx_BranchTexScroll(&gfx, THIS->scrollX, THIS->scrollY, 16, 64);
+ gSPSegment(gfx++, 0x09, texScroll);
+ gSPSegment(gfx++, 0x08, THIS->curTexture);
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, THIS->color.rgba);
+ gDPSetColor(gfx++, G_SETENVCOLOR, THIS->color.rgba);
+ gSPMatrix(gfx++, &THIS->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPPerspNormalize(gfx++, THIS->normal);
+ gSPMatrix(gfx++, &THIS->lookAt, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+
+ if (scale != 1.0f) {
+ guScale(modelView, scale, scale, 1.0f);
+ gSPMatrix(gfx++, modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+ gSPDisplayList(gfx++, sTransWipe3DL);
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionWipe3_IsDone(void* thisx) {
+ TransitionWipe3* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionWipe3_SetType(void* thisx, s32 type) {
+ TransitionWipe3* this = THIS;
+
+ if (type & TRANS_TYPE_SET_PARAMS) {
+ this->speedType = TRANS3_GET_SPEED(type);
+ this->texIndex = TRANS3_GET_TEX_INDEX(type);
+ this->colorType = TRANS3_GET_COLOR(type);
+ } else if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->dir = TRANS_WIPE3_DIR_OUT;
+ } else {
+ this->dir = TRANS_WIPE3_DIR_IN;
+ }
+}
+
+void TransitionWipe3_SetColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->color.rgba = color;
+}
+
+void TransitionWipe3_SetEnvColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->envColor.rgba = color;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
index b023ecb8b..711f97952 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
@@ -5,7 +5,22 @@
#include "color.h"
typedef struct {
- /* 0x000 */ char unk_0[0x120];
+ /* 0x000 */ Color_RGBA8_u32 color;
+ /* 0x008 */ Color_RGBA8_u32 envColor;
+ /* 0x004 */ u32 scrollX;
+ /* 0x00C */ s32 scrollY;
+ /* 0x010 */ s32 wipeSpeed;
+ /* 0x014 */ u8 dir;
+ /* 0x015 */ u8 colorType;
+ /* 0x016 */ u8 speedType;
+ /* 0x017 */ u8 texIndex;
+ /* 0x018 */ u8 isDone;
+ /* 0x019 */ u8 frame;
+ /* 0x01A */ u16 normal;
+ /* 0x01C */ TexturePtr curTexture;
+ /* 0x020 */ Mtx projection;
+ /* 0x060 */ Mtx lookAt;
+ /* 0x0A0 */ Mtx modelView[2];
} TransitionWipe3; // size = 0x120
#endif
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
index 48c8bdf58..9e11df190 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
@@ -81,7 +81,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
Gfx* gfx = *gfxP;
s32 width = gScreenWidth;
s32 height = gScreenHeight;
- void* sp50 = D_801FBB90;
+ void* workBuffer = gWorkBuffer;
TransitionWipe5* this = THIS;
s32 alpha = (1.0f - this->unk_0C) * 255.0f;
@@ -92,7 +92,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
- func_8014116C(&gfx, D_0F000000, sp50, width, height, 1);
+ func_8014116C(&gfx, D_0F000000, workBuffer, width, height, 1);
} else {
if (alpha == 255) {
gDPSetOtherMode(gfx++,
@@ -108,7 +108,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
ENVIRONMENT);
- func_8014116C(&gfx, sp50, D_0F000000, width, height, 0);
+ func_8014116C(&gfx, workBuffer, D_0F000000, width, height, 0);
}
gDPPipeSync(gfx++);
gSPLoadUcode(gfx++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
index bb92b5576..ce7686531 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
@@ -13,7 +13,7 @@ extern TexturePtr D_08061000; // gBombersNotebookIconTex
extern TexturePtr D_08062000; // gSongNoteIconTex
s16 sQuestRemainsColorTimerInit[] = { 120, 60, 2, 80 };
-s16 sQuestHpColorTimerInit[] = { 20, 4, 20, 10 };
+s16 sQuestHpColorTimerInits[] = { 20, 4, 20, 10 };
s16 sQuestSongPlayedOcarinaButtonsNum = 0;
u8 sQuestSongPlayedOcarinaButtons[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
s16 sQuestSongPlayedOcarinaButtonsAlpha[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
@@ -313,7 +313,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
sQuestHpPrimGreen = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][1];
sQuestHpPrimBlue = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][2];
sQuestHpPrimAlpha = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][3];
- sQuestHpColorTimer = sQuestHpColorTimerInit[sQuestHpPrimColorTargetIndex];
+ sQuestHpColorTimer = sQuestHpColorTimerInits[sQuestHpPrimColorTargetIndex];
if (++sQuestHpPrimColorTargetIndex > 3) {
sQuestHpPrimColorTargetIndex = 0;
}
@@ -618,7 +618,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].left;
if (nextCursorPoint == CURSOR_TO_LEFT) {
@@ -641,7 +641,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].right;
if (nextCursorPoint == CURSOR_TO_RIGHT) {
@@ -666,7 +666,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
nextCursorPoint = sCursorPointLinks[oldCursorPoint].down;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -679,7 +679,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
}
nextCursorPoint = sCursorPointLinks[oldCursorPoint].up;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -907,7 +907,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_BOMBERS_NOTEBOOK;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
@@ -925,7 +925,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_REMAINS_GOHT;
if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
index c8d963bda..f46db573c 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
@@ -382,7 +382,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorXIndex[PAUSE_ITEM]--;
pauseCtx->cursorPoint[PAUSE_ITEM]--;
@@ -413,7 +413,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] <= 4) {
pauseCtx->cursorXIndex[PAUSE_ITEM]++;
pauseCtx->cursorPoint[PAUSE_ITEM]++;
@@ -451,7 +451,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_OCARINA)
@@ -489,7 +489,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else { // PAUSE_CURSOR_PAGE_RIGHT
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right columne (SLOT_TRADE_DEED)
cursorYIndex = 0;
@@ -541,7 +541,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorYIndex[PAUSE_ITEM]--;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
@@ -553,7 +553,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] < 3) {
pauseCtx->cursorYIndex[PAUSE_ITEM]++;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
index 6539f1b9e..a4df2c889 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
@@ -152,7 +152,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
// QUAD_MAP_PAGE_DUNGEON_BOSS_KEY,
// QUAD_MAP_PAGE_DUNGEON_COMPASS,
// QUAD_MAP_PAGE_DUNGEON_MAP
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 16, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_DUNGEON_TITLE * 4], 4 * 4, 0);
// Dungeon Title
gDPPipeSync(POLY_OPA_DISP++);
@@ -317,9 +317,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
pauseCtx->cursorColorSet = PAUSE_CURSOR_COLOR_SET_WHITE;
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 0;
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->unk_256;
pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->unk_256;
@@ -345,9 +345,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 1;
pauseCtx->cursorPoint[PAUSE_MAP] = DUNGEON_MAP;
if (!CHECK_DUNGEON_ITEM(DUNGEON_MAP, gSaveContext.dungeonIndex)) {
@@ -390,7 +390,7 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -411,7 +411,7 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -854,7 +854,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->cursorSpecialPos == 0) {
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -869,7 +869,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -898,7 +898,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->stickAdjX > 30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = -1;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -923,7 +923,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
} else if (pauseCtx->stickAdjX < -30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 11;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
@@ -958,7 +958,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -967,7 +967,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
} while (!pauseCtx->worldMapPoints[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]]);
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
index 67a8e0d36..228f0d16a 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
@@ -309,7 +309,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] != 0) {
pauseCtx->cursorXIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK]--;
@@ -339,7 +339,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] <= 4) {
pauseCtx->cursorXIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[PAUSE_MASK]++;
@@ -380,7 +380,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_MASK_POSTMAN)
@@ -421,7 +421,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
//! FAKE:
if (1) {}
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right column (SLOT_MASK_DEKU)
cursorYIndex = 0;
@@ -473,7 +473,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor up
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] != 0) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
@@ -485,7 +485,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor down
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] < 3) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[PAUSE_MASK] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
index a9aeed70f..c82a40e67 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
@@ -76,9 +76,9 @@ typedef enum {
} PauseMainState;
typedef enum {
- /* 0x00 */ PAUSE_SAVEPROMPT_STATE_0,
+ /* 0x00 */ PAUSE_SAVEPROMPT_STATE_APPEARING,
/* 0x01 */ PAUSE_SAVEPROMPT_STATE_1,
- /* 0x02 */ PAUSE_SAVEPROMPT_STATE_2,
+ /* 0x02 */ PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU,
/* 0x03 */ PAUSE_SAVEPROMPT_STATE_3,
/* 0x04 */ PAUSE_SAVEPROMPT_STATE_4,
/* 0x05 */ PAUSE_SAVEPROMPT_STATE_5,
@@ -303,9 +303,35 @@ typedef enum {
/* 66 */ QUAD_MAP_PAGE_WORLD_MAX
} WorldMapPageQuad;
+// === INFO PANEL === //
+
+/**
+ * infoPanelVtx
+ *
+ * infoPanelVtx[0] name panel left texture
+ * infoPanelVtx[4] name panel right texture
+ * infoPanelVtx[8] Z Button icon
+ * infoPanelVtx[12] R Button icon
+ * infoPanelVtx[16] A button icon (or name segment)
+ * infoPanelVtx[20] pause-to-decide texture
+ * infoPanelVtx[24] (unused) oot remnant of Gold Skulltula Icon Texture
+ */
+
#define PAUSE_NAME_COLOR_SET_WHITE 0
#define PAUSE_NAME_COLOR_SET_GREY 1
+// === CURSOR === //
+
+/**
+ * cursorVtx
+ *
+ * cursorVtx[0] cursor circle
+ * cursorVtx[4] (unused) oot remnant of top-right corner of cursor
+ * cursorVtx[8] (unused) oot remnant of bottom-left corner of cursor
+ * cursorVtx[12] (unused) oot remnant of bottom-right corner of cursor
+ * cursorVtx[16] equipping item icon (while moving)
+ */
+
#define PAUSE_CURSOR_COLOR_SET_WHITE 0
#define PAUSE_CURSOR_COLOR_SET_YELLOW 2
#define PAUSE_CURSOR_COLOR_SET_BLUE 4
@@ -326,6 +352,36 @@ typedef enum {
/* 5 */ PAUSE_QUAD_CURSOR_MAX
} PauseCursorQuad;
+// === PROMPT === //
+
+/**
+ * promptPageVtx (unused in MM, inferred from OoT)
+ *
+ * // PAGE_BG_QUADS
+ * promptPageVtx[0] prompt page background texture: row 0, column 0
+ * promptPageVtx[4] prompt page background texture: row 1, column 0
+ * promptPageVtx[8] prompt page background texture: row 2, column 0
+ * promptPageVtx[12] prompt page background texture: row 3, column 0
+ * promptPageVtx[16] prompt page background texture: row 4, column 0
+ * promptPageVtx[20] prompt page background texture: row 0, column 1
+ * promptPageVtx[24] prompt page background texture: row 1, column 1
+ * promptPageVtx[28] prompt page background texture: row 2, column 1
+ * promptPageVtx[32] prompt page background texture: row 3, column 1
+ * promptPageVtx[36] prompt page background texture: row 4, column 1
+ * promptPageVtx[40] prompt page background texture: row 0, column 2
+ * promptPageVtx[44] prompt page background texture: row 1, column 2
+ * promptPageVtx[48] prompt page background texture: row 2, column 2
+ * promptPageVtx[52] prompt page background texture: row 3, column 2
+ * promptPageVtx[56] prompt page background texture: row 4, column 2
+ *
+ * // QUAD_PROMPT_MAX
+ * promptPageVtx[60] message
+ * promptPageVtx[64] cursor left
+ * promptPageVtx[68] cursor right
+ * promptPageVtx[72] choice (yes)
+ * promptPageVtx[76] choice (no)
+ */
+
#define PAUSE_PROMPT_YES 0
#define PAUSE_PROMPT_NO 4
@@ -342,7 +398,7 @@ typedef enum {
void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos);
void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point);
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ);
-void func_80821A04(PlayState* play);
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play);
// Map
void KaleidoScope_DrawDungeonMap(PlayState* play);
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
index 9b99937e1..3e429eecb 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
@@ -1,7 +1,7 @@
/*
* File: z_kaleido_scope_NES.c
* Overlay: ovl_kaleido_scope
- * Description:
+ * Description: Pause Menu
*/
#include "z_kaleido_scope.h"
@@ -9,18 +9,13 @@
#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
#include "z64view.h"
+#include "overlays/gamestates/ovl_opening/z_opening.h"
+#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
+#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
+#include "interface/icon_item_vtx_static/icon_item_vtx_static.h"
-extern UNK_TYPE D_02001360;
-extern UNK_TYPE D_020044A0;
-extern UNK_TYPE D_02004AA0;
-extern UNK_TYPE D_0200B998;
-extern UNK_TYPE D_08062000;
-extern UNK_TYPE D_08064340;
-extern UNK_TYPE D_0B000000;
-extern UNK_TYPE D_0C000000;
-extern UNK_TYPE D_0C006C00;
-
-extern u8 sUnpausedButtonStatus[5];
+// iconItemSegment
+extern TexturePtr D_08064340; // gPauseMenuCursorTex
// Page Textures (Background of Page):
// Broken up into multiple textures.
@@ -242,29 +237,68 @@ s16 sPauseCursorRightX = 0;
s16 D_8082B920 = 10;
-u8 D_8082B924[] = {
- 0x00, 0x14, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0A, 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
- 0x07, 0x07, 0x03, 0x0F, 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
+s16 sPauseZRCursorColorTimerInits[] = { 20, 4, 20, 10 };
+
+// Unused remnant of OoT
+u8 gAreaGsFlags[] = {
+ 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x07, 0x07, 0x03, 0x0F,
+ 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
};
// TODO: Also applies to owl warps
s16 sGameOverRectPosY = 66;
-void func_80821900(void* segment, u32 texIndex) {
+void Kaleido_LoadMapNameStatic(void* segment, u32 texIndex) {
CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
}
-void func_8082192C(void* segment, u32 texIndex) {
+void Kaleido_LoadMapNameStaticLarge(void* segment, u32 texIndex) {
CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
}
-void func_80821958(void* segment, u32 texIndex) {
+void Kaleido_LoadItemNameStatic(void* segment, u32 texIndex) {
CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
+void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos) {
+ PauseContext* pauseCtx = &play->pauseCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821A04.s")
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->cursorSpecialPos = cursorSpecialPos;
+ pauseCtx->pageSwitchInputTimer = 0;
+
+ play_sound(NA_SE_SY_DECIDE);
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ pauseCtx->nameDisplayTimer = 0;
+ pauseCtx->cursorSpecialPos = 0;
+
+ play_sound(NA_SE_SY_CURSOR);
+
+ pauseCtx->cursorShrinkRate = 4.0f;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point) {
OPEN_DISPS(gfxCtx);
@@ -277,10 +311,90 @@ void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture,
CLOSE_DISPS(gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821CC4.s")
+#define SWITCH_PAGE_LEFT 0
+#define SWITCH_PAGE_RIGHT 2
-void KaleidoScope_HandlePageToggles(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_HandlePageToggles.s")
+void KaleidoScope_SwitchPage(PauseContext* pauseCtx, u8 direction) {
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->mainState = PAUSE_MAIN_STATE_SWITCHING_PAGE;
+ pauseCtx->switchPageTimer = 0;
+
+ if (direction == SWITCH_PAGE_LEFT) {
+ pauseCtx->nextPageMode = (pauseCtx->pageIndex * 2) + 1;
+ play_sound(NA_SE_SY_WIN_SCROLL_LEFT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
+ } else { // SWITCH_PAGE_RIGHT
+ pauseCtx->nextPageMode = pauseCtx->pageIndex * 2;
+ play_sound(NA_SE_SY_WIN_SCROLL_RIGHT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+/**
+ * Process inputs to decide whether to switch pages
+ */
+void KaleidoScope_HandlePageToggles(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+
+ //! FAKE
+ if (1) {}
+
+ if ((pauseCtx->debugEditor != DEBUG_EDITOR_NONE) || pauseCtx->itemDescriptionOn) {
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT) || CHECK_BTN_ALL(input->press.button, BTN_R)) {
+ // Switch the page to the right regardless of where the cursor is
+ if (interfaceCtx->aButtonHorseDoAction == DO_ACTION_DECIDE) {
+ Interface_SetAButtonDoAction(play, DO_ACTION_INFO);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT) || CHECK_BTN_ALL(input->press.button, BTN_Z)) {
+ // Switch the page to the left regardless of where the cursor is
+ if (interfaceCtx->aButtonHorseDoAction == DO_ACTION_DECIDE) {
+ Interface_SetAButtonDoAction(play, DO_ACTION_INFO);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ return;
+ }
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ if (pauseCtx->stickAdjX < -30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the left after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ }
+ } else {
+ // stickAdjX is no longer held, so that the next input to the left will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
+ if (pauseCtx->stickAdjX > 30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the right after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ }
+ } else {
+ // stickAdjY is no longer held, so that the next input to the right will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ }
+}
// Draw 15 (PAGE_BG_QUADS) quads with IA8 80x32 textures
Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, TexturePtr* textures) {
@@ -633,19 +747,413 @@ TexturePtr D_8082B9A8[] = {
gPauseToMasksENGTex,
gPauseToSelectItemENGTex,
};
+void KaleidoScope_DrawInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
-s16 D_8082B9B8[][4] = {
- { 180, 210, 255, 220 },
- { 100, 100, 150, 220 },
-};
+ OPEN_DISPS(play->state.gfxCtx);
-s16 D_8082B9C8 = 20;
-s16 D_8082B9CC = 0;
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80823350.s")
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
-void KaleidoScope_UpdateNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateNamePanel.s")
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gZButtonIconDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if (pauseCtx->itemDescriptionOn ||
+ ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) &&
+ (pauseCtx->cursorSpecialPos == 0))) {
+ if (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+ } else if ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK)) {
+ pauseCtx->infoPanelVtx[20].v.ob[1] = pauseCtx->infoPanelVtx[21].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[22].v.ob[1] = pauseCtx->infoPanelVtx[23].v.ob[1] =
+ pauseCtx->infoPanelVtx[20].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 16 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0);
+
+ if (pauseCtx->state == PAUSE_STATE_SAVEPROMPT) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -33;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x10;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x30;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 48 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ //! @bug: Incorrect dimensions. Should be 64x16
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToDecideENGTex, G_IM_FMT_IA, 48, 16, 4);
+
+ } else if (pauseCtx->cursorSpecialPos != 0) {
+ if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 200, 0, 255);
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ } else {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ }
+ }
+ } else if ((!pauseCtx->pageIndex || (pauseCtx->pageIndex == PAUSE_MASK)) &&
+ (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -49;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 48;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 47;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 64;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 48 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 64 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gCButtonIconsDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToEquipENGTex, G_IM_FMT_IA, 64, 16, 4);
+ } else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) {
+ // No code in this case
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) {
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ // The cursor is on the bombers notebook
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -58;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x14;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x60;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToViewNotebookENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ // The cursor is on a learned song
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -55;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 20;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 96;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToPlayMelodyENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+u8 sUnpausedButtonStatus[5];
+f32 sCursorCirclesX[4];
+f32 sCursorCirclesY[4];
+
+void KaleidoScope_UpdateNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 namedItem;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ namedItem = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, namedItem);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, namedItem);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM) || (pauseCtx->pageIndex == PAUSE_MASK)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
void KaleidoScope_DrawOwlWarpMapPage(PlayState* play) {
PauseContext* pauseCtx = &play->pauseCtx;
@@ -690,21 +1198,275 @@ void KaleidoScope_DrawOwlWarpMapPage(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-s16 D_8082B9D0[][4] = {
- { 180, 210, 255, 220 },
- { 100, 100, 150, 220 },
-};
+void KaleidoScope_DrawOwlWarpInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
-s16 D_8082B9E0 = 20;
-s16 D_8082B9E4 = 0;
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80824B90.s")
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
-void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateOwlWarpNamePanel.s")
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
-void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateSwitchPage.s")
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if ((pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 texIndex;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ texIndex = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, texIndex);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, texIndex);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
+
+void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ //! FAKE
+ if (1) {
+ pauseCtx->eye.x += sPageSwitchEyeDx[pauseCtx->nextPageMode] * 2.0f;
+ pauseCtx->eye.z += sPageSwitchEyeDz[pauseCtx->nextPageMode] * 2.0f;
+
+ if (pauseCtx->switchPageTimer < 32) {
+ sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
+ } else {
+ sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+ }
+
+ pauseCtx->switchPageTimer += 8;
+
+ if (pauseCtx->switchPageTimer == 64) {
+ pauseCtx->switchPageTimer = 0;
+ pauseCtx->pageIndex = sPageSwitchNextPageIndex[pauseCtx->nextPageMode];
+ pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
+
+ KaleidoScope_HandlePageToggles(play, input);
+ }
+ }
+}
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ) {
Vec3f eye;
@@ -773,7 +1535,7 @@ s16 sVtxPageMapWorldQuadsX[VTX_PAGE_MAP_WORLD_QUADS] = {
44, // mapPageVtx[196] world map owl warp Ikana Canyon
54, // mapPageVtx[200] world map owl warp Stone Tower
};
-s16 sVtxPageSaveQuadsX[VTX_PAGE_SAVE_QUADS] = {
+s16 sVtxPagePromptQuadsX[VTX_PAGE_SAVE_QUADS] = {
-76, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
-58, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
@@ -793,7 +1555,7 @@ s16 sVtxPageMapDungeonQuadsWidth[VTX_PAGE_MAP_DUNGEON_QUADS] = {
24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
};
s16 sVtxPageQuestQuadsWidth[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
-s16 sVtxPageSaveQuadsWidth[VTX_PAGE_SAVE_QUADS] = {
+s16 sVtxPagePromptQuadsWidth[VTX_PAGE_SAVE_QUADS] = {
152, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
@@ -852,7 +1614,7 @@ s16 sVtxPageMapWorldQuadsY[VTX_PAGE_MAP_WORLD_QUADS] = {
-1, // mapPageVtx[196] world map owl warp Ikana Canyon
24, // mapPageVtx[200] world map owl warp Stone Tower
};
-s16 sVtxPageSaveQuadsY[VTX_PAGE_SAVE_QUADS] = {
+s16 sVtxPagePromptQuadsY[VTX_PAGE_SAVE_QUADS] = {
36, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
10, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
@@ -872,7 +1634,7 @@ s16 sVtxPageMapDungeonQuadsHeight[] = {
24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
};
s16 sVtxPageQuestQuadsHeight[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
-s16 sVtxPageSaveQuadsHeight[VTX_PAGE_SAVE_QUADS] = {
+s16 sVtxPagePromptQuadsHeight[VTX_PAGE_SAVE_QUADS] = {
16, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
@@ -886,7 +1648,7 @@ s16* sVtxPageQuadsX[VTX_PAGE_MAX] = {
sVtxPageMapDungeonQuadsX, // VTX_PAGE_MAP_DUNGEON
sVtxPageQuestQuadsX, // VTX_PAGE_QUEST
sVtxPageMapWorldQuadsX, // VTX_PAGE_MAP_WORLD
- sVtxPageSaveQuadsX, // VTX_PAGE_PROMPT
+ sVtxPagePromptQuadsX, // VTX_PAGE_PROMPT
};
s16* sVtxPageQuadsWidth[VTX_PAGE_MAX] = {
@@ -895,7 +1657,7 @@ s16* sVtxPageQuadsWidth[VTX_PAGE_MAX] = {
sVtxPageMapDungeonQuadsWidth, // VTX_PAGE_MAP_DUNGEON
sVtxPageQuestQuadsWidth, // VTX_PAGE_QUEST
gVtxPageMapWorldQuadsWidth, // VTX_PAGE_MAP_WORLD
- sVtxPageSaveQuadsWidth, // VTX_PAGE_PROMPT
+ sVtxPagePromptQuadsWidth, // VTX_PAGE_PROMPT
};
s16* sVtxPageQuadsY[VTX_PAGE_MAX] = {
@@ -904,7 +1666,7 @@ s16* sVtxPageQuadsY[VTX_PAGE_MAX] = {
sVtxPageMapDungeonQuadsY, // VTX_PAGE_MAP_DUNGEON
sVtxPageQuestQuadsY, // VTX_PAGE_QUEST
sVtxPageMapWorldQuadsY, // VTX_PAGE_MAP_WORLD
- sVtxPageSaveQuadsY, // VTX_PAGE_PROMPT
+ sVtxPagePromptQuadsY, // VTX_PAGE_PROMPT
};
s16* sVtxPageQuadsHeight[VTX_PAGE_MAX] = {
@@ -913,7 +1675,7 @@ s16* sVtxPageQuadsHeight[VTX_PAGE_MAX] = {
sVtxPageMapDungeonQuadsHeight, // VTX_PAGE_MAP_DUNGEON
sVtxPageQuestQuadsHeight, // VTX_PAGE_QUEST
gVtxPageMapWorldQuadsHeight, // VTX_PAGE_MAP_WORLD
- sVtxPageSaveQuadsHeight, // VTX_PAGE_PROMPT
+ sVtxPagePromptQuadsHeight, // VTX_PAGE_PROMPT
};
s16 sVtxPageGameOverSaveQuadsY[VTX_PAGE_SAVE_QUADS] = {
@@ -1547,60 +2309,435 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) {
}
}
-f32 D_8082BCB4[] = {
- -62.0f, -36.0f, -10.0f, 16.0f, 42.0f, 68.0f,
+f32 sItemMaskCursorsX[] = {
+ -62.0f, // Column 1
+ -36.0f, // Column 2
+ -10.0f, // Column 3
+ 16.0f, // Column 4
+ 42.0f, // Column 5
+ 68.0f, // Column 6
};
-f32 D_8082BCCC[] = {
- 31.0f,
- 5.0f,
- -21.0f,
- -47.0f,
+f32 sItemMaskCursorsY[] = {
+ 31.0f, // Row 1
+ 5.0f, // Row 2
+ -21.0f, // Row 3
+ -47.0f, // Row 4
};
-f32 D_8082BCDC[] = {
- -49.0f, -35.0f, -3.0f, 4.0f, 12.0f, 8.0f, 7.0f, 40.0f, 47.0f, 49.0f, 55.0f,
+f32 sWorldMapCursorsX[REGION_MAX] = {
+ -49.0f, // REGION_GREAT_BAY
+ -35.0f, // REGION_ZORA_HALL
+ -3.0f, // REGION_ROMANI_RANCH
+ 4.0f, // REGION_DEKU_PALACE
+ 12.0f, // REGION_WOODFALL
+ 8.0f, // REGION_CLOCK_TOWN
+ 7.0f, // REGION_SNOWHEAD
+ 40.0f, // REGION_IKANA_GRAVEYARD
+ 47.0f, // REGION_IKANA_CANYON
+ 49.0f, // REGION_GORON_VILLAGE
+ 55.0f, // REGION_STONE_TOWER
};
-f32 D_8082BD08[] = {
- -15.0f, -36.0f, -23.0f, -49.0f, -29.0f, -8.0f, 25.0f, 2.0f, -9.0f, 28.0f, 7.0f,
+f32 sWorldMapCursorsY[REGION_MAX] = {
+ -15.0f, // REGION_GREAT_BAY
+ -36.0f, // REGION_ZORA_HALL
+ -23.0f, // REGION_ROMANI_RANCH
+ -49.0f, // REGION_DEKU_PALACE
+ -29.0f, // REGION_WOODFALL
+ -8.0f, // REGION_CLOCK_TOWN
+ 25.0f, // REGION_SNOWHEAD
+ 2.0f, // REGION_IKANA_GRAVEYARD
+ -9.0f, // REGION_IKANA_CANYON
+ 28.0f, // REGION_GORON_VILLAGE
+ 7.0f, // REGION_STONE_TOWER
};
-f32 D_8082BD34[] = {
- -50.0f, -38.0f, 6.0f, 11.0f, 8.0f, 0.0f, 12.0f, 31.0f, 48.0f, 56.0f,
+f32 sOwlWarpWorldMapCursorsX[OWL_WARP_MAX - 1] = {
+ -50.0f, // OWL_WARP_GREAT_BAY_COAST
+ -38.0f, // OWL_WARP_ZORA_CAPE
+ 6.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ 8.0f, // OWL_WARP_CLOCK_TOWN
+ 0.0f, // OWL_WARP_MILK_ROAD
+ 12.0f, // OWL_WARP_WOODFALL
+ 31.0f, // OWL_WARP_SOUTHERN_SWAMP
+ 48.0f, // OWL_WARP_IKANA_CANYON
+ 56.0f, // OWL_WARP_STONE_TOWER
};
-f32 D_8082BD5C[] = {
- -14.0f, -39.0f, 23.0f, 11.0f, -8.0f, -15.0f, -31.0f, -30.0f, -10.0f, 11.0f,
+f32 sOwlWarpWorldMapCursorsY[OWL_WARP_MAX - 1] = {
+ -14.0f, // OWL_WARP_GREAT_BAY_COAST
+ -39.0f, // OWL_WARP_ZORA_CAPE
+ 23.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ -8.0f, // OWL_WARP_CLOCK_TOWN
+ -15.0f, // OWL_WARP_MILK_ROAD
+ -31.0f, // OWL_WARP_WOODFALL
+ -30.0f, // OWL_WARP_SOUTHERN_SWAMP
+ -10.0f, // OWL_WARP_IKANA_CANYON
+ 11.0f, // OWL_WARP_STONE_TOWER
};
-f32 D_8082BD84[] = {
- -72.0f, -47.0f, -26.0f, -50.0f, -48.0f, -48.0f, -48.0f, -48.0f, -48.0f,
+f32 sDungeonMapCursorsX[] = {
+ -72.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -26.0f, // DUNGEON_MAP
+ -50.0f, // DUNGEON_STRAY_FAIRIES
+ -48.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ -48.0f, // DUNGEON_FLOOR_INDEX_3
+ -48.0f, // DUNGEON_FLOOR_INDEX_2
+ -48.0f, // DUNGEON_FLOOR_INDEX_1
+ -48.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
};
-f32 D_8082BDA8[] = {
- -47.0f, -47.0f, -47.0f, -30.0f, 33.0f, 22.0f, 11.0f, -2.0f, -13.0f,
+f32 sDungeonMapCursorsY[] = {
+ -47.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -47.0f, // DUNGEON_MAP
+ -30.0f, // DUNGEON_STRAY_FAIRIES
+ 33.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ 22.0f, // DUNGEON_FLOOR_INDEX_3
+ 11.0f, // DUNGEON_FLOOR_INDEX_2
+ -2.0f, // DUNGEON_FLOOR_INDEX_1
+ -13.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
};
-f32 D_8082BDCC[] = {
- 52.0f, 80.0f, 24.0f, 52.0f, 81.0f, 24.0f, -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f,
- -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f, -68.0f, 22.0f, 83.0f, -67.0f, -21.0f,
+f32 sQuestStatusCursorsX[] = {
+ 52.0f, // QUEST_REMAINS_ODOLWA
+ 80.0f, // QUEST_REMAINS_GOHT
+ 24.0f, // QUEST_REMAINS_GYORG
+ 52.0f, // QUEST_REMAINS_TWINMOLD
+ 81.0f, // QUEST_SHIELD
+ 24.0f, // QUEST_SWORD
+ -78.0f, // QUEST_SONG_SONATA
+ -61.0f, // QUEST_SONG_LULLABY
+ -44.0f, // QUEST_SONG_BOSSA_NOVA
+ -24.0f, // QUEST_SONG_ELEGY
+ -6.0f, // QUEST_SONG_OATH
+ -3.0f, // QUEST_SONG_SARIA
+ -78.0f, // QUEST_SONG_TIME
+ -61.0f, // QUEST_SONG_HEALING
+ -44.0f, // QUEST_SONG_EPONA
+ -24.0f, // QUEST_SONG_SOARING
+ -6.0f, // QUEST_SONG_STORMS
+ -3.0f, // QUEST_SONG_SUN
+ -68.0f, // QUEST_BOMBERS_NOTEBOOK
+ 22.0f, // QUEST_QUIVER
+ 83.0f, // QUEST_BOMB_BAG
+ -67.0f, // QUEST_SKULL_TOKEN
+ -21.0f, // QUEST_HEART_PIECE
};
-f32 D_8082BE28[] = {
- 33.0f, 18.0f, 18.0f, 0.0f, -23.0f, -23.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f,
- -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, 27.0f, -53.0f, -53.0f, 14.0f, 26.0f,
+f32 sQuestStatusCursorsY[] = {
+ 33.0f, // QUEST_REMAINS_ODOLWA
+ 18.0f, // QUEST_REMAINS_GOHT
+ 18.0f, // QUEST_REMAINS_GYORG
+ 0.0f, // QUEST_REMAINS_TWINMOLD
+ -23.0f, // QUEST_SHIELD
+ -23.0f, // QUEST_SWORD
+ -29.0f, // QUEST_SONG_SONATA
+ -29.0f, // QUEST_SONG_LULLABY
+ -29.0f, // QUEST_SONG_BOSSA_NOVA
+ -29.0f, // QUEST_SONG_ELEGY
+ -29.0f, // QUEST_SONG_OATH
+ -29.0f, // QUEST_SONG_SARIA
+ -11.0f, // QUEST_SONG_TIME
+ -11.0f, // QUEST_SONG_HEALING
+ -11.0f, // QUEST_SONG_EPONA
+ -11.0f, // QUEST_SONG_SOARING
+ -11.0f, // QUEST_SONG_STORMS
+ -11.0f, // QUEST_SONG_SUN
+ 27.0f, // QUEST_BOMBERS_NOTEBOOK
+ -53.0f, // QUEST_QUIVER
+ -53.0f, // QUEST_BOMB_BAG
+ 14.0f, // QUEST_SKULL_TOKEN
+ 26.0f, // QUEST_HEART_PIECE
};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808274DC.s")
+void KaleidoScope_UpdateCursorSize(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 index;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827A8C.s")
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->cursorVtx[2].v.ob[0] = -8;
+ pauseCtx->cursorVtx[1].v.ob[0] = pauseCtx->cursorVtx[3].v.ob[0] = pauseCtx->cursorVtx[0].v.ob[0] + 16;
-s16 D_8082BE84 = 0;
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->cursorVtx[1].v.ob[1] = 8;
+ pauseCtx->cursorVtx[2].v.ob[1] = pauseCtx->cursorVtx[3].v.ob[1] = pauseCtx->cursorVtx[0].v.ob[1] - 16;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827E08.s")
+ if (pauseCtx->cursorSpecialPos == 0) {
+ switch (pauseCtx->pageIndex) {
+ case PAUSE_ITEM:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_ITEM]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_ITEM]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Draw.s")
+ case PAUSE_MAP:
+ if (!sInDungeonScene) {
+ if (IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorX = sOwlWarpWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sOwlWarpWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ } else {
+ pauseCtx->cursorX = sWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ }
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorHeight = 10.0f;
+ pauseCtx->cursorWidth = 10.0f;
+ } else {
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ } else {
+ pauseCtx->cursorX = sDungeonMapCursorsX[pauseCtx->cursorPoint[PAUSE_MAP]];
+ pauseCtx->cursorY = sDungeonMapCursorsY[pauseCtx->cursorPoint[PAUSE_MAP]];
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] >= DUNGEON_FLOOR_INDEX_4) {
+ // Floors
+ pauseCtx->cursorWidth = 18.0f;
+ pauseCtx->cursorHeight = 12.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == DUNGEON_STRAY_FAIRIES) {
+ // Stray Fairies
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 40.0f;
+ } else {
+ // Map, Compass, Boss Key
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ }
+ break;
+
+ case PAUSE_QUEST:
+ if (!R_PAUSE_DBG_QUEST_CURSOR_ON) {
+ pauseCtx->cursorX = sQuestStatusCursorsX[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ pauseCtx->cursorY = sQuestStatusCursorsY[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ } else {
+ pauseCtx->cursorX = R_PAUSE_DBG_QUEST_CURSOR_X;
+ pauseCtx->cursorY = R_PAUSE_DBG_QUEST_CURSOR_Y;
+ }
+ pauseCtx->cursorHeight = 17.0f;
+ pauseCtx->cursorWidth = 17.0f;
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == QUEST_17) {
+ pauseCtx->cursorHeight = 25.0f;
+ pauseCtx->cursorWidth = 25.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SWORD) {
+ pauseCtx->cursorHeight = 18.0f;
+ pauseCtx->cursorWidth = 18.0f;
+ } else if ((pauseCtx->cursorSlot[pauseCtx->pageIndex] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SONG_SUN)) {
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 12.0f;
+ }
+ break;
+
+ case PAUSE_MASK:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_MASK]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_MASK]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ pauseCtx->cursorSpinPhase += 0x300;
+ } else {
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ pauseCtx->cursorX = -93.0f;
+ } else { // PAUSE_CURSOR_PAGE_RIGHT
+ pauseCtx->cursorX = 101.0f;
+ }
+ pauseCtx->cursorSpinPhase += 0x300;
+ pauseCtx->cursorHeight = 16.0f;
+ pauseCtx->cursorWidth = 16.0f;
+ pauseCtx->cursorY = -4.0f;
+ }
+
+ if (pauseCtx->cursorWidth < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorWidth = 0;
+ } else {
+ pauseCtx->cursorWidth -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorHeight < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorHeight = 0.0f;
+ } else {
+ pauseCtx->cursorHeight -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorShrinkRate != 0.0f) {
+ pauseCtx->cursorShrinkRate -= 1.0f;
+ }
+
+ sCursorCirclesX[0] = Math_SinS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorWidth;
+ sCursorCirclesX[1] = Math_SinS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[2] = Math_SinS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[3] = Math_SinS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorWidth;
+ sCursorCirclesY[0] = Math_CosS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorHeight;
+ sCursorCirclesY[1] = Math_CosS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[2] = Math_CosS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[3] = Math_CosS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorHeight;
+}
+
+void KaleidoScope_DrawCursor(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)))) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimR, sCursorPrimG, sCursorPrimB, 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvR, sCursorEnvG, sCursorEnvB, 255);
+
+ Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ for (i = 0; i < 4; i++) {
+ Matrix_Push();
+ Matrix_Translate(sCursorCirclesX[i], sCursorCirclesY[i], -50.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, &D_08064340, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_DrawGameOver(PlayState* play) {
+ static s16 sGameOverUlt = 0;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+
+ OPEN_DISPS(gfxCtx);
+
+ Gfx_SetupDL39_Opa(gfxCtx);
+
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT,
+ COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, sGameOverPrimR, sGameOverPrimG, sGameOverPrimB, sGameOverPrimAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, sGameOverEnvR, sGameOverEnvG, sGameOverEnvB, 255);
+
+ sGameOverUlt -= 2;
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP1Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverMaskTex, 256, 1, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, 5, G_TX_NOLOD, G_TX_NOLOD);
+
+ gDPSetTileSize(POLY_OPA_DISP++, 1, 0, sGameOverUlt & 0x7F, 252, (sGameOverUlt & 0x7F) + 124);
+
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x100, sGameOverRectPosY << 2, 0x200, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP2Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x200, sGameOverRectPosY << 2, 0x300, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP3Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x300, sGameOverRectPosY << 2, 0x400, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void KaleidoScope_Draw(PlayState* play) {
+ s32 pad;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x02, interfaceCtx->parameterSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0D, pauseCtx->iconItemLangSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0B, pauseCtx->iconItemVtxSegment);
+
+ if (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) {
+ KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
+
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ // Draw Default or Game Over Menus
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
+
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ KaleidoScope_DrawInfoPanel(play);
+ }
+
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_MAIN) {
+ KaleidoScope_DrawCursor(play);
+ }
+
+ if ((pauseCtx->state >= PAUSE_STATE_GAMEOVER_3) && (pauseCtx->state <= PAUSE_STATE_GAMEOVER_10) &&
+ (play->gameOverCtx.state != GAMEOVER_INACTIVE)) {
+ KaleidoScope_DrawGameOver(play);
+ }
+ } else {
+ // Draw Owl Warp Menu
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
+ KaleidoScope_DrawOwlWarpMapPage(play);
+
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+ KaleidoScope_DrawOwlWarpInfoPanel(play);
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) {
+ KaleidoScope_DrawCursor(play);
+ }
+ }
+ }
+
+ if ((pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY_INIT) || (pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY)) {
+ KaleidoScope_DrawInventoryEditor(play);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount) {
u32 rgb;
@@ -1641,10 +2778,10 @@ void KaleidoScope_UpdateOpening(PlayState* play) {
Interface_UpdateButtonsAlt(play, 1);
if (pauseCtx->cursorSpecialPos == 0) {
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
} else {
gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
@@ -1723,7 +2860,7 @@ void KaleidoScope_Update(PlayState* play) {
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
- gSegments[0x08] = PHYSICAL_TO_VIRTUAL(pauseCtx->iconItemSegment);
+ gSegments[0x08] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment);
for (itemId = 0; itemId <= ITEM_BOW_ARROW_FIRE; itemId++) {
if (!gPlayerFormItemRestrictions[(void)0, gSaveContext.save.playerForm][(s32)itemId]) {
@@ -1760,7 +2897,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
Interface_SetAButtonDoAction(play, DO_ACTION_INFO);
if (((void)0, gSaveContext.worldMapArea) < 0x16) {
- func_8082192C(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
+ Kaleido_LoadMapNameStaticLarge(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
}
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
@@ -1903,7 +3040,7 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_STATE_SAVEPROMPT:
switch (pauseCtx->savePromptState) {
- case PAUSE_SAVEPROMPT_STATE_0:
+ case PAUSE_SAVEPROMPT_STATE_APPEARING:
pauseCtx->roll -= 78.5f;
sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
@@ -1917,7 +3054,7 @@ void KaleidoScope_Update(PlayState* play) {
if (CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
if (pauseCtx->promptChoice != PAUSE_PROMPT_YES) {
Interface_SetAButtonDoAction(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
} else {
play_sound(NA_SE_SY_PIECE_OF_HEART);
Play_SaveCycleSceneFlags(&play->state);
@@ -1941,7 +3078,7 @@ void KaleidoScope_Update(PlayState* play) {
func_801A3AEC(0);
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
Interface_SetAButtonDoAction(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
D_8082B90C = pauseCtx->roll;
}
break;
@@ -1987,26 +3124,31 @@ void KaleidoScope_Update(PlayState* play) {
}
break;
- case PAUSE_SAVEPROMPT_STATE_2:
+ case PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU:
pauseCtx->roll += 78.5f;
sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+
if (pauseCtx->roll >= -314.0f) {
pauseCtx->state = PAUSE_STATE_MAIN;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->roll = -314.0f;
pauseCtx->itemPageRoll = pauseCtx->mapPageRoll = pauseCtx->questPageRoll =
pauseCtx->maskPageRoll = 0.0f;
Interface_SetAButtonDoAction(play, DO_ACTION_INFO);
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex + 1][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) ||
(pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT)) {
KaleidoScope_MoveCursorToSpecialPos(play, pauseCtx->cursorSpecialPos);
} else {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
}
}
break;
@@ -2304,7 +3446,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
Interface_SetAButtonDoAction(play, DO_ACTION_WARP);
worldMapCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
- func_80821900(pauseCtx->nameSegment, worldMapCursorPoint);
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, worldMapCursorPoint);
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
DmaMgr_SendRequest0(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static),
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index 1517dbcd1..6efdb337e 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -743,7 +743,7 @@
0x800B7170:("Actor_SetCameraHorseSetting",),
0x800B71DC:("Actor_MountHorse",),
0x800B7200:("func_800B7200",),
- 0x800B722C:("func_800B722C",),
+ 0x800B722C:("Actor_SpawnHorse",),
0x800B724C:("func_800B724C",),
0x800B7298:("func_800B7298",),
0x800B72E0:("func_800B72E0",),
@@ -1683,16 +1683,16 @@
0x800F37B0:("FireObj_Destroy",),
0x800F37F0:("FireObj_SetState2",),
0x800F3820:("FireObj_Update",),
- 0x800F3940:("func_800F3940",),
- 0x800F39B4:("func_800F39B4",),
- 0x800F3A64:("func_800F3A64",),
- 0x800F3B2C:("func_800F3B2C",),
- 0x800F3B68:("func_800F3B68",),
- 0x800F3C44:("func_800F3C44",),
- 0x800F3ED4:("func_800F3ED4",),
- 0x800F40A0:("func_800F40A0",),
- 0x800F415C:("func_800F415C",),
- 0x800F41E4:("func_800F41E4",),
+ 0x800F3940:("Horse_GetJumpingFencePathIndex",),
+ 0x800F39B4:("Horse_CopyPointFromPathList",),
+ 0x800F3A64:("Horse_IsValidSpawn",),
+ 0x800F3B2C:("Horse_ResetHorseData",),
+ 0x800F3B68:("Horse_IsValidSceneLayer",),
+ 0x800F3C44:("Horse_SpawnOverworld",),
+ 0x800F3ED4:("Horse_SpawnMinigame",),
+ 0x800F40A0:("Horse_Spawn",),
+ 0x800F415C:("Horse_RotateToPoint",),
+ 0x800F41E4:("Horse_IsActive",),
0x800F42A0:("Jpeg_ScheduleDecoderTask",),
0x800F43BC:("Jpeg_CopyToZbuffer",),
0x800F44F4:("Jpeg_GetUnalignedU16",),
@@ -1707,7 +1707,7 @@
0x800F4FC0:("Font_LoadMessageBoxEndIcon",),
0x800F5004:("Font_LoadOrderedFont",),
0x800F5090:("func_800F5090",),
- 0x800F50D4:("func_800F50D4",),
+ 0x800F50D4:("Environment_ZBufValToFixedPoint",),
0x800F510C:("Environment_Init",),
0x800F5954:("func_800F5954",),
0x800F5A8C:("Environment_LerpWeight",),
@@ -2748,17 +2748,17 @@
0x8013FD74:("View_ApplyPerspectiveToOverlay",),
0x80140024:("View_UpdateViewingMatrix",),
0x801400CC:("View_ApplyTo",),
- 0x80140260:("func_80140260",),
- 0x8014026C:("func_8014026C",),
- 0x80140730:("func_80140730",),
- 0x80140810:("func_80140810",),
- 0x80140898:("func_80140898",),
- 0x80140900:("func_80140900",),
- 0x8014090C:("func_8014090C",),
- 0x80140970:("func_80140970",),
- 0x80140CE0:("func_80140CE0",),
- 0x80140D04:("func_80140D04",),
- 0x80140D10:("func_80140D10",),
+ 0x80140260:("ViMode_LogPrint",),
+ 0x8014026C:("ViMode_Configure",),
+ 0x80140730:("ViMode_Save",),
+ 0x80140810:("ViMode_Load",),
+ 0x80140898:("ViMode_Init",),
+ 0x80140900:("ViMode_Destroy",),
+ 0x8014090C:("ViMode_ConfigureFeatures",),
+ 0x80140970:("ViMode_Update",),
+ 0x80140CE0:("VisCvg_Init",),
+ 0x80140D04:("VisCvg_Destroy",),
+ 0x80140D10:("VisCvg_Draw",),
0x80140E80:("func_80140E80",),
0x80140EA0:("func_80140EA0",),
0x80140EAC:("func_80140EAC",),
@@ -3225,15 +3225,15 @@
0x801780F0:("Mtx_SetTranslateScaleMtx",),
0x801781EC:("Mtx_SetRotationMtx",),
0x8017842C:("Mtx_SetTranslationRotationScaleMtx",),
- 0x80178750:("func_80178750",),
- 0x80178818:("func_80178818",),
- 0x80178978:("func_80178978",),
- 0x801789D4:("func_801789D4",),
- 0x801789EC:("SysCfb_GetFbPtr",),
+ 0x80178750:("SysCfb_SetLoResMode",),
+ 0x80178818:("SysCfb_SetHiResMode",),
+ 0x80178978:("SysCfb_Init",),
+ 0x801789D4:("SysCfb_Reset",),
+ 0x801789EC:("SysCfb_GetFramebuffer",),
0x80178A14:("SysCfb_GetZBuffer",),
- 0x80178A24:("func_80178A24",),
- 0x80178A34:("func_80178A34",),
- 0x80178A94:("func_80178A94",),
+ 0x80178A24:("SysCfb_GetWorkBuffer",),
+ 0x80178A34:("SysCfb_GetZBufferPixel",),
+ 0x80178A94:("SysCfb_GetZBufferInt",),
0x80178AC0:("func_80178AC0",),
0x80178C80:("CmpDma_GetFileInfo",),
0x80178D7C:("CmpDma_Decompress",),
@@ -3447,21 +3447,21 @@
0x801856FC:("Slowly_ThreadEntry",),
0x8018571C:("Slowly_Init",),
0x801857A0:("Slowly_Destroy",),
- 0x801857C0:("func_801857C0",),
- 0x801857D0:("func_801857D0",),
- 0x80185864:("func_80185864",),
- 0x80185908:("func_80185908",),
- 0x80185968:("func_80185968",),
- 0x801859F0:("func_801859F0",),
- 0x80185A2C:("func_80185A2C",),
- 0x80185B1C:("func_80185B1C",),
- 0x80185BE4:("func_80185BE4",),
+ 0x801857C0:("SysFlashrom_IsInit",),
+ 0x801857D0:("SysFlashrom_GetVendorStr",),
+ 0x80185864:("SysFlashrom_CheckFlashType",),
+ 0x80185908:("SysFlashrom_InitFlash",),
+ 0x80185968:("SysFlashrom_ReadData",),
+ 0x801859F0:("SysFlashrom_EraseSector",),
+ 0x80185A2C:("SysFlashrom_ExecWrite",),
+ 0x80185B1C:("SysFlashrom_AttemptWrite",),
+ 0x80185BE4:("SysFlashrom_NeedsToErase",),
0x80185C24:("func_80185C24",),
0x80185D40:("SysFlashrom_ThreadEntry",),
- 0x80185DDC:("func_80185DDC",),
- 0x80185EC4:("func_80185EC4",),
- 0x80185F04:("func_80185F04",),
- 0x80185F64:("func_80185F64",),
+ 0x80185DDC:("SysFlashrom_WriteDataAsync",),
+ 0x80185EC4:("SysFlashrom_IsBusy",),
+ 0x80185F04:("SysFlashrom_AwaitResult",),
+ 0x80185F64:("SysFlashrom_WriteDataSync",),
0x80185F90:("func_80185F90",),
0x80186A70:("osFlashGetAddr",),
0x80186AB8:("osFlashReInit",),
@@ -4218,28 +4218,28 @@
0x808204AC:("KaleidoScope_UpdateMaskCursor",),
0x80820FA4:("KaleidoScope_UpdateMaskEquip",),
0x80821730:("KaleidoScope_UpdatePrompt",),
- 0x80821900:("func_80821900",),
- 0x8082192C:("func_8082192C",),
- 0x80821958:("func_80821958",),
+ 0x80821900:("Kaleido_LoadMapNameStatic",),
+ 0x8082192C:("Kaleido_LoadMapNameStaticLarge",),
+ 0x80821958:("Kaleido_LoadItemNameStatic",),
0x80821984:("KaleidoScope_MoveCursorToSpecialPos",),
- 0x80821A04:("func_80821A04",),
+ 0x80821A04:("KaleidoScope_MoveCursorFromSpecialPos",),
0x80821AD4:("KaleidoScope_DrawTexQuadRGBA32",),
- 0x80821CC4:("func_80821CC4",),
+ 0x80821CC4:("KaleidoScope_SwitchPage",),
0x80821D84:("KaleidoScope_HandlePageToggles",),
0x80821F30:("KaleidoScope_DrawPageSections",),
0x808221DC:("KaleidoScope_DrawPages",),
- 0x80823350:("func_80823350",),
+ 0x80823350:("KaleidoScope_DrawInfoPanel",),
0x80824738:("KaleidoScope_UpdateNamePanel",),
0x808248D0:("KaleidoScope_DrawOwlWarpMapPage",),
- 0x80824B90:("func_80824B90",),
+ 0x80824B90:("KaleidoScope_DrawOwlWarpInfoPanel",),
0x808256E4:("KaleidoScope_UpdateOwlWarpNamePanel",),
0x8082585C:("KaleidoScope_UpdateSwitchPage",),
0x808259D4:("KaleidoScope_SetView",),
0x80825A50:("KaleidoScope_SetPageVertices",),
0x80825E28:("KaleidoScope_SetVertices",),
- 0x808274DC:("func_808274DC",),
- 0x80827A8C:("func_80827A8C",),
- 0x80827E08:("func_80827E08",),
+ 0x808274DC:("KaleidoScope_UpdateCursorSize",),
+ 0x80827A8C:("KaleidoScope_DrawCursor",),
+ 0x80827E08:("KaleidoScope_DrawGameOver",),
0x808283D8:("KaleidoScope_Draw",),
0x808286D8:("KaleidoScope_GrayOutTextureRGBA32",),
0x80828788:("KaleidoScope_UpdateOpening",),
@@ -9675,76 +9675,76 @@
0x80A10368:("EnSob1_ZoraShopkeeper_Draw",),
0x80A104E4:("EnSob1_GoronShopkeeper_Draw",),
0x80A10608:("EnSob1_BombShopkeeper_Draw",),
- 0x80A10FD0:("func_80A10FD0",),
- 0x80A11144:("func_80A11144",),
- 0x80A1143C:("func_80A1143C",),
- 0x80A115B4:("func_80A115B4",),
- 0x80A118F8:("func_80A118F8",),
- 0x80A11BF8:("func_80A11BF8",),
- 0x80A11EC0:("func_80A11EC0",),
- 0x80A1203C:("func_80A1203C",),
- 0x80A1213C:("func_80A1213C",),
- 0x80A121F4:("func_80A121F4",),
- 0x80A1222C:("func_80A1222C",),
- 0x80A122EC:("func_80A122EC",),
- 0x80A123A0:("func_80A123A0",),
- 0x80A124A0:("func_80A124A0",),
- 0x80A124FC:("func_80A124FC",),
- 0x80A125BC:("func_80A125BC",),
- 0x80A12660:("func_80A12660",),
- 0x80A126BC:("func_80A126BC",),
- 0x80A12774:("func_80A12774",),
- 0x80A12868:("func_80A12868",),
- 0x80A12954:("func_80A12954",),
- 0x80A12A64:("func_80A12A64",),
- 0x80A12B78:("func_80A12B78",),
- 0x80A12C48:("func_80A12C48",),
- 0x80A12D6C:("func_80A12D6C",),
- 0x80A12DF4:("func_80A12DF4",),
- 0x80A12E80:("func_80A12E80",),
- 0x80A12FE8:("func_80A12FE8",),
- 0x80A131F8:("func_80A131F8",),
- 0x80A132C8:("func_80A132C8",),
- 0x80A133A8:("func_80A133A8",),
- 0x80A13400:("func_80A13400",),
- 0x80A134B0:("func_80A134B0",),
- 0x80A134F4:("func_80A134F4",),
- 0x80A13564:("func_80A13564",),
+ 0x80A10FD0:("EnGo_InitSteam",),
+ 0x80A11144:("EnGo_DrawSteam",),
+ 0x80A1143C:("EnGo_InitDust",),
+ 0x80A115B4:("EnGo_DrawDust",),
+ 0x80A118F8:("EnGo_InitSnow",),
+ 0x80A11BF8:("EnGo_UpdateSnow",),
+ 0x80A11EC0:("EnGo_DrawSnow",),
+ 0x80A1203C:("EnGo_UpdateEffects",),
+ 0x80A1213C:("EnGo_DrawEffects",),
+ 0x80A121F4:("EnGo_CanSnowballHurtPlayer",),
+ 0x80A1222C:("EnGo_IsFallingAsleep",),
+ 0x80A122EC:("EnGo_UpdateFocus",),
+ 0x80A123A0:("EnGo_UpdateSnowballCollider",),
+ 0x80A124A0:("EnGo_UpdateMedigoronCollider",),
+ 0x80A124FC:("EnGo_UpdateRolledUpCollider",),
+ 0x80A125BC:("EnGo_UpdateFrozenCollider",),
+ 0x80A12660:("EnGo_UpdateStandingCollider",),
+ 0x80A126BC:("EnGo_UpdateCollider",),
+ 0x80A12774:("EnGo_UpdateTalking",),
+ 0x80A12868:("EnGo_DetectCollisions",),
+ 0x80A12954:("EnGo_UpdateSpringArrivalCutscene",),
+ 0x80A12A64:("EnGo_UpdateAnimationToCurrent",),
+ 0x80A12B78:("EnGo_UpdateSfx",),
+ 0x80A12C48:("EnGo_ChangeAnim",),
+ 0x80A12D6C:("EnGo_UpdateEyes",),
+ 0x80A12DF4:("EnGo_UpdateShiverSurprisedAnimation",),
+ 0x80A12E80:("EnGo_UpdateGraveyardAttentionTargetAndReactions",),
+ 0x80A12FE8:("EnGo_UpdateRotationToTarget",),
+ 0x80A131F8:("EnGo_UpdateAttentionTargetAndReactions",),
+ 0x80A132C8:("EnGo_GravemakerIdle",),
+ 0x80A133A8:("EnGo_FrozenIdle",),
+ 0x80A13400:("EnGo_FindGravemaker",),
+ 0x80A134B0:("EnGo_UpdateMedigoronColliderRadius",),
+ 0x80A134F4:("EnGo_ChangeCutscene",),
+ 0x80A13564:("EnGo_HandleGatekeeperPoundCutscene",),
0x80A136B8:("EnGo_RequestQuake",),
- 0x80A13728:("func_80A13728",),
- 0x80A137C0:("func_80A137C0",),
- 0x80A139E4:("func_80A139E4",),
- 0x80A13B1C:("func_80A13B1C",),
- 0x80A13E80:("func_80A13E80",),
- 0x80A14018:("func_80A14018",),
- 0x80A14104:("func_80A14104",),
- 0x80A141D4:("func_80A141D4",),
- 0x80A1428C:("func_80A1428C",),
- 0x80A14324:("func_80A14324",),
- 0x80A143A8:("func_80A143A8",),
- 0x80A14430:("func_80A14430",),
- 0x80A1449C:("func_80A1449C",),
- 0x80A144F4:("func_80A144F4",),
- 0x80A145AC:("func_80A145AC",),
- 0x80A14668:("func_80A14668",),
- 0x80A146CC:("func_80A146CC",),
- 0x80A14798:("func_80A14798",),
- 0x80A149B0:("func_80A149B0",),
- 0x80A14B30:("func_80A14B30",),
- 0x80A14E14:("func_80A14E14",),
- 0x80A14E74:("func_80A14E74",),
- 0x80A14EB0:("func_80A14EB0",),
- 0x80A14FC8:("func_80A14FC8",),
- 0x80A153FC:("func_80A153FC",),
- 0x80A15684:("func_80A15684",),
- 0x80A157C4:("func_80A157C4",),
+ 0x80A13728:("EnGo_CreateGatekeeperPoundEffects",),
+ 0x80A137C0:("EnGo_DrawIceBlockWhenFrozen",),
+ 0x80A139E4:("EnGo_MakeSteam",),
+ 0x80A13B1C:("EnGo_HandleOpenShrineCutscene",),
+ 0x80A13E80:("EnGo_HandleGivePowderKegCutscene",),
+ 0x80A14018:("EnGo_ChangeToStretchingAnimation",),
+ 0x80A14104:("EnGo_ChangeToSpectatingAnimation",),
+ 0x80A141D4:("EnGo_ChangeToFrozenAnimation",),
+ 0x80A1428C:("EnGo_ChangeToSnowballAnimation",),
+ 0x80A14324:("EnGo_ChangeToCoveringEarsAnimation",),
+ 0x80A143A8:("EnGo_ChangeToShiveringAnimation",),
+ 0x80A14430:("EnGo_SetupAthletic",),
+ 0x80A1449C:("EnGo_SetupSpectator",),
+ 0x80A144F4:("EnGo_SetupGatekeeper",),
+ 0x80A145AC:("EnGo_SetupGraveyardGoron",),
+ 0x80A14668:("EnGo_SetupShrineGoron",),
+ 0x80A146CC:("EnGo_SetupMedigoron",),
+ 0x80A14798:("EnGo_SetupInitialAction",),
+ 0x80A149B0:("EnGo_Idle",),
+ 0x80A14B30:("EnGo_Sleep",),
+ 0x80A14E14:("EnGo_Frozen",),
+ 0x80A14E74:("EnGo_AwaitThaw",),
+ 0x80A14EB0:("EnGo_Thaw",),
+ 0x80A14FC8:("EnGo_HandleSpringArrivalCutscene",),
+ 0x80A153FC:("EnGo_Snowball",),
+ 0x80A15684:("EnGo_GetMsgEventScript",),
+ 0x80A157C4:("EnGo_Talk",),
0x80A1590C:("EnGo_Init",),
0x80A15960:("EnGo_Destroy",),
0x80A159B0:("EnGo_Update",),
- 0x80A15B80:("func_80A15B80",),
+ 0x80A15B80:("EnGo_Draw_NoSkeleton",),
0x80A15D04:("EnGo_OverrideLimbDraw",),
0x80A15E38:("EnGo_TransfromLimbDraw",),
- 0x80A15FEC:("func_80A15FEC",),
+ 0x80A15FEC:("EnGo_Draw",),
0x80A16D40:("EnRaf_ClearPixelTeeth",),
0x80A16D6C:("EnRaf_ClearPixelPetal",),
0x80A16D90:("EnRaf_Init",),
@@ -11971,7 +11971,7 @@
0x80AC6740:("TransitionWipe3_Start",),
0x80AC687C:("TransitionWipe3_Init",),
0x80AC68A8:("TransitionWipe3_Destroy",),
- 0x80AC68B4:("func_80AC68B4",),
+ 0x80AC68B4:("TransitionWipe3_UpdateScrollY",),
0x80AC68E0:("TransitionWipe3_Update",),
0x80AC69F8:("TransitionWipe3_Draw",),
0x80AC6BE4:("TransitionWipe3_IsDone",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index 344ee509d..33f63d1f1 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -933,22 +933,12 @@
0x801BD8FC:("sFireObjColors","FireObjColors","[1]",0x08),
0x801BD904:("sFireObjLightParams","FireObjLightParams","[1]",0x08),
0x801BD910:("gGameStateOverlayTable","GameStateOverlay","[7]",0x150),
- 0x801BDA60:("graphNumGameStates","UNK_TYPE4","",0x4),
- 0x801BDA70:("D_801BDA70","UNK_TYPE2","",0x2),
- 0x801BDA74:("D_801BDA74","UNK_TYPE2","",0x2),
- 0x801BDA78:("D_801BDA78","UNK_TYPE2","",0x2),
- 0x801BDA7C:("D_801BDA7C","UNK_TYPE2","",0x2),
- 0x801BDA9C:("D_801BDA9C","UNK_TYPE4","",0x4),
- 0x801BDAA0:("D_801BDAA0","UNK_TYPE4","",0x4),
- 0x801BDAA4:("D_801BDAA4","UNK_TYPE4","",0x4),
- 0x801BDAA8:("D_801BDAA8","UNK_TYPE2","",0x2),
- 0x801BDAAA:("D_801BDAAA","UNK_TYPE2","",0x2),
- 0x801BDAAC:("D_801BDAAC","UNK_TYPE2","",0x2),
- 0x801BDAAE:("D_801BDAAE","UNK_TYPE2","",0x2),
- 0x801BDAB0:("D_801BDAB0","UNK_TYPE2","",0x2),
- 0x801BDAB2:("D_801BDAB2","UNK_TYPE2","",0x2),
- 0x801BDAB4:("D_801BDAB4","UNK_TYPE2","",0x2),
- 0x801BDAB6:("D_801BDAB6","UNK_TYPE2","",0x2),
+ 0x801BDA60:("gGraphNumGameStates","UNK_TYPE4","",0x4),
+ 0x801BDA70:("sHorseValidScenes","struct_801BDAA8","[11]",0x2C),
+ 0x801BDA9C:("gHorseIsMounted","s32","",0x4),
+ 0x801BDAA0:("D_801BDAA0","s32","",0x4),
+ 0x801BDAA4:("gHorsePlayedEponasSong","s32","",0x4),
+ 0x801BDAA8:("sHorseValidSceneLayers","struct_801BDAA8","[4]",0x10),
0x801BDAC0:("D_801BDAC0","UNK_TYPE4","",0x4),
0x801BDAC4:("D_801BDAC4","UNK_TYPE4","",0x4),
0x801BDAC8:("D_801BDAC8","UNK_TYPE4","",0x4),
@@ -1124,30 +1114,30 @@
0x801BFB1C:("sMagicArrowEffectsG","UNK_TYPE1","",0x1),
0x801BFB24:("sMagicArrowEffectsB","UNK_TYPE1","",0x1),
0x801BFB2C:("sThreeDayClockAlpha","UNK_TYPE2","",0x2),
- 0x801BFB30:("D_801BFB30","UNK_TYPE2","",0x2),
- 0x801BFB34:("D_801BFB34","UNK_TYPE2","",0x2),
+ 0x801BFB30:("sClockAlphaTimer1","UNK_TYPE2","",0x2),
+ 0x801BFB34:("sClockAlphaTimer2","UNK_TYPE2","",0x2),
0x801BFB38:("sThreeDayClockHours","UNK_TYPE1","",0x1),
0x801BFB6C:("sThreeDayClockHourTextures","UNK_TYPE1","",0x1),
- 0x801BFBCC:("D_801BFBCC","UNK_TYPE2","",0x2),
- 0x801BFBD0:("D_801BFBD0","UNK_TYPE2","",0x2),
- 0x801BFBD4:("D_801BFBD4","UNK_TYPE2","",0x2),
- 0x801BFBD8:("D_801BFBD8","UNK_TYPE2","",0x2),
- 0x801BFBDC:("D_801BFBDC","UNK_TYPE2","",0x2),
- 0x801BFBE0:("D_801BFBE0","UNK_TYPE2","",0x2),
- 0x801BFBE4:("D_801BFBE4","UNK_TYPE2","",0x2),
- 0x801BFBE8:("D_801BFBE8","UNK_TYPE2","",0x2),
- 0x801BFBEC:("D_801BFBEC","UNK_TYPE1","",0x1),
- 0x801BFBF0:("D_801BFBF0","UNK_TYPE1","",0x1),
- 0x801BFBF4:("D_801BFBF4","UNK_TYPE1","",0x1),
- 0x801BFBF8:("D_801BFBF8","UNK_TYPE1","",0x1),
- 0x801BFBFC:("D_801BFBFC","UNK_TYPE1","",0x1),
- 0x801BFC00:("D_801BFC00","UNK_TYPE1","",0x1),
- 0x801BFC04:("D_801BFC04","UNK_TYPE1","",0x1),
- 0x801BFC08:("D_801BFC08","UNK_TYPE1","",0x1),
- 0x801BFC0C:("D_801BFC0C","UNK_TYPE1","",0x1),
- 0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1),
+ 0x801BFBCC:("sClockInvDiamondPrimRed","UNK_TYPE2","",0x2),
+ 0x801BFBD0:("sClockInvDiamondPrimGreen","UNK_TYPE2","",0x2),
+ 0x801BFBD4:("sClockInvDiamondPrimBlue","UNK_TYPE2","",0x2),
+ 0x801BFBD8:("sClockInvDiamondEnvRed","UNK_TYPE2","",0x2),
+ 0x801BFBDC:("sClockInvDiamondEnvGreen","UNK_TYPE2","",0x2),
+ 0x801BFBE0:("sClockInvDiamondEnvBlue","UNK_TYPE2","",0x2),
+ 0x801BFBE4:("sClockInvDiamondTimer","UNK_TYPE2","",0x2),
+ 0x801BFBE8:("sClockInvDiamondTargetIndex","UNK_TYPE2","",0x2),
+ 0x801BFBEC:("sClockInvDiamondPrimRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF0:("sClockInvDiamondPrimGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF4:("sClockInvDiamondPrimBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF8:("sClockInvDiamondEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBFC:("sClockInvDiamondEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC00:("sClockInvDiamondEnvBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFC04:("sFinalHoursClockDigitsRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC08:("sFinalHoursClockFrameEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC0C:("sFinalHoursClockFrameEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC10:("sFinalHoursClockFrameEnvBlueTargets","UNK_TYPE1","",0x1),
0x801BFC14:("sFinalHoursDigitTextures","UNK_TYPE1","",0x1),
- 0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1),
+ 0x801BFC40:("sFinalHoursDigitSlotPosXOffset","UNK_TYPE1","",0x1),
0x801BFC50:("sPerfectLettersType1OffScreenAngles","UNK_TYPE2","",0x2),
0x801BFC60:("sPerfectLettersType1PrimColorTargets","s16","[6]",0xC),
0x801BFC6C:("sPerfectLettersType2SpellingOffsetsX","UNK_TYPE4","",0x4),
@@ -1935,7 +1925,7 @@
0x801C5EB0:("D_801C5EB0","UNK_TYPE4","",0x4),
0x801C5EC4:("D_801C5EC4","UNK_TYPE2","",0x2),
0x801C5F44:("D_801C5F44","UNK_TYPE4","",0x4),
- 0x801C5FC0:("D_801C5FC0","u32","[452]",0x710),
+ 0x801C5FC0:("sPersistentCycleFlags","u32","[452]",0x710),
0x801C66D0:("D_801C66D0","UNK_TYPE2","",0x2),
0x801C6798:("D_801C6798","UNK_TYPE4","",0x4),
0x801C67B0:("gAmmoItems","UNK_TYPE1","",0x1),
@@ -1967,7 +1957,7 @@
0x801C6A8C:("D_801C6A8C","UNK_TYPE2","",0x2),
0x801C6A90:("D_801C6A90","UNK_TYPE2","",0x2),
0x801C6A94:("D_801C6A94","UNK_TYPE2","",0x2),
- 0x801C6A98:("D_801C6A98","UNK_TYPE1","",0x1),
+ 0x801C6A98:("gPageSwitchNextButtonStatus","UNK_TYPE1","",0x1),
0x801C6AB8:("D_801C6AB8","UNK_TYPE1","",0x1),
0x801C6B28:("D_801C6B28","UNK_TYPE1","",0x1),
0x801C6B98:("D_801C6B98","UNK_TYPE1","",0x1),
@@ -4051,7 +4041,7 @@
0x801F8010:("D_801F8010","struct_801F8010","",0x10),
0x801F8020:("sVisZbuf","VisZbuf","",0x10),
0x801F8030:("sMonoColors","VisMono","",0x18),
- 0x801F8048:("D_801F8048","UNK_TYPE1","",0x1),
+ 0x801F8048:("D_801F8048","ViMode","",0x88),
0x801F80D0:("sGraphFaultAddrConvClient","FaultAddrConvClient","",0xc),
0x801F80E0:("sGraphFaultClient","FaultClient","",0x10),
0x801F80F0:("gGfxMasterDL","Gfx*","",0x4),
@@ -4094,30 +4084,30 @@
0x801FBB14:("D_801FBB14","UNK_TYPE1","",0x1),
0x801FBB20:("gRDPTotalTime","UNK_TYPE1","",0x1),
0x801FBB28:("D_801FBB28","UNK_TYPE1","",0x1),
- 0x801FBB30:("D_801FBB30","OSViMode","",0x50),
+ 0x801FBB30:("sNotebookViMode","OSViMode","",0x50),
0x801FBB80:("gFramebuffers","u32*","[2]",0x8),
- 0x801FBB88:("D_801FBB88","OSViMode*","",0x4),
+ 0x801FBB88:("gActiveViMode","OSViMode*","",0x4),
0x801FBB8C:("gZBufferPtr","u16*","",0x4),
- 0x801FBB90:("D_801FBB90","UNK_TYPE4","",0x4),
+ 0x801FBB90:("gWorkBuffer","UNK_TYPE4","",0x4),
0x801FBB94:("gGfxSPTaskOutputBufferPtr","UNK_TYPE1","",0x1),
- 0x801FBB98:("gGfxSPTaskOutputBufferSize","UNK_TYPE1","",0x1),
- 0x801FBB9C:("D_801FBB9C","UNK_TYPE1","",0x1),
- 0x801FBBA0:("D_801FBBA0","UNK_TYPE1","",0x1),
- 0x801FBBA4:("gZBuffer","u16*","",0x4),
- 0x801FBBA8:("gWorkBuffer","u16**","",0x4),
- 0x801FBBAC:("gGfxSPTaskOutputBuffer","u16**","",0x4),
- 0x801FBBB0:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
- 0x801FBBB4:("D_801FBBB4","UNK_TYPE1","",0x1),
- 0x801FBBB8:("D_801FBBB8","UNK_TYPE1","",0x1),
- 0x801FBBBC:("D_801FBBBC","UNK_TYPE1","",0x1),
- 0x801FBBC0:("D_801FBBC0","UNK_TYPE1","",0x1),
- 0x801FBBC4:("gGfxSPTaskOutputBuffer2","UNK_TYPE1","",0x1),
- 0x801FBBC8:("gGfxSPTaskOutputBufferEnd2","UNK_TYPE1","",0x1),
- 0x801FBBCC:("D_801FBBCC","UNK_TYPE2","",0x2),
- 0x801FBBCE:("D_801FBBCE","UNK_TYPE2","",0x2),
- 0x801FBBD0:("D_801FBBD0","UNK_TYPE1","",0x1),
- 0x801FBBD2:("D_801FBBD2","UNK_TYPE1","",0x1),
- 0x801FBBD4:("D_801FBBD4","UNK_TYPE1","",0x1),
+ 0x801FBB98:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
+ 0x801FBB9C:("sCfbLoRes1","UNK_TYPE1","",0x1),
+ 0x801FBBA0:("sCfbLoRes0","UNK_TYPE1","",0x1),
+ 0x801FBBA4:("gZBufferLoRes","u16*","",0x4),
+ 0x801FBBA8:("gWorkBufferLoRes","u16**","",0x4),
+ 0x801FBBAC:("gGfxSPTaskOutputBufferLoRes","u16**","",0x4),
+ 0x801FBBB0:("gGfxSPTaskOutputBufferEndLoRes","UNK_TYPE1","",0x1),
+ 0x801FBBB4:("sCfbHiRes1","UNK_TYPE1","",0x1),
+ 0x801FBBB8:("sCfbHiRes0","UNK_TYPE1","",0x1),
+ 0x801FBBBC:("gZBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC0:("gWorkBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC4:("gGfxSPTaskOutputBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC8:("gGfxSPTaskOutputBufferEndHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBCC:("gCfbWidth","UNK_TYPE2","",0x2),
+ 0x801FBBCE:("gCfbHeight","UNK_TYPE2","",0x2),
+ 0x801FBBD0:("gCfbLeftAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD2:("gCfbUpperAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD4:("gSysCfbHiResEnabled","UNK_TYPE1","",0x1),
0x801FBBE0:("sDmaBuffer","u32","[2]",0x8),
0x801FBBF0:("D_801FBBF0","Vec3f","",0xc),
0x801FBC00:("Math3D_ColSphereTri_line","LineSegment","",0x18),
@@ -4193,14 +4183,14 @@
0x801FBDE8:("D_801FBDE8","Vec3f","",0xc),
0x801FBE00:("sMatrixStack","MtxF*","",0x4),
0x801FBE04:("sCurrentMatrix","MtxF*","",0x4),
- 0x801FBE10:("D_801FBE10","UNK_TYPE1","",0x1),
- 0x801FBE28:("D_801FBE28","UNK_TYPE1","",0x1),
- 0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1),
- 0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4),
+ 0x801FBE10:("sFlashromMesgQueue","UNK_TYPE1","",0x1),
+ 0x801FBE28:("sFlashromMesg","UNK_TYPE1","",0x1),
+ 0x801FBE2C:("sFlashromIsInit","UNK_TYPE1","",0x1),
+ 0x801FBE30:("sFlashromVendor","UNK_TYPE4","",0x4),
0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000),
0x801FCE38:("sSysFlashromStackInfo","StackEntry","",0x1c),
0x801FCE58:("sSysFlashromThread","OSThread","",0x1b0),
- 0x801FD008:("D_801FD008","s80185D40","",0x2c),
+ 0x801FD008:("sFlashromRequest","s80185D40","",0x2c),
0x801FD034:("D_801FD034","OSMesg","",0x4),
0x801FD040:("D_801FD040","s32","",0x10),
0x801FD050:("D_801FD050","OSIoMesg","",0x18),
@@ -4638,7 +4628,7 @@
0x80816004:("sDayRightTextures","TexturePtr","[4]",0x10),
0x80816014:("sHoursLeftTextures","TexturePtr","[3]",0xC),
0x8082AED0:("sQuestRemainsColorTimerInit","UNK_TYPE1","",0x1),
- 0x8082AED8:("sQuestHpColorTimerInit","UNK_TYPE1","",0x1),
+ 0x8082AED8:("sQuestHpColorTimerInits","UNK_TYPE1","",0x1),
0x8082AEE0:("sQuestSongPlayedOcarinaButtonsNum","UNK_TYPE2","",0x2),
0x8082AEE4:("sQuestSongPlayedOcarinaButtons","UNK_TYPE1","",0x1),
0x8082AEF0:("sQuestSongPlayedOcarinaButtonsAlpha","UNK_TYPE2","",0x2),
@@ -4744,7 +4734,7 @@
0x8082B918:("sPauseCursorLeftX","UNK_TYPE2","",0x2),
0x8082B91C:("sPauseCursorRightX","UNK_TYPE2","",0x2),
0x8082B920:("D_8082B920","UNK_TYPE2","",0x2),
- 0x8082B924:("D_8082B924","UNK_TYPE2","",0x2),
+ 0x8082B924:("sPauseZRCursorColorTimerInits","UNK_TYPE2","",0x2),
0x8082B944:("sGameOverRectPosY","UNK_TYPE2","",0x2),
0x8082B948:("sCursorPrimColorTarget","UNK_TYPE2","",0x2),
0x8082B96C:("sCursorEnvColorTarget","UNK_TYPE2","",0x2),
@@ -4752,12 +4742,12 @@
0x8082B994:("sCursorColorTargetIndex","UNK_TYPE2","",0x2),
0x8082B998:("D_8082B998","UNK_TYPE1","",0x1),
0x8082B9A8:("D_8082B9A8","UNK_TYPE1","",0x1),
- 0x8082B9B8:("D_8082B9B8","UNK_TYPE1","",0x1),
- 0x8082B9C8:("D_8082B9C8","UNK_TYPE2","",0x2),
- 0x8082B9CC:("D_8082B9CC","UNK_TYPE2","",0x2),
- 0x8082B9D0:("D_8082B9D0","UNK_TYPE1","",0x1),
- 0x8082B9E0:("D_8082B9E0","UNK_TYPE2","",0x2),
- 0x8082B9E4:("D_8082B9E4","UNK_TYPE2","",0x2),
+ 0x8082B9B8:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9C8:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9CC:("sPauseZRCursorColorIndex","UNK_TYPE2","",0x2),
+ 0x8082B9D0:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9E0:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9E4:("sPauseZRCursorColorIndex","UNK_TYPE2","",0x2),
0x8082B9E8:("sVtxPageMaskQuadsX","UNK_TYPE1","",0x1),
0x8082B9EC:("sVtxPageItemQuadsX","UNK_TYPE1","",0x1),
0x8082B9F0:("sVtxPageMapDungeonQuadsX","UNK_TYPE1","",0x1),
@@ -4789,17 +4779,17 @@
0x8082BBC4:("sQuestVtxRectTop","UNK_TYPE2","",0x2),
0x8082BC14:("sQuestVtxWidths","UNK_TYPE2","",0x2),
0x8082BC64:("sQuestVtxHeights","UNK_TYPE2","",0x2),
- 0x8082BCB4:("D_8082BCB4","UNK_TYPE1","",0x1),
- 0x8082BCCC:("D_8082BCCC","UNK_TYPE1","",0x1),
- 0x8082BCDC:("D_8082BCDC","UNK_TYPE1","",0x1),
- 0x8082BD08:("D_8082BD08","UNK_TYPE1","",0x1),
- 0x8082BD34:("D_8082BD34","UNK_TYPE1","",0x1),
- 0x8082BD5C:("D_8082BD5C","UNK_TYPE1","",0x1),
- 0x8082BD84:("D_8082BD84","UNK_TYPE1","",0x1),
- 0x8082BDA8:("D_8082BDA8","UNK_TYPE1","",0x1),
- 0x8082BDCC:("D_8082BDCC","UNK_TYPE1","",0x1),
- 0x8082BE28:("D_8082BE28","UNK_TYPE1","",0x1),
- 0x8082BE84:("D_8082BE84","UNK_TYPE2","",0x2),
+ 0x8082BCB4:("sItemMaskCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BCCC:("sItemMaskCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BCDC:("sWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD08:("sWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD34:("sOwlWarpWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD5C:("sOwlWarpWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD84:("sDungeonMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BDA8:("sDungeonMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BDCC:("sQuestStatusCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BE28:("sQuestStatusCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BE84:("sGameOverUlt","UNK_TYPE2","",0x2),
0x8082BE88:("sCursorPointsToOcarinaModes","UNK_TYPE1","",0x1),
0x8082BE9C:("sUnpausedHudVisibility","UNK_TYPE2","",0x2),
0x8082BEA0:("sNextMainState","UNK_TYPE2","",0x2),
@@ -4921,23 +4911,23 @@
0x8082C0E4:("jtbl_8082C0E4","UNK_PTR","",0x4),
0x8082C148:("jtbl_8082C148","UNK_PTR","",0x4),
0x8082C18C:("jtbl_8082C18C","UNK_PTR","",0x4),
- 0x8082DA50:("D_8082DA50","UNK_TYPE1","",0x1),
- 0x8082DA52:("D_8082DA52","UNK_TYPE1","",0x1),
- 0x8082DA54:("D_8082DA54","UNK_TYPE1","",0x1),
- 0x8082DA56:("D_8082DA56","UNK_TYPE1","",0x1),
+ 0x8082DA50:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA52:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA54:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA56:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
0x8082DA58:("sUnpausedButtonStatus","UNK_TYPE1","",0x1),
- 0x8082DA60:("D_8082DA60","f32","",0x4),
+ 0x8082DA60:("sCursorCirclesX","f32","",0x4),
0x8082DA64:("D_8082DA64","f32","",0x4),
0x8082DA68:("D_8082DA68","f32","",0x4),
0x8082DA6C:("D_8082DA6C","f32","",0x4),
- 0x8082DA70:("D_8082DA70","f32","",0x4),
+ 0x8082DA70:("sCursorCirclesY","f32","",0x4),
0x8082DA74:("D_8082DA74","f32","",0x4),
0x8082DA78:("D_8082DA78","f32","",0x4),
0x8082DA7C:("D_8082DA7C","f32","",0x4),
- 0x8082DA80:("D_8082DA80","UNK_TYPE1","",0x1),
- 0x8082DA82:("D_8082DA82","UNK_TYPE1","",0x1),
- 0x8082DA84:("D_8082DA84","UNK_TYPE1","",0x1),
- 0x8082DA86:("D_8082DA86","UNK_TYPE1","",0x1),
+ 0x8082DA80:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA82:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA84:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA86:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
0x8085B9F0:("D_8085B9F0","UNK_TYPE1","",0x1),
0x8085BA08:("D_8085BA08","UNK_TYPE1","",0x1),
0x8085BA20:("D_8085BA20","UNK_TYPE1","",0x1),
@@ -12850,15 +12840,14 @@
0x80AC65B0:("D_80AC65B0","UNK_TYPE1","",0x1),
0x80AC66A8:("TransitionWipe1_InitVars","UNK_PTR","",0x4),
0x80AC66D0:("D_80AC66D0","f32","",0x4),
- 0x80AC6C60:("D_80AC6C60","UNK_TYPE1","",0x1),
- 0x80AC7060:("D_80AC7060","UNK_TYPE1","",0x1),
- 0x80AC7460:("D_80AC7460","UNK_TYPE1","",0x1),
- 0x80AC7860:("D_80AC7860","UNK_TYPE1","",0x1),
- 0x80AC7C60:("D_80AC7C60","UNK_TYPE1","",0x1),
- 0x80AC8060:("D_80AC8060","UNK_TYPE1","",0x1),
- 0x80AC8250:("D_80AC8250","UNK_TYPE1","",0x1),
- 0x80AC8280:("D_80AC8280","UNK_TYPE1","",0x1),
- 0x80AC8350:("D_80AC8350","UNK_PTR","",0x4),
+ 0x80AC6C60:("fbdemo_tex_000520","UNK_TYPE1","",0x1),
+ 0x80AC7060:("fbdemo_tex_000920","UNK_TYPE1","",0x1),
+ 0x80AC7460:("fbdemo_tex_000D20","UNK_TYPE1","",0x1),
+ 0x80AC7860:("fbdemo_tex_001120","UNK_TYPE1","",0x1),
+ 0x80AC7C60:("fbdemo_tex_001520","UNK_TYPE1","",0x1),
+ 0x80AC8060:("sTransWipe3Vtx","UNK_TYPE1","",0x1),
+ 0x80AC8280:("sTransWipe3DL","UNK_TYPE1","",0x1),
+ 0x80AC8350:("sTransWipe3Textures","TexturePtr[]","8",0x4),
0x80AC8370:("TransitionWipe3_InitVars","UNK_PTR","",0x4),
0x80AC83A0:("D_80AC83A0","f32","",0x4),
0x80AC8650:("TransitionWipe4_InitVars","UNK_PTR","",0x4),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index f3362316e..b8b5f6972 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -742,6 +742,12 @@ wordReplace = {
"func_80102544": "LightContext_SetFog",
+ "func_800F3A64": "Horse_IsValidSpawn",
+ "func_800F3B2C": "Horse_ResetHorseData",
+ "func_800F40A0": "Horse_Spawn",
+ "func_800F415C": "Horse_RotateToPoint",
+ "func_800F41E4": "Horse_IsActive",
+
"Padmgr_GetControllerBitmask": "PadMgr_GetValidControllersMask",
"func_80174F24": "PadMgr_SetRumbleRetraceCallback",
"func_80174F44": "PadMgr_UnsetRumbleRetraceCallback",
@@ -1070,6 +1076,9 @@ wordReplace = {
"D_801D1E20": "gIdentityMtxF",
"sSetupDL": "gSetupDLs",
+ "D_801BDA9C": "gHorseIsMounted",
+ "D_801BDAA4": "gHorsePlayedEponasSong",
+
# Macros
"CUR_EQUIP_VALUE_VOID": "GET_CUR_EQUIP_VALUE",
"CUR_UPG_VALUE_VOID": "GET_CUR_UPG_VALUE",
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 261b5a833..c7d8cdd4d 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -257,7 +257,7 @@ asm/non_matchings/code/z_actor/func_800B715C.s,func_800B715C,0x800B715C,0x5
asm/non_matchings/code/z_actor/Actor_SetCameraHorseSetting.s,Actor_SetCameraHorseSetting,0x800B7170,0x1B
asm/non_matchings/code/z_actor/Actor_MountHorse.s,Actor_MountHorse,0x800B71DC,0x9
asm/non_matchings/code/z_actor/func_800B7200.s,func_800B7200,0x800B7200,0xB
-asm/non_matchings/code/z_actor/func_800B722C.s,func_800B722C,0x800B722C,0x8
+asm/non_matchings/code/z_actor/Actor_SpawnHorse.s,Actor_SpawnHorse,0x800B722C,0x8
asm/non_matchings/code/z_actor/func_800B724C.s,func_800B724C,0x800B724C,0x13
asm/non_matchings/code/z_actor/func_800B7298.s,func_800B7298,0x800B7298,0x12
asm/non_matchings/code/z_actor/func_800B72E0.s,func_800B72E0,0x800B72E0,0x6
@@ -1197,16 +1197,16 @@ asm/non_matchings/code/z_fireobj/FireObj_Init.s,FireObj_Init,0x800F36CC,0x39
asm/non_matchings/code/z_fireobj/FireObj_Fini.s,FireObj_Fini,0x800F37B0,0x10
asm/non_matchings/code/z_fireobj/FireObj_SetState2.s,FireObj_SetState2,0x800F37F0,0xC
asm/non_matchings/code/z_fireobj/FireObj_Update.s,FireObj_Update,0x800F3820,0x48
-asm/non_matchings/code/z_horse/func_800F3940.s,func_800F3940,0x800F3940,0x1D
-asm/non_matchings/code/z_horse/func_800F39B4.s,func_800F39B4,0x800F39B4,0x2C
-asm/non_matchings/code/z_horse/func_800F3A64.s,func_800F3A64,0x800F3A64,0x32
-asm/non_matchings/code/z_horse/func_800F3B2C.s,func_800F3B2C,0x800F3B2C,0xF
-asm/non_matchings/code/z_horse/func_800F3B68.s,func_800F3B68,0x800F3B68,0x37
-asm/non_matchings/code/z_horse/func_800F3C44.s,func_800F3C44,0x800F3C44,0xA4
-asm/non_matchings/code/z_horse/func_800F3ED4.s,func_800F3ED4,0x800F3ED4,0x73
-asm/non_matchings/code/z_horse/func_800F40A0.s,func_800F40A0,0x800F40A0,0x2F
-asm/non_matchings/code/z_horse/func_800F415C.s,func_800F415C,0x800F415C,0x22
-asm/non_matchings/code/z_horse/func_800F41E4.s,func_800F41E4,0x800F41E4,0x2F
+asm/non_matchings/code/z_horse/Horse_GetJumpingFencePathIndex.s,Horse_GetJumpingFencePathIndex,0x800F3940,0x1D
+asm/non_matchings/code/z_horse/Horse_CopyPointFromPathList.s,Horse_CopyPointFromPathList,0x800F39B4,0x2C
+asm/non_matchings/code/z_horse/Horse_IsValidSpawn.s,Horse_IsValidSpawn,0x800F3A64,0x32
+asm/non_matchings/code/z_horse/Horse_ResetHorseData.s,Horse_ResetHorseData,0x800F3B2C,0xF
+asm/non_matchings/code/z_horse/Horse_IsValidSceneLayer.s,Horse_IsValidSceneLayer,0x800F3B68,0x37
+asm/non_matchings/code/z_horse/Horse_SpawnOverworld.s,Horse_SpawnOverworld,0x800F3C44,0xA4
+asm/non_matchings/code/z_horse/Horse_SpawnMinigame.s,Horse_SpawnMinigame,0x800F3ED4,0x73
+asm/non_matchings/code/z_horse/Horse_Spawn.s,Horse_Spawn,0x800F40A0,0x2F
+asm/non_matchings/code/z_horse/Horse_RotateToPoint.s,Horse_RotateToPoint,0x800F415C,0x22
+asm/non_matchings/code/z_horse/Horse_IsActive.s,Horse_IsActive,0x800F41E4,0x2F
asm/non_matchings/code/z_jpeg/Jpeg_ScheduleDecoderTask.s,Jpeg_ScheduleDecoderTask,0x800F42A0,0x47
asm/non_matchings/code/z_jpeg/Jpeg_CopyToZbuffer.s,Jpeg_CopyToZbuffer,0x800F43BC,0x4E
asm/non_matchings/code/z_jpeg/Jpeg_GetUnalignedU16.s,Jpeg_GetUnalignedU16,0x800F44F4,0x13
@@ -1221,7 +1221,7 @@ asm/non_matchings/code/z_kanfont/Font_LoadCharNES.s,Font_LoadCharNES,0x800F4F54,
asm/non_matchings/code/z_kanfont/Font_LoadMessageBoxEndIcon.s,Font_LoadMessageBoxEndIcon,0x800F4FC0,0x11
asm/non_matchings/code/z_kanfont/Font_LoadOrderedFont.s,Font_LoadOrderedFont,0x800F5004,0x23
asm/non_matchings/code/z_kankyo/func_800F5090.s,func_800F5090,0x800F5090,0x11
-asm/non_matchings/code/z_kankyo/func_800F50D4.s,func_800F50D4,0x800F50D4,0xE
+asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s,Environment_ZBufValToFixedPoint,0x800F50D4,0xE
asm/non_matchings/code/z_kankyo/Environment_Init.s,Environment_Init,0x800F510C,0x212
asm/non_matchings/code/z_kankyo/func_800F5954.s,func_800F5954,0x800F5954,0x4E
asm/non_matchings/code/z_kankyo/Environment_LerpWeight.s,Environment_LerpWeight,0x800F5A8C,0x21
@@ -2270,9 +2270,9 @@ asm/non_matchings/code/z_vimode/func_80140898.s,func_80140898,0x80140898,0x1A
asm/non_matchings/code/z_vimode/func_80140900.s,func_80140900,0x80140900,0x3
asm/non_matchings/code/z_vimode/func_8014090C.s,func_8014090C,0x8014090C,0x19
asm/non_matchings/code/z_vimode/func_80140970.s,func_80140970,0x80140970,0xDC
-asm/non_matchings/code/z_vimode/func_80140CE0.s,func_80140CE0,0x80140CE0,0x9
-asm/non_matchings/code/z_vimode/func_80140D04.s,func_80140D04,0x80140D04,0x3
-asm/non_matchings/code/z_vimode/func_80140D10.s,func_80140D10,0x80140D10,0x5C
+asm/non_matchings/code/z_vimode/VisCvg_Init.s,VisCvg_Init,0x80140CE0,0x9
+asm/non_matchings/code/z_vimode/VisCvg_Destroy.s,VisCvg_Destroy,0x80140D04,0x3
+asm/non_matchings/code/z_vimode/VisCvg_Draw.s,VisCvg_Draw,0x80140D10,0x5C
asm/non_matchings/code/code_80140E80/func_80140E80.s,func_80140E80,0x80140E80,0x8
asm/non_matchings/code/code_80140E80/func_80140EA0.s,func_80140EA0,0x80140EA0,0x3
asm/non_matchings/code/code_80140E80/func_80140EAC.s,func_80140EAC,0x80140EAC,0x57
@@ -2739,15 +2739,15 @@ asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntries.s,SpeedMeter_Draw
asm/non_matchings/code/speed_meter/func_801780F0.s,func_801780F0,0x801780F0,0x3F
asm/non_matchings/code/speed_meter/func_801781EC.s,func_801781EC,0x801781EC,0x90
asm/non_matchings/code/speed_meter/func_8017842C.s,func_8017842C,0x8017842C,0xC9
-asm/non_matchings/code/sys_cmpdma/func_80178750.s,func_80178750,0x80178750,0x32
-asm/non_matchings/code/sys_cmpdma/func_80178818.s,func_80178818,0x80178818,0x58
-asm/non_matchings/code/sys_cmpdma/func_80178978.s,func_80178978,0x80178978,0x17
-asm/non_matchings/code/sys_cmpdma/func_801789D4.s,func_801789D4,0x801789D4,0x6
-asm/non_matchings/code/sys_cmpdma/SysCfb_GetFbPtr.s,SysCfb_GetFbPtr,0x801789EC,0xA
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetLoResMode.s,SysCfb_SetLoResMode,0x80178750,0x32
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetHiResMode.s,SysCfb_SetHiResMode,0x80178818,0x58
+asm/non_matchings/code/sys_cmpdma/SysCfb_Init.s,SysCfb_Init,0x80178978,0x17
+asm/non_matchings/code/sys_cmpdma/SysCfb_Reset.s,SysCfb_Reset,0x801789D4,0x6
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetFramebuffer.s,SysCfb_GetFramebuffer,0x801789EC,0xA
asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBuffer.s,SysCfb_GetZBuffer,0x80178A14,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A24.s,func_80178A24,0x80178A24,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A34.s,func_80178A34,0x80178A34,0x18
-asm/non_matchings/code/sys_cmpdma/func_80178A94.s,func_80178A94,0x80178A94,0xB
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetWorkBuffer.s,SysCfb_GetWorkBuffer,0x80178A24,0x4
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferPixel.s,SysCfb_GetZBufferPixel,0x80178A34,0x18
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferInt.s,SysCfb_GetZBufferInt,0x80178A94,0xB
asm/non_matchings/code/sys_cmpdma/func_80178AC0.s,func_80178AC0,0x80178AC0,0x70
asm/non_matchings/code/sys_cmpdma/CmpDma_GetFileInfo.s,CmpDma_GetFileInfo,0x80178C80,0x3F
asm/non_matchings/code/sys_cmpdma/CmpDma_Decompress.s,CmpDma_Decompress,0x80178D7C,0xC
@@ -2962,20 +2962,21 @@ asm/non_matchings/code/sys_slowly/Slowly_ThreadEntry.s,Slowly_ThreadEntry,0x8018
asm/non_matchings/code/sys_slowly/Slowly_Init.s,Slowly_Init,0x8018571C,0x21
asm/non_matchings/code/sys_slowly/Slowly_Destroy.s,Slowly_Destroy,0x801857A0,0x8
asm/non_matchings/code/sys_flashrom/func_801857C0.s,func_801857C0,0x801857C0,0x4
-asm/non_matchings/code/sys_flashrom/func_801857D0.s,func_801857D0,0x801857D0,0x25
-asm/non_matchings/code/sys_flashrom/func_80185864.s,func_80185864,0x80185864,0x29
-asm/non_matchings/code/sys_flashrom/func_80185908.s,func_80185908,0x80185908,0x18
-asm/non_matchings/code/sys_flashrom/func_80185968.s,func_80185968,0x80185968,0x22
-asm/non_matchings/code/sys_flashrom/func_801859F0.s,func_801859F0,0x801859F0,0xF
-asm/non_matchings/code/sys_flashrom/func_80185A2C.s,func_80185A2C,0x80185A2C,0x3C
-asm/non_matchings/code/sys_flashrom/func_80185B1C.s,func_80185B1C,0x80185B1C,0x32
-asm/non_matchings/code/sys_flashrom/func_80185BE4.s,func_80185BE4,0x80185BE4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsInit.s,SysFlashrom_IsInit,0x801857C0,0x4
+asm/non_matchings/code/sys_flashrom/SysFlashrom_GetVendorStr.s,SysFlashrom_GetVendorStr,0x801857D0,0x25
+asm/non_matchings/code/sys_flashrom/SysFlashrom_CheckFlashType.s,SysFlashrom_CheckFlashType,0x80185864,0x29
+asm/non_matchings/code/sys_flashrom/SysFlashrom_InitFlash.s,SysFlashrom_InitFlash,0x80185908,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ReadData.s,SysFlashrom_ReadData,0x80185968,0x22
+asm/non_matchings/code/sys_flashrom/SysFlashrom_EraseSector.s,SysFlashrom_EraseSector,0x801859F0,0xF
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ExecWrite.s,SysFlashrom_ExecWrite,0x80185A2C,0x3C
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AttemptWrite.s,SysFlashrom_AttemptWrite,0x80185B1C,0x32
+asm/non_matchings/code/sys_flashrom/SysFlashrom_NeedsToErase.s,SysFlashrom_NeedsToErase,0x80185BE4,0x10
asm/non_matchings/code/sys_flashrom/func_80185C24.s,func_80185C24,0x80185C24,0x47
asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s,SysFlashrom_ThreadEntry,0x80185D40,0x27
-asm/non_matchings/code/sys_flashrom/func_80185DDC.s,func_80185DDC,0x80185DDC,0x3A
-asm/non_matchings/code/sys_flashrom/func_80185EC4.s,func_80185EC4,0x80185EC4,0x10
-asm/non_matchings/code/sys_flashrom/func_80185F04.s,func_80185F04,0x80185F04,0x18
-asm/non_matchings/code/sys_flashrom/func_80185F64.s,func_80185F64,0x80185F64,0xB
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataAsync.s,SysFlashrom_WriteDataAsync,0x80185DDC,0x3A
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsBusy.s,SysFlashrom_IsBusy,0x80185EC4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AwaitResult.s,SysFlashrom_AwaitResult,0x80185F04,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataSync.s,SysFlashrom_WriteDataSync,0x80185F64,0xB
asm/non_matchings/code/code_80185F90/func_80185F90.s,func_80185F90,0x80185F90,0x26
asm/non_matchings/code/osFlash/func_80186A70.s,func_80186A70,0x80186A70,0x12
asm/non_matchings/code/osFlash/func_80186AB8.s,func_80186AB8,0x80186AB8,0x1C
diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py
index b96696b46..28b64d2fa 100755
--- a/tools/weekeventregconvert.py
+++ b/tools/weekeventregconvert.py
@@ -155,7 +155,7 @@ weekEventReg = {
(18 << 8) | 0x10: "WEEKEVENTREG_18_10",
(18 << 8) | 0x20: "WEEKEVENTREG_18_20",
(18 << 8) | 0x40: "WEEKEVENTREG_18_40",
- (18 << 8) | 0x80: "WEEKEVENTREG_18_80",
+ (18 << 8) | 0x80: "WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES",
(19 << 8) | 0x01: "WEEKEVENTREG_19_01",
(19 << 8) | 0x02: "WEEKEVENTREG_19_02",
(19 << 8) | 0x04: "WEEKEVENTREG_19_04",
@@ -174,15 +174,15 @@ weekEventReg = {
(20 << 8) | 0x80: "WEEKEVENTREG_20_80",
(21 << 8) | 0x01: "WEEKEVENTREG_21_01",
(21 << 8) | 0x02: "WEEKEVENTREG_21_02",
- (21 << 8) | 0x04: "WEEKEVENTREG_21_04",
- (21 << 8) | 0x08: "WEEKEVENTREG_21_08",
+ (21 << 8) | 0x04: "WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON",
+ (21 << 8) | 0x08: "WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON",
(21 << 8) | 0x10: "WEEKEVENTREG_21_10",
(21 << 8) | 0x20: "WEEKEVENTREG_21_20",
(21 << 8) | 0x40: "WEEKEVENTREG_21_40",
(21 << 8) | 0x80: "WEEKEVENTREG_21_80",
(22 << 8) | 0x01: "WEEKEVENTREG_22_01",
(22 << 8) | 0x02: "WEEKEVENTREG_22_02",
- (22 << 8) | 0x04: "WEEKEVENTREG_22_04",
+ (22 << 8) | 0x04: "WEEKEVENTREG_CALMED_GORON_ELDERS_SON",
(22 << 8) | 0x08: "WEEKEVENTREG_22_08",
(22 << 8) | 0x10: "WEEKEVENTREG_22_10",
(22 << 8) | 0x20: "WEEKEVENTREG_22_20",
@@ -714,11 +714,11 @@ weekEventReg = {
(88 << 8) | 0x08: "WEEKEVENTREG_88_08",
(88 << 8) | 0x10: "WEEKEVENTREG_88_10",
(88 << 8) | 0x20: "WEEKEVENTREG_88_20",
- (88 << 8) | 0x40: "WEEKEVENTREG_88_40",
- (88 << 8) | 0x80: "WEEKEVENTREG_88_80",
- (89 << 8) | 0x01: "WEEKEVENTREG_89_01",
- (89 << 8) | 0x02: "WEEKEVENTREG_89_02",
- (89 << 8) | 0x04: "WEEKEVENTREG_89_04",
+ (88 << 8) | 0x40: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE",
+ (88 << 8) | 0x80: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN",
+ (89 << 8) | 0x01: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU",
+ (89 << 8) | 0x02: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA",
+ (89 << 8) | 0x04: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON",
(89 << 8) | 0x08: "WEEKEVENTREG_89_08",
(89 << 8) | 0x10: "WEEKEVENTREG_89_10",
(89 << 8) | 0x20: "WEEKEVENTREG_89_20",
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 7ef51ef24..a45e5c682 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -122,9 +122,11 @@ D_A4800010 = 0xA4800010; // SI_PIF_ADDR_WR64B_REG
D_A4800014 = 0xA4800014; // reserved
D_A4800018 = 0xA4800018; // SI_STATUS_REG
-// buffers
+// sys_cfb buffers
gFramebuffer1 = 0x80000500;
+gFramebufferHiRes0 = 0x80780000;
+gFramebufferHiRes1 = 0x80000500;
D_80025D00 = 0x80025D00;
// Ucode symbols
@@ -723,14 +725,6 @@ D_060134D0 = 0x060134D0;
D_06013828 = 0x06013828;
D_06014040 = 0x06014040;
-// ovl_Demo_Moonend
-
-D_06001214 = 0x06001214;
-D_0600B540 = 0x0600B540;
-D_0600B5A0 = 0x0600B5A0;
-D_06010C40 = 0x06010C40;
-D_060129F0 = 0x060129F0;
-
// ovl_Dm_Tsg
D_06002D30 = 0x06002D30;
@@ -1159,20 +1153,6 @@ D_0B000188 = 0x0B000188;
// segment 0x0C
D_0C000000 = 0x0C000000;
-D_0C000800 = 0x0C000800;
-D_0C001000 = 0x0C001000;
-D_0C001800 = 0x0C001800;
-D_0C001980 = 0x0C001980;
-D_0C006C00 = 0x0C006C00;
-D_0C006E00 = 0x0C006E00;
-D_0C014668 = 0x0C014668;
-
-// segment 0x0D
-
-D_0D002000 = 0x0D002000;
-D_0D002200 = 0x0D002200;
-D_0D002400 = 0x0D002400;
-D_0D003700 = 0x0D003700;
// segment 0x0E