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