diff --git a/Makefile b/Makefile
index e4729002c..75ad3a54c 100644
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,9 @@ N_THREADS ?= $(shell nproc)
#### Setup ####
+# Ensure the map file being created using English localization
+export LANG := C
+
ifeq ($(NON_MATCHING),1)
CFLAGS := -DNON_MATCHING
CPPFLAGS := -DNON_MATCHING
diff --git a/assets/xml/interface/parameter_static.xml b/assets/xml/interface/parameter_static.xml
index 33ab40de4..7532a95b8 100644
--- a/assets/xml/interface/parameter_static.xml
+++ b/assets/xml/interface/parameter_static.xml
@@ -75,9 +75,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_bubble.xml b/assets/xml/objects/object_bubble.xml
index 4397a017f..da2f01d47 100644
--- a/assets/xml/objects/object_bubble.xml
+++ b/assets/xml/objects/object_bubble.xml
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/assets/xml/objects/object_ob.xml b/assets/xml/objects/object_ob.xml
index 75217e04e..d2390fc39 100644
--- a/assets/xml/objects/object_ob.xml
+++ b/assets/xml/objects/object_ob.xml
@@ -1,84 +1,101 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Spot.xml b/assets/xml/overlays/ovl_Oceff_Spot.xml
new file mode 100644
index 000000000..f4e9beea7
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Spot.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe2.xml b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
new file mode 100644
index 000000000..c43ced3c0
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe3.xml b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
new file mode 100644
index 000000000..d8be72985
--- /dev/null
+++ b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 65d1b8b18..fa90ff688 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -718,7 +718,7 @@ void func_800B9038(Actor* actor, s32 timer);
void func_800B9084(Actor* actor);
void func_800B9098(Actor* actor);
s32 func_800B90AC(PlayState* play, Actor* actor, CollisionPoly* polygon, s32 index, s32 arg4);
-void func_800B90F4(PlayState* play);
+void Actor_DeactivateLens(PlayState* play);
void func_800B9120(ActorContext* actorCtx);
void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEntry);
void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx);
@@ -1855,13 +1855,9 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange);
void Health_GiveHearts(s16 hearts);
void Rupees_ChangeBy(s16 rupeeChange);
void Inventory_ChangeAmmo(s16 item, s16 ammoChange);
-void Parameter_AddMagic(PlayState* play, s16 arg1);
-void func_80115D5C(GameState* gamestate);
-// void func_80115DB4(void);
-// void func_80116088(void);
-// void func_80116114(void);
-// void func_80116348(void);
-// void func_80116918(void);
+void Magic_Add(PlayState* play, s16 magicToAdd);
+void Magic_Reset(PlayState* play);
+s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type);
// void func_80116FD8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
// void func_801170B8(void);
// void func_80117100(void);
diff --git a/include/macros.h b/include/macros.h
index f713bf736..996be52ca 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -45,6 +45,9 @@
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
+// To be used with `Magic_Add`, but ensures enough magic is added to fill the magic bar to capacity
+#define MAGIC_FILL_TO_CAPACITY (((void)0, gSaveContext.magicFillTarget) + (gSaveContext.save.playerData.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER)
+
#define CONTROLLER1(gameState) (&(gameState)->input[0])
#define CONTROLLER2(gameState) (&(gameState)->input[1])
#define CONTROLLER3(gameState) (&(gameState)->input[2])
diff --git a/include/regs.h b/include/regs.h
index f8ce4ca86..aa3ba523b 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -43,61 +43,58 @@
#define bREG(r) BASE_REG(28, r)
/* TODO: Actually confirm these, in case of miss-match it's at least a simple list to `sed` */
-#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
-#define R_RUN_SPEED_LIMIT REG(45)
-#define R_UPDATE_RATE SREG(30)
-#define R_PAUSE_MENU_MODE SREG(94)
-#define R_C_UP_ICON_X YREG(88)
-#define R_C_UP_ICON_Y YREG(89)
-#define R_MAGIC_FILL_COLOR(i) ZREG(0 + i)
-#define R_C_BTN_COLOR(i) ZREG(39 + i)
-#define R_B_BTN_COLOR(i) ZREG(43 + i)
-#define R_START_LABEL_DD(i) ZREG(48 + i)
-#define R_START_LABEL_Y(i) ZREG(51 + i)
-#define R_START_LABEL_X(i) ZREG(54 + i)
-#define R_C_UP_BTN_X ZREG(62)
-#define R_C_UP_BTN_Y ZREG(63)
-#define R_START_BTN_X ZREG(68)
-#define R_START_BTN_Y ZREG(69)
-#define R_ITEM_BTN_X(i) ZREG(70 + i)
-#define R_ITEM_BTN_Y(i) ZREG(74 + i)
-#define R_ITEM_BTN_DD(i) ZREG(78 + i)
-#define R_ITEM_ICON_X(i) ZREG(82 + i)
-#define R_ITEM_ICON_Y(i) ZREG(86 + i)
-#define R_ITEM_ICON_DD(i) ZREG(90 + i)
-#define R_A_BTN_Y XREG(16)
-#define R_A_BTN_X XREG(17)
-#define R_A_ICON_Y XREG(19)
-#define R_A_ICON_X XREG(20)
-#define R_A_BTN_COLOR(i) XREG(22 + i)
-#define R_MAGIC_BAR_SMALL_Y XREG(48)
-#define R_MAGIC_BAR_X XREG(49)
-#define R_MAGIC_BAR_LARGE_Y XREG(50)
-#define R_MAGIC_FILL_X XREG(51)
-#define R_MINIMAP_DISABLED XREG(95)
-#define R_B_LABEL_DD WREG(0)
-#define R_OW_MINIMAP_X WREG(29)
-#define R_OW_MINIMAP_Y WREG(30)
-#define R_B_LABEL_X(i) WREG(40 + i)
-#define R_B_LABEL_Y(i) WREG(43 + i)
-#define R_DGN_MINIMAP_X WREG(68)
-#define R_DGN_MINIMAP_Y WREG(69)
-#define R_MAP_INDEX VREG(11)
-#define R_MAP_TEX_INDEX_BASE VREG(12)
-#define R_MAP_TEX_INDEX VREG(13)
-#define R_COMPASS_SCALE_X VREG(14)
-#define R_COMPASS_SCALE_Y VREG(15)
-#define R_COMPASS_OFFSET_X VREG(16)
-#define R_COMPASS_OFFSET_Y VREG(17)
-#define R_MINIMAP_COLOR(i) VREG(18 + i)
-#define R_ITEM_AMMO_X(i) VREG(64 + i)
-#define R_ITEM_AMMO_Y(i) VREG(68 + i)
-#define R_ITEM_ICON_WIDTH(i) VREG(76 + i)
-#define R_ITEM_BTN_WIDTH(i) VREG(80 + i)
+#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
+#define R_RUN_SPEED_LIMIT REG(45)
+#define R_UPDATE_RATE SREG(30)
+#define R_PAUSE_MENU_MODE SREG(94)
+#define R_C_UP_ICON_X YREG(88)
+#define R_C_UP_ICON_Y YREG(89)
+#define R_MAGIC_FILL_COLOR(i) ZREG(0 + i)
+#define R_C_BTN_COLOR(i) ZREG(39 + i)
+#define R_B_BTN_COLOR(i) ZREG(43 + i)
+#define R_START_LABEL_DD(i) ZREG(48 + i)
+#define R_START_LABEL_Y(i) ZREG(51 + i)
+#define R_START_LABEL_X(i) ZREG(54 + i)
+#define R_C_UP_BTN_X ZREG(62)
+#define R_C_UP_BTN_Y ZREG(63)
+#define R_START_BTN_X ZREG(68)
+#define R_START_BTN_Y ZREG(69)
+#define R_ITEM_BTN_X(i) ZREG(70 + i)
+#define R_ITEM_BTN_Y(i) ZREG(74 + i)
+#define R_ITEM_BTN_DD(i) ZREG(78 + i)
+#define R_ITEM_ICON_X(i) ZREG(82 + i)
+#define R_ITEM_ICON_Y(i) ZREG(86 + i)
+#define R_ITEM_ICON_DD(i) ZREG(90 + i)
+#define R_A_BTN_Y XREG(16)
+#define R_A_BTN_X XREG(17)
+#define R_A_ICON_Y XREG(19)
+#define R_A_ICON_X XREG(20)
+#define R_A_BTN_COLOR(i) XREG(22 + i)
+#define R_MAGIC_CONSUME_TIMER_GIANTS_MASK XREG(41)
+#define R_MINIMAP_DISABLED XREG(95)
+#define R_B_LABEL_DD WREG(0)
+#define R_OW_MINIMAP_X WREG(29)
+#define R_OW_MINIMAP_Y WREG(30)
+#define R_B_LABEL_X(i) WREG(40 + i)
+#define R_B_LABEL_Y(i) WREG(43 + i)
+#define R_DGN_MINIMAP_X WREG(68)
+#define R_DGN_MINIMAP_Y WREG(69)
+#define R_MAP_INDEX VREG(11)
+#define R_MAP_TEX_INDEX_BASE VREG(12)
+#define R_MAP_TEX_INDEX VREG(13)
+#define R_COMPASS_SCALE_X VREG(14)
+#define R_COMPASS_SCALE_Y VREG(15)
+#define R_COMPASS_OFFSET_X VREG(16)
+#define R_COMPASS_OFFSET_Y VREG(17)
+#define R_MINIMAP_COLOR(i) VREG(18 + i)
+#define R_ITEM_AMMO_X(i) VREG(64 + i)
+#define R_ITEM_AMMO_Y(i) VREG(68 + i)
+#define R_ITEM_ICON_WIDTH(i) VREG(76 + i)
+#define R_ITEM_BTN_WIDTH(i) VREG(80 + i)
-#define R_FB_FILTER_TYPE SREG(80)
-#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
-#define R_FB_FILTER_A SREG(84)
-#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c)
+#define R_FB_FILTER_TYPE SREG(80)
+#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
+#define R_FB_FILTER_A SREG(84)
+#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c)
#endif
diff --git a/include/variables.h b/include/variables.h
index e39b4adfb..36ad5440a 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -1028,11 +1028,11 @@ extern UNK_PTR D_801BF5C0;
// extern UNK_TYPE2 D_801BF890;
// extern UNK_TYPE2 D_801BF898;
// extern UNK_TYPE2 D_801BF89C;
-// extern UNK_TYPE2 D_801BF8A0;
-// extern UNK_TYPE2 D_801BF8A4;
-// extern UNK_TYPE2 D_801BF8A8;
-// extern UNK_TYPE2 D_801BF8AC;
-// extern UNK_TYPE2 D_801BF8B0;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimRed;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimGreen;
+// extern UNK_TYPE2 sMagicMeterOutlinePrimBlue;
+// extern UNK_TYPE2 sMagicBorderRatio;
+// extern UNK_TYPE2 sMagicBorderStep;
// extern UNK_TYPE2 D_801BF8DC;
// extern UNK_TYPE2 D_801BF8E0;
// extern UNK_TYPE2 D_801BF8E4;
@@ -2719,7 +2719,7 @@ extern f32 D_801DE860;
extern f32 D_801DE864;
extern f32 D_801DE868;
extern f32 D_801DE884;
-extern TexturePtr D_801DE890[];
+extern TexturePtr gCircleTex;
extern f32 D_801DF090;
extern f32 D_801DF094;
extern f32 D_801DF0A0;
diff --git a/include/z64.h b/include/z64.h
index ec51a3a8c..cf4643d53 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -523,7 +523,7 @@ typedef struct {
/* 0x252 */ s16 lifeSizeChange;
/* 0x254 */ s16 lifeSizeChangeDirection; // 1 means shrinking, 0 growing
/* 0x256 */ s16 unk_256;
- /* 0x258 */ s16 unk_258;
+ /* 0x258 */ s16 magicConsumptionTimer; // For certain magic states, 1 unit of magic is consumed every time the timer reaches 0
/* 0x25A */ u8 numHorseBoosts;
/* 0x25C */ u16 unk_25C;
/* 0x25E */ u16 unk_25E;
diff --git a/include/z64actor.h b/include/z64actor.h
index 175d9ef22..925a9975f 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -83,7 +83,7 @@ typedef struct {
typedef struct {
/* 0x0 */ s16 unk_0; // frame?
- /* 0x2 */ Vec3s unk_2; // pos?
+ /* 0x2 */ Vec3s unk_2; // scale
} struct_80124618; // size = 0x8
typedef struct {
@@ -365,15 +365,18 @@ typedef struct ActorListEntry {
/* 0x8 */ s32 unk_08;
} ActorListEntry; // size = 0xC
+// Target size when activated
+#define LENS_MASK_ACTIVE_SIZE 100
+
typedef struct ActorContext {
/* 0x000 */ u8 freezeFlashTimer;
/* 0x001 */ UNK_TYPE1 pad1;
/* 0x002 */ u8 unk2;
- /* 0x003 */ u8 unk3;
- /* 0x004 */ s8 unk4;
+ /* 0x003 */ u8 lensActive;
+ /* 0x004 */ s8 lensMaskSize; // The size of the circle when drawn the lens mask. Larger value leads to a smaller circle
/* 0x005 */ u8 unk5;
/* 0x006 */ UNK_TYPE1 pad6[0x5];
- /* 0x00B */ s8 unkB;
+ /* 0x00B */ s8 lensActorsDrawn;
/* 0x00C */ s16 unkC;
/* 0x00E */ u8 totalLoadedActors;
/* 0x00F */ u8 undrawnActorCount;
@@ -1185,4 +1188,109 @@ typedef enum {
/* 0xC8 */ CLEAR_TAG_SMOKE = 200
} ClearTagType;
+typedef enum {
+ /* 0x00 */ TATL_HINT_ID_DEFAULT,
+ /* 0x01 */ TATL_HINT_ID_SNAPPER,
+ /* 0x02 */ TATL_HINT_ID_MINI_BABA,
+ /* 0x03 */ TATL_HINT_ID_MAD_JELLY,
+ /* 0x04 */ TATL_HINT_ID_SKULLTULA,
+ /* 0x05 */ TATL_HINT_ID_RED_CHUCHU,
+ /* 0x06 */ TATL_HINT_ID_BLUE_CHUCHU,
+ /* 0x07 */ TATL_HINT_ID_DEKU_BABA,
+ /* 0x08 */ TATL_HINT_ID_BIO_DEKU_BABA,
+ /* 0x09 */ TATL_HINT_ID_WILTED_DEKU_BABA,
+ /* 0x0A */ TATL_HINT_ID_DEXIHAND,
+ /* 0x0B */ TATL_HINT_ID_NEJIRON,
+ /* 0x0C */ TATL_HINT_ID_GIANT_BEE,
+ /* 0x0D */ TATL_HINT_ID_DODONGO,
+ /* 0x0E */ TATL_HINT_ID_DEEP_PYTHON,
+ /* 0x0F */ TATL_HINT_ID_DEATH_ARMOS,
+ /* 0x10 */ TATL_HINT_ID_DINOLFOS,
+ /* 0x11 */ TATL_HINT_ID_FIRE_KEESE,
+ /* 0x12 */ TATL_HINT_ID_KEESE,
+ /* 0x13 */ TATL_HINT_ID_ARMOS,
+ /* 0x14 */ TATL_HINT_ID_EENO,
+ /* 0x15 */ TATL_HINT_ID_DRAGONFLY,
+ /* 0x16 */ TATL_HINT_ID_IGOS_DU_IKANA,
+ /* 0x17 */ TATL_HINT_ID_GARO,
+ /* 0x18 */ TATL_HINT_ID_GARO_MASTER,
+ /* 0x19 */ TATL_HINT_ID_WART,
+ /* 0x1A */ TATL_HINT_ID_GOMESS,
+ /* 0x1B */ TATL_HINT_ID_GOHT,
+ /* 0x1C */ TATL_HINT_ID_BLUE_BUBBLE,
+ /* 0x1D */ TATL_HINT_ID_KINGS_LACKEYS_DARK_ROOM,
+ /* 0x1E */ TATL_HINT_ID_KINGS_LACKEYS_LIGHT_ROOM,
+ /* 0x1F */ TATL_HINT_ID_SKULLWALLTULA,
+ /* 0x20 */ TATL_HINT_ID_GOLD_SKULLTULA, // Only in JP Ver.
+ /* 0x21 */ TATL_HINT_ID_CAPTAIN_KEETA,
+ /* 0x22 */ TATL_HINT_ID_YELLOW_CHUCHU,
+ /* 0x23 */ TATL_HINT_ID_TAKKURI,
+ /* 0x24 */ TATL_HINT_ID_RED_BUBBLE,
+ /* 0x25 */ TATL_HINT_ID_HIPLOOP,
+ /* 0x26 */ TATL_HINT_ID_MASKED_HIPLOOP,
+ /* 0x27 */ TATL_HINT_ID_SHELLBLADE,
+ /* 0x28 */ TATL_HINT_ID_GYORG, // "if you go near, you'll be eaten!"
+ /* 0x29 */ TATL_HINT_ID_GYORG_STUNNED, // "Jump in and attack it!"
+ /* 0x2A */ TATL_HINT_ID_REDEAD,
+ /* 0x2B */ TATL_HINT_ID_2B,
+ /* 0x2C */ TATL_HINT_ID_BLACK_BOE,
+ /* 0x2D */ TATL_HINT_ID_GIBDO,
+ /* 0x2E */ TATL_HINT_ID_TWINMOLD,
+ /* 0x2F */ TATL_HINT_ID_WEARING_GIANTS_MASK, // Twinmold, JP Ver. only
+ /* 0x30 */ TATL_HINT_ID_WALLMASTER,
+ /* 0x31 */ TATL_HINT_ID_FLOORMASTER,
+ /* 0x32 */ TATL_HINT_ID_MAJORAS_MASK,
+ /* 0x33 */ TATL_HINT_ID_MAJORAS_INCARNATION,
+ /* 0x34 */ TATL_HINT_ID_MAJORAS_WRATH,
+ /* 0x35 */ TATL_HINT_ID_IRON_KNUCKLE,
+ /* 0x36 */ TATL_HINT_ID_36, // Empty
+ /* 0x37 */ TATL_HINT_ID_LIKE_LIKE,
+ /* 0x38 */ TATL_HINT_ID_38, // Empty
+ /* 0x39 */ TATL_HINT_ID_BEAMOS,
+ /* 0x3A */ TATL_HINT_ID_3A, // Empty
+ /* 0x3B */ TATL_HINT_ID_FREEZARD,
+ /* 0x3C */ TATL_HINT_ID_WHITE_BOE,
+ /* 0x3D */ TATL_HINT_ID_3D, // Empty
+ /* 0x3E */ TATL_HINT_ID_3E, // Empty
+ /* 0x3F */ TATL_HINT_ID_3F, // Empty
+ /* 0x40 */ TATL_HINT_ID_40, // Empty
+ /* 0x41 */ TATL_HINT_ID_41, // Empty
+ /* 0x42 */ TATL_HINT_ID_OCTOROK,
+ /* 0x43 */ TATL_HINT_ID_43, // Empty
+ /* 0x44 */ TATL_HINT_ID_POE,
+ /* 0x45 */ TATL_HINT_ID_GEKKO_SNAPPER,
+ /* 0x46 */ TATL_HINT_ID_BLUE_TEKTITE,
+ /* 0x47 */ TATL_HINT_ID_LEEVER,
+ /* 0x48 */ TATL_HINT_ID_PEAHAT,
+ /* 0x49 */ TATL_HINT_ID_PEAHAT_LARVA,
+ /* 0x4A */ TATL_HINT_ID_EYEGORE,
+ /* 0x4B */ TATL_HINT_ID_WIZROBE,
+ /* 0x4C */ TATL_HINT_ID_WOLFOS,
+ /* 0x4D */ TATL_HINT_ID_MAD_SCRUB,
+ /* 0x4E */ TATL_HINT_ID_4E, // Empty
+ /* 0x4F */ TATL_HINT_ID_4F, // Empty
+ /* 0x50 */ TATL_HINT_ID_POE_SISTER_MEG,
+ /* 0x51 */ TATL_HINT_ID_POE_SISTER_JO,
+ /* 0x52 */ TATL_HINT_ID_POE_SISTER_BETH,
+ /* 0x53 */ TATL_HINT_ID_POE_SISTER_AMY,
+ /* 0x54 */ TATL_HINT_ID_PIRATE,
+ /* 0x55 */ TATL_HINT_ID_STALCHILD,
+ /* 0x56 */ TATL_HINT_ID_ICE_KEESE,
+ /* 0x57 */ TATL_HINT_ID_WHITE_WOLFOS,
+ /* 0x58 */ TATL_HINT_ID_GUAY,
+ /* 0x59 */ TATL_HINT_ID_BIG_OCTO,
+ /* 0x5A */ TATL_HINT_ID_BIG_POE,
+ /* 0x5B */ TATL_HINT_ID_SKULLFISH,
+ /* 0x5C */ TATL_HINT_ID_DESBREKO,
+ /* 0x5D */ TATL_HINT_ID_GREEN_CHUCHU,
+ /* 0x5E */ TATL_HINT_ID_ODOLWA_1,
+ /* 0x5F */ TATL_HINT_ID_GEKKO_GIANT_SLIME,
+ /* 0x60 */ TATL_HINT_ID_BAD_BAT,
+ /* 0x61 */ TATL_HINT_ID_REAL_BOMBCHU,
+ /* 0x62 */ TATL_HINT_ID_ODOLWA_2,
+ /* 0x63 */ TATL_HINT_ID_ODOLWA_3,
+ /* 0x64 */ TATL_HINT_ID_MUSHROOM,
+ /* 0xFF */ TATL_HINT_ID_NONE = 0xFF
+} TatlHintId;
+
#endif
diff --git a/include/z64math.h b/include/z64math.h
index 16ab72e8a..323042b15 100644
--- a/include/z64math.h
+++ b/include/z64math.h
@@ -101,6 +101,9 @@ typedef struct {
#define BINANG_LERPIMP(v0, v1, t) ((v0) + (s16)(BINANG_SUB((v1), (v0)) * (t)))
#define BINANG_LERPIMPINV(v0, v1, t) ((v0) + BINANG_SUB((v1), (v0)) / (t))
+#define LERPWEIGHT(val, prev, next) (((val) - (prev)) / ((next) - (prev)))
+#define F32_LERPWEIGHT(val, prev, next) (((f32)(val) - (f32)(prev)) / ((f32)(next) - (f32)(prev)))
+
#define VEC3F_LERPIMPDST(dst, v0, v1, t){ \
(dst)->x = (v0)->x + (((v1)->x - (v0)->x) * t); \
(dst)->y = (v0)->y + (((v1)->y - (v0)->y) * t); \
diff --git a/include/z64save.h b/include/z64save.h
index 6b77e2968..1ff39ec92 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -24,6 +24,36 @@ typedef enum RespawnMode {
#define SAVE_BUFFER_SIZE 0x4000
+typedef enum {
+ /* 0 */ MAGIC_STATE_IDLE, // Regular gameplay
+ /* 1 */ MAGIC_STATE_CONSUME_SETUP, // Sets the speed at which the magic border flashes
+ /* 2 */ MAGIC_STATE_CONSUME, // Consume magic until target is reached or no more magic is available
+ /* 3 */ MAGIC_STATE_METER_FLASH_1, // Flashes border
+ /* 4 */ MAGIC_STATE_METER_FLASH_2, // Flashes border and draws yellow magic to preview target consumption
+ /* 5 */ MAGIC_STATE_RESET, // Reset colors and return to idle
+ /* 6 */ MAGIC_STATE_METER_FLASH_3, // Flashes border with no additional behaviour
+ /* 7 */ MAGIC_STATE_CONSUME_LENS, // Magic slowly consumed by Lens of Truth
+ /* 8 */ MAGIC_STATE_STEP_CAPACITY, // Step `magicCapacity` to full capacity
+ /* 9 */ MAGIC_STATE_FILL, // Add magic until magicFillTarget is reached
+ /* 10 */ MAGIC_STATE_CONSUME_GORON_ZORA_SETUP,
+ /* 11 */ MAGIC_STATE_CONSUME_GORON_ZORA, // Magic slowly consumed by Goron spiked rolling or Zora electric barrier.
+ /* 12 */ MAGIC_STATE_CONSUME_GIANTS_MASK // Magic slowly consumed by Giant's Mask
+} MagicState;
+
+typedef enum {
+ /* 0 */ MAGIC_CONSUME_NOW, // Consume magic immediately without preview
+ /* 1 */ MAGIC_CONSUME_WAIT_NO_PREVIEW, // Sets consume target but waits to consume. No yellow magic preview to target consumption. Unused
+ /* 2 */ MAGIC_CONSUME_NOW_ALT, // Identical behaviour to MAGIC_CONSUME_NOW. Unused
+ /* 3 */ MAGIC_CONSUME_LENS, // Lens of Truth consumption
+ /* 4 */ MAGIC_CONSUME_WAIT_PREVIEW, // Sets consume target but waits to consume. Show magic to be consumed in yellow.
+ /* 5 */ MAGIC_CONSUME_GORON_ZORA, // Goron spiked rolling or Zora electric barrier slow consumption
+ /* 6 */ MAGIC_CONSUME_GIANTS_MASK, // Giant's Mask slow consumption
+ /* 7 */ MAGIC_CONSUME_DEITY_BEAM // Fierce Deity Beam consumption, consumed magic now and not via request
+} MagicChangeType;
+
+#define MAGIC_NORMAL_METER 0x30
+#define MAGIC_DOUBLE_METER (2 * MAGIC_NORMAL_METER)
+
typedef struct SramContext {
/* 0x00 */ u8* readBuff;
/* 0x04 */ u8 *saveBuf;
@@ -105,13 +135,13 @@ typedef struct SavePlayerData {
/* 0x08 */ char playerName[8]; // "player_name"
/* 0x10 */ s16 healthCapacity; // "max_life"
/* 0x12 */ s16 health; // "now_life"
- /* 0x14 */ s8 magicLevel; // "magic_max"
- /* 0x15 */ s8 magic; // "magic_now"
+ /* 0x14 */ s8 magicLevel; // 0 for no magic/new load, 1 for magic, 2 for double magic "magic_max"
+ /* 0x15 */ s8 magic; // current magic available for use "magic_now"
/* 0x16 */ s16 rupees; // "lupy_count"
/* 0x18 */ u16 swordHealth; // "long_sword_hp"
/* 0x1A */ u16 tatlTimer; // "navi_timer"
- /* 0x1C */ u8 magicAcquired; // "magic_mode"
- /* 0x1D */ u8 doubleMagic; // "magic_ability"
+ /* 0x1C */ u8 isMagicAcquired; // "magic_mode"
+ /* 0x1D */ u8 isDoubleMagicAcquired; // "magic_ability"
/* 0x1E */ u8 doubleDefense; // "life_ability"
/* 0x1F */ u8 unk_1F; // "ocarina_round"
/* 0x20 */ u8 unk_20; // "first_memory"
@@ -226,13 +256,13 @@ typedef struct SaveContext {
/* 0x3F22 */ u16 unk_3F22; // "prev_alpha_type"
/* 0x3F24 */ u16 unk_3F24; // "alpha_count"
/* 0x3F26 */ u16 unk_3F26; // "last_time_type"
- /* 0x3F28 */ s16 unk_3F28; // "magic_flag"
- /* 0x3F2A */ s16 unk_3F2A; // "recovery_magic_flag"
- /* 0x3F2C */ s16 unk_3F2C; // "keep_magic_flag"
- /* 0x3F2E */ s16 unk_3F2E; // "magic_now_max"
- /* 0x3F30 */ s16 unk_3F30; // "magic_now_now"
- /* 0x3F32 */ s16 unk_3F32; // "magic_used"
- /* 0x3F34 */ s16 unk_3F34; // "magic_recovery"
+ /* 0x3F28 */ s16 magicState; // determines magic meter behavior on each frame "magic_flag"
+ /* 0x3F2A */ s16 isMagicRequested; // a request to add magic has been given "recovery_magic_flag"
+ /* 0x3F2C */ s16 magicFlag; // Set to 0 in func_80812D94(), otherwise unused "keep_magic_flag"
+ /* 0x3F2E */ s16 magicCapacity; // maximum magic available "magic_now_max"
+ /* 0x3F30 */ s16 magicFillTarget; // target used to fill magic "magic_now_now"
+ /* 0x3F32 */ s16 magicToConsume; // accumulated magic that is requested to be consumed "magic_used"
+ /* 0x3F34 */ s16 magicToAdd; // accumulated magic that is requested to be added "magic_recovery"
/* 0x3F36 */ u16 mapIndex; // "scene_ID"
/* 0x3F38 */ u16 minigameState; // "yabusame_mode"
/* 0x3F3A */ u16 minigameScore; // "yabusame_total"
diff --git a/spec b/spec
index fe3d2f006..81fe45ceb 100644
--- a/spec
+++ b/spec
@@ -883,8 +883,7 @@ beginseg
name "ovl_En_Bubble"
compress
include "build/src/overlays/actors/ovl_En_Bubble/z_en_bubble.o"
- include "build/data/ovl_En_Bubble/ovl_En_Bubble.data.o"
- include "build/data/ovl_En_Bubble/ovl_En_Bubble.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Bubble/ovl_En_Bubble_reloc.o"
endseg
beginseg
@@ -1163,8 +1162,7 @@ beginseg
name "ovl_En_Encount1"
compress
include "build/src/overlays/actors/ovl_En_Encount1/z_en_encount1.o"
- include "build/data/ovl_En_Encount1/ovl_En_Encount1.data.o"
- include "build/data/ovl_En_Encount1/ovl_En_Encount1.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Encount1/ovl_En_Encount1_reloc.o"
endseg
beginseg
@@ -1644,8 +1642,7 @@ beginseg
name "ovl_En_Js"
compress
include "build/src/overlays/actors/ovl_En_Js/z_en_js.o"
- include "build/data/ovl_En_Js/ovl_En_Js.data.o"
- include "build/data/ovl_En_Js/ovl_En_Js.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Js/ovl_En_Js_reloc.o"
endseg
beginseg
@@ -1696,8 +1693,7 @@ beginseg
name "ovl_Oceff_Spot"
compress
include "build/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.o"
- include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.data.o"
- include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Spot/ovl_Oceff_Spot_reloc.o"
endseg
beginseg
@@ -1981,18 +1977,14 @@ beginseg
name "ovl_Oceff_Wipe2"
compress
include "build/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.data.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.bss.o"
- include "build/data/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2_reloc.o"
endseg
beginseg
name "ovl_Oceff_Wipe3"
compress
include "build/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.data.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.bss.o"
- include "build/data/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.reloc.o"
+ include "build/src/overlays/actors/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3_reloc.o"
endseg
beginseg
@@ -3042,9 +3034,7 @@ beginseg
name "ovl_En_Az"
compress
include "build/src/overlays/actors/ovl_En_Az/z_en_az.o"
- include "build/data/ovl_En_Az/ovl_En_Az.data.o"
- include "build/data/ovl_En_Az/ovl_En_Az.bss.o"
- include "build/data/ovl_En_Az/ovl_En_Az.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Az/ovl_En_Az_reloc.o"
endseg
beginseg
@@ -3210,9 +3200,7 @@ beginseg
name "ovl_En_Twig"
compress
include "build/src/overlays/actors/ovl_En_Twig/z_en_twig.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.data.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.bss.o"
- include "build/data/ovl_En_Twig/ovl_En_Twig.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Twig/ovl_En_Twig_reloc.o"
endseg
beginseg
@@ -4852,8 +4840,7 @@ beginseg
name "ovl_Obj_Usiyane"
compress
include "build/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.o"
- include "build/data/ovl_Obj_Usiyane/ovl_Obj_Usiyane.data.o"
- include "build/data/ovl_Obj_Usiyane/ovl_Obj_Usiyane.reloc.o"
+ include "build/src/overlays/actors/ovl_Obj_Usiyane/ovl_Obj_Usiyane_reloc.o"
endseg
beginseg
diff --git a/src/code/title_setup.c b/src/code/title_setup.c
index 69790b60c..4be91d2e8 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -8,7 +8,7 @@ void TitleSetup_GameStateResetContext(void) {
XREG(12) = 0xE;
XREG(13) = 0;
XREG(31) = 0;
- XREG(41) = 0x50;
+ R_MAGIC_CONSUME_TIMER_GIANTS_MASK = 80;
XREG(43) = 0xFC54;
XREG(44) = 0xD7;
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index da2b70292..3669dd136 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -1076,7 +1076,7 @@ void Actor_Init(Actor* actor, PlayState* play) {
actor->uncullZoneScale = 350.0f;
actor->uncullZoneDownward = 700.0f;
- actor->hintId = 255;
+ actor->hintId = TATL_HINT_ID_NONE;
CollisionCheck_InitInfo(&actor->colChkInfo);
actor->floorBgId = BGCHECK_SCENE;
@@ -2212,10 +2212,10 @@ s32 func_800B90AC(PlayState* play, Actor* actor, CollisionPoly* polygon, s32 bgI
return false;
}
-void func_800B90F4(PlayState* play) {
- if (play->actorCtx.unk3 != 0) {
- play->actorCtx.unk3 = 0;
- func_80115D5C(&play->state);
+void Actor_DeactivateLens(PlayState* play) {
+ if (play->actorCtx.lensActive) {
+ play->actorCtx.lensActive = false;
+ Magic_Reset(play);
}
}
@@ -2594,7 +2594,7 @@ void func_800B9D1C(Actor* actor) {
void Actor_DrawAllSetup(PlayState* play) {
play->actorCtx.undrawnActorCount = 0;
- play->actorCtx.unkB = 0;
+ play->actorCtx.lensActorsDrawn = false;
}
s32 Actor_RecordUndrawnActor(PlayState* play, Actor* actor) {
@@ -2607,13 +2607,12 @@ s32 Actor_RecordUndrawnActor(PlayState* play, Actor* actor) {
return true;
}
-void func_800B9E84(Gfx** arg0, s32 arg1) {
- func_80164C14(arg0, D_801DE890, 4, 0, 6, 6, ((100 - arg1) * 0.003f) + 1.0f);
+void Actor_DrawLensOverlay(Gfx** gfxP, s32 lensMaskSize) {
+ func_80164C14(gfxP, &gCircleTex, 4, 0, 6, 6, ((LENS_MASK_ACTIVE_SIZE - lensMaskSize) * 0.003f) + 1.0f);
}
#ifdef NON_EQUIVALENT
-// Related to draw actors with lens
-void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
+void Actor_DrawLensActors(PlayState* play, s32 numActors, Actor** actors) {
s32 spB4;
Gfx* spAC;
void* spA8; // pad
@@ -2684,7 +2683,7 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
}
// spAC = phi_s1;
- func_800B9E84(&spAC, play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, play->actorCtx.lensMaskSize);
phi_s1_2 = func_801660B8(play, spAC);
for (spB4 = 0; spB4 < numActors; spB4++, actors++) {
@@ -2744,7 +2743,7 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
spAC = phi_s1_2;
// spAC = temp_s1_11;
- func_800B9E84(&spAC, (s32)play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, (s32)play->actorCtx.lensMaskSize);
// temp_s1_11->words.w0 = 0xE7000000;
// temp_s1_11->words.w1 = 0;
// temp_s1_12 = temp_s1_11 + 8;
@@ -2796,15 +2795,15 @@ void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors) {
// spAC = temp_s1_18 + 8;
gDPSetPrimColor(spAC++, 0, 0, 74, 0, 0, 74);
- func_800B9E84(&spAC, (s32)play->actorCtx.unk4);
+ Actor_DrawLensOverlay(&spAC, (s32)play->actorCtx.lensMaskSize);
OVERLAY_DISP = spAC;
CLOSE_DISPS(play->state.gfxCtx);
}
#else
-void func_800B9EF4(PlayState* play, s32 numActors, Actor** actors);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/func_800B9EF4.s")
+void Actor_DrawLensActors(PlayState* play, s32 numActors, Actor** actors);
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/Actor_DrawLensActors.s")
#endif
s32 func_800BA2D8(PlayState* play, Actor* actor) {
@@ -2883,7 +2882,7 @@ void Actor_DrawAll(PlayState* play, ActorContext* actorCtx) {
actor->isDrawn = false;
if ((actor->init == NULL) && (actor->draw != NULL) && (actor->flags & actorFlags)) {
if ((actor->flags & ACTOR_FLAG_80) &&
- ((play->roomCtx.currRoom.unk5 == 0) || (play->actorCtx.unk4 == 0x64) ||
+ ((play->roomCtx.currRoom.unk5 == 0) || (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) ||
(actor->room != play->roomCtx.currRoom.num))) {
if (Actor_RecordUndrawnActor(play, actor)) {}
} else {
@@ -2903,17 +2902,17 @@ void Actor_DrawAll(PlayState* play, ActorContext* actorCtx) {
gSPDisplayList(sp58, &ref2[1]);
POLY_XLU_DISP = &ref2[1];
- if (play->actorCtx.unk3 != 0) {
- Math_StepToC(&play->actorCtx.unk4, 100, 20);
+ if (play->actorCtx.lensActive) {
+ Math_StepToC(&play->actorCtx.lensMaskSize, LENS_MASK_ACTIVE_SIZE, 20);
if (GET_PLAYER(play)->stateFlags2 & 0x8000000) {
- func_800B90F4(play);
+ Actor_DeactivateLens(play);
}
} else {
- Math_StepToC(&play->actorCtx.unk4, 0, 10);
+ Math_StepToC(&play->actorCtx.lensMaskSize, 0, 10);
}
- if (play->actorCtx.unk4 != 0) {
- play->actorCtx.unkB = 1;
- func_800B9EF4(play, play->actorCtx.undrawnActorCount, play->actorCtx.undrawnActors);
+ if (play->actorCtx.lensMaskSize != 0) {
+ play->actorCtx.lensActorsDrawn = true;
+ Actor_DrawLensActors(play, play->actorCtx.undrawnActorCount, play->actorCtx.undrawnActors);
}
tmp2 = POLY_XLU_DISP;
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 57e84e86b..25d6f8ca8 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -25,7 +25,7 @@ u16 ElfMessage_GetFirstCycleHint(PlayState* play) {
}
return 0x21D;
}
- if (gSaveContext.save.playerData.magicAcquired != true) {
+ if (gSaveContext.save.playerData.isMagicAcquired != true) {
return 0x21F;
}
if (INV_CONTENT(ITEM_DEED_LAND) == ITEM_DEED_LAND) {
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 0637f6392..953648f49 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -500,7 +500,7 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
}
}
- if (play->gameOverCtx.state != 0) {
+ if (play->gameOverCtx.state != GAMEOVER_INACTIVE) {
return;
}
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 625adf20f..fa490dbca 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -75,7 +75,8 @@ void KaleidoSetup_Update(PlayState* play) {
if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
if ((gSaveContext.save.cutscene < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) {
if (!Play_InCsMode(play) || ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF))) {
- if ((play->unk_1887C < 2) && (gSaveContext.unk_3F28 != 8) && (gSaveContext.unk_3F28 != 9)) {
+ if ((play->unk_1887C < 2) && (gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) &&
+ (gSaveContext.magicState != MAGIC_STATE_FILL)) {
if (!(gSaveContext.eventInf[1] & 0x80) && !(player->stateFlags1 & 0x20)) {
if (!(play->actorCtx.unk5 & 2) && !(play->actorCtx.unk5 & 4)) {
if ((play->actorCtx.unk268 == 0) && CHECK_BTN_ALL(input->press.button, BTN_START)) {
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index b63af9038..403a69c51 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -139,11 +139,11 @@ u16 sMinigameScoreDigits[] = { 0, 0, 0, 0 };
u16 sCUpInvisible = 0;
u16 sCUpTimer = 0;
-s16 sMagicBarOutlinePrimRed = 255;
-s16 sMagicBarOutlinePrimGreen = 255;
-s16 sMagicBarOutlinePrimBlue = 255;
-s16 D_801BF8AC = 2; // sMagicBorderRatio
-s16 D_801BF8B0 = 1;
+s16 sMagicMeterOutlinePrimRed = 255;
+s16 sMagicMeterOutlinePrimGreen = 255;
+s16 sMagicMeterOutlinePrimBlue = 255;
+s16 sMagicBorderRatio = 2;
+s16 sMagicBorderStep = 1;
s16 sExtraItemBases[] = {
ITEM_STICK, // ITEM_STICKS_5
@@ -225,10 +225,14 @@ s16 sFinalHoursClockColorTargetIndex = 0;
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010CD98.s")
+Gfx* func_8010CFBC(Gfx* displayListHead, void* texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop,
+ s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, s16 r, s16 g, s16 b, s16 a);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010CFBC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D2D4.s")
+Gfx* func_8010D480(Gfx* displayListHead, void* texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop,
+ s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, s16 r, s16 g, s16 b, s16 a, s32 argE, s32 argF);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D480.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_8010D7D0.s")
@@ -600,7 +604,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return item;
} else if (item == ITEM_MAGIC_SMALL) {
- Parameter_AddMagic(play, 0x18);
+ Magic_Add(play, MAGIC_NORMAL_METER / 2);
if (!(gSaveContext.save.weekEventReg[12] & 0x80)) {
gSaveContext.save.weekEventReg[12] |= 0x80;
return ITEM_NONE;
@@ -608,7 +612,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return item;
} else if (item == ITEM_MAGIC_LARGE) {
- Parameter_AddMagic(play, 0x30);
+ Magic_Add(play, MAGIC_NORMAL_METER);
if (!(gSaveContext.save.weekEventReg[12] & 0x80)) {
gSaveContext.save.weekEventReg[12] |= 0x80;
return ITEM_NONE;
@@ -1145,26 +1149,482 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange) {
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Parameter_AddMagic.s")
+void Magic_Add(PlayState* play, s16 magicToAdd) {
+ if (((void)0, gSaveContext.save.playerData.magic) < ((void)0, gSaveContext.magicCapacity)) {
+ gSaveContext.magicToAdd += magicToAdd;
+ gSaveContext.isMagicRequested = true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80115D5C.s")
+void Magic_Reset(PlayState* play) {
+ if ((gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) && (gSaveContext.magicState != MAGIC_STATE_FILL)) {
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80115DB4.s")
+/**
+ * Request to consume magic.
+ *
+ * @param magicToConsume the positive-valued amount to decrease magic by
+ * @param type how the magic is consumed.
+ * @return false if the request failed
+ */
+s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116088.s")
+ // Magic is not acquired yet
+ if (!gSaveContext.save.playerData.isMagicAcquired) {
+ return false;
+ }
-s16 magicBorderColors[][3] = {
+ // Not enough magic available to consume
+ if ((gSaveContext.save.playerData.magic - magicToConsume) < 0) {
+ if (gSaveContext.magicCapacity != 0) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ return false;
+ }
+
+ switch (type) {
+ case MAGIC_CONSUME_NOW:
+ case MAGIC_CONSUME_NOW_ALT:
+ // Drain magic immediately e.g. Deku Bubble
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_WAIT_NO_PREVIEW:
+ // Sets consume target but waits to consume.
+ // No yellow magic to preview target consumption.
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_3;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_LENS:
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = 80;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_LENS;
+ return true;
+ } else {
+ return false;
+ }
+ } else if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_WAIT_PREVIEW:
+ // Sets consume target but waits to consume.
+ // Preview consumption with a yellow bar. e.g. Spin Attack
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ gSaveContext.magicToConsume = magicToConsume;
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_2;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+
+ case MAGIC_CONSUME_GORON_ZORA:
+ // Goron spiked rolling or Zora electric barrier
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = 10;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA_SETUP;
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_GIANTS_MASK:
+ // Wearing Giant's Mask
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ if (gSaveContext.save.playerData.magic != 0) {
+ interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GIANTS_MASK;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_GIANTS_MASK) {
+ return true;
+ } else {
+ return false;
+ }
+
+ case MAGIC_CONSUME_DEITY_BEAM:
+ // Consumes magic immediately
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) ||
+ (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS)) {
+ if (gSaveContext.magicState == MAGIC_STATE_CONSUME_LENS) {
+ play->actorCtx.lensActive = false;
+ }
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ magicToConsume = 0;
+ }
+ gSaveContext.save.playerData.magic -= magicToConsume;
+ return true;
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+ }
+
+ return false;
+}
+
+void Magic_UpdateAddRequest(void) {
+ if (gSaveContext.isMagicRequested) {
+ gSaveContext.save.playerData.magic += 4;
+ play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+
+ if (((void)0, gSaveContext.save.playerData.magic) >= ((void)0, gSaveContext.magicCapacity)) {
+ gSaveContext.save.playerData.magic = gSaveContext.magicCapacity;
+ gSaveContext.magicToAdd = 0;
+ gSaveContext.isMagicRequested = false;
+ } else {
+ gSaveContext.magicToAdd -= 4;
+ if (gSaveContext.magicToAdd <= 0) {
+ gSaveContext.magicToAdd = 0;
+ gSaveContext.isMagicRequested = false;
+ }
+ }
+ }
+}
+
+s16 sMagicBorderColors[][3] = {
{ 255, 255, 255 },
{ 150, 150, 150 },
};
-s16 magicBorderIndices[] = { 0, 1, 1, 0 };
-s16 magicBorderColorTimerIndex[] = { 2, 1, 2, 1 };
+s16 sMagicBorderIndices[] = { 0, 1, 1, 0 };
+s16 sMagicBorderColorTimerIndex[] = { 2, 1, 2, 1 };
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116114.s")
+void Magic_FlashMeterBorder(void) {
+ s16 borderChangeR;
+ s16 borderChangeG;
+ s16 borderChangeB;
+ s16 index = sMagicBorderIndices[sMagicBorderStep];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116348.s")
+ borderChangeR = ABS_ALT(sMagicMeterOutlinePrimRed - sMagicBorderColors[index][0]) / sMagicBorderRatio;
+ borderChangeG = ABS_ALT(sMagicMeterOutlinePrimGreen - sMagicBorderColors[index][1]) / sMagicBorderRatio;
+ borderChangeB = ABS_ALT(sMagicMeterOutlinePrimBlue - sMagicBorderColors[index][2]) / sMagicBorderRatio;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116918.s")
+ if (sMagicMeterOutlinePrimRed >= sMagicBorderColors[index][0]) {
+ sMagicMeterOutlinePrimRed -= borderChangeR;
+ } else {
+ sMagicMeterOutlinePrimRed += borderChangeR;
+ }
+
+ if (sMagicMeterOutlinePrimGreen >= sMagicBorderColors[index][1]) {
+ sMagicMeterOutlinePrimGreen -= borderChangeG;
+ } else {
+ sMagicMeterOutlinePrimGreen += borderChangeG;
+ }
+
+ if (sMagicMeterOutlinePrimBlue >= sMagicBorderColors[index][2]) {
+ sMagicMeterOutlinePrimBlue -= borderChangeB;
+ } else {
+ sMagicMeterOutlinePrimBlue += borderChangeB;
+ }
+
+ sMagicBorderRatio--;
+ if (sMagicBorderRatio == 0) {
+ sMagicMeterOutlinePrimRed = sMagicBorderColors[index][0];
+ sMagicMeterOutlinePrimGreen = sMagicBorderColors[index][1];
+ sMagicMeterOutlinePrimBlue = sMagicBorderColors[index][2];
+
+ sMagicBorderRatio = sMagicBorderColorTimerIndex[sMagicBorderStep];
+
+ sMagicBorderStep++;
+ if (sMagicBorderStep >= 4) {
+ sMagicBorderStep = 0;
+ }
+ }
+}
+
+void Magic_Update(PlayState* play) {
+ MessageContext* msgCtx = &play->msgCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ s16 magicCapacityTarget;
+
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Drank Chateau Romani
+ Magic_FlashMeterBorder();
+ }
+
+ switch (gSaveContext.magicState) {
+ case MAGIC_STATE_STEP_CAPACITY:
+ // Step magicCapacity to the capacity determined by magicLevel
+ // This changes the width of the magic meter drawn
+ magicCapacityTarget = gSaveContext.save.playerData.magicLevel * MAGIC_NORMAL_METER;
+ if (gSaveContext.magicCapacity != magicCapacityTarget) {
+ if (gSaveContext.magicCapacity < magicCapacityTarget) {
+ gSaveContext.magicCapacity += 0x10;
+ if (gSaveContext.magicCapacity > magicCapacityTarget) {
+ gSaveContext.magicCapacity = magicCapacityTarget;
+ }
+ } else {
+ gSaveContext.magicCapacity -= 0x10;
+ if (gSaveContext.magicCapacity <= magicCapacityTarget) {
+ gSaveContext.magicCapacity = magicCapacityTarget;
+ }
+ }
+ } else {
+ // Once the capacity has reached its target,
+ // follow up by filling magic to magicFillTarget
+ gSaveContext.magicState = MAGIC_STATE_FILL;
+ }
+ break;
+
+ case MAGIC_STATE_FILL:
+ // Add magic until magicFillTarget is reached
+ gSaveContext.save.playerData.magic += 0x10;
+
+ if ((gSaveContext.gameMode == 0) && (gSaveContext.sceneSetupIndex < 4)) {
+ play_sound(NA_SE_SY_GAUGE_UP - SFX_FLAG);
+ }
+
+ if (((void)0, gSaveContext.save.playerData.magic) >= ((void)0, gSaveContext.magicFillTarget)) {
+ gSaveContext.save.playerData.magic = gSaveContext.magicFillTarget;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_SETUP:
+ // Sets the speed at which magic border flashes
+ sMagicBorderRatio = 2;
+ gSaveContext.magicState = MAGIC_STATE_CONSUME;
+ break;
+
+ case MAGIC_STATE_CONSUME:
+ // Consume magic until target is reached or no more magic is available
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic =
+ ((void)0, gSaveContext.save.playerData.magic) - ((void)0, gSaveContext.magicToConsume);
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ }
+ // fallthrough (flash border while magic is being consumed)
+ case MAGIC_STATE_METER_FLASH_1:
+ case MAGIC_STATE_METER_FLASH_2:
+ case MAGIC_STATE_METER_FLASH_3:
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_RESET:
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ break;
+
+ case MAGIC_STATE_CONSUME_LENS:
+ // Slowly consume magic while Lens of Truth is active
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
+ (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) &&
+ !Play_InCsMode(play)) {
+
+ if ((gSaveContext.save.playerData.magic == 0) ||
+ ((func_801242DC(play) >= 2) && (func_801242DC(play) <= 4)) ||
+ ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) != ITEM_LENS) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) != ITEM_LENS) &&
+ (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS)) ||
+ !play->actorCtx.lensActive) {
+ // Deactivate Lens of Truth and set magic state to idle
+ play->actorCtx.lensActive = false;
+ play_sound(NA_SE_SY_GLASSMODE_OFF);
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
+ break;
+ }
+
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ interfaceCtx->magicConsumptionTimer = 80;
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_GORON_ZORA_SETUP:
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic -= 2;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA;
+ // fallthrough
+ case MAGIC_STATE_CONSUME_GORON_ZORA:
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == 0) && (msgCtx->msgMode == 0) &&
+ (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->transitionTrigger == TRANS_TRIGGER_OFF) &&
+ (play->transitionMode == TRANS_MODE_OFF)) {
+ if (!Play_InCsMode(play)) {
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ interfaceCtx->magicConsumptionTimer = 10;
+ }
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ case MAGIC_STATE_CONSUME_GIANTS_MASK:
+ if ((play->pauseCtx.state == 0) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) &&
+ (msgCtx->msgMode == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) &&
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
+ if (!Play_InCsMode(play)) {
+ interfaceCtx->magicConsumptionTimer--;
+ if (interfaceCtx->magicConsumptionTimer == 0) {
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ gSaveContext.save.playerData.magic--;
+ }
+ if (gSaveContext.save.playerData.magic <= 0) {
+ gSaveContext.save.playerData.magic = 0;
+ }
+ interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
+ }
+ }
+ }
+ if (!(gSaveContext.save.weekEventReg[14] & 8)) {
+ Magic_FlashMeterBorder();
+ }
+ break;
+
+ default:
+ gSaveContext.magicState = MAGIC_STATE_IDLE;
+ break;
+ }
+}
+
+void Magic_DrawMeter(PlayState* play) {
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+ s16 magicBarY;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (gSaveContext.save.playerData.magicLevel != 0) {
+ if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ magicBarY = 42; // two rows of hearts
+ } else {
+ magicBarY = 34; // one row of hearts
+ }
+
+ func_8012C654(play->state.gfxCtx);
+
+ gDPSetEnvColor(OVERLAY_DISP++, 100, 50, 50, 255);
+
+ OVERLAY_DISP = func_8010CFBC(OVERLAY_DISP, gMagicMeterEndTex, 8, 16, 18, magicBarY, 8, 16, 1 << 10, 1 << 10,
+ sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen, sMagicMeterOutlinePrimBlue,
+ interfaceCtx->magicAlpha);
+ OVERLAY_DISP =
+ func_8010CFBC(OVERLAY_DISP, gMagicMeterMidTex, 24, 16, 26, magicBarY, ((void)0, gSaveContext.magicCapacity),
+ 16, 1 << 10, 1 << 10, sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen,
+ sMagicMeterOutlinePrimBlue, interfaceCtx->magicAlpha);
+ OVERLAY_DISP =
+ func_8010D480(OVERLAY_DISP, gMagicMeterEndTex, 8, 16, ((void)0, gSaveContext.magicCapacity) + 26, magicBarY,
+ 8, 16, 1 << 10, 1 << 10, sMagicMeterOutlinePrimRed, sMagicMeterOutlinePrimGreen,
+ sMagicMeterOutlinePrimBlue, interfaceCtx->magicAlpha, 3, 0x100);
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, PRIMITIVE, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, PRIMITIVE);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255);
+
+ if (gSaveContext.magicState == MAGIC_STATE_METER_FLASH_2) {
+ // Yellow part of the meter indicating the amount of magic to be subtracted
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 250, 250, 0, interfaceCtx->magicAlpha);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gMagicMeterFillTex, 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);
+ gSPTextureRectangle(OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ (((void)0, gSaveContext.save.playerData.magic) + 26) << 2, (magicBarY + 10) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+
+ // Fill the rest of the meter with the normal magic color
+ gDPPipeSync(OVERLAY_DISP++);
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Blue magic (drank Chateau Romani)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 200, interfaceCtx->magicAlpha);
+ } else {
+ // Green magic (default)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 200, 0, interfaceCtx->magicAlpha);
+ }
+
+ gSPTextureRectangle(
+ OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ ((((void)0, gSaveContext.save.playerData.magic) - ((void)0, gSaveContext.magicToConsume)) + 26) << 2,
+ (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ } else {
+ // Fill the whole meter with the normal magic color
+ if (gSaveContext.save.weekEventReg[14] & 8) {
+ // Blue magic (drank Chateau Romani)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 200, interfaceCtx->magicAlpha);
+ } else {
+ // Green magic (default)
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 200, 0, interfaceCtx->magicAlpha);
+ }
+
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gMagicMeterFillTex, 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);
+ gSPTextureRectangle(OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
+ (((void)0, gSaveContext.save.playerData.magic) + 26) << 2, (magicBarY + 10) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/func_80116FD8.s")
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index 5f92d13e5..7b8b67443 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -597,12 +597,12 @@ SavePlayerData sSaveDefaultPlayerData = {
0x30, // healthCapacity
0x30, // health
0, // magicLevel
- 0x30, // magic
+ MAGIC_NORMAL_METER, // magic
0, // rupees
0, // swordHealth
0, // tatlTimer
- 0, // magicAcquired
- 0, // doubleMagic
+ false, // isMagicAcquired
+ false, // isDoubleMagicAcquired
0, // doubleDefense
0, // unk_1F
0xFF, // unk_20
@@ -697,12 +697,12 @@ SavePlayerData sSaveDebugPlayerData = {
0x80, // healthCapacity
0x80, // health
0, // magicLevel
- 0x30, // magic
- 0x32, // rupees
- 0x64, // swordHealth
+ MAGIC_NORMAL_METER, // magic
+ 50, // rupees
+ 100, // swordHealth
0, // tatlTimer
- 1, // magicAcquired
- 0, // doubleMagic
+ true, // isMagicAcquired
+ false, // isDoubleMagicAcquired
0, // doubleDefense
0, // unk_1F
0xFF, // unk_20
diff --git a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
index 16e4832a8..9cf65349f 100644
--- a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
+++ b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
@@ -81,7 +81,7 @@ void ArrowFire_Init(Actor* thisx, PlayState* play) {
void ArrowFire_Destroy(Actor* thisx, PlayState* play) {
ArrowFire* this = THIS;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
Collider_DestroyQuad(play, &this->collider1);
Collider_DestroyQuad(play, &this->collider2);
}
diff --git a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
index 7c4f1f969..88eddb39e 100644
--- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
+++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
@@ -57,7 +57,7 @@ void ArrowIce_Init(Actor* thisx, PlayState* play) {
}
void ArrowIce_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
(void)"消滅"; // Unreferenced in retail, means "Disappearance"
}
diff --git a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
index 1a7503e54..9f974472f 100644
--- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
+++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
@@ -56,7 +56,7 @@ void ArrowLight_Init(Actor* thisx, PlayState* play) {
}
void ArrowLight_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
(void)"消滅"; // Unreferenced in retail, means "Disappearance"
}
diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
index 3ed675c5f..9808e68a4 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -571,13 +571,13 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
} else {
this->unk_1D20 = 1;
}
- XREG(41) = KREG(14) + 20;
+ R_MAGIC_CONSUME_TIMER_GIANTS_MASK = KREG(14) + 20;
this->unk_01AC = 1.0f;
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_TANRON5, 0.0f, 1000.0f, 0.0f, 0, 0, 0, 0);
} else if (this->actor.params == TWINMOLD_TAIL) {
this->actor.update = Boss02_Tail_Update;
this->actor.draw = NULL;
- this->actor.hintId = 0x2E;
+ this->actor.hintId = TATL_HINT_ID_TWINMOLD;
} else {
if (this->actor.params != TWINMOLD_BLUE) {
this->actor.params = TWINMOLD_RED;
diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
index 75378de78..84987a9f5 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
@@ -1762,7 +1762,7 @@ void Boss03_SetupStunned(Boss03* this, PlayState* play) {
}
void Boss03_Stunned(Boss03* this, PlayState* play) {
- this->actor.hintId = 0x29;
+ this->actor.hintId = TATL_HINT_ID_GYORG_STUNNED;
if (this->unk_240 >= 16) {
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_COMMON_WEAKENED - SFX_FLAG);
@@ -1955,7 +1955,7 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
s16 j;
f32 yRot;
- this->actor.hintId = 0x28;
+ this->actor.hintId = TATL_HINT_ID_GYORG;
if (!D_809E9842 && (player->actor.world.pos.y < (PLATFORM_HEIGHT + 5.0f))) {
D_809E9842 = true;
diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
index 3524efa53..e7d96d205 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -163,7 +163,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->actor.params = 0x64;
Actor_SetScale(&this->actor, 0.1f);
this->actor.targetMode = 5;
- this->actor.hintId = 0x19;
+ this->actor.hintId = TATL_HINT_ID_WART;
this->actor.colChkInfo.health = 20;
this->actor.colChkInfo.damageTable = &sDamageTable;
this->unk_700 = 1.0f;
diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
index 64c42a1ce..12da39288 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -649,7 +649,7 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (this->actor.params == DEMO_KANKYO_TYPE_GIANTS) {
- gSPDisplayList(POLY_XLU_DISP++, object_bubble_DL_001000);
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
} else {
gSPDisplayList(POLY_XLU_DISP++, gLightOrbVtxDL);
}
diff --git a/src/overlays/actors/ovl_En_Am/z_en_am.c b/src/overlays/actors/ovl_En_Am/z_en_am.c
index 5b1b488cb..eda01c254 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -128,7 +128,7 @@ static CollisionCheckInfoInit sColChkInfoInit = { 1, 23, 98, MASS_HEAVY };
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 14, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 19, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_ARMOS, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -4000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
index 46d42a817..4ca78d239 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
@@ -139,7 +139,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) {
}
if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6) && (this->actor.child == NULL)) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
@@ -162,13 +162,13 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->bubble.unk_148++;
if (this->bubble.unk_148 > 20) {
this->actionFunc = func_8088ACE0;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
} else {
if ((this->actor.params != ENARROW_8) && (player->unk_D57 == 0)) {
if (this->actor.params == ENARROW_7) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
Actor_MarkForDeath(&this->actor);
return;
@@ -202,7 +202,7 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->bubble.unk_144 = CLAMP_MIN(this->bubble.unk_144, 3.5f);
func_8088A514(this);
this->unk_260 = 99;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
} else if (this->actor.params >= ENARROW_6) {
if ((this->actor.params == ENARROW_8) && (this->actor.world.rot.x < 0)) {
Actor_SetScale(&this->actor, 0.009f);
@@ -310,7 +310,7 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
return;
}
- func_80115D5C(&play->state);
+ Magic_Reset(play);
}
}
}
diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.c b/src/overlays/actors/ovl_En_Az/z_en_az.c
index c025a6f77..a3594bec4 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -5,28 +5,69 @@
*/
#include "z_en_az.h"
+#include "objects/object_az/object_az.h"
+#include "overlays/actors/ovl_En_Twig/z_en_twig.h"
+#include "overlays/actors/ovl_En_Fish/z_en_fish.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
#define THIS ((EnAz*)thisx)
+typedef struct {
+ /* 0x0 */ s16 unk_0;
+ /* 0x4 */ f32 unk_4;
+} struct_80A98F94; // size = 0x8
+
void EnAz_Init(Actor* thisx, PlayState* play);
void EnAz_Destroy(Actor* thisx, PlayState* play);
void EnAz_Update(Actor* thisx, PlayState* play);
void EnAz_Draw(Actor* thisx, PlayState* play);
+void func_80A982E0(PlayState* play, ActorPathing* actorPathing);
+void func_80A98414(EnAz* this, PlayState* play);
+s32 func_80A98DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
+void func_80A98E48(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx);
+void func_80A98EFC(EnAz* this, PlayState* play, u16 textId, s32 arg3, s32 arg4);
+void func_80A98F94(struct_80A98F94* yData, f32 frame, f32* yInterp);
+
+void func_80A95C5C(EnAz* this, PlayState* play);
void func_80A95CEC(EnAz* this, PlayState* play);
+
+void func_80A95DA0(EnAz* this, PlayState* play);
void func_80A95E88(EnAz* this, PlayState* play);
+
+void func_80A95F94(EnAz* this, PlayState* play);
void func_80A95FE8(EnAz* this, PlayState* play);
+
+void func_80A979DC(EnAz* this, PlayState* play);
void func_80A979F4(EnAz* this, PlayState* play);
+
+void func_80A97A28(EnAz* this, PlayState* play);
void func_80A97A40(EnAz* this, PlayState* play);
+
+void func_80A97A9C(EnAz* this, PlayState* play);
void func_80A97AB4(EnAz* this, PlayState* play);
+
+void func_80A97C0C(EnAz* this, PlayState* play);
void func_80A97C24(EnAz* this, PlayState* play);
void func_80A97C4C(EnAz* this, PlayState* play);
+
+void func_80A97D5C(EnAz* this, PlayState* play);
void func_80A97E48(EnAz* this, PlayState* play);
+
+void func_80A97EAC(EnAz* this, PlayState* play);
void func_80A97F9C(EnAz* this, PlayState* play);
-#if 0
+static AnimationSpeedInfo sAnimationInfo[14] = {
+ { &object_az_Anim_00BCFC, 1.0f, ANIMMODE_LOOP, -10.0f }, { &object_az_Anim_00C94C, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &object_az_Anim_008960, 1.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_008BB4, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &object_az_Anim_00925C, 1.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_009B4C, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &object_az_Anim_0086AC, 1.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_007D3C, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &object_az_Anim_008EAC, 2.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_00A25C, 1.0f, ANIMMODE_LOOP, -5.0f },
+ { &object_az_Anim_00AAEC, 1.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_00B94C, 1.0f, ANIMMODE_ONCE, -5.0f },
+ { &object_az_Anim_00C0A0, 1.0f, ANIMMODE_LOOP, -5.0f }, { &object_az_Anim_00C47C, 1.0f, ANIMMODE_LOOP, -5.0f },
+};
+
const ActorInit En_Az_InitVars = {
ACTOR_EN_AZ,
ACTORCAT_NPC,
@@ -39,108 +80,1771 @@ const ActorInit En_Az_InitVars = {
(ActorFunc)EnAz_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80A99110 = {
- { COLTYPE_HIT0, AT_NONE, AC_ON | AC_TYPE_PLAYER | AC_TYPE_ENEMY, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_HIT0,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 18, 46, 0, { 0, 0, 0 } },
};
-#endif
+static EnAz* D_80A9913C = NULL;
-extern ColliderCylinderInit D_80A99110;
+Vec3f D_80A99E80; // path point?
+f32 D_80A99E8C; // player distance to path point?
+f32 D_80A99E90[2]; // unused?
-extern UNK_TYPE D_0600C94C;
-extern UNK_TYPE D_0601ABF0;
+void func_80A94A30(EnAz* this) {
+ this->actor.velocity.y += this->actor.gravity;
+ if (this->actor.velocity.y < this->actor.terminalVelocity) {
+ this->actor.velocity.y = this->actor.terminalVelocity;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A30.s")
+void func_80A94A64(EnAz* this) {
+ func_80A94A30(this);
+ Actor_UpdatePos(&this->actor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A64.s")
+s32 func_80A94A90(PlayState* play, ActorPathing* actorPathing) {
+ func_80A94A64((EnAz*)actorPathing->actor);
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94A90.s")
+void func_80A94AB8(EnAz* this, PlayState* play, s32 spawnIndex) {
+ play->nextEntrance = Entrance_CreateFromSpawn(spawnIndex);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_03;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94AB8.s")
+void func_80A94B20(PlayState* play) {
+ Actor* ring = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94B20.s")
+ do {
+ ring = SubS_FindActor(play, ring, ACTORCAT_MISC, ACTOR_EN_TWIG);
+ if (ring != NULL) {
+ if (RACERING_GET_PARAM_F(ring) == 1) {
+ Actor_MarkForDeath(ring);
+ }
+ ring = ring->next;
+ }
+ } while (ring != NULL);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A94B98.s")
+s32 func_80A94B98(EnAz* this, PlayState* play) {
+ EnTwig* ring;
+ s32 ret = false;
+ Actor* misc = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Init.s")
+ do {
+ if (1) {}
+ ring = (EnTwig*)SubS_FindActor(play, misc, ACTORCAT_MISC, ACTOR_EN_TWIG);
+ if ((ring != NULL) && (RACERING_GET_PARAM_F(&ring->dyna.actor) == 1) && !(ring->unk_16C & 1)) {
+ ret = true;
+ break;
+ }
+ misc = ring->dyna.actor.next;
+ } while (misc != NULL);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Destroy.s")
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A954AC.s")
+static InitChainEntry sInitChain[3] = {
+ ICHAIN_F32(uncullZoneScale, 80, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 80, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95534.s")
+void EnAz_Init(Actor* thisx, PlayState* play2) {
+ static s16 D_80A9914C[7] = { 1, 0, 3, 2, 5, 4, -1 };
+ static s16 D_80A9915C[7] = { 0, 1, 0, 1, 0, 1, 1 };
+ EnAz* this = THIS;
+ PlayState* play = play2;
+ s16 sp4E;
+ s32 phi_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A9565C.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->unk_374 = 0;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->actor.targetMode = 1;
+ switch (BEAVER_GET_PARAM_F00(thisx)) {
+ case 0:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ (gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ case 2:
+ phi_v1 = (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) ||
+ !(gSaveContext.save.weekEventReg[24] & 4);
+ break;
+ case 4:
+ phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
+ break;
+ case 1:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ (gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ case 3:
+ phi_v1 = (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) ||
+ (gSaveContext.save.weekEventReg[24] & 4);
+ break;
+ case 5:
+ phi_v1 = gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 2);
+ break;
+ case 6:
+ phi_v1 = (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 0)) &&
+ !(gSaveContext.save.weekEventReg[93] & 1);
+ phi_v1 = !phi_v1;
+ break;
+ default:
+ phi_v1 = true;
+ break;
+ }
+ if (phi_v1) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95730.s")
+ this->unk_2F8 = D_80A9915C[BEAVER_GET_PARAM_F00(thisx)];
+ if (BEAVER_GET_PARAM_F00(thisx) >= 0) {
+ sp4E = D_80A9914C[BEAVER_GET_PARAM_F00(thisx)];
+ } else {
+ sp4E = -1;
+ }
+ if (this->unk_2F8 == 0) {
+ this->unk_374 |= 2;
+ }
+ SubS_FillCutscenesList(&this->actor, this->unk_3D0, ARRAY_COUNT(this->unk_3D0));
+ if (D_80A9913C == NULL) {
+ D_80A9913C = THIS;
+ this->unk_374 |= 1;
+ }
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
+ if (this->unk_374 & 2) {
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_az_Skel_007438, &object_az_Anim_00C94C, this->jointTable,
+ this->morphTable, OBJECT_AZ_1_LIMB_MAX);
+ Actor_SetScale(&this->actor, 0.012f);
+ } else {
+ SkelAnime_InitFlex(play, &this->skelAnime, &object_az_Skel_017990, &object_az_Anim_00C94C, this->jointTable,
+ this->morphTable, OBJECT_AZ_2_LIMB_MAX);
+ }
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ if (this->unk_374 & 2) {
+ this->collider.dim.radius *= 1.2f;
+ this->collider.dim.height *= 1.2f;
+ this->collider.dim.yShift *= 1.2f;
+ }
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 5);
+ if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ this->unk_374 |= 0x100;
+ this->unk_376 |= 0x100;
+ }
+ Animation_Change(&this->skelAnime, sAnimationInfo[0].animation, 1.0f,
+ Animation_GetLastFrame(sAnimationInfo[0].animation) * Rand_ZeroOne(),
+ Animation_GetLastFrame(sAnimationInfo[0].animation), sAnimationInfo[0].mode,
+ sAnimationInfo[0].morphFrames);
+ this->unk_37E = 0;
+ this->unk_380 = 0;
+ this->unk_384 = 0;
+ this->actor.gravity = -1.0f;
+ this->unk_376 = this->unk_374;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ this->skelAnime.curFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A958B0.s")
+ switch (gSaveContext.save.entrance) {
+ case ENTRANCE(WATERFALL_RAPIDS, 0):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ this->unk_2FA = 5;
+ if (this->unk_374 & 2) {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->unk_374 |= 0x20;
+ }
+ } else {
+ this->unk_2FA = 0;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->unk_374 |= 0x20;
+ }
+ func_80A94B20(play);
+ if (this->unk_2FA == 5) {
+ func_80A97C0C(this, play);
+ } else {
+ func_80A95DA0(this, play);
+ }
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 3):
+ this->unk_2FA = 0;
+ if (!(this->unk_374 & 2)) {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ }
+ if (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 3)) {
+ this->unk_2FA = 0xA;
+ }
+ func_80A97C0C(this, play);
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 1):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 8;
+ } else {
+ this->unk_2FA = 6;
+ }
+ } else {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 3;
+ } else {
+ this->unk_2FA = 1;
+ }
+ }
+ if (this->unk_374 & 1) {
+ SubS_CopyPointFromPathList(play->setupPathList, BEAVER_GET_PARAM_FF(thisx),
+ play->setupPathList[BEAVER_GET_PARAM_FF(thisx)].count - 1, &D_80A99E80);
+ }
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ if (this->unk_374 & 2) {
+ func_80A97D5C(this, play);
+ } else {
+ func_80A979DC(this, play);
+ }
+ } else if (this->unk_374 & 2) {
+ func_80A979DC(this, play);
+ } else {
+ func_80A97D5C(this, play);
+ }
+ break;
+ case ENTRANCE(WATERFALL_RAPIDS, 2):
+ if (gSaveContext.save.weekEventReg[93] & 1) {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 9;
+ } else {
+ this->unk_2FA = 7;
+ }
+ } else {
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ this->unk_2FA = 4;
+ } else {
+ this->unk_2FA = 2;
+ }
+ }
+ if (this->unk_2FA == 2) {
+ if (!(this->unk_374 & 2)) {
+ this->unk_374 |= 0x20;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ this->actionFunc = func_80A97C24;
+ } else {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ func_80A95C5C(this, play);
+ }
+ } else {
+ if (this->unk_374 & 2) {
+ this->unk_374 |= 0x20;
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10000);
+ } else {
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ }
+ this->actionFunc = func_80A97C24;
+ }
+ break;
+ }
+ if (sp4E >= 0) {
+ this->brother = NULL;
+ do {
+ this->brother = (EnAz*)SubS_FindActor(play, &this->brother->actor, ACTORCAT_NPC, ACTOR_EN_AZ);
+ if (this->brother != NULL) {
+ if (sp4E == BEAVER_GET_PARAM_F00(&this->brother->actor)) {
+ break;
+ }
+ this->brother = (EnAz*)this->brother->actor.next;
+ }
+ } while (this->brother != NULL);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95B34.s")
+void EnAz_Destroy(Actor* thisx, PlayState* play2) {
+ EnAz* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95C5C.s")
+ if (gSaveContext.save.entrance != ENTRANCE(WATERFALL_RAPIDS, 1)) {
+ gSaveContext.unk_3DD0[4] = 5;
+ }
+ Collider_DestroyCylinder(play2, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95CEC.s")
+f32 func_80A954AC(EnAz* this) {
+ ActorPathing* pathing = &this->unk_300;
+ Vec3f sp28;
+ Vec3f sp1C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95DA0.s")
+ sp28.x = pathing->curPoint.x - this->actor.world.pos.x;
+ sp28.y = pathing->curPoint.y - this->actor.world.pos.y;
+ sp28.z = pathing->curPoint.z - this->actor.world.pos.z;
+ sp1C.x = pathing->curPoint.x - pathing->prevPoint.x;
+ sp1C.y = pathing->curPoint.y - pathing->prevPoint.y;
+ sp1C.z = pathing->curPoint.z - pathing->prevPoint.z;
+ return Math3D_Parallel(&sp28, &sp1C);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95E88.s")
+s32 func_80A95534(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95F94.s")
+ this->actor.world.rot.x = 0;
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, 0x71C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 2, 0x71C, 0);
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, 0xE38, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, 0x71C, 0);
+ this->actor.gravity = -1.0f;
+ this->unk_36C = 1.5f;
+ if (actorPathing->curPointIndex == actorPathing->endPointIndex) {
+ if (actorPathing->distSqToCurPointXZ < this->unk_36C) {
+ this->unk_36C = actorPathing->distSqToCurPointXZ;
+ }
+ }
+ Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithGravity;
+ if (actorPathing->distSqToCurPointXZ <= this->actor.speedXZ) {
+ ret = true;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A95FE8.s")
+s32 func_80A9565C(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp_f0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A9617C.s")
+ this->actor.gravity = -1.0f;
+ actorPathing->moveFunc = func_80A94A90;
+ this->unk_374 |= 0x2000;
+ temp_f0 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ ret = true;
+ } else {
+ this->unk_39E = this->actor.world.rot.x =
+ Math_Atan2S(-this->actor.velocity.y, Math_CosS(-this->actor.world.rot.x) * this->actor.speedXZ);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97114.s")
+s32 func_80A95730(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp_f0;
+ f32 sp40;
+ s32 sp3C;
+ s32 sp38;
+ s32 sp34;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97274.s")
+ this->actor.gravity = 0.0f;
+ temp_f0 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp_f0 <= 0.0f)) {
+ ret = true;
+ } else {
+ sp40 = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp34 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A973B4.s")
+ sp3C = (s32)(sp34 * sp40) + 0xAAA;
+ sp34 = ABS(actorPathing->rotToCurPoint.y - this->actor.world.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97410.s")
+ Math_SmoothStepToS(&this->actor.world.rot.x, actorPathing->rotToCurPoint.x, 1, sp3C, 0);
+ sp38 = (s32)(sp34 * sp40) + 0xAAA;
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, sp38, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A979DC.s")
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, sp3C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, sp38, 0);
+ }
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithoutGravityReverse;
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A979F4.s")
+s32 func_80A958B0(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret = false;
+ f32 temp;
+ f32 phi_f0;
+ f32 temp1;
+ f32 temp2;
+ f32 sp3C;
+ s32 sp2C;
+ s32 sp28;
+ s32 sp30;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A28.s")
+ this->actor.gravity = 0.0f;
+ temp2 = D_80A99E8C;
+ temp = D_80A99E90[this->unk_2F8];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A40.s")
+ if (temp <= temp2) {
+ phi_f0 = (this->unk_374 & 2) ? 480.0f : 240.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97A9C.s")
+ if (this->actor.xzDistToPlayer < phi_f0) {
+ Math_SmoothStepToF(&this->unk_36C, 12.0f, 0.8f, 0.5f, 0.01f);
+ } else {
+ Math_SmoothStepToF(&this->unk_36C, 6.0f, 0.8f, 0.5f, 0.01f);
+ }
+ } else {
+ Math_SmoothStepToF(&this->unk_36C, 26.0f, 0.5f, 1.0f, 0.01f);
+ }
+ Math_SmoothStepToF(&this->actor.speedXZ, this->unk_36C, 0.8f, 2.0f, 0.0f);
+ temp1 = func_80A954AC(this);
+ if ((actorPathing->distSqToCurPointXZ < SQ(this->actor.speedXZ)) || (temp1 <= 0.0f)) {
+ ret = true;
+ } else {
+ sp3C = SQ(this->actor.speedXZ) / actorPathing->distSqToCurPoint;
+ sp30 = ABS(actorPathing->rotToCurPoint.x - this->actor.world.rot.x);
+ sp2C = (s32)(sp30 * sp3C) + 0xAAA;
+ sp30 = ABS(actorPathing->rotToCurPoint.y - this->actor.world.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97AB4.s")
+ Math_SmoothStepToS(&this->actor.world.rot.x, actorPathing->rotToCurPoint.x, 1, sp2C, 0);
+ sp28 = (s32)(sp30 * sp3C) + 0xAAA;
+ Math_SmoothStepToS(&this->actor.world.rot.y, actorPathing->rotToCurPoint.y, 1, sp28, 0);
+ Math_SmoothStepToS(&this->unk_39E, this->actor.world.rot.x, 2, sp2C, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, sp28, 0);
+ }
+ actorPathing->moveFunc = SubS_ActorPathing_MoveWithoutGravityReverse;
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C0C.s")
+s32 func_80A95B34(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ s32 ret;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C24.s")
+ if (this->unk_374 & 0x100) {
+ if (!(this->unk_374 & 8)) {
+ if (this->unk_374 & 2) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 8, &this->animIndex);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ }
+ this->unk_374 |= 8;
+ }
+ if (this->unk_2FA == 0) {
+ ret = func_80A95730(play, actorPathing);
+ } else {
+ ret = func_80A958B0(play, actorPathing);
+ }
+ } else if (this->actor.bgCheckFlags & 1) {
+ if (this->unk_374 & 8) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 1, &this->animIndex);
+ this->unk_374 &= ~8;
+ }
+ ret = func_80A95534(play, actorPathing);
+ } else {
+ ret = func_80A9565C(play, actorPathing);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97C4C.s")
+void func_80A95C5C(EnAz* this, PlayState* play) {
+ this->actor.draw = NULL;
+ this->actor.world.pos.y = this->actor.home.pos.y + 120.0f;
+ this->actor.gravity = -1.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_3C0 = 0;
+ this->actionFunc = func_80A95CEC;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97D5C.s")
+void func_80A95CEC(EnAz* this, PlayState* play) {
+ if (this->unk_374 & 0x8000) {
+ if (!(this->actor.bgCheckFlags & 1)) {
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actor.draw = EnAz_Draw;
+ Actor_MoveWithGravity(&this->actor);
+ func_800B9010(&this->actor, NA_SE_EV_HONEYCOMB_FALL - SFX_FLAG);
+ } else {
+ if (this->actor.bgCheckFlags & 2) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
+ }
+ if (SubS_StartActorCutscene(&this->actor, 0x7C, this->unk_3D0[0], SUBS_CUTSCENE_NORMAL)) {
+ func_80A97C0C(this, play);
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97E48.s")
+void func_80A95DA0(EnAz* this, PlayState* play) {
+ ActorPathing* sp40 = &this->unk_300;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97EAC.s")
+ SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, sp40, play->setupPathList,
+ BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 1);
+ this->unk_36C = 4.0f;
+ this->actor.speedXZ = 4.0f;
+ this->actor.gravity = 0.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_374 |= 0x1000;
+ Math_Vec3f_Copy(&this->actor.world.pos, &sp40->curPoint);
+ this->actionFunc = func_80A95E88;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A97F9C.s")
+void func_80A95E88(EnAz* this, PlayState* play) {
+ SubS_ActorPathing_Update(play, &this->unk_300, func_80A982E0, func_80A95B34, SubS_ActorPathing_MoveWithGravity,
+ SubS_ActorPathing_SetNextPoint);
+ if (this->actor.depthInWater > 8.0f) {
+ if (this->unk_374 & 2) {
+ if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ }
+ } else {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ }
+ }
+ if (!(this->unk_374 & 0x2000)) {
+ SkelAnime_Update(&this->skelAnime);
+ }
+ this->unk_374 &= ~0x2000;
+ if (this->actor.isTargeted) {
+ func_80A95F94(this, play);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A982E0.s")
+void func_80A95F94(EnAz* this, PlayState* play) {
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ this->unk_39E = 0;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actionFunc = func_80A95FE8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98414.s")
+void func_80A95FE8(EnAz* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (ActorCutscene_GetCanPlayNext(this->unk_3D0[0])) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->unk_3D0[0], &this->actor);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->unk_3D0[0]);
+ }
+ if (Actor_DistanceToPoint(&this->actor, &this->actor.home.pos) > 20.0f) {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ func_800BE33C(&this->actor.world.pos, &this->actor.home.pos, &this->actor.world.rot, 0);
+ Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x, 3, 0xE38, 0x38E);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0xE38, 0x38E);
+ this->actor.shape.rot.z = 0;
+ Actor_MoveWithoutGravityReverse(&this->actor);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ this->unk_374 &= ~0x1000;
+ this->actor.gravity = -1.0f;
+ this->actor.speedXZ = 0.0f;
+ Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 3, 0x1000, 0x100);
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x1038, 0x100);
+ if (this->actor.bgCheckFlags & 1) {
+ this->actor.shape.rot.x = 0;
+ this->actor.gravity = 0.0f;
+ func_80A97C0C(this, play);
+ ActorCutscene_Stop(this->unk_3D0[0]);
+ }
+ Actor_MoveWithGravity(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Update.s")
+s32 func_80A9617C(EnAz* this, PlayState* play) {
+ s32 pad[2];
+ s32 ret = 2;
+ EnAz* brother = this->brother;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/EnAz_Draw.s")
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ case TEXT_STATE_5:
+ case TEXT_STATE_DONE:
+ if ((play->msgCtx.currentTextId == 0x10DD) && (this->unk_374 & 0x8000)) {
+ if (SubS_StartActorCutscene(&brother->actor, brother->unk_3D0[0], 0x7C, SUBS_CUTSCENE_NORMAL)) {
+ brother->unk_374 |= 0x8000;
+ play->msgCtx.msgMode = 0x44;
+ ret = 0;
+ }
+ } else if (Message_ShouldAdvance(play)) {
+ ret = 3;
+ switch (play->msgCtx.currentTextId) {
+ case 0x70:
+ case 0xCD:
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ this->actor.textId = 0x10F2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 11, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 11, &brother->animIndex);
+ break;
+ case 0x10CE:
+ this->actor.textId = 0x10CF;
+ gSaveContext.save.weekEventReg[16] |= 0x40;
+ break;
+ case 0x10CF:
+ this->actor.textId = 0x10D0;
+ break;
+ case 0x10D0:
+ this->actor.textId = 0x10D1;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 5, &this->animIndex);
+ break;
+ case 0x10D1:
+ this->actor.textId = 0x10D2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10D2:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ this->actor.textId = 0x10D6;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 5, &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10D3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 11, &this->animIndex);
+ }
+ break;
+ case 0x10D3:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10D4:
+ this->actor.textId = 0x10D2;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10D6:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ func_80A979DC(this, play);
+ this->unk_2FA = 1;
+ ret = 0;
+ break;
+ case 0x10D7:
+ this->actor.textId = 0x10D8;
+ break;
+ case 0x10D8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ switch (this->unk_2FA) {
+ case 2:
+ this->unk_2FA = 1;
+ break;
+ case 4:
+ this->unk_2FA = 3;
+ break;
+ case 7:
+ this->unk_2FA = 6;
+ break;
+ case 9:
+ this->unk_2FA = 8;
+ break;
+ }
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10D9;
+ }
+ break;
+ case 0x10D9:
+ if ((this->unk_2FA == 3) || (this->unk_2FA == 8)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10DA:
+ this->actor.textId = 0x10DB;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10DB:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ play->msgCtx.msgMode = 0x44;
+ this->unk_2FA = 1;
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10DC;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 11, &this->animIndex);
+ }
+ break;
+ case 0x10DC:
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10DD:
+ func_80A98EFC(this, play, 0x10DE, 13, 9);
+ this->unk_374 |= 0x8000;
+ ret = 2;
+ break;
+ case 0x10DE:
+ func_80A98EFC(this, play, 0x10DF, 12, 10);
+ ret = 0;
+ break;
+ case 0x10DF:
+ func_80A98EFC(this, play, 0x10E0, 13, 9);
+ ret = 0;
+ break;
+ case 0x10E0:
+ func_80A98EFC(this, play, 0x10E1, 12, 10);
+ ret = 0;
+ break;
+ case 0x10E1:
+ func_80A98EFC(this, play, 0x10E2, 13, 9);
+ ret = 0;
+ break;
+ case 0x10E2:
+ this->actor.textId = 0x10E3;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10E3:
+ func_80A98EFC(this, play, 0x10E4, 0, 4);
+ ret = 0;
+ break;
+ case 0x10E4:
+ func_80A98EFC(this, play, 0x10E5, 0, 4);
+ ret = 0;
+ break;
+ case 0x10E5:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ this->actor.textId = 0x10E8;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10E6;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 9, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 13,
+ &brother->animIndex);
+ }
+ break;
+ case 0x10E6:
+ this->actor.textId = 0x10E7;
+ func_80A98EFC(this, play, 0x10E7, 0, 10);
+ ret = 0;
+ break;
+ case 0x10E7:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ func_80A94AB8(this, play, 0);
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10E8:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ this->unk_2FA = 3;
+ ret = 0;
+ break;
+ case 0x10E9:
+ func_80A98EFC(this, play, 0x10EA, 12, 4);
+ ret = 0;
+ break;
+ case 0x10EA:
+ func_80A98EFC(this, play, 0x10EB, 0, 4);
+ ret = 0;
+ break;
+ case 0x10EB:
+ if (play->msgCtx.choiceIndex == 0) {
+ play->msgCtx.msgMode = 0x44;
+ func_8019F208();
+ switch (this->unk_2FA) {
+ case 4:
+ this->unk_2FA = 3;
+ break;
+ case 7:
+ this->unk_2FA = 6;
+ break;
+ case 9:
+ default:
+ this->unk_2FA = 8;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98DA4.s")
+ break;
+ }
+ ret = 0;
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10EC;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 7, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 13,
+ &brother->animIndex);
+ }
+ break;
+ case 0x10EC:
+ func_80A98EFC(this, play, 0x10ED, -1, 6);
+ ret = 0;
+ break;
+ case 0x10ED:
+ if ((this->unk_2FA == 4) || (this->unk_2FA == 9)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10EE:
+ func_80A98EFC(this, play, 0x10EF, 12, 10);
+ ret = 0;
+ break;
+ case 0x10EF:
+ func_80A98EFC(this, play, 0x10F0, 13, 9);
+ ret = 0;
+ break;
+ case 0x10F0:
+ func_80A98EFC(this, play, 0x10F1, 12, 10);
+ ret = 0;
+ break;
+ case 0x10F1:
+ gSaveContext.save.weekEventReg[93] |= 1;
+ if (gSaveContext.save.weekEventReg[23] & 0x80) {
+ this->getItemId = GI_RUPEE_RED;
+ } else {
+ this->getItemId = GI_BOTTLE;
+ gSaveContext.save.weekEventReg[23] |= 0x80;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ ret = 7;
+ break;
+ case 0x10F2:
+ case 0x1109:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10F3:
+ func_80A98EFC(this, play, 0x10F4, 12, 10);
+ ret = 0;
+ break;
+ case 0x10F4:
+ func_80A98EFC(this, play, 0x10F5, 13, 9);
+ ret = 0;
+ break;
+ case 0x10F5:
+ func_80A98EFC(this, play, 0x10F6, 12, 10);
+ ret = 0;
+ break;
+ case 0x10F6:
+ func_80A98EFC(this, play, 0x10F7, 13, 5);
+ ret = 0;
+ break;
+ case 0x10F7:
+ this->actor.textId = 0x10F8;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10F8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->actor.textId = 0x1107;
+ } else {
+ this->actor.textId = 0x10FA;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 5, &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10F9;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 11, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 11,
+ &brother->animIndex);
+ }
+ break;
+ case 0x10F9:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ case 0x10FA:
+ case 0x1107:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ this->unk_2FA = 6;
+ ret = 0;
+ break;
+ case 0x10FB:
+ func_80A98EFC(this, play, 0x10FC, 12, 10);
+ ret = 0;
+ break;
+ case 0x10FC:
+ func_80A98EFC(this, play, 0x10FD, 13, 4);
+ ret = 0;
+ break;
+ case 0x10FD:
+ this->actor.textId = 0x10FE;
+ ret = 3;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ break;
+ case 0x10FE:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->actor.textId = 0x1108;
+ } else {
+ this->actor.textId = 0x1101;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ } else {
+ func_8019F230();
+ this->actor.textId = 0x10FF;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 9, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 13,
+ &brother->animIndex);
+ }
+ break;
+ case 0x10FF:
+ func_80A98EFC(this, play, 0x1100, 12, 10);
+ ret = 0;
+ break;
+ case 0x1100:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x1101:
+ case 0x1108:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ this->unk_2FA = 8;
+ ret = 0;
+ break;
+ case 0x1102:
+ func_80A98EFC(this, play, 0x1103, 12, 10);
+ ret = 0;
+ break;
+ case 0x1103:
+ func_80A98EFC(this, play, 0x1104, 13, 9);
+ ret = 0;
+ break;
+ case 0x1104:
+ func_80A98EFC(this, play, 0x1105, 12, 10);
+ ret = 0;
+ break;
+ case 0x1105:
+ if (gSaveContext.save.weekEventReg[25] & 1) {
+ this->getItemId = GI_RUPEE_PURPLE;
+ } else {
+ this->getItemId = GI_HEART_PIECE;
+ gSaveContext.save.weekEventReg[25] |= 1;
+ }
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ ret = 7;
+ break;
+ case 0x1106:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 0, &brother->animIndex);
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ ret = 0;
+ break;
+ case 0x10D5:
+ default:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ this->unk_374 |= 0x20;
+ ret = 0;
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_NONE:
+ case TEXT_STATE_1:
+ case TEXT_STATE_CLOSING:
+ case TEXT_STATE_3:
+ break;
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98E48.s")
+void func_80A97114(EnAz* this, PlayState* play) {
+ EnAz* brother = this->brother;
+ s32 sp20 = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98EFC.s")
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ switch (this->actor.textId) {
+ case 0x10DA:
+ case 0x10DD:
+ case 0x10E9:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10EE:
+ case 0x10F3:
+ case 0x10FB:
+ case 0x1102:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 9, &this->animIndex);
+ sp20 = true;
+ break;
+ case 0x10F2:
+ case 0x1106:
+ case 0x1109:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 11, &this->animIndex);
+ if (brother != NULL) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 11, &brother->animIndex);
+ }
+ break;
+ }
+ if ((brother != NULL) && sp20) {
+ if (this->unk_374 & 2) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 13, &brother->animIndex);
+ } else {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, 12, &brother->animIndex);
+ }
+ }
+ this->unk_374 &= ~0x20;
+ this->unk_378 = 2;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Az/func_80A98F94.s")
+s32 func_80A97274(EnAz* this, PlayState* play) {
+ s32 textId;
+
+ if (this->unk_374 & 0x4000) {
+ return 0x10D7;
+ }
+ switch (this->unk_2FA) {
+ case 0:
+ default:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ if (!(gSaveContext.save.weekEventReg[16] & 0x40)) {
+ textId = 0x10CE;
+ } else {
+ textId = 0x10D4;
+ }
+ break;
+ case 2:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ gSaveContext.save.weekEventReg[24] |= 4;
+ this->unk_3C0 = 0;
+ textId = 0x10DD;
+ } else {
+ textId = 0x10DA;
+ }
+ break;
+ case 4:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ textId = 0x10EE;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ case 5:
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ textId = 0x10F3;
+ break;
+ case 7:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ gSaveContext.save.weekEventReg[24] |= 4;
+ textId = 0x10FB;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ case 9:
+ if (gSaveContext.save.weekEventReg[24] & 1) {
+ textId = 0x1102;
+ } else {
+ textId = 0x10E9;
+ }
+ break;
+ }
+ return textId;
+}
+
+s32 func_80A973B4(EnAz* this, PlayState* play) {
+ s32 ret = 0;
+
+ if (this->getItemId != GI_RUPEE_RED) {
+ if ((this->getItemId != GI_RUPEE_PURPLE) && (this->getItemId != GI_HEART_PIECE)) {
+ if (this->getItemId == GI_BOTTLE) {
+ ret = 0x10F2;
+ }
+ } else {
+ ret = 0x1106;
+ }
+ } else {
+ ret = 0x1109;
+ }
+ this->unk_374 |= 0x20;
+
+ return ret;
+}
+
+void func_80A97410(EnAz* this, PlayState* play) {
+ s16 sp56;
+ s16 sp54;
+ s32 temp_a0;
+
+ if (this->unk_378 != 0) {
+ Vec3f* thisPos = &this->actor.world.pos;
+
+ if ((this->unk_2FA == 0) && !(this->unk_374 & 2)) {
+ Math_SmoothStepToS(&this->unk_3D4, 0, 2, 0x71C, 0xA);
+ Math_SmoothStepToS(&this->unk_3D6, 0, 3, 0x71C, 0xA);
+ }
+ if (this->brother != NULL) {
+ Vec3f* broPos = &this->brother->actor.world.pos;
+
+ if (this->unk_374 & 0x40) {
+ this->actor.focus.pos.x = (thisPos->x * 0.5f) + (broPos->x * 0.5f);
+ this->actor.focus.pos.y = (thisPos->y * 0.5f) + (broPos->y * 0.5f) + 45.0f;
+ this->actor.focus.pos.z = (thisPos->z * 0.5f) + (broPos->z * 0.5f);
+ } else {
+ this->actor.focus.pos.x = (thisPos->x * 0.7f) + (broPos->x * 0.3f);
+ this->actor.focus.pos.y = (thisPos->y * 0.7f) + (broPos->y * 0.3f) + 45.0f;
+ this->actor.focus.pos.z = (thisPos->z * 0.7f) + (broPos->z * 0.3f);
+ }
+ } else {
+ this->actor.focus.pos.x = thisPos->x;
+ this->actor.focus.pos.y = thisPos->y;
+ this->actor.focus.pos.z = thisPos->z;
+ }
+ this->actor.focus.rot.x = this->actor.world.rot.x;
+ this->actor.focus.rot.y = this->actor.world.rot.y;
+ this->actor.focus.rot.z = this->actor.world.rot.z;
+ }
+ if (this->unk_378 == 2) {
+ this->unk_378 = func_80A9617C(this, play);
+ if (this->unk_378 == 0) {
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ }
+ }
+ if (this->unk_378 == 3) {
+ func_80151938(play, this->actor.textId);
+ this->unk_378 = 2;
+ } else if (this->unk_378 == 5) {
+ Message_StartTextbox(play, this->actor.textId, &this->actor);
+ this->unk_378 = 2;
+ } else {
+ if ((this->unk_378 == 6) || (this->unk_378 == 7)) {
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ if (this->unk_378 == 7) {
+ this->unk_378 = 1;
+ this->unk_374 |= 0x20;
+ } else {
+ this->unk_378 = 0;
+ }
+ } else {
+ Actor_PickUp(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
+ }
+ }
+ if (this->unk_378 == 9) {
+ temp_a0 = Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38, 0x222);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ if (temp_a0 == 0) {
+ switch (this->unk_3D2) {
+ case 0x10CE:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 4, &this->animIndex);
+ break;
+ case 0x10D4:
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 5, &this->animIndex);
+ break;
+ }
+ Message_StartTextbox(play, this->unk_3D2, &this->actor);
+ this->actor.textId = this->unk_3D2;
+ this->unk_378 = 2;
+ }
+ } else if (((this->unk_378 == 0) || (this->unk_378 == 1)) && (this->unk_374 & 0x20)) {
+ if (this->unk_378 == 1) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ func_80A97114(this, play);
+ this->unk_378 = 2;
+ } else if (func_800B8500(&this->actor, play, this->actor.xzDistToPlayer, this->actor.playerHeightRel,
+ PLAYER_AP_MINUS1)) {
+ this->actor.textId = func_80A973B4(this, play);
+ }
+ } else {
+ if ((this->unk_2FA == 0) && !(this->unk_374 & 2)) {
+ Player* player = GET_PLAYER(play);
+ Vec3f sp38;
+ s16 temp_a1_2 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
+ s16 temp_v0_7;
+
+ if (ABS(temp_a1_2) < 0x1800) {
+ Math_SmoothStepToS(&this->unk_3D4, temp_a1_2, 2, 0x71C, 0);
+ } else {
+ Math_SmoothStepToS(&this->unk_3D4, 0, 2, 0x71C, 0);
+ }
+ Math_Vec3f_Copy(&sp38, &player->actor.world.pos);
+ sp38.y = player->bodyPartsPos[7].y + 3.0f;
+ temp_v0_7 = Math_Vec3f_Pitch(&this->actor.focus.pos, &sp38);
+ if (ABS(temp_v0_7) < 0x800) {
+ Math_SmoothStepToS(&this->unk_3D6, temp_v0_7, 3, 0x71C, 0);
+ } else {
+ Math_SmoothStepToS(&this->unk_3D6, 0, 3, 0x71C, 0);
+ }
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ func_80A97114(this, play);
+ this->unk_378 = 2;
+ if ((this->unk_3D2 == 0x10CE) || (this->unk_3D2 == 0x10D4)) {
+ this->unk_378 = 9;
+ }
+ } else {
+ Actor_GetScreenPos(play, &this->actor, &sp56, &sp54);
+ if ((sp56 >= 0) && (sp56 <= SCREEN_WIDTH) && (sp54 >= 0) && (sp54 <= SCREEN_HEIGHT) &&
+ func_800B8500(&this->actor, play, 120.0f, 120.0f, 0)) {
+ this->unk_3D2 = func_80A97274(this, play);
+ if ((this->unk_3D2 == 0x10CE) || (this->unk_3D2 == 0x10D4)) {
+ this->actor.textId = 0;
+ } else {
+ this->actor.textId = this->unk_3D2;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void func_80A979DC(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A979F4;
+}
+
+void func_80A979F4(EnAz* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ Actor_MoveWithGravity(&this->actor);
+}
+
+void func_80A97A28(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97A40;
+}
+
+void func_80A97A40(EnAz* this, PlayState* play) {
+ if (SubS_StartActorCutscene(&this->actor, 0, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ play->msgCtx.msgMode = 0;
+ play->msgCtx.msgLength = 0;
+ func_80A97A9C(this, play);
+ }
+}
+
+void func_80A97A9C(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97AB4;
+}
+
+void func_80A97AB4(EnAz* this, PlayState* play) {
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_NONE:
+ Message_StartTextbox(play, 0x10D7, NULL);
+ break;
+ case TEXT_STATE_CHOICE:
+ case TEXT_STATE_5:
+ case TEXT_STATE_DONE:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x10D7:
+ func_80151938(play, 0x10D8);
+ break;
+ case 0x10D8:
+ if (play->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ play->msgCtx.msgMode = 0x44;
+ func_800FD750(NA_BGM_MINI_GAME_2);
+ func_80A94AB8(this, play, 1);
+ func_80A979DC(this, play);
+ } else {
+ func_8019F230();
+ if (gSaveContext.save.weekEventReg[24] & 4) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~4;
+ }
+ func_80151938(play, 0x10D9);
+ }
+ break;
+ case 0x10D9:
+ func_80A94AB8(this, play, 0);
+ func_80A979DC(this, play);
+ break;
+ }
+ }
+ case TEXT_STATE_1:
+ case TEXT_STATE_CLOSING:
+ break;
+ }
+}
+
+void func_80A97C0C(EnAz* this, PlayState* play) {
+ this->actionFunc = func_80A97C4C;
+}
+
+void func_80A97C24(EnAz* this, PlayState* play) {
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->actionFunc = func_80A97C4C;
+}
+
+void func_80A97C4C(EnAz* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->animIndex == 0xB)) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 0, &this->animIndex);
+ }
+ func_80A97410(this, play);
+ if ((this->unk_2FA == 1) || (this->unk_2FA == 3) || (this->unk_2FA == 6) || (this->unk_2FA == 8)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ func_800FD750(NA_BGM_MINI_GAME_2);
+ play->nextEntrance = Entrance_CreateFromSpawn(1);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_80;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ func_80A979DC(this, play);
+ } else {
+ Actor_MoveWithGravity(&this->actor);
+ }
+}
+
+void func_80A97D5C(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ player->stateFlags1 |= PLAYER_STATE1_20;
+ func_80112AFC(play);
+ gSaveContext.minigameScore = (this->unk_374 & 2) ? 25 : 20;
+ play->interfaceCtx.unk_280 = 1;
+ if ((this->unk_2FA == 1) || (this->unk_2FA == 3)) {
+ func_8010E9F0(4, 120);
+ } else if (gSaveContext.save.weekEventReg[25] & 1) {
+ func_8010E9F0(4, 100);
+ } else {
+ func_8010E9F0(4, 110);
+ }
+ this->actionFunc = func_80A97E48;
+}
+
+void func_80A97E48(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ if (play->interfaceCtx.unk_280 >= 8) {
+ player->stateFlags1 &= ~PLAYER_STATE1_20;
+ func_80A97EAC(this, play);
+ }
+ Actor_MoveWithGravity(&this->actor);
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80A97EAC(EnAz* this, PlayState* play) {
+ SubS_ActorPathing_Init(play, &this->actor.world.pos, &this->actor, &this->unk_300, play->setupPathList,
+ BEAVER_GET_PARAM_FF(&this->actor), 0, 0, 1, 0);
+ this->unk_36C = 8.0f;
+ this->actor.speedXZ = 8.0f;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 6.0f;
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, 2, &this->animIndex);
+ this->actor.flags |= ACTOR_FLAG_8000000;
+ this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
+ this->actor.bgCheckFlags &= ~0x21;
+ this->unk_374 |= 0x1000;
+ this->unk_3C2 = 0;
+ this->unk_3C4 = 0;
+ this->actionFunc = func_80A97F9C;
+}
+
+void func_80A97F9C(EnAz* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ D_80A99E8C =
+ Math3D_XZDistanceSquared(player->actor.world.pos.x, player->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z);
+ if (Math3D_XZDistanceSquared(this->actor.world.pos.x, this->actor.world.pos.z, D_80A99E80.x, D_80A99E80.z) >=
+ SQ(1000.0f)) {
+ this->unk_374 |= 0x1000;
+ }
+ if (!(this->unk_300.flags & ACTOR_PATHING_REACHED_END_PERMANENT)) {
+ SubS_ActorPathing_Update(play, &this->unk_300, func_80A982E0, func_80A95B34, SubS_ActorPathing_MoveWithGravity,
+ SubS_ActorPathing_SetNextPoint);
+ }
+ if (!(this->unk_374 & 0x10) &&
+ SurfaceType_IsHorseBlocked(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ this->unk_374 |= 0x10;
+ }
+ if (SurfaceType_IsHorseBlocked(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId)) {
+ if (func_80A94B98(this, play)) {
+ gSaveContext.save.weekEventReg[24] &= (u8)~1;
+ } else {
+ gSaveContext.save.weekEventReg[24] |= 1;
+ }
+ gSaveContext.unk_3DD0[4] = 5;
+ this->unk_374 &= ~0x10;
+ play->nextEntrance = Entrance_CreateFromSpawn(2);
+ gSaveContext.nextCutsceneIndex = 0;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_03;
+ gSaveContext.nextTransitionType = TRANS_TYPE_03;
+ this->actor.speedXZ = 0.0f;
+ func_80A979DC(this, play);
+ } else {
+ if (gSaveContext.unk_3DE0[4] == 0) {
+ gSaveContext.unk_3DD0[4] = 5;
+ this->unk_374 |= 0x4000;
+ func_80A97A28(this, play);
+ }
+ if (this->unk_374 & 0x100) {
+ if (this->actor.flags & ACTOR_FLAG_40) {
+ func_80A98414(this, play);
+ }
+ if ((DECR(this->unk_37A) == 0) && (this->actor.flags & ACTOR_FLAG_40)) {
+ EffectSsBubble_Spawn(play, &this->actor.world.pos, 0.0f, 20.0f, 20.0f, 0.35f);
+ this->unk_37A = (Rand_ZeroOne() * 70.0f) + 10.0f;
+ }
+ }
+ if (this->actor.depthInWater > 8.0f) {
+ if (this->unk_374 & 2) {
+ if ((this->skelAnime.curFrame < this->skelAnime.playSpeed) && (this->skelAnime.curFrame >= 0.0f)) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BEAVER_SWIM_HAND);
+ }
+ } else {
+ func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
+ }
+ }
+ SkelAnime_Update(&this->skelAnime);
+ }
+}
+
+void func_80A982E0(PlayState* play, ActorPathing* actorPathing) {
+ EnAz* this = (EnAz*)actorPathing->actor;
+ Vec3f sp28;
+
+ actorPathing->curPoint.x = actorPathing->points[actorPathing->curPointIndex].x;
+ if (this->actor.bgCheckFlags & 1) {
+ actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y;
+ } else {
+ actorPathing->curPoint.y = actorPathing->points[actorPathing->curPointIndex].y - this->unk_3A4;
+ }
+ actorPathing->curPoint.z = actorPathing->points[actorPathing->curPointIndex].z;
+ sp28.x = actorPathing->curPoint.x - actorPathing->worldPos->x;
+ sp28.y = actorPathing->curPoint.y - actorPathing->worldPos->y;
+ sp28.z = actorPathing->curPoint.z - actorPathing->worldPos->z;
+ actorPathing->distSqToCurPointXZ = Math3D_XZLengthSquared(sp28.x, sp28.z);
+ actorPathing->distSqToCurPoint = Math3D_LengthSquared(&sp28);
+ actorPathing->rotToCurPoint.y = Math_FAtan2F(sp28.z, sp28.x);
+ actorPathing->rotToCurPoint.x = Math_FAtan2F(sqrtf(actorPathing->distSqToCurPointXZ), -sp28.y);
+ actorPathing->rotToCurPoint.z = 0;
+}
+
+void func_80A98414(EnAz* this, PlayState* play) {
+ Actor* itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
+
+ while (itemAction != NULL) {
+ if (itemAction->id == ACTOR_EN_FISH) {
+ EnFish* fish = (EnFish*)itemAction;
+
+ if ((fish->actor.params < 0) && (fish->actor.room == this->actor.room) &&
+ (Math3D_Vec3fDistSq(&this->actor.world.pos, &fish->actor.world.pos) < SQ(200.0f))) {
+ fish->unk_276 = 0x14;
+ fish->unk_274 = Actor_YawBetweenActors(&fish->actor, &this->actor);
+ }
+ }
+ itemAction = itemAction->next;
+ }
+}
+
+void EnAz_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnAz* this = THIS;
+
+ this->unk_374 &= ~0x100;
+ if ((this->actor.bgCheckFlags & 0x20) && (this->actor.depthInWater > 22.0f)) {
+ if (!(this->unk_376 & 0x100)) {
+ this->unk_374 |= 0x200;
+ }
+ this->unk_374 |= 0x100;
+ } else if (this->unk_376 & 0x100) {
+ this->unk_374 |= 0x400;
+ }
+ this->actionFunc(this, play);
+ Actor_SetFocus(&this->actor, 40.0f);
+ if (this->unk_374 & 0x200) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_DIVE_INTO_WATER);
+ }
+ if (this->unk_374 & 0x400) {
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_JUMP_OUT_WATER);
+ }
+ this->unk_37E++;
+ if (this->unk_37E >= 4) {
+ this->unk_37E = 0;
+ }
+ this->unk_380++;
+ if (this->unk_380 >= 3) {
+ this->unk_380 = 0;
+ }
+ this->unk_384--;
+ if (this->unk_384 < 0) {
+ this->unk_384 = 2;
+ }
+ this->unk_39C++;
+ if (this->unk_39C >= 16) {
+ this->unk_39C = 0;
+ }
+ if (!(this->unk_374 & 0x1000)) {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ } else {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 0x400);
+ this->unk_374 &= ~0x1000;
+ }
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+
+ this->unk_376 = this->unk_374;
+ this->unk_374 &= ~0x600;
+
+ if (GET_ACTIVE_CAM(play)->stateFlags & CAM_STATE_UNDERWATER) {
+ this->unk_374 |= 0x800;
+ } else {
+ this->unk_374 &= ~0x800;
+ }
+}
+
+static Gfx* D_80A9916C[5] = {
+ object_az_DL_01A600, object_az_DL_01A730, object_az_DL_01A860, object_az_DL_01A990, object_az_DL_01AAC0,
+};
+static AnimatedMaterial* D_80A99180[5] = {
+ object_az_Matanimheader_01A6E8, object_az_Matanimheader_01A818, object_az_Matanimheader_01A948,
+ object_az_Matanimheader_01AA78, object_az_Matanimheader_01ABA8,
+};
+static u8 D_80A99194[5] = {
+ 95, 135, 175, 215, 255,
+};
+static u8 D_80A9919C[5] = {
+ 31, 45, 58, 73, 85,
+};
+static struct_80124618 D_80A991A4[5][9] = {
+ {
+ { 0, { 200, 160, 160 } },
+ { 2, { 250, 210, 210 } },
+ { 4, { 200, 160, 160 } },
+ { 6, { 250, 210, 210 } },
+ { 8, { 200, 160, 160 } },
+ { 10, { 250, 210, 210 } },
+ { 12, { 200, 160, 160 } },
+ { 14, { 250, 210, 210 } },
+ { 16, { 200, 160, 160 } },
+ },
+ {
+ { 0, { 330, 200, 200 } },
+ { 2, { 280, 150, 150 } },
+ { 4, { 330, 200, 200 } },
+ { 6, { 280, 150, 150 } },
+ { 8, { 330, 200, 200 } },
+ { 10, { 280, 150, 150 } },
+ { 12, { 330, 200, 200 } },
+ { 14, { 280, 150, 150 } },
+ { 16, { 330, 200, 200 } },
+ },
+ {
+ { 0, { 350, 170, 120 } },
+ { 2, { 400, 220, 170 } },
+ { 4, { 350, 170, 120 } },
+ { 6, { 400, 220, 170 } },
+ { 8, { 350, 170, 120 } },
+ { 10, { 400, 220, 170 } },
+ { 12, { 350, 170, 120 } },
+ { 14, { 400, 220, 170 } },
+ { 16, { 350, 170, 120 } },
+ },
+ {
+ { 0, { 480, 216, 156 } },
+ { 2, { 540, 216, 156 } },
+ { 4, { 450, 300, 216 } },
+ { 6, { 540, 216, 156 } },
+ { 8, { 450, 300, 216 } },
+ { 10, { 540, 216, 156 } },
+ { 12, { 450, 300, 216 } },
+ { 14, { 540, 300, 156 } },
+ { 16, { 450, 250, 216 } },
+ },
+ {
+ { 0, { 600, 375, 160 } },
+ { 2, { 640, 510, 200 } },
+ { 4, { 600, 375, 160 } },
+ { 6, { 640, 510, 200 } },
+ { 8, { 600, 375, 160 } },
+ { 10, { 640, 510, 200 } },
+ { 12, { 600, 375, 160 } },
+ { 14, { 640, 510, 200 } },
+ { 16, { 600, 375, 160 } },
+ },
+};
+static struct_80A98F94 D_80A9930C[5][4] = {
+ { { 0, 2100.0f }, { 7, 1500.0f }, { 16, 2100.0f }, { 0, 0.0f } },
+ { { 0, 1900.0f }, { 7, 2200.0f }, { 10, 1600.0f }, { 16, 1900.0f } },
+ { { 0, 1700.0f }, { 7, 2200.0f }, { 16, 1700.0f }, { 0, 0.0f } },
+ { { 0, 1900.0f }, { 4, 1600.0f }, { 10, 2200.0f }, { 16, 1900.0f } },
+ { { 0, 1900.0f }, { 7, 1400.0f }, { 16, 1900.0f }, { 0, 0.0f } },
+};
+static Vec3f D_80A993AC[3] = {
+ { 1.0f, 1.0f, 0.0f },
+ { 0.9f, 0.9f, 120.0f },
+ { 0.95f, 0.95f, 240.0f },
+};
+static Vec3f D_80A993D0[3] = {
+ { 1.5f, 1.5f, 0.0f },
+ { 1.2f, 1.2f, 120.0f },
+ { 1.35f, 1.35f, 240.0f },
+};
+static TexturePtr D_80A993F4[4] = {
+ object_az_Tex_00F918,
+ object_az_Tex_010118,
+ object_az_Tex_010918,
+ object_az_Tex_011118,
+};
+static TexturePtr D_80A99404[3] = {
+ object_az_Tex_016018,
+ object_az_Tex_016818,
+ object_az_Tex_017018,
+};
+
+void EnAz_Draw(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnAz* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+ POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (this->unk_374 & 2) {
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ func_80A98DA4, func_80A98E48, &this->actor);
+ } else {
+ OPEN_DISPS(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A993F4[this->unk_37E]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80A99404[this->unk_380]));
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ func_80A98DA4, func_80A98E48, &this->actor);
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ OPEN_DISPS(play->state.gfxCtx);
+ if ((this->actor.depthInWater >= 28.0f) && (this->actor.speedXZ > 0.5f)) {
+ Matrix_Translate(this->unk_3B4.x, this->unk_3B4.y, this->unk_3B4.z, MTXMODE_NEW);
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_RotateXS(this->unk_39E, MTXMODE_APPLY);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ func_8012C2DC(play->state.gfxCtx);
+ if (this->unk_374 & 2) {
+ s32 i;
+ Vec3f sp98;
+ f32 sp94;
+
+ Matrix_Translate(0.0f, 0.0f, -2000.0f, MTXMODE_APPLY);
+ for (i = 0; i < ARRAY_COUNT(D_80A99180); i++) {
+ Matrix_Push();
+ func_80A98F94(D_80A9930C[i], this->unk_39C, &sp94);
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(D_80A99180[i]));
+ Matrix_Translate(0.0f, sp94 * 100.0f, i * -930.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.1f, 0.95f, 1.0f, MTXMODE_APPLY);
+ func_80124618(D_80A991A4[i], this->unk_39C, &sp98);
+ Matrix_Scale(sp98.x, sp98.y, sp98.z, MTXMODE_APPLY);
+ if (this->unk_374 & 0x800) {
+ gSPSegment(POLY_XLU_DISP++, 0x09,
+ Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, D_80A99194[i]));
+ } else {
+ gSPSegment(POLY_XLU_DISP++, 0x09,
+ Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, D_80A9919C[i]));
+ }
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_80A9916C[i]);
+ Matrix_Pop();
+ }
+ } else {
+ Matrix_Push();
+ Matrix_Translate(0.0f, 2000.0f, -2000.0f, MTXMODE_APPLY);
+ Matrix_RotateZS(D_80A993D0[this->unk_384].z * (0x10000 / 360.0f), MTXMODE_APPLY);
+ Matrix_Scale(D_80A993AC[this->unk_384].x, D_80A993AC[this->unk_384].y, 0.0f, MTXMODE_APPLY);
+ if (this->unk_374 & 0x800) {
+ gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 255));
+ } else {
+ gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 85));
+ }
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_az_DL_01ABF0);
+ Matrix_Pop();
+ Matrix_Translate(0.0f, 2000.0f, -2100.0f, MTXMODE_APPLY);
+ Matrix_RotateZS(D_80A993D0[this->unk_384].z * (0x10000 / 360.0f), MTXMODE_APPLY);
+ Matrix_Scale(D_80A993D0[this->unk_384].x, D_80A993D0[this->unk_384].y, 0.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++, object_az_DL_01AD00);
+ }
+ }
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+s32 func_80A98DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+ EnAz* this = THIS;
+
+ if ((limbIndex == OBJECT_AZ_1_LIMB_NONE) && ((play->gameplayFrames % 2) != 0)) {
+ *dList = NULL;
+ }
+ if (limbIndex == OBJECT_AZ_1_LIMB_NONE) {
+ rot->x = rot->x;
+ rot->y = rot->y;
+ rot->z = rot->z;
+ }
+ if (limbIndex == OBJECT_AZ_1_LIMB_03) {
+ rot->y -= this->unk_39E;
+ } else {
+ // this space intentionally left blank
+ }
+ if (limbIndex == OBJECT_AZ_1_LIMB_05) {
+ rot->x += this->unk_3D4;
+ rot->y -= this->unk_3D6;
+ }
+ return false;
+}
+
+void func_80A98E48(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f D_80A99410 = { 700.0f, 0.0f, 0.0f };
+ static Vec3f D_80A9941C = { -500.0f, 0.0f, 0.0f };
+ static Vec3f D_80A99428 = { -1200.0f, 0.0f, 1000.0f };
+ EnAz* this = THIS;
+
+ if (limbIndex == OBJECT_AZ_1_LIMB_03) {
+ Matrix_MultVec3f(&D_80A99410, &this->unk_3A8);
+ Math_SmoothStepToF(&this->unk_3A4, this->unk_3A8.y - this->actor.world.pos.y, 0.8f, 10.0f, 0.01f);
+ if (this->unk_374 & 2) {
+ Matrix_MultVec3f(&D_80A9941C, &this->unk_3B4);
+ } else {
+ Matrix_MultVec3f(&D_80A99428, &this->unk_3B4);
+ }
+ }
+}
+
+void func_80A98EFC(EnAz* this, PlayState* play, u16 textId, s32 arg3, s32 arg4) {
+ EnAz* brother = this->brother;
+
+ Actor_ChangeFocus(&this->actor, play, &brother->actor);
+ if (arg3 >= 0) {
+ SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimationInfo, arg3, &this->animIndex);
+ }
+ this->actor.textId = 0;
+ brother->actor.textId = textId;
+ brother->unk_378 = 5;
+ if ((arg4 >= 0) && (arg4 != brother->animIndex)) {
+ SubS_ChangeAnimationBySpeedInfo(&brother->skelAnime, sAnimationInfo, arg4, &brother->animIndex);
+ }
+ this->unk_378 = 0;
+}
+
+void func_80A98F94(struct_80A98F94* yData, f32 frame, f32* yInterp) {
+ f32 nextFrame;
+ f32 prevFrame;
+ f32 weight;
+
+ do {
+ yData++;
+ nextFrame = yData[0].unk_0;
+ } while (nextFrame < frame);
+ prevFrame = yData[-1].unk_0;
+ weight = LERPWEIGHT(frame, prevFrame, nextFrame);
+ *yInterp = LERPIMP(yData[-1].unk_4, yData[0].unk_4, weight) * 0.01f;
+}
diff --git a/src/overlays/actors/ovl_En_Az/z_en_az.h b/src/overlays/actors/ovl_En_Az/z_en_az.h
index 5c302c6f3..ffe094a93 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.h
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.h
@@ -7,10 +7,48 @@ struct EnAz;
typedef void (*EnAzActionFunc)(struct EnAz*, PlayState*);
+#define BEAVER_GET_PARAM_F00(thisx) (((thisx)->params >> 8) & 0xF)
+#define BEAVER_GET_PARAM_FF(thisx) ((thisx)->params & 0xFF)
+
typedef struct EnAz {
/* 0x000 */ Actor actor;
/* 0x144 */ EnAzActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x290];
+ /* 0x148 */ SkelAnime skelAnime;
+ /* 0x18C */ ColliderCylinder collider;
+ /* 0x1D8 */ Vec3s jointTable[24];
+ /* 0x268 */ Vec3s morphTable[24];
+ /* 0x2F8 */ s16 unk_2F8;
+ /* 0x2FA */ s16 unk_2FA; // cutscene state?
+ /* 0x2FC */ s32 animIndex;
+ /* 0x300 */ ActorPathing unk_300;
+ /* 0x36C */ f32 unk_36C;
+ /* 0x370 */ UNK_TYPE1 unk370[4];
+ /* 0x374 */ u16 unk_374; // flags of some sort
+ /* 0x376 */ u16 unk_376; // flags of some sort
+ /* 0x378 */ u8 unk_378; // cutscene state?
+ /* 0x37A */ s16 unk_37A;
+ /* 0x37C */ s16 unk_37C;
+ /* 0x37E */ s16 unk_37E;
+ /* 0x380 */ s16 unk_380;
+ /* 0x382 */ s16 unk_382;
+ /* 0x384 */ s16 unk_384;
+ /* 0x388 */ struct EnAz* brother;
+ /* 0x38C */ UNK_TYPE1 unk38C[0x10];
+ /* 0x39C */ s16 unk_39C;
+ /* 0x39E */ s16 unk_39E; // some sort of rotation
+ /* 0x3A0 */ UNK_TYPE1 unk3A0[4];
+ /* 0x3A4 */ f32 unk_3A4;
+ /* 0x3A8 */ Vec3f unk_3A8;
+ /* 0x3B4 */ Vec3f unk_3B4; // translation
+ /* 0x3C0 */ s16 unk_3C0; // seems to do nothing
+ /* 0x3C2 */ s16 unk_3C2;
+ /* 0x3C4 */ s16 unk_3C4;
+ /* 0x3C6 */ UNK_TYPE1 unk3C6[6];
+ /* 0x3CC */ s32 getItemId;
+ /* 0x3D0 */ s16 unk_3D0[1];
+ /* 0x3D2 */ u16 unk_3D2;
+ /* 0x3D4 */ s16 unk_3D4;
+ /* 0x3D6 */ s16 unk_3D6;
} EnAz; // size = 0x3D8
extern const ActorInit En_Az_InitVars;
diff --git a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
index a0954943b..e2496e18e 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -126,7 +126,7 @@ void EnBaguo_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
SkelAnime_Init(play, &this->skelAnime, &gNejironSkel, NULL, this->jointTable, this->morphTable, NEJIRON_LIMB_MAX);
- this->actor.hintId = 0xB;
+ this->actor.hintId = TATL_HINT_ID_NEJIRON;
this->maxDistanceFromHome = 240.0f;
this->maxDistanceFromHome += this->actor.world.rot.z * 40.0f;
this->actor.world.rot.z = 0;
diff --git a/src/overlays/actors/ovl_En_Bat/z_en_bat.c b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
index e81608721..fe1eb9fd8 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
@@ -107,7 +107,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 15, 30, 10 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 96, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BAD_BAT, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
index 488ed0482..a66c28a89 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -114,7 +114,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 2, 20, 40, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 28, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BLUE_BUBBLE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
index 2193203fe..b1e4db445 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -143,7 +143,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 2, 20, 40, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 36, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_RED_BUBBLE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 10, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
index bb3f28bee..047567b98 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -88,7 +88,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 2500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 89, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BIG_OCTO, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 33, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
index 8121db9e2..0be5ad0b4 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -154,7 +154,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 90, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BIG_POE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3200, ICHAIN_STOP),
};
@@ -671,7 +671,7 @@ void EnBigpo_SetupDeath(EnBigpo* this) {
this->idleTimer = 0;
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->collider.base.ocFlags1 &= ~OC1_ON;
this->actionFunc = EnBigpo_BurnAwayDeath;
}
diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
index 12076537e..392f9a441 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -303,7 +303,7 @@ static AnimationHeader* sGekkoAttackAnimations[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 95, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GEKKO_GIANT_SLIME, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
@@ -765,7 +765,7 @@ void EnBigslime_BreakIntoMinislime(EnBigslime* this, PlayState* play) {
this->actor.colChkInfo.mass = 50;
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_400);
this->actor.flags |= ACTOR_FLAG_200;
- this->actor.hintId = 95;
+ this->actor.hintId = TATL_HINT_ID_GEKKO_GIANT_SLIME;
this->gekkoRot.x = 0;
this->gekkoRot.y = 0;
this->actor.bgCheckFlags &= ~1;
@@ -2308,7 +2308,7 @@ void EnBigslime_FormBigslime(EnBigslime* this, PlayState* play) {
if (this->minislimeCounter == MINISLIME_NUM_SPAWN) {
this->minislimeState = MINISLIME_INACTIVE_STATE;
- this->actor.hintId = 3;
+ this->actor.hintId = TATL_HINT_ID_MAD_JELLY;
EnBigslime_SetupMoveOnCeiling(this);
}
}
diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
index 3030041ca..06c5c33b1 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
@@ -15,11 +15,10 @@ void EnBubble_Destroy(Actor* thisx, PlayState* play);
void EnBubble_Update(Actor* thisx, PlayState* play);
void EnBubble_Draw(Actor* thisx, PlayState* play);
-void func_808A029C(EnBubble* this, PlayState* play);
-void func_808A0350(EnBubble* this, PlayState* play);
-void func_808A03E8(EnBubble* this, PlayState* play);
+void EnBubble_Wait(EnBubble* this, PlayState* play);
+void EnBubble_Pop(EnBubble* this, PlayState* play);
+void EnBubble_Regrow(EnBubble* this, PlayState* play);
-#if 0
const ActorInit En_Bubble_InitVars = {
ACTOR_EN_BUBBLE,
ACTORCAT_ENEMY,
@@ -32,73 +31,396 @@ const ActorInit En_Bubble_InitVars = {
(ActorFunc)EnBubble_Draw,
};
-// static ColliderJntSphElementInit sJntSphElementsInit[2] = {
-static ColliderJntSphElementInit D_808A0700[2] = {
+static ColliderJntSphElementInit sJntSphElementsInit[2] = {
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x04 }, { 0xF7CFD757, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x04 },
+ { 0xF7CFD757, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 0, { { 0, 0, 0 }, 16 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00002820, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_NO_AT_INFO | BUMP_NO_DAMAGE | BUMP_NO_SWORD_SFX | BUMP_NO_HITMARK, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00002820, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON | BUMP_NO_AT_INFO | BUMP_NO_DAMAGE | BUMP_NO_SWORD_SFX | BUMP_NO_HITMARK,
+ OCELEM_NONE,
+ },
{ 0, { { 0, 0, 0 }, 16 }, 100 },
},
};
-// static ColliderJntSphInit sJntSphInit = {
-static ColliderJntSphInit D_808A0748 = {
- { COLTYPE_HIT6, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
- ARRAY_COUNT(sJntSphElementsInit), D_808A0700, // sJntSphElementsInit,
+static ColliderJntSphInit sJntSphInit = {
+ {
+ COLTYPE_HIT6,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_JNTSPH,
+ },
+ ARRAY_COUNT(sJntSphElementsInit),
+ sJntSphElementsInit,
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_808A0758 = { 1, 2, 25, 25, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 1, 2, 25, 25, MASS_IMMOVABLE };
-#endif
+void EnBubble_SetDimensions(EnBubble* this, f32 dim) {
+ f32 x;
+ f32 y;
+ f32 z;
+ f32 norm;
-extern ColliderJntSphElementInit D_808A0700[2];
-extern ColliderJntSphInit D_808A0748;
-extern CollisionCheckInfoInit2 D_808A0758;
+ this->actor.flags |= ACTOR_FLAG_1;
+ Actor_SetScale(&this->actor, 1.0f);
+ this->actor.shape.yOffset = 16.0f;
+ this->modelRotSpeed = 16.0f;
+ this->modelEllipticity = 0.08f;
+ this->modelWidth = dim;
+ this->modelHeight = dim;
+ x = Rand_ZeroOne();
+ y = Rand_ZeroOne();
+ z = Rand_ZeroOne();
+ this->unk_210 = 1.0f;
+ this->unk_214 = 1.0f;
+ norm = SQ(x) + SQ(y) + SQ(z);
+ this->unk1F8.x = x / norm;
+ this->unk1F8.y = y / norm;
+ this->unk1F8.z = z / norm;
+}
-extern UNK_TYPE D_06001000;
+s32 func_8089F59C(EnBubble* this) {
+ ColliderInfo* info = &this->colliderSphere.elements[0].info;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F4E0.s")
+ info->toucher.dmgFlags = DMG_EXPLOSIVES;
+ info->toucher.effect = 0;
+ info->toucher.damage = 4;
+ info->toucherFlags = TOUCH_ON;
+ this->actor.velocity.y = 0.0f;
+ return 6;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F59C.s")
+s32 func_8089F5D0(EnBubble* this) {
+ EnBubble_SetDimensions(this, -1.0f);
+ return 12;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F5D0.s")
+void EnBubble_DamagePlayer(EnBubble* this, PlayState* play) {
+ play->damagePlayer(play, -this->colliderSphere.elements[0].info.toucher.damage);
+ func_800B8E1C(play, &this->actor, 6.0f, this->actor.yawTowardsPlayer, 6.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F5F4.s")
+s32 EnBubble_Explosion(EnBubble* this, PlayState* play) {
+ static Color_RGBA8 sEffectPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sEffectEnvColor = { 150, 150, 150, 0 };
+ s32 i;
+ Vec3f effectAccel = { 0.0f, -0.5f, 0.0f };
+ Vec3f effectVel;
+ Vec3f effectPos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F660.s")
+ Math_SmoothStepToF(&this->modelWidth, 4.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelHeight, 4.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelRotSpeed, 54.0f, 0.1f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelEllipticity, 0.2f, 0.1f, 1000.0f, 0.0f);
+ this->actor.shape.yOffset = (this->modelHeight + 1.0f) * 16.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F8BC.s")
+ if (DECR(this->explosionCountdown) != 0) {
+ return -1;
+ }
+ effectPos.x = this->actor.world.pos.x;
+ effectPos.y = this->actor.world.pos.y + this->actor.shape.yOffset;
+ effectPos.z = this->actor.world.pos.z;
+ for (i = 0; i < 20; i++) {
+ effectVel.x = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ effectVel.y = Rand_ZeroOne() * 7.0f;
+ effectVel.z = (Rand_ZeroOne() - 0.5f) * 7.0f;
+ EffectSsDtBubble_SpawnCustomColor(play, &effectPos, &effectVel, &effectAccel, &sEffectPrimColor,
+ &sEffectEnvColor, Rand_S16Offset(100, 50), 25, 0);
+ }
+ Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, 0x50);
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ return Rand_S16Offset(90, 60);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F908.s")
+s32 func_8089F8BC(EnBubble* this) {
+ if (DECR(this->explosionCountdown) != 0) {
+ return -1;
+ } else {
+ return func_8089F5D0(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F95C.s")
+s32 func_8089F908(EnBubble* this) {
+ this->modelWidth += 1.0f / 12.0f;
+ this->modelHeight += 1.0f / 12.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089F9E4.s")
+ if (DECR(this->explosionCountdown) != 0) {
+ return false;
+ } else {
+ return true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FA54.s")
+void EnBubble_Vec3fNormalizedReflect(Vec3f* vec1, Vec3f* vec2, Vec3f* dest) {
+ f32 norm;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FF30.s")
+ func_80179F64(vec1, vec2, dest);
+ norm = sqrtf(SQ(dest->x) + SQ(dest->y) + SQ(dest->z));
+ if (norm != 0.0f) {
+ dest->x /= norm;
+ dest->y /= norm;
+ dest->z /= norm;
+ } else {
+ dest->x = dest->y = dest->z = 0.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_8089FFCC.s")
+void EnBubble_Vec3fNormalize(Vec3f* vec) {
+ f32 norm = sqrtf(SQ(vec->x) + SQ(vec->y) + SQ(vec->z));
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A005C.s")
+ if (norm != 0.0f) {
+ vec->x /= norm;
+ vec->y /= norm;
+ vec->z /= norm;
+ } else {
+ vec->x = vec->y = vec->z = 0.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Init.s")
+void EnBubble_Fly(EnBubble* this, PlayState* play) {
+ CollisionPoly* poly;
+ Actor* bumpActor;
+ Vec3f sp84;
+ Vec3f sp78;
+ Vec3f sp6C;
+ Vec3f normal;
+ Vec3f bounceDirection;
+ f32 bounceSpeed;
+ s32 bgId;
+ u8 bounceCount;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Destroy.s")
+ if (this->colliderSphere.elements[1].info.bumperFlags & BUMP_HIT) {
+ bumpActor = this->colliderSphere.base.ac;
+ this->normalizedBumpVelocity = bumpActor->velocity;
+ EnBubble_Vec3fNormalize(&this->normalizedBumpVelocity);
+ this->velocityFromBump.x += this->normalizedBumpVelocity.x * 3.0f;
+ this->velocityFromBump.y += this->normalizedBumpVelocity.y * 3.0f;
+ this->velocityFromBump.z += this->normalizedBumpVelocity.z * 3.0f;
+ }
+ this->yVelocity -= 0.1f;
+ if (this->yVelocity < this->actor.terminalVelocity) {
+ this->yVelocity = this->actor.terminalVelocity;
+ }
+ bounceDirection.x = this->velocityFromBounce.x + this->velocityFromBump.x;
+ bounceDirection.y = this->velocityFromBounce.y + this->velocityFromBump.y + this->yVelocity;
+ bounceDirection.z = this->velocityFromBounce.z + this->velocityFromBump.z;
+ EnBubble_Vec3fNormalize(&bounceDirection);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A029C.s")
+ sp78.x = this->actor.world.pos.x;
+ sp78.y = this->actor.world.pos.y + this->actor.shape.yOffset;
+ sp78.z = this->actor.world.pos.z;
+ sp6C = sp78;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A0350.s")
+ sp6C.x += (bounceDirection.x * 24.0f);
+ sp6C.y += (bounceDirection.y * 24.0f);
+ sp6C.z += (bounceDirection.z * 24.0f);
+ if (BgCheck_EntityLineTest1(&play->colCtx, &sp78, &sp6C, &sp84, &poly, true, true, true, false, &bgId)) {
+ normal.x = COLPOLY_GET_NORMAL(poly->normal.x);
+ normal.y = COLPOLY_GET_NORMAL(poly->normal.y);
+ normal.z = COLPOLY_GET_NORMAL(poly->normal.z);
+ EnBubble_Vec3fNormalizedReflect(&bounceDirection, &normal, &bounceDirection);
+ this->bounceDirection = bounceDirection;
+ bounceCount = this->bounceCount;
+ this->bounceCount = ++bounceCount;
+ if (bounceCount > (s16)(Rand_ZeroOne() * 10.0f)) {
+ this->bounceCount = 0;
+ }
+ bounceSpeed = (this->bounceCount == 0) ? 3.6000001f : 3.0f;
+ this->velocityFromBump.x = this->velocityFromBump.y = this->velocityFromBump.z = 0.0f;
+ this->velocityFromBounce.x = this->bounceDirection.x * bounceSpeed;
+ this->velocityFromBounce.y = this->bounceDirection.y * bounceSpeed;
+ this->velocityFromBounce.z = this->bounceDirection.z * bounceSpeed;
+ this->yVelocity = 0.0f;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ } else if ((this->actor.bgCheckFlags & 0x20) && (bounceDirection.y < 0.0f)) {
+ normal.x = normal.z = 0.0f;
+ normal.y = 1.0f;
+ EnBubble_Vec3fNormalizedReflect(&bounceDirection, &normal, &bounceDirection);
+ this->bounceDirection = bounceDirection;
+ bounceCount = this->bounceCount;
+ this->bounceCount = ++bounceCount;
+ if (bounceCount > (s16)(Rand_ZeroOne() * 10.0f)) {
+ this->bounceCount = 0;
+ }
+ bounceSpeed = (this->bounceCount == 0) ? 3.6000001f : 3.0f;
+ this->velocityFromBump.x = this->velocityFromBump.y = this->velocityFromBump.z = 0.0f;
+ this->velocityFromBounce.x = (this->bounceDirection.x * bounceSpeed);
+ this->velocityFromBounce.y = (this->bounceDirection.y * bounceSpeed);
+ this->velocityFromBounce.z = (this->bounceDirection.z * bounceSpeed);
+ this->yVelocity = 0.0f;
+ Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_AWA_BOUND);
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ }
+ this->actor.velocity.x = this->velocityFromBounce.x + this->velocityFromBump.x;
+ this->actor.velocity.y = this->velocityFromBounce.y + this->velocityFromBump.y + this->yVelocity;
+ this->actor.velocity.z = this->velocityFromBounce.z + this->velocityFromBump.z;
+ Math_ApproachF(&this->velocityFromBump.x, 0.0f, 0.3f, 0.1f);
+ Math_ApproachF(&this->velocityFromBump.y, 0.0f, 0.3f, 0.1f);
+ Math_ApproachF(&this->velocityFromBump.z, 0.0f, 0.3f, 0.1f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A03A0.s")
+s32 func_8089FF30(EnBubble* this) {
+ if (((this->colliderSphere.base.acFlags & AC_HIT) != 0) == false) {
+ return false;
+ }
+ this->colliderSphere.base.acFlags &= ~AC_HIT;
+ if (this->colliderSphere.elements[1].info.bumperFlags & BUMP_HIT) {
+ this->unk1F4.x = this->colliderSphere.base.ac->velocity.x / 10.0f;
+ this->unk1F4.y = this->colliderSphere.base.ac->velocity.y / 10.0f;
+ this->unk1F4.z = this->colliderSphere.base.ac->velocity.z / 10.0f;
+ this->modelRotSpeed = 128.0f;
+ this->modelEllipticity = 0.48f;
+ return false;
+ }
+ this->timer = 8;
+ return true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/func_808A03E8.s")
+s32 EnBubble_IsPopped(EnBubble* this, PlayState* play) {
+ if ((DECR(this->timer) != 0) || (this->actionFunc == EnBubble_Pop)) {
+ return false;
+ }
+ if (this->colliderSphere.base.ocFlags2 & OC2_HIT_PLAYER) {
+ this->colliderSphere.base.ocFlags2 &= ~OC2_HIT_PLAYER;
+ EnBubble_DamagePlayer(this, play);
+ this->timer = 8;
+ return true;
+ }
+ return func_8089FF30(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Update.s")
+void func_808A005C(EnBubble* this) {
+ ColliderJntSphElementDim* dim = &this->colliderSphere.elements[0].dim;
+ Vec3f src;
+ Vec3f dest;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bubble/EnBubble_Draw.s")
+ src.x = dim->modelSphere.center.x;
+ src.y = dim->modelSphere.center.y;
+ src.z = dim->modelSphere.center.z;
+
+ Matrix_MultVec3f(&src, &dest);
+ dim->worldSphere.center.x = dest.x;
+ dim->worldSphere.center.y = dest.y;
+ dim->worldSphere.center.z = dest.z;
+ dim->worldSphere.radius = dim->modelSphere.radius * (1.0f + this->modelWidth);
+ this->colliderSphere.elements[1].dim = *dim;
+}
+
+void EnBubble_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnBubble* this = THIS;
+
+ ActorShape_Init(&this->actor.shape, 16.0f, ActorShadow_DrawCircle, 0.2f);
+ Collider_InitJntSph(play, &this->colliderSphere);
+ Collider_SetJntSph(play, &this->colliderSphere, &this->actor, &sJntSphInit, this->colliderElements);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(9), &sColChkInfoInit);
+ this->actor.hintId = 0x16;
+ this->bounceDirection.x = Rand_ZeroOne();
+ this->bounceDirection.y = Rand_ZeroOne();
+ this->bounceDirection.z = Rand_ZeroOne();
+ EnBubble_Vec3fNormalize(&this->bounceDirection);
+ this->velocityFromBounce.x = this->bounceDirection.x * 3.0f;
+ this->velocityFromBounce.y = this->bounceDirection.y * 3.0f;
+ this->velocityFromBounce.z = this->bounceDirection.z * 3.0f;
+ EnBubble_SetDimensions(this, 0);
+ this->actionFunc = EnBubble_Wait;
+}
+
+void EnBubble_Destroy(Actor* thisx, PlayState* play) {
+ EnBubble* this = (EnBubble*)thisx;
+
+ Collider_DestroyJntSph(play, &this->colliderSphere);
+}
+
+void EnBubble_Wait(EnBubble* this, PlayState* play) {
+ if (EnBubble_IsPopped(this, play)) {
+ this->explosionCountdown = func_8089F59C(this);
+ this->actionFunc = EnBubble_Pop;
+ } else {
+ EnBubble_Fly(this, play);
+ this->actor.shape.yOffset = (this->modelHeight + 1.0f) * 16.0f;
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderSphere.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
+ }
+}
+
+void EnBubble_Pop(EnBubble* this, PlayState* play) {
+ if (EnBubble_Explosion(this, play) > -1) {
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 60, NA_SE_EN_AWA_BREAK);
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void EnBubble_Disappear(EnBubble* this, PlayState* play) {
+ s32 temp_v0 = func_8089F8BC(this);
+
+ if (temp_v0 >= 0) {
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->explosionCountdown = temp_v0;
+ this->actionFunc = EnBubble_Regrow;
+ }
+}
+
+void EnBubble_Regrow(EnBubble* this, PlayState* play) {
+ if (func_8089F908(this)) {
+ this->actionFunc = EnBubble_Wait;
+ }
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderSphere.base);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
+}
+
+void EnBubble_Update(Actor* thisx, PlayState* play) {
+ EnBubble* this = (EnBubble*)thisx;
+
+ Actor_UpdatePos(&this->actor);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 16.0f, 16.0f, 0.0f, 7);
+ this->actionFunc(this, play);
+ Actor_SetFocus(&this->actor, this->actor.shape.yOffset);
+}
+
+void EnBubble_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnBubble* this = (EnBubble*)thisx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->actionFunc != EnBubble_Disappear) {
+ func_8012C2DC(play->state.gfxCtx);
+ Math_SmoothStepToF(&this->modelRotSpeed, 16.0f, 0.2f, 1000.0f, 0.0f);
+ Math_SmoothStepToF(&this->modelEllipticity, 0.08f, 0.2f, 1000.0f, 0.0f);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(this->modelWidth + 1.0f, this->modelHeight + 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(DEGF_TO_RADF((f32)play->state.frames) * this->modelRotSpeed, MTXMODE_APPLY);
+ Matrix_Scale(this->modelEllipticity + 1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(DEGF_TO_RADF(-(f32)play->state.frames) * this->modelRotSpeed, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ if (this->actionFunc != EnBubble_Disappear) {
+ this->actor.shape.shadowScale = (this->modelWidth + 1.0f) * 0.2f;
+ func_808A005C(this);
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
index 2217b86b1..7affed807 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.h
@@ -2,6 +2,7 @@
#define Z_EN_BUBBLE_H
#include "global.h"
+#include "objects/object_bubble/object_bubble.h"
struct EnBubble;
@@ -10,7 +11,25 @@ typedef void (*EnBubbleActionFunc)(struct EnBubble*, PlayState*);
typedef struct EnBubble {
/* 0x000 */ Actor actor;
/* 0x144 */ EnBubbleActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x110];
+ /* 0x148 */ ColliderJntSph colliderSphere;
+ /* 0x168 */ ColliderJntSphElement colliderElements[2];
+ /* 0x1F4 */ Vec3f unk1F4; // set but never used
+ /* 0x1F4 */ Vec3f unk1F8; // randomly generated, set but never used
+ /* 0x200 */ s16 timer; // set to 8 when about to pop
+ /* 0x202 */ s16 explosionCountdown;
+ /* 0x204 */ UNK_TYPE1 pad204[4]; // unused
+ /* 0x208 */ f32 modelRotSpeed;
+ /* 0x20C */ f32 modelEllipticity;
+ /* 0x210 */ f32 unk_210; // set to 1.0f, never used
+ /* 0x214 */ f32 unk_214; // set to 1.0f, never used
+ /* 0x218 */ f32 modelWidth;
+ /* 0x21C */ f32 modelHeight;
+ /* 0x220 */ u8 bounceCount;
+ /* 0x224 */ Vec3f bounceDirection;
+ /* 0x230 */ Vec3f velocityFromBounce;
+ /* 0x23C */ Vec3f normalizedBumpVelocity;
+ /* 0x248 */ Vec3f velocityFromBump;
+ /* 0x254 */ f32 yVelocity;
} EnBubble; // size = 0x258
extern const ActorInit En_Bubble_InitVars;
diff --git a/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
index e6980ba4f..c04462c44 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
@@ -118,7 +118,7 @@ static s32 sDeadCount = 0;
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 88, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GUAY, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dai/z_en_dai.c b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
index 4f8d5eaaa..31e326409 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -639,7 +639,7 @@ void func_80B3F78C(EnDai* this, PlayState* play) {
};
s32 pad;
- if (play->actorCtx.unkB != 0) {
+ if (play->actorCtx.lensActorsDrawn) {
this->unk_1CE |= 0x40;
} else {
Actor_RecordUndrawnActor(play, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Death/z_en_death.c b/src/overlays/actors/ovl_En_Death/z_en_death.c
index edc240cd5..b0f03af7c 100644
--- a/src/overlays/actors/ovl_En_Death/z_en_death.c
+++ b/src/overlays/actors/ovl_En_Death/z_en_death.c
@@ -131,7 +131,7 @@ static CollisionCheckInfoInit2 D_808C9A30 = { 20, 28, 90, 20, 100 };
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_808C9A60[] = {
ICHAIN_VEC3F(scale, 0, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 26, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GOMESS, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
};
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 15ae675a1..0f37266e2 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -109,7 +109,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 77, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_MAD_SCRUB, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, -1, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2600, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
index eb7719150..65c11e035 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -253,7 +253,7 @@ static s32 D_8089E350 = 0;
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 16, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DINOLFOS, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_STOP),
};
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 0d28281ef..3b4ab74ae 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -201,7 +201,7 @@ void func_80A5063C(EnDnb* this, PlayState* play) {
void EnDnb_Draw(Actor* thisx, PlayState* play) {
EnDnb* this = THIS;
- if (play->actorCtx.unk4 != 0) {
+ if (play->actorCtx.lensMaskSize != 0) {
func_80A50510(this, play);
} else {
func_80A5063C(this, play);
diff --git a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
index 45311b83f..65e5417f3 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -273,7 +273,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 100, 100, 80 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 13, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DODONGO, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1400, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
index 901efc0d2..5bc260ccc 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -242,7 +242,7 @@ void EnDragon_Init(Actor* thisx, PlayState* play) {
this->pythonIndex = EN_DRAGON_GET_PYTHON_INDEX(&this->actor);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->action = DEEP_PYTHON_ACTION_IDLE;
- this->actor.hintId = 0xE;
+ this->actor.hintId = TATL_HINT_ID_DEEP_PYTHON;
this->scale = 0.5f;
this->actor.flags &= ~ACTOR_FLAG_8000000;
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 bc84c329b..798311c77 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -675,8 +675,7 @@ void func_8088DD34(EnElf* this, PlayState* play) {
!func_8088C804(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) {
Health_ChangeBy(play, 0x80);
if (this->fairyFlags & 0x200) {
- Parameter_AddMagic(play, ((void)0, gSaveContext.unk_3F30) +
- (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
gSaveContext.jinxTimer = 0;
this->unk_254 = 50.0f;
diff --git a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
index d0bc05b8b..4b091efc3 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -62,7 +62,7 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
}
ActorShape_Init(&this->actor.shape, 16.0f, ActorShadow_DrawCircle, 0.2f);
- this->actor.hintId = 0x16;
+ this->actor.hintId = TATL_HINT_ID_IGOS_DU_IKANA;
Actor_SetScale(&this->actor, 1.25f);
this->actionFunc = EnElfbub_Idle;
@@ -161,7 +161,7 @@ void EnElfbub_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateZS(this->zRot * -1, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, object_bubble_DL_001000);
+ gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
index ba8cb4f01..61457bf50 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -99,7 +99,7 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
break;
case ENELFGRP_2:
- if (gSaveContext.save.playerData.doubleMagic == true) {
+ if (gSaveContext.save.playerData.isDoubleMagicAcquired == true) {
func_80A396B0(this, 1);
}
break;
@@ -156,7 +156,7 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
func_80A396B0(this, 3);
this->unk_14A |= 2;
}
- } else if (gSaveContext.save.playerData.magicAcquired == true) {
+ } else if (gSaveContext.save.playerData.isMagicAcquired == true) {
func_80A396B0(this, 1);
}
} else {
@@ -477,8 +477,7 @@ void func_80A3A610(EnElfgrp* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->unk_144 == 60) {
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
gSaveContext.healthAccumulator = 320;
}
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
index 8e68f9205..0305af8ef 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
@@ -15,7 +15,6 @@ void EnEncount1_Update(Actor* thisx, PlayState* play);
void func_808E0954(EnEncount1* this, PlayState* play);
-#if 0
const ActorInit En_Encount1_InitVars = {
ACTOR_EN_ENCOUNT1,
ACTORCAT_PROP,
@@ -28,10 +27,129 @@ const ActorInit En_Encount1_InitVars = {
(ActorFunc)NULL,
};
-#endif
+static s16 sActorList[] = {
+ ACTOR_EN_GRASSHOPPER,
+ ACTOR_EN_WALLMAS,
+ ACTOR_EN_PR2,
+ ACTOR_EN_PR2,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/EnEncount1_Init.s")
+static s16 sActorParams[] = { 1, 0, 1, 3 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/func_808E0954.s")
+void EnEncount1_Init(Actor* thisx, PlayState* play) {
+ EnEncount1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Encount1/EnEncount1_Update.s")
+ if (this->actor.params <= 0) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ this->actorType = ENENCOUNT1_GET_TYPE(&this->actor);
+ this->unk_14C = ENENCOUNT1_GET_7C0(&this->actor);
+ this->unk_154 = ENENCOUNT1_GET_PATH(&this->actor);
+ this->unk_158 = this->actor.world.rot.x;
+ this->unk_15C = this->actor.world.rot.y;
+ this->unk_160 = (this->actor.world.rot.z * 40.0f) + 120.0f;
+
+ if (this->unk_154 >= 0x3F) {
+ this->unk_154 = -1;
+ }
+ if (this->actor.world.rot.z < 0) {
+ this->unk_160 = -1.0f;
+ }
+ if (this->actorType == EN_ENCOUNT1_SKULLFISH_2) {
+ this->unk_15A = ENENCOUNT1_GET_PATH(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->unk_15A, 0x3F);
+ this->unk_154 = -1;
+ this->unk_160 = -1.0f;
+ }
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->actionFunc = func_808E0954;
+}
+
+void func_808E0954(EnEncount1* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ Vec3f spawnPos;
+ f32 sp64;
+ f32 temp_fv0_2;
+ s16 sp5E;
+ s16 actorList;
+ s32 actorParams;
+ CollisionPoly* sp54;
+ s32 sp50;
+
+ if (((this->unk_14E >= this->unk_14C) || ((this->unk_160 > 0.0f) && (this->unk_160 < this->actor.xzDistToPlayer)) ||
+ ((this->unk_154 > 0) && (this->unk_154 <= this->unk_152)))) {
+ return;
+ } else if (this->unk_156 != 0) {
+ this->unk_156++;
+ if (this->unk_156 < this->unk_158) {
+ return;
+ }
+ }
+
+ this->unk_156 = 0;
+ switch (this->actorType) {
+ case EN_ENCOUNT1_GRASSHOPPER:
+ sp64 = randPlusMinusPoint5Scaled(40.0f) + 200.0f;
+ sp5E = player->actor.shape.rot.y;
+ if (this->unk_14E & 1) {
+ sp5E = -sp5E;
+ sp64 = randPlusMinusPoint5Scaled(20.0f) + 100.0f;
+ }
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.y = player->actor.floorHeight + 120.0f;
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
+ if ((temp_fv0_2 <= BGCHECK_Y_MIN) ||
+ ((player->actor.depthInWater != BGCHECK_Y_MIN) &&
+ (temp_fv0_2 < (player->actor.world.pos.y - player->actor.depthInWater)))) {
+ return;
+ }
+ spawnPos.y = temp_fv0_2;
+ break;
+
+ case EN_ENCOUNT1_WALLMASTER:
+ Math_Vec3f_Copy(&spawnPos, &player->actor.world.pos);
+ break;
+
+ case EN_ENCOUNT1_SKULLFISH:
+ sp64 = randPlusMinusPoint5Scaled(250.0f) + 500.0f;
+ sp5E = player->actor.shape.rot.y;
+ spawnPos.x = player->actor.world.pos.x + Math_SinS(sp5E) * sp64 + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.y = player->actor.world.pos.y - Rand_ZeroFloat(20.0f);
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ temp_fv0_2 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp54, &sp50, &this->actor, &spawnPos);
+ if ((!(player->stateFlags1 & 0x8000000) || (temp_fv0_2 <= (BGCHECK_Y_MIN)) ||
+ (player->actor.depthInWater < temp_fv0_2))) {
+ return;
+ }
+ break;
+
+ case EN_ENCOUNT1_SKULLFISH_2:
+ if ((this->path != NULL) && (!SubS_CopyPointFromPath(this->path, 0, &spawnPos))) {
+ Actor_MarkForDeath(&this->actor);
+ }
+ break;
+ }
+
+ actorList = sActorList[this->actorType];
+ actorParams = sActorParams[this->actorType];
+ if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorList, spawnPos.x, spawnPos.y, spawnPos.z, 0, 0, 0,
+ actorParams) != NULL) {
+ this->unk_14E++;
+ if (this->unk_154 > 0) {
+ this->unk_152++;
+ }
+
+ if ((this->unk_14E >= this->unk_14C) && (this->unk_158 != 0)) {
+ this->unk_156 = 1;
+ }
+ }
+}
+
+void EnEncount1_Update(Actor* thisx, PlayState* play) {
+ EnEncount1* this = THIS;
+
+ this->actionFunc(this, play);
+}
diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
index d625f2151..8906d523e 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
@@ -3,6 +3,17 @@
#include "global.h"
+#define ENENCOUNT1_GET_TYPE(thisx) (((thisx)->params >> 11) & 0x1F)
+#define ENENCOUNT1_GET_7C0(thisx) (((thisx)->params >> 6) & 0x1F)
+#define ENENCOUNT1_GET_PATH(thisx) ((thisx)->params & 0x3F)
+
+typedef enum EnEncount1Enemy {
+ /* 0x0 */ EN_ENCOUNT1_GRASSHOPPER,
+ /* 0x1 */ EN_ENCOUNT1_WALLMASTER,
+ /* 0x2 */ EN_ENCOUNT1_SKULLFISH,
+ /* 0x3 */ EN_ENCOUNT1_SKULLFISH_2,
+} EnEncount1Enemy;
+
struct EnEncount1;
typedef void (*EnEncount1ActionFunc)(struct EnEncount1*, PlayState*);
@@ -10,11 +21,17 @@ typedef void (*EnEncount1ActionFunc)(struct EnEncount1*, PlayState*);
typedef struct EnEncount1 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnEncount1ActionFunc actionFunc;
- /* 0x148 */ char unk_148[0x6];
+ /* 0x148 */ Path* path;
+ /* 0x14C */ s16 unk_14C;
/* 0x14E */ s16 unk_14E;
- /* 0x150 */ char unk_150[0xA];
+ /* 0x150 */ s16 actorType;
+ /* 0x152 */ s16 unk_152;
+ /* 0x154 */ s16 unk_154;
+ /* 0x156 */ s16 unk_156;
+ /* 0x158 */ s16 unk_158;
/* 0x15A */ s16 unk_15A;
- /* 0x15C */ char unk_15C[0x8];
+ /* 0x15C */ s32 unk_15C;
+ /* 0x160 */ f32 unk_160;
} EnEncount1; // size = 0x164
extern const ActorInit En_Encount1_InitVars;
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 cc447a1a1..b6b93aded 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -154,7 +154,7 @@ static AnimatedMaterial* sEmblemAnimatedMats[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 15, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_DEATH_ARMOS, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
index d8cbe91f5..3ac02d9c9 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -149,19 +149,19 @@ void EnFirefly_Init(Actor* thisx, PlayState* play) {
this->auraType = KEESE_AURA_FIRE;
this->timer = Rand_S16Offset(20, 60);
this->actor.shape.rot.x = 0x1554;
- this->actor.hintId = 0x11; // Fire Keese
+ this->actor.hintId = TATL_HINT_ID_FIRE_KEESE;
this->maxAltitude = this->actor.home.pos.y;
this->actionFunc = EnFirefly_FlyIdle;
} else if (this->actor.params == KEESE_ICE_FLY) {
this->auraType = KEESE_AURA_ICE;
this->collider.info.toucher.effect = 2; // Freeze
- this->actor.hintId = 0x56; // Ice Keese
+ this->actor.hintId = TATL_HINT_ID_ICE_KEESE;
this->maxAltitude = this->actor.home.pos.y + 100.0f;
this->actionFunc = EnFirefly_FlyIdle;
} else {
this->auraType = KEESE_AURA_NONE;
this->collider.info.toucher.effect = 0; // Nothing
- this->actor.hintId = 0x12; // Keese
+ this->actor.hintId = TATL_HINT_ID_KEESE;
this->maxAltitude = this->actor.home.pos.y + 100.0f;
this->actionFunc = EnFirefly_Perch;
}
@@ -188,7 +188,7 @@ void EnFirefly_Extinguish(EnFirefly* this) {
this->currentType = KEESE_NORMAL;
this->collider.info.toucher.effect = 0; // Nothing
this->auraType = KEESE_AURA_NONE;
- this->actor.hintId = 0x12; // Keese
+ this->actor.hintId = TATL_HINT_ID_KEESE;
}
void EnFirefly_Ignite(EnFirefly* this) {
@@ -196,7 +196,7 @@ void EnFirefly_Ignite(EnFirefly* this) {
this->currentType = KEESE_FIRE;
this->collider.info.toucher.effect = 1; // Fire
this->auraType = KEESE_AURA_FIRE;
- this->actor.hintId = 0x11; // Fire Keese
+ this->actor.hintId = TATL_HINT_ID_FIRE_KEESE;
}
}
@@ -739,7 +739,7 @@ s32 EnFirefly_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
Gfx** gfx) {
EnFirefly* this = THIS;
- if (this->isInvisible && (play->actorCtx.unk4 != 0x64)) {
+ if (this->isInvisible && (play->actorCtx.lensMaskSize != LENS_MASK_ACTIVE_SIZE)) {
*dList = NULL;
} else if (limbIndex == 1) {
pos->y += 2300.0f;
diff --git a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
index c5e7b24f1..411d83712 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -129,7 +129,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 49, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_FLOORMASTER, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5500, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
};
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 5e3b46fe6..4172773f0 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -651,9 +651,8 @@ void func_80962A10(EnFu* this, PlayState* play) {
this->unk_546 = 1;
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.magicAcquired) {
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 48) + 48);
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.isMagicAcquired) {
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
func_80962F10(this);
@@ -1139,7 +1138,7 @@ void func_80963DE4(EnFu* this, PlayState* play) {
}
void func_80963EAC(EnFu* this, PlayState* play) {
- if (gSaveContext.save.playerData.magicAcquired) {
+ if (gSaveContext.save.playerData.isMagicAcquired) {
if (this->unk_540 == 1) {
Message_StartTextbox(play, 0x2847, &this->actor);
this->unk_552 = 0x2847;
diff --git a/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
index 00c47b111..198166b00 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -156,7 +156,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 59, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_FREEZARD, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1400, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.c b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
index 5c4606185..e2ebab0d5 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -231,7 +231,7 @@ void func_80B35450(EnGg* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) {
- func_800B90F4(play);
+ Actor_DeactivateLens(play);
}
this->unk_308 = 1;
this->actionFunc = func_80B352A4;
@@ -682,7 +682,7 @@ void EnGg_Destroy(Actor* thisx, PlayState* play) {
void EnGg_Update(Actor* thisx, PlayState* play) {
EnGg* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
this->actor.flags |= ACTOR_FLAG_1;
} else {
diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
index 9726a693a..ebbaaca7f 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -421,7 +421,7 @@ void EnGg2_Destroy(Actor* thisx, PlayState* play) {
void EnGg2_Update(Actor* thisx, PlayState* play) {
EnGg2* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
this->actor.flags |= ACTOR_FLAG_1;
if ((this->unk_2EE == 5) && (this->unk_2EE == 7)) {
@@ -443,7 +443,7 @@ void EnGg2_Update(Actor* thisx, PlayState* play) {
if ((this->unk_2EE == 5) || (this->unk_2EE == 7)) {
func_800B9010(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG);
- if ((play->actorCtx.unk4 == 100) && ((play->state.frames % 4) == 0)) {
+ if ((play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) && ((play->state.frames % 4) == 0)) {
func_80B3B4B0(this, play);
}
}
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 235b4ba9f..7563d07fa 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -724,8 +724,7 @@ void func_80B51B40(EnGk* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_03;
gSaveContext.nextTransitionType = TRANS_TYPE_03;
- Parameter_AddMagic(play, ((void)0, gSaveContext.unk_3F30) +
- (gSaveContext.save.playerData.doubleMagic * 0x30) + 0x30);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
} else {
this->actionFunc = func_80B51760;
}
diff --git a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
index 3664fcede..46a52a9fa 100644
--- a/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
+++ b/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.c
@@ -158,7 +158,7 @@ void EnHintSkb_Init(Actor* thisx, PlayState* play) {
Collider_SetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElement);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->unk_3E4 = 0;
this->unk_3DE = 0;
this->unk_3E0 = 0;
@@ -587,7 +587,7 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 255;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if (this->actionFunc == func_80C1FE80) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
@@ -597,7 +597,7 @@ void func_80C20D64(EnHintSkb* this, PlayState* play) {
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
func_80C1FE0C(this);
diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
index a1c33264e..d71e4c193 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -388,7 +388,7 @@ void EnIk_Idle(EnIk* this, PlayState* play) {
} else if (this->colliderCylinder.base.acFlags & AC_HIT) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_IRONNACK_ARMOR_HIT);
func_801A2E54(NA_BGM_MINI_BOSS);
- this->actor.hintId = 0x35;
+ this->actor.hintId = TATL_HINT_ID_IRON_KNUCKLE;
this->colliderCylinder.base.acFlags &= ~AC_HIT;
this->invincibilityFrames = 12;
EnIk_SetupWalk(this);
diff --git a/src/overlays/actors/ovl_En_Js/z_en_js.c b/src/overlays/actors/ovl_En_Js/z_en_js.c
index 57763a190..4e35a5158 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -15,7 +15,18 @@ void EnJs_Destroy(Actor* thisx, PlayState* play);
void EnJs_Update(Actor* thisx, PlayState* play);
void EnJs_Draw(Actor* thisx, PlayState* play);
-#if 0
+s32 func_80968B8C(EnJs* this, PlayState* play);
+s32 func_809692A8(s32 arg0);
+void func_80968A5C(EnJs* this);
+void func_80969400(s32 arg0);
+void func_8096971C(EnJs* this, PlayState* play);
+void func_80969898(EnJs* this, PlayState* play);
+void func_80969B5C(EnJs* this, PlayState* play);
+void func_80969DA4(EnJs* this, PlayState* play);
+void func_8096A104(EnJs* this, PlayState* play);
+void func_8096A38C(EnJs* this, PlayState* play);
+void func_8096A6F4(EnJs* this, PlayState* play);
+
const ActorInit En_Js_InitVars = {
ACTOR_EN_JS,
ACTORCAT_NPC,
@@ -28,89 +39,1021 @@ const ActorInit En_Js_InitVars = {
(ActorFunc)EnJs_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_8096ABA0 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_ENEMY, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 20, 40, 0, { 0, 0, 0 } },
};
-#endif
+static Gfx* D_8096ABCC[] = {
+ gMoonChildMajorasMaskDL, gMoonChildOdalwasMaskDL, gMoonChildGohtsMaskDL,
+ gMoonChildGyorgsMaskDL, gMoonChildTwinmoldsMaskDL,
+};
-extern ColliderCylinderInit D_8096ABA0;
+f32 D_8096ABE0[] = { 1.0f, 0.5f, 0.5f, 0.48f, 0.45f };
-extern UNK_TYPE D_06010880;
-extern UNK_TYPE D_06016F58;
-extern UNK_TYPE D_06017E98;
+f32 D_8096ABF4[] = { 60.0f, 0.0f, 0.0f, 0.0f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Init.s")
+f32 D_8096AC08[] = { -450.0f, 1400.0f, 1470.0f, 1670.0f, 1470.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Destroy.s")
+f32 D_8096AC1C[] = { 0.0f, 700.0f, 900.0f, 900.0f, 900.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968A5C.s")
+Vec3f D_8096AC30 = { 500.0f, -500.0f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968B18.s")
+void EnJs_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ s16 cs;
+ s32 i;
+ EnJs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968B8C.s")
+ Actor_SetScale(&this->actor, 0.01f);
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gMoonChildSkel, &gMoonChildStandingAnim, this->jointTable,
+ this->morphTable, MOONCHILD_LIMB_MAX);
+ Animation_PlayLoop(&this->skelAnime, &gMoonChildStandingAnim);
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968CB8.s")
+ this->actionFunc = func_8096971C;
+ this->maskType = 0;
+ this->actor.terminalVelocity = -9.0f;
+ this->actor.gravity = -1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968DD0.s")
+ cs = this->actor.cutscene;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968E38.s")
+ for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
+ this->cutscenes[i] = cs;
+ if (cs != -1) {
+ this->actor.cutscene = cs;
+ cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80968F48.s")
+ this->cutsceneIndex = -1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809691B8.s")
+ switch (ENJS_GET_TYPE(&this->actor)) {
+ case 0:
+ this->maskType = 0;
+ this->actionFunc = func_8096A6F4;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809692A8.s")
+ Animation_PlayLoop(&this->skelAnime, &gMoonChildSittingAnim);
+ func_8016566C(0x3C);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096933C.s")
+ if (gSaveContext.save.weekEventReg[84] & 0x20) {
+ Inventory_DeleteItem(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY));
+ gSaveContext.save.weekEventReg[84] &= (u8)~0x20;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ this->maskType = ENJS_GET_TYPE(&this->actor);
+ func_80968B8C(this, play);
+ this->actionFunc = func_80969B5C;
+ func_80968A5C(this);
+ if (func_809692A8(ENJS_GET_TYPE(&this->actor) + 4)) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ this->maskType = ENJS_GET_TYPE(&this->actor) - 4;
+ this->actionFunc = func_8096A104;
+ break;
+ default:
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969400.s")
+void EnJs_Destroy(Actor* thisx, PlayState* play) {
+ u32 paramsF;
+ EnJs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969494.s")
+ Collider_DestroyCylinder(play, &this->collider);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809694E8.s")
+ paramsF = ENJS_GET_TYPE(&this->actor);
+ switch (paramsF) {
+ case 0:
+ func_80165690();
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (!func_809692A8(paramsF)) {
+ func_80969400(ENJS_GET_TYPE(&this->actor));
+ }
+ break;
+ default:
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969530.s")
+void func_80968A5C(EnJs* this) {
+ if (Rand_ZeroOne() < 0.5f) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildRunningAnim, -10.0f);
+ this->unk_2B4 = 5.0f;
+ } else {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildWalkingAnim, -10.0f);
+ this->unk_2B4 = 2.5f;
+ }
+ this->unk_2B8 &= ~4;
+ this->unk_2BC = Rand_ZeroFloat(40.0f) + 80.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809695FC.s")
+void func_80968B18(EnJs* this) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, -10.0f);
+ this->unk_2B4 = 0.0f;
+ this->unk_2BC = Rand_ZeroFloat(20.0f) + 40.0f;
+ this->unk_2B8 |= 4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969688.s")
+s32 func_80968B8C(EnJs* this, PlayState* play) {
+ Path* path;
+ f32 temp_f0;
+ f32 temp_f2;
+ s32 pathIndex = ENJS_GET_PATH_INDEX(&this->actor);
+ s32 i;
+ f32 sp18 = 0.0f;
+ Vec3s* points;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_809696EC.s")
+ if (pathIndex != 0x3F) {
+ this->path = &play->setupPathList[pathIndex];
+ if (this->path != NULL) {
+ path = this->path;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096971C.s")
+ points = Lib_SegmentedToVirtual(path->points);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969748.s")
+ for (i = 0; i < path->count; i++, points++) {
+ temp_f0 = points->x - this->actor.world.pos.x;
+ temp_f2 = points->z - this->actor.world.pos.z;
+ temp_f0 = SQ(temp_f0) + SQ(temp_f2);
+ if (i == 0) {
+ sp18 = temp_f0;
+ this->unk_2B0 = 0;
+ } else if (temp_f0 < sp18) {
+ sp18 = temp_f0;
+ this->unk_2B0 = i;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969898.s")
+ this->unk_2B0++;
+ if (this->unk_2B0 >= path->count) {
+ this->unk_2B0 = 0;
+ }
+ }
+ } else {
+ this->path = NULL;
+ this->unk_2B0 = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969AA0.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969B5C.s")
+s32 func_80968CB8(EnJs* this) {
+ Path* path;
+ s32 pad;
+ f32 temp_fa0;
+ f32 temp_fa1;
+ Vec3s* temp_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969C54.s")
+ if (this->path == NULL) {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_80969DA4.s")
+ path = this->path;
+ temp_v1 = &((Vec3s*)Lib_SegmentedToVirtual(path->points))[this->unk_2B0];
+ temp_fa0 = temp_v1->x - this->actor.world.pos.x;
+ temp_fa1 = temp_v1->z - this->actor.world.pos.z;
+ this->actor.world.rot.y = Math_Atan2S(temp_fa0, temp_fa1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A080.s")
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 2, 0x7D0, 0xC8);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A104.s")
+ if ((SQ(temp_fa0) + SQ(temp_fa1)) < SQ(10.0f)) {
+ this->unk_2B0++;
+ if (this->unk_2B0 >= path->count) {
+ this->unk_2B0 = 0;
+ }
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A184.s")
+ Math_StepToF(&this->actor.speedXZ, this->unk_2B4, 0.5f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A1E8.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A2C0.s")
+s32 func_80968DD0(EnJs* this, PlayState* play) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
+ Actor_IsFacingPlayer(&this->actor, 0x3000)) {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A38C.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A6F4.s")
+s32 func_80968E38(s32 arg0) {
+ s32 i;
+ s32 count;
+ u8 mask;
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Update.s")
+ if (((arg0 < 0) || (arg0 >= 9))) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/func_8096A9F4.s")
+ count = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Js/EnJs_Draw.s")
+ arg0 *= 3;
+ for (mask = 1, i = 0; i < 8; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ arg0++;
+ for (mask = 1, i = 0; i < 8; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ arg0++;
+ for (mask = 1, i = 0; i < 5; i++, mask <<= 1) {
+ if (maskMaskBit[arg0] & mask) {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+s32 EnJs_GetRemainingMasks(void) {
+ s32 count = 0;
+
+ if (INV_CONTENT(ITEM_MASK_TRUTH) == ITEM_MASK_TRUTH) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KAFEIS_MASK) == ITEM_MASK_KAFEIS_MASK) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_ALL_NIGHT) == ITEM_MASK_ALL_NIGHT) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GARO) == ITEM_MASK_GARO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_CIRCUS_LEADER) == ITEM_MASK_CIRCUS_LEADER) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_POSTMAN) == ITEM_MASK_POSTMAN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_COUPLE) == ITEM_MASK_COUPLE) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GIBDO) == ITEM_MASK_GIBDO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_DON_GERO) == ITEM_MASK_DON_GERO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_CAPTAIN) == ITEM_MASK_CAPTAIN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_STONE) == ITEM_MASK_STONE) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BREMEN) == ITEM_MASK_BREMEN) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_BLAST) == ITEM_MASK_BLAST) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_SCENTS) == ITEM_MASK_SCENTS) {
+ count++;
+ }
+ if (INV_CONTENT(ITEM_MASK_GIANT) == ITEM_MASK_GIANT) {
+ count++;
+ }
+
+ count -= func_80968E38(0);
+ return count;
+}
+
+void EnJs_TakeMask(s32 actionParams, s32 childType) {
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
+ s32 temp = 0;
+
+ if ((childType >= 0) && (childType < 9)) {
+ actionParams -= PLAYER_AP_MASK_TRUTH;
+ childType *= 3;
+ if (actionParams < 8) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ return;
+ }
+
+ actionParams -= 8;
+ childType++;
+ temp++;
+ if (actionParams < 8) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ return;
+ }
+
+ actionParams -= 8;
+ childType++;
+ temp++;
+ if (actionParams < 6) {
+ maskMaskBit[childType] |= 1 << actionParams;
+ maskMaskBit[temp] |= 1 << actionParams;
+ }
+ }
+}
+
+s32 func_809692A8(s32 arg0) {
+ switch (arg0) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ if (func_80968E38(arg0) < arg0) {
+ return false;
+ }
+ return true;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (func_80968E38(arg0) < (arg0 - 4)) {
+ return false;
+ }
+ return true;
+ default:
+ return false;
+ }
+}
+
+s32 func_8096933C(s32 arg0) {
+ s32 sp1C;
+
+ switch (arg0) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ sp1C = EnJs_GetRemainingMasks();
+ if ((func_80968E38(arg0) + sp1C) < arg0) {
+ return false;
+ } else {
+ return true;
+ }
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ sp1C = EnJs_GetRemainingMasks();
+ if ((func_80968E38(arg0) + sp1C) < (arg0 - 4)) {
+ return false;
+ } else {
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
+void func_80969400(s32 arg0) {
+ u8* maskMaskBit = gSaveContext.maskMaskBit;
+ u8* temp_v0 = &gSaveContext.maskMaskBit[arg0 * 3];
+
+ if ((arg0 >= 0) && (arg0 < 9)) {
+ maskMaskBit[0] &= ~temp_v0[0];
+ maskMaskBit[1] &= ~temp_v0[1];
+
+ temp_v0[2] &= 0xF;
+ maskMaskBit[2] &= ~temp_v0[2];
+
+ temp_v0[0] = 0;
+ temp_v0[1] = 0;
+ temp_v0[2] = 0;
+ }
+}
+
+void func_80969494(EnJs* this, PlayState* play) {
+ func_80968A5C(this);
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_80969B5C;
+}
+
+void func_809694E8(EnJs* this, PlayState* play) {
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_8096A104;
+}
+
+void func_80969530(EnJs* this, PlayState* play) {
+ func_801477B4(play);
+ this->actor.flags &= ~ACTOR_FLAG_100;
+ this->actionFunc = func_8096A6F4;
+ if ((this->actor.home.rot.y == this->actor.shape.rot.y) && (this->unk_2B8 & 0x10)) {
+ Animation_Change(&this->skelAnime, &gMoonChildGettingUpAnim, -1.0f,
+ Animation_GetLastFrame(&gMoonChildGettingUpAnim) - 1.0f, 0.0f, ANIMMODE_ONCE, -10.0f);
+ this->unk_2B8 &= ~0x10;
+ this->unk_2B8 |= 8;
+ }
+}
+
+s32 func_809695FC(EnJs* this, PlayState* play) {
+ if (ENJS_GET_EXIT_INDEX(&this->actor) == 0x3F) {
+ return false;
+ }
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->nextEntrance = play->setupExitList[ENJS_GET_EXIT_INDEX(&this->actor)];
+ this->actionFunc = func_8096971C;
+ play->msgCtx.msgLength = 0;
+ gSaveContext.respawnFlag = -2;
+ return true;
+}
+
+void func_80969688(EnJs* this) {
+ if (this->cutsceneIndex != -1) {
+ if (ActorCutscene_GetCurrentIndex() == this->cutscenes[this->cutsceneIndex]) {
+ ActorCutscene_Stop(this->cutscenes[this->cutsceneIndex]);
+ }
+ this->cutsceneIndex = -1;
+ }
+}
+
+void func_809696EC(EnJs* this, s16 arg1) {
+ func_80969688(this);
+ this->cutsceneIndex = arg1;
+}
+
+void func_8096971C(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_80969748(EnJs* this, PlayState* play) {
+ s32 itemActionParam;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_16) {
+ itemActionParam = func_80123810(play);
+ if (itemActionParam != PLAYER_AP_NONE) {
+ this->actionFunc = func_80969898;
+ }
+ if (itemActionParam > PLAYER_AP_NONE) {
+ func_801477B4(play);
+ if ((itemActionParam >= PLAYER_AP_MASK_TRUTH) && (itemActionParam <= PLAYER_AP_MASK_GIANT)) {
+ EnJs_TakeMask(itemActionParam, ENJS_GET_TYPE(&this->actor));
+ Inventory_UnequipItem(itemActionParam - 4);
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ player->actor.textId = 0x2212;
+ } else {
+ player->actor.textId = 0x2213;
+ }
+ } else if ((itemActionParam >= PLAYER_AP_MASK_FIERCE_DEITY) && (itemActionParam <= PLAYER_AP_MASK_DEKU)) {
+ player->actor.textId = 0x2211;
+ } else {
+ player->actor.textId = 0x2210;
+ }
+ }
+ if (itemActionParam <= PLAYER_AP_MINUS1) {
+ func_80151938(play, 0x2216);
+ }
+ }
+}
+
+void func_80969898(EnJs* this, PlayState* play) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x2215)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ func_80151938(play, 0x2217);
+ break;
+ case 1:
+ func_8019F230();
+ func_80151938(play, 0x2216);
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x220C:
+ this->unk_2B8 |= 1;
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ func_80151938(play, 0x220F);
+ break;
+ }
+ func_80151938(play, 0x220D);
+ break;
+ case 0x220D:
+ case 0x2213:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x220E:
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969748;
+ break;
+ case 0x2210:
+ case 0x2211:
+ case 0x2212:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969748;
+ break;
+ case 0x2214:
+ case 0x2217:
+ if (!func_809695FC(this, play)) {
+ func_80969494(this, play);
+ break;
+ }
+ break;
+ default:
+ func_80969494(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_80969AA0(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x220B;
+ } else {
+ textId = 0x2215;
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ if (this->unk_2B8 & 1) {
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ textId = 0x220F;
+ } else {
+ textId = 0x220E;
+ }
+ } else {
+ textId = 0x220C;
+ }
+ } else {
+ textId = 0x2215;
+ }
+ }
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, -10.0f);
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_80969B5C(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (this->unk_2BC > 0) {
+ this->unk_2BC--;
+ if (this->unk_2BC == 0) {
+ if (this->unk_2B8 & 4) {
+ func_80968A5C(this);
+ } else {
+ func_80968B18(this);
+ }
+ }
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_80969898;
+ this->actor.speedXZ = 0.0f;
+ this->unk_2B4 = 0.0f;
+ func_80969AA0(this, play);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+ func_80968CB8(this);
+}
+
+void func_80969C54(EnJs* this, PlayState* play) {
+ s32 itemActionParam;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_16) {
+ itemActionParam = func_80123810(play);
+ if (itemActionParam != PLAYER_AP_NONE) {
+ this->actionFunc = func_80969DA4;
+ }
+ if (itemActionParam > PLAYER_AP_NONE) {
+ func_801477B4(play);
+ if ((itemActionParam >= PLAYER_AP_MASK_TRUTH) && (itemActionParam <= PLAYER_AP_MASK_GIANT)) {
+ EnJs_TakeMask(itemActionParam, ENJS_GET_TYPE(&this->actor));
+ Inventory_UnequipItem(itemActionParam - 4);
+ if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
+ player->actor.textId = 0x2221;
+ } else {
+ player->actor.textId = 0x2222;
+ }
+ } else if ((itemActionParam >= PLAYER_AP_MASK_FIERCE_DEITY) && (itemActionParam <= PLAYER_AP_MASK_DEKU)) {
+ player->actor.textId = 0x2220;
+ } else {
+ player->actor.textId = 0x221D;
+ }
+ }
+ if (itemActionParam <= PLAYER_AP_MINUS1) {
+ func_80151938(play, 0x221E);
+ }
+ }
+}
+
+void func_80969DA4(EnJs* this, PlayState* play) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 6, 0x1838, 0x64);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play) &&
+ ((play->msgCtx.currentTextId == 0x2219) || (play->msgCtx.currentTextId == 0x221E))) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ if (!func_809695FC(this, play)) {
+ func_809694E8(this, play);
+ break;
+ }
+ break;
+ case 1:
+ func_8019F230();
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x221B:
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ func_80151938(play, 0x2219);
+ break;
+ }
+ func_80151938(play, 0x221C);
+ break;
+ case 0x2224:
+ case 0x2226:
+ case 0x2228:
+ case 0x222A:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x2225:
+ case 0x2227:
+ case 0x2229:
+ case 0x222B:
+ if (!func_809695FC(this, play)) {
+ func_809694E8(this, play);
+ break;
+ }
+ break;
+ case 0x2222:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x2223:
+ switch (ENJS_GET_TYPE(&this->actor)) {
+ case 5:
+ func_80151938(play, 0x2224);
+ break;
+ case 6:
+ func_80151938(play, 0x2226);
+ break;
+ case 7:
+ func_80151938(play, 0x2228);
+ break;
+ case 8:
+ func_80151938(play, 0x222A);
+ break;
+ }
+ break;
+ case 0x221C:
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969C54;
+ break;
+ case 0x221D:
+ case 0x2220:
+ case 0x2221:
+ player->exchangeItemId = PLAYER_AP_NONE;
+ func_80151938(play, 0xFF);
+ this->actionFunc = func_80969C54;
+ break;
+ default:
+ func_809694E8(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_8096A080(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x2218;
+ } else {
+ textId = 0x221B;
+ if (this->unk_2B8 & 1) {
+ if (!func_8096933C(ENJS_GET_TYPE(&this->actor))) {
+ textId = 0x2219;
+ } else {
+ textId = 0x221C;
+ }
+ } else {
+ this->unk_2B8 |= 1;
+ }
+ }
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_8096A104(EnJs* this, PlayState* play) {
+ SkelAnime_Update(&this->skelAnime);
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_80969DA4;
+ func_8096A080(this, play);
+ } else if (func_80968DD0(this, play)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+}
+
+void func_8096A184(EnJs* this, PlayState* play) {
+ u16 textId;
+
+ if (gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) {
+ textId = 0x220B;
+ } else if (func_80968E38(0) >= 20) {
+ textId = 0x2202;
+ } else {
+ textId = 0x21FC;
+ }
+ Message_StartTextbox(play, textId, &this->actor);
+}
+
+void func_8096A1E8(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actor.flags &= ~ACTOR_FLAG_10000;
+ this->actionFunc = func_8096A38C;
+ Message_StartTextbox(play, 0x2208, &this->actor);
+ gSaveContext.save.weekEventReg[84] |= 0x20;
+ func_809696EC(this, 0);
+ } else {
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
+ }
+}
+
+void func_8096A2C0(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ }
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ this->actor.flags |= ACTOR_FLAG_10000;
+ this->actionFunc = func_8096A1E8;
+ func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_AP_MINUS1);
+ } else {
+ Actor_PickUp(&this->actor, play, GI_MASK_FIERCE_DEITY, 10000.0f, 1000.0f);
+ }
+}
+
+void func_8096A38C(EnJs* this, PlayState* play) {
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildStandingAnim, 0.0f);
+ this->unk_2B8 |= 2;
+ }
+ switch (Message_GetState(&play->msgCtx)) {
+ case TEXT_STATE_CHOICE:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ break;
+
+ case 1:
+ func_8019F230();
+ break;
+ }
+
+ switch (play->msgCtx.currentTextId) {
+ case 0x21FC:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x21FE);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
+ this->unk_2B8 |= 0x10;
+ break;
+ case 1:
+ func_80151938(play, 0x21FD);
+ break;
+ }
+ break;
+
+ case 0x21FE:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x2200);
+ func_809696EC(this, 0);
+ break;
+ case 1:
+ func_80151938(play, 0x21FF);
+ break;
+ }
+ break;
+
+ case 0x2203:
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(play, 0x2205);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gMoonChildGettingUpAnim, -5.0f);
+ this->unk_2B8 |= 0x10;
+ break;
+ case 1:
+ func_80151938(play, 0x2204);
+ break;
+ }
+ }
+ }
+ break;
+ case TEXT_STATE_5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x2202:
+ case 0x2205:
+ case 0x2206:
+ case 0x2209:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+
+ case 0x2200:
+ case 0x2208:
+ func_809696EC(this, 1);
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+
+ case 0x2207:
+ if (INV_CONTENT(ITEM_MASK_FIERCE_DEITY) == ITEM_MASK_FIERCE_DEITY) {
+ func_80151938(play, 0x2208);
+ func_809696EC(this, 0);
+ } else {
+ func_801477B4(play);
+ this->actionFunc = func_8096A2C0;
+ func_8096A2C0(this, play);
+ }
+ break;
+
+ case 0x2201:
+
+ case 0x220A:
+ if (!func_809695FC(this, play)) {
+ func_80969530(this, play);
+ }
+ break;
+
+ default:
+ func_80969530(this, play);
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_8096A6F4(EnJs* this, PlayState* play) {
+ s32 pad;
+
+ if (this->actor.home.rot.y != this->actor.shape.rot.y) {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 2, 0x400, 0x100);
+ if ((this->actor.home.rot.y == this->actor.shape.rot.y) && (this->unk_2B8 & 0x10)) {
+ Animation_Change(&this->skelAnime, &gMoonChildGettingUpAnim, -1.0f,
+ Animation_GetLastFrame(&gMoonChildGettingUpAnim) - 1.0f, 0.0f, ANIMMODE_ONCE, -10.0f);
+ this->unk_2B8 &= ~0x10;
+ this->unk_2B8 |= 8;
+ }
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ }
+ if (SkelAnime_Update(&this->skelAnime)) {
+ Animation_MorphToLoop(&this->skelAnime, &gMoonChildSittingAnim, -10.0f);
+ this->unk_2B8 &= ~8;
+ }
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+ this->actionFunc = func_8096A38C;
+ this->unk_2B8 &= ~2;
+ func_8096A184(this, play);
+ return;
+ }
+ if (!(this->unk_2B8 & 8) && (this->actor.xzDistToPlayer < 100.0f) &&
+ Player_IsFacingActor(&this->actor, 0x3000, play) && Actor_IsFacingPlayer(&this->actor, 0x1000)) {
+ func_800B8614(&this->actor, play, 120.0f);
+ }
+}
+
+void EnJs_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
+ EnJs* this = THIS;
+
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+
+ Actor_MoveWithGravity(&this->actor);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, 5);
+
+ this->actionFunc(this, play);
+
+ if ((this->cutsceneIndex != -1) && (ActorCutscene_GetCurrentIndex() != this->cutscenes[this->cutsceneIndex])) {
+ if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ ActorCutscene_Stop(0x7C);
+ ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ } else if (ActorCutscene_GetCanPlayNext(this->cutscenes[this->cutsceneIndex])) {
+ ActorCutscene_Start(this->cutscenes[this->cutsceneIndex], &this->actor);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ }
+ }
+}
+
+void func_8096A9F4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ s32 pad;
+ EnJs* this = THIS;
+
+ if (limbIndex == MOONCHILD_LIMB_HEAD) {
+ Matrix_MultVec3f(&D_8096AC30, &thisx->focus.pos);
+ if ((this->maskType >= 0) && (this->maskType < 5)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->maskType != 0) {
+ Matrix_Scale(D_8096ABE0[this->maskType], D_8096ABE0[this->maskType], D_8096ABE0[this->maskType],
+ MTXMODE_APPLY);
+ Matrix_RotateZYX(0, -0x4000, -0x36B0, MTXMODE_APPLY);
+ }
+ Matrix_Translate(D_8096ABF4[this->maskType], D_8096AC08[this->maskType], D_8096AC1C[this->maskType],
+ MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, D_8096ABCC[this->maskType]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+}
+
+void EnJs_Draw(Actor* thisx, PlayState* play) {
+ EnJs* this = THIS;
+
+ func_8012C28C(play->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
+ func_8096A9F4, &this->actor);
+}
diff --git a/src/overlays/actors/ovl_En_Js/z_en_js.h b/src/overlays/actors/ovl_En_Js/z_en_js.h
index 96c1bbf49..534557e66 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.h
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.h
@@ -2,6 +2,11 @@
#define Z_EN_JS_H
#include "global.h"
+#include "objects/object_ob/object_ob.h"
+
+#define ENJS_GET_TYPE(thisx) ((thisx)->params & 0xF)
+#define ENJS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENJS_GET_EXIT_INDEX(thisx) (((thisx)->params & 0x3F0) >> 4)
struct EnJs;
@@ -9,7 +14,18 @@ typedef void (*EnJsActionFunc)(struct EnJs*, PlayState*);
typedef struct EnJs {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x180];
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ ColliderCylinder collider;
+ /* 0x1D4 */ Vec3s jointTable[MOONCHILD_LIMB_MAX];
+ /* 0x240 */ Vec3s morphTable[MOONCHILD_LIMB_MAX];
+ /* 0x2AC */ Path* path;
+ /* 0x2B0 */ s32 unk_2B0;
+ /* 0x2B4 */ f32 unk_2B4;
+ /* 0x2B8 */ u16 unk_2B8;
+ /* 0x2BA */ s16 maskType;
+ /* 0x2BC */ s16 unk_2BC;
+ /* 0x2BE */ s16 cutscenes[2];
+ /* 0x2C2 */ s16 cutsceneIndex;
/* 0x2C4 */ EnJsActionFunc actionFunc;
} EnJs; // size = 0x2C8
diff --git a/src/overlays/actors/ovl_En_Kame/z_en_kame.c b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
index b6edc7778..c1ea3ae46 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -114,7 +114,7 @@ static TexturePtr D_80AD8E34[] = { object_tl_Tex_0055A0, object_tl_Tex_0057A0, o
object_tl_Tex_0057A0 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 1, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_SNAPPER, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, -1, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
index 5412065f5..46a1adfd5 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -154,9 +154,9 @@ void EnKarebaba_Init(Actor* thisx, PlayState* play) {
this->unk_22C = NULL;
if (this->actor.params == ENKAREBABA_2) {
- this->actor.hintId = 2;
+ this->actor.hintId = TATL_HINT_ID_MINI_BABA;
} else {
- this->actor.hintId = 9;
+ this->actor.hintId = TATL_HINT_ID_WILTED_DEKU_BABA;
}
if (this->actor.params == ENKAREBABA_0) {
diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
index b20edf2b4..eb6d4ab42 100644
--- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
+++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
@@ -433,8 +433,7 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_02;
func_801477B4(play);
func_800B7298(play, &this->actor, 7);
- Parameter_AddMagic(play,
- ((void)0, gSaveContext.unk_3F30) + (gSaveContext.save.playerData.doubleMagic * 48) + 48);
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
gSaveContext.eventInf[1] &= (u8)~1;
gSaveContext.eventInf[1] &= (u8)~2;
diff --git a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
index bd56373e5..bf91c7516 100644
--- a/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
+++ b/src/overlays/actors/ovl_En_Neo_Reeba/z_en_neo_reeba.c
@@ -134,7 +134,7 @@ void EnNeoReeba_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.targetMode = 2;
- this->actor.hintId = 0x47;
+ this->actor.hintId = TATL_HINT_ID_LEEVER;
this->actor.gravity = -0.5f;
this->targetPos = gZeroVec3f;
diff --git a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
index a0de8cc48..938696e88 100644
--- a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
+++ b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
@@ -95,7 +95,7 @@ static DamageTable D_80870900 = {
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_80870920[] = {
- ICHAIN_S8(hintId, 66, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_OCTOROK, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
index 5feb50245..2ff9d814e 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -163,7 +163,7 @@ static ColliderJntSphInit sJntSphInit = {
static CollisionCheckInfoInit sColChkInit = { 3, 30, 60, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 69, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GEKKO_SNAPPER, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 7, ICHAIN_CONTINUE),
@@ -1191,7 +1191,7 @@ void EnPametfrog_SetupCallSnapper(EnPametfrog* this, PlayState* play) {
// Zooms in on Gekko
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCamEye);
this->timer = 0;
- this->actor.hintId = 0x5F;
+ this->actor.hintId = TATL_HINT_ID_GEKKO_GIANT_SLIME;
this->actionFunc = EnPametfrog_CallSnapper;
}
diff --git a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
index d0598ce79..f7e943957 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -194,7 +194,7 @@ void EnPeehat_Init(Actor* thisx, PlayState* play) {
this->actor.shape.yOffset = -1000.0f;
}
Actor_SetScale(&this->actor, 0.036f);
- this->actor.hintId = 0x48;
+ this->actor.hintId = TATL_HINT_ID_PEAHAT;
func_80897498(this);
} else {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
@@ -205,7 +205,7 @@ void EnPeehat_Init(Actor* thisx, PlayState* play) {
this->colliderCylinder.dim.radius = 20;
this->colliderCylinder.dim.height = 15;
this->colliderCylinder.dim.yShift = -5;
- this->actor.hintId = 0x49;
+ this->actor.hintId = TATL_HINT_ID_PEAHAT_LARVA;
this->colliderCylinder.base.ocFlags1 &= ~OC1_ON;
func_80897A34(this);
diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
index b9afa5229..57e32a554 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
@@ -177,7 +177,7 @@ void EnPoSisters_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->type = ENPOSISTERS_GET_TYPE(thisx);
- this->actor.hintId = this->type + 80;
+ this->actor.hintId = this->type + TATL_HINT_ID_POE_SISTER_MEG;
this->megCloneId = ENPOSISTERS_GET_MEG_CLONE_ID(thisx);
this->floatingBobbingTimer = 32;
this->zTargetTimer = 20;
diff --git a/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
index 9d1dca75e..dde6236b5 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -143,7 +143,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 25, 50, 50 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 68, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_POE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3200, ICHAIN_STOP),
};
@@ -388,7 +388,7 @@ void func_80B2D2C0(EnPoh* this) {
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->unk_18E = 0;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.flags &= ~ACTOR_FLAG_1;
this->actionFunc = func_80B2D300;
}
diff --git a/src/overlays/actors/ovl_En_Pr/z_en_pr.c b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
index c7fae7c88..724b2c19f 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -118,7 +118,7 @@ void EnPr_Init(Actor* thisx, PlayState* play2) {
this->actor.colChkInfo.health = 3;
this->actor.colChkInfo.mass = 50;
- this->actor.hintId = 0x5C;
+ this->actor.hintId = TATL_HINT_ID_DESBREKO;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
index 2454639c5..4564c679f 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -109,7 +109,7 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
EnPr2* this = THIS;
this->actor.targetMode = 3;
- this->actor.hintId = 0x5B;
+ this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->unk_1EC = 255;
this->actor.colChkInfo.health = 1;
this->actor.colChkInfo.damageTable = &sDamageTable;
diff --git a/src/overlays/actors/ovl_En_Prz/z_en_prz.c b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
index 6fc5ea24a..e5c611578 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -110,7 +110,7 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 3;
this->unk_1E8 = 255;
- this->actor.hintId = 0x5B;
+ this->actor.hintId = TATL_HINT_ID_SKULLFISH;
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.colChkInfo.health = 1;
diff --git a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
index 095ee3fec..56201271b 100644
--- a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
+++ b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.c
@@ -282,7 +282,7 @@ void EnRailSkb_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.speedXZ = 1.6f;
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->unk_3F2 = 0;
this->unk_2E4 = -1;
this->unk_3FC = 0;
@@ -825,7 +825,7 @@ void func_80B723F8(EnRailSkb* this) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= ACTOR_FLAG_100000;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
}
@@ -926,7 +926,7 @@ void func_80B72880(EnRailSkb* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= ACTOR_FLAG_100000;
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
func_80B71650(this);
}
@@ -934,7 +934,7 @@ void func_80B72880(EnRailSkb* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags &= ~ACTOR_FLAG_100000;
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.textId = 0;
func_80B70FA0(this);
}
diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
index 10bbf2f83..58ab51cf8 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -246,7 +246,7 @@ void EnRailgibud_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.targetMode = 0;
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
if (ENRAILGIBUD_IS_CUTSCENE_TYPE(&this->actor)) {
EnRailgibud_InitCutsceneGibdo(this, play);
@@ -580,7 +580,7 @@ void EnRailgibud_Damage(EnRailgibud* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if ((this->drawDmgEffTimer > 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) &&
(this->type == EN_RAILGIBUD_TYPE_GIBDO)) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
SkelAnime_InitFlex(play, &this->skelAnime, &gRedeadSkel, NULL, this->jointTable, this->morphTable,
GIBDO_LIMB_MAX);
this->type = EN_RAILGIBUD_TYPE_REDEAD;
@@ -933,7 +933,7 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
if ((this->actionFunc != EnRailgibud_WalkInCircles) && (this->actionFunc != EnRailgibud_WalkToHome)) {
EnRailgibud_SetupWalkToHome(this);
@@ -943,9 +943,9 @@ void EnRailgibud_CheckForGibdoMask(EnRailgibud* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
if (this->type == EN_RAILGIBUD_TYPE_REDEAD) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
}
this->actor.textId = 0;
}
diff --git a/src/overlays/actors/ovl_En_Rat/z_en_rat.c b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
index 1054876aa..cc98c05e1 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -118,7 +118,7 @@ static TexturePtr sSparkTextures[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 97, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_REAL_BOMBCHU, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 15, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
index 1f4c10281..0092189c5 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -223,7 +223,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupSquattingDance(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupSquattingDance;
@@ -233,7 +233,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupClappingDance(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupClappingDance;
@@ -243,7 +243,7 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
if (!EnRd_ShouldNotDance(play)) {
EnRd_SetupPirouette(this);
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
EnRd_SetupIdle(this);
}
this->setupDanceFunc = EnRd_SetupPirouette;
@@ -251,9 +251,9 @@ void EnRd_Init(Actor* thisx, PlayState* play) {
default:
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
this->setupDanceFunc = EnRd_SetupIdle;
@@ -436,9 +436,9 @@ void EnRd_SquattingDance(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
Animation_Change(&this->skelAnime, &gGibdoRedeadLookBackAnim, 0.0f, 0.0f, 19.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = EnRd_EndClappingOrSquattingDanceWhenPlayerIsClose;
@@ -446,9 +446,9 @@ void EnRd_SquattingDance(EnRd* this, PlayState* play) {
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
@@ -480,9 +480,9 @@ void EnRd_ClappingDance(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
Animation_Change(&this->skelAnime, &gGibdoRedeadLookBackAnim, 0.0f, 0.0f, 19.0f, ANIMMODE_ONCE, -10.0f);
this->actionFunc = EnRd_EndClappingOrSquattingDanceWhenPlayerIsClose;
@@ -490,9 +490,9 @@ void EnRd_ClappingDance(EnRd* this, PlayState* play) {
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
@@ -541,18 +541,18 @@ void EnRd_Pirouette(EnRd* this, PlayState* play) {
this->isMourning = false;
if ((this->actor.xzDistToPlayer <= 150.0f) && EnRd_ShouldNotDance(play) && func_800B715C(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
this->actionFunc = EnRd_EndPirouetteWhenPlayerIsClose;
}
if (EnRd_ShouldNotDance(play)) {
if (EN_RD_GET_TYPE(&this->actor) == EN_RD_TYPE_GIBDO) {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
} else {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
}
EnRd_SetupIdle(this);
}
diff --git a/src/overlays/actors/ovl_En_Rr/z_en_rr.c b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
index 8fc202ddd..4a61e62b9 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -118,7 +118,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 45, 60, 250 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 55, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_LIKE_LIKE, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -400, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 2000, ICHAIN_CONTINUE),
diff --git a/src/overlays/actors/ovl_En_Sb/z_en_sb.c b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
index acd645d63..adcb78115 100644
--- a/src/overlays/actors/ovl_En_Sb/z_en_sb.c
+++ b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
@@ -92,7 +92,7 @@ static DamageTable sDamageTable = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 39, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_SHELLBLADE, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
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 e3c5b1730..62cb638d9 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -249,7 +249,7 @@ void EnSkb_Init(Actor* thisx, PlayState* play) {
default:
this->actor.flags &= ~ACTOR_FLAG_100000;
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
func_8099495C(this, play);
break;
}
@@ -353,7 +353,7 @@ void func_80995068(EnSkb* this, PlayState* play) {
} else if (Player_GetMask(play) != PLAYER_MASK_CAPTAIN) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_80995A30(this);
} else if (!(this->collider.base.acFlags & AC_HIT)) {
@@ -427,7 +427,7 @@ void func_8099533C(EnSkb* this, PlayState* play) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_8099571C(this);
}
@@ -449,7 +449,7 @@ void func_8099544C(EnSkb* this, PlayState* play) {
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
func_8099571C(this);
}
@@ -487,7 +487,7 @@ void func_8099556C(EnSkb* this, PlayState* play) {
func_80994F7C(this, play);
} else if (Actor_IsFacingPlayer(&this->actor, 0x2AAA) && (this->actor.xzDistToPlayer < 200.0f) &&
(this->skelAnime.curFrame > 24.0f) && (this->skelAnime.curFrame < 28.0f)) {
- this->actor.hintId = 0x55;
+ this->actor.hintId = TATL_HINT_ID_STALCHILD;
this->actor.colChkInfo.mass = MASS_HEAVY;
this->actor.targetArrowOffset = 2000.0f;
func_8099571C(this);
@@ -571,7 +571,7 @@ void func_80995A8C(EnSkb* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.colChkInfo.mass = MASS_HEAVY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
func_8099504C(this);
diff --git a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
index b07a1667e..e2dd8b54b 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -178,7 +178,7 @@ static Gfx* sSnowballFragmentDLs[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 20, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_EENO, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 3000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_St/z_en_st.c b/src/overlays/actors/ovl_En_St/z_en_st.c
index b3c353f1f..7d0dcbf11 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -704,7 +704,7 @@ void func_808A6A78(EnSt* this, PlayState* play) {
Actor_SetScale(&this->actor, 0.04f);
this->actor.draw = func_808A7478;
- this->actor.hintId = 4;
+ this->actor.hintId = TATL_HINT_ID_SKULLTULA;
this->actor.gravity = 0.0f;
func_808A63E8(this);
this->unk_18C = 0;
diff --git a/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
index a69cbe213..fc3aff029 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -1144,11 +1144,11 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetSphere(play, &this->collider, &this->actor, &sSphereInit);
if (!ENSW_GET_3(&this->actor)) {
- this->actor.hintId = 0x1F;
+ this->actor.hintId = TATL_HINT_ID_SKULLWALLTULA;
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->collider.info.toucher.damage = 8;
} else {
- this->actor.hintId = 0x20;
+ this->actor.hintId = TATL_HINT_ID_GOLD_SKULLTULA;
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit2);
this->collider.info.toucher.damage = 16;
}
diff --git a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
index a8d76a7a8..ef8973295 100644
--- a/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
+++ b/src/overlays/actors/ovl_En_Syateki_Crow/z_en_syateki_crow.c
@@ -67,7 +67,7 @@ static ColliderJntSphInit sJntSphInit = {
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 3000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 88, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_GUAY, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -500, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
index fcb1e8330..51a941b28 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.c
@@ -79,7 +79,7 @@ static AnimationInfo sAnimationInfo[] = {
};
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 77, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_MAD_SCRUB, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, 0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2600, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
index 9077b38c4..f631439bd 100644
--- a/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
+++ b/src/overlays/actors/ovl_En_Syateki_Okuta/z_en_syateki_okuta.c
@@ -72,7 +72,7 @@ static AnimationInfo sAnimationInfo[] = {
#include "assets/overlays/ovl_En_Syateki_Okuta/ovl_En_Syateki_Okuta.c"
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 66, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_OCTOROK, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
index d15859a74..647b21182 100644
--- a/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
+++ b/src/overlays/actors/ovl_En_Syateki_Wf/z_en_syateki_wf.c
@@ -186,7 +186,7 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
- this->actor.hintId = 0x4C;
+ this->actor.hintId = TATL_HINT_ID_WOLFOS;
func_80A201CC(this);
}
diff --git a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
index f1268e1e0..393caa1d9 100644
--- a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
+++ b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
@@ -229,7 +229,7 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.targetMode = 0;
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
this->actor.textId = 0;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 28.0f);
@@ -566,7 +566,7 @@ void EnTalkGibud_Damage(EnTalkGibud* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
if ((this->drawDmgEffTimer > 0) && (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FIRE) &&
(this->type == EN_TALK_GIBUD_TYPE_GIBDO)) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
SkelAnime_InitFlex(play, &this->skelAnime, &gRedeadSkel, NULL, this->jointTable, this->morphTable,
@@ -926,7 +926,7 @@ void EnTalkGibud_CheckForGibdoMask(EnTalkGibud* this, PlayState* play) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
this->actor.flags &= ~(ACTOR_FLAG_4 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_8 | ACTOR_FLAG_1);
- this->actor.hintId = 0xFF;
+ this->actor.hintId = TATL_HINT_ID_NONE;
this->actor.textId = 0;
EnTalkGibud_SetupPassiveIdle(this);
}
@@ -934,9 +934,9 @@ void EnTalkGibud_CheckForGibdoMask(EnTalkGibud* this, PlayState* play) {
this->actor.flags &= ~(ACTOR_FLAG_8 | ACTOR_FLAG_1);
this->actor.flags |= (ACTOR_FLAG_4 | ACTOR_FLAG_1);
if (this->type == EN_TALK_GIBUD_TYPE_REDEAD) {
- this->actor.hintId = 0x2A;
+ this->actor.hintId = TATL_HINT_ID_REDEAD;
} else {
- this->actor.hintId = 0x2D;
+ this->actor.hintId = TATL_HINT_ID_GIBDO;
}
this->actor.textId = 0;
EnTalkGibud_SetupWalkToHome(this);
diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.c b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
index 4a051fc23..54c3f0609 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -107,7 +107,7 @@ void EnTest2_Update(Actor* thisx, PlayState* play) {
void EnTest2_UpdateForLens(Actor* thisx, PlayState* play) {
EnTest2* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
this->actor.flags |= ACTOR_FLAG_80;
} else {
this->actor.flags &= ~ACTOR_FLAG_80;
diff --git a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
index 03c7d0e1d..dd4890d53 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -136,7 +136,7 @@ static s16 D_80C13664[] = { ITEM00_ARROWS_10, ITEM00_BOMBS_B, ITEM00_RUPEE_GR
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 35, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_TAKKURI, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Tite/z_en_tite.c b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
index 2b1385965..b912f6f38 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -125,7 +125,7 @@ static Color_RGBA8 D_80896B40 = { 180, 180, 180, 255 };
static Vec3f D_80896B44 = { 0.0f, 0.45f, 0.0f };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 70, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BLUE_TEKTITE, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_F32(terminalVelocity, -40, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1000, ICHAIN_STOP),
diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.c b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
index 182db5659..5df9cee3c 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
@@ -5,6 +5,7 @@
*/
#include "z_en_twig.h"
+#include "objects/object_twig/object_twig.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -12,10 +13,18 @@
void EnTwig_Init(Actor* thisx, PlayState* play);
void EnTwig_Destroy(Actor* thisx, PlayState* play);
-void EnTwig_Update(Actor* thisx, PlayState* play);
-void EnTwig_Draw(Actor* thisx, PlayState* play);
+void EnTwig_Update(Actor* this, PlayState* play);
+void EnTwig_Draw(EnTwig* this, PlayState* play);
+
+void func_80AC0A54(EnTwig* this, PlayState* play);
+void func_80AC0A6C(EnTwig* this, PlayState* play);
+
+void func_80AC0A7C(EnTwig* this, PlayState* play);
+void func_80AC0AC8(EnTwig* this, PlayState* play);
+
+void func_80AC0CC4(EnTwig* this, PlayState* play);
+void func_80AC0D2C(EnTwig* this, PlayState* play);
-#if 0
const ActorInit En_Twig_InitVars = {
ACTOR_EN_TWIG,
ACTORCAT_MISC,
@@ -28,36 +37,205 @@ const ActorInit En_Twig_InitVars = {
(ActorFunc)EnTwig_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80AC10C0[] = {
+static s32 sCurrentRing;
+static s16 sRingCount;
+static s16 sRingNotCollected[25];
+
+static CollisionHeader* sColHeaders[] = {
+ NULL,
+ &object_twig_Colheader_0020A0,
+ &object_twig_Colheader_0016C0,
+};
+
+static s16 sRingsHaveSpawned = false;
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 40, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 40, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_STOP),
};
-#endif
+void EnTwig_Init(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
+ s32 i;
-extern InitChainEntry D_80AC10C0[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ this->unk_160 = RACERING_GET_PARAM_F(&this->dyna.actor);
+ DynaPolyActor_Init(&this->dyna, 1);
+ if (sColHeaders[this->unk_160] != NULL) {
+ DynaPolyActor_LoadMesh(play, &this->dyna, sColHeaders[this->unk_160]);
+ }
+ this->dyna.actor.bgCheckFlags |= 0x400;
+ switch (this->unk_160) {
+ case 0:
+ Actor_MarkForDeath(&this->dyna.actor);
+ break;
+ case 1:
+ if (!sRingsHaveSpawned) {
+ sRingCount = (gSaveContext.save.weekEventReg[24] & 4) ? 25 : 20;
+ for (i = 0; i < sRingCount; i++) {
+ sRingNotCollected[i] = false;
+ }
+ sRingsHaveSpawned = true;
+ }
+ if (RACERING_GET_PARAM_1F0(&this->dyna.actor) != 0) {
+ if (!(gSaveContext.save.weekEventReg[24] & 4)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ } else if (gSaveContext.save.weekEventReg[24] & 4) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ Actor_SetScale(&this->dyna.actor, 4.2f);
+ this->dyna.actor.uncullZoneScale = this->dyna.actor.uncullZoneDownward = this->dyna.actor.scale.x * 60.0f;
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ func_80AC0A7C(this, play);
+ break;
+ case 2:
+ Actor_SetScale(&this->dyna.actor, 1.0f);
+ this->dyna.actor.uncullZoneScale = this->dyna.actor.uncullZoneDownward = this->dyna.actor.scale.x * 880.0f;
+ func_80AC0A54(this, play);
+ break;
+ }
+}
-extern UNK_TYPE D_06001C38;
+void EnTwig_Destroy(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Init.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Destroy.s")
+void func_80AC0A54(EnTwig* this, PlayState* play) {
+ this->actionFunc = func_80AC0A6C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A54.s")
+void func_80AC0A6C(EnTwig* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A6C.s")
+void func_80AC0A7C(EnTwig* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0A7C.s")
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+ this->unk_178 = 0;
+ this->unk_17A = 0;
+ this->actionFunc = func_80AC0AC8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0AC8.s")
+void func_80AC0AC8(EnTwig* this, PlayState* play) {
+ static Vec3f D_80AC10D0 = { 0.0f, 0.0f, 1.0f };
+ Player* player = GET_PLAYER(play);
+ Plane sp4C;
+ Vec3f sp40;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0CC4.s")
+ if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) {
+ if (this->unk_17A == 3) {
+ this->unk_17A = 0;
+ this->dyna.actor.shape.rot.z += 0x2000;
+ } else {
+ this->unk_17A++;
+ }
+ }
+ SubS_ConstructPlane(&this->dyna.actor.world.pos, &D_80AC10D0, &this->dyna.actor.shape.rot, &sp4C);
+ if ((sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) &&
+ Math3D_LineSegVsPlane(sp4C.normal.x, sp4C.normal.y, sp4C.normal.z, sp4C.originDist, &this->unk_180,
+ &player->bodyPartsPos[0], &sp40, 0)) {
+ if (Math3D_Vec3fDistSq(&this->dyna.actor.world.pos, &sp40) <= SQ(this->dyna.actor.scale.x * 0.345f * 40.0f)) {
+ func_80AC0CC4(this, play);
+ return;
+ }
+ } else {
+ if (this->dyna.actor.xyzDistToPlayerSq <= SQ((this->dyna.actor.scale.x * 40.0f) + 40)) {
+ func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ } else {
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ }
+ if (this->dyna.actor.xyzDistToPlayerSq >= (this->dyna.actor.scale.x * 10.0f * 40.0f * 40.0f)) {
+ this->dyna.actor.shape.rot.y = this->dyna.actor.yawTowardsPlayer;
+ this->dyna.actor.world.rot.y = this->dyna.actor.yawTowardsPlayer;
+ }
+ }
+ Math_Vec3f_Copy(&this->unk_180, &player->bodyPartsPos[0]);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/func_80AC0D2C.s")
+void func_80AC0CC4(EnTwig* this, PlayState* play) {
+ this->unk_170 = 3458.0f;
+ this->unk_174 = 0.2f;
+ this->unk_16C |= 1;
+ func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ this->actionFunc = func_80AC0D2C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Update.s")
+void func_80AC0D2C(EnTwig* this, PlayState* play) {
+ static Vec3f sKiraVel = { 0.0f, -0.05f, 0.0f };
+ static Vec3f sKiraAccel = { 0.0f, -0.025f, 0.0f };
+ static Color_RGBA8 sColorWhite = { 255, 255, 255, 130 };
+ static Color_RGBA8 sColorYellow = { 255, 255, 0, 0 };
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Twig/EnTwig_Draw.s")
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.x, player->bodyPartsPos[0].x, 0.5f, 100.0f, 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.y, player->bodyPartsPos[0].y, 0.5f, 100.0f, 0.01f);
+ Math_SmoothStepToF(&this->dyna.actor.world.pos.z, player->bodyPartsPos[0].z, 0.5f, 100.0f, 0.01f);
+ this->dyna.actor.shape.rot.z += (s16)this->unk_170;
+ this->dyna.actor.scale.x -= this->unk_174;
+ if (this->dyna.actor.scale.x < 0.0f) {
+ Actor_SetScale(&this->dyna.actor, 0.0f);
+ } else {
+ Actor_SetScale(&this->dyna.actor, this->dyna.actor.scale.x);
+ }
+ if (this->dyna.actor.scale.x <= 0.0f) {
+ s32 j;
+ Vec3f sp6C;
+
+ for (j = 0; j < 7; j++) {
+ sp6C.x = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.x;
+ sp6C.y = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.y;
+ sp6C.z = (Rand_Centered() * 10.0f) + this->dyna.actor.world.pos.z;
+ EffectSsKirakira_SpawnDispersed(play, &sp6C, &sKiraVel, &sKiraAccel, &sColorWhite, &sColorYellow, 1000,
+ (s32)(Rand_ZeroOne() * 10.0f) + 20);
+ }
+ play_sound(NA_SE_SY_GET_ITEM);
+ play->interfaceCtx.unk_25C--;
+ sRingNotCollected[RACERING_GET_PARAM_FE0(&this->dyna.actor)] = true;
+ if (sCurrentRing == RACERING_GET_PARAM_FE0(&this->dyna.actor)) {
+ s32 i;
+
+ for (i = 0; i < sRingCount; i++) {
+ if (!sRingNotCollected[i]) {
+ sCurrentRing = i;
+ break;
+ }
+ }
+ if (i == sRingCount) {
+ sCurrentRing = -1;
+ }
+ }
+ Actor_MarkForDeath(&this->dyna.actor);
+ return;
+ }
+ this->unk_170 += 180.0f / 0x10000;
+ this->unk_174 += 0.15f;
+}
+
+void EnTwig_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ EnTwig* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EnTwig_Draw(EnTwig* thisx, PlayState* play) {
+ EnTwig* this = THIS;
+
+ switch (this->unk_160) {
+ case 1:
+ Gfx_DrawDListOpa(play, object_twig_DL_001C38);
+ break;
+ case 2:
+ Gfx_DrawDListOpa(play, object_twig_DL_0014C8);
+ break;
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Twig/z_en_twig.h b/src/overlays/actors/ovl_En_Twig/z_en_twig.h
index 2caebeb82..3de7f8f4b 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.h
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.h
@@ -7,11 +7,22 @@ struct EnTwig;
typedef void (*EnTwigActionFunc)(struct EnTwig*, PlayState*);
+#define RACERING_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
+#define RACERING_GET_PARAM_1F0(thisx) (((thisx)->params >> 4) & 0x1F)
+#define RACERING_GET_PARAM_FE0(thisx) (((thisx)->params >> 9) & 0x7F)
+
typedef struct EnTwig {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x18];
+ /* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ EnTwigActionFunc actionFunc;
- /* 0x160 */ char unk_160[0x2C];
+ /* 0x160 */ s32 unk_160;
+ /* 0x160 */ UNK_TYPE1 unk164[8];
+ /* 0x16C */ s32 unk_16C;
+ /* 0x170 */ f32 unk_170;
+ /* 0x174 */ f32 unk_174;
+ /* 0x178 */ s16 unk_178;
+ /* 0x17A */ u16 unk_17A;
+ /* 0x17C */ UNK_TYPE1 unk17C[4];
+ /* 0x180 */ Vec3f unk_180;
} EnTwig; // size = 0x18C
extern const ActorInit En_Twig_InitVars;
diff --git a/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
index 4e7e85147..5ce0f0286 100644
--- a/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -151,7 +151,7 @@ TexturePtr D_808CD58C[] = {
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 14, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 1000, ICHAIN_CONTINUE),
- ICHAIN_S8(hintId, 57, ICHAIN_STOP),
+ ICHAIN_S8(hintId, TATL_HINT_ID_BEAMOS, ICHAIN_STOP),
};
s32 D_808CD5B8 = false;
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
index 16cfa6a4b..9dca3642f 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -123,7 +123,7 @@ static DamageTable sDamageTable = {
static CollisionCheckInfoInit sColChkInfoInit = { 3, 30, 40, 150 };
static InitChainEntry sInitChain[] = {
- ICHAIN_S8(hintId, 48, ICHAIN_CONTINUE),
+ ICHAIN_S8(hintId, TATL_HINT_ID_WALLMASTER, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 5500, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -1500, ICHAIN_STOP),
};
diff --git a/src/overlays/actors/ovl_En_Wf/z_en_wf.c b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
index 8a5da16c5..811f828a8 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -319,7 +319,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
if (this->actor.params == 0) {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
- this->actor.hintId = 0x4C;
+ this->actor.hintId = TATL_HINT_ID_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit);
this->collider1.elements[0].info.toucher.damage = 8;
this->collider1.elements[1].info.toucher.damage = 8;
@@ -327,7 +327,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
} else {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_WHITE_LIMB_MAX);
- this->actor.hintId = 0x57;
+ this->actor.hintId = TATL_HINT_ID_WHITE_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable1, &sColChkInfoInit);
}
diff --git a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
index d2fa8e3a0..0bd1fd30c 100644
--- a/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
+++ b/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c
@@ -123,7 +123,7 @@ void ItemEtcetera_Update(Actor* thisx, PlayState* play) {
void ItemEtcetera_DrawThroughLens(Actor* thisx, PlayState* play) {
ItemEtcetera* this = THIS;
- if (play->actorCtx.unk4 == 100) {
+ if (play->actorCtx.lensMaskSize == LENS_MASK_ACTIVE_SIZE) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
GetItem_Draw(play, this->getItemDrawId);
diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
index deb315bc4..24597e4aa 100644
--- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
+++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
@@ -41,11 +41,11 @@ void ObjKinoko_Update(Actor* thisx, PlayState* play) {
if (player->currentMask != PLAYER_MASK_SCENTS) {
thisx->draw = NULL;
- thisx->hintId = 0xFF;
+ thisx->hintId = TATL_HINT_ID_NONE;
thisx->flags &= ~ACTOR_FLAG_1;
} else {
thisx->draw = ObjKinoko_Draw;
- thisx->hintId = 0x64;
+ thisx->hintId = TATL_HINT_ID_MUSHROOM;
thisx->flags |= ACTOR_FLAG_1;
if (Actor_HasParent(thisx, play)) {
Flags_SetCollectible(play, OBJ_KINOKO_GET_FLAG(thisx));
diff --git a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
index e895eeba9..33ebf1e50 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_usiyane.h"
+#include "objects/object_obj_usiyane/object_obj_usiyane.h"
#define FLAGS (ACTOR_FLAG_20)
@@ -15,7 +16,6 @@ void ObjUsiyane_Destroy(Actor* thisx, PlayState* play);
void ObjUsiyane_Update(Actor* thisx, PlayState* play);
void ObjUsiyane_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Obj_Usiyane_InitVars = {
ACTOR_OBJ_USIYANE,
ACTORCAT_PROP,
@@ -28,40 +28,245 @@ const ActorInit Obj_Usiyane_InitVars = {
(ActorFunc)ObjUsiyane_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80C086B0[] = {
+PosRot D_80C08660[] = {
+ { { 800.0f, -940.0f, 2000.0f }, { 0, 0, 0x2AF8 } },
+ { { 560.0f, -790.0f, -2000.0f }, { 0, 0, 0x2EE0 } },
+ { { -480.0f, -780.0f, -1990.0f }, { 0, 0, -0x2710 } },
+ { { -470.0f, -850.0f, 2000.0f }, { 0, 0, -0x2710 } },
+};
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 1200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 900, ICHAIN_STOP),
};
-#endif
+s32 func_80C07C80(s32 arg0) {
+ s32 var_v1;
-extern InitChainEntry D_80C086B0[];
+ if (!(arg0 & 1)) {
+ var_v1 = gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF;
+ } else {
+ var_v1 = (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF0000) >> 0x10;
+ }
+ return var_v1 + CLOCK_TIME(2, 30);
+}
-extern UNK_TYPE D_06000838;
-extern UNK_TYPE D_060022AC;
+s32 func_80C07CD0(void) {
+ if (CURRENT_DAY <= 0) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07C80.s")
+ if (CURRENT_DAY == 1) {
+ s32 time = gSaveContext.save.time;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07CD0.s")
+ if ((time < CLOCK_TIME(2, 30)) || (time >= CLOCK_TIME(6, 0))) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07DC4.s")
+ if (time < CLOCK_TIME(5, 15)) {
+ s32 var_s1 = CLOCK_TIME(5, 15);
+ s32 temp_v0_2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07DFC.s")
+ for (i = 0; i < 8; i++) {
+ temp_v0_2 = func_80C07C80(i);
+ var_s1 = CLAMP_MAX(var_s1, temp_v0_2);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C07F30.s")
+ if (time < (var_s1 + 0xE11)) {
+ return false;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C081C8.s")
+ if (gSaveContext.save.weekEventReg[22] & 1) {
+ return false;
+ }
+ return true;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C082CC.s")
+void func_80C07DC4(ObjUsiyane* this, PlayState* play) {
+ if (func_80C07CD0()) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/func_80C082E0.s")
+void func_80C07DFC(Vec3f* arg0, Vec3s* arg1, Vec3f* arg2, Vec3s* arg3, s32 arg4, s32 arg5, Vec3f* arg6, Vec3s* arg7) {
+ f32 temp_fv0 = (f32)arg4 / arg5;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Init.s")
+ // VEC3F_LERPIMPDST
+ arg6->x = ((arg2->x - arg0->x) * temp_fv0) + arg0->x;
+ arg6->y = ((arg2->y - arg0->y) * temp_fv0) + arg0->y;
+ arg6->z = ((arg2->z - arg0->z) * temp_fv0) + arg0->z;
+ arg7->x = (((f32)arg3->x - (f32)arg1->x) * temp_fv0) + arg1->x;
+ arg7->y = (((f32)arg3->y - (f32)arg1->y) * temp_fv0) + arg1->y;
+ arg7->z = (((f32)arg3->z - (f32)arg1->z) * temp_fv0) + arg1->z;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Destroy.s")
+void func_80C07F30(ObjUsiyane* this, PlayState* play) {
+ s32 i;
+ s32 j;
+ Vec3f sp94;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Update.s")
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ if (i != ARRAY_COUNT(this->unk_168[0]) - 1) {
+ func_80C07DFC(&this->unk_710[i], &D_80C08660[i].rot, &this->unk_710[i + 1], &D_80C08660[i + 1].rot, j,
+ 10, &this->unk_168[j][i].unk_00, &this->unk_168[j][i].unk_18);
+ } else {
+ func_80C07DFC(&this->unk_710[i], &D_80C08660[i].rot, &this->unk_710[0], &D_80C08660[0].rot, j, 10,
+ &this->unk_168[j][i].unk_00, &this->unk_168[j][i].unk_18);
+ }
+ func_800B12F0(play, &this->unk_168[j][i].unk_00, &gZeroVec3f, &gZeroVec3f, 100, 30, 7);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Usiyane/ObjUsiyane_Draw.s")
+ this->unk_168[j][i].unk_18.y = (s32)Rand_Next() >> 0x10;
+
+ sp94.x = this->unk_168[j][i].unk_00.x - this->unk_708;
+ sp94.y = 0.0f;
+ sp94.z = this->unk_168[j][i].unk_00.z - this->unk_70C;
+ Math3D_Normalize(&sp94);
+
+ sp94.x *= 5.0f;
+ sp94.y = 19.0f;
+ sp94.z *= 5.0f;
+
+ this->unk_168[j][i].unk_0C = sp94;
+
+ this->unk_168[j][i].unk_1E.x = Rand_Centered() * 4000.0f;
+ this->unk_168[j][i].unk_1E.y = Rand_Centered() * 4000.0f;
+ this->unk_168[j][i].unk_1E.z = Rand_Centered() * 4000.0f;
+ }
+ }
+
+ Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_HOUSE_BROKEN);
+ this->unk_740 = 0;
+ this->unk_744 |= 4;
+}
+
+void func_80C081C8(ObjUsiyane* this, PlayState* play) {
+ s32 i;
+ s32 j;
+
+ this->unk_744 |= 1;
+
+ if (this->unk_740 <= 70) {
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ this->unk_168[j][i].unk_0C.y += -0.8f;
+
+ this->unk_168[j][i].unk_00.x += this->unk_168[j][i].unk_0C.x;
+ this->unk_168[j][i].unk_00.y += this->unk_168[j][i].unk_0C.y;
+ this->unk_168[j][i].unk_00.z += this->unk_168[j][i].unk_0C.z;
+
+ this->unk_168[j][i].unk_18.x += this->unk_168[j][i].unk_1E.x;
+ this->unk_168[j][i].unk_18.y += this->unk_168[j][i].unk_1E.y;
+ this->unk_168[j][i].unk_18.z += this->unk_168[j][i].unk_1E.z;
+ }
+ }
+
+ } else if (this->unk_740 >= 70) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+ this->unk_740++;
+}
+
+void func_80C082CC(ObjUsiyane* this, PlayState* play) {
+ this->unk_164 = -1;
+}
+
+void func_80C082E0(ObjUsiyane* this, PlayState* play) {
+ CsCmdActorAction* csAction;
+
+ if (Cutscene_CheckActorAction(play, 0x228)) {
+ this->unk_160 = Cutscene_GetActorActionIndex(play, 0x228);
+ csAction = play->csCtx.actorActions[this->unk_160];
+ if (this->unk_164 != csAction->action) {
+ this->unk_164 = csAction->action;
+ if (this->unk_164 == 2) {
+ func_80C07F30(this, play);
+ this->actionFunc = func_80C081C8;
+ }
+ }
+ }
+}
+
+void ObjUsiyane_Init(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+
+ this->unk_744 = 0;
+
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &object_obj_usiyane_Colheader_0022AC);
+
+ switch (OBJUSIYANE_GET_F(&this->dyna.actor)) {
+ case OBJUSIYANE_F_0:
+ this->actionFunc = func_80C07DC4;
+ break;
+
+ case OBJUSIYANE_F_1:
+ func_80C082CC(this, play);
+ this->actionFunc = func_80C082E0;
+ break;
+
+ default:
+ Actor_MarkForDeath(&this->dyna.actor);
+ break;
+ }
+}
+
+void ObjUsiyane_Destroy(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
+
+void ObjUsiyane_Update(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void ObjUsiyane_Draw(Actor* thisx, PlayState* play) {
+ ObjUsiyane* this = THIS;
+ MtxF mf;
+
+ if (!(this->unk_744 & 1)) {
+ Gfx_DrawDListOpa(play, object_obj_usiyane_DL_000838);
+ }
+
+ if (!(this->unk_744 & 2)) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(D_80C08660); i++) {
+ Vec3f sp74;
+
+ Matrix_MultVec3f(&D_80C08660[i].pos, &this->unk_710[i]);
+ Matrix_MultVec3f(&gZeroVec3f, &sp74);
+ this->unk_708 = sp74.x;
+ this->unk_70C = sp74.z;
+ }
+ this->unk_744 |= 2;
+ }
+
+ if ((this->unk_744 & 4) && !(this->unk_744 & 8)) {
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_168[0]); i++) {
+ for (j = 0; j < ARRAY_COUNT(this->unk_168); j++) {
+ Matrix_Push();
+ SkinMatrix_SetScaleRotateRPYTranslate(&mf, 0.1f, 0.1f, 0.1f, this->unk_168[j][i].unk_18.x,
+ this->unk_168[j][i].unk_18.y, this->unk_168[j][i].unk_18.z,
+ this->unk_168[j][i].unk_00.x, this->unk_168[j][i].unk_00.y,
+ this->unk_168[j][i].unk_00.z);
+ Matrix_Put(&mf);
+ Gfx_DrawDListOpa(play, object_obj_usiyane_DL_000098);
+ Matrix_Pop();
+ }
+ }
+ }
+}
diff --git a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
index 7c4cdd8a5..c38a08ed9 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
@@ -7,11 +7,31 @@ struct ObjUsiyane;
typedef void (*ObjUsiyaneActionFunc)(struct ObjUsiyane*, PlayState*);
+#define OBJUSIYANE_GET_F(thisx) ((thisx)->params & 0xF)
+
+enum {
+ /* 0 */ OBJUSIYANE_F_0,
+ /* 1 */ OBJUSIYANE_F_1,
+};
+
+typedef struct {
+ /* 0x00 */ Vec3f unk_00;
+ /* 0x0C */ Vec3f unk_0C;
+ /* 0x18 */ Vec3s unk_18;
+ /* 0x1E */ Vec3s unk_1E;
+} ObjUsiyaneStruct; // size = 0x24
+
typedef struct ObjUsiyane {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x18];
+ /* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjUsiyaneActionFunc actionFunc;
- /* 0x160 */ char unk_160[0x5E8];
+ /* 0x160 */ s32 unk_160;
+ /* 0x164 */ s32 unk_164;
+ /* 0x168 */ ObjUsiyaneStruct unk_168[10][4];
+ /* 0x708 */ f32 unk_708;
+ /* 0x70C */ f32 unk_70C;
+ /* 0x710 */ Vec3f unk_710[4];
+ /* 0x740 */ s32 unk_740;
+ /* 0x744 */ s32 unk_744;
} ObjUsiyane; // size = 0x748
extern const ActorInit Obj_Usiyane_InitVars;
diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
index 91a5d3e66..7eaf78c20 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
@@ -10,17 +10,17 @@
#define THIS ((OceffSpot*)thisx)
-void OceffSpot_Init(Actor* thisx, PlayState* play);
-void OceffSpot_Destroy(Actor* thisx, PlayState* play);
+void OceffSpot_Init(Actor* thisx, PlayState* play2);
+void OceffSpot_Destroy(Actor* thisx, PlayState* play2);
void OceffSpot_Update(Actor* thisx, PlayState* play);
void OceffSpot_Draw(Actor* thisx, PlayState* play);
-void func_809728F8(OceffSpot* this, PlayState* play);
-void func_80972934(OceffSpot* this, PlayState* play);
+void OceffSpot_Wait(OceffSpot* this, PlayState* play);
+void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play);
+void OceffSpot_End(OceffSpot* this, PlayState* play);
void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc);
-#if 0
const ActorInit Oceff_Spot_InitVars = {
ACTOR_OCEFF_SPOT,
ACTORCAT_ITEMACTION,
@@ -33,28 +33,140 @@ const ActorInit Oceff_Spot_InitVars = {
(ActorFunc)OceffSpot_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80973478[] = {
+#include "assets/overlays/ovl_Oceff_Spot/ovl_Oceff_Spot.c"
+
+static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 0, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1500, ICHAIN_STOP),
};
-#endif
+void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc) {
+ this->actionFunc = actionFunc;
+}
-extern InitChainEntry D_80973478[];
+void OceffSpot_Init(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ OceffSpot* this = THIS;
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_SetupAction.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ OceffSpot_SetupAction(this, OceffSpot_GrowCylinder);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Init.s")
+ Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ this->lightNode1 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Destroy.s")
+ Lights_PointNoGlowSetInfo(&this->lightInfo2, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ this->lightNode2 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo2);
+ this->actor.scale.y = 0.3f;
+ this->unk16C = 0.0f;
+ this->actor.world.pos.y = player->actor.world.pos.y;
+ this->actor.world.pos.x = player->bodyPartsPos[0].x;
+ this->actor.world.pos.z = player->bodyPartsPos[0].z;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972844.s")
+void OceffSpot_Destroy(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ OceffSpot* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_809728F8.s")
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode1);
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode2);
+ Magic_Reset(play);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972934.s")
+void OceffSpot_End(OceffSpot* this, PlayState* play) {
+ if (this->unk16C > 0.0f) {
+ this->unk16C -= 0.05f;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ if ((REG(15) != 0x190) && (play->msgCtx.unk12046 == 0)) {
+ if ((play->msgCtx.ocarinaAction != 0x39) || (play->msgCtx.ocarinaMode != 0xA)) {
+ gSaveContext.sunsSongState = SUNSSONG_START;
+ }
+ } else {
+ play->msgCtx.ocarinaMode = 4;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Update.s")
+void OceffSpot_Wait(OceffSpot* this, PlayState* play) {
+ if (this->timer > 0) {
+ this->timer--;
+ } else {
+ OceffSpot_SetupAction(this, OceffSpot_End);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Draw.s")
+void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play) {
+ if (this->unk16C < 1.0f) {
+ this->unk16C += 0.05f;
+ } else {
+ OceffSpot_SetupAction(this, OceffSpot_Wait);
+ this->timer = 60;
+ }
+}
+
+void OceffSpot_Update(Actor* thisx, PlayState* play) {
+ f32 scale;
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+ f32 temp;
+ OceffSpot* this = THIS;
+
+ temp = (1.0f - cosf(this->unk16C * M_PI)) * 0.5f;
+ this->actionFunc(this, play);
+
+ switch (gSaveContext.save.playerForm) {
+ default:
+ scale = 1.0f;
+ break;
+
+ case PLAYER_FORM_DEKU:
+ scale = 1.3f;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ scale = 1.2f;
+ break;
+
+ case PLAYER_FORM_GORON:
+ scale = 2.0f;
+ break;
+ }
+
+ this->actor.scale.z = (scale * 0.42f) * temp;
+ this->actor.scale.x = (scale * 0.42f) * temp;
+
+ this->actor.world.pos = player->actor.world.pos;
+ this->actor.world.pos.y = this->actor.world.pos.y + 5.0f;
+
+ temp = (2.0f - this->unk16C) * this->unk16C;
+
+ func_800FD2B4(play, temp * 0.5f, 880.0f, 0.2f, 0.9f);
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y + 55.0f,
+ this->actor.world.pos.z, (s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp),
+ 100.0f * temp);
+ Lights_PointNoGlowSetInfo(
+ &this->lightInfo2, this->actor.world.pos.x + (Math_SinS(player->actor.shape.rot.y) * 20.0f),
+ this->actor.world.pos.y + 20.0f, this->actor.world.pos.z + (Math_CosS(player->actor.shape.rot.y) * 20.0f),
+ (s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp), 100.0f * temp);
+}
+
+void OceffSpot_Draw(Actor* thisx, PlayState* play) {
+ OceffSpot* this = THIS;
+ u32 scroll = play->state.frames & 0xFFFF;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 2, scroll * -2, 0x20, 0x20, 1, 0,
+ scroll * -8, 0x20, 0x20));
+ gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
index 922b1f89b..0a770ee9d 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.h
@@ -9,7 +9,12 @@ typedef void (*OceffSpotActionFunc)(struct OceffSpot*, PlayState*);
typedef struct OceffSpot {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x30];
+ /* 0x144 */ LightNode* lightNode1;
+ /* 0x148 */ LightInfo lightInfo1;
+ /* 0x158 */ LightNode* lightNode2;
+ /* 0x15C */ LightInfo lightInfo2;
+ /* 0x16C */ f32 unk16C;
+ /* 0x170 */ u16 timer;
/* 0x174 */ OceffSpotActionFunc actionFunc;
} OceffSpot; // size = 0x178
diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
index ca7ff8de2..54672f173 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
@@ -15,7 +15,6 @@ void OceffWipe2_Destroy(Actor* thisx, PlayState* play);
void OceffWipe2_Update(Actor* thisx, PlayState* play);
void OceffWipe2_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Oceff_Wipe2_InitVars = {
ACTOR_OCEFF_WIPE2,
ACTORCAT_ITEMACTION,
@@ -28,12 +27,83 @@ const ActorInit Oceff_Wipe2_InitVars = {
(ActorFunc)OceffWipe2_Draw,
};
-#endif
+#include "assets/overlays/ovl_Oceff_Wipe2/ovl_Oceff_Wipe2.c"
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Init.s")
+s32 D_809879D0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Destroy.s")
+void OceffWipe2_Init(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Update.s")
+ Actor_SetScale(&this->actor, 0.1f);
+ this->timer = 0;
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe2/OceffWipe2_Draw.s")
+void OceffWipe2_Destroy(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
+
+ Magic_Reset(play);
+ play->msgCtx.unk120B0 = 0;
+}
+
+void OceffWipe2_Update(Actor* thisx, PlayState* play) {
+ OceffWipe2* this = THIS;
+
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+ if (this->timer < 100) {
+ this->timer++;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void OceffWipe2_Draw(Actor* thisx, PlayState* play) {
+ u32 scroll = play->state.frames & 0xFF;
+ OceffWipe2* this = THIS;
+ f32 z;
+ u8 alpha;
+ s32 pad[2];
+ Vec3f eye = GET_ACTIVE_CAM(play)->eye;
+ Vtx* vtxPtr;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play));
+
+ vtxPtr = sEponaSongFrustumVtx;
+
+ if (this->timer < 32) {
+ z = Math_SinS(this->timer << 9) * 1220.0f;
+ } else {
+ z = 1220.0f;
+ }
+
+ if (this->timer >= 80) {
+ alpha = 12 * (100 - this->timer);
+ } else {
+ alpha = 255;
+ }
+
+ vtxPtr[1].v.cn[3] = vtxPtr[3].v.cn[3] = vtxPtr[5].v.cn[3] = vtxPtr[7].v.cn[3] = vtxPtr[9].v.cn[3] =
+ vtxPtr[11].v.cn[3] = vtxPtr[13].v.cn[3] = vtxPtr[15].v.cn[3] = vtxPtr[16].v.cn[3] = vtxPtr[18].v.cn[3] =
+ vtxPtr[20].v.cn[3] = alpha;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+
+ Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_RotateXS(0x708, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 100, 0, 128);
+ gSPDisplayList(POLY_XLU_DISP++, sEponaSongFrustumMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, scroll * 6, scroll * -6, 64,
+ 64, 1, scroll * -6, 0, 64, 64));
+ gSPDisplayList(POLY_XLU_DISP++, sEponaSongFrustumModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
index 79d366525..c213dfe38 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.h
@@ -7,7 +7,7 @@ struct OceffWipe2;
typedef struct OceffWipe2 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4];
+ /* 0x144 */ s16 timer;
} OceffWipe2; // size = 0x148
extern const ActorInit Oceff_Wipe2_InitVars;
diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
index fb1f2a45d..4837f6949 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
@@ -16,7 +16,6 @@ void OceffWipe3_Destroy(Actor* thisx, PlayState* play);
void OceffWipe3_Update(Actor* thisx, PlayState* play);
void OceffWipe3_Draw(Actor* thisx, PlayState* play);
-#if 0
const ActorInit Oceff_Wipe3_InitVars = {
ACTOR_OCEFF_WIPE3,
ACTORCAT_ITEMACTION,
@@ -29,12 +28,82 @@ const ActorInit Oceff_Wipe3_InitVars = {
(ActorFunc)OceffWipe3_Draw,
};
-#endif
+#include "assets/overlays/ovl_Oceff_Wipe3/ovl_Oceff_Wipe3.c"
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Init.s")
+s32 D_80989130;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Destroy.s")
+void OceffWipe3_Init(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Update.s")
+ Actor_SetScale(&this->actor, 0.1f);
+ this->counter = 0;
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe3/OceffWipe3_Draw.s")
+void OceffWipe3_Destroy(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
+
+ Magic_Reset(play);
+ play->msgCtx.unk120B0 = 0;
+}
+
+void OceffWipe3_Update(Actor* thisx, PlayState* play) {
+ OceffWipe3* this = THIS;
+
+ this->actor.world.pos = GET_ACTIVE_CAM(play)->eye;
+ if (this->counter < 100) {
+ this->counter++;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void OceffWipe3_Draw(Actor* thisx, PlayState* play) {
+ u32 scroll = play->state.frames & 0xFFF;
+ OceffWipe3* this = THIS;
+ f32 z;
+ u8 alpha;
+ s32 pad[2];
+ Vec3f eye = GET_ACTIVE_CAM(play)->eye;
+ Vtx* vtxPtr;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play));
+
+ vtxPtr = sSariaSongFrustumVtx;
+
+ if (this->counter < 32) {
+ z = Math_SinS(this->counter * 512) * 1220.0f;
+ } else {
+ z = 1220.0f;
+ }
+
+ if (this->counter >= 80) {
+ alpha = 12 * (100 - this->counter);
+ } else {
+ alpha = 255;
+ }
+
+ vtxPtr[1].v.cn[3] = vtxPtr[3].v.cn[3] = vtxPtr[5].v.cn[3] = vtxPtr[7].v.cn[3] = vtxPtr[9].v.cn[3] =
+ vtxPtr[11].v.cn[3] = vtxPtr[13].v.cn[3] = vtxPtr[15].v.cn[3] = vtxPtr[17].v.cn[3] = vtxPtr[19].v.cn[3] =
+ vtxPtr[21].v.cn[3] = alpha;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_8012C2DC(play->state.gfxCtx);
+ Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_RotateXS(0x708, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 100, 200, 0, 128);
+ gSPDisplayList(POLY_XLU_DISP++, &sSariaSongFrustrumMaterialDL);
+ gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 12, scroll * -12, 64, 64, 1,
+ scroll * 8, scroll * -8, 64, 64));
+ gSPDisplayList(POLY_XLU_DISP++, &sSariaSongFrustumModelDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
index b9f41bb09..f29ca9278 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.h
@@ -7,7 +7,7 @@ struct OceffWipe3;
typedef struct OceffWipe3 {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x4];
+ /* 0x144 */ s16 counter;
} OceffWipe3; // size = 0x148
extern const ActorInit Oceff_Wipe3_InitVars;
diff --git a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
index 3dd701dbf..97c688434 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
@@ -38,7 +38,7 @@ void OceffWipe6_Init(Actor* thisx, PlayState* play) {
}
void OceffWipe6_Destroy(Actor* thisx, PlayState* play) {
- func_80115D5C(&play->state);
+ Magic_Reset(play);
play->msgCtx.unk120B0 = 0;
}
diff --git a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
index 5a71ef0d1..abd01e1ff 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
@@ -42,7 +42,7 @@ void OceffWipe7_Init(Actor* thisx, PlayState* play) {
void OceffWipe7_Destroy(Actor* thisx, PlayState* play) {
OceffWipe7* this = THIS;
- func_80115D5C(&play->state);
+ Magic_Reset(play);
play->msgCtx.unk120B0 = 0;
}
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index bea647d45..52e28708d 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -811,7 +811,7 @@
0x800B9084:("func_800B9084",),
0x800B9098:("func_800B9098",),
0x800B90AC:("func_800B90AC",),
- 0x800B90F4:("func_800B90F4",),
+ 0x800B90F4:("Actor_DeactivateLens",),
0x800B9120:("func_800B9120",),
0x800B9170:("Actor_InitContext",),
0x800B9334:("Actor_SpawnSetupActors",),
@@ -821,8 +821,8 @@
0x800B9D1C:("func_800B9D1C",),
0x800B9E3C:("Actor_DrawAllSetup",),
0x800B9E4C:("Actor_RecordUndrawnActor",),
- 0x800B9E84:("func_800B9E84",),
- 0x800B9EF4:("func_800B9EF4",),
+ 0x800B9E84:("Actor_DrawLensOverlay",),
+ 0x800B9EF4:("Actor_DrawLensActors",),
0x800BA2D8:("func_800BA2D8",),
0x800BA2FC:("func_800BA2FC",),
0x800BA42C:("Actor_DrawAll",),
@@ -2134,13 +2134,13 @@
0x801159C0:("Health_GiveHearts",),
0x801159EC:("Rupees_ChangeBy",),
0x80115A14:("Inventory_ChangeAmmo",),
- 0x80115D14:("Parameter_AddMagic",),
- 0x80115D5C:("func_80115D5C",),
- 0x80115DB4:("func_80115DB4",),
- 0x80116088:("func_80116088",),
- 0x80116114:("func_80116114",),
- 0x80116348:("func_80116348",),
- 0x80116918:("func_80116918",),
+ 0x80115D14:("Magic_Add",),
+ 0x80115D5C:("Magic_Reset",),
+ 0x80115DB4:("Magic_Consume",),
+ 0x80116088:("Magic_UpdateAddRequest",),
+ 0x80116114:("Magic_FlashMeterBorder",),
+ 0x80116348:("Magic_Update",),
+ 0x80116918:("Magic_DrawMeter",),
0x80116FD8:("func_80116FD8",),
0x801170B8:("func_801170B8",),
0x80117100:("func_80117100",),
@@ -5621,25 +5621,25 @@
0x8089F2C4:("func_8089F2C4",),
0x8089F380:("EnViewer_Update",),
0x8089F3C8:("EnViewer_Draw",),
- 0x8089F4E0:("func_8089F4E0",),
+ 0x8089F4E0:("EnBubble_SetDimensions",),
0x8089F59C:("func_8089F59C",),
0x8089F5D0:("func_8089F5D0",),
- 0x8089F5F4:("func_8089F5F4",),
- 0x8089F660:("func_8089F660",),
+ 0x8089F5F4:("EnBubble_DamagePlayer",),
+ 0x8089F660:("EnBubble_Explosion",),
0x8089F8BC:("func_8089F8BC",),
0x8089F908:("func_8089F908",),
- 0x8089F95C:("func_8089F95C",),
- 0x8089F9E4:("func_8089F9E4",),
- 0x8089FA54:("func_8089FA54",),
+ 0x8089F95C:("EnBubble_Vec3fNormalizedReflect",),
+ 0x8089F9E4:("EnBubble_Vec3fNormalize",),
+ 0x8089FA54:("EnBubble_Fly",),
0x8089FF30:("func_8089FF30",),
- 0x8089FFCC:("func_8089FFCC",),
+ 0x8089FFCC:("EnBubble_IsPopped",),
0x808A005C:("func_808A005C",),
0x808A0170:("EnBubble_Init",),
0x808A0270:("EnBubble_Destroy",),
- 0x808A029C:("func_808A029C",),
- 0x808A0350:("func_808A0350",),
- 0x808A03A0:("func_808A03A0",),
- 0x808A03E8:("func_808A03E8",),
+ 0x808A029C:("EnBubble_Wait",),
+ 0x808A0350:("EnBubble_Pop",),
+ 0x808A03A0:("EnBubble_Disappear",),
+ 0x808A03E8:("EnBubble_Regrow",),
0x808A0458:("EnBubble_Update",),
0x808A04D4:("EnBubble_Draw",),
0x808A08F0:("DoorShutter_SetupAction",),
@@ -7955,8 +7955,8 @@
0x80968CB8:("func_80968CB8",),
0x80968DD0:("func_80968DD0",),
0x80968E38:("func_80968E38",),
- 0x80968F48:("func_80968F48",),
- 0x809691B8:("func_809691B8",),
+ 0x80968F48:("EnJs_GetRemainingMasks",),
+ 0x809691B8:("EnJs_TakeMask",),
0x809692A8:("func_809692A8",),
0x8096933C:("func_8096933C",),
0x80969400:("func_80969400",),
@@ -8057,9 +8057,9 @@
0x80972680:("OceffSpot_SetupAction",),
0x8097268C:("OceffSpot_Init",),
0x809727EC:("OceffSpot_Destroy",),
- 0x80972844:("func_80972844",),
- 0x809728F8:("func_809728F8",),
- 0x80972934:("func_80972934",),
+ 0x80972844:("OceffSpot_End",),
+ 0x809728F8:("OceffSpot_Wait",),
+ 0x80972934:("OceffSpot_GrowCylinder",),
0x80972998:("OceffSpot_Update",),
0x80972C54:("OceffSpot_Draw",),
0x80973550:("EnTorch_Init",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index eaca8ea4b..ab5318936 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -1069,11 +1069,11 @@
0x801BF890:("sMinigameScoreDigits","UNK_TYPE2","",0x2),
0x801BF898:("sCUpInvisible","UNK_TYPE2","",0x2),
0x801BF89C:("sCUpTimer","UNK_TYPE2","",0x2),
- 0x801BF8A0:("sMagicBarOutlinePrimRed","UNK_TYPE2","",0x2),
- 0x801BF8A4:("sMagicBarOutlinePrimGreen","UNK_TYPE2","",0x2),
- 0x801BF8A8:("sMagicBarOutlinePrimBlue","UNK_TYPE2","",0x2),
- 0x801BF8AC:("D_801BF8AC","UNK_TYPE2","",0x2),
- 0x801BF8B0:("D_801BF8B0","UNK_TYPE2","",0x2),
+ 0x801BF8A0:("sMagicMeterOutlinePrimRed","UNK_TYPE2","",0x2),
+ 0x801BF8A4:("sMagicMeterOutlinePrimGreen","UNK_TYPE2","",0x2),
+ 0x801BF8A8:("sMagicMeterOutlinePrimBlue","UNK_TYPE2","",0x2),
+ 0x801BF8AC:("sMagicBorderRatio","UNK_TYPE2","",0x2),
+ 0x801BF8B0:("sMagicBorderStep","UNK_TYPE2","",0x2),
0x801BF8DC:("D_801BF8DC","UNK_TYPE2","",0x2),
0x801BF8E0:("D_801BF8E0","UNK_TYPE2","",0x2),
0x801BF8E4:("D_801BF8E4","UNK_TYPE2","",0x2),
@@ -3434,7 +3434,7 @@
0x801DE868:("D_801DE868","f32","",0x4),
0x801DE86C:("jtbl_801DE86C","UNK_PTR","",0x4),
0x801DE884:("D_801DE884","f32","",0x4),
- 0x801DE890:("D_801DE890","UNK_TYPE1","",0x1),
+ 0x801DE890:("gCircleTex","UNK_TYPE1","",0x1),
0x801DF090:("D_801DF090","f32","",0x4),
0x801DF094:("D_801DF094","f32","",0x4),
0x801DF0A0:("D_801DF0A0","f32","",0x4),
diff --git a/tools/namefixer.py b/tools/namefixer.py
index e7b0a10e0..f8f714f8c 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -283,6 +283,7 @@ wordReplace = {
"Actor_IsFacingPlayerAndWithinRange": "Actor_IsFacingAndNearPlayer",
"func_800BC8B8": "Actor_DrawDoorLock",
"func_800B86C8": "Actor_ChangeFocus",
+ "func_800B90F4": "Actor_DeactivateLens",
"zelda_malloc": "ZeldaArena_Malloc",
"zelda_mallocR": "ZeldaArena_MallocR",
"zelda_realloc": "ZeldaArena_Realloc",
@@ -498,6 +499,9 @@ wordReplace = {
"func_801159c0": "Health_GiveHearts",
"func_801159EC": "Rupees_ChangeBy",
"func_80115A14": "Inventory_ChangeAmmo",
+ "Parameter_AddMagic": "Magic_Add",
+ "func_80115D5C": "Magic_Reset",
+ "func_80115DB4": "Magic_Consume",
"func_8013EC44": "Rumble_Override",
"func_8013ECE0": "Rumble_Request",
"func_8017D2FC": "Math3D_LineSegVsPlane",
@@ -648,8 +652,8 @@ wordReplace = {
"gSaveContext.naviTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.tatlTimer": "gSaveContext.save.playerData.tatlTimer",
"gSaveContext.rupees": "gSaveContext.save.playerData.rupees",
- "gSaveContext.magicAcquired": "gSaveContext.save.playerData.magicAcquired",
- "gSaveContext.doubleMagic": "gSaveContext.save.playerData.doubleMagic",
+ "gSaveContext.magicAcquired": "gSaveContext.save.playerData.isMagicAcquired",
+ "gSaveContext.doubleMagic": "gSaveContext.save.playerData.isDoubleMagicAcquired",
"gSaveContext.doubleDefense": "gSaveContext.save.playerData.doubleDefense",
"gSaveContext.playerName": "gSaveContext.save.playerData.playerName",
"gSaveContext.inventory": "gSaveContext.save.inventory",
@@ -671,6 +675,11 @@ wordReplace = {
"gSaveContext.unk_1016": "gSaveContext.jinxTimer",
"gSaveContext.unk_3F58": "gSaveContext.sunsSongState",
"gSaveContext.unk_48C8": "gSaveContext.dungeonIndex",
+ "gSaveContext.save.playerData.magicAcquired": "gSaveContext.save.playerData.isMagicAcquired",
+ "gSaveContext.save.playerDatadoubleMagic": "gSaveContext.save.playerData.isDoubleMagicAcquired",
+ "gSaveContext.unk_3F28": "gSaveContext.magicState",
+ "gSaveContext.unk_3F30": "gSaveContext.magicFillTarget",
+ "gSaveContext.unk_3F2C": "gSaveContext.magicFlag",
"gSaveContext.save.entranceIndex": "gSaveContext.save.entrance",
"player->unk_A87": "player->exchangeItemId",
@@ -704,6 +713,9 @@ wordReplace = {
"play->msgCtx.unk12023": "play->msgCtx.stateTimer",
"play->msgCtx.unk1202A": "play->msgCtx.ocarinaMode",
"play->msgCtx.unk1202C": "play->msgCtx.ocarinaAction",
+ "play->msgCtx.unk11F04": "play->msgCtx.currentTextId",
+ "play->actorCtx.unk3": "play->actorCtx.lensActive",
+ "play->actorCtx.unk4": "play->actorCtx.lensMaskSize",
"play->nextEntranceIndex": "play->nextEntrance",
"play->sceneLoadFlag": "play->transitionTrigger",
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 15c5a5f60..991b30fdf 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -325,7 +325,7 @@ asm/non_matchings/code/z_actor/func_800B9038.s,func_800B9038,0x800B9038,0x13
asm/non_matchings/code/z_actor/func_800B9084.s,func_800B9084,0x800B9084,0x5
asm/non_matchings/code/z_actor/func_800B9098.s,func_800B9098,0x800B9098,0x5
asm/non_matchings/code/z_actor/func_800B90AC.s,func_800B90AC,0x800B90AC,0x12
-asm/non_matchings/code/z_actor/func_800B90F4.s,func_800B90F4,0x800B90F4,0xB
+asm/non_matchings/code/z_actor/Actor_DeactivateLens.s,Actor_DeactivateLens,0x800B90F4,0xB
asm/non_matchings/code/z_actor/func_800B9120.s,func_800B9120,0x800B9120,0x14
asm/non_matchings/code/z_actor/Actor_InitContext.s,Actor_InitContext,0x800B9170,0x71
asm/non_matchings/code/z_actor/Actor_SpawnSetupActors.s,Actor_SpawnSetupActors,0x800B9334,0x56
@@ -335,8 +335,8 @@ asm/non_matchings/code/z_actor/Actor_Draw.s,Actor_Draw,0x800B9A04,0xC6
asm/non_matchings/code/z_actor/func_800B9D1C.s,func_800B9D1C,0x800B9D1C,0x48
asm/non_matchings/code/z_actor/Actor_DrawAllSetup.s,Actor_DrawAllSetup,0x800B9E3C,0x4
asm/non_matchings/code/z_actor/Actor_RecordUndrawnActor.s,Actor_RecordUndrawnActor,0x800B9E4C,0xE
-asm/non_matchings/code/z_actor/func_800B9E84.s,func_800B9E84,0x800B9E84,0x1C
-asm/non_matchings/code/z_actor/func_800B9EF4.s,func_800B9EF4,0x800B9EF4,0xF9
+asm/non_matchings/code/z_actor/Actor_DrawLensOverlay.s,Actor_DrawLensOverlay,0x800B9E84,0x1C
+asm/non_matchings/code/z_actor/Actor_DrawLensActors.s,Actor_DrawLensActors,0x800B9EF4,0xF9
asm/non_matchings/code/z_actor/func_800BA2D8.s,func_800BA2D8,0x800BA2D8,0x9
asm/non_matchings/code/z_actor/func_800BA2FC.s,func_800BA2FC,0x800BA2FC,0x4C
asm/non_matchings/code/z_actor/Actor_DrawAll.s,Actor_DrawAll,0x800BA42C,0xB4
@@ -1648,13 +1648,13 @@ asm/non_matchings/code/z_parameter/Health_ChangeBy.s,Health_ChangeBy,0x80115908,
asm/non_matchings/code/z_parameter/Health_GiveHearts.s,Health_GiveHearts,0x801159C0,0xB
asm/non_matchings/code/z_parameter/Rupees_ChangeBy.s,Rupees_ChangeBy,0x801159EC,0xA
asm/non_matchings/code/z_parameter/Inventory_ChangeAmmo.s,Inventory_ChangeAmmo,0x80115A14,0xC0
-asm/non_matchings/code/z_parameter/Parameter_AddMagic.s,Parameter_AddMagic,0x80115D14,0x12
-asm/non_matchings/code/z_parameter/func_80115D5C.s,func_80115D5C,0x80115D5C,0x16
-asm/non_matchings/code/z_parameter/func_80115DB4.s,func_80115DB4,0x80115DB4,0xB5
-asm/non_matchings/code/z_parameter/func_80116088.s,func_80116088,0x80116088,0x23
-asm/non_matchings/code/z_parameter/func_80116114.s,func_80116114,0x80116114,0x8D
-asm/non_matchings/code/z_parameter/func_80116348.s,func_80116348,0x80116348,0x174
-asm/non_matchings/code/z_parameter/func_80116918.s,func_80116918,0x80116918,0x1B0
+asm/non_matchings/code/z_parameter/Magic_Add.s,Magic_Add,0x80115D14,0x12
+asm/non_matchings/code/z_parameter/Magic_Reset.s,Magic_Reset,0x80115D5C,0x16
+asm/non_matchings/code/z_parameter/Magic_Consume.s,Magic_Consume,0x80115DB4,0xB5
+asm/non_matchings/code/z_parameter/Magic_UpdateAddRequest.s,Magic_UpdateAddRequest,0x80116088,0x23
+asm/non_matchings/code/z_parameter/Magic_FlashMeterBorder.s,Magic_FlashMeterBorder,0x80116114,0x8D
+asm/non_matchings/code/z_parameter/Magic_Update.s,Magic_Update,0x80116348,0x174
+asm/non_matchings/code/z_parameter/Magic_DrawMeter.s,Magic_DrawMeter,0x80116918,0x1B0
asm/non_matchings/code/z_parameter/func_80116FD8.s,func_80116FD8,0x80116FD8,0x38
asm/non_matchings/code/z_parameter/func_801170B8.s,func_801170B8,0x801170B8,0x12
asm/non_matchings/code/z_parameter/func_80117100.s,func_80117100,0x80117100,0x248
diff --git a/undefined_syms.txt b/undefined_syms.txt
index faf0aba38..20a4cf5e2 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -1450,12 +1450,6 @@ D_06001100 = 0x06001100;
D_06001140 = 0x06001140;
D_06001CB0 = 0x06001CB0;
-// ovl_Obj_Usiyane
-
-D_06000098 = 0x06000098;
-D_06000838 = 0x06000838;
-D_060022AC = 0x060022AC;
-
// ovl_player_actor
D_06008860 = 0x06008860;