diff --git a/Makefile b/Makefile
index 3a488dc84..89eeb21d2 100644
--- a/Makefile
+++ b/Makefile
@@ -90,7 +90,7 @@ OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy
OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump
ASM_PROC := python3 tools/asm-processor/build.py
-ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp
+ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename
IINC := -Iinclude -Isrc -Iassets -Ibuild -I.
@@ -102,7 +102,7 @@ endif
# Check code syntax with host compiler
ifneq ($(RUN_CC_CHECK),0)
- CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label
+ CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare
CC_CHECK := gcc -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -D _LANGUAGE_C -D NON_MATCHING $(IINC) -nostdinc $(CHECK_WARNINGS)
ifneq ($(WERROR), 0)
CC_CHECK += -Werror
@@ -122,8 +122,8 @@ OPTFLAGS := -O2 -g3
ASFLAGS := -march=vr4300 -32 -Iinclude
MIPS_VERSION := -mips2
-# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Surpress the warnings with -woff.
-CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 624,649,838,712,516
+# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Suppress the warnings with -woff.
+CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 649,838,712,516
# Use relocations and abi fpr names in the dump
OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32
diff --git a/assets/xml/interface/icon_item_vtx_static.xml b/assets/xml/interface/icon_item_vtx_static.xml
new file mode 100644
index 000000000..37ccb0063
--- /dev/null
+++ b/assets/xml/interface/icon_item_vtx_static.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/interface/schedule_static.xml b/assets/xml/interface/schedule_static.xml
new file mode 100644
index 000000000..68b097d51
--- /dev/null
+++ b/assets/xml/interface/schedule_static.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/misc/title_static.xml b/assets/xml/misc/title_static.xml
new file mode 100644
index 000000000..5e6cea55f
--- /dev/null
+++ b/assets/xml/misc/title_static.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index 16cbf0b85..8a78a1709 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -787,7 +787,7 @@
-
+
@@ -1145,8 +1145,8 @@
-
-
+
+
@@ -1223,7 +1223,9 @@
+
+
@@ -1477,7 +1479,7 @@
-
+
@@ -1487,7 +1489,7 @@
-
+
diff --git a/assets/xml/objects/object_and.xml b/assets/xml/objects/object_and.xml
index a076a1c07..69ffebc7b 100644
--- a/assets/xml/objects/object_and.xml
+++ b/assets/xml/objects/object_and.xml
@@ -1,79 +1,80 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_boss03.xml b/assets/xml/objects/object_boss03.xml
index da17bf406..f4def4991 100644
--- a/assets/xml/objects/object_boss03.xml
+++ b/assets/xml/objects/object_boss03.xml
@@ -46,7 +46,7 @@
-
+
diff --git a/assets/xml/objects/object_boss07.xml b/assets/xml/objects/object_boss07.xml
index b1f6cb417..ac2f9afc1 100644
--- a/assets/xml/objects/object_boss07.xml
+++ b/assets/xml/objects/object_boss07.xml
@@ -200,9 +200,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_boss_hakugin.xml b/assets/xml/objects/object_boss_hakugin.xml
index ba04a3071..7c7232ecf 100644
--- a/assets/xml/objects/object_boss_hakugin.xml
+++ b/assets/xml/objects/object_boss_hakugin.xml
@@ -101,6 +101,6 @@
-
+
diff --git a/assets/xml/objects/object_f40_obj.xml b/assets/xml/objects/object_f40_obj.xml
index 17e7210de..636a80682 100644
--- a/assets/xml/objects/object_f40_obj.xml
+++ b/assets/xml/objects/object_f40_obj.xml
@@ -1,17 +1,25 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hakugin_demo.xml b/assets/xml/objects/object_hakugin_demo.xml
index 24c7a2ba2..8c8b5837c 100644
--- a/assets/xml/objects/object_hakugin_demo.xml
+++ b/assets/xml/objects/object_hakugin_demo.xml
@@ -1,8 +1,9 @@
+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_link_child.xml b/assets/xml/objects/object_link_child.xml
index 23d3cf09c..dd045c1d8 100644
--- a/assets/xml/objects/object_link_child.xml
+++ b/assets/xml/objects/object_link_child.xml
@@ -101,7 +101,7 @@
-
+
@@ -110,17 +110,17 @@
-
-
+
+
-
+
-
-
+
+
@@ -143,12 +143,12 @@
-
-
+
+
-
+
diff --git a/assets/xml/objects/object_link_goron.xml b/assets/xml/objects/object_link_goron.xml
index 48eef4dd9..76017884e 100644
--- a/assets/xml/objects/object_link_goron.xml
+++ b/assets/xml/objects/object_link_goron.xml
@@ -90,7 +90,7 @@
-
+
diff --git a/assets/xml/objects/object_link_nuts.xml b/assets/xml/objects/object_link_nuts.xml
index a00c44db4..9247d3db4 100644
--- a/assets/xml/objects/object_link_nuts.xml
+++ b/assets/xml/objects/object_link_nuts.xml
@@ -40,10 +40,10 @@
-
+
-
+
diff --git a/assets/xml/objects/object_moonend.xml b/assets/xml/objects/object_moonend.xml
index e677f9c3f..666e9e07c 100644
--- a/assets/xml/objects/object_moonend.xml
+++ b/assets/xml/objects/object_moonend.xml
@@ -1,6 +1,7 @@
-
+
+
@@ -19,7 +20,8 @@
-
+
+
diff --git a/assets/xml/objects/object_oF1d_map.xml b/assets/xml/objects/object_oF1d_map.xml
index 0f331cbce..a241eac13 100644
--- a/assets/xml/objects/object_oF1d_map.xml
+++ b/assets/xml/objects/object_oF1d_map.xml
@@ -47,16 +47,16 @@
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_slime.xml b/assets/xml/objects/object_slime.xml
index f17633eff..c8516e45f 100644
--- a/assets/xml/objects/object_slime.xml
+++ b/assets/xml/objects/object_slime.xml
@@ -1,14 +1,17 @@
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_spot11_obj.xml b/assets/xml/objects/object_spot11_obj.xml
index c049bb337..58d146203 100644
--- a/assets/xml/objects/object_spot11_obj.xml
+++ b/assets/xml/objects/object_spot11_obj.xml
@@ -1,13 +1,13 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_taisou.xml b/assets/xml/objects/object_taisou.xml
index 696285927..0143f2444 100644
--- a/assets/xml/objects/object_taisou.xml
+++ b/assets/xml/objects/object_taisou.xml
@@ -1,12 +1,13 @@
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Arrow_fire.xml b/assets/xml/overlays/ovl_Arrow_Fire.xml
similarity index 100%
rename from assets/xml/overlays/ovl_Arrow_fire.xml
rename to assets/xml/overlays/ovl_Arrow_Fire.xml
diff --git a/assets/xml/objects/object_fbdemo_triforce.xml b/assets/xml/overlays/ovl_fbdemo_triforce.xml
similarity index 100%
rename from assets/xml/objects/object_fbdemo_triforce.xml
rename to assets/xml/overlays/ovl_fbdemo_triforce.xml
diff --git a/assets/xml/overlays/ovl_fbdemo_wipe1.xml b/assets/xml/overlays/ovl_fbdemo_wipe1.xml
new file mode 100644
index 000000000..281c8ebfb
--- /dev/null
+++ b/assets/xml/overlays/ovl_fbdemo_wipe1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_fbdemo_wipe3.xml b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
new file mode 100644
index 000000000..fe4804689
--- /dev/null
+++ b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_file_choose.xml b/assets/xml/overlays/ovl_file_choose.xml
new file mode 100644
index 000000000..cac6f3d9d
--- /dev/null
+++ b/assets/xml/overlays/ovl_file_choose.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/diff_settings.py b/diff_settings.py
old mode 100755
new mode 100644
diff --git a/docs/tutorial/advanced_control_flow.md b/docs/tutorial/advanced_control_flow.md
index 528b052f9..aa4ba3621 100644
--- a/docs/tutorial/advanced_control_flow.md
+++ b/docs/tutorial/advanced_control_flow.md
@@ -81,7 +81,7 @@ void EnMs_Destroy(Actor* thisx, PlayState* play) {
void func_80952734(EnMs* this, PlayState* play) {
s16 temp_v1 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
- if (gSaveContext.save.inventory.items[10] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[10] == ITEM_NONE) {
this->actor.textId = 0x92E;
} else {
this->actor.textId = 0x932;
@@ -136,7 +136,7 @@ void EnMs_Update(Actor* thisx, PlayState* play) {
void EnMs_Draw(Actor* thisx, PlayState* play) {
EnMs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
@@ -187,12 +187,12 @@ void func_809527F8(EnMs* this, PlayState* play) {
return;
}
Message_CloseTextbox(play);
- if ((s32) gSaveContext.save.playerData.rupees < 0xA) {
+ if ((s32) gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
}
- if ((s32) gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ if ((s32) gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
return;
@@ -274,14 +274,14 @@ block_7:
goto block_16;
block_11:
Message_CloseTextbox(play);
- if ((s32) gSaveContext.save.playerData.rupees >= 0xA) {
+ if ((s32) gSaveContext.save.saveInfo.playerData.rupees >= 0xA) {
goto block_13;
}
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
block_13:
- if ((s32) gSaveContext.save.inventory.ammo[gItemSlots[0xA]] < 0x14) {
+ if ((s32) gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] < 0x14) {
goto block_15;
}
play_sound(0x4806U);
@@ -312,7 +312,7 @@ which in many ways looks worse: you can see why the use of gotos in code is stro
The simplest sort of block label to eliminate is one that is only used once, and where the corresponding goto jumps over a simple block of code with no extra internal control flow structure. There are two obvious examples of this here, the first being
```C
- if ((s32) gSaveContext.save.playerData.rupees >= 0xA) {
+ if ((s32) gSaveContext.save.saveInfo.playerData.rupees >= 0xA) {
goto block_13;
}
play_sound(0x4806U);
@@ -324,7 +324,7 @@ block_13:
Currently, this says to jump over the code block `play_sound...` if the condition in the if is satisfied. In non-goto terms, this means that the block should be run if the condition is *not* satisfied. This also illustrates a general property of goto-only mode: you have to reverse the senses of all of the ifs. Therefore the appropriate approach is to swap the if round, put the code block inside, and remove the goto and the label:
```C
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
@@ -378,12 +378,12 @@ block_7:
block_11:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
return;
@@ -447,12 +447,12 @@ block_7:
block_11:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
return;
@@ -497,12 +497,12 @@ So let us rewrite the entire second half as a switch:
case 0:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
return;
}
- if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
return;
@@ -533,10 +533,10 @@ There's a couple of other obvious things here:
case 0:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
} else {
@@ -598,10 +598,10 @@ block_7:
case 0:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
} else {
@@ -663,10 +663,10 @@ void func_809527F8(EnMs* this, PlayState* play) {
case 0:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
} else {
@@ -715,10 +715,10 @@ void func_809527F8(EnMs* this, PlayState* play) {
case 0:
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 0xA) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0xA) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x935U);
- } else if (gSaveContext.save.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
+ } else if (gSaveContext.save.saveInfo.inventory.ammo[gItemSlots[0xA]] >= 0x14) {
play_sound(0x4806U);
Message_ContinueTextbox(play, 0x937U);
} else {
diff --git a/docs/tutorial/documenting.md b/docs/tutorial/documenting.md
index 7ecd37ccb..11d8b3546 100644
--- a/docs/tutorial/documenting.md
+++ b/docs/tutorial/documenting.md
@@ -185,7 +185,7 @@ void func_80C102D4(EnRecepgirl* this, PlayState* play) {
if (this->actor.textId == 0x2AD9) {
Flags_SetSwitch(play, this->actor.params);
Animation_MorphToPlayOnce(&this->skelAnime, &object_bg_Anim_00AD98, 10.0f);
- if ((gSaveContext.save.weekEventReg[63] & 0x80)) {
+ if ((gSaveContext.save.saveInfo.weekEventReg[63] & 0x80)) {
this->actor.textId = 0x2ADF;
} else {
this->actor.textId = 0x2ADA;
@@ -244,7 +244,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80C106B0[this->unk_2AC]);
@@ -516,7 +516,7 @@ void func_80C102D4(EnRecepgirl* this, PlayState* play) {
if (this->actor.textId == 0x2AD9) { // "Welcome..."
Flags_SetSwitch(play, this->actor.params);
Animation_MorphToPlayOnce(&this->skelAnime, &object_bg_Anim_00AD98, 10.0f);
- if (gSaveContext.save.weekEventReg[63] & 0x80) { // showed Couple's Mask to meeting
+ if (gSaveContext.save.saveInfo.weekEventReg[63] & 0x80) { // showed Couple's Mask to meeting
this->actor.textId = 0x2ADF; // Mayor's office is on the left (meeting ended)
} else {
this->actor.textId = 0x2ADA; // Mayor's office is on the left (meeting ongoing)
diff --git a/docs/tutorial/draw_functions.md b/docs/tutorial/draw_functions.md
index ccc738219..43fe8579c 100644
--- a/docs/tutorial/draw_functions.md
+++ b/docs/tutorial/draw_functions.md
@@ -29,7 +29,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
temp_a0 = play->state.gfxCtx;
sp30 = temp_a0;
- func_8012C28C(temp_a0);
+ Gfx_SetupDL25_Opa(temp_a0);
temp_v1 = sp30->polyOpa.p;
sp30->polyOpa.p = temp_v1 + 8;
temp_v1->words.w0 = 0xDB060020;
@@ -105,7 +105,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80C106B0[this->unk_2AC]);
@@ -217,7 +217,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
sp34 = (s16) (s32) (f32) thisx->shape.rot.z;
temp_a0 = play->state.gfxCtx;
temp_s0 = temp_a0;
- func_8012C28C(temp_a0);
+ Gfx_SetupDL25_Opa(temp_a0);
temp_v0 = temp_s0->polyOpa.p;
temp_s0->polyOpa.p = temp_v0 + 8;
temp_v0->words.w0 = 0xDA380003;
@@ -309,7 +309,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, D_06000680);
diff --git a/docs/tutorial/other_functions.md b/docs/tutorial/other_functions.md
index c6ac63a64..f73902ca5 100644
--- a/docs/tutorial/other_functions.md
+++ b/docs/tutorial/other_functions.md
@@ -404,7 +404,7 @@ There remains one thing we need to fix before trying to compile it, namely `*(&g
/* 0x0F5C */ u32 regionsVisited; // "area_arrival"
```
-so it's somewhere in `weekEventReg`. `0xF37 - 0xEF8 = 0x3F = 63`, and it's a byte array, so the access is actually `gSaveContext.save.weekEventReg[63] & 0x80`. Now it will compile. We also don't use `!= 0` for flag comparisons: just `if (gSaveContext.save.weekEventReg[63] & 0x80)` will do.
+so it's somewhere in `weekEventReg`. `0xF37 - 0xEF8 = 0x3F = 63`, and it's a byte array, so the access is actually `gSaveContext.save.saveInfo.weekEventReg[63] & 0x80`. Now it will compile. We also don't use `!= 0` for flag comparisons: just `if (gSaveContext.save.saveInfo.weekEventReg[63] & 0x80)` will do.
Running `./diff.py -mwo3 func_80C102D4` and scrolling down, we discover that this doesn't match!
diff --git a/include/PR/gbi.h b/include/PR/gbi.h
index 3ba8748b0..1b57c6a34 100644
--- a/include/PR/gbi.h
+++ b/include/PR/gbi.h
@@ -4699,7 +4699,7 @@ _DW({ \
/* like gSPTextureRectangle but accepts negative position arguments */
#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-{ \
+_DW({ \
Gfx *_g = (Gfx *)(pkt); \
\
_g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
@@ -4723,7 +4723,7 @@ _DW({ \
0, 16))); \
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | \
_SHIFTL((dtdy), 0, 16))); \
-}
+})
#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \
diff --git a/include/functions.h b/include/functions.h
index b8c25b33d..f72340f13 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -122,55 +122,13 @@ s8 PadUtils_GetRelYImpl(Input* input);
s8 PadUtils_GetRelX(Input* input);
s8 PadUtils_GetRelY(Input* input);
void PadUtils_UpdateRelXY(Input* input);
-void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 initValue, s32 minSpace, const char* name);
-void StackCheck_Cleanup(StackEntry* entry);
-StackStatus StackCheck_GetState(StackEntry* entry);
-u32 StackCheck_CheckAll(void);
-u32 StackCheck_Check(StackEntry* entry);
void MtxConv_F2L(Mtx* mtx, MtxF* mf);
void MtxConv_L2F(MtxF* mtx, Mtx* mf);
void __assert(const char* file, u32 lineNum);
// void func_800862B4(void);
-void* SystemArena_MallocMin1(u32 size);
-void SystemArena_FreeNullCheck(void* ptr);
-void SystemArena_RunInits(void);
-void SystemArena_Init(void* start, size_t size);
s32 func_80086620(OSMesgQueue* param_1, PadMgr* param_2, OSContStatus* param_3);
-// void func_80086760(void);
-// void func_80086794(void);
-// void func_800867B4(void);
-// void func_800867D4(void);
-// void func_800867F4(void);
-f32 func_80086814(f32 x);
-// void func_80086834(void);
-// void func_80086880(void);
-// void func_800869A4(void);
-// void func_80086AF0(void);
-f32 func_80086B30(f32 y, f32 x);
-// void func_80086C18(void);
-f32 func_80086C48(f32 x);
-// void func_80086C70(void);
-f64 func_80086C7C(f64 param_1);
-s32 func_80086C88(f32 param_1);
-s32 func_80086C98(f64 param_1);
-// void func_80086CA8(void);
-f64 func_80086CB4(f64 param_1);
-s32 func_80086CC0(f32 param_1);
-s32 func_80086CD0(f64 param_1);
-// void func_80086CE0(void);
-f64 func_80086CEC(f64 param_1);
-s32 func_80086CF8(f32 param_1);
-s32 func_80086D08(f64 param_1);
-// void func_80086D18(void);
-f64 func_80086D24(f64);
-s32 func_80086D30(f32 param_1);
-s32 func_80086D40(f64 param_1);
-// void func_80086D50(void);
-f64 func_80086D6C(f64 param_1);
-s32 func_80086D8C(f32 param_1);
-s32 func_80086DAC(f64 param_1);
u32 Rand_Next(void);
void Rand_Seed(u32 seed);
@@ -333,7 +291,7 @@ OSTime osGetTime(void);
void guRotateF(float m[4][4], f32 a, f32 x, f32 y, f32 z);
void guRotate(Mtx* m, f32 a, f32 x, f32 y, f32 z);
void __osSetGlobalIntMask(u32 mask);
-// void osVoiceInit(void);
+s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* handle, s32 channel);
s32 __osContChannelReset(OSMesgQueue* mq, s32 channel);
// void __osVoiceSetADConverter(void);
s32 osAiSetFrequency(u32 frequency);
@@ -614,8 +572,8 @@ void Flags_SetCollectible(PlayState* play, s32 flag);
void TitleCard_InitBossName(GameState* gameState, TitleCardContext* titleCtx, TexturePtr texture, s16 x, s16 y, u8 width, u8 height);
-s32 func_800B648C(PlayState* play, s32 arg1, s32 timer, f32 arg3, Vec3f* arg4);
-f32 func_800B64FC(PlayState* play, f32 arg1, Vec3f* arg2, s32* arg3);
+s32 Actor_SetPlayerImpact(PlayState* play, PlayerImpactType type, s32 timer, f32 dist, Vec3f* pos);
+f32 Actor_GetPlayerImpact(PlayState* play, f32 range, Vec3f* pos, PlayerImpactType* type);
void* func_800B6584(PlayState* play, s16 id, void* arg2, size_t size);
void* func_800B6608(PlayState* play, s16 id);
void* func_800B6680(PlayState* play, s16 id);
@@ -667,7 +625,7 @@ s32 Actor_IsFacingAndNearPlayer(Actor* actor, f32 range, s16 maxAngleDiff);
s32 Actor_ActorAIsFacingAndNearActorB(Actor* actorA, Actor* actorB, f32 range, s16 maxAngleDiff);
void Actor_GetSlopeDirection(CollisionPoly* floorPoly, Vec3f* slopeNormal, s16* downwardSlopeYaw);
-void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight, f32 wallCheckRadius, f32 ceilingCheckHeight, u32 flags);
+void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight, f32 wallCheckRadius, f32 ceilingCheckHeight, u32 updBgCheckInfoFlags);
Hilite* Hilite_DrawOpa(Vec3f* object, Vec3f* eye, Vec3f* lightDir, GraphicsContext* gfxCtx);
void func_800B8050(Actor* actor, PlayState* play, s32 flag);
void func_800B8118(Actor* actor, PlayState* play, s32 flag);
@@ -727,12 +685,13 @@ void Actor_KillAllWithMissingObject(PlayState* play, ActorContext* actorCtx);
void func_800BA798(PlayState* play, ActorContext* actorCtx);
void Actor_CleanupContext(ActorContext* actorCtx, PlayState* play);
Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 posX, f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, s32 params);
-Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s16 index, f32 x, f32 y, f32 z, s16 rotX, s16 rotY, s16 rotZ, s32 params, u32 cutscene, u32 halfDaysBits, Actor* parent);
+Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s16 index, f32 x, f32 y, f32 z, s16 rotX, s16 rotY, s16 rotZ, s32 params, u32 csId, u32 halfDaysBits, Actor* parent);
Actor* Actor_SpawnAsChild(ActorContext* actorCtx, Actor* parent, PlayState* play, s16 actorId, f32 posX, f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, s32 params);
void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx);
void Enemy_StartFinishingBlow(PlayState* play, Actor* actor);
-s16 func_800BBAC0(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3);
-s16 func_800BBB74(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBAC0(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBB74(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
+s16 func_800BBC20(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3);
void Actor_SpawnBodyParts(Actor* actor, PlayState* play, s32 partParams, Gfx** dList);
void Actor_SpawnFloorDustRing(PlayState* play, Actor* actor, Vec3f* posXZ, f32 radius, s32 countMinusOne, f32 randAccelWeight, s16 scale, s16 scaleStep, u8 useLighting);
void func_800BBFB0(PlayState* play, Vec3f* position, f32 arg2, s32 arg3, s16 arg4, s16 scaleStep, u8 arg6);
@@ -744,9 +703,9 @@ s16 Actor_TestFloorInDirection(Actor* actor, PlayState* play, f32 distance, s16
s32 Actor_IsTargeted(PlayState* play, Actor* actor);
s32 Actor_OtherIsTargeted(PlayState* play, Actor* actor);
void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play);
-void Actor_AddQuake(PlayState* play, s16 verticalMag, s16 countdown);
-void Actor_AddQuakeWithSpeed(PlayState* play, s16 verticalMag, s16 countdown, s16 speed);
-void func_800BC848(Actor* actor, PlayState* play, s16 y, s16 countdown);
+void Actor_RequestQuake(PlayState* play, s16 y, s16 duration);
+void Actor_RequestQuakeWithSpeed(PlayState* play, s16 y, s16 duration, s16 speed);
+void Actor_RequestQuakeAndRumble(Actor* actor, PlayState* play, s16 quakeY, s16 quakeDuration);
void Actor_DrawDoorLock(PlayState* play, s32 frame, s32 type);
void Actor_SetColorFilter(Actor* actor, u16 colorFlag, u16 colorIntensityMax, u16 bufFlag, u16 duration);
Hilite* func_800BCBF4(Vec3f* arg0, PlayState* play);
@@ -781,226 +740,66 @@ void* ActorOverlayTable_FaultAddrConv(void* address, void* param);
void ActorOverlayTable_Init(void);
void ActorOverlayTable_Cleanup(void);
-void SSNode_SetValue(SSNode* node, s16* polyIndex, u16 next);
-void SSList_SetNull(SSList* ssList);
-void SSNodeList_SetSSListHead(SSNodeList* list, SSList* ssList, s16* polyIndex);
-void DynaSSNodeList_SetSSListHead(DynaSSNodeList* list, SSList* ssList, s16* polyIndex);
-void DynaSSNodeList_Init(PlayState* play, DynaSSNodeList* list);
-void DynaSSNodeList_Alloc(PlayState* play, DynaSSNodeList* list, u32 numNodes);
-void DynaSSNodeList_ResetCount(DynaSSNodeList* list);
-u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* list);
-void BgCheck_Vec3sToVec3f(Vec3s* src, Vec3f* dest);
-void BgCheck_Vec3fToVec3s(Vec3s* dest, Vec3f* src);
-f32 func_800BFD84(CollisionPoly *poly, f32 arg1, f32 arg2);
-s32 func_800BFDEC(CollisionPoly* polyA, CollisionPoly* polyB, u32* outVtxId0, u32* outVtxId1);
-s16 CollisionPoly_GetMinY(CollisionPoly* poly, Vec3s* vertices);
-void CollisionPoly_GetNormalF(CollisionPoly* poly, f32* nx, f32* ny, f32* nz);
-void func_800C0094(CollisionPoly* poly, f32 tx, f32 ty, f32 tz, MtxF* dest);
-f32 CollisionPoly_GetPointDistanceFromPlane(CollisionPoly* poly, Vec3f* point);
-void CollisionPoly_GetVerticesByBgId(CollisionPoly* poly, s32 bgId, CollisionContext* colCtx, Vec3f* dest);
-s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center, f32 radius);
-void StaticLookup_AddPolyToSSList(CollisionContext* colCtx, SSList* ssList, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
-void StaticLookup_AddPoly(StaticLookup* lookup, CollisionContext* colCtx, CollisionPoly* polyList, Vec3s* vtxList, s16 index);
-void BgCheck_GetSubdivisionMinBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
-void BgCheck_GetSubdivisionMaxBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
-void BgCheck_GetPolySubdivisionBounds(CollisionContext* colCtx, Vec3s* vtxList, CollisionPoly* polyList, s32* subdivMinX, s32* subdivMinY, s32* subdivMinZ, s32* subdivMaxX, s32* subdivMaxY, s32* subdivMaxZ, s16 polyId);
-s32 BgCheck_PolyIntersectsSubdivision(Vec3f* min, Vec3f* max, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
-u32 BgCheck_InitStaticLookup(CollisionContext* colCtx, PlayState* play, StaticLookup* lookupTbl);
-s32 BgCheck_IsSmallMemScene(PlayState* play);
-s32 BgCheck_TryGetCustomMemsize(s32 sceneId, u32* memSize);
-void BgCheck_SetSubdivisionDimension(f32 min, s32 subdivAmount, f32* max, f32* subdivLength, f32* subdivLengthInv);
-s32 BgCheck_GetSpecialSceneMaxObjects(PlayState* play, s32* maxNodes, s32* maxPolygons, s32* maxVertices);
-void BgCheck_Allocate(CollisionContext* colCtx, PlayState* play, CollisionHeader* colHeader);
-void BgCheck_SetContextFlags(CollisionContext* colCtx, u32 flags);
-void BgCheck_UnsetContextFlags(CollisionContext* colCtx, u32 flags);
-CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId);
-f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* pos, Actor* actor, u32 arg7, f32 checkDist, s32 arg9);
-f32 BgCheck_CameraRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor2_1(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor3(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor5(CollisionContext* colCtx, CollisionPoly** outPoly, s32* outBgId, Actor* actor, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor5_2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor5_3(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor6(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos, f32 checkDist);
-f32 BgCheck_EntityRaycastFloor7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
-f32 BgCheck_AnyRaycastFloor1(CollisionContext* colCtx, CollisionPoly* outPoly, Vec3f* pos);
-f32 BgCheck_AnyRaycastFloor2(CollisionContext* colCtx, CollisionPoly* outPoly, s32* bgId, Vec3f* pos);
-f32 BgCheck_CameraRaycastFloor2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor8(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
-f32 BgCheck_EntityRaycastFloor9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
-s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight, u8 argA);
-s32 BgCheck_EntitySphVsWall1(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, f32 checkHeight);
-s32 BgCheck_EntitySphVsWall2(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, f32 checkHeight);
-s32 BgCheck_EntitySphVsWall3(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
-s32 BgCheck_EntitySphVsWall4(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
-s32 BgCheck_CheckCeilingImpl(CollisionContext* colCtx, u16 xpFlags, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
-s32 BgCheck_AnyCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight);
-s32 BgCheck_EntityCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
-s32 BgCheck_CameraLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
-s32 BgCheck_CameraLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
-s32 BgCheck_EntityLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
-s32 BgCheck_EntityLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor);
-s32 BgCheck_EntityLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor, f32 checkDist);
-s32 BgCheck_ProjectileLineTest(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
-s32 BgCheck_AnyLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkOneFace);
-s32 BgCheck_AnyLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace);
-s32 BgCheck_AnyLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
-s32 BgCheck_SphVsFirstPolyImpl(CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* center, f32 radius, Actor* actor, u16 bciFlags);
-s32 BgCheck_SphVsFirstPoly(CollisionContext* colCtx, Vec3f* center, f32 radius);
-s32 BgCheck_SphVsFirstWall(CollisionContext* colCtx, Vec3f* center, f32 radius);
-void SSNodeList_Init(SSNodeList* this);
-void SSNodeList_Alloc(PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys);
-SSNode* SSNodeList_GetNextNode(SSNodeList* this);
-u16 SSNodeList_GetNextNodeIdx(SSNodeList* this);
-void ScaleRotPos_Init(ScaleRotPos* srp);
-void ScaleRotPos_SetValue(ScaleRotPos* srp, Vec3f* scale, Vec3s* rot, Vec3f* pos);
-s32 ScaleRotPos_IsEqual(ScaleRotPos* a, ScaleRotPos* b);
-void DynaLookup_ResetLists(DynaLookup* dynaLookup);
-void DynaLookup_Reset(DynaLookup* dynaLookup);
-void DynaLookup_ResetVtxStartIndex(u16* vtxStartIndex);
-void DynaLookup_ResetWaterBoxStartIndex(u16* waterBoxStartIndex);
-void BgActor_Init(PlayState* play, BgActor* bgActor);
-void BgActor_SetActor(BgActor* bgActor, Actor* actor, CollisionHeader* colHeader);
-s32 BgActor_IsTransformUnchanged(BgActor* bgActor);
-void DynaPoly_NullPolyList(CollisionPoly** polyList);
-void DynaPoly_AllocPolyList(PlayState* play, CollisionPoly** polyList, s32 numPolys);
-void DynaPoly_NullVtxList(Vec3s** vtxList);
-void DynaPoly_AllocVtxList(PlayState* play, Vec3s** vtxList, s32 numVtx);
-void DynaPoly_InitWaterBoxList(DynaWaterBoxList* waterBoxList);
-void DynaPoly_AllocWaterBoxList(PlayState* play, DynaWaterBoxList* waterBoxList, s32 numWaterBoxes);
-void DynaPoly_SetBgActorPrevTransform(PlayState* play, BgActor* bgActor);
-s32 DynaPoly_IsBgIdBgActor(s32 bgId);
-void DynaPoly_Init(PlayState* play, DynaCollisionContext* dyna);
-void DynaPoly_Alloc(PlayState* play, DynaCollisionContext* dyna);
-s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* actor, CollisionHeader* colHeader);
-DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId);
-void func_800C62BC(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C6314(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C636C(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C63C4(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C641C(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C6474(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void func_800C6554(PlayState* play, DynaCollisionContext* dyna);
-void DynaPoly_DeleteBgActor(PlayState* play, DynaCollisionContext* dyna, s32 bgId);
-void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPos, Vec3s* minPosOut, s16* xLength, s16* zLength);
-void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex, s32* waterBoxStartIndex);
-void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna, Actor* actor);
-void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna);
-void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertices, s32* numWaterBoxes);
-void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyna);
-void CollisionHeader_SegmentedToVirtual(CollisionHeader* colHeader);
-void CollisionHeader_GetVirtual(CollisionHeader* colHeader, CollisionHeader** dest);
-void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, PlayState* play);
-
-u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
-u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
-u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId);
-Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-
-u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C99D4(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C99FC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C9A24(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9A4C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9A7C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9AB0(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9AE4(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C9B18(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C9B40(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C9B68(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_IsHorseBlocked(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 func_800C9BB8(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u16 SurfaceType_GetSfx(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9C24(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 arg3);
-u32 SurfaceType_GetSlope(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_GetLightSettingIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_GetEcho(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_IsHookshotSurface(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 SurfaceType_IsIgnoredByEntities(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 SurfaceType_IsIgnoredByProjectiles(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 SurfaceType_IsFloorConveyor(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 func_800C9DDC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_GetConveyorDirection(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-u32 SurfaceType_IsWallDamage(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
-s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
-s32 WaterBox_GetSurface1(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
-s32 WaterBox_GetSurface1_2(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
-s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceCheckDist, WaterBox** outWaterBox, s32* bgId);
-f32 func_800CA568(CollisionContext* colCtx, s32 waterBoxId, s32 bgId);
-u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId);
-void WaterBox_GetSceneBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
-u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox);
-s32 func_800CA6F0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
-s32 func_800CA9D0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
-s32 func_800CAA14(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint);
-void BgCheck2_UpdateActorPosition(CollisionContext* colCtx, s32 bgId, Actor* actor);
-void BgCheck2_UpdateActorYRotation(CollisionContext* colCtx, s32 bgId, Actor* actor);
-void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 bgId);
-u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 bgId, Actor* actor);
-void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags);
+void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor);
+void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor);
+void DynaPolyActor_AttachCarriedActor(CollisionContext* colCtx, Actor* carriedActor, s32 bgId);
+u32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor);
+void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags);
void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, CollisionHeader* meshHeader);
-void DynaPolyActor_ResetState(DynaPolyActor* dynaActor);
-void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor);
-void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor);
-void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 bgId);
-void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor);
-void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 bgId);
-void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor);
-void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor);
-s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor);
-s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor);
-s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor);
-s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor);
-s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor);
+void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor);
+void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor);
+void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor);
+void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 bgId);
+void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor);
+void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 bgId);
+void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor);
+void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor);
+s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor);
+s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor);
+s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor);
+s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor);
+s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor);
s32 DynaPolyActor_ValidateMove(PlayState* play, DynaPolyActor* dynaActor, s16 startRadius, s16 endRadius, s16 startHeight);
-Camera* Camera_Alloc(View* view, CollisionContext* bg, PlayState* play);
-void Camera_Free(Camera* camera);
-void Camera_Init(Camera* camera, View* view, CollisionContext* bg, PlayState* play);
-// void func_800DDFE0(void);
-void Camera_InitPlayerSettings(Camera* camera, Player* player);
+Camera* Camera_Create(View* view, CollisionContext* colCtx, PlayState* play);
+void Camera_Destroy(Camera* camera);
+void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState* play);
+void func_800DDFE0(Camera* camera);
+void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor);
s32 Camera_ChangeStatus(Camera* camera, s16 status);
-// void func_800DE324(void);
-// void func_800DE62C(void);
-// void func_800DE840(void);
-// void func_800DE890(void);
-// UNK_TYPE4 func_800DE954(Camera* camera);
-Vec3s* Camera_Update(Vec3s* param_1, Camera* camera);
-// void func_800DF498(void);
-u32 Camera_SetMode(Camera* camera, s16 mode, s8 param_3);
+s32 Camera_UpdateWater(Camera* camera);
+void Camera_EarthquakeDay3(Camera* camera);
+s32 Camera_UpdateHotRoom(Camera* camera);
+s32 Camera_SetSwordDistortion(Camera* camera);
+s32 Camera_RequestGiantsMaskSetting(Camera* camera);
+Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera);
+s32 func_800DF498(Camera* camera);
+s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 forceChange);
s32 Camera_ChangeMode(Camera* camera, s16 mode);
-s32 func_800DF86C(Camera* camera, s16 arg1);
-// void func_800DF8EC(void);
+s32 Camera_CheckValidMode(Camera* camera, s16 mode);
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags);
s32 Camera_ChangeSetting(Camera* camera, s16 setting);
-s32 Camera_ChangeDataIdx(Camera* camera, s32 camDataIdx);
-// void func_800DFC1C(void);
-// void func_800DFC40(void);
-s32 Camera_GetInputDirYaw(Camera* camera);
-void Camera_GetCamDir(Vec3s* dst, Camera* camera);
+s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex);
+Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera);
+s16 Camera_GetInputDirPitch(Camera* camera);
+s16 Camera_GetInputDirYaw(Camera* camera);
+Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera);
s16 Camera_GetCamDirPitch(Camera* camera);
s16 Camera_GetCamDirYaw(Camera* camera);
-void Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown);
+s32 Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown);
s32 Camera_SetViewParam(Camera* camera, s32 viewFlag, void* param);
-// UNK_TYPE4 func_800DFEF0(s32 param_1, u16 param_2);
-void func_800DFF18(Camera* camera, s32 arg1);
-// UNK_TYPE4 func_800DFF34(s32 param_1);
-// UNK_TYPE4 func_800DFF44(void);
-s16 Camera_SetFlags(Camera* iParm1, s16 flags);
-s16 Camera_ClearFlags(Camera* camera, s16 flags);
+s32 Camera_UnsetViewFlag(Camera* camera, s16 viewFlag);
+s32 Camera_OverwriteStateFlags(Camera* camera, s16 stateFlags);
+s16 Camera_SetStateFlag(Camera* camera, s16 flags);
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags);
s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2, s16 timer3);
-s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera);
-// UNK_TYPE4 func_800E01AC(void);
-Vec3f* Camera_GetQuakeOffset(Vec3f* dst, Camera* camera);
-// void func_800E01DC(s32 param_1, u32 param_2, UNK_TYPE4 param_3, UNK_TYPE4 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6);
-// UNK_TYPE4 func_800E0228(void);
-void func_800E0238(Camera* camera);
-void Camera_SetToTrackActor(Camera* camera, Actor* actor);
+s32 Camera_Copy(Camera* dstCam, Camera* srcCam);
+s32 Camera_IsDbgCamEnabled(void);
+Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera);
+void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3);
+s32 Camera_GetNegOne(void);
+s16 func_800E0238(Camera* camera);
+void Camera_SetFocalActor(Camera* camera, Actor* actor);
void Camera_SetTargetActor(Camera* camera, Actor* actor);
f32 Camera_GetWaterYPos(Camera* camera);
void func_800E0348(Camera* camera);
@@ -1227,23 +1026,6 @@ s32 Actor_TrackPlayerSetFocusHeight(PlayState* play, Actor* actor, Vec3s* headRo
s32 Actor_TrackPlayer(PlayState* play, Actor* actor, Vec3s* headRot, Vec3s* torsoRot, Vec3f focusPos);
void SaveContext_Init(void);
-void Cutscene_Init(PlayState* play, CutsceneContext* csCtx);
-void Cutscene_Start(PlayState* play, CutsceneContext* csCtx);
-void Cutscene_End(PlayState* play, CutsceneContext* csCtx);
-void Cutscene_Update1(PlayState* play, CutsceneContext* csCtx);
-void Cutscene_Update2(PlayState* play, CutsceneContext* csCtx);
-void func_800EDBE0(PlayState* play);
-void func_800EDDB0(PlayState* play);
-void Cutscene_LoadCutsceneData(PlayState* play, u8 csIndex);
-void Cutscene_ActorTranslate(Actor* actor, PlayState* play, s32 actorActionIndex);
-void Cutscene_ActorTranslateAndYaw(Actor* actor, PlayState* play, s32 actorActionIndex);
-void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, PlayState* play, s32 actorActionIndex);
-void Cutscene_ActorTranslateXZAndYawSmooth(Actor* actor, PlayState* play, s32 actorActionIndex);
-s32 Cutscene_GetSceneLayer(PlayState* play);
-s32 Cutscene_GetActorActionIndex(PlayState* play, u16 actorActionCmd);
-s32 Cutscene_CheckActorAction(PlayState* play, u16 actorActionCmd);
-u8 Cutscene_IsPlaying(PlayState* play);
-
void GetItem_Draw(PlayState* play, s16 drawId);
void SoundSource_InitAll(PlayState* play);
@@ -1253,46 +1035,6 @@ void SoundSource_PlaySfxEachFrameAtFixedWorldPos(PlayState* play, Vec3f* worldPo
u16 QuestHint_GetTatlTextId(PlayState* play);
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet);
-void EnvFlags_UnsetAll(PlayState* play);
-void EnvFlags_Set(PlayState* play, s16 flag);
-void EnvFlags_Unset(PlayState* play, s16 flag);
-s32 EnvFlags_Get(PlayState* play, s16 flag);
-s16 func_800F1460(s16 param_1);
-ActorCutscene* ActorCutscene_GetCutsceneImpl(s16 index);
-void ActorCutscene_Init(PlayState* play, ActorCutscene* cutscenes, s32 num);
-void func_800F15D8(Camera* camera);
-void ActorCutscene_ClearWaiting(void);
-// void ActorCutscene_ClearNextCutscenes(void);
-// void ActorCutscene_MarkNextCutscenes(void);
-// void ActorCutscene_End(void);
-s16 ActorCutscene_Update(void);
-void ActorCutscene_SetIntentToPlay(s16 index);
-s16 ActorCutscene_GetCanPlayNext(s16 index);
-s16 ActorCutscene_StartAndSetUnkLinkFields(s16 index, Actor* actor);
-s16 ActorCutscene_StartAndSetFlag(s16 index, Actor* actor);
-s16 ActorCutscene_Start(s16 index, Actor* actor);
-s16 ActorCutscene_Stop(s16 index);
-s16 ActorCutscene_GetCurrentIndex(void);
-ActorCutscene* ActorCutscene_GetCutscene(s16 index);
-s16 ActorCutscene_GetAdditionalCutscene(s16 index);
-s16 ActorCutscene_GetLength(s16 index);
-s32 func_800F2138(s32 arg0);
-s32 func_800F2178(s16 arg0);
-s16 ActorCutscene_GetCurrentSubCamId(s16 index);
-s16 func_800F21CC(void);
-s32 func_800F22C4(s16 param_1, Actor* actor);
-void ActorCutscene_SetReturnCamera(s16 index);
-
-s32 func_800F3940(PlayState* play);
-// void func_800F39B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
-// void func_800F3A64(void);
-void func_800F3B2C(PlayState* play);
-// void func_800F3B68(void);
-// void func_800F3C44(void);
-// void func_800F3ED4(void);
-void func_800F40A0(GameState* gameState, Player* player);
-void func_800F415C(Actor* actor, Vec3f* arg1, s16 arg2);
-UNK_TYPE func_800F41E4(PlayState* play, ActorContext* actorCtx);
void func_800F4A10(PlayState* play);
void KaleidoSetup_Update(PlayState* play);
@@ -1304,7 +1046,7 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset);
void Font_LoadMessageBoxEndIcon(Font* font, u16 icon);
void Font_LoadOrderedFont(Font* font);
// void func_800F5090(void);
-// void func_800F50D4(void);
+s32 Environment_ZBufValToFixedPoint(s32 zBufferVal);
void Environment_Init(PlayState* play, EnvironmentContext* envCtx, s32 arg2);
u32 func_800F5954(u8* param_1, u32 param_2, u32 param_3, u8 param_4, u8 param_5);
f32 Environment_LerpWeight(u16 max, u16 min, u16 val);
@@ -1386,70 +1128,17 @@ void func_800FEA50(PlayState* play);
void func_800FEAB0(void);
// void func_800FEAC0(void);
void func_800FEAF4(EnvironmentContext* envCtx);
+
void* Lib_MemCpy(void* dest, void* src, size_t size);
void* Lib_MemSet(void* buffer, s32 value, size_t size);
-f32 Math_CosS(s16 angle);
-f32 Math_SinS(s16 angle);
-s32 Math_StepToIImpl(s32 start, s32 target, s32 step);
-void Math_StepToIGet(s32* pValue, s32 target, s32 step);
-s32 Math_StepToI(s32* pValue, s32 target, s32 step);
-s32 Math_ScaledStepToS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToC(s8* pValue, s8 target, s8 step);
-s32 Math_StepToF(f32* pValue, f32 target, f32 step);
-s32 Math_StepUntilAngleS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToAngleS(s16* pValue, s16 target, s16 step);
-s32 Math_AsymStepToS(s16* pValue, s16 target, s16 incrStep, s16 decrStep);
-s32 Math_StepUntilF(f32* pValue, f32 limit, f32 step);
-s32 Math_AsymStepToF(f32* pValue, f32 target, f32 incrStep, f32 decrStep);
void func_800FF3A0(f32* distOut, s16* angleOut, Input* input);
-s16 Rand_S16Offset(s16 base, s16 range);
-s16 Rand_S16OffsetStride(s16 base, s16 stride, s16 range);
-void Math_Vec3f_Copy(Vec3f* dest, Vec3f* src);
-void Math_Vec3s_Copy(Vec3s* dest, Vec3s* src);
-void Math_Vec3s_ToVec3f(Vec3f* dest, Vec3s* src);
-void Math_Vec3f_ToVec3s(Vec3s* dest, Vec3f* src);
-void Math_Vec3f_Sum(Vec3f* l, Vec3f* r, Vec3f* dest);
-void Math_Vec3f_Diff(Vec3f* l, Vec3f* r, Vec3f* dest);
-void Math_Vec3s_DiffToVec3f(Vec3f* dest, Vec3s* l, Vec3s* r);
-void Math_Vec3f_Scale(Vec3f* vec, f32 scale);
-void Math_Vec3f_ScaleAndStore(Vec3f* vec, f32 scale, Vec3f* dest);
-void Math_Vec3f_Lerp(Vec3f* a, Vec3f* b, f32 t, Vec3f* dest);
-void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
-void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest);
-void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
-f32 Math_Vec3f_DistXYZ(Vec3f* a, Vec3f* b);
-f32 Math_Vec3f_DistXYZAndStoreDiff(Vec3f* a, Vec3f* b, Vec3f* dest);
-f32 Math_Vec3f_DistXZ(Vec3f* a, Vec3f* b);
-f32 Math_Vec3f_DistXZAndStore(Vec3f* a, Vec3f* b, f32* dx, f32* dz);
-f32 Math_Vec3f_StepToXZ(Vec3f* start, Vec3f* target, f32 speed);
-f32 Math_Vec3f_DiffY(Vec3f* a, Vec3f* b);
-s16 Math_Vec3f_Yaw(Vec3f* a, Vec3f* b);
-s16 Math_Vec3f_Pitch(Vec3f* a, Vec3f* b);
void Actor_ProcessInitChain(Actor* actor, InitChainEntry* ichain);
-// void IChain_Apply_u8(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s8(u8* actor, InitChainEntry* init);
-// void IChain_Apply_u16(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s16(u8* actor, InitChainEntry* init);
-// void IChain_Apply_u32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_f32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_f32div1000(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3f(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3fdiv1000(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3s(u8* actor, InitChainEntry* init);
-f32 Math_SmoothStepToF(f32* pValue, f32 target, f32 fraction, f32 step, f32 minStep);
-void Math_ApproachF(f32* pValue, f32 target, f32 scale, f32 maxStep);
-void Math_ApproachZeroF(f32* pValue, f32 scale, f32 maxStep);
-s16 Math_SmoothStepToS(s16* pValue, s16 target, s16 scale, s16 step, s16 minStep);
-void Math_ApproachS(s16* pValue, s16 target, s16 scale, s16 maxStep);
void Color_RGBA8_Copy(Color_RGBA8* dst, Color_RGBA8* src);
void func_801000A4(u16 sfxId);
void func_801000CC(u16 sfxId);
void Lib_PlaySfxAtPos(Vec3f* pos, u16 sfxId);
void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 rotAngle, Vec3f* src, Vec3f* dst);
void Lib_LerpRGB(Color_RGB8* a, Color_RGB8* b, f32 t, Color_RGB8* dst);
-f32 Math_Vec3f_StepTo(Vec3f* start, Vec3f* target, f32 speed);
void Lib_Nop801004FC(void);
void* Lib_SegmentedToVirtual(void* ptr);
void* Lib_SegmentedToVirtualNull(void* ptr);
@@ -1552,7 +1241,7 @@ void* func_801068FC(PlayState* play, void* arg1, size_t size);
void func_80108AF8(PlayState* play);
s32 func_801090B0(s32 arg0);
s32 func_80109124(s16 arg0);
-// void func_801091F0(void);
+void func_801091F0(PlayState* play);
void func_80109428(PlayState* play);
// void func_801094A0(void);
// void func_801094C8(void);
@@ -1671,17 +1360,17 @@ f32 OLib_ClampMinDist(f32 val, f32 min);
f32 OLib_ClampMaxDist(f32 val, f32 max);
Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph);
-Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph);
+Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo);
VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec);
-VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec);
+VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec);
VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b);
-VecSph* OLib_Vec3fDiffToVecSphGeo(VecSph* dest, Vec3f* a, Vec3f* b);
-Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph);
+VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b);
+Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo);
Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3f* OLib_Vec3fDiffDegF(Vec3f* dest, Vec3f* a, Vec3f* b);
Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b);
-void OLib_DbCameraVec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
-void OLib_DbCameraVec3fSum(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
+void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
+void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
Gfx* Gfx_DrawTexRectRGBA16(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy);
Gfx* Gfx_DrawTexRectIA8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy);
@@ -1728,7 +1417,7 @@ void Interface_Update(PlayState* play);
void Interface_Destroy(PlayState* play);
void Interface_Init(PlayState* play);
-Path* Path_GetByIndex(PlayState* play, s16 index, s16 max);
+Path* Path_GetByIndex(PlayState* play, s16 index, s16 indexNone);
f32 Path_OrientAndGetDistSq(Actor* actor, Path* path, s16 waypoint, s16* yaw);
void Path_CopyLastPoint(Path* path, Vec3f* dest);
@@ -1779,115 +1468,34 @@ s32 Player_HasMirrorShieldEquipped(PlayState* play);
s32 Player_IsHoldingMirrorShield(PlayState* play);
s32 Player_IsHoldingHookshot(Player* player);
s32 func_801240DC(Player* player);
-s32 func_80124110(Player* player, PlayerItemAction itemAction);
-s32 func_80124148(Player* player);
-s32 Player_ActionToMeleeWeapon(PlayerItemAction itemAction);
-s32 Player_GetMeleeWeaponHeld(Player* player);
+PlayerBButtonSword Player_BButtonSwordFromIA(Player* player, PlayerItemAction itemAction);
+PlayerBButtonSword Player_GetHeldBButtonSword(Player* player);
+PlayerMeleeWeapon Player_MeleeWeaponFromIA(PlayerItemAction itemAction);
+PlayerMeleeWeapon Player_GetMeleeWeaponHeld(Player* player);
s32 Player_IsHoldingTwoHandedWeapon(Player* player);
-s32 Player_ActionToBottle(Player* player, PlayerItemAction itemAction);
-s32 Player_GetBottleHeld(Player* Player);
-s32 Player_ActionToExplosive(Player* player, PlayerItemAction itemAction);
-s32 Player_GetExplosiveHeld(Player* player);
-s32 Player_ActionToSword(Actor* actor, PlayerItemAction itemAction);
+PlayerBottle Player_BottleFromIA(Player* player, PlayerItemAction itemAction);
+PlayerBottle Player_GetBottleHeld(Player* Player);
+PlayerExplosive Player_ExplosiveFromIA(Player* player, PlayerItemAction itemAction);
+PlayerExplosive Player_GetExplosiveHeld(Player* player);
+PlayerSword Player_SwordFromIA(Player* player, PlayerItemAction itemAction);
s32 func_801242B4(Player* player);
s32 Player_GetEnvironmentalHazard(PlayState* play);
-void func_80124420(Player* player);
+void Player_UpdateBunnyEars(Player* player);
void func_80124618(struct_80124618 arg0[], f32 curFrame, Vec3f* arg2);
void Player_DrawImpl(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, s32 lod, PlayerTransformation playerForm, s32 boots, s32 face, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, Actor* actor);
void func_80125318(Vec3f* arg0, Vec3s* arg1);
void Player_DrawZoraShield(PlayState* play, Player* player);
void func_80125500(PlayState* play, Player* player, s32 limbIndex, Vec3f* pos, Vec3s* rot);
-s32 func_80125D4C(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor);
-s32 func_801262C8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor);
-s32 func_801263FC(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
-s32 func_80126440(PlayState* play, ColliderQuad* collider, WeaponInfo* weaponInfo, Vec3f* arg3, Vec3f* arg4);
+s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor);
+s32 Player_OverrideLimbDrawGameplayFirstPerson(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor);
+s32 Player_OverrideLimbDrawGameplayCrawling(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
+s32 func_80126440(PlayState* play, ColliderQuad* collider, WeaponInfo* weaponInfo, Vec3f* newTip, Vec3f* newBase);
void Player_DrawGetItem(PlayState* play, Player* player);
void func_80126B8C(PlayState* play, Player* player);
s32 func_80127438(PlayState* play, Player* player, s32 currentMask);
s32 func_80128640(PlayState* play, Player* player, Gfx* dlist);
-void func_80128B74(PlayState* play, Player* player, s32 limbIndex);
-void func_80128BD0(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dList2, Vec3s* rot, Actor* actor);
-
-Gfx* Gfx_SetFog(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_SetFogWithSync(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
-Gfx* Gfx_CallSetupDLImpl(Gfx* gfx, u32 i);
-Gfx* Gfx_CallSetupDL(Gfx* gfx, u32 i);
-void Gfx_CallSetupDLAtPtr(Gfx** gfxp, u32 i);
-Gfx* func_8012BFC4(Gfx* gfx);
-Gfx* func_8012BFEC(Gfx* gfx);
-Gfx* func_8012C014(Gfx* gfx);
-void func_8012C058(GraphicsContext* gfxCtx);
-void func_8012C080(GraphicsContext* gfxCtx);
-void func_8012C0A8(GraphicsContext* gfxCtx);
-void func_8012C0D0(GraphicsContext* gfxCtx);
-void func_8012C0F8(GraphicsContext* gfxCtx);
-void func_8012C120(GraphicsContext* gfxCtx);
-void func_8012C148(GraphicsContext* gfxCtx);
-void func_8012C170(GraphicsContext* gfxCtx);
-Gfx* func_8012C198(Gfx* gfx);
-void func_8012C1C0(GraphicsContext* gfxCtx);
-Gfx* func_8012C1EC(Gfx* gfx);
-void func_8012C214(GraphicsContext* gfxCtx);
-void func_8012C240(GraphicsContext* gfxCtx);
-void func_8012C268(PlayState* play);
-void func_8012C28C(GraphicsContext* gfxCtx);
-Gfx* func_8012C2B4(Gfx* gfx);
-void func_8012C2DC(GraphicsContext* gfxCtx);
-Gfx* func_8012C304(Gfx* gfx);
-void func_8012C32C(GraphicsContext* gfxCtx);
-void func_8012C354(GraphicsContext* gfxCtx);
-void func_8012C37C(GraphicsContext* gfxCtx);
-Gfx* func_8012C3A4(Gfx* gfx);
-Gfx* func_8012C3CC(Gfx* gfx);
-void func_8012C3F4(GraphicsContext* gfxCtx);
-void func_8012C420(GraphicsContext* gfxCtx);
-void func_8012C448(GraphicsContext* gfxCtx);
-void func_8012C470(GraphicsContext* gfxCtx);
-Gfx* func_8012C498(Gfx* gfx);
-void func_8012C4C0(GraphicsContext* gfxCtx);
-void func_8012C4E8(GraphicsContext* gfxCtx);
-void func_8012C510(GraphicsContext* gfxCtx);
-void func_8012C538(GraphicsContext* gfxCtx);
-void func_8012C560(GraphicsContext* gfxCtx);
-void func_8012C588(GraphicsContext* gfxCtx);
-void func_8012C5B0(GraphicsContext* gfxCtx);
-void func_8012C5D8(GraphicsContext* gfxCtx);
-Gfx* func_8012C600(Gfx* gfx);
-void func_8012C628(GraphicsContext* gfxCtx);
-void func_8012C654(GraphicsContext* gfxCtx);
-void func_8012C680(Gfx** gfxp);
-void func_8012C6AC(GraphicsContext* gfxCtx);
-void func_8012C6D4(GraphicsContext* gfxCtx);
-void func_8012C6FC(GraphicsContext* gfxCtx);
-Gfx* func_8012C724(Gfx* gfx);
-Gfx* func_8012C74C(Gfx* gfx);
-Gfx* func_8012C774(Gfx* gfx);
-Gfx* func_8012C7B8(Gfx* gfx);
-Gfx* func_8012C7FC(Gfx* gfx);
-Gfx* func_8012C840(Gfx* gfx);
-Gfx* func_8012C868(Gfx* gfx);
-void func_8012C8AC(GraphicsContext* gfxCtx);
-void func_8012C8D4(GraphicsContext* gfxCtx);
-void func_8012C8FC(GraphicsContext* gfxCtx);
-void func_8012C924(GraphicsContext* gfxCtx);
-void func_8012C94C(GraphicsContext* gfxCtx);
-void func_8012C974(GraphicsContext* gfxCtx);
-void func_8012C9BC(GraphicsContext* gfxCtx);
-void func_8012C9E4(GraphicsContext* gfxCtx);
-void func_8012CA0C(Gfx** gfxp);
-void func_8012CA38(GraphicsContext* gfxCtx);
-Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height);
-void func_8012CB04(Gfx** gfxp, u32 x, u32 y);
-Gfx* func_8012CB28(GraphicsContext* gfxCtx, u32 x, u32 y);
-Gfx* Gfx_TexScroll(GraphicsContext* gfxCtx, u32 x, u32 y, s32 width, s32 height);
-Gfx* Gfx_TwoTexScroll(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2);
-Gfx* Gfx_TwoTexScrollEnvColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2, s32 r, s32 g, s32 b, s32 a);
-Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
-Gfx* Gfx_PrimColor(GraphicsContext* gfxCtx, s32 lodfrac, s32 r, s32 g, s32 b, s32 a);
-void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g, u8 b);
-void func_8012D374(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
-void func_8012D40C(f32* param_1, f32* param_2, s16* param_3);
+void Player_SetFeetPos(PlayState* play, Player* player, s32 limbIndex);
+void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dList2, Vec3s* rot, Actor* actor);
void Room_Noop(PlayState* play, Room* room, Input* input, s32 arg3);
void Room_Init(PlayState* play, RoomContext* roomCtx);
@@ -1939,8 +1547,8 @@ void Scene_Command09(PlayState* play, SceneCmd* cmd);
void Scene_CommandSoundSettings(PlayState* play, SceneCmd* cmd);
void Scene_CommandEchoSetting(PlayState* play, SceneCmd* cmd);
void Scene_CommandAltHeaderList(PlayState* play, SceneCmd* cmd);
+void Scene_CommandCutsceneScriptList(PlayState* play, SceneCmd* cmd);
void Scene_CommandCutsceneList(PlayState* play, SceneCmd* cmd);
-void Scene_CommandActorCutsceneList(PlayState* play, SceneCmd* cmd);
void Scene_CommandMiniMap(PlayState* play, SceneCmd* cmd);
void Scene_Command1D(PlayState* play, SceneCmd* cmd);
void Scene_CommandMiniMapCompassInfo(PlayState* play, SceneCmd* cmd);
@@ -1991,96 +1599,9 @@ s32 Entrance_GetSceneId(u16 entrance);
s32 Entrance_GetSceneIdAbsolute(u16 entrance);
s32 Entrance_GetSpawnNum(u16 entrance);
s32 Entrance_GetTransitionFlags(u16 entrance);
+
s32 Schedule_RunScript(PlayState* play, u8* script, ScheduleOutput* output);
-void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod);
-void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, s32 lod);
-void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, Actor* actor, s32 lod, Mtx** mtx);
-void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, Actor* actor, s32 lod);
-void SkelAnime_DrawLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor);
-void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor);
-void SkelAnime_DrawFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor, Mtx** limbMatricies);
-void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, Actor* actor);
-void SkelAnime_DrawTransformFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, TransformLimbDrawOpa transformLimbDraw, Actor* actor, Mtx** mtx);
-void SkelAnime_DrawTransformFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, TransformLimbDrawOpa transformLimbDraw, Actor* actor);
-void SkelAnime_GetFrameData(AnimationHeader* animation, s32 frame, s32 limbCount, Vec3s* frameTable);
-s16 Animation_GetLength(void* animation);
-s16 Animation_GetLastFrame(void* animation);
-Gfx* SkelAnime_DrawLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, Gfx* gfx);
-Gfx* SkelAnime_Draw(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, Gfx* gfx);
-Gfx* SkelAnime_DrawFlexLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec3s* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, Mtx** mtx, Gfx* gfx);
-Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, Gfx* gfx);
-s16 SkelAnime_GetFrameDataLegacy(LegacyAnimationHeader* animation, s32 frame, Vec3s* frameTable);
-s16 Animation_GetLimbCount2(LegacyAnimationHeader* animation);
-s16 Animation_GetLength2(LegacyAnimationHeader* animation);
-s16 Animation_GetLastFrame2(LegacyAnimationHeader* animation);
-void SkelAnime_InterpFrameTable(s32 limbCount, Vec3s* dst, Vec3s* start, Vec3s* target, f32 weight);
-void AnimationContext_Reset(AnimationContext* animationCtx);
-void AnimationContext_SetNextQueue(PlayState* play);
-void AnimationContext_DisableQueue(PlayState* play);
-AnimationEntry* AnimationContext_AddEntry(AnimationContext* animationCtx, AnimationType type);
-void AnimationContext_SetLoadFrame(PlayState* play, LinkAnimationHeader* animation, s32 frame, s32 limbCount, Vec3s* frameTable);
-void AnimationContext_SetCopyAll(PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src);
-void AnimationContext_SetInterp(PlayState* play, s32 vecCount, Vec3s* base, Vec3s* mod, f32 weight);
-void AnimationContext_SetCopyTrue(PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src, u8* copyFlag);
-void AnimationContext_SetCopyFalse(PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src, u8* copyFlag);
-void AnimationContext_SetMoveActor(PlayState* play, Actor* actor, SkelAnime* skelAnime, f32 arg3);
-void AnimationContext_LoadFrame(PlayState* play, AnimationEntryData* data);
-void AnimationContext_CopyAll(PlayState* play, AnimationEntryData* data);
-void AnimationContext_Interp(PlayState* play, AnimationEntryData* data);
-void AnimationContext_CopyTrue(PlayState* play, AnimationEntryData* data);
-void AnimationContext_CopyFalse(PlayState* play, AnimationEntryData* data);
-void AnimationContext_MoveActor(PlayState* play, AnimationEntryData* data);
-void AnimationContext_Update(PlayState* play, AnimationContext* animationCtx);
-void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, LinkAnimationHeader* animation, s32 flags, void* jointTableBuffer, void* morphTableBuffer, s32 limbBufCount);
-void LinkAnimation_SetUpdateFunction(SkelAnime* skelAnime);
-s32 LinkAnimation_Update(PlayState* play, SkelAnime* skelAnime);
-s32 LinkAnimation_Morph(PlayState* play, SkelAnime* skelAnime);
-void LinkAnimation_AnimateFrame(PlayState* play, SkelAnime* skelAnime);
-s32 LinkAnimation_Loop(PlayState* play, SkelAnime* skelAnime);
-s32 LinkAnimation_Once(PlayState* play, SkelAnime* skelAnime);
-void Animation_SetMorph(PlayState* play, SkelAnime* skelAnime, f32 morphFrames);
-void LinkAnimation_Change(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
-void LinkAnimation_PlayOnce(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation);
-void LinkAnimation_PlayOnceSetSpeed(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed);
-void LinkAnimation_PlayLoop(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation);
-void LinkAnimation_PlayLoopSetSpeed(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed);
-void LinkAnimation_CopyJointToMorph(PlayState* play, SkelAnime* skelAnime);
-void LinkAnimation_CopyMorphToJoint(PlayState* play, SkelAnime* skelAnime);
-void LinkAnimation_LoadToMorph(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 frame);
-void LinkAnimation_LoadToJoint(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 frame);
-void LinkAnimation_InterpJointMorph(PlayState* play, SkelAnime* skelAnime, f32 weight);
-void LinkAnimation_BlendToJoint(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation1, f32 frame1, LinkAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer);
-void LinkAnimation_BlendToMorph(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation1, f32 frame1, LinkAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer);
-void LinkAnimation_EndLoop(SkelAnime* skelAnime);
-s32 Animation_OnFrameImpl(SkelAnime* skelAnime, f32 frame, f32 updateRate);
-s32 LinkAnimation_OnFrame(SkelAnime* skelAnime, f32 frame);
-void SkelAnime_Init(PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount);
-void SkelAnime_InitFlex(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount);
-void SkelAnime_InitSkin(GameState* gameState, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation);
-void SkelAnime_SetUpdate(SkelAnime* skelAnime);
-s32 SkelAnime_Update(SkelAnime* skelAnime);
-s32 SkelAnime_Morph(SkelAnime* skelAnime);
-s32 SkelAnime_MorphTaper(SkelAnime* skelAnime);
-void SkelAnime_AnimateFrame(SkelAnime* skelAnime);
-s32 SkelAnime_LoopFull(SkelAnime* skelAnime);
-s32 SkelAnime_LoopPartial(SkelAnime* skelAnime);
-s32 SkelAnime_Once(SkelAnime* skelAnime);
-void Animation_ChangeImpl(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames, s8 taper);
-void Animation_Change(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
-void Animation_PlayOnce(SkelAnime* skelAnime, AnimationHeader* animation);
-void Animation_MorphToPlayOnce(SkelAnime* skelAnime, AnimationHeader* animation, f32 morphFrames);
-void Animation_PlayOnceSetSpeed(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed);
-void Animation_PlayLoop(SkelAnime* skelAnime, AnimationHeader* animation);
-void Animation_MorphToLoop(SkelAnime* skelAnime, AnimationHeader* animation, f32 morphFrames);
-void Animation_PlayLoopSetSpeed(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed);
-void Animation_EndLoop(SkelAnime* skelAnime);
-void Animation_Reverse(SkelAnime* skelAnime);
-void SkelAnime_CopyFrameTableTrue(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* copyFlag);
-void SkelAnime_CopyFrameTableFalse(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* copyFlag);
-void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle);
-s32 Animation_OnFrame(SkelAnime* skelAnime, f32 frame);
-void SkelAnime_Free(SkelAnime* skelAnime, PlayState* play);
-void SkelAnime_CopyFrameTable(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src);
+
void SkinMatrix_Vec3fMtxFMultXYZW(MtxF* mf, Vec3f* src, Vec3f* xyzDest, f32* wDest);
void SkinMatrix_Vec3fMtxFMultXYZ(MtxF* mf, Vec3f* src, Vec3f* dest);
void SkinMatrix_MtxFMtxFMult(MtxF* mfB, MtxF* mfA, MtxF* dest);
@@ -2106,22 +1627,23 @@ void SkinMatrix_SetYRotation(MtxF* mf, s16 a);
void SkinMatrix_MulYRotation(MtxF* mf, s16 a);
void SkinMatrix_SetZRotation(MtxF* mf, s16 a);
-void func_80140260(OSViMode* vimode);
-// void func_8014026C(OSViMode* param_1, UNK_TYPE1 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6, s32 param_7, s32 param_8, UNK_TYPE4 param_9, s32 param_10, s16 param_11, u32 param_12, UNK_TYPE4 param_13);
-// void func_80140730(void);
-// void func_80140810(void);
-void func_80140898(void* arg0);
-void func_80140900(void* arg0);
-// void func_8014090C(void);
-// void func_80140970(void);
-void func_80140CE0(void* arg0);
-void func_80140D04(void* arg0);
-void func_80140D10(void* arg0, Gfx** gfx, u32 arg2);
+void ViMode_LogPrint(OSViMode* vimode);
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust);
+void ViMode_Save(ViMode* viMode);
+void ViMode_Load(ViMode* viMode);
+void ViMode_Init(ViMode* viMode);
+void ViMode_Destroy(ViMode* viMode);
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures);
+void ViMode_Update(ViMode* viMode, Input* input);
+void VisCvg_Init(struct_801F8010* this);
+void VisCvg_Destroy(struct_801F8010* this);
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp);
void func_80140E80(Struct_80140E80* arg0);
void func_80140EA0(Struct_80140E80* arg0);
// void func_80140EAC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80141008(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
-void func_8014116C(Gfx** gfxP, u16* arg1, u16* arg2, s32 width, s32 height, s32 arg5);
+void func_8014116C(Gfx** gfxP, u16* arg1, u16* workBuffer, s32 width, s32 height, s32 arg5);
// void func_801411B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
// void func_80141200(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_8014151C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
@@ -2133,9 +1655,10 @@ void VisMono_Destroy(VisMono* this);
// void VisMono_DesaturateDList(Gfx* gfx);
void VisMono_Draw(VisMono* this, Gfx** gfxp);
// void VisMono_DrawOld(VisMono* this);
-void func_801420C0(void* arg0);
-void func_801420F4(void* arg0);
-void func_80142100(void* arg0, Gfx** gfx, u32 arg2);
+
+void VisZbuf_Init(VisZbuf* this);
+void VisZbuf_Destroy(VisZbuf* this);
+void VisZbuf_Draw(VisZbuf* this, Gfx** gfxP, void* zbuffer);
// void func_80147520(void);
void func_80147564(PlayState* play);
@@ -2172,7 +1695,7 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2);
void Message_StartTextbox(PlayState* play, u16 textId, Actor* Actor);
void Message_ContinueTextbox(PlayState* play, u16 textId);
void func_80151A68(PlayState* play, u16 textId);
-void func_80151BB4(PlayState* play, u8 arg1);
+void Message_BombersNotebookQueueEvent(PlayState* play, u8 event);
// void func_80151C9C(void);
void func_80151DA4(PlayState* play, u16 arg2);
void func_80152434(PlayState* play, u16 arg2);
@@ -2206,27 +1729,6 @@ void Message_FindCreditsMessage(PlayState* play, u16 textId);
void func_8015E7EC(PlayState* play, UNK_PTR puParm2);
// void func_8015F8A8(UNK_TYPE4 ctxt);
-// void func_80161180(void);
-s32 func_8016119C(Camera* camera, DbCameraUnkStruct* arg1);
-// void func_8016122C(void);
-// void func_801612B8(void);
-s32 func_80161998(u8* cmd, DbCameraUnkStruct* arg1);
-// s32 func_80161BAC(void);
-void func_80161BE0(s16 arg0);
-void func_80161C0C(void);
-// void func_80161C20(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_80161E4C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_801620CC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_8016237C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE4 param_6);
-// void func_801623E4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_801624EC(void);
-// void func_8016253C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_801629BC(void);
-// void func_80162A50(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_80162FF8(void);
-// void func_801631DC(void);
-// void func_80163334(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
-// void func_80163660(void);
void* KaleidoManager_FaultAddrConv(void* address, void* param);
void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl);
void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl);
@@ -2319,23 +1821,10 @@ s32 FrameAdvance_IsEnabled(GameState* thisx);
s32 func_8016A02C(GameState* thisx, Actor* actor, s16* yaw);
s32 Play_IsUnderwater(PlayState* this, Vec3f* pos);
s32 Play_IsDebugCamEnabled(void);
-void Play_AssignPlayerActorCsIdsFromScene(GameState* thisx, s32 startActorCsId);
+void Play_AssignPlayerCsIdsFromScene(GameState* thisx, s32 spawnCsId);
void Play_FillScreen(GameState* thisx, s16 fillScreenOn, u8 red, u8 green, u8 blue, u8 alpha);
void Play_Init(GameState* thisx);
-// void func_8016AC10(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
-// void func_8016AE1C(void);
-// void func_8016B278(void);
-// void func_8016B4B0(void);
-// void func_8016C344(void);
-// void func_8016CD4C(void);
-// void func_8016E40C(void);
-// void func_8016EA90(void);
-void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx);
-// void func_8016F4EC(void);
-void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input);
-void BombersNotebook_Init(BombersNotebook* this);
-void BombersNotebook_Destroy(BombersNotebook* this);
void PreRender_SetValuesSave(PreRender* this, u32 width, u32 height, void* fbuf, void* zbuf, void* cvg);
void PreRender_Init(PreRender* this);
void PreRender_SetValues(PreRender* this, u32 width, u32 height, void* fbuf, void* zbuf);
@@ -2372,25 +1861,6 @@ void AudioMgr_ThreadEntry(void* arg);
void AudioMgr_Unlock(AudioMgr* audioMgr);
void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr);
-void Game_UpdateFramerateVariables(s32 divisor);
-void Game_SetFramerateDivisor(GameState* gameState, s32 divisor);
-void GameState_SetFBFilter(Gfx** gfx, u32 arg1);
-void Game_Nop80173534(GameState* gameState);
-void GameState_Draw(GameState* gameState, GraphicsContext* gfxCtx);
-void GameState_SetFrameBuffer(GraphicsContext* gfxCtx);
-void func_801736DC(GraphicsContext* gfxCtx);
-void Game_UpdateInput(GameState* gameState);
-void Game_Update(GameState* gameState);
-void Game_IncrementFrameCount(GameState* gameState);
-void GameState_InitArena(GameState* gameState, size_t size);
-void GameState_Realloc(GameState* gameState, size_t size);
-void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* gfxCtx);
-void GameState_Destroy(GameState* gameState);
-GameStateFunc GameState_GetInit(GameState* gameState);
-size_t GameState_GetSize(GameState* gameState);
-u32 GameState_IsRunning(GameState* gameState);
-s32 GameState_GetArenaSize(GameState* gameState);
-s32 func_80173B48(GameState* gameState);
void GameAlloc_Log(GameAlloc* this);
void* GameAlloc_Malloc(GameAlloc* this, size_t size);
void GameAlloc_Free(GameAlloc* this, void* data);
@@ -2416,34 +1886,6 @@ ListAlloc* ListAlloc_Init(ListAlloc* this);
// void ListAlloc_Free(void);
void ListAlloc_FreeAll(ListAlloc* this);
void Main(void* arg);
-u32 Padmgr_GetControllerBitmask(void);
-void func_80174F24(void (*arg0)(void*), void* arg1);
-void func_80174F44(void (*arg0)(void*), void* arg1);
-void func_80174F7C(void (*arg0)(s32), void* arg1);
-void func_80174F9C(void (*arg0)(s32), void* arg1);
-// OSMesgQueue* Padmgr_GetEventCallback(void);
-// void func_80175008(void);
-void Padmgr_SetEventCallback(OSMesg pvParm1);
-// void func_8017506C(void);
-// void Padmgr_Lock(void);
-// void Padmgr_Unlock(void);
-// void func_801750FC(void);
-// void func_80175364(void);
-void func_80175434(void);
-void func_8017544C(s32 port, s32 rumbleOn);
-void PadMgr_RumbleSet(u8 rumbleEnabled[MAXCONTROLLERS]);
-s32 PadMgr_ControllerHasRumblePak(s32 port);
-void Padmgr_CalcStickEdges(Input* input);
-// void Padmgr_ParseState(void);
-// void func_801759BC(void);
-// void func_80175AE0(void);
-// void Padmgr_Update(void);
-// void Padmgr_Stop(void);
-void func_80175E68(Input* input, s32 param_2);
-void Padmgr_GetInput(Input* input, s32 param_2);
-void Padmgr_GetInput2(Input* input, s32 param_2);
-void Padmgr_ThreadEntry(PadMgr* padmgr);
-void PadMgr_Init(OSMesgQueue* siEventCallbackQueue, IrqMgr* irqmgr, OSId threadId, OSPri threadPri, void* stack);
void Sched_SwapFramebuffer(CfbInfo* cfbInfo);
void Sched_RetraceUpdateFramebuffer(SchedContext* sched, CfbInfo* cfbInfo);
void Sched_HandleReset(SchedContext* sched);
@@ -2478,15 +1920,14 @@ void Mtx_SetTranslateScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, f32
void Mtx_SetRotationMtx(Mtx* mtx, s32 angle, f32 axisX, f32 axisY, f32 axisZ);
void Mtx_SetTranslationRotationScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, s32 angle, f32 axisX, f32 axisY, f32 axisZ,f32 translateX, f32 translateY, f32 translateZ);
-void func_80178750(void);
-void func_80178818(void);
-void func_80178978(void);
-// void func_801789D4(void);
-void* SysCfb_GetFbPtr(s32 index);
+void SysCfb_SetLoResMode(void);
+void SysCfb_SetHiResMode(void);
+void SysCfb_Init(void);
+void* SysCfb_GetFramebuffer(s32 index);
void* SysCfb_GetZBuffer(void);
-// UNK_TYPE4 func_80178A24(void);
-// void func_80178A34(void);
-s32 func_80178A94(s32 param_1, s32 param_2);
+void* SysCfb_GetWorkBuffer(void);
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y);
+s32 SysCfb_GetZBufferInt(s32 x, s32 y);
void CmpDma_LoadFile(uintptr_t segmentVrom, s32 id, void* dst, size_t size);
void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_WriteRGBA16Pixel(u16* buffer, u32 x, u32 y, u32 value);
@@ -2497,18 +1938,12 @@ void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_DrawRegionLockErrorMessage(void);
void Check_ExpansionPak(void);
void Check_RegionIsSupported(void);
-f32 func_80179300(f32 n);
-f32 func_80179400(s32 n);
-f32 pow_int(f32 base, s32 exp);
-f32 sin_rad(f32 rad);
-f32 cos_rad(f32 rad);
-f32 Rand_ZeroFloat(f32 scale);
-f32 randPlusMinusPoint5Scaled(f32 scale);
+
f32 Math3D_Normalize(Vec3f* vec);
s32 Math3D_PlaneVsLineSegClosestPoint(f32 planeAA, f32 planeAB, f32 planeAC, f32 planeADist, f32 planeBA, f32 planeBB, f32 planeBC, f32 planeBDist, Vec3f* linePointA, Vec3f* linePointB, Vec3f* closestPoint);
s32 func_80179798(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3, Vec3f* param_4, Vec3f* param_5, Vec3f* param_6);
-// void func_80179A44(void);
-void func_80179B34(float fParm1, f32 fParm2, f32 fParm5, f32 fParm6, f32 param_5, f32 param_6, f32 param_7, float* param_8, float* param_9);
+void func_80179A44(Vec3f* arg0, PosRot* arg1, Vec3f* arg2);
+void func_80179B34(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32* arg7, f32* arg8);
// UNK_TYPE4 func_80179B94(f32 fParm1, f32 fParm2, f32 fParm5, f32 param_4, f32 param_5, f32 param_6, f32 param_7, f32 param_8, Vec3f* param_9);
// void func_80179D74(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
void Math3D_ScaleAndAdd(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dst);
@@ -2599,11 +2034,6 @@ s32 Math3D_YZInSphere(Sphere16* sphere, f32 y, f32 z);
// void func_8017FB1C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11);
// void func_8017FD44(void);
-s16 Math_Atan2S(f32 y, f32 x);
-f32 Math_Atan2F(f32 y, f32 x);
-s16 Math_Atan2S_XY(f32 x, f32 y);
-f32 Math_Atan2F_XY(f32 x, f32 y);
-
u64* SysUcode_GetUCodeBoot(void);
size_t SysUcode_GetUCodeBootSize(void);
u64* SysUcode_GetUCode(void);
@@ -2652,22 +2082,15 @@ void func_8018450C(PlayState* play, SkeletonInfo* skeleton, Mtx* mtx, OverrideKe
// void func_801853C8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80185460(void);
-// void func_801857C0(void);
-// char* func_801857D0(void);
-// void func_80185864(void);
-u32 func_80185908(void);
-UNK_TYPE func_80185968(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
-// void func_801859F0(void);
-// void func_80185A2C(void);
-// void func_80185B1C(void);
-// void func_80185BE4(void);
-// void func_80185C24(void);
-void SysFlashrom_ThreadEntry(s80185D40* param_1);
-void func_80185DDC(u8* arg0, u32 arg1, u32 arg2);
-s32 func_80185EC4(void);
-s32 func_80185F04(void);
-void func_80185F64(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
-s32 func_80185F90(u32 param_1);
+s32 SysFlashrom_InitFlash(void);
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount);
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount);
+s32 SysFlashrom_IsBusy(void);
+s32 SysFlashrom_AwaitResult(void);
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount);
+
+s32 func_80185F90(u32 arg0);
+
u32 osFlashGetAddr(u32 pageNum);
OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 pageSize, u8 relDuration, u32 start);
void osFlashChange(u32 flashNum);
@@ -2809,7 +2232,7 @@ OcarinaStaff* AudioOcarina_GetRecordingStaff(void);
OcarinaStaff* AudioOcarina_GetPlayingStaff(void);
OcarinaStaff* AudioOcarina_GetPlaybackStaff(void);
void AudioOcarina_TerminaWallGenerateNotes(void);
-void AudioOcarina_PlayLongScarecrowAfterCredits(void);
+void AudioOcarina_PlayLongScarecrowSong(void);
void Audio_Update(void);
void AudioSfx_SetProperties(u8 bankId, u8 entryIndex, u8 channelIndex);
@@ -2932,7 +2355,7 @@ void Audio_ResetForAudioHeapStep3(void);
void Audio_ResetForAudioHeapStep2(void);
void Audio_ResetForAudioHeapStep1(s32 specId);
-// void func_801A4EB0(void);
+void func_801A4EB0(void);
// void func_801A4EB8(void);
void func_801A4FD8(void);
void func_801A5080(u16 arg0);
diff --git a/include/gfx.h b/include/gfx.h
new file mode 100644
index 000000000..dfbd78d74
--- /dev/null
+++ b/include/gfx.h
@@ -0,0 +1,274 @@
+#ifndef GFX_H
+#define GFX_H
+
+#include "ultra64.h"
+#include "PR/sched.h"
+#include "thga.h"
+#include "alignment.h"
+
+struct GameState;
+
+typedef enum SetupDL {
+ /* 0x00 */ SETUPDL_0,
+ /* 0x01 */ SETUPDL_1,
+ /* 0x02 */ SETUPDL_2,
+ /* 0x03 */ SETUPDL_3,
+ /* 0x04 */ SETUPDL_4,
+ /* 0x05 */ SETUPDL_5,
+ /* 0x06 */ SETUPDL_6,
+ /* 0x07 */ SETUPDL_7,
+ /* 0x08 */ SETUPDL_8,
+ /* 0x09 */ SETUPDL_9,
+ /* 0x0A */ SETUPDL_10,
+ /* 0x0B */ SETUPDL_11,
+ /* 0x0C */ SETUPDL_12,
+ /* 0x0D */ SETUPDL_13,
+ /* 0x0E */ SETUPDL_14,
+ /* 0x0F */ SETUPDL_15,
+ /* 0x10 */ SETUPDL_16,
+ /* 0x11 */ SETUPDL_17,
+ /* 0x12 */ SETUPDL_18,
+ /* 0x13 */ SETUPDL_19,
+ /* 0x14 */ SETUPDL_20,
+ /* 0x15 */ SETUPDL_21,
+ /* 0x16 */ SETUPDL_22,
+ /* 0x17 */ SETUPDL_23,
+ /* 0x18 */ SETUPDL_24,
+ /* 0x19 */ SETUPDL_25,
+ /* 0x1A */ SETUPDL_26,
+ /* 0x1B */ SETUPDL_27,
+ /* 0x1C */ SETUPDL_28,
+ /* 0x1D */ SETUPDL_29,
+ /* 0x1E */ SETUPDL_30,
+ /* 0x1F */ SETUPDL_31,
+ /* 0x20 */ SETUPDL_32,
+ /* 0x21 */ SETUPDL_33,
+ /* 0x22 */ SETUPDL_34,
+ /* 0x23 */ SETUPDL_35,
+ /* 0x24 */ SETUPDL_36,
+ /* 0x25 */ SETUPDL_37,
+ /* 0x26 */ SETUPDL_38,
+ /* 0x27 */ SETUPDL_39,
+ /* 0x28 */ SETUPDL_40,
+ /* 0x29 */ SETUPDL_41,
+ /* 0x2A */ SETUPDL_42,
+ /* 0x2B */ SETUPDL_43,
+ /* 0x2C */ SETUPDL_44,
+ /* 0x2D */ SETUPDL_45,
+ /* 0x2E */ SETUPDL_46,
+ /* 0x2F */ SETUPDL_47,
+ /* 0x30 */ SETUPDL_48,
+ /* 0x31 */ SETUPDL_49,
+ /* 0x32 */ SETUPDL_50,
+ /* 0x33 */ SETUPDL_51,
+ /* 0x34 */ SETUPDL_52,
+ /* 0x35 */ SETUPDL_53,
+ /* 0x36 */ SETUPDL_54,
+ /* 0x37 */ SETUPDL_55,
+ /* 0x38 */ SETUPDL_56,
+ /* 0x39 */ SETUPDL_57,
+ /* 0x3A */ SETUPDL_58,
+ /* 0x3B */ SETUPDL_59,
+ /* 0x3C */ SETUPDL_60,
+ /* 0x3D */ SETUPDL_61,
+ /* 0x3E */ SETUPDL_62,
+ /* 0x3F */ SETUPDL_63,
+ /* 0x40 */ SETUPDL_64,
+ /* 0x41 */ SETUPDL_65,
+ /* 0x42 */ SETUPDL_66,
+ /* 0x43 */ SETUPDL_67,
+ /* 0x44 */ SETUPDL_68,
+ /* 0x45 */ SETUPDL_69,
+ /* 0x46 */ SETUPDL_70,
+ /* 0x47 */ SETUPDL_71,
+ /* 0x48 */ SETUPDL_72,
+ /* 0x49 */ SETUPDL_MAX
+} SetupDL;
+
+typedef struct {
+ /* 0x000 */ Gfx taskStart[9];
+ /* 0x048 */ Gfx clearZBuffer[8]; // original name: clear_zb_dl
+ /* 0x088 */ Gfx clearFrameBuffer[5]; // original name: clear_fb_dl
+ /* 0x0B0 */ Gfx setupBuffers[6]; // setup framebuffer and zbuffer
+ /* 0x0E0 */ Gfx unk_E0[12]; // unused
+ /* 0x140 */ Gfx syncSegments[17];
+ /* 0x1C8 */ Gfx setScissor[2];
+ /* 0x1D8 */ Gfx unk_1D8[25]; // unused
+ /* 0x2A0 */ Gfx disps[5];
+ /* 0x2C8 */ Gfx clearFillRect[3]; // fillrect for clearing buffers
+ /* 0x2E0 */ Gfx fillRect[3]; // fillrect for general purpose
+ /* 0x2F8 */ Gfx debugDisp[1];
+} GfxMasterList; // size = 0x300
+
+#define GFXPOOL_HEAD_MAGIC 0x1234
+#define GFXPOOL_TAIL_MAGIC 0x5678
+
+typedef struct GfxPool {
+ /* 0x00000 */ u16 headMagic; // GFXPOOL_HEAD_MAGIC
+ /* 0x00008 */ GfxMasterList master;
+ /* 0x00308 */ Gfx polyXluBuffer[0x800];
+ /* 0x04308 */ Gfx overlayBuffer[0x400];
+ /* 0x06308 */ Gfx workBuffer[0x40];
+ /* 0x06508 */ Gfx debugBuffer[0x40];
+ /* 0x06708 */ Gfx polyOpaBuffer[0x3380];
+ /* 0x20308 */ u16 tailMagic; // GFXPOOL_TAIL_MAGIC
+} GfxPool; // size = 0x20310
+
+typedef struct GraphicsContext {
+ /* 0x000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
+ /* 0x004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
+ /* 0x008 */ char unk_8[0x8]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3"
+ /* 0x010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4"
+ /* 0x014 */ u32 unk_14;
+ /* 0x018 */ char unk_18[0x20];
+ /* 0x038 */ OSMesg msgBuff[8];
+ /* 0x058 */ OSMesgQueue* schedMsgQ;
+ /* 0x05C */ OSMesgQueue queue;
+ /* 0x074 */ char unk_74[0x04];
+ /* 0x078 */ OSScTask task;
+ /* 0x0E0 */ char unk_E0[0xD0];
+ /* 0x1B0 */ Gfx* workBuffer;
+ /* 0x1B4 */ TwoHeadGfxArena work;
+ /* 0x1C4 */ Gfx* debugBuffer;
+ /* 0x1C8 */ TwoHeadGfxArena debug;
+ /* 0x1D8 */ UNK_TYPE1 unk_1D8[0xAC];
+ /* 0x284 */ OSViMode* viMode;
+ /* 0x288 */ void* zbuffer;
+ /* 0x28C */ char unk_28C[0x1C];
+ /* 0x2A8 */ TwoHeadGfxArena overlay; // "Zelda 4"
+ /* 0x2B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0"
+ /* 0x2C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1"
+ /* 0x2D8 */ u32 gfxPoolIdx;
+ /* 0x2DC */ u16* curFrameBuffer;
+ /* 0x2E0 */ char unk_2E0[0x4];
+ /* 0x2E4 */ u32 viConfigFeatures;
+ /* 0x2E8 */ char unk_2E8[0x2];
+ /* 0x2EA */ u8 updateViMode;
+ /* 0x2EB */ u8 framebufferIndex;
+ /* 0x2EC */ void (*callback)(struct GraphicsContext*, u32);
+ /* 0x2F0 */ u32 callbackArg;
+ /* 0x2F4 */ f32 xScale;
+ /* 0x2F8 */ f32 yScale;
+ /* 0x2FC */ GfxMasterList* masterList;
+} GraphicsContext; // size = 0x300
+
+Gfx* Gfx_SetFog(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetFogWithSync(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f);
+Gfx* Gfx_SetupDLImpl(Gfx* gfx, u32 i);
+Gfx* Gfx_SetupDL(Gfx* gfx, u32 i);
+void Gfx_SetupDLAtPtr(Gfx** gfxp, u32 i);
+Gfx* Gfx_SetupDL57(Gfx* gfx);
+Gfx* Gfx_SetupDL57_b(Gfx* gfx);
+Gfx* Gfx_SetupDL52_NoCD(Gfx* gfx);
+void Gfx_SetupDL58_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL57_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL50_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL51_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL52_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL53_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL54_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL55_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL26(Gfx* gfx);
+void Gfx_SetupDL26_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL23(Gfx* gfx);
+void Gfx_SetupDL23_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL25_Xlu2(GraphicsContext* gfxCtx);
+void func_8012C268(struct GameState* gameState);
+void Gfx_SetupDL25_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL71(Gfx* gfx);
+void Gfx_SetupDL25_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL72(Gfx* gfx);
+void Gfx_SetupDL31_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL32_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL33_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL64(Gfx* gfx);
+Gfx* Gfx_SetupDL34(Gfx* gfx);
+void Gfx_SetupDL34_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL35_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL44_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL36_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL28(Gfx* gfx);
+void Gfx_SetupDL28_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL43_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL45_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL46_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL38_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL4_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL37_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL2_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL39(Gfx* gfx);
+void Gfx_SetupDL39_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL39_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL39_Ptr(Gfx** gfxp);
+void Gfx_SetupDL40_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL41_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL47_Xlu(GraphicsContext* gfxCtx);
+Gfx* Gfx_SetupDL66(Gfx* gfx);
+Gfx* Gfx_SetupDL67(Gfx* gfx);
+Gfx* Gfx_SetupDL68_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL69_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL65_NoCD(Gfx* gfx);
+Gfx* Gfx_SetupDL70(Gfx* gfx);
+Gfx* Gfx_SetupDL20_NoCD(Gfx* gfx);
+void Gfx_SetupDL42_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL42_Overlay(GraphicsContext* gfxCtx);
+void Gfx_SetupDL48_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL49_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL27_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL60_XluNoCD(GraphicsContext* gfxCtx);
+void Gfx_SetupDL61_Xlu(GraphicsContext* gfxCtx);
+void Gfx_SetupDL56_Opa(GraphicsContext* gfxCtx);
+void Gfx_SetupDL56_Ptr(Gfx** gfxp);
+void Gfx_SetupDL59_Opa(GraphicsContext* gfxCtx);
+Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height);
+void func_8012CB04(Gfx** gfxp, u32 x, u32 y);
+Gfx* func_8012CB28(GraphicsContext* gfxCtx, u32 x, u32 y);
+Gfx* Gfx_TexScroll(GraphicsContext* gfxCtx, u32 x, u32 y, s32 width, s32 height);
+Gfx* Gfx_TwoTexScroll(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2);
+Gfx* Gfx_TwoTexScrollEnvColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1, s32 width1, s32 height1, s32 tile2, u32 x2, u32 y2, s32 width2, s32 height2, s32 r, s32 g, s32 b, s32 a);
+Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
+Gfx* Gfx_PrimColor(GraphicsContext* gfxCtx, s32 lodfrac, s32 r, s32 g, s32 b, s32 a);
+void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g, u8 b);
+void func_8012D374(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
+void func_8012D40C(f32* param_1, f32* param_2, s16* param_3);
+
+extern Gfx gSetupDLs[SETUPDL_MAX][6];
+extern Gfx gEmptyDL[];
+
+#define WORK_DISP __gfxCtx->work.p
+#define POLY_OPA_DISP __gfxCtx->polyOpa.p
+#define POLY_XLU_DISP __gfxCtx->polyXlu.p
+#define OVERLAY_DISP __gfxCtx->overlay.p
+#define DEBUG_DISP __gfxCtx->debug.p
+
+// __gfxCtx shouldn't be used directly.
+// Use the DISP macros defined above when writing to display buffers.
+#define OPEN_DISPS(gfxCtx) \
+ { \
+ GraphicsContext* __gfxCtx = gfxCtx; \
+ s32 __dispPad
+
+#define CLOSE_DISPS(gfxCtx) \
+ (void)0; \
+ } \
+ (void)0
+
+#define GRAPH_ALLOC(gfxCtx, size) ((void*)((gfxCtx)->polyOpa.d = (Gfx*)((u8*)(gfxCtx)->polyOpa.d - ALIGN16(size))))
+
+// Custom gbi macro
+#define gDPSetTileCustom(pkt, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
+ { \
+ gDPPipeSync(pkt); \
+ gDPTileSync(pkt); \
+ gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, \
+ masks, shifts); \
+ gDPTileSync(pkt); \
+ gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
+ cms, masks, shifts); \
+ gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
+ ((height)-1) << G_TEXTURE_IMAGE_FRAC); \
+ } \
+ (void)0
+
+#endif
diff --git a/include/initvars.h b/include/initvars.h
deleted file mode 100644
index 554b0ff5d..000000000
--- a/include/initvars.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _INITVARS_H_
-#define _INITVARS_H_
-
-extern TransitionInit TransitionFade_InitVars;
-extern TransitionInit TransitionTriforce_InitVars;
-extern TransitionInit TransitionWipe1_InitVars;
-extern TransitionInit TransitionWipe3_InitVars;
-extern TransitionInit TransitionWipe4_InitVars;
-extern TransitionInit TransitionCircle_InitVars;
-extern TransitionInit TransitionWipe5_InitVars;
-
-#endif
diff --git a/include/io/controller.h b/include/io/controller.h
index 4321df096..b588b4198 100644
--- a/include/io/controller.h
+++ b/include/io/controller.h
@@ -35,10 +35,6 @@
#define CONT_CMD_WRITE_EEPROM_RX 1
#define CONT_CMD_RESET_RX 3
-#define CONT_CMD_NOP 0xFF
-#define CONT_CMD_END 0xFE // Indicates end of a command
-#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command
-
#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */
#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */
#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */
@@ -48,6 +44,52 @@
#define CONT_ERR_VOICE_WORD 14
#define CONT_ERR_VOICE_NO_RESPONSE 15
+// Joybus commands
+#define CONT_CMD_REQUEST_STATUS 0
+#define CONT_CMD_READ_BUTTON 1
+#define CONT_CMD_READ_PAK 2
+#define CONT_CMD_WRITE_PAK 3
+#define CONT_CMD_READ_EEPROM 4
+#define CONT_CMD_WRITE_EEPROM 5
+#define CONT_CMD_READ36_VOICE 9
+#define CONT_CMD_WRITE20_VOICE 10
+#define CONT_CMD_READ2_VOICE 11
+#define CONT_CMD_WRITE4_VOICE 12
+#define CONT_CMD_SWRITE_VOICE 13
+#define CONT_CMD_CHANNEL_RESET 0xFD
+#define CONT_CMD_RESET 0xFF
+
+// Bytes transmitted for each joybus command
+#define CONT_CMD_REQUEST_STATUS_TX 1
+#define CONT_CMD_READ_BUTTON_TX 1
+#define CONT_CMD_READ_PAK_TX 3
+#define CONT_CMD_WRITE_PAK_TX 35
+#define CONT_CMD_READ_EEPROM_TX 2
+#define CONT_CMD_WRITE_EEPROM_TX 10
+#define CONT_CMD_READ36_VOICE_TX 3
+#define CONT_CMD_WRITE20_VOICE_TX 23
+#define CONT_CMD_READ2_VOICE_TX 3
+#define CONT_CMD_WRITE4_VOICE_TX 7
+#define CONT_CMD_SWRITE_VOICE_TX 3
+#define CONT_CMD_RESET_TX 1
+
+// Bytes received for each joybus command
+#define CONT_CMD_REQUEST_STATUS_RX 3
+#define CONT_CMD_READ_BUTTON_RX 4
+#define CONT_CMD_READ_PAK_RX 33
+#define CONT_CMD_WRITE_PAK_RX 1
+#define CONT_CMD_READ_EEPROM_RX 8
+#define CONT_CMD_WRITE_EEPROM_RX 1
+#define CONT_CMD_READ36_VOICE_RX 37
+#define CONT_CMD_WRITE20_VOICE_RX 1
+#define CONT_CMD_READ2_VOICE_RX 3
+#define CONT_CMD_WRITE4_VOICE_RX 1
+#define CONT_CMD_SWRITE_VOICE_RX 1
+#define CONT_CMD_RESET_RX 3
+
+#define CONT_CMD_NOP 0xFF
+#define CONT_CMD_END 0xFE // Indicates end of a command
+#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command
#define DIR_STATUS_EMPTY 0
#define DIR_STATUS_UNKNOWN 1
@@ -81,6 +123,26 @@
#define CONT_ADDR_CRC_ER 0x04
#define CONT_EEPROM_BUSY 0x80
+// Accessory detection
+#define CONT_ADDR_DETECT 0x8000
+// Rumble
+#define CONT_ADDR_RUMBLE 0xC000
+// Controller Pak
+// Transfer Pak
+#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different
+#define CONT_ADDR_GB_BANK 0xA000
+#define CONT_ADDR_GB_STATUS 0xB000
+
+// Addresses sent to controller accessories are in blocks, not bytes
+#define CONT_BLOCKS(x) ((x) / BLOCKSIZE)
+
+// Block addresses of the above
+#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT)
+#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE)
+#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER)
+#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK)
+#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS)
+
/* Buttons */
#define BTN_CRIGHT 0x0001
#define BTN_CLEFT 0x0002
@@ -88,6 +150,7 @@
#define BTN_CUP 0x0008
#define BTN_R 0x0010
#define BTN_L 0x0020
+#define BTN_RESET 0x0080
#define BTN_DRIGHT 0x0100
#define BTN_DLEFT 0x0200
#define BTN_DDOWN 0x0400
@@ -146,6 +209,8 @@ typedef struct {
/* 0x26 */ u8 datacrc;
} __OSContRamReadFormat;
+#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
+
extern OSPifRam __osContPifRam;
// extern UNK_TYPE1 D_8009CF0C;
extern u8 __osContLastPoll;
@@ -153,11 +218,4 @@ extern u8 __osMaxControllers;
// extern OSMesgQueue D_8009CF38;
// extern OSMesg D_8009CF50;
-typedef struct {
- /* 0x00 */ OSContPad cur;
- /* 0x06 */ OSContPad prev;
- /* 0x0C */ OSContPad press; // X/Y store delta from last frame
- /* 0x12 */ OSContPad rel; // X/Y store adjusted
-} Input; // size = 0x18
-
#endif
diff --git a/include/irqmgr.h b/include/irqmgr.h
index 40ed322d1..ac2c74960 100644
--- a/include/irqmgr.h
+++ b/include/irqmgr.h
@@ -1,9 +1,14 @@
#ifndef IRQMGR_H
#define IRQMGR_H
-#include "PR/ultratypes.h"
#include "PR/sched.h"
-#include "ultra64/message.h"
+#include "os.h"
+#include "ultra64.h"
+
+#define OS_SC_RETRACE_MSG 1
+#define OS_SC_DONE_MSG 2
+#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c
+#define OS_SC_PRE_NMI_MSG 4
typedef struct IrqMgrClient {
/* 0x0 */ struct IrqMgrClient* next;
diff --git a/include/macros.h b/include/macros.h
index d572e9ccf..d2b98dec5 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -7,9 +7,11 @@
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
+#define SCREEN_WIDTH_HIRES 640
+#define SCREEN_HEIGHT_HIRES 480
-#define SCREEN_WIDTH_HIGH_RES 576
-#define SCREEN_HEIGHT_HIGH_RES 454
+#define HIRES_BUFFER_WIDTH 576
+#define HIRES_BUFFER_HEIGHT 454
#define PROJECTED_TO_SCREEN_X(projectedPos, invW) ((projectedPos).x * (invW) * (SCREEN_WIDTH / 2) + (SCREEN_WIDTH / 2))
#define PROJECTED_TO_SCREEN_Y(projectedPos, invW) ((projectedPos).y * (invW) * (-SCREEN_HEIGHT / 2) + (SCREEN_HEIGHT / 2))
@@ -17,6 +19,8 @@
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
+#define ARRAY_COUNT_2D(arr) (ARRAY_COUNT(arr) * ARRAY_COUNT(arr[0]))
+
// TODO: After uintptr_t cast change should have an AVOID_UB target that just toggles the KSEG0 bit in the address rather than add/sub 0x80000000
#define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t)(addr) + RDRAM_CACHED)
#define VIRTUAL_TO_PHYSICAL(addr) (uintptr_t)((u8*)(addr) - RDRAM_CACHED)
@@ -24,27 +28,13 @@
#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamId])
-#define STOP_GAMESTATE(curState) \
- do { \
- GameState* state = curState; \
- \
- state->running = false; \
- } while(0)
-
-#define SET_NEXT_GAMESTATE(curState, nextInit, nextSize) \
- do { \
- GameState* state = curState; \
- \
- (state)->init = nextInit; \
- (state)->size = nextSize; \
- } while (0)
-
#define GET_PLAYER(play) ((Player*)(play)->actorCtx.actorLists[ACTORCAT_PLAYER].first)
#define GET_FIRST_ENEMY(play) ((Actor*)(play)->actorCtx.actorLists[ACTORCAT_ENEMY].first)
#define CLOCK_TIME(hr, min) (s32)(((hr) * 60 + (min)) * 0x10000 / (24 * 60))
#define CLOCK_TIME_MINUTE (CLOCK_TIME(0, 1))
+#define CLOCK_TIME_HOUR (CLOCK_TIME(1, 0))
#define DAY_LENGTH (CLOCK_TIME(24, 0))
#define TIME_TO_HOURS_F(time) ((time) * (24.0f / 0x10000))
@@ -55,12 +45,13 @@
#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f)))
#define CLOCK_TIME_ALT_F(hr, min) (((hr) * 60.0f + (min)) / (24.0f * 60.0f / 0x10000))
#define CLOCK_TIME_ALT2_F(hr, min) ((((hr) + (min) / 60.0f) * 60.0f) / (24.0f * 60.0f / 0x10000))
+#define CLOCK_TIME_HOUR_F (CLOCK_TIME_F(1, 0))
#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 MAGIC_FILL_TO_CAPACITY (((void)0, gSaveContext.magicFillTarget) + (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired + 1) * MAGIC_NORMAL_METER)
#define CONTROLLER1(gameState) (&(gameState)->input[0])
#define CONTROLLER2(gameState) (&(gameState)->input[1])
@@ -77,26 +68,6 @@
#define ALIGN64(val) (((val) + 0x3F) & ~0x3F)
#define ALIGN256(val) (((val) + 0xFF) & ~0xFF)
-extern GraphicsContext* __gfxCtx;
-
-#define WORK_DISP __gfxCtx->work.p
-#define POLY_OPA_DISP __gfxCtx->polyOpa.p
-#define POLY_XLU_DISP __gfxCtx->polyXlu.p
-#define OVERLAY_DISP __gfxCtx->overlay.p
-#define DEBUG_DISP __gfxCtx->debug.p
-
-// __gfxCtx shouldn't be used directly.
-// Use the DISP macros defined above when writing to display buffers.
-#define OPEN_DISPS(gfxCtx) \
- { \
- GraphicsContext* __gfxCtx = gfxCtx; \
- s32 __dispPad
-
-#define CLOSE_DISPS(gfxCtx) \
- (void)0; \
- } \
- (void)0
-
/**
* `x` vertex x
* `y` vertex y
@@ -114,23 +85,6 @@ extern GraphicsContext* __gfxCtx;
#define VTX_T(x, y, z, s, t, cr, cg, cb, a) \
{ { x, y, z }, 0, { s, t }, { cr, cg, cb, a }, }
-#define GRAPH_ALLOC(gfxCtx, size) ((void*)((gfxCtx)->polyOpa.d = (Gfx*)((u8*)(gfxCtx)->polyOpa.d - ALIGN16(size))))
-
-// Custom gbi macro
-#define gDPSetTileCustom(pkt, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \
- { \
- gDPPipeSync(pkt); \
- gDPTileSync(pkt); \
- gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, \
- masks, shifts); \
- gDPTileSync(pkt); \
- gDPSetTile(pkt, fmt, siz, (((width)*siz##_TILE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \
- cms, masks, shifts); \
- gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
- ((height)-1) << G_TEXTURE_IMAGE_FRAC); \
- } \
- (void)0
-
#define SQ(x) ((x) * (x))
#define ABS(x) ((x) >= 0 ? (x) : -(x))
#define ABS_ALT(x) ((x) < 0 ? -(x) : (x))
diff --git a/include/padmgr.h b/include/padmgr.h
new file mode 100644
index 000000000..674c9bc4e
--- /dev/null
+++ b/include/padmgr.h
@@ -0,0 +1,97 @@
+#ifndef PADMGR_H
+#define PADMGR_H
+
+#include "libc/stdbool.h"
+#include "io/controller.h"
+#include "irqmgr.h"
+
+typedef struct {
+ /* 0x00 */ OSContPad cur;
+ /* 0x06 */ OSContPad prev;
+ /* 0x0C */ OSContPad press; // X/Y store delta from last frame
+ /* 0x12 */ OSContPad rel; // X/Y store adjusted
+} Input; // size = 0x18
+
+typedef enum {
+ /* 0 */ PADMGR_CONT_NONE,
+ /* 1 */ PADMGR_CONT_NORMAL,
+ /* 3 */ PADMGR_CONT_MOUSE = 3,
+ /* 4 */ PADMGR_CONT_VOICE_PLUGGED, // VRU plugged but not initialized
+ /* 5 */ PADMGR_CONT_VOICE,
+ /* -1 */ PADMGR_CONT_UNK = 0xFF
+} ControllerDeviceType;
+
+typedef enum {
+ /* 0 */ CONT_PAK_NONE,
+ /* 1 */ CONT_PAK_RUMBLE,
+ /* 2 */ CONT_PAK_OTHER
+} ControllerPakType;
+
+typedef struct {
+ /* 0x000 */ u8 validCtrlrsMask;
+ /* 0x004 */ void (*rumbleRetraceCallback)(void*);
+ /* 0x008 */ void* rumbleRetraceArg;
+ /* 0x00C */ void (*inputRetraceCallback)(void*);
+ /* 0x010 */ void* inputRetraceArg;
+ /* 0x014 */ OSContStatus padStatus[MAXCONTROLLERS];
+ /* 0x024 */ OSMesg serialMsg;
+ /* 0x028 */ OSMesg lockMsg;
+ /* 0x02C */ OSMesg interruptMsgBuf[8];
+ /* 0x04C */ OSMesgQueue serialLockQueue;
+ /* 0x064 */ OSMesgQueue lockQueue;
+ /* 0x07C */ OSMesgQueue interruptQueue;
+ /* 0x094 */ IrqMgrClient irqClient;
+ /* 0x09C */ IrqMgr* irqMgr;
+ /* 0x0A0 */ OSThread thread;
+ /* 0x250 */ Input inputs[MAXCONTROLLERS];
+ /* 0x2B0 */ OSContPad pads[MAXCONTROLLERS];
+ /* 0x2C8 */ u8 nControllers;
+ /* 0x2C9 */ u8 ctrlrType[MAXCONTROLLERS]; // type of controller currently connected to each port
+ /* 0x2CD */ u8 pakType[MAXCONTROLLERS]; // type of controller pak for each port (if applicable)
+ /* 0x2D1 */ u8 rumbleEnable[MAXCONTROLLERS]; // whether rumble is active for each port
+ /* 0x2D5 */ u8 rumbleTimer[MAXCONTROLLERS];
+ /* 0x2DC */ OSPfs rumblePfs[MAXCONTROLLERS];
+ /* 0x47C */ vu8 rumbleOffTimer; // amount of VI retraces to not rumble for, takes priority over rumbleOnTimer
+ /* 0x47D */ vu8 rumbleOnTimer; // amount of VI retraces to rumble for
+ /* 0x47E */ u8 isResetting;
+} PadMgr; // size = 0x480
+
+extern PadMgr gPadMgr;
+
+// Initialization
+
+s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status);
+void PadMgr_Init(OSMesgQueue* siEvtQ, IrqMgr* irqMgr, OSId threadId, OSPri pri, void* stack);
+
+// Fetching inputs
+
+void PadMgr_GetInputNoLock(Input* inputs, s32 gameRequest);
+void PadMgr_GetInput(Input* inputs, s32 gameRequest);
+void PadMgr_GetInput2(Input* inputs, s32 gameRequest);
+
+// Callbacks
+
+void PadMgr_SetRumbleRetraceCallback(void (*callback)(void*), void* arg);
+void PadMgr_UnsetRumbleRetraceCallback(void (*callback)(void*), void* arg);
+
+void PadMgr_SetInputRetraceCallback(void (*callback)(void*), void* arg);
+void PadMgr_UnsetInputRetraceCallback(void (*callback)(void*), void* arg);
+
+// Valid controllers
+
+u8 PadMgr_GetValidControllersMask(void);
+
+// Voice queue
+
+OSMesgQueue* PadMgr_VoiceAcquireSerialEventQueue(void);
+void PadMgr_VoiceReleaseSerialEventQueue(OSMesgQueue* serialEventQueue);
+
+// Rumble
+
+void PadMgr_RumbleStop(void);
+void PadMgr_RumblePause(void);
+void PadMgr_RumbleSetSingle(s32 port, s32 enable);
+void PadMgr_RumbleSet(u8 enable[MAXCONTROLLERS]);
+s32 PadMgr_ControllerHasRumblePak(s32 port);
+
+#endif
diff --git a/include/regs.h b/include/regs.h
index 8de13fb66..bc8bacb1b 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -65,6 +65,13 @@ extern RegEditor* gRegEditor;
#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
#define R_ROOM_IMAGE_NODRAW_FLAGS SREG(25)
#define R_UPDATE_RATE SREG(30)
+#define R_VI_MODE_EDIT_STATE SREG(48)
+#define R_VI_MODE_EDIT_WIDTH SREG(49)
+#define R_VI_MODE_EDIT_HEIGHT SREG(50)
+#define R_VI_MODE_EDIT_ULY_ADJ SREG(51)
+#define R_VI_MODE_EDIT_LRY_ADJ SREG(52)
+#define R_VI_MODE_EDIT_ULX_ADJ SREG(53)
+#define R_VI_MODE_EDIT_LRX_ADJ SREG(54)
#define R_FB_FILTER_TYPE SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
#define R_FB_FILTER_A SREG(84)
@@ -166,4 +173,7 @@ extern RegEditor* gRegEditor;
#define R_ITEM_ICON_WIDTH(i) VREG(76 + i)
#define R_ITEM_BTN_WIDTH(i) VREG(80 + i)
+// Name inferred from OoT. Set to true to manually set play->csCtx.script
+#define R_USE_DEBUG_CUTSCENE dREG(95)
+
#endif
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index 79601bc93..d7c959d23 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -57,6 +57,7 @@ DECLARE_ROM_SEGMENT(icon_item_static_old)
DECLARE_ROM_SEGMENT(icon_item_24_static_test)
DECLARE_ROM_SEGMENT(icon_item_24_static_old)
DECLARE_ROM_SEGMENT(schedule_dma_static_test)
+DECLARE_ROM_SEGMENT(schedule_dma_static_old)
DECLARE_ROM_SEGMENT(schedule_static)
DECLARE_ROM_SEGMENT(story_static)
DECLARE_ROM_SEGMENT(do_action_static)
@@ -88,12 +89,6 @@ DECLARE_OVERLAY_SEGMENT(player_actor)
#undef DEFINE_ACTOR_INTERNAL
#undef DEFINE_ACTOR_UNSET
-DECLARE_OVERLAY_SEGMENT(fbdemo_triforce)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe1)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe3)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe4)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe5)
-
#define DEFINE_OBJECT(name, _enumValue) DECLARE_ROM_SEGMENT(name)
#define DEFINE_OBJECT_UNSET(_enumValue)
#define DEFINE_OBJECT_SIZE_ZERO(_name, _enumValue)
@@ -130,56 +125,44 @@ DECLARE_ROM_SEGMENT(d2_fine_pal_static)
DECLARE_ROM_SEGMENT(elf_message_field)
DECLARE_ROM_SEGMENT(elf_message_ydan)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI2)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_02)
-DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP)
DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_BS)
DECLARE_ROM_SEGMENT(Z2_LAST_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKASHITA)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_02)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_03)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_04)
-DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_00)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_01)
-DECLARE_ROM_SEGMENT(Z2_OMOYA)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_02)
-DECLARE_ROM_SEGMENT(Z2_BOWLING)
DECLARE_ROM_SEGMENT(Z2_BOWLING_room_00)
-DECLARE_ROM_SEGMENT(Z2_SONCHONOIE)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_00)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_01)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_02)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_03)
-DECLARE_ROM_SEGMENT(Z2_IKANA)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_00)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_01)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_02)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_03)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KAIZOKU)
DECLARE_ROM_SEGMENT(Z2_KAIZOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MILK_BAR)
DECLARE_ROM_SEGMENT(Z2_MILK_BAR_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_N)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_02)
@@ -193,10 +176,8 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_11)
-DECLARE_ROM_SEGMENT(Z2_TAKARAYA)
DECLARE_ROM_SEGMENT(Z2_TAKARAYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_R)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_02)
@@ -210,14 +191,11 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_11)
-DECLARE_ROM_SEGMENT(Z2_OKUJOU)
DECLARE_ROM_SEGMENT(Z2_OKUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_OPENINGDAN)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_00)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_01)
-DECLARE_ROM_SEGMENT(Z2_MITURIN)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_00)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_01)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_02)
@@ -232,10 +210,8 @@ DECLARE_ROM_SEGMENT(Z2_MITURIN_room_10)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_11)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_12)
-DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI)
DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_CASTLE)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_00)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_01)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_02)
@@ -247,16 +223,12 @@ DECLARE_ROM_SEGMENT(Z2_CASTLE_room_07)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_08)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_09)
-DECLARE_ROM_SEGMENT(Z2_DEKUTES)
DECLARE_ROM_SEGMENT(Z2_DEKUTES_room_00)
-DECLARE_ROM_SEGMENT(Z2_MITURIN_BS)
DECLARE_ROM_SEGMENT(Z2_MITURIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_02)
@@ -272,10 +244,8 @@ DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_11)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_12)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_13)
-DECLARE_ROM_SEGMENT(Z2_ROMANYMAE)
DECLARE_ROM_SEGMENT(Z2_ROMANYMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_PIRATE)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_00)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_01)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_02)
@@ -292,20 +262,16 @@ DECLARE_ROM_SEGMENT(Z2_PIRATE_room_12)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_13)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_14)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI_room_00)
-DECLARE_ROM_SEGMENT(Z2_SINKAI)
DECLARE_ROM_SEGMENT(Z2_SINKAI_room_00)
-DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_00)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_01)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_02)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_03)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_04)
-DECLARE_ROM_SEGMENT(Z2_KINSTA1)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_00)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_01)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_02)
@@ -313,7 +279,6 @@ DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_03)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_04)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_05)
-DECLARE_ROM_SEGMENT(Z2_KINDAN2)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_00)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_01)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_02)
@@ -321,108 +286,77 @@ DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_03)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_04)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_05)
-DECLARE_ROM_SEGMENT(Z2_TENMON_DAI)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_00)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_01)
-DECLARE_ROM_SEGMENT(Z2_LAST_DEKU)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_01)
-DECLARE_ROM_SEGMENT(Z2_22DEKUCITY)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_00)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_01)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_02)
-DECLARE_ROM_SEGMENT(Z2_KAJIYA)
DECLARE_ROM_SEGMENT(Z2_KAJIYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_00KEIKOKU)
DECLARE_ROM_SEGMENT(Z2_00KEIKOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_POSTHOUSE)
DECLARE_ROM_SEGMENT(Z2_POSTHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LABO)
DECLARE_ROM_SEGMENT(Z2_LABO_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_01)
-DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_00)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_01)
-DECLARE_ROM_SEGMENT(Z2_33ZORACITY)
DECLARE_ROM_SEGMENT(Z2_33ZORACITY_room_00)
-DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP)
DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01)
DECLARE_ROM_SEGMENT(Z2_F01_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_BS)
DECLARE_ROM_SEGMENT(Z2_INISIE_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_30GYOSON)
DECLARE_ROM_SEGMENT(Z2_30GYOSON_room_00)
-DECLARE_ROM_SEGMENT(Z2_31MISAKI)
DECLARE_ROM_SEGMENT(Z2_31MISAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI)
DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TORIDE)
DECLARE_ROM_SEGMENT(Z2_TORIDE_room_00)
-DECLARE_ROM_SEGMENT(Z2_FISHERMAN)
DECLARE_ROM_SEGMENT(Z2_FISHERMAN_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONSHOP)
DECLARE_ROM_SEGMENT(Z2_GORONSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_DEKU_KING)
DECLARE_ROM_SEGMENT(Z2_DEKU_KING_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_GORON)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_01)
-DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI)
DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01_B)
DECLARE_ROM_SEGMENT(Z2_F01_B_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01C)
DECLARE_ROM_SEGMENT(Z2_F01C_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOTI)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_00)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_01)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_02)
-DECLARE_ROM_SEGMENT(Z2_21MITURINMAE)
DECLARE_ROM_SEGMENT(Z2_21MITURINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_ZORA)
DECLARE_ROM_SEGMENT(Z2_LAST_ZORA_room_00)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_01)
-DECLARE_ROM_SEGMENT(Z2_SEA)
DECLARE_ROM_SEGMENT(Z2_SEA_room_00)
DECLARE_ROM_SEGMENT(Z2_SEA_room_01)
DECLARE_ROM_SEGMENT(Z2_SEA_room_02)
@@ -440,10 +374,8 @@ DECLARE_ROM_SEGMENT(Z2_SEA_room_13)
DECLARE_ROM_SEGMENT(Z2_SEA_room_14)
DECLARE_ROM_SEGMENT(Z2_SEA_room_15)
-DECLARE_ROM_SEGMENT(Z2_35TAKI)
DECLARE_ROM_SEGMENT(Z2_35TAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_REDEAD)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_00)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_01)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_02)
@@ -459,31 +391,24 @@ DECLARE_ROM_SEGMENT(Z2_REDEAD_room_11)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_12)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_13)
-DECLARE_ROM_SEGMENT(Z2_BANDROOM)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_00)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_01)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_02)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_03)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_04)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_01)
-DECLARE_ROM_SEGMENT(Z2_GORON_HAKA)
DECLARE_ROM_SEGMENT(Z2_GORON_HAKA_room_00)
-DECLARE_ROM_SEGMENT(Z2_SECOM)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_00)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_01)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOUGITES)
DECLARE_ROM_SEGMENT(Z2_TOUGITES_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_01)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_02)
@@ -494,48 +419,34 @@ DECLARE_ROM_SEGMENT(Z2_DANPEI_room_06)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_07)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_08)
-DECLARE_ROM_SEGMENT(Z2_IKANAMAE)
DECLARE_ROM_SEGMENT(Z2_IKANAMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_DOUJOU)
DECLARE_ROM_SEGMENT(Z2_DOUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE)
DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_IKNINSIDE)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_00)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_01)
-DECLARE_ROM_SEGMENT(Z2_MAP_SHOP)
DECLARE_ROM_SEGMENT(Z2_MAP_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F40)
DECLARE_ROM_SEGMENT(Z2_F40_room_00)
-DECLARE_ROM_SEGMENT(Z2_F41)
DECLARE_ROM_SEGMENT(Z2_F41_room_00)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_00)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_01)
-DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI)
DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE)
DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN2)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN2_room_00)
-DECLARE_ROM_SEGMENT(Z2_SEA_BS)
DECLARE_ROM_SEGMENT(Z2_SEA_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_RANDOM)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_00)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_01)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_02)
@@ -543,21 +454,17 @@ DECLARE_ROM_SEGMENT(Z2_RANDOM_room_03)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_04)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_05)
-DECLARE_ROM_SEGMENT(Z2_YADOYA)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_02)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_03)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT)
DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT_room_00)
-DECLARE_ROM_SEGMENT(Z2_INSIDETOWER)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_00)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_01)
-DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_00)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_01)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_02)
@@ -568,12 +475,10 @@ DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_06)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_07)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_08)
-DECLARE_ROM_SEGMENT(Z2_LOST_WOODS)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_00)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_01)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_02)
-DECLARE_ROM_SEGMENT(Z2_LAST_LINK)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_01)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_02)
@@ -583,40 +488,28 @@ DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_05)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_06)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_07)
-DECLARE_ROM_SEGMENT(Z2_SOUGEN)
DECLARE_ROM_SEGMENT(Z2_SOUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOMYA)
DECLARE_ROM_SEGMENT(Z2_BOMYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA)
DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KOEPONARACE)
DECLARE_ROM_SEGMENT(Z2_KOEPONARACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONRACE)
DECLARE_ROM_SEGMENT(Z2_GORONRACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOWN)
DECLARE_ROM_SEGMENT(Z2_TOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_ICHIBA)
DECLARE_ROM_SEGMENT(Z2_ICHIBA_room_00)
-DECLARE_ROM_SEGMENT(Z2_BACKTOWN)
DECLARE_ROM_SEGMENT(Z2_BACKTOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER)
DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER_room_00)
-DECLARE_ROM_SEGMENT(Z2_ALLEY)
DECLARE_ROM_SEGMENT(Z2_ALLEY_room_00)
-DECLARE_ROM_SEGMENT(SPOT00)
DECLARE_ROM_SEGMENT(SPOT00_room_00)
-DECLARE_ROM_SEGMENT(KAKUSIANA)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_00)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_01)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_02)
diff --git a/include/sfx.h b/include/sfx.h
index 33c79abf4..b55fbb357 100644
--- a/include/sfx.h
+++ b/include/sfx.h
@@ -16,6 +16,8 @@
#define SFX_FLAG_MASK 0xC00
#define SFX_FLAG 0x800
+#define NA_SE_NONE 0
+
// ------------ PLAYER ------------
#define NA_SE_PL_WALK_GROUND 0x800
diff --git a/include/stackcheck.h b/include/stackcheck.h
new file mode 100644
index 000000000..aeb55df28
--- /dev/null
+++ b/include/stackcheck.h
@@ -0,0 +1,26 @@
+#ifndef STACKCHECK_H
+#define STACKCHECK_H
+
+#include "ultra64.h"
+
+typedef enum StackStatus {
+ /* 0 */ STACK_STATUS_OK,
+ /* 1 */ STACK_STATUS_WARNING,
+ /* 2 */ STACK_STATUS_OVERFLOW
+} StackStatus;
+
+typedef struct StackEntry {
+ /* 0x00 */ struct StackEntry* next;
+ /* 0x04 */ struct StackEntry* prev;
+ /* 0x08 */ void* head;
+ /* 0x0C */ void* tail;
+ /* 0x10 */ u32 initValue;
+ /* 0x14 */ s32 minSpace;
+ /* 0x18 */ const char* name;
+} StackEntry; // size = 0x1C
+
+void StackCheck_Init(StackEntry* entry, void* stackBottom, void* stackTop, u32 initValue, s32 minSpace, const char* name);
+void StackCheck_Cleanup(StackEntry* entry);
+u32 StackCheck_Check(StackEntry* entry);
+
+#endif
diff --git a/include/system_heap.h b/include/system_heap.h
new file mode 100644
index 000000000..e0864cca6
--- /dev/null
+++ b/include/system_heap.h
@@ -0,0 +1,11 @@
+#ifndef SYSTEM_HEAP_H
+#define SYSTEM_HEAP_H
+
+#include "libc/stddef.h"
+#include "PR/ultratypes.h"
+
+void* SystemHeap_Malloc(size_t size);
+void SystemHeap_Free(void* ptr);
+void SystemHeap_Init(void* start, size_t size);
+
+#endif
diff --git a/include/system_malloc.h b/include/system_malloc.h
index e92eaf89f..cf91899ef 100644
--- a/include/system_malloc.h
+++ b/include/system_malloc.h
@@ -1,5 +1,5 @@
-#ifndef SYSTEM_MALLOC
-#define SYSTEM_MALLOC
+#ifndef SYSTEM_MALLOC_H
+#define SYSTEM_MALLOC_H
#include "PR/ultratypes.h"
#include "os_malloc.h"
@@ -11,7 +11,7 @@ void SystemArena_Free(void* ptr);
void* SystemArena_Calloc(u32 elements, size_t size);
void SystemArena_GetSizes(size_t* maxFreeBlock, size_t* bytesFree, size_t* bytesAllocated);
u32 SystemArena_CheckArena(void);
-void SystemArena_InitArena(void* start, size_t size);
+void SystemArena_Init(void* start, size_t size);
void SystemArena_Cleanup(void);
u8 SystemArena_IsInitialized(void);
diff --git a/include/tables/bombers_notebook/event_table.h b/include/tables/bombers_notebook/event_table.h
new file mode 100644
index 000000000..161269a7e
--- /dev/null
+++ b/include/tables/bombers_notebook/event_table.h
@@ -0,0 +1,48 @@
+/**
+ * Bombers Notebook Event Table
+ *
+ * DEFINE_EVENT should be used for events in the notebook
+ * - Argument 0: Enum value for the event
+ * - Argument 1: Icon to use (see BombersNotebookEventIcon)
+ * - Argument 2: WeekEventFlag that updates the icons color
+ * - Argument 3: Message id for the description of this event
+ * - Argument 4: Message id for the completion of this event
+ * - Argument 5: WeekEventFlag for the completion of this event
+ *
+ * Note: These events are after the MET events, so will start indexing at BOMBERS_NOTEBOOK_PERSON_MAX
+ */
+/* 0x14 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x2198, 0x2152, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY)
+/* 0x15 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING, 0x2199, 0x2153, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING)
+/* 0x16 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x219A, 0x2154, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI)
+/* 0x17 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x219B, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI)
+/* 0x18 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI, 0x219C, 0x2156, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI)
+/* 0x19 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES, 0x219D, 0x2157, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES)
+/* 0x1A */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES, 0x219E, 0x2158, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES)
+/* 0x1B */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT, 0x219F, 0x2159, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT)
+/* 0x1C */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM, 0x21A0, 0x215A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM)
+/* 0x1D */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_DEFENDED_AGAINST_THEM, 0x21A1, 0x215B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM)
+/* 0x1E */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A2, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE)
+/* 0x1F */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_ESCORTED_CREMIA, 0x21A3, 0x215D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA)
+/* 0x20 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A4, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK)
+/* 0x21 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A5, 0x215F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK)
+/* 0x22 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_PRIORITY_MAIL, 0x21A6, 0x2160, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL)
+/* 0x23 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A7, 0x2161, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL)
+/* 0x24 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A8, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE)
+/* 0x25 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A9, 0x2163, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK)
+/* 0x26 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AA, 0x2164, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP)
+/* 0x27 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AB, 0x2165, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP)
+/* 0x28 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AC, 0x2166, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP)
+/* 0x29 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AD, 0x2167, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP)
+/* 0x2A */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AE, 0x2168, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP)
+/* 0x2B */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AF, 0x2169, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP)
+/* 0x2C */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B0, 0x216A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK)
+/* 0x2D */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B1, 0x216B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK)
+/* 0x2E */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B2, 0x216C, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD)
+/* 0x2F */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B3, 0x216D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK)
+/* 0x30 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B4, 0x216E, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK)
+/* 0x31 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B5, 0x216F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT)
+/* 0x32 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B6, 0x2170, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK)
+/* 0x33 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B7, 0x2171, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK)
+/* 0x34 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B8, 0x2172, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK)
+/* 0x35 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B9, 0x2173, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK)
+/* 0x36 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21BA, 0x2174, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK)
diff --git a/include/tables/bombers_notebook/person_table.h b/include/tables/bombers_notebook/person_table.h
new file mode 100644
index 000000000..71771956b
--- /dev/null
+++ b/include/tables/bombers_notebook/person_table.h
@@ -0,0 +1,31 @@
+/**
+ * Bombers Notebook Person Table
+ *
+ * DEFINE_PERSON should be used for people with entries in the notebook
+ * - Argument 0: Enum value for this person
+ * - Argument 1: Photo texture for this person
+ * - Argument 2: Message id for the description of this person
+ * - Argument 3: Enum value for the event meeting this person
+ * - Argument 4: Message id for the event meeting this person
+ * - Argument 5: WeekEventFlag for the event meeting this person
+ */
+/* 0x00 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_BOMBERS, D_07009800, 0x21DD, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS, 0x2147, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS)
+/* 0x01 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ANJU, D_07000000, 0x21CA, BOMBERS_NOTEBOOK_EVENT_MET_ANJU, 0x2134, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU)
+/* 0x02 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_KAFEI, D_07000800, 0x21CB, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI, 0x2135, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI)
+/* 0x03 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_CURIOSITY_SHOP_MAN, D_07001000, 0x21CC, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN, 0x2136, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN)
+/* 0x04 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_BOMB_SHOP_LADY, D_07001800, 0x21CD, BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY, 0x2137, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY)
+/* 0x05 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ROMANI, D_07002000, 0x21CE, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI, 0x2138, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI)
+/* 0x06 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_CREMIA, D_07002800, 0x21CF, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA, 0x2139, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA)
+/* 0x07 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_MAYOR_DOTOUR, D_07003000, 0x21D0, BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR, 0x213A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR)
+/* 0x08 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_MADAME_AROMA, D_07003800, 0x21D1, BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA, 0x213B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA)
+/* 0x09 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_TOTO, D_07004000, 0x21D2, BOMBERS_NOTEBOOK_EVENT_MET_TOTO, 0x213C, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO)
+/* 0x0A */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GORMAN, D_07004800, 0x21D3, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN, 0x213D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN)
+/* 0x0B */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_POSTMAN, D_07005000, 0x21D4, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN, 0x213E, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN)
+/* 0x0C */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ROSA_SISTERS, D_07005800, 0x21D5, BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS, 0x213F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS)
+/* 0x0D */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_TOILET_HAND, D_07006000, 0x21D6, BOMBERS_NOTEBOOK_EVENT_MET_TOLIET_HAND, 0x2140, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND)
+/* 0x0E */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ANJUS_GRANDMOTHER, D_07006800, 0x21D7, BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER, 0x2141, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER)
+/* 0x0F */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_KAMARO, D_07007000, 0x21D8, BOMBERS_NOTEBOOK_EVENT_MET_KAMARO, 0x2142, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO)
+/* 0x10 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GROG, D_07007800, 0x21D9, BOMBERS_NOTEBOOK_EVENT_MET_GROG, 0x2143, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG)
+/* 0x11 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GORMAN_BROTHERS, D_07008000, 0x21DA, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS, 0x2144, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS)
+/* 0x12 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_SHIRO, D_07008800, 0x21DB, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO, 0x2145, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO)
+/* 0x13 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GURU_GURU, D_07009000, 0x21DC, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU, 0x2146, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU)
diff --git a/include/tables/scene_table.h b/include/tables/scene_table.h
new file mode 100644
index 000000000..ebd8cdb03
--- /dev/null
+++ b/include/tables/scene_table.h
@@ -0,0 +1,229 @@
+/**
+ * Scene Table
+ *
+ * DEFINE_SCENE should be used for non-empty scenes
+ * - Argument 0: Name of the scene segment in spec
+ * - Argument 1: Enum value for this scene
+ * - Argument 2: Title card's text id, or zero for no title card
+ * - Argument 3: Scene draw config index
+ * - Argument 4: Restriction flags. See `RESTRICTIONS_SET` on z_parameter.c
+ * - Argument 5: Persistent cycle flag set: bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ *
+ * DEFINE_SCENE_UNSET is needed to define empty entries from the original game
+ * - Argument 0: Enum value for this scene
+ */
+// Southern Swamp (Clear)
+/* 0x00 */ DEFINE_SCENE(Z2_20SICHITAI2, SCENE_20SICHITAI2, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+/* 0x01 */ DEFINE_SCENE_UNSET(SCENE_UNSET_01)
+/* 0x02 */ DEFINE_SCENE_UNSET(SCENE_UNSET_02)
+/* 0x03 */ DEFINE_SCENE_UNSET(SCENE_UNSET_03)
+/* 0x04 */ DEFINE_SCENE_UNSET(SCENE_UNSET_04)
+/* 0x05 */ DEFINE_SCENE_UNSET(SCENE_UNSET_05)
+/* 0x06 */ DEFINE_SCENE_UNSET(SCENE_UNSET_06)
+// Lone Peak Shrine & Grottos
+/* 0x07 */ DEFINE_SCENE(KAKUSIANA, SCENE_KAKUSIANA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 2) | (1 << 10) | (1 << 11)))
+// Cutscene Scene
+/* 0x08 */ DEFINE_SCENE(SPOT00, SCENE_SPOT00, 0, SCENE_DRAW_CFG_NOTHING, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x09 */ DEFINE_SCENE_UNSET(SCENE_UNSET_09)
+// Magic Hags' Potion Shop
+/* 0x0A */ DEFINE_SCENE(Z2_WITCH_SHOP, SCENE_WITCH_SHOP, 0x11A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Majora's Lair
+/* 0x0B */ DEFINE_SCENE(Z2_LAST_BS, SCENE_LAST_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Beneath the Graveyard
+/* 0x0C */ DEFINE_SCENE(Z2_HAKASHITA, SCENE_HAKASHITA, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Curiosity Shop
+/* 0x0D */ DEFINE_SCENE(Z2_AYASHIISHOP, SCENE_AYASHIISHOP, 0x10E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x0E */ DEFINE_SCENE_UNSET(SCENE_UNSET_0E)
+/* 0x0F */ DEFINE_SCENE_UNSET(SCENE_UNSET_0F)
+// Mama's House (Ranch House in PAL) & Barn
+/* 0x10 */ DEFINE_SCENE(Z2_OMOYA, SCENE_OMOYA, 0x132, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Honey & Darling's Shop
+/* 0x11 */ DEFINE_SCENE(Z2_BOWLING, SCENE_BOWLING, 0x108, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// The Mayor's Residence
+/* 0x12 */ DEFINE_SCENE(Z2_SONCHONOIE, SCENE_SONCHONOIE, 0x10B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Canyon
+/* 0x13 */ DEFINE_SCENE(Z2_IKANA, SCENE_IKANA, 0x141, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 1) | (1 << 30)))
+// Pirates' Fortress
+/* 0x14 */ DEFINE_SCENE(Z2_KAIZOKU, SCENE_KAIZOKU, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Milk Bar
+/* 0x15 */ DEFINE_SCENE(Z2_MILK_BAR, SCENE_MILK_BAR, 0x10C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower Temple
+/* 0x16 */ DEFINE_SCENE(Z2_INISIE_N, SCENE_INISIE_N, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Treasure Chest Shop
+/* 0x17 */ DEFINE_SCENE(Z2_TAKARAYA, SCENE_TAKARAYA, 0x109, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_SET(2, 0, 0, 0))
+// Inverted Stone Tower Temple
+/* 0x18 */ DEFINE_SCENE(Z2_INISIE_R, SCENE_INISIE_R, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Clock Tower Rooftop
+/* 0x19 */ DEFINE_SCENE(Z2_OKUJOU, SCENE_OKUJOU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Before Clock Town
+/* 0x1A */ DEFINE_SCENE(Z2_OPENINGDAN, SCENE_OPENINGDAN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3), 0, 0, 0))
+// Woodfall Temple
+/* 0x1B */ DEFINE_SCENE(Z2_MITURIN, SCENE_MITURIN, 0x11F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 12) | (1 << 13) | (1 << 15) | (1 << 20) | (1 << 21) | (1 << 22), 0, 0, 0))
+// Path to Mountain Village
+/* 0x1C */ DEFINE_SCENE(Z2_13HUBUKINOMITI, SCENE_13HUBUKINOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ancient Castle of Ikana
+/* 0x1D */ DEFINE_SCENE(Z2_CASTLE, SCENE_CASTLE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, (1 << 31), 0, (1 << 10)))
+// Deku Scrub Playground
+/* 0x1E */ DEFINE_SCENE(Z2_DEKUTES, SCENE_DEKUTES, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Odolwa's Lair
+/* 0x1F */ DEFINE_SCENE(Z2_MITURIN_BS, SCENE_MITURIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Town Shooting Gallery
+/* 0x20 */ DEFINE_SCENE(Z2_SYATEKI_MIZU, SCENE_SYATEKI_MIZU, 0x107, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Snowhead Temple
+/* 0x21 */ DEFINE_SCENE(Z2_HAKUGIN, SCENE_HAKUGIN, 0x12B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 5) | (1 << 21) | (1 << 23) | (1 << 24), 0, 0, 0))
+// Milk Road
+/* 0x22 */ DEFINE_SCENE(Z2_ROMANYMAE, SCENE_ROMANYMAE, 0x149, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Pirates' Fortress Interior
+/* 0x23 */ DEFINE_SCENE(Z2_PIRATE, SCENE_PIRATE, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 12)))
+// Swamp Shooting Gallery
+/* 0x24 */ DEFINE_SCENE(Z2_SYATEKI_MORI, SCENE_SYATEKI_MORI, 0x11B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Pinnacle Rock
+/* 0x25 */ DEFINE_SCENE(Z2_SINKAI, SCENE_SINKAI, 0x135, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Fairy's Fountain
+/* 0x26 */ DEFINE_SCENE(Z2_YOUSEI_IZUMI, SCENE_YOUSEI_IZUMI, 0x13E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Swamp Spider House
+/* 0x27 */ DEFINE_SCENE(Z2_KINSTA1, SCENE_KINSTA1, 0x11E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Oceanside Spider House
+/* 0x28 */ DEFINE_SCENE(Z2_KINDAN2, SCENE_KINDAN2, 0x13F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Astral Observatory
+/* 0x29 */ DEFINE_SCENE(Z2_TENMON_DAI, SCENE_TENMON_DAI, 0x114, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Deku Trial
+/* 0x2A */ DEFINE_SCENE(Z2_LAST_DEKU, SCENE_LAST_DEKU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Deku Palace
+/* 0x2B */ DEFINE_SCENE(Z2_22DEKUCITY, SCENE_22DEKUCITY, 0x118, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Mountain Smithy
+/* 0x2C */ DEFINE_SCENE(Z2_KAJIYA, SCENE_KAJIYA, 0x127, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Termina Field
+/* 0x2D */ DEFINE_SCENE(Z2_00KEIKOKU, SCENE_00KEIKOKU, 0x100, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4), 0, 0, 0))
+// Post Office
+/* 0x2E */ DEFINE_SCENE(Z2_POSTHOUSE, SCENE_POSTHOUSE, 0x111, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_SET(3, 0, 0, 0))
+// Marine Research Lab
+/* 0x2F */ DEFINE_SCENE(Z2_LABO, SCENE_LABO, 0x13A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Graveyard (Day 3) and Dampe's House
+/* 0x30 */ DEFINE_SCENE(Z2_DANPEI2TEST, SCENE_DANPEI2TEST, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+/* 0x31 */ DEFINE_SCENE_UNSET(SCENE_UNSET_31)
+// Goron Shrine
+/* 0x32 */ DEFINE_SCENE(Z2_16GORON_HOUSE, SCENE_16GORON_HOUSE, 0x124, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall
+/* 0x33 */ DEFINE_SCENE(Z2_33ZORACITY, SCENE_33ZORACITY, 0x136, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Trading Post
+/* 0x34 */ DEFINE_SCENE(Z2_8ITEMSHOP, SCENE_8ITEMSHOP, 0x10F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Romani Ranch
+/* 0x35 */ DEFINE_SCENE(Z2_F01, SCENE_F01, 0x12E, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Twinmold's Lair
+/* 0x36 */ DEFINE_SCENE(Z2_INISIE_BS, SCENE_INISIE_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Great Bay Coast
+/* 0x37 */ DEFINE_SCENE(Z2_30GYOSON, SCENE_30GYOSON, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 20), 0, 0, (1 << 1) | (1 << 5)))
+// Zora Cape
+/* 0x38 */ DEFINE_SCENE(Z2_31MISAKI, SCENE_31MISAKI, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, (1 << 7)))
+// Lottery Shop
+/* 0x39 */ DEFINE_SCENE(Z2_TAKARAKUJI, SCENE_TAKARAKUJI, 0x112, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x3A */ DEFINE_SCENE_UNSET(SCENE_UNSET_3A)
+// Pirates' Fortress Moat
+/* 0x3B */ DEFINE_SCENE(Z2_TORIDE, SCENE_TORIDE, 0x138, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Fisherman's Hut
+/* 0x3C */ DEFINE_SCENE(Z2_FISHERMAN, SCENE_FISHERMAN, 0x13B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Shop
+/* 0x3D */ DEFINE_SCENE(Z2_GORONSHOP, SCENE_GORONSHOP, 0x129, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku King's Chamber
+/* 0x3E */ DEFINE_SCENE(Z2_DEKU_KING, SCENE_DEKU_KING, 0x11C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Goron Trial
+/* 0x3F */ DEFINE_SCENE(Z2_LAST_GORON, SCENE_LAST_GORON, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Road to Southern Swamp
+/* 0x40 */ DEFINE_SCENE(Z2_24KEMONOMITI, SCENE_24KEMONOMITI, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 1) | (1 << 31)))
+// Doggy Racetrack
+/* 0x41 */ DEFINE_SCENE(Z2_F01_B, SCENE_F01_B, 0x130, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Cucco Shack
+/* 0x42 */ DEFINE_SCENE(Z2_F01C, SCENE_F01C, 0x12F, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Graveyard
+/* 0x43 */ DEFINE_SCENE(Z2_BOTI, SCENE_BOTI, 0x106, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goht's Lair
+/* 0x44 */ DEFINE_SCENE(Z2_HAKUGIN_BS, SCENE_HAKUGIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Southern Swamp (poison)
+/* 0x45 */ DEFINE_SCENE(Z2_20SICHITAI, SCENE_20SICHITAI, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+// Woodfall
+/* 0x46 */ DEFINE_SCENE(Z2_21MITURINMAE, SCENE_21MITURINMAE, 0x117, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0x102, 0, 0, (1 << 10)))
+// Moon Zora Trial
+/* 0x47 */ DEFINE_SCENE(Z2_LAST_ZORA, SCENE_LAST_ZORA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Goron Village (spring)
+/* 0x48 */ DEFINE_SCENE(Z2_11GORONNOSATO2, SCENE_11GORONNOSATO2, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Great Bay Temple
+/* 0x49 */ DEFINE_SCENE(Z2_SEA, SCENE_SEA, 0x13D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4) | (1 << 5) | (1 << 6), 0, 0, 0))
+// Waterfall Rapids
+/* 0x4A */ DEFINE_SCENE(Z2_35TAKI, SCENE_35TAKI, 0x137, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Well
+/* 0x4B */ DEFINE_SCENE(Z2_REDEAD, SCENE_REDEAD, 0x145, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall Rooms
+/* 0x4C */ DEFINE_SCENE(Z2_BANDROOM, SCENE_BANDROOM, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Village (winter)
+/* 0x4D */ DEFINE_SCENE(Z2_11GORONNOSATO, SCENE_11GORONNOSATO, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Graveyard
+/* 0x4E */ DEFINE_SCENE(Z2_GORON_HAKA, SCENE_GORON_HAKA, 0x12A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Sakon's Hideout
+/* 0x4F */ DEFINE_SCENE(Z2_SECOM, SCENE_SECOM, 0x143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Mountain Village (winter)
+/* 0x50 */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA, SCENE_10YUKIYAMANOMURA, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Ghost Hut
+/* 0x51 */ DEFINE_SCENE(Z2_TOUGITES, SCENE_TOUGITES, 0x146, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku Shrine
+/* 0x52 */ DEFINE_SCENE(Z2_DANPEI, SCENE_DANPEI, 0x120, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Road to Ikana
+/* 0x53 */ DEFINE_SCENE(Z2_IKANAMAE, SCENE_IKANAMAE, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Swordsman's School
+/* 0x54 */ DEFINE_SCENE(Z2_DOUJOU, SCENE_DOUJOU, 0x110, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Music Box House
+/* 0x55 */ DEFINE_SCENE(Z2_MUSICHOUSE, SCENE_MUSICHOUSE, 0x147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Igos du Ikana's Lair
+/* 0x56 */ DEFINE_SCENE(Z2_IKNINSIDE, SCENE_IKNINSIDE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Tourist Information
+/* 0x57 */ DEFINE_SCENE(Z2_MAP_SHOP, SCENE_MAP_SHOP, 0x119, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower
+/* 0x58 */ DEFINE_SCENE(Z2_F40, SCENE_F40, 0x140, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Inverted Stone Tower
+/* 0x59 */ DEFINE_SCENE(Z2_F41, SCENE_F41, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Mountain Village (spring)
+/* 0x5A */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA2, SCENE_10YUKIYAMANOMURA2, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Path to Snowhead
+/* 0x5B */ DEFINE_SCENE(Z2_14YUKIDAMANOMITI, SCENE_14YUKIDAMANOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 8)))
+// Snowhead
+/* 0x5C */ DEFINE_SCENE(Z2_12HAKUGINMAE, SCENE_12HAKUGINMAE, 0x125, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Path to Goron Village (winter)
+/* 0x5D */ DEFINE_SCENE(Z2_17SETUGEN, SCENE_17SETUGEN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Path to Goron Village (spring)
+/* 0x5E */ DEFINE_SCENE(Z2_17SETUGEN2, SCENE_17SETUGEN2, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Gyorg's Lair
+/* 0x5F */ DEFINE_SCENE(Z2_SEA_BS, SCENE_SEA_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Secret Shrine
+/* 0x60 */ DEFINE_SCENE(Z2_RANDOM, SCENE_RANDOM, 0x12C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// Stock Pot Inn
+/* 0x61 */ DEFINE_SCENE(Z2_YADOYA, SCENE_YADOYA, 0x10A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Great Bay Cutscene
+/* 0x62 */ DEFINE_SCENE(Z2_KONPEKI_ENT, SCENE_KONPEKI_ENT, 0x139, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Clock Tower Interior
+/* 0x63 */ DEFINE_SCENE(Z2_INSIDETOWER, SCENE_INSIDETOWER, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(1 << 0, 0, 0, 0))
+// Woods of Mystery
+/* 0x64 */ DEFINE_SCENE(Z2_26SARUNOMORI, SCENE_26SARUNOMORI, 0x11D, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Lost Woods (Intro)
+/* 0x65 */ DEFINE_SCENE(Z2_LOST_WOODS, SCENE_LOST_WOODS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Link Trial
+/* 0x66 */ DEFINE_SCENE(Z2_LAST_LINK, SCENE_LAST_LINK, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// The Moon
+/* 0x67 */ DEFINE_SCENE(Z2_SOUGEN, SCENE_SOUGEN, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_NONE)
+// Bomb Shop
+/* 0x68 */ DEFINE_SCENE(Z2_BOMYA, SCENE_BOMYA, 0x10D, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Giants' Chamber
+/* 0x69 */ DEFINE_SCENE(Z2_KYOJINNOMA, SCENE_KYOJINNOMA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Gorman Track
+/* 0x6A */ DEFINE_SCENE(Z2_KOEPONARACE, SCENE_KOEPONARACE, 0x131, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Racetrack
+/* 0x6B */ DEFINE_SCENE(Z2_GORONRACE, SCENE_GORONRACE, 0x126, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// East Clock Town
+/* 0x6C */ DEFINE_SCENE(Z2_TOWN, SCENE_TOWN, 0x101, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(1, 0, 0, 0))
+// West Clock Town
+/* 0x6D */ DEFINE_SCENE(Z2_ICHIBA, SCENE_ICHIBA, 0x102, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// North Clock Town
+/* 0x6E */ DEFINE_SCENE(Z2_BACKTOWN, SCENE_BACKTOWN, 0x103, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// South Clock Town
+/* 0x6F */ DEFINE_SCENE(Z2_CLOCKTOWER, SCENE_CLOCKTOWER, 0x104, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 10)))
+// Laundry Pool
+/* 0x70 */ DEFINE_SCENE(Z2_ALLEY, SCENE_ALLEY, 0x105, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 1, 0))
diff --git a/include/tables/transition_table.h b/include/tables/transition_table.h
new file mode 100644
index 000000000..d623d76bb
--- /dev/null
+++ b/include/tables/transition_table.h
@@ -0,0 +1,21 @@
+/**
+ * Transition Table
+ *
+ * DEFINE_TRANSITION should be used for normal transitions
+ * - Argument 0: Enum value for this transition
+ * - Argument 1: Name of the effect struct
+ * - Argument 2: Instance name
+ * - Argument 3: Name of the effect (without the ovl_ part)
+ *
+ * DEFINE_TRANSITION_INTERNAL should be used for transitions that aren't an overlay
+ * - Argument 0: Enum value for this transition
+ * - Argument 1: Name of the effect struct
+ * - Argument 2: Instance name
+ */
+/* 0 */ DEFINE_TRANSITION_INTERNAL(FBDEMO_FADE, TransitionFade, fade)
+/* 1 */ DEFINE_TRANSITION(FBDEMO_TRIFORCE, TransitionTriforce, triforce, fbdemo_triforce)
+/* 2 */ DEFINE_TRANSITION(FBDEMO_WIPE1, TransitionWipe1, wipe1, fbdemo_wipe1)
+/* 3 */ DEFINE_TRANSITION(FBDEMO_WIPE3, TransitionWipe3, wipe3, fbdemo_wipe3)
+/* 4 */ DEFINE_TRANSITION(FBDEMO_WIPE4, TransitionWipe4, wipe4, fbdemo_wipe4)
+/* 5 */ DEFINE_TRANSITION_INTERNAL(FBDEMO_CIRCLE, TransitionCircle, circle)
+/* 6 */ DEFINE_TRANSITION(FBDEMO_WIPE5, TransitionWipe5, wipe5, fbdemo_wipe5)
diff --git a/include/ultra64/message.h b/include/ultra64/message.h
index a049ae363..de0c39b83 100644
--- a/include/ultra64/message.h
+++ b/include/ultra64/message.h
@@ -1,5 +1,5 @@
-#ifndef _ULTRA64_MESSAGE_H_
-#define _ULTRA64_MESSAGE_H_
+#ifndef ULTRA64_MESSAGE_H
+#define ULTRA64_MESSAGE_H
#include "ultra64/thread.h"
diff --git a/include/ultra64/motor.h b/include/ultra64/motor.h
index ad6828132..ed969b3de 100644
--- a/include/ultra64/motor.h
+++ b/include/ultra64/motor.h
@@ -5,13 +5,14 @@
#include "PR/pfs.h"
#include "ultra64/message.h"
-#define MOTOR_START 1
-#define MOTOR_STOP 0
+#define MOTOR_START 1
+#define MOTOR_STOP 0
-#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
-#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)
+#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
+#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)
-s32 __osMotorAccess(OSPfs* pfs, u32 vibrate);
-s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel);
+s32 __osMotorAccess(OSPfs* pfs, s32 flag);
+
+s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, s32 channel);
#endif
diff --git a/include/ultra64/rcp.h b/include/ultra64/rcp.h
index 6bd778ccf..7a336be28 100644
--- a/include/ultra64/rcp.h
+++ b/include/ultra64/rcp.h
@@ -11,4 +11,12 @@
#define DEVICE_TYPE_SRAM 3 /* SRAM */
#define DEVICE_TYPE_INIT 7 /* initial value */
+
+#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */
+#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */
+#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */
+#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */
+
+#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */
+
#endif
diff --git a/include/ultra64/thread.h b/include/ultra64/thread.h
index f3cd68890..62cbdcd1b 100644
--- a/include/ultra64/thread.h
+++ b/include/ultra64/thread.h
@@ -54,16 +54,16 @@ typedef struct {
} __OSThreadprofile; // size = 0x10
typedef struct OSThread {
- /*0x00*/ struct OSThread* next;
- /*0x04*/ OSPri priority;
- /*0x08*/ struct OSThread** queue;
- /*0x0C*/ struct OSThread* tlnext;
- /*0x10*/ u16 state;
- /*0x12*/ u16 flags;
- /*0x14*/ OSId id;
- /*0x18*/ s32 fp;
- /*0x1C*/ __OSThreadprofile* thprof;
- /*0x20*/ __OSThreadContext context;
+ /* 0x00 */ struct OSThread* next;
+ /* 0x04 */ OSPri priority;
+ /* 0x08 */ struct OSThread** queue;
+ /* 0x0C */ struct OSThread* tlnext;
+ /* 0x10 */ u16 state;
+ /* 0x12 */ u16 flags;
+ /* 0x14 */ OSId id;
+ /* 0x18 */ s32 fp;
+ /* 0x1C */ __OSThreadprofile* thprof;
+ /* 0x20 */ __OSThreadContext context;
} OSThread; // size = 0x1B0
#endif
diff --git a/include/ultra64/viint.h b/include/ultra64/viint.h
new file mode 100644
index 000000000..4fea2259a
--- /dev/null
+++ b/include/ultra64/viint.h
@@ -0,0 +1,37 @@
+#ifndef ULTRA64_VIINT_H
+#define ULTRA64_VIINT_H
+
+#define VI_STATE_MODE_SET (1 << 0)
+#define VI_STATE_XSCALE_SET (1 << 1)
+#define VI_STATE_YSCALE_FACTOR_SET (1 << 2)
+#define VI_STATE_CTRL_SET (1 << 3)
+#define VI_STATE_BUFFER_SET (1 << 4)
+#define VI_STATE_BLACK (1 << 5)
+#define VI_STATE_REPEATLINE (1 << 6)
+#define VI_STATE_FADE (1 << 7)
+
+#define VI_SCALE_MASK 0xFFF
+#define VI_2_10_FPART_MASK 0x3FF
+#define VI_SUBPIXEL_SH 0x10
+
+// For use in initializing OSViMode structures
+
+#define BURST(hsync_width, color_width, vsync_width, color_start) \
+ (hsync_width | (color_width << 8) | (vsync_width << 16) | (color_start << 20))
+#define WIDTH(v) v
+#define VSYNC(v) v
+#define HSYNC(duration, leap) (duration | (leap << 16))
+#define LEAP(upper, lower) ((upper << 16) | lower)
+#define START(start, end) ((start << 16) | end)
+
+#define FTOFIX(val, i, f) ((u32)(val * (f32)(1 << f)) & ((1 << (i + f)) - 1))
+
+#define F210(val) FTOFIX(val, 2, 10)
+#define SCALE(scaleup, off) (F210((1.0f / (f32)scaleup)) | (F210((f32)off) << 16))
+
+#define VCURRENT(v) v
+#define ORIGIN(v) v
+#define VINTR(v) v
+#define HSTART START
+
+#endif
diff --git a/include/variables.h b/include/variables.h
index 745c019a8..108fa5833 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -37,8 +37,7 @@ extern FaultDrawer* sFaultDrawContext;
extern FaultDrawer sFaultDrawerDefault;
extern s32 gLoadLogSeverity;
extern s32 gLoad2LogSeverity;
-extern StackEntry* sStackInfoListStart;
-extern StackEntry* sStackInfoListEnd;
+
// extern UNK_TYPE1 sGfxPrintFontTLUT;
// extern UNK_TYPE1 sGfxPrintRainbowTLUT;
// extern UNK_TYPE1 sGfxPrintRainbowData;
@@ -385,23 +384,6 @@ extern BgCheckSceneSubdivisionEntry sSceneSubdivisionList[];
extern BgSpecialSceneMaxObjects sCustomDynapolyMem[];
// extern UNK_TYPE1 D_801B4708;
-// extern UNK_TYPE4 D_801B9E0C;
-// extern UNK_TYPE4 D_801B9E10;
-// extern UNK_TYPE4 D_801B9E14;
-// extern UNK_TYPE2 D_801B9E18;
-// extern UNK_TYPE2 D_801B9E34;
-// extern UNK_TYPE4 D_801B9E50;
-// extern UNK_TYPE4 D_801B9E54;
-// extern UNK_TYPE4 D_801B9E58;
-// extern UNK_TYPE4 D_801B9E5C;
-// extern UNK_TYPE4 D_801B9E60;
-// extern UNK_TYPE1 D_801B9E64;
-// extern UNK_TYPE1 D_801B9E84;
-// extern UNK_TYPE4 D_801B9EB4;
-// extern UNK_TYPE4 D_801B9ED4;
-// extern UNK_TYPE4 sEarthquakeFreq;
-// extern UNK_TYPE2 sEarthquakeTimer;
-extern UNK_TYPE4 D_801B9F10;
extern DamageTable sDamageTablePresets[23];
extern f32 damageMultipliers[16];
extern Collider defaultCollider;
@@ -432,36 +414,12 @@ extern EffectShieldParticleInit shieldParticleInitWood;
// extern UNK_TYPE2 D_801BB0FC;
// extern UNK_TYPE1 D_801BB100;
-extern u8 D_801BB12C;
+extern u8 gOpeningEntranceIndex;
-// extern UNK_TYPE1 D_801BC41E;
-extern ActorCutscene actorCutscenesGlobalCutscenes[8];
-extern s16 actorCutsceneCurrent;
-extern s16 actorCutsceneCurrentLength;
-extern s16 actorCutsceneEnding;
-extern s16 actorCutsceneCurrentCamera;
-extern Actor* actorCutsceneCurrentCutsceneActor;
-// extern UNK_TYPE4 actorCutsceneStartMethod;
-extern PlayState* actorCutscenesPlayState;
-extern s16 actorCutsceneReturnCamera;
-extern s16 D_801BD8C6;
+extern ActorCutscene sGlobalCutsceneList[8];
extern GameStateOverlay gGameStateOverlayTable[];
extern s32 gGraphNumGameStates;
-// extern UNK_TYPE2 D_801BDA70;
-// extern UNK_TYPE2 D_801BDA74;
-// extern UNK_TYPE2 D_801BDA78;
-// extern UNK_TYPE2 D_801BDA7C;
-extern s32 D_801BDA9C;
-extern UNK_TYPE4 D_801BDAA0;
-extern s32 D_801BDAA4;
-// extern UNK_TYPE2 D_801BDAA8;
-// extern UNK_TYPE2 D_801BDAAA;
-// extern UNK_TYPE2 D_801BDAAC;
-// extern UNK_TYPE2 D_801BDAAE;
-// extern UNK_TYPE2 D_801BDAB0;
-// extern UNK_TYPE2 D_801BDAB2;
-// extern UNK_TYPE2 D_801BDAB4;
-// extern UNK_TYPE2 D_801BDAB6;
+
// extern UNK_TYPE4 D_801BDAC0;
// extern UNK_TYPE4 D_801BDAC4;
// extern UNK_TYPE4 D_801BDAC8;
@@ -501,30 +459,6 @@ extern u8 D_801BDBC8;
// extern UNK_TYPE1 D_801BE92C;
// extern UNK_TYPE1 D_801BE944;
// extern actor_init_var_func sInitChainHandlers[11];
-// extern UNK_TYPE2 sHeartsPrimColors;
-// extern UNK_TYPE2 D_801BE992;
-// extern UNK_TYPE2 D_801BE994;
-// extern UNK_TYPE2 sHeartsEnvColors;
-// extern UNK_TYPE2 D_801BE9A6;
-// extern UNK_TYPE2 D_801BE9A8;
-// extern UNK_TYPE2 sHeartsPrimFactors;
-// extern UNK_TYPE2 sHeartsEnvFactors;
-// extern UNK_TYPE2 sHeartsDDPrimColors;
-// extern UNK_TYPE2 D_801BE9E2;
-// extern UNK_TYPE2 D_801BE9E4;
-// extern UNK_TYPE2 sHeartsDDEnvColors;
-// extern UNK_TYPE2 D_801BE9F6;
-// extern UNK_TYPE2 D_801BE9F8;
-// extern UNK_TYPE2 sHeartsDDPrimFactors;
-// extern UNK_TYPE2 D_801BEA0A;
-// extern UNK_TYPE2 D_801BEA0C;
-// extern UNK_TYPE2 sHeartsDDEnvFactors;
-// extern UNK_TYPE2 D_801BEA1E;
-// extern UNK_TYPE2 D_801BEA20;
-// extern UNK_TYPE1 HeartTextures;
-// extern UNK_TYPE1 HeartDDTextures;
-//extern LightsPosBindFunc posBindFuncs[3];
-//extern LightsBindFunc dirBindFuncs[3];
// extern UNK_TYPE4 D_801BEAD4;
// extern UNK_TYPE4 D_801BEAD8;
// extern UNK_TYPE1 D_801BEAE0;
@@ -589,9 +523,6 @@ extern struct_80124618 D_801C0490[];
extern Gfx gCullBackDList[];
extern Gfx gCullFrontDList[];
-extern Gfx sSetupDL[438];
-extern Gfx sFillSetupDL[12];
-extern Gfx gEmptyDL[1];
extern u32 gBitFlags[32];
extern u16 gEquipMasks[];
extern u16 gEquipNegMasks[];
@@ -612,7 +543,7 @@ extern s16 gPlayerFormObjectIndices[PLAYER_FORM_MAX];
extern ObjectId gObjectTableSize;
extern RomFile gObjectTable[OBJECT_ID_MAX];
-extern SceneTableEntry gSceneTable[];
+extern SceneTableEntry gSceneTable[SCENE_MAX];
extern UNK_PTR D_801C5C50;
// extern UNK_TYPE1 D_801C5C9C;
extern UNK_PTR D_801C5CB0;
@@ -631,9 +562,7 @@ extern UNK_PTR D_801C5CB0;
// extern UNK_TYPE2 D_801C6A8C;
// extern UNK_TYPE2 D_801C6A90;
// extern UNK_TYPE2 D_801C6A94;
-extern u8 D_801C6A98[5][5];
-// extern UNK_TYPE1 D_801C6AB8;
-// extern UNK_TYPE1 D_801C6B28;
+extern u8 gPageSwitchNextButtonStatus[6][5];
// extern UNK_TYPE1 D_801CED40;
// extern UNK_TYPE2 D_801CFC78;
// extern UNK_TYPE1 D_801CFC7A;
@@ -757,7 +686,6 @@ extern char D_801D039C[];
extern KaleidoMgrOverlay gKaleidoMgrOverlayTable[2];
// extern UNK_TYPE1 D_801D0B8C;
extern KaleidoMgrOverlay* gKaleidoMgrCurOvl;
-// extern UNK_TYPE4 D_801D0BB0;
// extern UNK_TYPE1 D_801D0C80;
// extern UNK_TYPE1 D_801D0CB0;
extern s32 gDbgCamEnabled;
@@ -765,70 +693,16 @@ extern s32 gDbgCamEnabled;
// extern UNK_TYPE2 sQuakeIndex;
// extern UNK_TYPE2 sIsCameraUnderwater;
extern Input* D_801D0D60;
-// extern UNK_TYPE2 D_801D0D64;
+// extern UNK_TYPE2 sPlayerCsIdToCsCamId;
// extern UNK_TYPE1 D_801D0D7A;
-// extern UNK_TYPE1 D_801D0D80;
-// extern UNK_TYPE1 D_801D11F4;
-// extern UNK_TYPE1 D_801D1230;
-// extern UNK_TYPE1 D_801D1234;
-// extern UNK_TYPE4 D_801D1238;
-// extern UNK_TYPE1 D_801D1244;
-// extern UNK_TYPE1 D_801D12C0;
-// extern UNK_TYPE1 D_801D12D0;
-// extern UNK_TYPE1 D_801D12D4;
-// extern UNK_TYPE1 D_801D12D8;
-// extern UNK_TYPE1 D_801D12DC;
-// extern UNK_TYPE2 D_801D1330;
-// extern UNK_TYPE1 D_801D1342;
-// extern UNK_TYPE2 D_801D1344;
-// extern UNK_TYPE1 D_801D1368;
-// extern UNK_TYPE2 D_801D1374;
-// extern UNK_TYPE1 D_801D1388;
-// extern UNK_TYPE2 D_801D13D8;
-// extern UNK_TYPE2 D_801D13DC;
-// extern UNK_TYPE2 D_801D13E0;
-// extern UNK_TYPE2 D_801D13E4;
-// extern UNK_TYPE4 D_801D13E8;
-// extern UNK_TYPE1 D_801D13EC;
-// extern UNK_TYPE1 D_801D13F0;
-// extern UNK_TYPE1 D_801D13F4;
-// extern UNK_TYPE1 D_801D13F8;
-// extern UNK_TYPE1 D_801D1420;
-// extern UNK_TYPE2 D_801D142C;
-// extern UNK_TYPE2 D_801D1434;
-// extern UNK_TYPE2 D_801D1438;
-// extern UNK_TYPE2 D_801D143C;
-// extern UNK_TYPE2 D_801D1440;
-// extern UNK_TYPE2 D_801D1444;
-// extern UNK_TYPE2 D_801D1448;
-// extern UNK_TYPE2 D_801D144C;
-// extern UNK_TYPE2 D_801D1450;
-// extern UNK_TYPE2 D_801D1454;
-// extern UNK_TYPE2 D_801D1458;
-// extern UNK_TYPE2 D_801D145C;
-// extern UNK_TYPE2 D_801D1460;
-// extern UNK_TYPE1 D_801D1464;
-// extern UNK_TYPE1 D_801D1468;
-// extern UNK_TYPE1 D_801D146C;
-// extern UNK_TYPE2 D_801D14DC;
-// extern UNK_TYPE2 D_801D14E0;
-// extern UNK_TYPE2 D_801D14E4;
-// extern UNK_TYPE2 D_801D14E8;
// extern UNK_TYPE4 D_801D14F0;
-extern s32 gFramerateDivisor;
-extern f32 gFramerateDivisorF;
-extern f32 gFramerateDivisorHalf;
-extern f32 gFramerateDivisorThird;
+
extern u32 retryCount;
extern u32 cfbIdx[3];
extern s32 gScreenWidth;
extern s32 gScreenHeight;
extern u32 startHeapSize;
-extern PadMgr* padmgrContext;
-// extern UNK_TYPE4 controllerInputsCaptured;
-// extern UNK_TYPE4 D_801D1538;
extern UNK_PTR D_801D1540;
-// extern f32 sFactorialTbl[13];
extern Vec3f gZeroVec3f;
extern Vec3s gZeroVec3s;
@@ -1640,10 +1514,6 @@ extern f32 D_801DD774;
extern f32 D_801DD780;
extern f32 D_801DD7B0;
extern f32 D_801DD7C0;
-extern f32 D_801DD7E0;
-extern f32 D_801DD7E4;
-extern f32 D_801DD7E8;
-extern f32 D_801DD7EC;
// extern UNK_TYPE2 D_801DD880;
// extern UNK_TYPE1 D_801DD8E0;
// extern UNK_TYPE4 D_801DD900;
@@ -2252,14 +2122,14 @@ extern f32 D_801ED8D0;
// extern UNK_TYPE1 D_801ED8D8;
// extern UNK_TYPE1 D_801ED8DC;
extern Mtx D_801ED8E0;
-// extern UNK_TYPE1 D_801ED920;
+extern Actor* D_801ED920;
extern FaultClient sActorOverlayTableFaultClient;
extern FaultAddrConvClient sActorOverlayTableFaultAddrConvClient;
extern char D_801ED950[80];
extern char D_801ED9A0[80];
extern Vec3f D_801ED9F0[3];
extern Vec3f D_801EDA18[3];
-extern MtxF D_801EDA40;
+extern MtxF sModelToWorldMtxF;
extern Vec3f D_801EDA80[3];
extern char D_801EDAA8[80];
extern char D_801EDAF8[80];
@@ -2268,20 +2138,6 @@ extern Vec3f D_801EDB70[3];
extern Plane D_801EDB98;
extern Sphere16 D_801EDBA8;
extern TriNorm D_801EDBB0;
-// extern UNK_TYPE1 D_801EDBD4;
-// extern UNK_TYPE1 D_801EDBD8;
-// extern UNK_TYPE1 D_801EDBDC;
-// extern UNK_TYPE1 D_801EDBE0;
-
-// extern s16 D_801EDBF0;
-// extern f32 D_801EDBF4;
-// extern f32 D_801EDBF8;
-// extern CameraCollision D_801EDC00;
-// extern PlayState* sCamPlayState;
-// extern SwingAnimation D_801EDC30[4];
-// extern Vec3f D_801EDDD0;
-// extern Vec3f D_801EDDE0;
-// extern Vec3f D_801EDDF0;
extern Vec3f D_801EDE00;
extern Vec3f D_801EDE10;
@@ -2336,14 +2192,14 @@ extern SaveContext gSaveContext;
// extern UNK_TYPE1 D_801F48C8;
extern UNK_TYPE D_801F4DDC;
-extern u8 D_801F4DE0;
-extern s16 D_801F4DE2;
+extern u8 gDisablePlayerCsModeStartPos;
+extern s16 gDungeonBossWarpSceneId;
-extern ActorCutscene* actorCutscenes;
-extern s16 actorCutsceneCount;
-extern u8 actorCutsceneWaiting[16];
+extern ActorCutscene* sSceneCutsceneList;
+extern s16 sSceneCutsceneCount;
+extern u8 sWaitingCutsceneList[16];
// extern UNK_TYPE1 D_801F4E08;
-extern u8 actorCutsceneNextCutscenes[16];
+extern u8 sNextCutsceneList[16];
// extern UNK_TYPE1 D_801F4E20;
extern u8 D_801F4E30;
// extern UNK_TYPE1 D_801F4E31;
@@ -2421,7 +2277,7 @@ extern s16 D_801F4E7A;
// extern UNK_TYPE1 D_801F6B1E;
// extern UNK_TYPE1 D_801F6B20;
// extern UNK_TYPE1 D_801F6B22;
-// extern UNK_TYPE4 D_801F6B50;
+// extern UNK_TYPE4 sCurCsCamera;
// extern UNK_TYPE1 D_801F6B58;
extern void (*sKaleidoScopeUpdateFunc)(PlayState* play);
extern void (*sKaleidoScopeDrawFunc)(PlayState* play);
@@ -2440,9 +2296,9 @@ extern u8 sMotionBlurStatus;
extern UNK_TYPE1 D_801F7FF0;
extern struct_801F8010 D_801F8010;
-extern struct_801F8020 D_801F8020;
+extern VisZbuf sVisZbuf;
extern VisMono sMonoColors;
-extern UNK_TYPE1 D_801F8048;
+extern ViMode D_801F8048;
extern FaultAddrConvClient sGraphFaultAddrConvClient;
extern FaultClient sGraphFaultClient;
extern GfxMasterList* gGfxMasterDL;
@@ -2451,8 +2307,8 @@ extern OSTime sGraphTaskStartTime;
extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext;
+
extern OSThread gGraphThread;
-extern PadMgr gPadMgr;
extern FaultClient sSchedFaultClient;
extern OSTime sRSPGFXStartTime;
@@ -2471,30 +2327,32 @@ extern volatile OSTime sRSPOtherTotalTime;
// extern UNK_TYPE1 D_801FBB18;
extern volatile OSTime gRDPTotalTime;
// extern UNK_TYPE1 D_801FBB28;
-extern OSViMode D_801FBB30;
-extern u32* gFramebuffers[2];
-extern OSViMode* D_801FBB88;
+
+extern OSViMode sNotebookViMode;
+extern void* gFramebuffers[2];
+extern OSViMode* gActiveViMode;
extern u16* gZBufferPtr;
-extern void* D_801FBB90;
+extern void* gWorkBuffer;
extern u64* gGfxSPTaskOutputBufferPtr;
-extern size_t gGfxSPTaskOutputBufferSize;
-// extern UNK_TYPE1 D_801FBB9C;
-// extern UNK_TYPE1 D_801FBBA0;
-extern u16 (*gZBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u16 (*gWorkBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u64 (*gGfxSPTaskOutputBuffer)[0x3000];
extern void* gGfxSPTaskOutputBufferEnd;
-// extern UNK_TYPE1 D_801FBBB4;
-// extern UNK_TYPE1 D_801FBBB8;
-// extern UNK_TYPE1 D_801FBBBC;
-// extern UNK_TYPE1 D_801FBBC0;
-extern u64 (*gGfxSPTaskOutputBuffer2)[0x3000];
-extern void* gGfxSPTaskOutputBufferEnd2;
-extern UNK_TYPE2 D_801FBBCC;
-extern UNK_TYPE2 D_801FBBCE;
-// extern UNK_TYPE1 D_801FBBD0;
-// extern UNK_TYPE1 D_801FBBD2;
-extern u8 D_801FBBD4;
+extern void* sCfbLoRes1;
+extern void* sCfbLoRes0;
+extern u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndLoRes;
+extern void* sCfbHiRes1;
+extern void* sCfbHiRes0;
+extern u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndHiRes;
+extern s16 gCfbWidth;
+extern s16 gCfbHeight;
+extern s16 gCfbLeftAdjust;
+extern s16 gCfbUpperAdjust;
+extern u8 gSysCfbHiResEnabled;
+
extern Vec3f D_801FBBF0;
extern LineSegment Math3D_ColSphereTri_line;
extern Vec3f Math3D_ColSphereTri_point;
@@ -2658,7 +2516,7 @@ extern s32 D_801FD120;
// extern UNK_TYPE1 D_801FD598;
// extern UNK_TYPE1 D_801FD5A0;
// extern UNK_TYPE1 D_801FD5A4;
-// extern UNK_TYPE1 D_801FD5B8;
+extern OSVoiceHandle gVoiceHandle;
// extern UNK_TYPE1 D_801FD5C4;
// extern UNK_TYPE1 D_801FD5C8;
// extern UNK_TYPE1 D_801FD5E8;
diff --git a/include/z64.h b/include/z64.h
index b91333288..641a060b4 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -14,6 +14,7 @@
#include "osint.h"
#include "os.h"
#include "irqmgr.h"
+#include "padmgr.h"
#include "scheduler.h"
#include "xstdio.h"
@@ -24,14 +25,17 @@
#include "sfx.h"
#include "message_data_static.h"
+#include "gfx.h"
#include "gfxprint.h"
#include "sys_matrix.h"
#include "tha.h"
#include "thga.h"
#include "z64actor.h"
#include "z64animation.h"
+#include "z64animation_legacy.h"
#include "z64audio.h"
#include "z64bgcheck.h"
+#include "z64bombers_notebook.h"
#include "z64camera.h"
#include "z64collision_check.h"
#include "z64curve.h"
@@ -41,6 +45,7 @@
#include "z64effect.h"
#include "z64frameadvance.h"
#include "z64game_over.h"
+#include "z64game.h"
#include "z64interface.h"
#include "z64item.h"
#include "z64light.h"
@@ -65,6 +70,7 @@
#define Z_THREAD_ID_MAIN 3
#define Z_THREAD_ID_GRAPH 4
#define Z_THREAD_ID_SCHED 5
+#define Z_THREAD_ID_FLASHROM 13
#define Z_THREAD_ID_DMAMGR 18
#define Z_THREAD_ID_IRQMGR 19
@@ -73,32 +79,21 @@
#define Z_PRIORITY_AUDIOMGR 11
#define Z_PRIORITY_IDLE 12
#define Z_PRIORITY_MAIN 12
+#define Z_PRIORITY_FLASHROM 13
#define Z_PRIORITY_PADMGR 15
#define Z_PRIORITY_SCHED 16
#define Z_PRIORITY_DMAMGR 17
#define Z_PRIORITY_IRQMGR 18
typedef enum {
- /* 0 */ EQUIP_SLOT_B,
- /* 1 */ EQUIP_SLOT_C_LEFT,
- /* 2 */ EQUIP_SLOT_C_DOWN,
- /* 3 */ EQUIP_SLOT_C_RIGHT,
- /* 4 */ EQUIP_SLOT_A
+ /* -1 */ EQUIP_SLOT_NONE = -1,
+ /* 0 */ EQUIP_SLOT_B,
+ /* 1 */ EQUIP_SLOT_C_LEFT,
+ /* 2 */ EQUIP_SLOT_C_DOWN,
+ /* 3 */ EQUIP_SLOT_C_RIGHT,
+ /* 4 */ EQUIP_SLOT_A
} EquipSlot;
-typedef struct {
- /* 0x0 */ s16 priority; // Lower means higher priority. -1 means it ignores priority
- /* 0x2 */ s16 length;
- /* 0x4 */ s16 csCamSceneDataId; // Index of CsCameraEntry to use. Negative indices use sGlobalCamDataSettings. Indices 0 and above use CsCameraEntry from scene
- /* 0x6 */ s16 unk6;
- /* 0x8 */ s16 additionalCutscene;
- /* 0xA */ u8 sound;
- /* 0xB */ u8 unkB;
- /* 0xC */ s16 unkC;
- /* 0xE */ u8 unkE;
- /* 0xF */ u8 letterboxSize;
-} ActorCutscene; // size = 0x10
-
typedef struct {
/* 0x0 */ s8 segment;
/* 0x2 */ s16 type;
@@ -119,89 +114,6 @@ typedef struct {
/* 0x8 */ void* end;
} PolygonType2; // size = 0xC
-typedef struct {
- /* 0x000 */ Gfx taskStart[9];
- /* 0x048 */ Gfx clearZBuffer[8]; // original name: clear_zb_dl
- /* 0x088 */ Gfx clearFrameBuffer[5]; // original name: clear_fb_dl
- /* 0x0B0 */ Gfx setupBuffers[6]; // setup framebuffer and zbuffer
- /* 0x0E0 */ Gfx unk_E0[12]; // unused
- /* 0x140 */ Gfx syncSegments[17];
- /* 0x1C8 */ Gfx setScissor[2];
- /* 0x1D8 */ Gfx unk_1D8[25]; // unused
- /* 0x2A0 */ Gfx disps[5];
- /* 0x2C8 */ Gfx clearFillRect[3]; // fillrect for clearing buffers
- /* 0x2E0 */ Gfx fillRect[3]; // fillrect for general purpose
- /* 0x2F8 */ Gfx debugDisp[1];
-} GfxMasterList; // size = 0x300
-
-#define GFXPOOL_HEAD_MAGIC 0x1234
-#define GFXPOOL_TAIL_MAGIC 0x5678
-
-typedef struct {
- /* 0x00000 */ u16 headMagic; // 1234
- /* 0x00008 */ GfxMasterList master;
- /* 0x00308 */ Gfx polyXluBuffer[2048];
- /* 0x04308 */ Gfx overlayBuffer[1024];
- /* 0x06308 */ Gfx workBuffer[64];
- /* 0x06508 */ Gfx debugBuffer[64];
- /* 0x06708 */ Gfx polyOpaBuffer[13184];
- /* 0x20308 */ u16 tailMagic; // 5678
-} GfxPool; // size = 0x20310
-
-typedef struct GraphicsContext {
- /* 0x000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
- /* 0x004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
- /* 0x008 */ char unk_8[0x8]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3"
- /* 0x010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4"
- /* 0x014 */ u32 unk_14;
- /* 0x018 */ char unk_18[0x20];
- /* 0x038 */ OSMesg msgBuff[8];
- /* 0x058 */ OSMesgQueue* schedMsgQ;
- /* 0x05C */ OSMesgQueue queue;
- /* 0x074 */ char unk_74[0x04];
- /* 0x078 */ OSScTask task;
- /* 0x0E0 */ char unk_E0[0xD0];
- /* 0x1B0 */ Gfx* workBuffer;
- /* 0x1B4 */ TwoHeadGfxArena work;
- /* 0x1C4 */ Gfx* debugBuffer;
- /* 0x1C8 */ TwoHeadGfxArena debug;
- /* 0x1D8 */ char unk_1D8[0xAC];
- /* 0x284 */ OSViMode* viMode;
- /* 0x288 */ void* zbuffer;
- /* 0x28C */ char unk_28C[0x1C];
- /* 0x2A8 */ TwoHeadGfxArena overlay; // "Zelda 4"
- /* 0x2B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0"
- /* 0x2C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1"
- /* 0x2D8 */ u32 gfxPoolIdx;
- /* 0x2DC */ u16* curFrameBuffer;
- /* 0x2E0 */ char unk_2E0[0x4];
- /* 0x2E4 */ u32 viConfigFeatures;
- /* 0x2E8 */ char unk_2E8[0x2];
- /* 0x2EA */ u8 updateViMode;
- /* 0x2EB */ u8 framebufferIndex;
- /* 0x2EC */ void (*callback)(struct GraphicsContext*, u32);
- /* 0x2F0 */ u32 callbackArg;
- /* 0x2F4 */ f32 xScale;
- /* 0x2F8 */ f32 yScale;
- /* 0x2FC */ GfxMasterList* masterList;
-} GraphicsContext; // size = 0x300
-
-typedef enum IRQ_MSG_TYPE {
- IRQ_VERTICAL_RETRACE_MSG = 0x1,
- IRQ_PRENMI_2_MSG = 0x3,
- IRQ_PRENMI_1_MSG = 0x4
-} IRQ_MSG_TYPE;
-
-typedef enum IRQ_TYPE {
- IRQ_VERTICAL_RETRACE = 0x29A,
- IRQ_SP = 0x29B,
- IRQ_DP = 0x29C,
- IRQ_PRENMI_1 = 0x29D,
- IRQ_PRENMI_2 = 0x29F,
- IRQ_PRENMI_3 = 0x2A0,
- IRQ_PRENMI_4 = 0x2A1
-} IRQ_TYPE;
-
typedef struct {
/* 0x00 */ u32 resetting;
/* 0x04 */ u32 resetCount;
@@ -210,13 +122,13 @@ typedef struct {
} NmiBuff; // size >= 0x18
typedef struct {
- /* 0x00 */ int unk0;
- /* 0x04 */ void* unk4;
- /* 0x08 */ int unk8;
- /* 0x0C */ int unkC;
- /* 0x10 */ int unk10;
- /* 0x14 */ OSMesgQueue unk14;
-} s80185D40; // size = 0x2C
+ /* 0x00 */ s32 requestType;
+ /* 0x04 */ OSMesg response;
+ /* 0x08 */ void* addr;
+ /* 0x0C */ s32 pageNum;
+ /* 0x10 */ s32 pageCount;
+ /* 0x14 */ OSMesgQueue messageQueue;
+} FlashromRequest; // size = 0x2C
// End of RDRAM without the Expansion Pak installed
#define NORMAL_RDRAM_END 0x80400000
@@ -273,11 +185,11 @@ typedef struct {
/* 0x188 */ Vtx* questPageVtx;
/* 0x18C */ Vtx* maskPageVtx;
/* 0x190 */ Vtx* itemVtx;
- /* 0x194 */ Vtx* mapVtx;
+ /* 0x194 */ Vtx* mapVtx; // inferred
/* 0x198 */ Vtx* questVtx;
/* 0x19C */ Vtx* maskVtx;
- /* 0x1A0 */ Vtx* unk_1A0;
- /* 0x1A4 */ Vtx* unk_1A4;
+ /* 0x1A0 */ Vtx* promptPageVtx;
+ /* 0x1A4 */ Vtx* infoPanelVtx;
/* 0x1A8 */ Vtx* cursorVtx;
/* 0x1AC */ OcarinaStaff* ocarinaStaff;
/* 0x1B0 */ UNK_TYPE1 unk_1B0[0x20];
@@ -292,11 +204,11 @@ typedef struct {
/* 0x204 */ u16 pageIndex;
/* 0x206 */ u16 switchPageTimer;
/* 0x208 */ u16 savePromptState;
- /* 0x20C */ f32 unk_20C;
- /* 0x210 */ f32 itemPageRoll; // rotation (-z) of the item page into the screen
- /* 0x214 */ f32 mapPageRoll; // rotation (+x) of the map page into the screen
- /* 0x218 */ f32 questPageRoll; // rotation (+z) of the quest page into the screen
- /* 0x21C */ f32 maskPageRoll; // rotation (-z) of the mask page into the screen
+ /* 0x20C */ f32 unk_20C; // set to 936.0f, unused remnant from OoT
+ /* 0x210 */ f32 itemPageRoll; // rotation (-z) of the item page into the screen
+ /* 0x214 */ f32 mapPageRoll; // rotation (+x) of the map page into the screen
+ /* 0x218 */ f32 questPageRoll; // rotation (+z) of the quest page into the screen
+ /* 0x21C */ f32 maskPageRoll; // rotation (-z) of the mask page into the screen
/* 0x220 */ f32 roll;
/* 0x224 */ u16 alpha;
/* 0x226 */ s16 offsetY;
@@ -308,7 +220,7 @@ typedef struct {
/* 0x24C */ s16 cursorYIndex[5];
/* 0x256 */ s16 unk_256; // Uses DungeonItem enum
/* 0x258 */ s16 cursorSpecialPos;
- /* 0x25A */ s16 pageSwitchTimer;
+ /* 0x25A */ s16 pageSwitchInputTimer; // Used to introduce a delay before switching page when arriving on the "scroll left/right" positions while holding stick left/right.
/* 0x25C */ u16 namedItem;
/* 0x25E */ u16 cursorItem[5];
/* 0x268 */ u16 cursorSlot[5];
@@ -319,15 +231,15 @@ typedef struct {
/* 0x27A */ s16 equipAnimY;
/* 0x27C */ s16 equipAnimAlpha;
/* 0x27E */ s16 infoPanelOffsetY;
- /* 0x280 */ u16 unk_280;
+ /* 0x280 */ u16 nameDisplayTimer;
/* 0x282 */ u16 nameColorSet;
/* 0x284 */ s16 cursorColorSet;
- /* 0x286 */ s16 unk_286;
- /* 0x288 */ f32 unk_288;
- /* 0x28C */ f32 unk_28C;
- /* 0x290 */ f32 unk_290;
- /* 0x294 */ f32 unk_294;
- /* 0x298 */ f32 unk_298;
+ /* 0x286 */ s16 cursorSpinPhase;
+ /* 0x288 */ f32 cursorX;
+ /* 0x28C */ f32 cursorY;
+ /* 0x290 */ f32 cursorWidth;
+ /* 0x294 */ f32 cursorHeight;
+ /* 0x298 */ f32 cursorShrinkRate;
/* 0x29C */ s16 promptChoice; // save/continue choice: 0 = yes; 4 = no
/* 0x29E */ s16 promptAlpha;
/* 0x2A0 */ s16 ocarinaSongIndex;
@@ -363,45 +275,45 @@ typedef struct {
/* 0x00 */ u16 unk_0;
/* 0x02 */ u16 sceneTimeSpeed;
/* 0x04 */ Vec3f sunPos;
- /* 0x10 */ u8 unk_10;
- /* 0x11 */ u8 unk_11;
+ /* 0x10 */ u8 skybox1Index;
+ /* 0x11 */ u8 skybox2Index;
/* 0x12 */ u8 unk_12;
- /* 0x13 */ u8 unk_13;
+ /* 0x13 */ u8 skyboxBlend;
/* 0x14 */ u8 unk_14;
/* 0x15 */ u8 skyboxDisabled;
/* 0x16 */ u8 sunMoonDisabled;
- /* 0x17 */ u8 unk_17;
- /* 0x18 */ u8 unk_18;
- /* 0x19 */ u8 unk_19;
- /* 0x1A */ u16 unk_1A;
+ /* 0x17 */ u8 skyboxConfig;
+ /* 0x18 */ u8 changeSkyboxNextConfig;
+ /* 0x19 */ u8 changeSkyboxState;
+ /* 0x1A */ u16 changeSkyboxTimer;
/* 0x1C */ u16 unk_1C;
- /* 0x1E */ u8 unk_1E;
- /* 0x1F */ u8 unk_1F;
- /* 0x20 */ u8 unk_20;
- /* 0x21 */ u8 unk_21;
- /* 0x22 */ u16 unk_22;
- /* 0x24 */ u16 unk_24;
+ /* 0x1E */ u8 lightMode;
+ /* 0x1F */ u8 lightConfig;
+ /* 0x20 */ u8 changeLightNextConfig;
+ /* 0x21 */ u8 changeLightEnabled;
+ /* 0x22 */ u16 changeLightTimer;
+ /* 0x24 */ u16 changeDuration;
/* 0x26 */ u8 unk_26;
/* 0x28 */ LightInfo dirLight1; // sun 1
/* 0x36 */ LightInfo unk_36; // sun 2
- /* 0x44 */ s8 unk_44;
- /* 0x48 */ DmaRequest unk_48;
- /* 0x68 */ OSMesgQueue unk_68;
- /* 0x80 */ OSMesg unk_80;
- /* 0x84 */ f32 unk_84;
- /* 0x88 */ f32 unk_88;
+ /* 0x44 */ s8 skyboxDmaState;
+ /* 0x48 */ DmaRequest dmaRequest;
+ /* 0x68 */ OSMesgQueue loadQueue;
+ /* 0x80 */ OSMesg loadMsg;
+ /* 0x84 */ f32 glareAlpha;
+ /* 0x88 */ f32 lensFlareAlphaScale;
/* 0x8C */ EnvLightSettings lightSettings;
/* 0xA8 */ f32 unk_A8;
/* 0xAC */ Vec3s windDir;
/* 0xB4 */ f32 windSpeed;
/* 0xB8 */ u8 numLightSettings;
/* 0xBC */ LightSettings* lightSettingsList;
- /* 0xC0 */ u8 unk_C0;
- /* 0xC1 */ u8 unk_C1;
- /* 0xC2 */ u8 unk_C2;
+ /* 0xC0 */ u8 lightBlendEnabled;
+ /* 0xC1 */ u8 lightSetting;
+ /* 0xC2 */ u8 prevLightSetting;
/* 0xC3 */ u8 lightSettingOverride;
/* 0xC4 */ LightSettings unk_C4;
- /* 0xDA */ u16 unk_DA;
+ /* 0xDA */ u16 lightBlendRateOverride;
/* 0xDC */ f32 lightBlend;
/* 0xE0 */ u8 unk_E0;
/* 0xE1 */ u8 unk_E1;
@@ -493,58 +405,10 @@ typedef struct {
/* 0x7D8 */ FaultClient* clients;
/* 0x7DC */ FaultAddrConvClient* addrConvClients;
/* 0x7E0 */ UNK_TYPE1 pad7E0[0x4];
- /* 0x7E4 */ Input padInput[4];
+ /* 0x7E4 */ Input padInput[MAXCONTROLLERS];
/* 0x844 */ void* fb;
} FaultThreadStruct; // size = 0x848
-struct GameState;
-
-typedef void (*GameStateFunc)(struct GameState* gameState);
-
-typedef struct {
- /* 0x00 */ void* loadedRamAddr;
- /* 0x04 */ uintptr_t vromStart; // if applicable
- /* 0x08 */ uintptr_t vromEnd; // if applicable
- /* 0x0C */ void* vramStart; // if applicable
- /* 0x10 */ void* vramEnd; // if applicable
- /* 0x14 */ UNK_PTR unk_14;
- /* 0x18 */ GameStateFunc init; // initializes and executes the given context
- /* 0x1C */ GameStateFunc destroy; // deconstructs the context, and sets the next context to load
- /* 0x20 */ UNK_PTR unk_20;
- /* 0x24 */ UNK_PTR unk_24;
- /* 0x28 */ UNK_TYPE unk_28;
- /* 0x2C */ size_t instanceSize;
-} GameStateOverlay; // size = 0x30
-
-typedef struct GameAllocEntry {
- /* 0x0 */ struct GameAllocEntry* next;
- /* 0x4 */ struct GameAllocEntry* prev;
- /* 0x8 */ size_t size;
- /* 0xC */ u32 unk_0C;
-} GameAllocEntry; // size = 0x10
-
-typedef struct GameAlloc {
- /* 0x00 */ GameAllocEntry base;
- /* 0x10 */ GameAllocEntry* head;
-} GameAlloc; // size = 0x14
-
-typedef struct GameState {
- /* 0x00 */ GraphicsContext* gfxCtx;
- /* 0x04 */ GameStateFunc main;
- /* 0x08 */ GameStateFunc destroy;
- /* 0x0C */ GameStateFunc init; // Usually the current game state's init, though after stopping, the graph thread will look here to determine the next game state to load.
- /* 0x10 */ size_t size;
- /* 0x14 */ Input input[4];
- /* 0x74 */ TwoHeadArena heap;
- /* 0x84 */ GameAlloc alloc;
- /* 0x98 */ UNK_TYPE1 pad98[0x3];
- /* 0x9B */ u8 running; // If 0, switch to next game state
- /* 0x9C */ u32 frames;
- /* 0xA0 */ u8 padA0[0x2];
- /* 0xA2 */ u8 framerateDivisor; // game speed?
- /* 0xA3 */ u8 unk_A3;
-} GameState; // size = 0xA4
-
struct PlayState;
typedef s32 (*ColChkResetFunc)(struct PlayState*, Collider*);
@@ -553,50 +417,6 @@ typedef void (*ColChkApplyFunc)(struct PlayState*, CollisionCheckContext*, Colli
typedef void (*ColChkVsFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Collider*);
typedef s32 (*ColChkLineFunc)(struct PlayState*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*);
-typedef struct {
- /* 0x000 */ u8 controllers; // bit 0 is set if controller 1 is plugged in, etc.
- /* 0x001 */ UNK_TYPE1 pad1[0x13];
- /* 0x014 */ OSContStatus statuses[4];
- /* 0x024 */ UNK_TYPE4 unk24;
- /* 0x028 */ OSMesg lockMesg[1];
- /* 0x02C */ OSMesg interrupts[8];
- /* 0x04C */ OSMesgQueue sSiIntMsgQ;
- /* 0x064 */ OSMesgQueue lock;
- /* 0x07C */ OSMesgQueue irqmgrCallbackQueue;
- /* 0x094 */ IrqMgrClient irqmgrCallbackQueueNode;
- /* 0x09C */ IrqMgr* irqmgr;
- /* 0x0A0 */ OSThread thread;
- /* 0x250 */ Input input[4];
- /* 0x2B0 */ OSContPad controllerState1[4];
- /* 0x2C8 */ u8 maxNumControllers;
- /* 0x2C9 */ UNK_TYPE1 pad2C9[0x1B3];
- /* 0x47C */ u8 unk47C;
- /* 0x47D */ u8 unk47D;
- /* 0x47E */ u8 hasStopped;
- /* 0x47F */ UNK_TYPE1 pad47F[0x1];
-} PadMgr; // size = 0x480
-
-typedef struct StackEntry {
- /* 0x00 */ struct StackEntry* next;
- /* 0x04 */ struct StackEntry* prev;
- /* 0x08 */ u32 head;
- /* 0x0C */ u32 tail;
- /* 0x10 */ u32 initValue;
- /* 0x14 */ s32 minSpace;
- /* 0x18 */ const char* name;
-} StackEntry; // size = 0x1C
-
-typedef enum {
- STACK_STATUS_OK = 0,
- STACK_STATUS_WARNING = 1,
- STACK_STATUS_OVERFLOW = 2
-} StackStatus;
-
-#define OS_SC_RETRACE_MSG 1
-#define OS_SC_DONE_MSG 2
-#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c
-#define OS_SC_PRE_NMI_MSG 4
-
typedef struct {
/* 0x000 */ IrqMgr* irqMgr;
/* 0x004 */ SchedContext* sched;
@@ -654,21 +474,21 @@ typedef struct PlayState {
/* 0x18770 */ void (*unk_18770)(struct PlayState* play, Player* player);
/* 0x18774 */ s32 (*startPlayerFishing)(struct PlayState* play);
/* 0x18778 */ s32 (*grabPlayer)(struct PlayState* play, Player* player);
- /* 0x1877C */ s32 (*startPlayerCutscene)(struct PlayState* play, Player* player, s32 mode);
+ /* 0x1877C */ s32 (*startPlayerCutscene)(struct PlayState* play, Player* player, PlayerCsMode csMode);
/* 0x18780 */ void (*func_18780)(Player* player, struct PlayState* play);
/* 0x18784 */ s32 (*damagePlayer)(struct PlayState* play, s32 damage);
/* 0x18788 */ void (*talkWithPlayer)(struct PlayState* play, Actor* actor);
/* 0x1878C */ void (*unk_1878C)(struct PlayState* play);
/* 0x18790 */ void (*unk_18790)(struct PlayState* play, s16 arg1);
/* 0x18794 */ PlayerItemAction (*unk_18794)(struct PlayState* play, Player* player, ItemId itemId);
- /* 0x18798 */ s32 (*setPlayerTalkAnim)(struct PlayState* play, LinkAnimationHeader* talkAnim, s32 animMode);
- /* 0x1879C */ s16 playerActorCsIds[10];
+ /* 0x18798 */ s32 (*setPlayerTalkAnim)(struct PlayState* play, PlayerAnimationHeader* talkAnim, AnimationMode animMode);
+ /* 0x1879C */ s16 playerCsIds[PLAYER_CS_ID_MAX];
/* 0x187B0 */ MtxF viewProjectionMtxF;
/* 0x187F0 */ Vec3f projectionMtxFDiagonal;
/* 0x187FC */ MtxF billboardMtxF;
/* 0x1883C */ Mtx* billboardMtx;
/* 0x18840 */ u32 gameplayFrames;
- /* 0x18844 */ u8 unk_18844;
+ /* 0x18844 */ u8 unk_18844; // bool
/* 0x18845 */ u8 haltAllActors;
/* 0x18846 */ s16 numSetupActors;
/* 0x18848 */ u8 numRooms;
@@ -693,7 +513,7 @@ typedef struct PlayState {
/* 0x1887F */ u8 transitionType; // fadeTransition
/* 0x18880 */ u8 unk_18880;
/* 0x18884 */ CollisionCheckContext colChkCtx;
- /* 0x18B20 */ u16 envFlags[20];
+ /* 0x18B20 */ u16 cutsceneFlags[20];
/* 0x18B48 */ u8 curSpawn;
/* 0x18B49 */ u8 unk_18B49;
/* 0x18B4A */ u8 transitionMode;
@@ -710,26 +530,6 @@ typedef struct PlayState {
/* 0x18E6C */ char unk_18E6C[0x3EC];
} PlayState; // size = 0x19258
-typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ char unk_01[0x3F];
- /* 0x40 */ void* unk_40;
- /* 0x44 */ u32 unk_44;
- /* 0x48 */ u32 unk_48;
- /* 0x4C */ DmaRequest unk_4C;
- /* 0x6C */ OSMesgQueue unk_6C;
- /* 0x84 */ OSMesg unk_84[1];
- /* 0x88 */ void* unk_88;
- /* 0x8C */ uintptr_t unk_8C;
- /* 0x90 */ size_t unk_90;
- /* 0x94 */ s32 unk_94;
- /* 0x98 */ s32 unk_98;
- /* 0x9C */ s32 unk_9C;
- /* 0xA0 */ char unk_A0[0x4];
- /* 0xA4 */ s32 unk_A4;
- /* 0xA8 */ s32 unk_A8;
-} BombersNotebook; // size = 0xAC
-
typedef enum {
/* 0 */ PICTO_PHOTO_STATE_OFF,
/* 1 */ PICTO_PHOTO_STATE_SETUP,
@@ -748,16 +548,16 @@ typedef struct {
typedef struct {
/* 0x0 */ u32 type;
/* 0x4 */ u32 setScissor;
- /* 0x8 */ Color_RGBA8 color;
+ /* 0x8 */ Color_RGBA8_u32 color;
/* 0xC */ Color_RGBA8 envColor;
} struct_801F8010; // size = 0x10
typedef struct {
/* 0x0 */ u32 useRgba;
/* 0x4 */ u32 setScissor;
- /* 0x8 */ Color_RGBA8 primColor;
- /* 0xC */ Color_RGBA8 envColor;
-} struct_801F8020; // size = 0x10
+ /* 0x8 */ Color_RGBA8_u32 primColor;
+ /* 0xC */ Color_RGBA8_u32 envColor;
+} VisZbuf; // size = 0x10
typedef struct {
/* 0x00 */ u32 unk_00;
@@ -778,7 +578,20 @@ typedef struct {
#define FRAM_STATUS_REGISTER FRAM_BASE_ADDRESS // FRAM Base Address in Cart Memory
#define FRAM_COMMAND_REGISTER 0x10000 // Located at 0x08010000 on the Cart
-enum fram_command {
+#define FLASH_VERSION_MX_PROTO_A 0x00C20000
+#define FLASH_VERSION_MX_A 0x00C20001
+#define FLASH_VERSION_MX_C 0x00C2001E
+#define FLASH_VERSION_MX_B_AND_D 0x00C2001D
+#define FLASH_VERSION_MEI 0x003200F1
+
+#define FLASH_TYPE_MAGIC 0x11118001
+
+#define FLASH_PAGE_SIZE 128
+
+#define FLASHROM_REQUEST_WRITE 1
+#define FLASHROM_REQUEST_READ 2
+
+typedef enum FramCommand {
/* Does nothing for FRAM_COMMAND_SET_MODE_READ_AND_STATUS, FRAM_MODE_NOP, FRAM_COMMAND_SET_MODE_STATUS_AND_STATUS
Initializes fram to 0xFF in FRAM_MODE_ERASE
Writes Contents in FLASHRAM_MODE_WRITE
@@ -802,45 +615,39 @@ enum fram_command {
FRAM_COMMAND_SET_MODE_READ_AND_STATUS = 0xF0000000,
/* unk */
FRAM_COMMAND_UNK_ERASE_OPERATION = 0x3C000000
-};
+} FramCommand;
-enum fram_mode {
- FRAM_MODE_NOP = 0,
- FRAM_MODE_ERASE,
- FRAM_MODE_WRITE,
- FRAM_MODE_READ,
- FRAM_MODE_STATUS
-};
+typedef enum FramMode {
+ /* 0 */ FRAM_MODE_NOP,
+ /* 1 */ FRAM_MODE_ERASE,
+ /* 2 */ FRAM_MODE_WRITE,
+ /* 3 */ FRAM_MODE_READ,
+ /* 4 */ FRAM_MODE_STATUS
+} FramMode;
+
+typedef enum {
+ /* 0 */ VI_MODE_EDIT_STATE_INACTIVE,
+ /* 1 */ VI_MODE_EDIT_STATE_ACTIVE,
+ /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments
+ /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode
+} ViModeEditState;
typedef struct {
- /* 0x00 */ UNK_TYPE1 unk_00[0x14];
- /* 0x14 */ s16 unk_14;
- /* 0x16 */ s16 unk_16;
- /* 0x18 */ s16 unk_18;
- /* 0x1A */ UNK_TYPE1 unk_1A[0x3];
- /* 0x0C */ u8 unk_1D;
- /* 0x1E */ UNK_TYPE1 unk_1E[0xC];
- /* 0x2A */ s16 unk_2A;
- /* 0x1E */ UNK_TYPE1 unk_2C[0x1];
- /* 0x2D */ u8 unk_2D;
- /* 0x2E */ UNK_TYPE1 unk_2E[2];
-} DbCameraUnkSubStruct; // size = 0x30
-
-typedef struct {
- /* 0x00 */ s16 unk_00;
- /* 0x02 */ s16 unk_02;
- /* 0x04 */ s16 unk_04;
- /* 0x06 */ s16 unk_06;
- /* 0x08 */ s16 unk_08;
- /* 0x0A */ s16 unk_0A;
- /* 0x0C */ s16 unk_0C;
- /* 0x0E */ UNK_TYPE1 unk_0E[0x02];
- /* 0x10 */ DbCameraUnkSubStruct unk_10;
- /* 0x40 */ DbCameraUnkSubStruct unk_40;
- /* 0x70 */ UNK_PTR unk_70;
- /* 0x74 */ UNK_PTR unk_74;
- /* 0x78 */ UNK_PTR unk_78;
- /* 0x7C */ Camera* camera;
-} DbCameraUnkStruct; // size = 0x80
+ /* 0x00 */ OSViMode customViMode;
+ /* 0x50 */ s32 viHeight;
+ /* 0x54 */ s32 viWidth;
+ /* 0x58 */ s32 rightAdjust;
+ /* 0x5C */ s32 leftAdjust;
+ /* 0x60 */ s32 lowerAdjust;
+ /* 0x64 */ s32 upperAdjust;
+ /* 0x68 */ s32 editState;
+ /* 0x6C */ s32 tvType;
+ /* 0x70 */ u32 loRes;
+ /* 0x74 */ u32 antialiasOff;
+ /* 0x78 */ u32 modeN;
+ /* 0x7C */ u32 fb16Bit;
+ /* 0x80 */ u32 viFeatures;
+ /* 0x84 */ u32 unk_84;
+} ViMode; // size = 0x88
#endif
diff --git a/include/z64actor.h b/include/z64actor.h
index 86ea6e22c..3051f2c6e 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -134,6 +134,7 @@ typedef struct {
/* 0x18 */ Vec3f feetPos[2]; // Update by using `Actor_SetFeetPos` in PostLimbDrawOpa
} ActorShape; // size = 0x30
+// Flags for bgCheckFlags
#define BGCHECKFLAG_GROUND (1 << 0) // Standing on the ground
#define BGCHECKFLAG_GROUND_TOUCH (1 << 1) // Has touched the ground (only active for 1 frame)
#define BGCHECKFLAG_GROUND_LEAVE (1 << 2) // Has left the ground (only active for 1 frame)
@@ -148,6 +149,20 @@ typedef struct {
#define BGCHECKFLAG_PLAYER_800 (1 << 11) //
#define BGCHECKFLAG_PLAYER_1000 (1 << 12) //
+// Flags for Actor_UpdateBgCheckInfo
+#define UPDBGCHECKINFO_FLAG_1 (1 << 0) // check wall
+#define UPDBGCHECKINFO_FLAG_2 (1 << 1) // check ceiling
+#define UPDBGCHECKINFO_FLAG_4 (1 << 2) // check floor and water
+#define UPDBGCHECKINFO_FLAG_8 (1 << 3)
+#define UPDBGCHECKINFO_FLAG_10 (1 << 4)
+#define UPDBGCHECKINFO_FLAG_20 (1 << 5) // unused
+#define UPDBGCHECKINFO_FLAG_40 (1 << 6) // disable water ripples
+#define UPDBGCHECKINFO_FLAG_80 (1 << 7)
+#define UPDBGCHECKINFO_FLAG_100 (1 << 8)
+#define UPDBGCHECKINFO_FLAG_200 (1 << 9)
+#define UPDBGCHECKINFO_FLAG_400 (1 << 10) // check water
+#define UPDBGCHECKINFO_FLAG_800 (1 << 11)
+
typedef struct Actor {
/* 0x000 */ s16 id; // Actor ID
/* 0x002 */ u8 category; // Actor category. Refer to the corresponding enum for values
@@ -159,7 +174,7 @@ typedef struct Actor {
/* 0x01F */ s8 targetMode; // Controls how far the actor can be targeted from and how far it can stay locked on
/* 0x020 */ s16 halfDaysBits; // Bitmask indicating which half-days this actor is allowed to not be killed(?) (TODO: not sure how to word this). If the current halfDayBit is not part of this mask then the actor is killed when spawning the setup actors
/* 0x024 */ PosRot world; // Position/rotation in the world
- /* 0x038 */ s8 cutscene;
+ /* 0x038 */ s8 csId; // ActorCutscene index, see `CutsceneId`
/* 0x039 */ u8 audioFlags; // Another set of flags? Seems related to sfx or bgm
/* 0x03C */ PosRot focus; // Target reticle focuses on this position. For player this represents head pos and rot
/* 0x050 */ u16 sfxId; // Id of sound effect to play. Plays when value is set, then is cleared the following update cycle
@@ -214,15 +229,23 @@ typedef enum {
/* 1 */ FOOT_RIGHT
} ActorFootIndex;
+#define DYNA_TRANSFORM_POS (1 << 0) // Position of the actors on top follows the dynapoly actor's movement.
+#define DYNA_TRANSFORM_ROT_Y (1 << 1) // The Y rotation of the actors on top follows the dynapoly actor's Y rotation.
+
+#define DYNA_INTERACT_ACTOR_ON_TOP (1 << 0) // There is an actor standing on the collision of the dynapoly actor
+#define DYNA_INTERACT_PLAYER_ON_TOP (1 << 1) // The player actor is standing on the collision of the dynapoly actor
+#define DYNA_INTERACT_PLAYER_ABOVE (1 << 2) // The player is directly above the collision of the dynapoly actor (any distance above)
+#define DYNA_INTERACT_ACTOR_ON_SWITCH (1 << 3) // Like the ACTOR_ON_TOP flag but only actors with ACTOR_FLAG_CAN_PRESS_SWITCH
+#define DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH (1 << 4) // Like the ACTOR_ON_TOP flag but only actors with ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH
+
typedef struct {
/* 0x000 */ Actor actor;
/* 0x144 */ s32 bgId;
/* 0x148 */ f32 pushForce;
/* 0x14C */ f32 unk14C;
/* 0x150 */ s16 yRotation;
- /* 0x154 */ u32 flags;
- /* 0x158 */ u8 stateFlags;
- /* 0x15A */ s16 pad15A;
+ /* 0x154 */ u32 transformFlags;
+ /* 0x158 */ u8 interactFlags;
} DynaPolyActor; // size = 0x15C
@@ -294,7 +317,7 @@ typedef struct EnAObj {
typedef enum {
/* 0 */ AOBJ_SIGNPOST_OBLONG,
- /* 1 */ AOBJ_SIGNPOST_ARROW,
+ /* 1 */ AOBJ_SIGNPOST_ARROW
} AObjType;
#define AOBJ_GET_TEXTID(thisx) ((((thisx)->params >> 8) & 0xFF) | 0x300)
@@ -366,12 +389,18 @@ typedef struct {
/* 0xE */ s16 intensity;
} TitleCardContext; // size = 0x10
-typedef struct ActorContext_unk_1F4 {
- /* 0x00 */ u8 unk_00;
+typedef enum {
+ /* 0 */ PLAYER_IMPACT_GORON_GROUND_POUND,
+ /* 1 */ PLAYER_IMPACT_ZORA_BARRIER,
+ /* 2 */ PLAYER_IMPACT_BONK // also activated by goron attack
+} PlayerImpactType;
+
+typedef struct PlayerImpact {
+ /* 0x00 */ u8 type;
/* 0x01 */ u8 timer;
- /* 0x04 */ f32 unk_04;
- /* 0x08 */ Vec3f unk_08;
-} ActorContext_unk_1F4; // size = 0x14
+ /* 0x04 */ f32 dist;
+ /* 0x08 */ Vec3f pos;
+} PlayerImpact; // size = 0x14
typedef struct ActorContext_unk_20C {
/* 0x0 */ s16 id;
@@ -435,7 +464,7 @@ typedef struct ActorContext {
/* 0x120 */ TargetContext targetContext;
/* 0x1B8 */ ActorContextSceneFlags sceneFlags;
/* 0x1E4 */ TitleCardContext titleCtxt;
- /* 0x1F4 */ ActorContext_unk_1F4 unk_1F4;
+ /* 0x1F4 */ PlayerImpact playerImpact;
/* 0x208 */ UNK_TYPE1 unk_208[0x4];
/* 0x20C */ ActorContext_unk_20C unk_20C[8];
/* 0x24C */ UNK_TYPE1 unk_24C[0x4];
@@ -503,8 +532,8 @@ typedef enum {
#define ACTOR_FLAG_400 (1 << 10)
//
#define ACTOR_FLAG_800 (1 << 11)
-//
-#define ACTOR_FLAG_1000 (1 << 12)
+// Actor will not shake when a quake occurs
+#define ACTOR_FLAG_IGNORE_QUAKE (1 << 12)
//
#define ACTOR_FLAG_2000 (1 << 13)
//
@@ -513,8 +542,8 @@ typedef enum {
#define ACTOR_FLAG_8000 (1 << 15)
//
#define ACTOR_FLAG_10000 (1 << 16)
-//
-#define ACTOR_FLAG_20000 (1 << 17)
+// actor can press and hold down heavy switches
+#define ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH (1 << 17)
//
#define ACTOR_FLAG_40000 (1 << 18)
//
@@ -531,8 +560,8 @@ typedef enum {
#define ACTOR_FLAG_1000000 (1 << 24)
//
#define ACTOR_FLAG_2000000 (1 << 25)
-//
-#define ACTOR_FLAG_4000000 (1 << 26)
+// actor can press and hold down switches
+#define ACTOR_FLAG_CAN_PRESS_SWITCH (1 << 26)
// Prevents locking on with Z targeting an actor even if Tatl is floating over it
#define ACTOR_FLAG_CANT_LOCK_ON (1 << 27)
//
@@ -710,6 +739,11 @@ typedef struct NpcInteractInfo {
/* 0x24 */ UNK_TYPE1 unk_24[0x4];
} NpcInteractInfo; // size = 0x28
+typedef struct BlinkInfo {
+ /* 0x0 */ s16 eyeTexIndex;
+ /* 0x2 */ s16 blinkTimer;
+} BlinkInfo; // size = 0x4
+
extern TargetRangeParams gTargetRanges[];
extern s16 D_801AED48[8];
extern Gfx D_801AEF88[];
diff --git a/include/z64animation.h b/include/z64animation.h
index 0e8eb9fcb..67c9d7641 100644
--- a/include/z64animation.h
+++ b/include/z64animation.h
@@ -11,15 +11,16 @@ struct Actor;
struct SkelAnime;
struct PlayerAnimationFrame;
-#define LINK_ANIMETION_OFFSET(addr, offset) \
- (SEGMENT_ROM_START(link_animetion) + ((uintptr_t)addr & 0xFFFFFF) + ((u32)offset))
#define LIMB_DONE 0xFF
-#define ANIMATION_ENTRY_MAX 50
#define ANIM_FLAG_1 (1 << 0)
-#define ANIM_FLAG_UPDATEY (1 << 1)
+#define ANIM_FLAG_UPDATE_Y (1 << 1)
#define ANIM_FLAG_4 (1 << 2)
+#define ANIM_FLAG_8 (1 << 3)
#define ANIM_FLAG_NOMOVE (1 << 4)
+#define ANIM_FLAG_80 (1 << 7)
+#define ANIM_FLAG_100 (1 << 8)
+#define ANIM_FLAG_200 (1 << 9)
typedef enum AnimationMode {
/* 0 */ ANIMMODE_LOOP,
@@ -30,9 +31,9 @@ typedef enum AnimationMode {
/* 5 */ ANIMMODE_LOOP_PARTIAL_INTERP
} AnimationMode;
-typedef enum {
+typedef enum {
/* -1 */ ANIMTAPER_DECEL = -1,
- /* 0 */ ANIMTAPER_NONE,
+ /* 0 */ ANIMTAPER_NONE,
/* 1 */ ANIMTAPER_ACCEL
} AnimationTapers;
@@ -82,35 +83,19 @@ typedef struct {
/* 0xC */ u16 staticIndexMax;
} AnimationHeader; // size = 0x10
-typedef struct {
- /* 0x00 */ s16 xMax;
- /* 0x02 */ s16 x;
- /* 0x04 */ s16 yMax;
- /* 0x06 */ s16 y;
- /* 0x08 */ s16 zMax;
- /* 0x10 */ s16 z;
-} JointKey; // size = 0x12
-
-typedef struct {
- /* 0x0 */ s16 frameCount;
- /* 0x2 */ s16 limbCount;
- /* 0x4 */ s16* frameData;
- /* 0x8 */ JointKey* jointKey;
-} LegacyAnimationHeader; // size = 0xC
-
typedef enum {
- ANIMATION_LINKANIMETION,
- ANIMENTRY_COPYALL,
- ANIMENTRY_INTERP,
- ANIMENTRY_COPYTRUE,
- ANIMENTRY_COPYFALSE,
- ANIMENTRY_MOVEACTOR
+ /* 0 */ ANIMATION_LINKANIMETION,
+ /* 1 */ ANIMENTRY_COPYALL,
+ /* 2 */ ANIMENTRY_INTERP,
+ /* 3 */ ANIMENTRY_COPYTRUE,
+ /* 4 */ ANIMENTRY_COPYFALSE,
+ /* 5 */ ANIMENTRY_MOVEACTOR
} AnimationType;
typedef struct {
/* 0x00 */ DmaRequest req;
/* 0x20 */ OSMesgQueue msgQueue;
- /* 0x38 */ OSMesg msg;
+ /* 0x38 */ OSMesg msg[1];
} AnimEntryLoadFrame; // size = 0x3C
typedef struct {
@@ -166,16 +151,16 @@ typedef struct {
typedef struct AnimationContext {
/* 0x000 */ s16 animationCount;
- /* 0x004 */ AnimationEntry entries[ANIMATION_ENTRY_MAX];
+ /* 0x004 */ AnimationEntry entries[50];
} AnimationContext; // size = 0xC84
typedef struct {
/* 0x0 */ AnimationHeaderCommon common;
/* 0x4 */ union {
void* segmentVoid;
- struct PlayerAnimationFrame* segment;
+ struct PlayerAnimationFrame* linkAnimSegment;
};
-} LinkAnimationHeader; // size = 0x8
+} PlayerAnimationHeader; // size = 0x8
typedef struct SkelAnime {
/* 0x00 */ u8 limbCount; // Number of limbs in the skeleton
@@ -183,7 +168,7 @@ typedef struct SkelAnime {
/* 0x02 */ u8 dListCount; // Number of display lists in a flexible skeleton
/* 0x03 */ s8 taper; // Tapering to use when morphing between animations. Only used by Door_Warp1.
/* 0x04 */ void** skeleton; // An array of pointers to limbs. Can be StandardLimb, LodLimb, or SkinLimb.
- /* 0x08 */ void* animation; // Can be an AnimationHeader or LinkAnimationHeader.
+ /* 0x08 */ void* animation; // Can be an AnimationHeader or PlayerAnimationHeader.
/* 0x0C */ f32 startFrame; // In mode 4, start of partial loop.
/* 0x10 */ f32 endFrame; // In mode 2, Update returns true when curFrame is equal to this. In mode 4, end of partial loop.
/* 0x14 */ f32 animLength; // Total number of frames in the current animation's file.
@@ -195,10 +180,10 @@ typedef struct SkelAnime {
/* 0x2C */ f32 morphRate; // Reciprocal of the number of frames in the morph
/* 0x30 */ union {
s32 (*normal)(struct SkelAnime*);// Can be Loop, Partial loop, Play once, Morph, or Tapered morph
- s32 (*link)(struct PlayState*, struct SkelAnime*); // Loop, Play once, and Morph
+ s32 (*player)(struct PlayState*, struct SkelAnime*); // Loop, Play once, and Morph
} update;
- /* 0x34 */ s8 initFlags; // Flags used when initializing Link's skeleton
- /* 0x35 */ u8 moveFlags; // Flags used for animations that move the actor in worldspace.
+ /* 0x34 */ s8 initFlags; // Flags used when initializing Player's skeleton
+ /* 0x35 */ u8 moveFlags; // Flags used for animations that move the actor in worldspace.
/* 0x36 */ s16 prevRot; // Previous rotation in worldspace.
/* 0x38 */ Vec3s prevTransl; // Previous modelspace translation.
/* 0x3E */ Vec3s baseTransl; // Base modelspace translation.
@@ -228,8 +213,6 @@ typedef void (*TransformLimbDraw)(struct PlayState* play, s32 limbIndex, struct
typedef void (*AnimationEntryCallback)(struct PlayState*, AnimationEntryData*);
-extern u32 link_animetion_segment;
-
typedef struct {
/* 0x00 */ AnimationHeader* animation;
/* 0x04 */ f32 playSpeed;
@@ -321,7 +304,72 @@ typedef struct SkeletonInfo {
typedef s32 (*OverrideKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
-typedef void (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
+typedef s32 (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
+void SkelAnime_DrawLod(struct PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, struct Actor* actor, s32 lod);
+void SkelAnime_DrawFlexLod(struct PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawFlex overrideLimbDraw, PostLimbDrawFlex postLimbDraw, struct Actor* actor, s32 lod);
+void SkelAnime_DrawOpa(struct PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, struct Actor* actor);
+void SkelAnime_DrawFlexOpa(struct PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, struct Actor* actor);
+void SkelAnime_DrawTransformFlexOpa(struct PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, TransformLimbDrawOpa transformLimbDraw, struct Actor* actor);
+s16 Animation_GetLastFrame(void* animation);
+Gfx* SkelAnime_Draw(struct PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, struct Actor* actor, Gfx* gfx);
+Gfx* SkelAnime_DrawFlex(struct PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, struct Actor* actor, Gfx* gfx);
+
+void AnimationContext_Reset(AnimationContext* animationCtx);
+void AnimationContext_SetNextQueue(struct PlayState* play);
+void AnimationContext_DisableQueue(struct PlayState* play);
+void AnimationContext_SetLoadFrame(struct PlayState* play, PlayerAnimationHeader* animation, s32 frame, s32 limbCount, Vec3s* frameTable);
+void AnimationContext_SetCopyAll(struct PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src);
+void AnimationContext_SetInterp(struct PlayState* play, s32 vecCount, Vec3s* base, Vec3s* mod, f32 weight);
+void AnimationContext_SetCopyTrue(struct PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src, u8* copyFlag);
+void AnimationContext_SetCopyFalse(struct PlayState* play, s32 vecCount, Vec3s* dst, Vec3s* src, u8* copyFlag);
+void AnimationContext_SetMoveActor(struct PlayState* play, struct Actor* actor, SkelAnime* skelAnime, f32 arg3);
+
+void AnimationContext_Update(struct PlayState* play, AnimationContext* animationCtx);
+void SkelAnime_InitPlayer(struct PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, PlayerAnimationHeader* animation, s32 flags, void* jointTableBuffer, void* morphTableBuffer, s32 limbBufCount);
+void PlayerAnimation_SetUpdateFunction(SkelAnime* skelAnime);
+s32 PlayerAnimation_Update(struct PlayState* play, SkelAnime* skelAnime);
+void PlayerAnimation_AnimateFrame(struct PlayState* play, SkelAnime* skelAnime);
+void Animation_SetMorph(struct PlayState* play, SkelAnime* skelAnime, f32 morphFrames);
+void PlayerAnimation_Change(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
+void PlayerAnimation_PlayOnce(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation);
+void PlayerAnimation_PlayOnceSetSpeed(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed);
+void PlayerAnimation_PlayLoop(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation);
+void PlayerAnimation_PlayLoopSetSpeed(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed);
+void PlayerAnimation_CopyJointToMorph(struct PlayState* play, SkelAnime* skelAnime);
+void PlayerAnimation_CopyMorphToJoint(struct PlayState* play, SkelAnime* skelAnime);
+void PlayerAnimation_LoadToMorph(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 frame);
+void PlayerAnimation_LoadToJoint(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 frame);
+void PlayerAnimation_InterpJointMorph(struct PlayState* play, SkelAnime* skelAnime, f32 weight);
+void PlayerAnimation_BlendToJoint(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation1, f32 frame1, PlayerAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer);
+void PlayerAnimation_BlendToMorph(struct PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation1, f32 frame1, PlayerAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer);
+void PlayerAnimation_EndLoop(SkelAnime* skelAnime);
+s32 PlayerAnimation_OnFrame(SkelAnime* skelAnime, f32 frame);
+
+void SkelAnime_Init(struct PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount);
+void SkelAnime_InitFlex(struct PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount);
+void SkelAnime_InitSkin(struct GameState* gameState, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation);
+
+s32 SkelAnime_Update(SkelAnime* skelAnime);
+void Animation_ChangeImpl(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames, s8 taper);
+void Animation_Change(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
+void Animation_PlayOnce(SkelAnime* skelAnime, AnimationHeader* animation);
+void Animation_MorphToPlayOnce(SkelAnime* skelAnime, AnimationHeader* animation, f32 morphFrames);
+void Animation_PlayOnceSetSpeed(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed);
+void Animation_PlayLoop(SkelAnime* skelAnime, AnimationHeader* animation);
+void Animation_MorphToLoop(SkelAnime* skelAnime, AnimationHeader* animation, f32 morphFrames);
+void Animation_PlayLoopSetSpeed(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed);
+void Animation_EndLoop(SkelAnime* skelAnime);
+void Animation_Reverse(SkelAnime* skelAnime);
+void SkelAnime_CopyFrameTableTrue(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* copyFlag);
+void SkelAnime_CopyFrameTableFalse(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* copyFlag);
+void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle);
+s32 Animation_OnFrame(SkelAnime* skelAnime, f32 frame);
+void SkelAnime_Free(SkelAnime* skelAnime, struct PlayState* play);
+
+// ZAPD compatibility typedefs
+// TODO: Remove when ZAPD adds support for them
+typedef PlayerAnimationHeader LinkAnimationHeader;
+
#endif
diff --git a/include/z64animation_legacy.h b/include/z64animation_legacy.h
new file mode 100644
index 000000000..238939f74
--- /dev/null
+++ b/include/z64animation_legacy.h
@@ -0,0 +1,36 @@
+#ifndef Z64_ANIMATION_LEGACY_H
+#define Z64_ANIMATION_LEGACY_H
+
+#include "ultra64.h"
+#include "z64math.h"
+
+typedef struct LegacyLimb {
+ /* 0x00 */ Gfx* dList;
+ /* 0x04 */ Vec3f trans;
+ /* 0x10 */ Vec3s rot;
+ /* 0x18 */ struct LegacyLimb* sibling;
+ /* 0x1C */ struct LegacyLimb* child;
+} LegacyLimb; // size = 0x20
+
+typedef struct {
+ /* 0x00 */ s16 xMax;
+ /* 0x02 */ s16 x;
+ /* 0x04 */ s16 yMax;
+ /* 0x06 */ s16 y;
+ /* 0x08 */ s16 zMax;
+ /* 0x10 */ s16 z;
+} LegacyJointKey; // size = 0x12
+
+typedef struct {
+ /* 0x0 */ s16 frameCount;
+ /* 0x2 */ s16 limbCount;
+ /* 0x4 */ s16* frameData;
+ /* 0x8 */ LegacyJointKey* jointKey;
+} LegacyAnimationHeader; // size = 0xC
+
+s16 SkelAnime_GetFrameDataLegacy(LegacyAnimationHeader* animation, s32 frame, Vec3s* frameTable);
+s16 Animation_GetLimbCountLegacy(LegacyAnimationHeader* animation);
+s16 Animation_GetLengthLegacy(LegacyAnimationHeader* animation);
+s16 Animation_GetLastFrameLegacy(LegacyAnimationHeader* animation);
+
+#endif
diff --git a/include/z64audio.h b/include/z64audio.h
index a37760566..9b077cf1a 100644
--- a/include/z64audio.h
+++ b/include/z64audio.h
@@ -105,7 +105,7 @@ typedef enum {
/* 1 */ SOUNDMODE_HEADSET,
/* 2 */ SOUNDMODE_SURROUND_EXTERNAL,
/* 3 */ SOUNDMODE_MONO,
- /* 4 */ SOUNDMODE_SURROUND,
+ /* 4 */ SOUNDMODE_SURROUND
} SoundMode;
typedef enum {
diff --git a/include/z64bgcheck.h b/include/z64bgcheck.h
index ad56599b5..91a892e03 100644
--- a/include/z64bgcheck.h
+++ b/include/z64bgcheck.h
@@ -48,11 +48,6 @@ struct DynaPolyActor;
#define COLPOLY_IGNORE_ENTITY (1 << 1)
#define COLPOLY_IGNORE_PROJECTILES (1 << 2)
-// Surface Types
-#define COLPOLY_SURFACE_GROUND 0
-#define COLPOLY_SURFACE_SAND 1
-#define COLPOLY_SURFACE_SNOW 14
-
// CollisionContext flags
#define BGCHECK_FLAG_REVERSE_CONVEYOR_FLOW 1
@@ -114,6 +109,120 @@ typedef struct {
// 0x0000_00FF = bgCam index
} WaterBox; // size = 0x10
+typedef enum FloorType {
+ /* 0 */ FLOOR_TYPE_0,
+ /* 1 */ FLOOR_TYPE_1,
+ /* 2 */ FLOOR_TYPE_2,
+ /* 3 */ FLOOR_TYPE_3,
+ /* 4 */ FLOOR_TYPE_4,
+ /* 5 */ FLOOR_TYPE_5,
+ /* 6 */ FLOOR_TYPE_6,
+ /* 7 */ FLOOR_TYPE_7,
+ /* 8 */ FLOOR_TYPE_8,
+ /* 9 */ FLOOR_TYPE_9,
+ /* 10 */ FLOOR_TYPE_10,
+ /* 11 */ FLOOR_TYPE_11,
+ /* 12 */ FLOOR_TYPE_12,
+ /* 13 */ FLOOR_TYPE_13,
+ /* 14 */ FLOOR_TYPE_14,
+ /* 15 */ FLOOR_TYPE_15
+} FloorType;
+
+typedef enum WallType {
+ /* 0 */ WALL_TYPE_0,
+ /* 1 */ WALL_TYPE_1,
+ /* 2 */ WALL_TYPE_2,
+ /* 3 */ WALL_TYPE_3,
+ /* 4 */ WALL_TYPE_4,
+ /* 5 */ WALL_TYPE_5,
+ /* 6 */ WALL_TYPE_6,
+ /* 7 */ WALL_TYPE_7,
+ /* 8 */ WALL_TYPE_8,
+ /* 9 */ WALL_TYPE_9,
+ /* 10 */ WALL_TYPE_10,
+ /* 11 */ WALL_TYPE_11,
+ /* 12 */ WALL_TYPE_12,
+ /* 32 */ WALL_TYPE_MAX = 32
+} WallType;
+
+#define WALL_FLAG_0 (1 << 0)
+#define WALL_FLAG_1 (1 << 1)
+#define WALL_FLAG_2 (1 << 2)
+#define WALL_FLAG_3 (1 << 3)
+#define WALL_FLAG_4 (1 << 4)
+#define WALL_FLAG_5 (1 << 5)
+#define WALL_FLAG_6 (1 << 6)
+
+// SurfaceType can leave footsteps imprints in the material
+#define MATERIAL_PROPERTY_SOFT_IMPRINT (1 << 0)
+
+typedef enum FloorProperty {
+ /* 0 */ FLOOR_PROPERTY_0,
+ /* 1 */ FLOOR_PROPERTY_1,
+ /* 2 */ FLOOR_PROPERTY_2,
+ /* 5 */ FLOOR_PROPERTY_5 = 5,
+ /* 6 */ FLOOR_PROPERTY_6,
+ /* 7 */ FLOOR_PROPERTY_7,
+ /* 8 */ FLOOR_PROPERTY_8,
+ /* 9 */ FLOOR_PROPERTY_9,
+ /* 11 */ FLOOR_PROPERTY_11 = 11,
+ /* 12 */ FLOOR_PROPERTY_12,
+ /* 13 */ FLOOR_PROPERTY_13
+} FloorProperty;
+
+typedef enum SurfaceSfxOffset {
+ /* 0 */ SURFACE_SFX_OFFSET_DIRT,
+ /* 1 */ SURFACE_SFX_OFFSET_SAND,
+ /* 2 */ SURFACE_SFX_OFFSET_STONE,
+ /* 3 */ SURFACE_SFX_OFFSET_DIRT_SHALLOW,
+ /* 4 */ SURFACE_SFX_OFFSET_WATER_SHALLOW,
+ /* 5 */ SURFACE_SFX_OFFSET_WATER_DEEP,
+ /* 6 */ SURFACE_SFX_OFFSET_TALL_GRASS,
+ /* 7 */ SURFACE_SFX_OFFSET_LAVA, // MAGMA?
+ /* 8 */ SURFACE_SFX_OFFSET_GRASS,
+ /* 9 */ SURFACE_SFX_OFFSET_CARPET,
+ /* 10 */ SURFACE_SFX_OFFSET_WOOD,
+ /* 11 */ SURFACE_SFX_OFFSET_BRIDGE, // WOOD_PLANK?
+ /* 12 */ SURFACE_SFX_OFFSET_VINE, // METAL?
+ /* 13 */ SURFACE_SFX_OFFSET_DIRT_DEEP,
+ /* 14 */ SURFACE_SFX_OFFSET_SNOW,
+ /* 15 */ SURFACE_SFX_OFFSET_ICE
+} SurfaceSfxOffset;
+
+typedef enum SurfaceMaterial {
+ /* 0 */ SURFACE_MATERIAL_DIRT,
+ /* 1 */ SURFACE_MATERIAL_SAND,
+ /* 2 */ SURFACE_MATERIAL_STONE,
+ /* 3 */ SURFACE_MATERIAL_DIRT_SHALLOW,
+ /* 4 */ SURFACE_MATERIAL_WATER_SHALLOW,
+ /* 5 */ SURFACE_MATERIAL_WATER_DEEP,
+ /* 6 */ SURFACE_MATERIAL_TALL_GRASS,
+ /* 7 */ SURFACE_MATERIAL_LAVA, // MAGMA?
+ /* 8 */ SURFACE_MATERIAL_GRASS,
+ /* 9 */ SURFACE_MATERIAL_BRIDGE, // WOOD_PLANK?
+ /* 10 */ SURFACE_MATERIAL_WOOD,
+ /* 11 */ SURFACE_MATERIAL_DIRT_SOFT,
+ /* 12 */ SURFACE_MATERIAL_ICE,
+ /* 13 */ SURFACE_MATERIAL_CARPET,
+ /* 14 */ SURFACE_MATERIAL_SNOW,
+ /* 15 */ SURFACE_MATERIAL_MAX
+} SurfaceMaterial;
+
+typedef enum FloorEffect {
+ /* 0 */ FLOOR_EFFECT_0,
+ /* 1 */ FLOOR_EFFECT_1,
+ /* 2 */ FLOOR_EFFECT_2,
+ /* 3 */ FLOOR_EFFECT_3
+} FloorEffect;
+
+typedef enum ConveyorSpeed {
+ /* 0 */ CONVEYOR_SPEED_DISABLED,
+ /* 1 */ CONVEYOR_SPEED_SLOW,
+ /* 2 */ CONVEYOR_SPEED_MEDIUM,
+ /* 3 */ CONVEYOR_SPEED_FAST,
+ /* 4 */ CONVEYOR_SPEED_MAX
+} ConveyorSpeed;
+
typedef struct {
/* 0x0 */ u32 data[2];
@@ -146,7 +255,7 @@ typedef struct {
/* 0x14 */ u16 numPolygons;
/* 0x18 */ CollisionPoly* polyList;
/* 0x1C */ SurfaceType* surfaceTypeList;
- /* 0x20 */ CamData* bgCamList;
+ /* 0x20 */ BgCamInfo* bgCamList;
/* 0x24 */ u16 numWaterBoxes;
/* 0x28 */ WaterBox* waterBoxes;
} CollisionHeader; // size = 0x2C
@@ -205,10 +314,16 @@ typedef struct {
/* 0x60 */ f32 maxY;
} BgActor; // size = 0x64
+#define BGACTOR_IN_USE (1 << 0) // The bgActor entry is in use
+#define BGACTOR_1 (1 << 1)
+#define BGACTOR_COLLISION_DISABLED (1 << 2) // The collision of the bgActor is disabled
+#define BGACTOR_CEILING_COLLISION_DISABLED (1 << 3) // The ceiling collision of the bgActor is ignored
+#define BGACTOR_FLOOR_COLLISION_DISABLED (1 << 5) // The floor collision of the bgActor is ignored
+
typedef struct {
/* 0x0000 */ u8 bitFlag;
/* 0x0004 */ BgActor bgActors[BG_ACTOR_MAX];
- /* 0x138C */ u16 bgActorFlags[BG_ACTOR_MAX]; // bit 0 - Is mesh active
+ /* 0x138C */ u16 bgActorFlags[BG_ACTOR_MAX];
/* 0x13F0 */ CollisionPoly* polyList;
/* 0x13F4 */ Vec3s* vtxList;
/* 0x13F8 */ DynaWaterBoxList waterBoxList;
@@ -219,14 +334,14 @@ typedef struct {
} DynaCollisionContext; // size = 0x1418
typedef struct {
- /* 0x00 */ CollisionHeader* colHeader; // scene's static collision
- /* 0x04 */ Vec3f minBounds; // minimum coordinates of collision bounding box
- /* 0x10 */ Vec3f maxBounds; // maximum coordinates of collision bounding box
- /* 0x1C */ Vec3i subdivAmount; // x, y, z subdivisions of the scene's static collision
- /* 0x28 */ Vec3f subdivLength; // x, y, z subdivision worldspace lengths
- /* 0x34 */ Vec3f subdivLengthInv; // inverse of subdivision length
- /* 0x40 */ StaticLookup* lookupTbl; // 3d array of length subdivAmount
- /* 0x44 */ SSNodeList polyNodes;
+ /* 0x0000 */ CollisionHeader* colHeader; // scene's static collision
+ /* 0x0004 */ Vec3f minBounds; // minimum coordinates of collision bounding box
+ /* 0x0010 */ Vec3f maxBounds; // maximum coordinates of collision bounding box
+ /* 0x001C */ Vec3i subdivAmount; // x, y, z subdivisions of the scene's static collision
+ /* 0x0028 */ Vec3f subdivLength; // x, y, z subdivision worldspace lengths
+ /* 0x0034 */ Vec3f subdivLengthInv; // inverse of subdivision length
+ /* 0x0040 */ StaticLookup* lookupTbl; // 3d array of length subdivAmount
+ /* 0x0044 */ SSNodeList polyNodes;
/* 0x0050 */ DynaCollisionContext dyna;
/* 0x1468 */ u32 memSize; // Size of all allocated memory plus CollisionContext
/* 0x146C */ u32 flags; // bit 0 reverses conveyor direction (i.e. water flow in Great Bay Temple)
@@ -317,4 +432,162 @@ typedef struct {
/* 0x8 */ s32 nodeListMax; // if -1, dynamically compute max nodes
} BgCheckSceneSubdivisionEntry; // size = 0xC
+void SSNode_SetValue(SSNode* node, s16* polyIndex, u16 next);
+void SSList_SetNull(SSList* ssList);
+void SSNodeList_SetSSListHead(SSNodeList* list, SSList* ssList, s16* polyIndex);
+void DynaSSNodeList_SetSSListHead(DynaSSNodeList* list, SSList* ssList, s16* polyIndex);
+void DynaSSNodeList_Init(struct PlayState* play, DynaSSNodeList* list);
+void DynaSSNodeList_Alloc(struct PlayState* play, DynaSSNodeList* list, u32 numNodes);
+void DynaSSNodeList_ResetCount(DynaSSNodeList* list);
+u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* list);
+void BgCheck_Vec3sToVec3f(Vec3s* src, Vec3f* dest);
+void BgCheck_Vec3fToVec3s(Vec3s* dest, Vec3f* src);
+f32 func_800BFD84(CollisionPoly *poly, f32 arg1, f32 arg2);
+s32 func_800BFDEC(CollisionPoly* polyA, CollisionPoly* polyB, u32* outVtxId0, u32* outVtxId1);
+s16 CollisionPoly_GetMinY(CollisionPoly* poly, Vec3s* vertices);
+void CollisionPoly_GetNormalF(CollisionPoly* poly, f32* nx, f32* ny, f32* nz);
+void func_800C0094(CollisionPoly* poly, f32 tx, f32 ty, f32 tz, MtxF* dest);
+f32 CollisionPoly_GetPointDistanceFromPlane(CollisionPoly* poly, Vec3f* point);
+void CollisionPoly_GetVerticesByBgId(CollisionPoly* poly, s32 bgId, CollisionContext* colCtx, Vec3f* dest);
+s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center, f32 radius);
+void StaticLookup_AddPolyToSSList(CollisionContext* colCtx, SSList* ssList, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
+void StaticLookup_AddPoly(StaticLookup* lookup, CollisionContext* colCtx, CollisionPoly* polyList, Vec3s* vtxList, s16 index);
+void BgCheck_GetSubdivisionMinBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
+void BgCheck_GetSubdivisionMaxBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
+void BgCheck_GetPolySubdivisionBounds(CollisionContext* colCtx, Vec3s* vtxList, CollisionPoly* polyList, s32* subdivMinX, s32* subdivMinY, s32* subdivMinZ, s32* subdivMaxX, s32* subdivMaxY, s32* subdivMaxZ, s16 polyId);
+s32 BgCheck_PolyIntersectsSubdivision(Vec3f* min, Vec3f* max, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
+u32 BgCheck_InitStaticLookup(CollisionContext* colCtx, struct PlayState* play, StaticLookup* lookupTbl);
+s32 BgCheck_IsSmallMemScene(struct PlayState* play);
+s32 BgCheck_TryGetCustomMemsize(s32 sceneId, u32* memSize);
+void BgCheck_SetSubdivisionDimension(f32 min, s32 subdivAmount, f32* max, f32* subdivLength, f32* subdivLengthInv);
+s32 BgCheck_GetSpecialSceneMaxObjects(struct PlayState* play, s32* maxNodes, s32* maxPolygons, s32* maxVertices);
+void BgCheck_Allocate(CollisionContext* colCtx, struct PlayState* play, CollisionHeader* colHeader);
+void BgCheck_SetContextFlags(CollisionContext* colCtx, u32 flags);
+void BgCheck_UnsetContextFlags(CollisionContext* colCtx, u32 flags);
+CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId);
+f32 BgCheck_RaycastFloorImpl(struct PlayState* play, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* pos, Actor* actor, u32 arg7, f32 checkDist, s32 arg9);
+f32 BgCheck_CameraRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor2(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor2_1(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor3(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor5(CollisionContext* colCtx, CollisionPoly** outPoly, s32* outBgId, Actor* actor, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor5_2(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor5_3(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor6(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos, f32 checkDist);
+f32 BgCheck_EntityRaycastFloor7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
+f32 BgCheck_AnyRaycastFloor1(CollisionContext* colCtx, CollisionPoly* outPoly, Vec3f* pos);
+f32 BgCheck_AnyRaycastFloor2(CollisionContext* colCtx, CollisionPoly* outPoly, s32* bgId, Vec3f* pos);
+f32 BgCheck_CameraRaycastFloor2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor8(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
+f32 BgCheck_EntityRaycastFloor9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
+s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight, u8 argA);
+s32 BgCheck_EntitySphVsWall1(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, f32 checkHeight);
+s32 BgCheck_EntitySphVsWall2(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, f32 checkHeight);
+s32 BgCheck_EntitySphVsWall3(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
+s32 BgCheck_EntitySphVsWall4(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
+s32 BgCheck_CheckCeilingImpl(CollisionContext* colCtx, u16 xpFlags, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
+s32 BgCheck_AnyCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight);
+s32 BgCheck_EntityCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
+s32 BgCheck_CameraLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
+s32 BgCheck_CameraLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
+s32 BgCheck_EntityLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
+s32 BgCheck_EntityLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor);
+s32 BgCheck_EntityLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor, f32 checkDist);
+s32 BgCheck_ProjectileLineTest(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
+s32 BgCheck_AnyLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkOneFace);
+s32 BgCheck_AnyLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace);
+s32 BgCheck_AnyLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
+s32 BgCheck_SphVsFirstPolyImpl(CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* center, f32 radius, Actor* actor, u16 bciFlags);
+s32 BgCheck_SphVsFirstPoly(CollisionContext* colCtx, Vec3f* center, f32 radius);
+s32 BgCheck_SphVsFirstWall(CollisionContext* colCtx, Vec3f* center, f32 radius);
+void SSNodeList_Init(SSNodeList* this);
+void SSNodeList_Alloc(struct PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys);
+SSNode* SSNodeList_GetNextNode(SSNodeList* this);
+u16 SSNodeList_GetNextNodeIdx(SSNodeList* this);
+void ScaleRotPos_Init(ScaleRotPos* srp);
+void ScaleRotPos_SetValue(ScaleRotPos* srp, Vec3f* scale, Vec3s* rot, Vec3f* pos);
+s32 ScaleRotPos_IsEqual(ScaleRotPos* a, ScaleRotPos* b);
+void DynaLookup_ResetLists(DynaLookup* dynaLookup);
+void DynaLookup_Reset(DynaLookup* dynaLookup);
+void DynaLookup_ResetVtxStartIndex(u16* vtxStartIndex);
+void DynaLookup_ResetWaterBoxStartIndex(u16* waterBoxStartIndex);
+void BgActor_Init(struct PlayState* play, BgActor* bgActor);
+void BgActor_SetActor(BgActor* bgActor, Actor* actor, CollisionHeader* colHeader);
+s32 BgActor_IsTransformUnchanged(BgActor* bgActor);
+void DynaPoly_NullPolyList(CollisionPoly** polyList);
+void DynaPoly_AllocPolyList(struct PlayState* play, CollisionPoly** polyList, s32 numPolys);
+void DynaPoly_NullVtxList(Vec3s** vtxList);
+void DynaPoly_AllocVtxList(struct PlayState* play, Vec3s** vtxList, s32 numVtx);
+void DynaPoly_InitWaterBoxList(DynaWaterBoxList* waterBoxList);
+void DynaPoly_AllocWaterBoxList(struct PlayState* play, DynaWaterBoxList* waterBoxList, s32 numWaterBoxes);
+void DynaPoly_SetBgActorPrevTransform(struct PlayState* play, BgActor* bgActor);
+s32 DynaPoly_IsBgIdBgActor(s32 bgId);
+void DynaPoly_Init(struct PlayState* play, DynaCollisionContext* dyna);
+void DynaPoly_Alloc(struct PlayState* play, DynaCollisionContext* dyna);
+s32 DynaPoly_SetBgActor(struct PlayState* play, DynaCollisionContext* dyna, Actor* actor, CollisionHeader* colHeader);
+DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId);
+void DynaPoly_DisableCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_EnableCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_DisableCeilingCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_EnableCeilingCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_DisableFloorCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_EnableFloorCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void DynaPoly_InvalidateLookup(struct PlayState* play, DynaCollisionContext* dyna);
+void DynaPoly_DeleteBgActor(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
+void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPos, Vec3s* minPosOut, s16* xLength, s16* zLength);
+void DynaPoly_AddBgActorToLookup(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex, s32* waterBoxStartIndex);
+void DynaPoly_UnsetAllInteractFlags(struct PlayState* play, DynaCollisionContext* dyna, Actor* actor);
+void DynaPoly_UpdateContext(struct PlayState* play, DynaCollisionContext* dyna);
+void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertices, s32* numWaterBoxes);
+void DynaPoly_UpdateBgActorTransforms(struct PlayState* play, DynaCollisionContext* dyna);
+void CollisionHeader_SegmentedToVirtual(CollisionHeader* colHeader);
+void CollisionHeader_GetVirtual(CollisionHeader* colHeader, CollisionHeader** dest);
+void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, struct PlayState* play);
+
+u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
+u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
+u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId);
+Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+
+u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+FloorType SurfaceType_GetFloorType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 func_800C99FC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_GetWallFlags(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_CheckWallFlag0(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_CheckWallFlag1(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_CheckWallFlag2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+FloorProperty SurfaceType_GetFloorProperty2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+FloorProperty SurfaceType_GetFloorProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_IsSoft(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_IsHorseBlocked(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+SurfaceMaterial SurfaceType_GetMaterial(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u16 SurfaceType_GetSfxOffset(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_HasMaterialProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 propertyType);
+FloorEffect SurfaceType_GetFloorEffect(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_GetLightSettingIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_GetEcho(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_IsHookshotSurface(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_IsIgnoredByEntities(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_IsIgnoredByProjectiles(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 SurfaceType_IsFloorConveyor(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 func_800C9DDC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+ConveyorSpeed SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_GetConveyorDirection(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+u32 SurfaceType_IsWallDamage(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
+s32 WaterBox_GetSurfaceImpl(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
+s32 WaterBox_GetSurface1(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
+s32 WaterBox_GetSurface1_2(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
+s32 WaterBox_GetSurface2(struct PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceCheckDist, WaterBox** outWaterBox, s32* bgId);
+f32 func_800CA568(CollisionContext* colCtx, s32 waterBoxId, s32 bgId);
+u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId);
+void WaterBox_GetSceneBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
+u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox);
+s32 func_800CA6F0(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
+s32 func_800CA9D0(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
+s32 func_800CAA14(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint);
+
#endif
diff --git a/include/z64bombers_notebook.h b/include/z64bombers_notebook.h
new file mode 100644
index 000000000..403f4a88a
--- /dev/null
+++ b/include/z64bombers_notebook.h
@@ -0,0 +1,58 @@
+#ifndef Z64BOMBERS_NOTEBOOK_H
+#define Z64BOMBERS_NOTEBOOK_H
+
+#include "ultra64.h"
+#include "io/controller.h"
+#include "z64dma.h"
+
+#define DEFINE_PERSON(enum, _photo, _description, _metEnum, _metMessage, _metFlag) enum,
+typedef enum BombersNotebookPerson {
+ #include "tables/bombers_notebook/person_table.h"
+ /* 0x14 */ BOMBERS_NOTEBOOK_PERSON_MAX
+} BombersNotebookPerson;
+
+#undef DEFINE_PERSON
+
+typedef enum BombersNotebookLoadState {
+ /* 0 */ BOMBERS_NOTEBOOK_LOAD_STATE_NONE,
+ /* 1 */ BOMBERS_NOTEBOOK_LOAD_STATE_STARTED,
+ /* 2 */ BOMBERS_NOTEBOOK_LOAD_STATE_DONE
+} BombersNotebookLoadState;
+
+#define DEFINE_PERSON(_enum, _photo, _description, metEnum, _metMessage, _metFlag) metEnum,
+#define DEFINE_EVENT(enum, _icon, _colorFlag, _description, _completedMessage, _completedFlag) enum,
+typedef enum BombersNotebookEvent {
+ #include "tables/bombers_notebook/person_table.h"
+ #include "tables/bombers_notebook/event_table.h"
+ /* 0x37 */ BOMBERS_NOTEBOOK_EVENT_MAX
+} BombersNotebookEvent;
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+typedef struct {
+ /* 0x00 */ u8 loadState;
+ /* 0x01 */ UNK_TYPE1 pad01[0x3F];
+ /* 0x40 */ void* scheduleDmaSegment;
+ /* 0x44 */ uintptr_t scheduleDmaSegmentStart;
+ /* 0x48 */ size_t scheduleDmaSegmentSize;
+ /* 0x4C */ DmaRequest dmaRequest;
+ /* 0x6C */ OSMesgQueue loadQueue;
+ /* 0x84 */ OSMesg loadMsg[1];
+ /* 0x88 */ void* scheduleSegment;
+ /* 0x8C */ uintptr_t scheduleSegmentStart;
+ /* 0x90 */ size_t scheduleSegmentSize;
+ /* 0x94 */ s32 cursorPageRow;
+ /* 0x98 */ s32 cursorEntry; // Entries are 3 apart, see BOMBERS_NOTEBOOK_ENTRY_SIZE
+ /* 0x9C */ s32 cursorPage;
+ /* 0xA0 */ UNK_TYPE1 padA0[0x4];
+ /* 0xA4 */ s32 scrollAmount;
+ /* 0xA8 */ s32 scrollOffset;
+} BombersNotebook; // size = 0xAC
+
+void BombersNotebook_Draw(BombersNotebook* this, struct GraphicsContext* gfxCtx);
+void BombersNotebook_Update(struct PlayState* play, BombersNotebook* this, Input* input);
+void BombersNotebook_Init(BombersNotebook* this);
+void BombersNotebook_Destroy(BombersNotebook* this);
+
+#endif
diff --git a/include/z64camera.h b/include/z64camera.h
index 9c101bf73..ccdee8811 100644
--- a/include/z64camera.h
+++ b/include/z64camera.h
@@ -90,18 +90,18 @@
#define CAM_BEHAVIOR_SETTING_2 (1 << 4)
// Mode (0x2, 0x20)
#define CAM_BEHAVIOR_MODE_1 (1 << 1)
-#define CAM_BEHAVIOR_MODE_2 (1 << 5)
+#define CAM_BEHAVIOR_MODE_VALID (1 << 5)
// bgCam (0x4, 0x40)
#define CAM_BEHAVIOR_BGCAM_1 (1 << 2)
#define CAM_BEHAVIOR_BGCAM_2 (1 << 6)
// Camera stateFlags. Variety of generic flags
#define CAM_STATE_0 (1 << 0) // Must be set for the camera from changing settings based on the bg surface
-#define CAM_STATE_1 (1 << 1)
+#define CAM_STATE_CHECK_WATER (1 << 1)
#define CAM_STATE_2 (1 << 2)
#define CAM_STATE_3 (1 << 3)
#define CAM_STATE_4 (1 << 4)
-#define CAM_STATE_5 (1 << 5)
+#define CAM_STATE_DISABLE_MODE_CHANGE (1 << 5)
#define CAM_STATE_6 (1 << 6)
#define CAM_STATE_7 (1 << 7)
#define CAM_STATE_UNDERWATER (1 << 8)
@@ -110,7 +110,7 @@
#define CAM_STATE_11 (1 << 11)
#define CAM_STATE_12 (1 << 12)
#define CAM_STATE_13 (1 << 13)
-#define CAM_STATE_14 (1 << 14)
+#define CAM_STATE_INITIALIZED (1 << 14)
#define CAM_STATE_15 ((s16)(1 << 15))
// Camera viewFlags. Set params related to view
@@ -340,13 +340,13 @@ typedef enum {
} CameraFuncType;
typedef enum {
- /* 0x00 */ CAM_DATA_00,
+ /* 0x00 */ CAM_DATA_Y_OFFSET,
/* 0x01 */ CAM_DATA_01,
/* 0x02 */ CAM_DATA_02,
- /* 0x03 */ CAM_DATA_03,
+ /* 0x03 */ CAM_DATA_PITCH_TARGET,
/* 0x04 */ CAM_DATA_04,
/* 0x05 */ CAM_DATA_05,
- /* 0x06 */ CAM_DATA_06,
+ /* 0x06 */ CAM_DATA_YAW_DIFF_RANGE,
/* 0x07 */ CAM_DATA_FOV,
/* 0x08 */ CAM_DATA_08,
/* 0x09 */ CAM_DATA_INTERFACE_FLAGS,
@@ -361,7 +361,7 @@ typedef enum {
/* 0x12 */ CAM_DATA_18,
/* 0x13 */ CAM_DATA_19,
/* 0x14 */ CAM_DATA_20,
- /* 0x15 */ CAM_DATA_21,
+ /* 0x15 */ CAM_DATA_21
} CameraDataType;
/*================================
@@ -374,7 +374,7 @@ typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f norm;
/* 0x18 */ CollisionPoly* poly;
- /* 0x1C */ VecSph sphNorm;
+ /* 0x1C */ VecGeo geoNorm;
/* 0x24 */ s32 bgId;
} CameraCollision; // size = 0x28
@@ -405,13 +405,13 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM1(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -462,10 +462,10 @@ typedef struct {
// Unused Camera RemoteBomb Setting
#define CAM_FUNCDATA_NORM2(yOffset, data01, data02, pitchTarget, data04, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
@@ -480,10 +480,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM3(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
{ fov, CAM_DATA_FOV }, \
@@ -530,12 +530,12 @@ typedef struct {
*/
#define CAM_FUNCDATA_NORM0(yOffset, data01, data02, data21, data04, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data21, CAM_DATA_21 }, \
{ data04, CAM_DATA_04 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -581,10 +581,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_PARA1(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
@@ -596,10 +596,10 @@ typedef struct {
// Same as above but with extra unused entry
#define CAM_FUNCDATA_PARA1_ALT(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
@@ -662,10 +662,10 @@ typedef struct {
// Unused Camera Maze Setting
#define CAM_FUNCDATA_PARA2(yOffset, data02, data01, pitchTarget, data04, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data02, CAM_DATA_02 }, \
{ data01, CAM_DATA_01 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
@@ -680,7 +680,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_JUMP2(yOffset, data01, data02, data20, data04, data05, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data20, CAM_DATA_20 }, \
@@ -729,13 +729,13 @@ typedef struct {
*/
#define CAM_FUNCDATA_JUMP3(yOffset, data01, data02, pitchTarget, data04, data05, yawDiffRange, fov, data08, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data04, CAM_DATA_04 }, \
{ data05, CAM_DATA_05 }, \
- { yawDiffRange, CAM_DATA_06 }, \
+ { yawDiffRange, CAM_DATA_YAW_DIFF_RANGE }, \
{ fov, CAM_DATA_FOV }, \
{ data08, CAM_DATA_08 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -785,7 +785,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_BATT1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -845,7 +845,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -902,7 +902,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP3(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, timer, interfaceFlags, data18) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data13, CAM_DATA_13 }, \
@@ -957,9 +957,9 @@ typedef struct {
*/
#define CAM_FUNCDATA_KEEP4(yOffset, data01, pitchTarget, data10, data18, fov, interfaceFlags, data04, timer) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
- { pitchTarget, CAM_DATA_03 }, \
+ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ data10, CAM_DATA_10 }, \
{ data18, CAM_DATA_18 }, \
{ fov, CAM_DATA_FOV }, \
@@ -1008,7 +1008,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_FIXD1(yOffset, data04, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data04, CAM_DATA_04 }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1040,7 +1040,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_FIXD2(yOffset, data01, data02, data04, data05, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data04, CAM_DATA_04 }, \
@@ -1097,7 +1097,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SUBJ1(yOffset, data01, data02, data04, data19, data17, data18, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ data02, CAM_DATA_02 }, \
{ data04, CAM_DATA_04 }, \
@@ -1140,7 +1140,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_UNIQ2(yOffset, data01, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data01, CAM_DATA_01 }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1175,7 +1175,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_UNIQ0(yOffset, data04, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ data04, CAM_DATA_04 }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1244,8 +1244,8 @@ typedef struct {
typedef struct {
/* 0x00 */ Vec3f unk_00;
- /* 0x0C */ VecSph unk_0C;
- /* 0x14 */ VecSph unk_14;
+ /* 0x0C */ VecGeo unk_0C;
+ /* 0x14 */ VecGeo unk_14;
/* 0x1C */ s16 unk_1C;
} Demo1ReadWriteData; // size = 0x20
@@ -1319,7 +1319,7 @@ typedef struct {
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
- /* 0x18 */ VecSph unk_18; // sp18-1C-20--24-26-28 // CutsceneCameraPoint?
+ /* 0x18 */ VecGeo unk_18;
/* 0x20 */ s16 unk_20;
/* 0x22 */ s16 timer;
} Demo4ReadWriteData; // size = 0x24
@@ -1345,7 +1345,7 @@ typedef struct {
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18;
- /* 0x1C */ VecSph unk_1C;
+ /* 0x1C */ VecGeo unk_1C;
/* 0x24 */ s16 unk_24;
/* 0x26 */ s16 timer;
} Demo5ReadWriteData; // size = 0x28
@@ -1367,8 +1367,8 @@ typedef struct {
typedef struct {
/* 0x00 */ f32 unk_00;
- /* 0x04 */ VecSph subAtToEye;
- /* 0x0C */ VecSph atToEye;
+ /* 0x04 */ VecGeo subAtToEye;
+ /* 0x0C */ VecGeo atToEye;
/* 0x14 */ s16 unk_14;
/* 0x16 */ s16 unk_16;
/* 0x18 */ s16 unk_18;
@@ -1387,10 +1387,10 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC5(yOffset, eyeDist, minDistForRot, fov, atMaxLERPScale, timerInit, pitch, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_01 }, \
{ minDistForRot, CAM_DATA_02 }, \
- { fov, CAM_DATA_03 }, \
+ { fov, CAM_DATA_PITCH_TARGET }, \
{ atMaxLERPScale, CAM_DATA_FOV }, \
{ timerInit, CAM_DATA_08 }, \
{ pitch, CAM_DATA_12 }, \
@@ -1446,7 +1446,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC8(yOffset, eyeStepScale, posStepScale, fov, spiralDoorCsLength, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeStepScale, CAM_DATA_04 }, \
{ posStepScale, CAM_DATA_05 }, \
{ fov, CAM_DATA_FOV }, \
@@ -1483,7 +1483,7 @@ typedef struct {
*/
#define CAM_FUNCDATA_SPEC9(yOffset, fov, interfaceFlags) \
- { yOffset, CAM_DATA_00 }, \
+ { yOffset, CAM_DATA_Y_OFFSET }, \
{ fov, CAM_DATA_FOV }, \
{ interfaceFlags, CAM_DATA_INTERFACE_FLAGS }
@@ -1565,11 +1565,11 @@ typedef struct Camera {
/* 0x0D8 */ f32 xzSpeed;
/* 0x0DC */ f32 dist;
/* 0x0E0 */ f32 speedRatio;
- /* 0x0E4 */ Vec3f atActorOffset;
- /* 0x0F0 */ Vec3f focalActorOffset;
+ /* 0x0E4 */ Vec3f focalActorAtOffset; // Offset between the camera's at Pos and the focalActor's Pos
+ /* 0x0F0 */ Vec3f unk_0F0; // Offset between the focalActor's Pos and the camera's focalActor's Pos from the previous frame
/* 0x0FC */ f32 fov;
/* 0x100 */ f32 atLerpStepScale;
- /* 0x104 */ f32 playerFloorHeight;
+ /* 0x104 */ f32 focalActorFloorHeight;
/* 0x108 */ Vec3f floorNorm;
/* 0x114 */ f32 waterYPos;
/* 0x118 */ s32 waterPrevBgCamDataId;
@@ -1588,11 +1588,11 @@ typedef struct Camera {
/* 0x142 */ s16 setting;
/* 0x144 */ s16 mode;
/* 0x146 */ s16 bgId;
- /* 0x148 */ s16 bgCamDataId;
+ /* 0x148 */ s16 bgCamIndex;
/* 0x14A */ s16 behaviorFlags;
/* 0x14C */ s16 stateFlags;
/* 0x14E */ s16 childCamId;
- /* 0x150 */ s16 doorTimer1; // a door timer used when door cam is indexed from bgCamDataId
+ /* 0x150 */ s16 doorTimer1; // a door timer used when door cam is indexed from bgCamIndex
/* 0x152 */ s16 unk152;
/* 0x154 */ s16 prevSetting;
/* 0x156 */ s16 nextCamSceneDataId;
@@ -1600,8 +1600,8 @@ typedef struct Camera {
/* 0x15A */ s16 roll;
/* 0x15C */ s16 viewFlags;
/* 0x15E */ s16 animState; // Determines the current state of the current camera behavior function
- /* 0x160 */ s16 unk160;
- /* 0x162 */ s16 doorTimer2; // a door timer used when door cam is indexed from bgCamDataId
+ /* 0x160 */ s16 timer; // Unused remnant of OoT: originally destoryed subCamera when timer ran out
+ /* 0x162 */ s16 doorTimer2; // a door timer used when door cam is indexed from bgCamIndex
/* 0x164 */ s16 camId;
/* 0x166 */ s16 prevBgCamDataId;
/* 0x168 */ s16 unk168;
diff --git a/include/z64cutscene.h b/include/z64cutscene.h
index f4cc10802..1fc32be28 100644
--- a/include/z64cutscene.h
+++ b/include/z64cutscene.h
@@ -4,158 +4,575 @@
#include "ultra64.h"
#include "unk.h"
-typedef struct {
- /* 0x0 */ s8 continueFlag;
- /* 0x1 */ s8 cameraRoll;
- /* 0x2 */ u16 nextPointFrame;
- /* 0x4 */ f32 viewAngle; // in degrees
- /* 0x8 */ Vec3s pos;
-} CutsceneCameraPoint; // size = 0x10
-typedef struct {
- /* 0x00 */ Vec3f at;
- /* 0x0C */ Vec3f eye;
- /* 0x18 */ s16 roll;
- /* 0x1A */ s16 fov;
-} CutsceneCameraAngle; // size = 0x1C
-
-typedef struct {
- /* 0x0 */ CutsceneCameraPoint* atPoints;
- /* 0x4 */ CutsceneCameraPoint* eyePoints;
- /* 0x8 */ s16 relativeToPlayer;
-} CutsceneCameraMove; // size = 0xC
-
-typedef struct {
- /* 0x00 */ u16 action; // "dousa"
- /* 0x02 */ u16 startFrame;
- /* 0x04 */ u16 endFrame;
- union {
- /* 0x06 */ Vec3s rot;
- /* 0x06 */ Vec3us urot;
+typedef union {
+ struct {
+ /* 0x00 */ u16 id; // "dousa"
+ /* 0x02 */ u16 startFrame;
+ /* 0x04 */ u16 endFrame;
+ /* 0x06 */ Vec3us rot;
+ /* 0x0C */ Vec3i startPos;
+ /* 0x18 */ Vec3i endPos;
+ /* 0x24 */ Vec3f normal;
};
- /* 0x0C */ Vec3i startPos;
- /* 0x18 */ Vec3i endPos;
- /* 0x24 */ Vec3f normal;
-} CsCmdActorAction; // size = 0x30
+ s32 _words[12];
+} CsCmdActorCue; // size = 0x30
-typedef struct {
- /* 0x0 */ u16 base;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u16 unk_06;
-} CsCmdBase; // size = 0x8
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdMisc; // size = 0x30
-typedef struct {
- /* 0x0 */ u16 unk0;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u8 hour;
- /* 0x7 */ u8 minute;
- /* 0x8 */ UNK_TYPE1 unk_08[0x04];
-} CsCmdDayTime; // size = 0xC
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ /* 0x6 */ u8 hour;
+ /* 0x7 */ u8 minute;
+ };
+ s32 _words[3];
+} CsCmdTime; // size = 0xC
-typedef struct {
- /* 0x0 */ u16 setting;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u16 unk_06;
-} CsCmdEnvLighting; // size = 0x8
+typedef union {
+ struct {
+ /* 0x0 */ u16 settingPlusOne;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdLightSetting; // size = 0x8
-typedef struct {
- /* 0x0 */ u16 sequence;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u16 unk_06;
-} CsCmdSequenceChange; // size = 0x8
+typedef union {
+ struct {
+ /* 0x0 */ u16 seqIdPlusOne;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdStartSeq; // size = 0x8
-typedef struct {
- /* 0x0 */ u16 type;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u16 unk_06;
- /* 0x8 */ u32 unk_08;
-} CsCmdSequenceFade; // size = 0xC
+typedef union {
+ struct {
+ /* 0x0 */ u16 seqIdPlusOne;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdStopSeq; // size = 0x8
-typedef struct {
- /* 0x0 */ u16 base;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u16 type;
- /* 0x8 */ u16 textId1;
- /* 0xA */ u16 textId2;
-} CsCmdTextbox; // size = 0xC
+typedef union {
+ struct {
+ /* 0x0 */ u16 seqPlayer;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[3];
+} CsCmdFadeOutSeq; // size = 0xC
typedef enum {
- /* -1 */ CS_TEXTBOX_TYPE_NONE = -1,
- /* 0 */ CS_TEXTBOX_TYPE_DEFAULT,
- /* 1 */ CS_TEXTBOX_TYPE_1,
- /* 2 */ CS_TEXTBOX_TYPE_LEARN_SONG,
- /* 3 */ CS_TEXTBOX_TYPE_3,
- /* 4 */ CS_TEXTBOX_TYPE_BOSSES_REMAINS,
- /* 5 */ CS_TEXTBOX_TYPE_ALL_NORMAL_MASKS
-} CutsceneTextboxType;
+ /* 1 */ CS_FADE_OUT_BGM_MAIN = 1,
+ /* 2 */ CS_FADE_OUT_FANFARE
+} CutsceneFadeOutSeqPlayer;
-typedef struct {
- /* 0x0 */ u16 type;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ u8 intensity;
- /* 0x7 */ u8 decayTimer;
- /* 0x8 */ u8 decayStep;
- /* 0x9 */ UNK_TYPE1 pad9[0x3];
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdStartAmbience; // size = 0x8
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdFadeOutAmbience; // size = 0x8
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdModifySeq; // size = 0x8
+
+typedef enum {
+ /* 1 */ CS_MOD_SEQ_0 = 1,
+ /* 2 */ CS_MOD_SEQ_1,
+ /* 3 */ CS_MOD_SEQ_2,
+ /* 4 */ CS_MOD_AMBIENCE_0,
+ /* 5 */ CS_MOD_AMBIENCE_1,
+ /* 6 */ CS_MOD_AMBIENCE_2,
+ /* 7 */ CS_MOD_SEQ_STORE,
+ /* 8 */ CS_MOD_SEQ_RESTORE
+} CsModifySeqType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdDestination; // size = 0x8
+
+typedef enum {
+ /* 1 */ CS_DESTINATION_DEFAULT = 1,
+ /* 2 */ CS_DESTINATION_BOSS_WARP
+} CsDestinationType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdChooseCreditsScene; // size = 0x8
+
+typedef enum {
+ /* 1 */ CS_CREDITS_DESTINATION = CS_DESTINATION_DEFAULT,
+ /* 2 */ CS_CREDITS_MASK_KAMARO,
+ /* 3 */ CS_CREDITS_MASK_GREAT_FAIRY,
+ /* 4 */ CS_CREDITS_MASK_ROMANI,
+ /* 5 */ CS_CREDITS_MASK_BLAST,
+ /* 6 */ CS_CREDITS_MASK_CIRCUS_LEADER,
+ /* 7 */ CS_CREDITS_MASK_BREMEN,
+ /* 8 */ CS_CREDITS_IKANA,
+ /* 9 */ CS_CREDITS_MASK_COUPLE,
+ /* 10 */ CS_CREDITS_MASK_BUNNY,
+ /* 11 */ CS_CREDITS_MASK_POSTMAN
+} CsChooseCreditsSceneType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdMotionBlur; // size = 0x8
+
+typedef enum {
+ /* 1 */ CS_MOTION_BLUR_ENABLE = 1, // enable instantly
+ /* 2 */ CS_MOTION_BLUR_DISABLE // disable gradually
+} CsMotionBlurType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdSfxReverbIndexTo2; // size = 0x8
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdSfxReverbIndexTo1; // size = 0x8
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ };
+ s32 _words[2];
+} CsCmdTransition; // size = 0x8
+
+typedef enum {
+ /* 1 */ CS_TRANS_GRAY_FILL_IN = 1, // has hardcoded sounds for some scenes
+ /* 2 */ CS_TRANS_BLUE_FILL_IN,
+ /* 3 */ CS_TRANS_RED_FILL_OUT,
+ /* 4 */ CS_TRANS_GREEN_FILL_OUT,
+ /* 5 */ CS_TRANS_GRAY_FILL_OUT,
+ /* 6 */ CS_TRANS_BLUE_FILL_OUT,
+ /* 7 */ CS_TRANS_RED_FILL_IN,
+ /* 8 */ CS_TRANS_GREEN_FILL_IN,
+ /* 9 */ CS_TRANS_TRIGGER_INSTANCE, // used with `TRANS_MODE_INSTANCE_WAIT`
+ /* 10 */ CS_TRANS_BLACK_FILL_OUT,
+ /* 11 */ CS_TRANS_BLACK_FILL_IN,
+ /* 12 */ CS_TRANS_GRAY_TO_BLACK,
+ /* 13 */ CS_TRANS_BLACK_TO_GRAY
+} CutsceneTransitionType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 textId; // can also be an ocarina action for `CS_TEXT_OCARINA_ACTION`
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ /* 0x6 */ u16 type;
+ /* 0x8 */ u16 altTextId1;
+ /* 0xA */ u16 altTextId2;
+ };
+ s32 _words[3];
+} CsCmdText; // size = 0xC
+
+typedef enum {
+ /* -1 */ CS_TEXT_TYPE_NONE = -1,
+ /* 0 */ CS_TEXT_TYPE_DEFAULT,
+ /* 1 */ CS_TEXT_TYPE_1,
+ /* 2 */ CS_TEXT_OCARINA_ACTION,
+ /* 3 */ CS_TEXT_TYPE_3,
+ /* 4 */ CS_TEXT_TYPE_BOSSES_REMAINS, // use `altText1` in the Giant Cutscene if all remains are already obtained
+ /* 5 */ CS_TEXT_TYPE_ALL_NORMAL_MASKS
+} CutsceneTextType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ /* 0x6 */ u8 intensity;
+ /* 0x7 */ u8 decayTimer;
+ /* 0x8 */ u8 decayStep;
+ };
+ s32 _words[3];
} CsCmdRumble; // size = 0xC
-typedef struct {
- /* 0x0 */ u16 unk0;
- /* 0x2 */ u16 startFrame;
- /* 0x4 */ u16 endFrame;
- /* 0x6 */ Color_RGB8 color;
- /* 0x9 */ UNK_TYPE1 pad9[0x3];
-} CsCmdFadeScreen; // size = 0xC
+typedef enum {
+ /* 1 */ CS_RUMBLE_ONCE = 1, // rumble once when startFrame is reached
+ /* 2 */ CS_RUMBLE_PULSE // rumble every 64 frames between startFrame and endFrame
+} CutsceneRumbleType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 type;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame;
+ /* 0x6 */ Color_RGB8 color;
+ };
+ s32 _words[3];
+} CsCmdTransitionGeneral; // size = 0xC
typedef enum {
- /* 0 */ CS_STATE_0,
- /* 1 */ CS_STATE_1,
- /* 2 */ CS_STATE_2,
- /* 3 */ CS_STATE_3,
- /* 4 */ CS_STATE_4
+ /* 1 */ CS_TRANS_GENERAL_FILL_IN = 1,
+ /* 2 */ CS_TRANS_GENERAL_FILL_OUT
+} CsTransitionGeneralType;
+
+typedef union {
+ struct {
+ /* 0x0 */ u16 giveTatl;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdGiveTatl; // size = 0x8
+
+typedef enum {
+ /* 0 */ CS_STATE_IDLE,
+ /* 1 */ CS_STATE_START,
+ /* 2 */ CS_STATE_RUN,
+ /* 3 */ CS_STATE_STOP,
+ /* 4 */ CS_STATE_RUN_UNSTOPPABLE
} CutsceneState;
+typedef union {
+ struct {
+ /* 0x0 */ u16 unused0;
+ /* 0x2 */ u16 startFrame;
+ /* 0x4 */ u16 endFrame; // unused
+ };
+ s32 _words[2];
+} CsCmdUnimplemented; // size = 0x8
+
typedef enum {
- /* 0x00A */ CS_CMD_TEXTBOX = 0xA,
- /* 0x05A */ CS_CMD_CAMERA = 0x5A,
- /* 0x096 */ CS_CMD_MISC = 0x96,
- /* 0x097 */ CS_CMD_SET_LIGHTING,
- /* 0x098 */ CS_CMD_SCENE_TRANS_FX,
- /* 0x099 */ CS_CMD_MOTIONBLUR,
- /* 0x09A */ CS_CMD_GIVETATL,
- /* 0x09B */ CS_CMD_FADESCREEN,
- /* 0x09C */ CS_CMD_FADESEQ,
- /* 0x09D */ CS_CMD_SETTIME,
- /* 0x0C8 */ CS_CMD_SET_PLAYER_ACTION = 0xC8,
- /* 0x0FA */ CS_CMD_UNK_FA = 0xFA,
- /* 0x0FE */ CS_CMD_UNK_FE = 0xFE,
- /* 0x0FF */ CS_CMD_UNK_FF,
- /* 0x100 */ CS_CMD_UNK_100,
- /* 0x101 */ CS_CMD_UNK_101,
- /* 0x102 */ CS_CMD_UNK_102,
- /* 0x103 */ CS_CMD_UNK_103,
- /* 0x104 */ CS_CMD_UNK_104,
- /* 0x105 */ CS_CMD_UNK_105,
- /* 0x108 */ CS_CMD_UNK_108 = 0x108,
- /* 0x109 */ CS_CMD_UNK_109,
- /* 0x12C */ CS_CMD_PLAYSEQ = 0x12C,
- /* 0x12D */ CS_CMD_STOPSEQ,
- /* 0x12E */ CS_CMD_PLAYAMBIENCE,
- /* 0x12F */ CS_CMD_FADEAMBIENCE,
- /* 0x130 */ CS_CMD_130,
- /* 0x131 */ CS_CMD_131,
- /* 0x132 */ CS_CMD_132,
- /* 0x15E */ CS_CMD_TERMINATOR = 0x15E,
+ /* 0x00A */ CS_CMD_TEXT = 10,
+ /* 0x05A */ CS_CMD_CAMERA_SPLINE = 90,
+ /* 0x064 */ CS_CMD_ACTOR_CUE_100 = 100,
+ /* 0x065 */ CS_CMD_ACTOR_CUE_101,
+ /* 0x066 */ CS_CMD_ACTOR_CUE_102,
+ /* 0x067 */ CS_CMD_ACTOR_CUE_103,
+ /* 0x068 */ CS_CMD_ACTOR_CUE_104,
+ /* 0x069 */ CS_CMD_ACTOR_CUE_105,
+ /* 0x06A */ CS_CMD_ACTOR_CUE_106,
+ /* 0x06B */ CS_CMD_ACTOR_CUE_107,
+ /* 0x06C */ CS_CMD_ACTOR_CUE_108,
+ /* 0x06D */ CS_CMD_ACTOR_CUE_109,
+ /* 0x06E */ CS_CMD_ACTOR_CUE_110,
+ /* 0x06F */ CS_CMD_ACTOR_CUE_111,
+ /* 0x070 */ CS_CMD_ACTOR_CUE_112,
+ /* 0x071 */ CS_CMD_ACTOR_CUE_113,
+ /* 0x072 */ CS_CMD_ACTOR_CUE_114,
+ /* 0x073 */ CS_CMD_ACTOR_CUE_115,
+ /* 0x074 */ CS_CMD_ACTOR_CUE_116,
+ /* 0x075 */ CS_CMD_ACTOR_CUE_117,
+ /* 0x076 */ CS_CMD_ACTOR_CUE_118,
+ /* 0x077 */ CS_CMD_ACTOR_CUE_119,
+ /* 0x078 */ CS_CMD_ACTOR_CUE_120,
+ /* 0x079 */ CS_CMD_ACTOR_CUE_121,
+ /* 0x07A */ CS_CMD_ACTOR_CUE_122,
+ /* 0x07B */ CS_CMD_ACTOR_CUE_123,
+ /* 0x07C */ CS_CMD_ACTOR_CUE_124,
+ /* 0x07D */ CS_CMD_ACTOR_CUE_125,
+ /* 0x07E */ CS_CMD_ACTOR_CUE_126,
+ /* 0x07F */ CS_CMD_ACTOR_CUE_127,
+ /* 0x080 */ CS_CMD_ACTOR_CUE_128,
+ /* 0x081 */ CS_CMD_ACTOR_CUE_129,
+ /* 0x082 */ CS_CMD_ACTOR_CUE_130,
+ /* 0x083 */ CS_CMD_ACTOR_CUE_131,
+ /* 0x084 */ CS_CMD_ACTOR_CUE_132,
+ /* 0x085 */ CS_CMD_ACTOR_CUE_133,
+ /* 0x086 */ CS_CMD_ACTOR_CUE_134,
+ /* 0x087 */ CS_CMD_ACTOR_CUE_135,
+ /* 0x088 */ CS_CMD_ACTOR_CUE_136,
+ /* 0x089 */ CS_CMD_ACTOR_CUE_137,
+ /* 0x08A */ CS_CMD_ACTOR_CUE_138,
+ /* 0x08B */ CS_CMD_ACTOR_CUE_139,
+ /* 0x08C */ CS_CMD_ACTOR_CUE_140,
+ /* 0x08D */ CS_CMD_ACTOR_CUE_141,
+ /* 0x08E */ CS_CMD_ACTOR_CUE_142,
+ /* 0x08F */ CS_CMD_ACTOR_CUE_143,
+ /* 0x090 */ CS_CMD_ACTOR_CUE_144,
+ /* 0x091 */ CS_CMD_ACTOR_CUE_145,
+ /* 0x092 */ CS_CMD_ACTOR_CUE_146,
+ /* 0x093 */ CS_CMD_ACTOR_CUE_147,
+ /* 0x094 */ CS_CMD_ACTOR_CUE_148,
+ /* 0x095 */ CS_CMD_ACTOR_CUE_149,
+ /* 0x096 */ CS_CMD_MISC,
+ /* 0x097 */ CS_CMD_LIGHT_SETTING,
+ /* 0x098 */ CS_CMD_TRANSITION,
+ /* 0x099 */ CS_CMD_MOTION_BLUR,
+ /* 0x09A */ CS_CMD_GIVE_TATL,
+ /* 0x09B */ CS_CMD_TRANSITION_GENERAL,
+ /* 0x09C */ CS_CMD_FADE_OUT_SEQ,
+ /* 0x09D */ CS_CMD_TIME,
+ /* 0x0C8 */ CS_CMD_PLAYER_CUE = 200,
+ /* 0x0C9 */ CS_CMD_ACTOR_CUE_201,
+ /* 0x0FA */ CS_CMD_UNK_DATA_FA = 0xFA,
+ /* 0x0FE */ CS_CMD_UNK_DATA_FE = 0xFE,
+ /* 0x0FF */ CS_CMD_UNK_DATA_FF,
+ /* 0x100 */ CS_CMD_UNK_DATA_100,
+ /* 0x101 */ CS_CMD_UNK_DATA_101,
+ /* 0x102 */ CS_CMD_UNK_DATA_102,
+ /* 0x103 */ CS_CMD_UNK_DATA_103,
+ /* 0x104 */ CS_CMD_UNK_DATA_104,
+ /* 0x105 */ CS_CMD_UNK_DATA_105,
+ /* 0x108 */ CS_CMD_UNK_DATA_108 = 0x108,
+ /* 0x109 */ CS_CMD_UNK_DATA_109,
+ /* 0x12C */ CS_CMD_START_SEQ = 300,
+ /* 0x12D */ CS_CMD_STOP_SEQ,
+ /* 0x12E */ CS_CMD_START_AMBIENCE,
+ /* 0x12F */ CS_CMD_FADE_OUT_AMBIENCE,
+ /* 0x130 */ CS_CMD_SFX_REVERB_INDEX_2,
+ /* 0x131 */ CS_CMD_SFX_REVERB_INDEX_1,
+ /* 0x132 */ CS_CMD_MODIFY_SEQ,
+ /* 0x15E */ CS_CMD_DESTINATION = 350,
/* 0x15F */ CS_CMD_CHOOSE_CREDITS_SCENES,
- /* 0x190 */ CS_CMD_RUMBLE = 0x190
+ /* 0x190 */ CS_CMD_RUMBLE = 400,
+ /* 0x1C2 */ CS_CMD_ACTOR_CUE_450 = 450,
+ /* 0x1C3 */ CS_CMD_ACTOR_CUE_451,
+ /* 0x1C4 */ CS_CMD_ACTOR_CUE_452,
+ /* 0x1C5 */ CS_CMD_ACTOR_CUE_453,
+ /* 0x1C6 */ CS_CMD_ACTOR_CUE_454,
+ /* 0x1C7 */ CS_CMD_ACTOR_CUE_455,
+ /* 0x1C8 */ CS_CMD_ACTOR_CUE_456,
+ /* 0x1C9 */ CS_CMD_ACTOR_CUE_457,
+ /* 0x1CA */ CS_CMD_ACTOR_CUE_458,
+ /* 0x1CB */ CS_CMD_ACTOR_CUE_459,
+ /* 0x1CC */ CS_CMD_ACTOR_CUE_460,
+ /* 0x1CD */ CS_CMD_ACTOR_CUE_461,
+ /* 0x1CE */ CS_CMD_ACTOR_CUE_462,
+ /* 0x1CF */ CS_CMD_ACTOR_CUE_463,
+ /* 0x1D0 */ CS_CMD_ACTOR_CUE_464,
+ /* 0x1D1 */ CS_CMD_ACTOR_CUE_465,
+ /* 0x1D2 */ CS_CMD_ACTOR_CUE_466,
+ /* 0x1D3 */ CS_CMD_ACTOR_CUE_467,
+ /* 0x1D4 */ CS_CMD_ACTOR_CUE_468,
+ /* 0x1D5 */ CS_CMD_ACTOR_CUE_469,
+ /* 0x1D6 */ CS_CMD_ACTOR_CUE_470,
+ /* 0x1D7 */ CS_CMD_ACTOR_CUE_471,
+ /* 0x1D8 */ CS_CMD_ACTOR_CUE_472,
+ /* 0x1D9 */ CS_CMD_ACTOR_CUE_473,
+ /* 0x1DA */ CS_CMD_ACTOR_CUE_474,
+ /* 0x1DB */ CS_CMD_ACTOR_CUE_475,
+ /* 0x1DC */ CS_CMD_ACTOR_CUE_476,
+ /* 0x1DD */ CS_CMD_ACTOR_CUE_477,
+ /* 0x1DE */ CS_CMD_ACTOR_CUE_478,
+ /* 0x1DF */ CS_CMD_ACTOR_CUE_479,
+ /* 0x1E0 */ CS_CMD_ACTOR_CUE_480,
+ /* 0x1E1 */ CS_CMD_ACTOR_CUE_481,
+ /* 0x1E2 */ CS_CMD_ACTOR_CUE_482,
+ /* 0x1E3 */ CS_CMD_ACTOR_CUE_483,
+ /* 0x1E4 */ CS_CMD_ACTOR_CUE_484,
+ /* 0x1E5 */ CS_CMD_ACTOR_CUE_485,
+ /* 0x1E6 */ CS_CMD_ACTOR_CUE_486,
+ /* 0x1E7 */ CS_CMD_ACTOR_CUE_487,
+ /* 0x1E8 */ CS_CMD_ACTOR_CUE_488,
+ /* 0x1E9 */ CS_CMD_ACTOR_CUE_489,
+ /* 0x1EA */ CS_CMD_ACTOR_CUE_490,
+ /* 0x1EB */ CS_CMD_ACTOR_CUE_491,
+ /* 0x1EC */ CS_CMD_ACTOR_CUE_492,
+ /* 0x1ED */ CS_CMD_ACTOR_CUE_493,
+ /* 0x1EE */ CS_CMD_ACTOR_CUE_494,
+ /* 0x1EF */ CS_CMD_ACTOR_CUE_495,
+ /* 0x1F0 */ CS_CMD_ACTOR_CUE_496,
+ /* 0x1F1 */ CS_CMD_ACTOR_CUE_497,
+ /* 0x1F2 */ CS_CMD_ACTOR_CUE_498,
+ /* 0x1F3 */ CS_CMD_ACTOR_CUE_499,
+ /* 0x1F4 */ CS_CMD_ACTOR_CUE_500,
+ /* 0x1F5 */ CS_CMD_ACTOR_CUE_501,
+ /* 0x1F6 */ CS_CMD_ACTOR_CUE_502,
+ /* 0x1F7 */ CS_CMD_ACTOR_CUE_503,
+ /* 0x1F8 */ CS_CMD_ACTOR_CUE_504,
+ /* 0x1F9 */ CS_CMD_ACTOR_CUE_505,
+ /* 0x1FA */ CS_CMD_ACTOR_CUE_506,
+ /* 0x1FB */ CS_CMD_ACTOR_CUE_507,
+ /* 0x1FC */ CS_CMD_ACTOR_CUE_508,
+ /* 0x1FD */ CS_CMD_ACTOR_CUE_509,
+ /* 0x1FE */ CS_CMD_ACTOR_CUE_510,
+ /* 0x1FF */ CS_CMD_ACTOR_CUE_511,
+ /* 0x200 */ CS_CMD_ACTOR_CUE_512,
+ /* 0x201 */ CS_CMD_ACTOR_CUE_513,
+ /* 0x202 */ CS_CMD_ACTOR_CUE_514,
+ /* 0x203 */ CS_CMD_ACTOR_CUE_515,
+ /* 0x204 */ CS_CMD_ACTOR_CUE_516,
+ /* 0x205 */ CS_CMD_ACTOR_CUE_517,
+ /* 0x206 */ CS_CMD_ACTOR_CUE_518,
+ /* 0x207 */ CS_CMD_ACTOR_CUE_519,
+ /* 0x208 */ CS_CMD_ACTOR_CUE_520,
+ /* 0x209 */ CS_CMD_ACTOR_CUE_521,
+ /* 0x20A */ CS_CMD_ACTOR_CUE_522,
+ /* 0x20B */ CS_CMD_ACTOR_CUE_523,
+ /* 0x20C */ CS_CMD_ACTOR_CUE_524,
+ /* 0x20D */ CS_CMD_ACTOR_CUE_525,
+ /* 0x20E */ CS_CMD_ACTOR_CUE_526,
+ /* 0x20F */ CS_CMD_ACTOR_CUE_527,
+ /* 0x210 */ CS_CMD_ACTOR_CUE_528,
+ /* 0x211 */ CS_CMD_ACTOR_CUE_529,
+ /* 0x212 */ CS_CMD_ACTOR_CUE_530,
+ /* 0x213 */ CS_CMD_ACTOR_CUE_531,
+ /* 0x214 */ CS_CMD_ACTOR_CUE_532,
+ /* 0x215 */ CS_CMD_ACTOR_CUE_533,
+ /* 0x216 */ CS_CMD_ACTOR_CUE_534,
+ /* 0x217 */ CS_CMD_ACTOR_CUE_535,
+ /* 0x218 */ CS_CMD_ACTOR_CUE_536,
+ /* 0x219 */ CS_CMD_ACTOR_CUE_537,
+ /* 0x21A */ CS_CMD_ACTOR_CUE_538,
+ /* 0x21B */ CS_CMD_ACTOR_CUE_539,
+ /* 0x21C */ CS_CMD_ACTOR_CUE_540,
+ /* 0x21D */ CS_CMD_ACTOR_CUE_541,
+ /* 0x21E */ CS_CMD_ACTOR_CUE_542,
+ /* 0x21F */ CS_CMD_ACTOR_CUE_543,
+ /* 0x220 */ CS_CMD_ACTOR_CUE_544,
+ /* 0x221 */ CS_CMD_ACTOR_CUE_545,
+ /* 0x222 */ CS_CMD_ACTOR_CUE_546,
+ /* 0x223 */ CS_CMD_ACTOR_CUE_547,
+ /* 0x224 */ CS_CMD_ACTOR_CUE_548,
+ /* 0x225 */ CS_CMD_ACTOR_CUE_549,
+ /* 0x226 */ CS_CMD_ACTOR_CUE_550,
+ /* 0x227 */ CS_CMD_ACTOR_CUE_551,
+ /* 0x228 */ CS_CMD_ACTOR_CUE_552,
+ /* 0x229 */ CS_CMD_ACTOR_CUE_553,
+ /* 0x22A */ CS_CMD_ACTOR_CUE_554,
+ /* 0x22B */ CS_CMD_ACTOR_CUE_555,
+ /* 0x22C */ CS_CMD_ACTOR_CUE_556,
+ /* 0x22D */ CS_CMD_ACTOR_CUE_557,
+ /* 0x22E */ CS_CMD_ACTOR_CUE_558,
+ /* 0x22F */ CS_CMD_ACTOR_CUE_559,
+ /* 0x230 */ CS_CMD_ACTOR_CUE_560,
+ /* 0x231 */ CS_CMD_ACTOR_CUE_561,
+ /* 0x232 */ CS_CMD_ACTOR_CUE_562,
+ /* 0x233 */ CS_CMD_ACTOR_CUE_563,
+ /* 0x234 */ CS_CMD_ACTOR_CUE_564,
+ /* 0x235 */ CS_CMD_ACTOR_CUE_565,
+ /* 0x236 */ CS_CMD_ACTOR_CUE_566,
+ /* 0x237 */ CS_CMD_ACTOR_CUE_567,
+ /* 0x238 */ CS_CMD_ACTOR_CUE_568,
+ /* 0x239 */ CS_CMD_ACTOR_CUE_569,
+ /* 0x23A */ CS_CMD_ACTOR_CUE_570,
+ /* 0x23B */ CS_CMD_ACTOR_CUE_571,
+ /* 0x23C */ CS_CMD_ACTOR_CUE_572,
+ /* 0x23D */ CS_CMD_ACTOR_CUE_573,
+ /* 0x23E */ CS_CMD_ACTOR_CUE_574,
+ /* 0x23F */ CS_CMD_ACTOR_CUE_575,
+ /* 0x240 */ CS_CMD_ACTOR_CUE_576,
+ /* 0x241 */ CS_CMD_ACTOR_CUE_577,
+ /* 0x242 */ CS_CMD_ACTOR_CUE_578,
+ /* 0x243 */ CS_CMD_ACTOR_CUE_579,
+ /* 0x244 */ CS_CMD_ACTOR_CUE_580,
+ /* 0x245 */ CS_CMD_ACTOR_CUE_581,
+ /* 0x246 */ CS_CMD_ACTOR_CUE_582,
+ /* 0x247 */ CS_CMD_ACTOR_CUE_583,
+ /* 0x248 */ CS_CMD_ACTOR_CUE_584,
+ /* 0x249 */ CS_CMD_ACTOR_CUE_585,
+ /* 0x24A */ CS_CMD_ACTOR_CUE_586,
+ /* 0x24B */ CS_CMD_ACTOR_CUE_587,
+ /* 0x24C */ CS_CMD_ACTOR_CUE_588,
+ /* 0x24D */ CS_CMD_ACTOR_CUE_589,
+ /* 0x24E */ CS_CMD_ACTOR_CUE_590,
+ /* 0x24F */ CS_CMD_ACTOR_CUE_591,
+ /* 0x250 */ CS_CMD_ACTOR_CUE_592,
+ /* 0x251 */ CS_CMD_ACTOR_CUE_593,
+ /* 0x252 */ CS_CMD_ACTOR_CUE_594,
+ /* 0x253 */ CS_CMD_ACTOR_CUE_595,
+ /* 0x254 */ CS_CMD_ACTOR_CUE_596,
+ /* 0x255 */ CS_CMD_ACTOR_CUE_597,
+ /* 0x256 */ CS_CMD_ACTOR_CUE_598,
+ /* 0x257 */ CS_CMD_ACTOR_CUE_599,
+ /* -2 */ CS_CMD_ACTOR_CUE_POST_PROCESS = 0xFFFFFFFE,
+ /* -1 */ CS_CAM_STOP // OoT Remnant
} CutsceneCmd;
+typedef enum {
+ /* 0x00 */ CS_MISC_UNIMPLEMENTED_0,
+ /* 0x01 */ CS_MISC_RAIN,
+ /* 0x02 */ CS_MISC_LIGHTNING,
+ /* 0x03 */ CS_MISC_LIFT_FOG,
+ /* 0x04 */ CS_MISC_CLOUDY_SKY,
+ /* 0x05 */ CS_MISC_STOP_CUTSCENE,
+ /* 0x06 */ CS_MISC_UNIMPLEMENTED_6,
+ /* 0x07 */ CS_MISC_SHOW_TITLE_CARD,
+ /* 0x08 */ CS_MISC_EARTHQUAKE_MEDIUM,
+ /* 0x09 */ CS_MISC_EARTHQUAKE_STOP,
+ /* 0x0A */ CS_MISC_VISMONO_BLACK_AND_WHITE,
+ /* 0x0B */ CS_MISC_VISMONO_SEPIA,
+ /* 0x0C */ CS_MISC_HIDE_ROOM,
+ /* 0x0D */ CS_MISC_RED_PULSATING_LIGHTS,
+ /* 0x0E */ CS_MISC_HALT_ALL_ACTORS,
+ /* 0x0F */ CS_MISC_RESUME_ALL_ACTORS,
+ /* 0x10 */ CS_MISC_SANDSTORM_FILL,
+ /* 0x11 */ CS_MISC_SUNSSONG_START,
+ /* 0x12 */ CS_MISC_FREEZE_TIME,
+ /* 0x13 */ CS_MISC_LONG_SCARECROW_SONG,
+ /* 0x14 */ CS_MISC_SET_CSFLAG_3,
+ /* 0x15 */ CS_MISC_SET_CSFLAG_4,
+ /* 0x16 */ CS_MISC_PLAYER_FORM_DEKU,
+ /* 0x17 */ CS_MISC_ENABLE_PLAYER_REFLECTION,
+ /* 0x18 */ CS_MISC_DISABLE_PLAYER_REFLECTION,
+ /* 0x19 */ CS_MISC_PLAYER_FORM_HUMAN,
+ /* 0x1A */ CS_MISC_EARTHQUAKE_STRONG,
+ /* 0x1B */ CS_MISC_DEST_MOON_CRASH_FIRE_WALL,
+ /* 0x1C */ CS_MISC_MOON_CRASH_SKYBOX,
+ /* 0x1D */ CS_MISC_PLAYER_FORM_RESTORED,
+ /* 0x1E */ CS_MISC_DISABLE_PLAYER_CSMODE_START_POS,
+ /* 0x1F */ CS_MISC_ENABLE_PLAYER_CSMODE_START_POS,
+ /* 0x20 */ CS_MISC_UNIMPLEMENTED_20,
+ /* 0x21 */ CS_MISC_SAVE_ENTER_CLOCK_TOWN,
+ /* 0x22 */ CS_MISC_RESET_SAVE_FROM_MOON_CRASH,
+ /* 0x23 */ CS_MISC_TIME_ADVANCE,
+ /* 0x24 */ CS_MISC_EARTHQUAKE_WEAK,
+ /* 0x25 */ CS_MISC_UNIMPLEMENTED_25,
+ /* 0x26 */ CS_MISC_DAWN_OF_A_NEW_DAY,
+ /* 0x27 */ CS_MISC_PLAYER_FORM_ZORA,
+ /* 0x28 */ CS_MISC_FINALE
+} CutsceneMiscType;
+
typedef union CutsceneData {
s32 i;
f32 f;
@@ -163,29 +580,291 @@ typedef union CutsceneData {
s8 b[4];
} CutsceneData;
-typedef struct {
- /* 0x0 */ CutsceneData* segmentedData;
- /* 0x4 */ s16 nextEntrance;
- /* 0x6 */ u8 unk6;
- /* 0x7 */ u8 unk7; // a weekEventReg bitpack?
-} CutsceneEntry; // size = 0x8
+#define BIT_FLAG_TO_SHIFT(flag) \
+ ((flag & 0x80) ? 7 : \
+ (flag & 0x40) ? 6 : \
+ (flag & 0x20) ? 5 : \
+ (flag & 0x10) ? 4 : \
+ (flag & 0x8) ? 3 : \
+ (flag & 0x4) ? 2 : \
+ (flag & 0x2) ? 1 : \
+ (flag & 0x1) ? 0 : \
+ 0)
+
+// Do not trigger the scripted cutscene upon any spawn
+#define CS_SPAWN_FLAG_NONE 0xFF
+// Always trigger the scripted cutscene upon the specified spawn
+#define CS_SPAWN_FLAG_ALWAYS 0xFE
+// Trigger the scripted cutscene once upon the specified spawn if `weekEventFlags` is not set. Set `weekEventFlags` after the cutscene.
+//! @note Despite there being more than `0x1F` indices for weekEventFlags, this u8 flag entry can only check weekEventFlags with indices [0 - 0x1F]
+#define CS_SPAWN_FLAG_ONCE(weekEventFlag) ((((weekEventFlag) & 0x1F00) >> 5) | BIT_FLAG_TO_SHIFT((weekEventFlag) & 0xFF))
+
+#define CHECK_CS_SPAWN_FLAG_WEEKEVENTREG(spawnFlags) (GET_WEEKEVENTREG((spawnFlags) / 8) & (1 << ((spawnFlags) % 8)))
+#define SET_CS_SPAWN_FLAG_WEEKEVENTREG(spawnFlags) (WEEKEVENTREG((spawnFlags) / 8) = GET_WEEKEVENTREG((spawnFlags) / 8) | (1 << ((spawnFlags) % 8)))
+
typedef struct {
- /* 0x00 */ u8 sceneCsCount;
- /* 0x04 */ CutsceneData* csData;
- /* 0x08 */ u8 state;
- /* 0x0C */ f32 unk_0C;
- /* 0x10 */ u16 frames;
- /* 0x12 */ u16 currentCsIndex;
- /* 0x14 */ s32 subCamId;
- /* 0x18 */ u16 unk_18;
- /* 0x1A */ u8 unk_1A;
- /* 0x1B */ u8 unk_1B;
- /* 0x1C */ CutsceneCameraPoint* atPoints;
- /* 0x20 */ CutsceneCameraPoint* eyePoints;
- /* 0x24 */ CsCmdActorAction* playerAction;
- /* 0x28 */ CsCmdActorAction* actorActions[10]; // "npcdemopnt"
- /* 0x50 */ CutsceneEntry* sceneCsList;
+ /* 0x0 */ CutsceneData* script;
+ /* 0x4 */ s16 nextEntrance;
+ /* 0x6 */ u8 spawn;
+ /* 0x7 */ u8 spawnFlags; // See `CS_SPAWN_FLAG_`
+} CutsceneScriptEntry; // size = 0x8
+
+// ZAPD compatibility typedefs
+// TODO: Remove when ZAPD adds support for them
+typedef CutsceneScriptEntry CutsceneEntry;
+
+typedef struct {
+ /* 0x00 */ u8 scriptListCount;
+ /* 0x04 */ CutsceneData* script;
+ /* 0x08 */ u8 state;
+ /* 0x0C */ f32 timer;
+ /* 0x10 */ u16 curFrame;
+ /* 0x12 */ u16 scriptIndex;
+ /* 0x14 */ s32 subCamId;
+ /* 0x18 */ u16 camEyeSplinePointsAppliedFrame; // Remnant of OoT. Set but never used.
+ /* 0x1C */ UNK_TYPE1 unk_1C[0xA]; // Remnant of cam data from OoT
+ /* 0x24 */ CsCmdActorCue* playerCue;
+ /* 0x28 */ CsCmdActorCue* actorCues[10]; // "npcdemopnt"
+ /* 0x50 */ CutsceneScriptEntry* scriptList;
} CutsceneContext; // size = 0x54
+/* Actor Cutscenes, which encompasses all cutscenes */
+
+typedef struct {
+ /* 0x00 */ s16 priority; // Lower means higher priority. -1 means it ignores priority
+ /* 0x02 */ s16 length;
+ /* 0x04 */ s16 csCamId; // Index of CsCameraEntry to use. Negative indices use sGlobalCamDataSettings. Indices 0 and above use CsCameraEntry from a sceneLayer
+ /* 0x06 */ s16 scriptIndex;
+ /* 0x08 */ s16 additionalCsId;
+ /* 0x0A */ u8 endSfx;
+ /* 0x0B */ u8 customValue; // 0 - 99: actor-specific custom value. 100+: spawn. 255: none
+ /* 0x0C */ s16 hudVisibility;
+ /* 0x0E */ u8 endCam;
+ /* 0x0F */ u8 letterboxSize;
+} ActorCutscene; // size = 0x10
+// TODO: rename `ActorCutscene` to `CutsceneEntry` once ZAPD uses `CutsceneScriptEntry`
+// typedef CutsceneEntry ActorCutscene;
+
+typedef enum {
+ /* -1 */ CS_ID_NONE = -1,
+ // CsId's 0 - 119 are sceneLayer-specific and index `ActorCutscene`
+ /* 0x78 */ CS_ID_GLOBAL_78 = 120,
+ /* 0x79 */ CS_ID_GLOBAL_79,
+ /* 0x7A */ CS_ID_GLOBAL_7A,
+ /* 0x7B */ CS_ID_GLOBAL_ELEGY,
+ /* 0x7C */ CS_ID_GLOBAL_TALK,
+ /* 0x7D */ CS_ID_GLOBAL_DOOR,
+ /* 0x7E */ CS_ID_GLOBAL_RETURN_TO_CAM, // smoothly return to the previous camera
+ /* 0x7F */ CS_ID_GLOBAL_END
+} CutsceneId;
+
+typedef enum {
+ /* 0 */ PLAYER_CS_ID_ITEM_OCARINA,
+ /* 1 */ PLAYER_CS_ID_ITEM_GET,
+ /* 2 */ PLAYER_CS_ID_ITEM_BOTTLE,
+ /* 3 */ PLAYER_CS_ID_ITEM_SHOW,
+ /* 4 */ PLAYER_CS_ID_WARP_PAD_MOON,
+ /* 5 */ PLAYER_CS_ID_MASK_TRANSFORMATION,
+ /* 6 */ PLAYER_CS_ID_DEATH,
+ /* 7 */ PLAYER_CS_ID_REVIVE,
+ /* 8 */ PLAYER_CS_ID_SONG_WARP, // Song of Time and Song of Soaring
+ /* 9 */ PLAYER_CS_ID_WARP_PAD_ENTRANCE,
+ /* 10 */ PLAYER_CS_ID_MAX
+} PlayerCsId;
+
+#define CS_SCRIPT_ID_NONE -1
+
+typedef enum {
+ // global (see sGlobalCamDataSettings)
+ /* -25 */ CS_CAM_ID_GLOBAL_ELEGY = -25, // CAM_SET_ELEGY_SHELL
+ /* -24 */ CS_CAM_ID_GLOBAL_SIDED, // CAM_SET_SIDED
+ /* -23 */ CS_CAM_ID_GLOBAL_BOAT_CRUISE, // CAM_SET_BOAT_CRUISE
+ /* -22 */ CS_CAM_ID_GLOBAL_N16, // CAM_SET_NONE
+ /* -21 */ CS_CAM_ID_GLOBAL_SUBJECTD, // CAM_SET_SUBJECTD
+ /* -20 */ CS_CAM_ID_GLOBAL_NORMALD, // CAM_SET_NORMALD
+ /* -19 */ CS_CAM_ID_GLOBAL_N13, // CAM_SET_NONE
+ /* -18 */ CS_CAM_ID_GLOBAL_N12, // CAM_SET_NONE
+ /* -17 */ CS_CAM_ID_GLOBAL_N11, // CAM_SET_NONE
+ /* -16 */ CS_CAM_ID_GLOBAL_WARP_PAD_ENTRANCE, // CAM_SET_WARP_PAD_ENTRANCE
+ /* -15 */ CS_CAM_ID_GLOBAL_ATTENTION, // CAM_SET_ATTENTION
+ /* -14 */ CS_CAM_ID_GLOBAL_CONNECT, // CAM_SET_CONNECT0
+ /* -13 */ CS_CAM_ID_GLOBAL_REMOTE_BOMB, // CAM_SET_REMOTEBOMB
+ /* -12 */ CS_CAM_ID_GLOBAL_N0C, // CAM_SET_NONE
+ /* -11 */ CS_CAM_ID_GLOBAL_MASK_TRANSFORMATION, // CAM_SET_MASK_TRANSFORMATION
+ /* -10 */ CS_CAM_ID_GLOBAL_LONG_CHEST_OPENING, // CAM_SET_LONG_CHEST_OPENING
+ /* -9 */ CS_CAM_ID_GLOBAL_REVIVE, // CAM_SET_REBIRTH
+ /* -8 */ CS_CAM_ID_GLOBAL_DEATH, // CAM_SET_DEATH
+ /* -7 */ CS_CAM_ID_GLOBAL_WARP_PAD_MOON, // CAM_SET_WARP_PAD_MOON
+ /* -6 */ CS_CAM_ID_GLOBAL_SONG_WARP, // CAM_SET_NAVI
+ /* -5 */ CS_CAM_ID_GLOBAL_ITEM_SHOW, // CAM_SET_ITEM3
+ /* -4 */ CS_CAM_ID_GLOBAL_ITEM_BOTTLE, // CAM_SET_ITEM2
+ /* -3 */ CS_CAM_ID_GLOBAL_ITEM_OCARINA, // CAM_SET_ITEM1
+ /* -2 */ CS_CAM_ID_GLOBAL_ITEM_GET, // CAM_SET_ITEM0
+ /* -1 */ CS_CAM_ID_NONE
+ // CamCsId's 0+ are sceneLayer-specific and index `ActorCsCamInfo`
+} CutsceneCamId;
+
+typedef enum {
+ /* -1 */ CS_HUD_VISIBILITY_ALL_ALT = -1,
+ /* 0 */ CS_HUD_VISIBILITY_NONE,
+ /* 1 */ CS_HUD_VISIBILITY_ALL,
+ /* 2 */ CS_HUD_VISIBILITY_A_HEARTS_MAGIC,
+ /* 3 */ CS_HUD_VISIBILITY_C_HEARTS_MAGIC,
+ /* 4 */ CS_HUD_VISIBILITY_ALL_NO_MINIMAP,
+ /* 5 */ CS_HUD_VISIBILITY_A_B_C,
+ /* 6 */ CS_HUD_VISIBILITY_B_MINIMAP,
+ /* 7 */ CS_HUD_VISIBILITY_A
+} CutsceneHudVisibility;
+
+typedef enum {
+ /* 0 */ CS_END_SFX_NONE,
+ /* 1 */ CS_END_SFX_TRE_BOX_APPEAR,
+ /* 2 */ CS_END_SFX_CORRECT_CHIME,
+ /* 255 */ CS_END_SFX_NONE_ALT = 0xFF
+} CutsceneEndSfx;
+
+typedef enum {
+ /* 0 */ CS_END_CAM_0,
+ /* 1 */ CS_END_CAM_1,
+ /* 2 */ CS_END_CAM_SMOOTH
+} CutsceneEndCam;
+
+/* Cutscene Camera Spline Scripts */
+
+typedef struct {
+ /* 0x0 */ s16 numEntries;
+ /* 0x2 */ s16 unk_02; // unused
+ /* 0x4 */ s16 unk_04; // unused
+ /* 0x6 */ s16 duration; // total duration
+} CsCmdCamSpline; // size = 0x8
+
+// Both camAt and camEye
+typedef struct {
+ /* 0x0 */ u8 interpType; // see `CutsceneCamInterpType`
+ /* 0x1 */ u8 weight; // for certain types of interpTypes, shifts the weight to certain points. Default is 100.
+ /* 0x2 */ s16 duration; // duration of current point
+ /* 0x4 */ Vec3s pos;
+ /* 0xA */ s16 relativeTo; // see `CutsceneCamRelativeTo`
+} CsCmdCamPoint; // size = 0xC
+
+typedef enum {
+ /* 0 */ CS_CAM_INTERP_0,
+ /* 1 */ CS_CAM_INTERP_1,
+ /* 2 */ CS_CAM_INTERP_2,
+ /* 3 */ CS_CAM_INTERP_3,
+ /* 4 */ CS_CAM_INTERP_4,
+ /* 5 */ CS_CAM_INTERP_5,
+ /* 6 */ CS_CAM_INTERP_6,
+ /* 7 */ CS_CAM_INTERP_7
+} CutsceneCamInterpType;
+
+typedef enum {
+ /* 0 */ CS_CAM_REL_0,
+ /* 1 */ CS_CAM_REL_1,
+ /* 2 */ CS_CAM_REL_2,
+ /* 3 */ CS_CAM_REL_3,
+ /* 4 */ CS_CAM_REL_4,
+ /* 5 */ CS_CAM_REL_5
+} CutsceneCamRelativeTo;
+
+
+// Roll and Fov Data
+typedef struct {
+ /* 0x0 */ s16 unused0; // unused
+ /* 0x2 */ s16 roll;
+ /* 0x4 */ s16 fov;
+ /* 0x6 */ s16 unused1; // unused
+} CsCmdCamMisc; // size = 0x8
+
+typedef struct {
+ /* 0x00 */ Vec3f unk_00;
+ /* 0x0C */ Vec3f unk_0C;
+ /* 0x18 */ f32 unk_18;
+ /* 0x1C */ f32 unk_1C;
+ /* 0x2A */ f32 unk_20;
+ /* 0x24 */ s16 unk_24;
+ /* 0x26 */ s16 unk_26;
+ /* 0x28 */ s16 unk_28;
+ /* 0x2A */ s16 numEntries;
+ /* 0x1E */ u8 curPoint;
+ /* 0x2D */ u8 unk_2D;
+ /* 0x2E */ UNK_TYPE1 unk_2E[2];
+} CutsceneCameraInterp; // size = 0x30
+
+typedef struct {
+ /* 0x00 */ s16 splineIndex;
+ /* 0x02 */ s16 cmdIndex;
+ /* 0x04 */ s16 splineNeedsInit;
+ /* 0x06 */ s16 state;
+ /* 0x08 */ s16 nextSplineTimer;
+ /* 0x0A */ s16 updateSplineTimer;
+ /* 0x0C */ s16 duration; // Duration of the current spline
+ /* 0x10 */ CutsceneCameraInterp eyeInterp;
+ /* 0x40 */ CutsceneCameraInterp atInterp;
+ /* 0x70 */ CsCmdCamPoint* atCmd;
+ /* 0x74 */ CsCmdCamPoint* eyeCmd;
+ /* 0x78 */ CsCmdCamMisc* miscCmd;
+ /* 0x7C */ Camera* camera;
+} CutsceneCamera; // size = 0x80
+
+typedef enum {
+ /* 0 */ CS_CAM_STATE_UPDATE_ALL, // Update spline and next spline timer
+ /* 0 */ CS_CAM_STATE_UPDATE_SPLINE, // Update spline, do not advance next spline timer
+ /* 0 */ CS_CAM_STATE_PAUSE, // No updates
+ /* 0 */ CS_CAM_STATE_DONE_SPLINE, // Finished the current spline, ready for the next one
+ /* 0 */ CS_CAM_STATE_DONE = 999 // Finished all the splines.
+} CutsceneCameraState;
+
+// OoT Remnant
+#define CS_CAM_DATA_NOT_APPLIED 0xFFFF
+
+void Cutscene_InitContext(struct PlayState* play, CutsceneContext* csCtx);
+void Cutscene_StartManual(struct PlayState* play, CutsceneContext* csCtx);
+void Cutscene_StopManual(struct PlayState* play, CutsceneContext* csCtx);
+void Cutscene_UpdateManual(struct PlayState* play, CutsceneContext* csCtx);
+void Cutscene_UpdateScripted(struct PlayState* play, CutsceneContext* csCtx);
+void Cutscene_HandleEntranceTriggers(struct PlayState* play);
+void func_800EDDB0(struct PlayState* play);
+void Cutscene_StartScripted(struct PlayState* play, u8 scriptIndex);
+void Cutscene_ActorTranslate(Actor* actor, struct PlayState* play, s32 cueChannel);
+void Cutscene_ActorTranslateAndYaw(Actor* actor, struct PlayState* play, s32 cueChannel);
+void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, struct PlayState* play, s32 cueChannel);
+void Cutscene_ActorTranslateXZAndYawSmooth(Actor* actor, struct PlayState* play, s32 cueChannel);
+s32 Cutscene_GetSceneLayer(struct PlayState* play);
+s32 Cutscene_GetCueChannel(struct PlayState* play, u16 cueType);
+s32 Cutscene_IsCueInChannel(struct PlayState* play, u16 cueType);
+u8 Cutscene_IsPlaying(struct PlayState* play);
+
+void CutsceneManager_Init(struct PlayState* play, ActorCutscene* cutsceneList, s16 numEntries);
+void CutsceneManager_StoreCamera(Camera* camera);
+void CutsceneManager_ClearWaiting(void);
+s16 CutsceneManager_Update(void);
+void CutsceneManager_Queue(s16 csId);
+s16 CutsceneManager_IsNext(s16 csId);
+s16 CutsceneManager_StartWithPlayerCs(s16 csId, Actor* actor);
+s16 CutsceneManager_StartWithPlayerCsAndSetFlag(s16 csId, Actor* actor);
+s16 CutsceneManager_Start(s16 csId, Actor* actor);
+s16 CutsceneManager_Stop(s16 csId);
+s16 CutsceneManager_GetCurrentCsId(void);
+ActorCutscene* CutsceneManager_GetCutsceneEntry(s16 csId);
+s16 CutsceneManager_GetAdditionalCsId(s16 csId);
+s16 CutsceneManager_GetLength(s16 csId);
+s16 CutsceneManager_GetCutsceneScriptIndex(s16 csId);
+s16 CutsceneManager_GetCutsceneCustomValue(s16 csId);
+s16 CutsceneManager_GetCurrentSubCamId(s16 csId);
+s16 CutsceneManager_FindEntranceCsId(void);
+s32 func_800F22C4(s16 csId, Actor* actor);
+void CutsceneManager_SetReturnCamera(s16 camId);
+
+s32 CutsceneCamera_Init(Camera* camera, CutsceneCamera* csCamera);
+s32 CutsceneCamera_UpdateSplines(u8* script, CutsceneCamera* csCamera);
+void CutsceneCamera_SetState(s16 state);
+void CutsceneCamera_Reset(void);
+
+void CutsceneFlags_UnsetAll(struct PlayState* play);
+void CutsceneFlags_Set(struct PlayState* play, s16 flag);
+void CutsceneFlags_Unset(struct PlayState* play, s16 flag);
+s32 CutsceneFlags_Get(struct PlayState* play, s16 flag);
+
#endif
diff --git a/include/z64cutscene_commands.h b/include/z64cutscene_commands.h
index 1ab6533ac..50e1ce451 100644
--- a/include/z64cutscene_commands.h
+++ b/include/z64cutscene_commands.h
@@ -5,13 +5,19 @@
#include "z64cutscene.h"
/**
+ * Cutscene scripts are arrays of `CutsceneData` words, including bit-packed integers and floats.
+ */
+
+/**
+ * Marks the beginning of a cutscene script.
+ *
* ARGS
- * s32 totalEntries (e), s32 endFrame (n)
+ * s32 totalEntries (e), s32 frameCount (n)
* FORMAT
* eeeeeeee nnnnnnnn
* size = 0x8
*/
-#define CS_BEGIN_CUTSCENE(totalEntries, endFrame) { CMD_W(totalEntries) }, { CMD_W(endFrame) }
+#define CS_BEGIN_CUTSCENE(totalEntries, frameCount) { CMD_W(totalEntries) }, { CMD_W(frameCount) }
/**
@@ -21,83 +27,83 @@
* 0000000A eeeeeeee
* size = 0x8
*/
-#define CS_TEXT_LIST(entries) { CS_CMD_TEXTBOX }, { CMD_W(entries) }
+#define CS_TEXT_LIST(entries) { CS_CMD_TEXT }, { CMD_W(entries) }
/**
* ARGS
- * s16 messageId (i), s16 startFrame (s), s16 endFrame (e), s16 type (o),
+ * s16 textId (i), s16 startFrame (s), s16 endFrame (e), s16 type (o),
* s16 topOptionBranch (y), s16 bottomOptionBranch (n)
* FORMAT
* iiiissss eeeeoooo yyyynnnn
* size = 0xC
*/
-#define CS_TEXT_DISPLAY_TEXTBOX(messageId, startFrame, endFrame, type, topOptionBranch, bottomOptionBranch) \
- { CMD_HH(messageId, startFrame) }, { CMD_HH(endFrame, type) }, { CMD_HH(topOptionBranch, bottomOptionBranch) }
+#define CS_TEXT(textId, startFrame, endFrame, type, topOptionBranch, bottomOptionBranch) \
+ { CMD_HH(textId, startFrame) }, { CMD_HH(endFrame, type) }, { CMD_HH(topOptionBranch, bottomOptionBranch) }
/**
* ARGS
- * s16 messageId (i), s16 startFrame (s), s16 endFrame (e),
+ * s16 textId (i), s16 startFrame (s), s16 endFrame (e),
* s16 topOptionBranch (y), s16 bottomOptionBranch (n)
* FORMAT
* iiiissss eeee0000 yyyynnnn
* size = 0xC
*/
-#define CS_TEXT_DEFAULT(messageId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
- CS_TEXT_DISPLAY_TEXTBOX(messageId, startFrame, endFrame, CS_TEXTBOX_TYPE_DEFAULT, topOptionBranch, bottomOptionBranch)
+#define CS_TEXT_DEFAULT(textId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
+ CS_TEXT(textId, startFrame, endFrame, CS_TEXT_TYPE_DEFAULT, topOptionBranch, bottomOptionBranch)
/**
* ARGS
- * s16 messageId (i), s16 startFrame (s), s16 endFrame (e),
+ * s16 textId (i), s16 startFrame (s), s16 endFrame (e),
* s16 topOptionBranch (y), s16 bottomOptionBranch (n)
* FORMAT
* iiiissss eeee0001 yyyynnnn
* size = 0xC
*/
-#define CS_TEXT_TYPE_1(messageId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
- CS_TEXT_DISPLAY_TEXTBOX(messageId, startFrame, endFrame, CS_TEXTBOX_TYPE_1, topOptionBranch, bottomOptionBranch)
+#define CS_TEXT_TYPE_1(textId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
+ CS_TEXT(textId, startFrame, endFrame, CS_TEXT_TYPE_1, topOptionBranch, bottomOptionBranch)
/**
* ARGS
- * s16 ocarinaSongAction (o), s16 startFrame (s), s16 endFrame (e), s16 messageId (i)
+ * s16 ocarinaSongAction (o), s16 startFrame (s), s16 endFrame (e), s16 textId (i)
* FORMAT
* oooossss eeee0002 iiiiFFFF
* size = 0xC
*/
-#define CS_TEXT_LEARN_SONG(ocarinaSongAction, startFrame, endFrame, messageId) \
- CS_TEXT_DISPLAY_TEXTBOX(ocarinaSongAction, startFrame, endFrame, CS_TEXTBOX_TYPE_LEARN_SONG, messageId, 0xFFFF)
+#define CS_TEXT_OCARINA_ACTION(ocarinaSongAction, startFrame, endFrame, textId) \
+ CS_TEXT(ocarinaSongAction, startFrame, endFrame, CS_TEXT_OCARINA_ACTION, textId, 0xFFFF)
/**
* ARGS
- * s16 messageId (i), s16 startFrame (s), s16 endFrame (e),
+ * s16 textId (i), s16 startFrame (s), s16 endFrame (e),
* s16 topOptionBranch (y), s16 bottomOptionBranch (n)
* FORMAT
* iiiissss eeee0003 yyyynnnn
* size = 0xC
*/
-#define CS_TEXT_TYPE_3(messageId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
- CS_TEXT_DISPLAY_TEXTBOX(messageId, startFrame, endFrame, CS_TEXTBOX_TYPE_3, topOptionBranch, bottomOptionBranch)
+#define CS_TEXT_TYPE_3(textId, startFrame, endFrame, topOptionBranch, bottomOptionBranch) \
+ CS_TEXT(textId, startFrame, endFrame, CS_TEXT_TYPE_3, topOptionBranch, bottomOptionBranch)
/**
- * If Player has all 4 bosses' remains then alternativeMessageId is used, otherwise defaultMessageId is used
+ * If Player has all 4 bosses' remains then alternativeTextId is used, otherwise defaultTextId is used
* ARGS
- * s16 defaultMessageId (d), s16 startFrame (s), s16 endFrame (e), s16 alternativeMessageId (a)
+ * s16 defaultTextId (d), s16 startFrame (s), s16 endFrame (e), s16 alternativeTextId (a)
* FORMAT
* ddddssss eeee0004 aaaaFFFF
* size = 0xC
*/
-#define CS_TEXT_BOSSES_REMAINS(defaultMessageId, startFrame, endFrame, alternativeMessageId) \
- CS_TEXT_DISPLAY_TEXTBOX(defaultMessageId, startFrame, endFrame, CS_TEXTBOX_TYPE_BOSSES_REMAINS, alternativeMessageId, 0xFFFF)
+#define CS_TEXT_BOSSES_REMAINS(defaultTextId, startFrame, endFrame, alternativeTextId) \
+ CS_TEXT(defaultTextId, startFrame, endFrame, CS_TEXT_TYPE_BOSSES_REMAINS, alternativeTextId, 0xFFFF)
/**
- * If Player has every non-transformation mask then alternativeMessageId is used, otherwise defaultMessageId is used
+ * If Player has every non-transformation mask then alternativeTextId is used, otherwise defaultTextId is used
* ARGS
- * s16 defaultMessageId (d), s16 startFrame (s), s16 endFrame (e), s16 alternativeMessageId (a)
+ * s16 defaultTextId (d), s16 startFrame (s), s16 endFrame (e), s16 alternativeTextId (a)
* FORMAT
* ddddssss eeee0005 aaaaFFFF
* size = 0xC
*/
-#define CS_TEXT_ALL_NORMAL_MASKS(defaultMessageId, startFrame, endFrame, alternativeMessageId) \
- CS_TEXT_DISPLAY_TEXTBOX(defaultMessageId, startFrame, endFrame, CS_TEXTBOX_TYPE_ALL_NORMAL_MASKS, alternativeMessageId, 0xFFFF)
+#define CS_TEXT_ALL_NORMAL_MASKS(defaultTextId, startFrame, endFrame, alternativeTextId) \
+ CS_TEXT(defaultTextId, startFrame, endFrame, CS_TEXT_TYPE_ALL_NORMAL_MASKS, alternativeTextId, 0xFFFF)
/**
* ARGS
@@ -107,22 +113,57 @@
* size = 0xC
*/
#define CS_TEXT_NONE(startFrame, endFrame) \
- CS_TEXT_DISPLAY_TEXTBOX(0xFFFF, startFrame, endFrame, CS_TEXTBOX_TYPE_NONE, 0xFFFF, 0xFFFF)
+ CS_TEXT(0xFFFF, startFrame, endFrame, CS_TEXT_TYPE_NONE, 0xFFFF, 0xFFFF)
/**
* ARGS
- * s32 entries (e)
+ * s32 numBytes (b)
* FORMAT
- * 0000005A eeeeeeee
+ * 0000005A bbbbbbbb
* size = 0x8
*/
-#define CS_CAMERA_LIST(entries) { CS_CMD_CAMERA }, { CMD_W(entries) }
+#define CS_CAM_SPLINE_LIST(numBytes) { CS_CMD_CAMERA_SPLINE }, { CMD_W(numBytes) }
-// TODO: Camera command macros. Requieres func_80161998 being decomped
+/**
+ * ARGS
+ * s16 numEntries (e), s16 duration (d)
+ * FORMAT
+ * Capital U is Unused
+ * eeeeUUUU UUUUdddd
+ * size = 0x8
+ */
+#define CS_CAM_SPLINE(numEntries, unused0, unused1, duration) \
+ { CMD_HH(numEntries, unused0) }, { CMD_HH(unused1, duration) }
+
+/**
+ * ARGS
+ * u8 interpType (i), u8 weight (2), s16 duration (d), Vec3s pos (x/y/z), s16 relativeTo (r)
+ * FORMAT
+ * ii22dddd xxxxyyyy zzzzrrrr
+ * size = 0xC
+ */
+#define CS_CAM_POINT(interpType, weight, duration, posX, posY, posZ, relativeTo) \
+ { CMD_BBH(interpType, weight, duration) }, { CMD_HH(posX, posY) }, { CMD_HH(posZ, relativeTo) }
+
+/**
+ * ARGS
+ * s16 roll (r), s16 fov (f)
+ * FORMAT
+ * Capital U is Unused
+ * UUUUrrrr ffffUUUU
+ * size = 0x8
+ */
+#define CS_CAM_MISC(unused0, roll, fov, unused1) \
+ { CMD_HH(unused0, roll) }, { CMD_HH(fov, unused1) }
+
+// First half-word is read from as `numEntries` in `CS_CAM_SPLINE()`
+#define CS_CAM_END() { CMD_HH(0xFFFF, 4) }
/**
+ * Declares a list of `CS_MISC` entries.
+ *
* ARGS
* s32 entries (e)
* FORMAT
@@ -132,36 +173,46 @@
#define CS_MISC_LIST(entries) { CS_CMD_MISC }, { CMD_W(entries) }
/**
+ * Various miscellaneous commands.
+ * @see `CutsceneMiscType` enum for the different types of commands.
+ * @note setting `endFrame` to same value as `startFrame` will not behave as expected.
+ * For commands that only need to last one frame, set `endFrame` to `startFrame + 1`.
+ *
* ARGS
- * s16 unk (u), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * uuuussss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_MISC(unk, startFrame, endFrame, unk_06) \
- { CMD_HH(unk, startFrame) }, { CMD_HH(endFrame, unk_06) }
+#define CS_MISC(type, startFrame, endFrame, unused0) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, unused0) }
/**
+ * Declares a list of `CS_LIGHT_SETTING` entries.
+ *
* ARGS
* s32 entries (e)
* FORMAT
* 00000097 eeeeeeee
* size = 0x8
*/
-#define CS_LIGHTING_LIST(entries) { CS_CMD_SET_LIGHTING }, { CMD_W(entries) }
+#define CS_LIGHT_SETTING_LIST(entries) { CS_CMD_LIGHT_SETTING }, { CMD_W(entries) }
/**
+ * Changes the environment lights to the specified setting.
+ * The lighting change will take place immediately with no blending.
+ *
* ARGS
- * s16 setting (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 setting (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_LIGHTING(setting, startFrame, endFrame) \
- { CMD_HH(setting, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_LIGHT_SETTING(lightSetting, startFrame, endFrame) \
+ { CMD_BBH(0, (lightSetting + 1), startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -171,18 +222,18 @@
* 00000098 eeeeeeee
* size = 0x8
*/
-#define CS_SCENE_TRANS_FX_LIST(entries) { CS_CMD_SCENE_TRANS_FX }, { CMD_W(entries) }
+#define CS_TRANSITION_LIST(entries) { CS_CMD_TRANSITION }, { CMD_W(entries) }
/**
* ARGS
- * s16 transitionType (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_SCENE_TRANS_FX(transitionType, startFrame, endFrame) \
- { CMD_HH(transitionType, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_TRANSITION(type, startFrame, endFrame) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -190,20 +241,20 @@
* s32 entries (e)
* FORMAT
* 00000099 eeeeeeee
- * size = 0x08
+ * size = 0x8
*/
-#define CS_MOTIONBLUR_LIST(entries) { CS_CMD_MOTIONBLUR }, { CMD_W(entries) }
+#define CS_MOTION_BLUR_LIST(entries) { CS_CMD_MOTION_BLUR }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_MOTIONBLUR(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_MOTION_BLUR(type, startFrame, endFrame) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -213,18 +264,18 @@
* 0000009A eeeeeeee
* size = 0x8
*/
-#define CS_GIVETATL_LIST(entries) { CS_CMD_GIVETATL }, { CMD_W(entries) }
+#define CS_GIVE_TATL_LIST(entries) { CS_CMD_GIVE_TATL }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 giveTatl (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_GIVETATL(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_GIVE_TATL(giveTatl, startFrame, endFrame) \
+ { CMD_HH(giveTatl, startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -234,75 +285,66 @@
* 0000009B eeeeeeee
* size = 0x8
*/
-#define CS_FADESCREEN_LIST(entries) { CS_CMD_FADESCREEN }, { CMD_W(entries) }
+#define CS_TRANSITION_GENERAL_LIST(entries) { CS_CMD_TRANSITION_GENERAL }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e),
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e),
* u8 red (r), u8 green (g), blue (b)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeerrgg bbUUUUUU
+ * ttttssss eeeerrgg bbUUUUUU
* size = 0x0C
*/
-#define CS_FADESCREEN(base, startFrame, endFrame, red, green, blue) \
- { CMD_HH(base, startFrame) }, { CMD_HBB(endFrame, red, green) }, { CMD_BBBB(blue, 0, 0, 0) }
-
-
-/**
- * ARGS
- * s32 entries (e)
- * FORMAT
- * 0000009C eeeeeeee
- * size = 0x8
- */
-#define CS_FADESEQ_LIST(entries) { CS_CMD_FADESEQ }, { CMD_W(entries) }
-
-/**
- * ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
- * FORMAT
- * Capital U is Unused
- * mmmmssss eeeeUUUU UUUUUUUU
- * size = 0x0C
- */
-#define CS_FADESEQ(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, 0) }, { CMD_W(0) }
+#define CS_TRANSITION_GENERAL(type, startFrame, endFrame, red, green, blue) \
+ { CMD_HH(type, startFrame) }, { CMD_HBB(endFrame, red, green) }, { CMD_BBBB(blue, 0, 0, 0) }
/**
+ * Declares a list of `CS_TIME` entries.
+ *
* ARGS
* s32 entries (e)
* FORMAT
* 0000009D eeeeeeee
* size = 0x8
*/
-#define CS_TIME_LIST(entries) { CS_CMD_SETTIME }, { CMD_W(entries) }
+#define CS_TIME_LIST(entries) { CS_CMD_TIME }, { CMD_W(entries) }
/**
+ * Sets the time of day.
+ * Both the day time and skybox time are set by this command.
+ * @note `endFrame` is not used in the implementation of the command, so its value does not matter
+ *
* ARGS
- * s16 unk (u), s16 startFrame (s), s16 endFrame (e), s8 hour (h), s8 min (m)
+ * s16 startFrame (s), s16 endFrame (e), s8 hour (h), s8 min (m)
* FORMAT
* Capital U is Unused
- * uuuussss eeeehhmm UUUUUUUU
+ * UUUUssss eeeehhmm UUUUUUUU
* size = 0xC
*/
-#define CS_TIME(unk, startFrame, endFrame, hour, min, unused) \
- { CMD_HH(unk, startFrame) }, { CMD_HBB(endFrame, hour, min) }, { CMD_W(unused) }
+#define CS_TIME(unused0, startFrame, endFrame, hour, min) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HBB(endFrame, hour, min) }, { CMD_W(0) }
/**
+ * Declares a list of `CS_ACTOR_CUE` entries.
+ *
* ARGS
* s32 cmdType (c), s32 entries (e)
* FORMAT
* cccccccc eeeeeeee
* size = 0x8
*/
-#define CS_ACTOR_ACTION_LIST(cmdType, entries) { CMD_W(cmdType) }, { CMD_W(entries) }
+#define CS_ACTOR_CUE_LIST(cmdType, entries) { CMD_W(cmdType) }, { CMD_W(entries) }
/**
+ * Defines a cue that an actor can listen for.
+ * The actor can choose whether or not to use the position and rotation data supplied to it.
+ * The cue `id` is a number that has an actor-specific meaning.
+ *
* ARGS
- * s16 npcAction (a), s16 startFrame (s), s16 endFrame (e),
+ * s16 id (a), s16 startFrame (s), s16 endFrame (e),
* s16 rotX (u), s16 rotY (v), s16 rotZ (w),
* s32 startX (i), s32 startY (j), s32 startZ (k),
* s32 endX (l), s32 endY (m), s32 endZ (n),
@@ -311,25 +353,29 @@
* aaaassss eeeeuuuu vvvvwwww iiiiiiii jjjjjjjj kkkkkkkk llllllll mmmmmmmm nnnnnnnn xxxxxxxx yyyyyyyy zzzzzzzz
* size = 0x30
*/
-#define CS_ACTOR_ACTION(npcAction, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ) \
- { CMD_HH(npcAction, startFrame) }, { CMD_HH(endFrame, rotX) }, { CMD_HH(rotY, rotZ) }, \
+#define CS_ACTOR_CUE(id, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ) \
+ { CMD_HH(id, startFrame) }, { CMD_HH(endFrame, rotX) }, { CMD_HH(rotY, rotZ) }, \
{ CMD_W(startX) }, { CMD_W(startY) }, { CMD_W(startZ) }, \
{ CMD_W(endX) }, { CMD_W(endY) }, { CMD_W(endZ) }, \
{ CMD_F(normX) }, { CMD_F(normY) }, { CMD_F(normZ) }
/**
+ * Declares a list of `CS_PLAYER_CUE` entries.
+ *
* ARGS
* s32 cmdType (c), s32 entries (e)
* FORMAT
* 000000C8 eeeeeeee
* size = 0x8
*/
-#define CS_PLAYER_ACTION_LIST(entries) { CS_CMD_SET_PLAYER_ACTION }, { CMD_W(entries) }
+#define CS_PLAYER_CUE_LIST(entries) { CS_CMD_PLAYER_CUE }, { CMD_W(entries) }
/**
+ * A player cue is the same as `CS_ACTOR_CUE` but is specifically for player.
+ *
* ARGS
- * s16 playerAction (a), s16 startFrame (s), s16 endFrame (e),
+ * s16 id (a), s16 startFrame (s), s16 endFrame (e),
* s16 rotX (u), s16 rotY (v), s16 rotZ (w),
* s32 startX (i), s32 startY (j), s32 startZ (k),
* s32 endX (l), s32 endY (m), s32 endZ (n),
@@ -338,113 +384,87 @@
* aaaassss eeeeuuuu vvvvwwww iiiiiiii jjjjjjjj kkkkkkkk llllllll mmmmmmmm nnnnnnnn xxxxxxxx yyyyyyyy zzzzzzzz
* size = 0x30
*/
-#define CS_PLAYER_ACTION(playerAction, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ) \
- CS_ACTOR_ACTION(playerAction, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ)
+#define CS_PLAYER_CUE(id, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ) \
+ CS_ACTOR_CUE(id, startFrame, endFrame, rotX, rotY, rotZ, startX, startY, startZ, endX, endY, endZ, normX, normY, normZ)
/**
+ * Declares a list of `CS_START_SEQ` entries.
+ *
* ARGS
* s32 entries (e)
* FORMAT
* 0000012C eeeeeeee
* size = 0x8
*/
-#define CS_PLAYSEQ_LIST(entries) { CS_CMD_PLAYSEQ }, { CMD_W(entries) }
+#define CS_START_SEQ_LIST(entries) \
+ { CS_CMD_START_SEQ }, { CMD_W(entries) }
/**
+ * Starts a sequence at the specified time.
+ * @note `endFrame` is not used in the implementation of the command, so its value does not matter
+ *
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 seqId (i), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
- */
-#define CS_PLAYSEQ(sequence, startFrame, endFrame) \
- { CMD_HH(sequence, startFrame) }, { CMD_HH(endFrame, endFrame) }
-
-
-/**
- * ARGS
- * s32 entries (e)
- * FORMAT
- * 00000130 eeeeeeee
+ * iiiissss eeeeUUUU
* size = 0x8
*/
-#define CS_SCENE_UNK_130_LIST(entries) { CS_CMD_130 }, { CMD_W(entries) }
-
-/**
- * ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
- * FORMAT
- * Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x30
- */
-#define CS_SCENE_UNK_130(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
-
-
-/**
- * ARGS
- * s32 entries (e)
- * FORMAT
- * 00000131 eeeeeeee
- * size = 0x8
- */
-#define CS_SCENE_UNK_131_LIST(entries) { CS_CMD_131 }, { CMD_W(entries) }
-
-/**
- * ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
- * FORMAT
- * Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
- */
-#define CS_SCENE_UNK_131(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
-
-
-/**
- * ARGS
- * s32 entries (e)
- * FORMAT
- * 00000132 eeeeeeee
- * size = 0x8
- */
-#define CS_SCENE_UNK_132_LIST(entries) { CS_CMD_132 }, { CMD_W(entries) }
-
-/**
- * ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
- * FORMAT
- * Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
- */
-#define CS_SCENE_UNK_132(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_START_SEQ(seqId, startFrame, endFrame) \
+ { CMD_HH((seqId + 1), startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
+ * Declares a list of `CS_STOP_SEQ` entries.
+ *
* ARGS
* s32 entries (e)
* FORMAT
* 00000133 eeeeeeee
* size = 0x8
*/
-#define CS_STOPSEQ_LIST(entries) { CS_CMD_STOPSEQ }, { CMD_W(entries) }
+#define CS_STOP_SEQ_LIST(entries) { CS_CMD_STOP_SEQ }, { CMD_W(entries) }
/**
+ * Stops a sequence at the specified time.
+ *
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 seqId (i), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * iiiissss eeeeUUUU
+ * size = 0x8
*/
-#define CS_STOPSEQ(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
+#define CS_STOP_SEQ(seqId, startFrame, endFrame, unk_06) \
+ { CMD_HH((seqId + 1), startFrame) }, { CMD_HH(endFrame, unk_06) }
+
+
+/**
+ * Stops a sequence at the specified time.
+ * @note `endFrame` is not used in the implementation of the command, so its value does not matter
+ *
+ * ARGS
+ * s32 entries (e)
+ * FORMAT
+ * 0000009C eeeeeeee
+ * size = 0x8
+ */
+#define CS_FADE_OUT_SEQ_LIST(entries) { CS_CMD_FADE_OUT_SEQ }, { CMD_W(entries) }
+
+/**
+ * Fade out the sequence that is playing on the specified sequence player, over the specified frame range.
+ * @see `CutsceneFadeOutSeqPlayer`
+ *
+ * ARGS
+ * s16 seqPlayer (p), s16 startFrame (s), s16 endFrame (e)
+ * FORMAT
+ * Capital U is Unused
+ * ppppssss eeeeUUUU UUUUUUUU
+ * size = 0x0C
+ */
+#define CS_FADE_OUT_SEQ(seqPlayer, startFrame, endFrame) \
+ { CMD_HH(seqPlayer, startFrame) }, { CMD_HH(endFrame, 0) }, { CMD_W(0) }
/**
@@ -454,18 +474,18 @@
* 00000134 eeeeeeee
* size = 0x8
*/
-#define CS_PLAYAMBIENCE_LIST(entries) { CS_CMD_PLAYAMBIENCE }, { CMD_W(entries) }
+#define CS_START_AMBIENCE_LIST(entries) { CS_CMD_START_AMBIENCE }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * UUUUssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_PLAYAMBIENCE(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
+#define CS_START_AMBIENCE(unused0, startFrame, endFrame) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HH(endFrame, 0) }
/**
@@ -475,39 +495,106 @@
* 00000135 eeeeeeee
* size = 0x8
*/
-#define CS_FADEAMBIENCE_LIST(entries) { CS_CMD_FADEAMBIENCE }, { CMD_W(entries) }
+#define CS_FADE_OUT_AMBIENCE_LIST(entries) { CS_CMD_FADE_OUT_AMBIENCE }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * UUUUssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_FADEAMBIENCE(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
+#define CS_FADE_OUT_AMBIENCE(unused0, startFrame, endFrame) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HH(endFrame, 0) }
/**
* ARGS
* s32 entries (e)
* FORMAT
- * 0000015E eeeeeeee
+ * 00000132 eeeeeeee
* size = 0x8
*/
-#define CS_TERMINATOR_LIST(entries) { CS_CMD_TERMINATOR }, { CMD_W(entries) }
+#define CS_MODIFY_SEQ_LIST(entries) { CS_CMD_MODIFY_SEQ }, { CMD_W(entries) }
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_TERMINATOR(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_MODIFY_SEQ(type, startFrame, endFrame) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, endFrame) }
+
+
+/**
+ * ARGS
+ * s32 entries (e)
+ * FORMAT
+ * 00000130 eeeeeeee
+ * size = 0x8
+ */
+#define CS_SFX_REVERB_INDEX_2_LIST(entries) { CS_CMD_SFX_REVERB_INDEX_2 }, { CMD_W(entries) }
+
+/**
+ * ARGS
+ * s16 startFrame (s), s16 endFrame (e)
+ * FORMAT
+ * Capital U is Unused
+ * UUUUssss eeeeUUUU
+ * size = 0x30
+ */
+#define CS_SFX_REVERB_INDEX_2(unused0, startFrame, endFrame) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HH(endFrame, 0) }
+
+
+/**
+ * ARGS
+ * s32 entries (e)
+ * FORMAT
+ * 00000131 eeeeeeee
+ * size = 0x8
+ */
+#define CS_SFX_REVERB_INDEX_1_LIST(entries) { CS_CMD_SFX_REVERB_INDEX_1 }, { CMD_W(entries) }
+
+/**
+ * ARGS
+ * s16 startFrame (s), s16 endFrame (e)
+ * FORMAT
+ * Capital U is Unused
+ * UUUUssss eeeeUUUU
+ * size = 0x8
+ */
+#define CS_SFX_REVERB_INDEX_1(unused0, startFrame, endFrame) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HH(endFrame, 0) }
+
+
+/**
+ * Declares a list of `CS_DESTINATION` entries.
+ *
+ * ARGS
+ * s32 entries (e)
+ * FORMAT
+ * 0000015E eeeeeeee
+ * size = 0x8
+ */
+#define CS_DESTINATION_LIST(entries) { CS_CMD_DESTINATION }, { CMD_W(entries) }
+
+/**
+ * Sends the player to a new destination using the entry defined in `CutsceneScriptEntry`.
+ *
+ * ARGS
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
+ * FORMAT
+ * Capital U is Unused
+ * ttttssss eeeeUUUU
+ * size = 0x8
+ */
+#define CS_DESTINATION(type, startFrame, endFrame) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -521,14 +608,14 @@
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_CHOOSE_CREDITS_SCENES(base, startFrame, endFrame) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, endFrame) }
+#define CS_CHOOSE_CREDITS_SCENES(type, startFrame, endFrame) \
+ { CMD_HH(type, startFrame) }, { CMD_HH(endFrame, endFrame) }
/**
@@ -542,14 +629,14 @@
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 type (t), s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * ttttssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_RUMBLE(base, startFrame, endFrame, intensity, decayTimer, decayStep) \
- { CMD_HH(base, startFrame) }, { CMD_HBB(endFrame, intensity, decayTimer) }, { CMD_BBBB(decayStep, 0, 0, 0) }
+#define CS_RUMBLE(type, startFrame, endFrame, intensity, decayTimer, decayStep) \
+ { CMD_HH(type, startFrame) }, { CMD_HBB(endFrame, intensity, decayTimer) }, { CMD_BBBB(decayStep, 0, 0, 0) }
/**
@@ -563,14 +650,14 @@
/**
* ARGS
- * s16 base (m), s16 startFrame (s), s16 endFrame (e)
+ * s16 startFrame (s), s16 endFrame (e)
* FORMAT
* Capital U is Unused
- * mmmmssss eeeeUUUU
- * size = 0x08
+ * UUUUssss eeeeUUUU
+ * size = 0x8
*/
-#define CS_UNK_DATA(base, startFrame, endFrame, unk_06) \
- { CMD_HH(base, startFrame) }, { CMD_HH(endFrame, unk_06) }
+#define CS_UNK_DATA(unused0, startFrame, endFrame, unk_06) \
+ { CMD_HH(unused0, startFrame) }, { CMD_HH(endFrame, unk_06) }
/**
@@ -578,4 +665,47 @@
*/
#define CS_END() { CMD_W(0xFFFFFFFF) }
+// TODO: Fix ZAPD and delete these
+#define CS_ACTOR_ACTION_LIST CS_ACTOR_CUE_LIST
+#define CS_ACTOR_ACTION CS_ACTOR_CUE
+#define CS_PLAYER_ACTION_LIST CS_PLAYER_CUE_LIST
+#define CS_PLAYER_ACTION CS_PLAYER_CUE
+#define CS_LIGHTING_LIST CS_LIGHT_SETTING_LIST
+#define CS_CAMERA_LIST CS_CAM_SPLINE_LIST
+#define CS_TEXT_DISPLAY_TEXTBOX CS_TEXT
+#define CS_TEXT_LEARN_SONG CS_TEXT_OCARINA_ACTION
+#define CS_SCENE_TRANS_FX_LIST CS_TRANSITION_LIST
+#define CS_SCENE_TRANS_FX CS_TRANSITION
+#define CS_GIVETATL_LIST CS_GIVE_TATL_LIST
+#define CS_GIVETATL CS_GIVE_TATL
+#define CS_PLAYSEQ_LIST CS_START_SEQ_LIST
+#define CS_STOPSEQ_LIST CS_STOP_SEQ_LIST
+#define CS_FADESEQ_LIST CS_FADE_OUT_SEQ_LIST
+#define CS_FADESEQ CS_FADE_OUT_SEQ
+#define CS_PLAYAMBIENCE_LIST CS_START_AMBIENCE_LIST
+#define CS_PLAYAMBIENCE CS_START_AMBIENCE
+#define CS_FADEAMBIENCE_LIST CS_FADE_OUT_AMBIENCE_LIST
+#define CS_FADEAMBIENCE CS_FADE_OUT_AMBIENCE
+#define CS_SCENE_UNK_130_LIST CS_SFX_REVERB_INDEX_2_LIST
+#define CS_SCENE_UNK_130 CS_SFX_REVERB_INDEX_2
+#define CS_SCENE_UNK_131_LIST CS_SFX_REVERB_INDEX_1_LIST
+#define CS_SCENE_UNK_131 CS_SFX_REVERB_INDEX_1
+#define CS_SCENE_UNK_132_LIST CS_MODIFY_SEQ_LIST
+#define CS_SCENE_UNK_132 CS_MODIFY_SEQ
+#define CS_MOTIONBLUR_LIST CS_MOTION_BLUR_LIST
+#define CS_MOTIONBLUR CS_MOTION_BLUR
+#define CS_FADESCREEN_LIST CS_TRANSITION_GENERAL_LIST
+#define CS_FADESCREEN CS_TRANSITION_GENERAL
+#define CS_TERMINATOR_LIST CS_DESTINATION_LIST
+#define CS_TERMINATOR CS_DESTINATION
+
+#define CS_PLAYSEQ(seqId, startFrame, endFrame) \
+CS_START_SEQ((seqId)-1, startFrame, endFrame)
+
+#define CS_STOPSEQ(seqId, startFrame, endFrame, unk_06) \
+CS_STOP_SEQ((seqId)-1, startFrame, endFrame, unk_06)
+
+#define CS_LIGHTING(lightSetting, startFrame, endFrame) \
+CS_LIGHT_SETTING((lightSetting)-1, startFrame, endFrame)
+
#endif
diff --git a/include/z64door.h b/include/z64door.h
new file mode 100644
index 000000000..26653c308
--- /dev/null
+++ b/include/z64door.h
@@ -0,0 +1,24 @@
+#ifndef Z64_DOOR_H
+#define Z64_DOOR_H
+
+#include "ultra64.h"
+#include "z64actor.h"
+
+typedef struct KnobDoorActor {
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ SkelAnime skelAnime;
+ /* 0x1A0 */ u8 animIndex;
+ /* 0x1A1 */ u8 playOpenAnim;
+ /* 0x1A2 */ s8 requiredObjBankIndex;
+ /* 0x1A3 */ s8 dlIndex;
+} KnobDoorActor; // size = 0x1A4
+
+typedef struct SlidingDoorActor {
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ s16 unk_15C;
+ /* 0x15E */ s16 unk_15E;
+} SlidingDoorActor; // size = 0x160
+
+#define DOOR_GET_TRANSITION_ID(thisx) ((u16)(thisx)->params >> 10)
+
+#endif
diff --git a/include/z64effect.h b/include/z64effect.h
index d6ab8b3b5..71ad80510 100644
--- a/include/z64effect.h
+++ b/include/z64effect.h
@@ -118,10 +118,10 @@ typedef struct {
/* 0x188 */ u16 flags;
/* 0x18A */ s16 addAngleChange;
/* 0x18C */ s16 addAngle;
- /* 0x18E */ Color_RGBA8 p1StartColor;
- /* 0x192 */ Color_RGBA8 p2StartColor;
- /* 0x196 */ Color_RGBA8 p1EndColor;
- /* 0x19A */ Color_RGBA8 p2EndColor;
+ /* 0x18E */ u8 p1StartColor[4];
+ /* 0x192 */ u8 p2StartColor[4];
+ /* 0x196 */ u8 p1EndColor[4];
+ /* 0x19A */ u8 p2EndColor[4];
/* 0x19E */ u8 numElements; // "now_edge_num"
/* 0x19F */ u8 elemDuration;
/* 0x1A0 */ u8 unkFlag;
diff --git a/include/z64frameadvance.h b/include/z64frameadvance.h
index c0feaed59..179a1adba 100644
--- a/include/z64frameadvance.h
+++ b/include/z64frameadvance.h
@@ -1,8 +1,7 @@
#ifndef Z64FRAMEADVANCE_H
#define Z64FRAMEADVANCE_H
-#include "ultra64.h"
-#include "io/controller.h"
+#include "padmgr.h"
typedef struct FrameAdvanceContext {
/* 0x0 */ s32 enabled;
diff --git a/include/z64game.h b/include/z64game.h
new file mode 100644
index 000000000..c5551edc7
--- /dev/null
+++ b/include/z64game.h
@@ -0,0 +1,104 @@
+#ifndef Z64_GAME_H
+#define Z64_GAME_H
+
+#include "ultra64.h"
+#include "libc/stdbool.h"
+#include "libc/stdint.h"
+#include "io/controller.h"
+#include "tha.h"
+#include "padmgr.h"
+
+struct GraphicsContext;
+struct GameState;
+
+
+typedef void (*GameStateFunc)(struct GameState* gameState);
+
+typedef struct {
+ /* 0x00 */ void* loadedRamAddr;
+ /* 0x04 */ uintptr_t vromStart; // if applicable
+ /* 0x08 */ uintptr_t vromEnd; // if applicable
+ /* 0x0C */ void* vramStart; // if applicable
+ /* 0x10 */ void* vramEnd; // if applicable
+ /* 0x14 */ UNK_PTR unk_14;
+ /* 0x18 */ GameStateFunc init; // initializes and executes the given context
+ /* 0x1C */ GameStateFunc destroy; // deconstructs the context, and sets the next context to load
+ /* 0x20 */ UNK_PTR unk_20;
+ /* 0x24 */ UNK_PTR unk_24;
+ /* 0x28 */ UNK_TYPE unk_28;
+ /* 0x2C */ size_t instanceSize;
+} GameStateOverlay; // size = 0x30
+
+typedef struct GameAllocEntry {
+ /* 0x0 */ struct GameAllocEntry* next;
+ /* 0x4 */ struct GameAllocEntry* prev;
+ /* 0x8 */ size_t size;
+ /* 0xC */ u32 unk_0C;
+} GameAllocEntry; // size = 0x10
+
+typedef struct GameAlloc {
+ /* 0x00 */ GameAllocEntry base;
+ /* 0x10 */ GameAllocEntry* head;
+} GameAlloc; // size = 0x14
+
+typedef struct GameState {
+ /* 0x00 */ struct GraphicsContext* gfxCtx;
+ /* 0x04 */ GameStateFunc main;
+ /* 0x08 */ GameStateFunc destroy;
+ /* 0x0C */ GameStateFunc init; // Usually the current game state's init, though after stopping, the graph thread will look here to determine the next game state to load.
+ /* 0x10 */ size_t size;
+ /* 0x14 */ Input input[MAXCONTROLLERS];
+ /* 0x74 */ TwoHeadArena heap;
+ /* 0x84 */ GameAlloc alloc;
+ /* 0x98 */ UNK_TYPE1 pad98[0x3];
+ /* 0x9B */ u8 running; // If 0, switch to next game state
+ /* 0x9C */ u32 frames;
+ /* 0xA0 */ u8 padA0[0x2];
+ /* 0xA2 */ u8 framerateDivisor;
+ /* 0xA3 */ u8 unk_A3;
+} GameState; // size = 0xA4
+
+
+void Game_UpdateFramerateVariables(s32 divisor);
+void Game_SetFramerateDivisor(GameState* gameState, s32 divisor);
+void GameState_SetFBFilter(Gfx** gfx, void* zbuffer);
+void Game_Nop80173534(GameState* gameState);
+void GameState_Draw(GameState* gameState, struct GraphicsContext* gfxCtx);
+void GameState_SetFrameBuffer(struct GraphicsContext* gfxCtx);
+void func_801736DC(struct GraphicsContext* gfxCtx);
+void Game_UpdateInput(GameState* gameState);
+void Game_Update(GameState* gameState);
+void Game_IncrementFrameCount(GameState* gameState);
+void GameState_InitArena(GameState* gameState, size_t size);
+void GameState_Realloc(GameState* gameState, size_t size);
+void GameState_Init(GameState* gameState, GameStateFunc init, struct GraphicsContext* gfxCtx);
+void GameState_Destroy(GameState* gameState);
+GameStateFunc GameState_GetInit(GameState* gameState);
+size_t GameState_GetSize(GameState* gameState);
+u32 GameState_IsRunning(GameState* gameState);
+s32 GameState_GetArenaSize(GameState* gameState);
+s32 func_80173B48(GameState* gameState);
+
+extern s32 gFramerateDivisor;
+extern f32 gFramerateDivisorF;
+extern f32 gFramerateDivisorHalf;
+extern f32 gFramerateDivisorThird;
+
+
+#define STOP_GAMESTATE(curState) \
+ do { \
+ GameState* state = curState; \
+ \
+ state->running = false; \
+ } while(0)
+
+#define SET_NEXT_GAMESTATE(curState, nextInit, nextSize) \
+ do { \
+ GameState* state = curState; \
+ \
+ (state)->init = nextInit; \
+ (state)->size = nextSize; \
+ } while (0)
+
+
+#endif
diff --git a/include/z64horse.h b/include/z64horse.h
new file mode 100644
index 000000000..bae439868
--- /dev/null
+++ b/include/z64horse.h
@@ -0,0 +1,21 @@
+#ifndef Z64_HORSE_H
+#define Z64_HORSE_H
+
+#include "ultra64.h"
+#include "z64.h"
+
+
+s32 Horse_GetJumpingFencePathIndex(PlayState* play);
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4);
+s32 Horse_IsValidSpawn(s16 sceneId);
+void Horse_ResetHorseData(PlayState* play);
+void Horse_Spawn(PlayState* play, Player* player);
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw);
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx);
+
+
+extern s32 gHorseIsMounted;
+extern s32 D_801BDAA0;
+extern s32 gHorsePlayedEponasSong;
+
+#endif
diff --git a/include/z64item.h b/include/z64item.h
index d1d36ebba..55cbb337f 100644
--- a/include/z64item.h
+++ b/include/z64item.h
@@ -19,7 +19,7 @@ typedef enum {
/* 2 */ EQUIP_VALUE_SWORD_RAZOR,
/* 3 */ EQUIP_VALUE_SWORD_GILDED,
/* 4 */ EQUIP_VALUE_SWORD_DIETY,
- /* 5 */ EQUIP_VALUE_SWORD_MAX,
+ /* 5 */ EQUIP_VALUE_SWORD_MAX
} EquipValueSword;
typedef enum {
@@ -332,12 +332,16 @@ typedef enum GetItemId {
/* 0x08 */ GI_WALLET_ADULT,
/* 0x09 */ GI_WALLET_GIANT,
/* 0x0A */ GI_RECOVERY_HEART,
- /* 0x0C */ GI_HEART_PIECE = 0x0C,
+ /* 0x0B */ GI_0B,
+ /* 0x0C */ GI_HEART_PIECE,
/* 0x0D */ GI_HEART_CONTAINER,
/* 0x0E */ GI_MAGIC_SMALL,
/* 0x0F */ GI_MAGIC_LARGE,
- /* 0x11 */ GI_STRAY_FAIRY = 0x11,
- /* 0x14 */ GI_BOMBS_1 = 0x14,
+ /* 0x10 */ GI_10,
+ /* 0x11 */ GI_STRAY_FAIRY,
+ /* 0x12 */ GI_12,
+ /* 0x13 */ GI_13,
+ /* 0x14 */ GI_BOMBS_1,
/* 0x15 */ GI_BOMBS_5,
/* 0x16 */ GI_BOMBS_10,
/* 0x17 */ GI_BOMBS_20,
@@ -360,8 +364,14 @@ typedef enum GetItemId {
/* 0x28 */ GI_NUTS_1,
/* 0x29 */ GI_NUTS_5,
/* 0x2A */ GI_NUTS_10,
- /* 0x2E */ GI_BOMBCHUS_20 = 0x2E,
- /* 0x32 */ GI_SHIELD_HERO = 0x32,
+ /* 0x2B */ GI_2B,
+ /* 0x2C */ GI_2C,
+ /* 0x2D */ GI_2D,
+ /* 0x2E */ GI_BOMBCHUS_20,
+ /* 0x2F */ GI_2F,
+ /* 0x30 */ GI_30,
+ /* 0x31 */ GI_31,
+ /* 0x32 */ GI_SHIELD_HERO,
/* 0x33 */ GI_SHIELD_MIRROR,
/* 0x34 */ GI_POWDER_KEG,
/* 0x35 */ GI_MAGIC_BEANS,
@@ -379,10 +389,24 @@ typedef enum GetItemId {
/* 0x41 */ GI_HOOKSHOT,
/* 0x42 */ GI_LENS,
/* 0x43 */ GI_PICTO_BOX,
- /* 0x4C */ GI_OCARINA = 0x4C,
- /* 0x50 */ GI_BOMBERS_NOTEBOOK = 0x50,
- /* 0x52 */ GI_SKULL_TOKEN = 0x52,
- /* 0x55 */ GI_REMAINS_ODOLWA = 0x55,
+ /* 0x44 */ GI_44,
+ /* 0x45 */ GI_45,
+ /* 0x46 */ GI_46,
+ /* 0x47 */ GI_47,
+ /* 0x48 */ GI_48,
+ /* 0x49 */ GI_49,
+ /* 0x4A */ GI_4A,
+ /* 0x4B */ GI_4B,
+ /* 0x4C */ GI_OCARINA,
+ /* 0x4D */ GI_4D,
+ /* 0x4E */ GI_4E,
+ /* 0x4F */ GI_4F,
+ /* 0x50 */ GI_BOMBERS_NOTEBOOK,
+ /* 0x51 */ GI_51,
+ /* 0x52 */ GI_SKULL_TOKEN,
+ /* 0x53 */ GI_53,
+ /* 0x54 */ GI_54,
+ /* 0x55 */ GI_REMAINS_ODOLWA,
/* 0x56 */ GI_REMAINS_GOHT,
/* 0x57 */ GI_REMAINS_GYORG,
/* 0x58 */ GI_REMAINS_TWINMOLD,
@@ -410,9 +434,14 @@ typedef enum GetItemId {
/* 0x6E */ GI_SEAHORSE,
/* 0x6F */ GI_CHATEAU_BOTTLE,
/* 0x70 */ GI_HYLIAN_LOACH,
- /* 0x75 */ GI_75 = 0x75,
+ /* 0x71 */ GI_71,
+ /* 0x72 */ GI_72,
+ /* 0x73 */ GI_73,
+ /* 0x74 */ GI_74,
+ /* 0x75 */ GI_75,
/* 0x76 */ GI_ICE_TRAP,
- /* 0x78 */ GI_MASK_DEKU = 0x78,
+ /* 0x77 */ GI_77,
+ /* 0x78 */ GI_MASK_DEKU,
/* 0x79 */ GI_MASK_GORON,
/* 0x7A */ GI_MASK_ZORA,
/* 0x7B */ GI_MASK_FIERCE_DEITY,
@@ -436,7 +465,8 @@ typedef enum GetItemId {
/* 0x8D */ GI_MASK_BLAST,
/* 0x8E */ GI_MASK_SCENTS,
/* 0x8F */ GI_MASK_KAFEIS_MASK,
- /* 0x91 */ GI_CHATEAU = 0x91,
+ /* 0x90 */ GI_90,
+ /* 0x91 */ GI_CHATEAU,
/* 0x92 */ GI_MILK,
/* 0x93 */ GI_GOLD_DUST_2,
/* 0x94 */ GI_HYLIAN_LOACH_2, // Unused bottled eel
@@ -463,7 +493,15 @@ typedef enum GetItemId {
/* 0xA9 */ GI_BOTTLE_STOLEN, // buy back stolen bottle
/* 0xAA */ GI_LETTER_TO_KAFEI,
/* 0xAB */ GI_PENDANT_OF_MEMORIES,
- /* 0xB4 */ GI_TINGLE_MAP_CLOCK_TOWN = 0xB4,
+ /* 0xAC */ GI_AC,
+ /* 0xAD */ GI_AD,
+ /* 0xAE */ GI_AE,
+ /* 0xAF */ GI_AF,
+ /* 0xB0 */ GI_B0,
+ /* 0xB1 */ GI_B1,
+ /* 0xB2 */ GI_B2,
+ /* 0xB3 */ GI_B3,
+ /* 0xB4 */ GI_TINGLE_MAP_CLOCK_TOWN,
/* 0xB5 */ GI_TINGLE_MAP_WOODFALL,
/* 0xB6 */ GI_TINGLE_MAP_SNOWHEAD,
/* 0xB7 */ GI_TINGLE_MAP_ROMANI_RANCH,
diff --git a/include/z64math.h b/include/z64math.h
index 62b6432e8..a86cf9a20 100644
--- a/include/z64math.h
+++ b/include/z64math.h
@@ -87,12 +87,32 @@ typedef struct {
/* 0x0C */ Vec3f b;
} LineSegment; // size = 0x18
-// Defines a point in the spherical coordinate system
typedef struct {
- /* 0x0 */ f32 r; // radius
- /* 0x4 */ s16 pitch; // polar (zenith) angle
- /* 0x6 */ s16 yaw; // azimuthal angle
-} VecSph; // size = 0x8
+ /* 0x0 */ f32 r; // radius
+ /* 0x4 */ s16 pitch; // depends on coordinate system. See below.
+ /* 0x6 */ s16 yaw; // azimuthal angle
+} VecSphGeo; // size = 0x8
+
+// Defines a point in the spherical coordinate system.
+// Pitch is 0 along the positive y-axis (up)
+typedef VecSphGeo VecSph;
+
+// Defines a point in the geographic coordinate system.
+// Pitch is 0 along the xz-plane (horizon)
+typedef VecSphGeo VecGeo;
+
+// To be used with OLib_Vec3fAdd()
+typedef enum {
+ /* 0 */ OLIB_ADD_COPY, // Copy `b` to dest
+ /* 1 */ OLIB_ADD_OFFSET, // Add `a` and `b` to dest, and also add the yaw of `a` to the dest
+ /* 2 */ OLIB_ADD // Add `a` and `b` to dest
+} OlibVec3fAdd;
+
+typedef enum {
+ /* 0 */ OLIB_DIFF_COPY, // Copy `b` to dest
+ /* 1 */ OLIB_DIFF_OFFSET, // Sub `a` and `b` to dest, and also subs the yaw of `a` to the dest
+ /* 2 */ OLIB_DIFF // Sub `a` and `b` to dest
+} OlibVec3fDiff;
#define LERPIMP(v0, v1, t) ((v0) + (((v1) - (v0)) * (t)))
#define F32_LERP(v0, v1, t) ((1.0f - (t)) * (f32)(v0) + (t) * (f32)(v1))
@@ -114,13 +134,28 @@ typedef struct {
#define IS_ZERO(f) (fabsf(f) < 0.008f)
+// Casting a float to an integer, when the float value is larger than what the integer type can hold,
+// leads to undefined behavior. For example (f32)0x8000 doesn't fit in a s16, so it cannot be cast to s16.
+// This isn't an issue with IDO, but is one with for example GCC.
+// A partial workaround is to cast to s32 then s16, hoping all binang values used will fit a s32.
+#define TRUNCF_BINANG(f) (s16)(s32)(f)
+
// Angle conversion macros
-#define DEG_TO_BINANG(degrees) (s16)((degrees) * (0x8000 / 180.0f))
-#define RADF_TO_BINANG(radf) (s16)((radf) * (0x8000 / M_PI))
-#define RADF_TO_DEGF(radf) ((radf) * (180.0f / M_PI))
-#define DEGF_TO_RADF(degf) ((degf) * (M_PI / 180.0f))
-#define BINANG_TO_RAD(binang) ((f32)binang * (M_PI / 0x8000))
-#define BINANG_TO_RAD_ALT(binang) (((f32)binang / 0x8000) * M_PI)
+#define DEG_TO_RAD(degrees) ((degrees) * (M_PI / 180.0f))
+#define DEG_TO_BINANG(degrees) TRUNCF_BINANG((degrees) * (0x8000 / 180.0f))
+#define DEG_TO_BINANG_ALT(degrees) TRUNCF_BINANG(((degrees) / 180.0f) * 0x8000)
+#define DEG_TO_BINANG_ALT2(degrees) TRUNCF_BINANG(((degrees) * 0x10000) / 360.0f)
+#define DEG_TO_BINANG_ALT3(degrees) ((degrees) * (0x8000 / 180.0f))
+
+#define RAD_TO_DEG(radians) ((radians) * (180.0f / M_PI))
+#define RAD_TO_BINANG(radians) TRUNCF_BINANG((radians) * (0x8000 / M_PI))
+#define RAD_TO_BINANG_ALT(radians) TRUNCF_BINANG(((radians) / M_PI) * 0x8000)
+#define RAD_TO_BINANG_ALT2(radians) TRUNCF_BINANG(((radians) * 0x8000) / M_PI)
+
+#define BINANG_TO_DEG(binang) ((f32)(binang) * (180.0f / 0x8000))
+#define BINANG_TO_RAD(binang) ((f32)(binang) * (M_PI / 0x8000))
+#define BINANG_TO_RAD_ALT(binang) (((f32)(binang) / 0x8000) * M_PI)
+#define BINANG_TO_RAD_ALT2(binang) (((f32)(binang) * M_PI) / 0x8000)
// Angle arithmetic macros
#define BINANG_ROT180(angle) ((s16)(angle + 0x8000))
@@ -133,4 +168,75 @@ typedef struct {
#define SQXYZ(vec) ((vec.x) * (vec.x) + (vec.y) * (vec.y) + (vec.z) * (vec.z))
#define DOTXYZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.y) * (vec2.y) + (vec1.z) * (vec2.z))
+f32 Math_CosS(s16 angle);
+f32 Math_SinS(s16 angle);
+s32 Math_StepToIImpl(s32 start, s32 target, s32 step);
+void Math_StepToIGet(s32* pValue, s32 target, s32 step);
+s32 Math_StepToI(s32* pValue, s32 target, s32 step);
+s32 Math_ScaledStepToS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToC(s8* pValue, s8 target, s8 step);
+s32 Math_StepToF(f32* pValue, f32 target, f32 step);
+s32 Math_StepUntilAngleS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToAngleS(s16* pValue, s16 target, s16 step);
+s32 Math_AsymStepToS(s16* pValue, s16 target, s16 incrStep, s16 decrStep);
+s32 Math_StepUntilF(f32* pValue, f32 limit, f32 step);
+s32 Math_AsymStepToF(f32* pValue, f32 target, f32 incrStep, f32 decrStep);
+s16 Rand_S16Offset(s16 base, s16 range);
+s16 Rand_S16OffsetStride(s16 base, s16 stride, s16 range);
+void Math_Vec3f_Copy(Vec3f* dest, Vec3f* src);
+void Math_Vec3s_Copy(Vec3s* dest, Vec3s* src);
+void Math_Vec3s_ToVec3f(Vec3f* dest, Vec3s* src);
+void Math_Vec3f_ToVec3s(Vec3s* dest, Vec3f* src);
+void Math_Vec3f_Sum(Vec3f* l, Vec3f* r, Vec3f* dest);
+void Math_Vec3f_Diff(Vec3f* l, Vec3f* r, Vec3f* dest);
+void Math_Vec3s_DiffToVec3f(Vec3f* dest, Vec3s* l, Vec3s* r);
+void Math_Vec3f_Scale(Vec3f* vec, f32 scale);
+void Math_Vec3f_ScaleAndStore(Vec3f* vec, f32 scale, Vec3f* dest);
+void Math_Vec3f_Lerp(Vec3f* a, Vec3f* b, f32 t, Vec3f* dest);
+void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
+void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest);
+void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
+f32 Math_Vec3f_DistXYZ(Vec3f* a, Vec3f* b);
+f32 Math_Vec3f_DistXYZAndStoreDiff(Vec3f* a, Vec3f* b, Vec3f* dest);
+f32 Math_Vec3f_DistXZ(Vec3f* a, Vec3f* b);
+f32 Math_Vec3f_DistXZAndStore(Vec3f* a, Vec3f* b, f32* dx, f32* dz);
+f32 Math_Vec3f_StepToXZ(Vec3f* start, Vec3f* target, f32 speed);
+f32 Math_Vec3f_DiffY(Vec3f* a, Vec3f* b);
+s16 Math_Vec3f_Yaw(Vec3f* a, Vec3f* b);
+s16 Math_Vec3f_Pitch(Vec3f* a, Vec3f* b);
+f32 Math_SmoothStepToF(f32* pValue, f32 target, f32 fraction, f32 step, f32 minStep);
+void Math_ApproachF(f32* pValue, f32 target, f32 scale, f32 maxStep);
+void Math_ApproachZeroF(f32* pValue, f32 scale, f32 maxStep);
+s16 Math_SmoothStepToS(s16* pValue, s16 target, s16 scale, s16 step, s16 minStep);
+void Math_ApproachS(s16* pValue, s16 target, s16 scale, s16 maxStep);
+f32 Math_Vec3f_StepTo(Vec3f* start, Vec3f* target, f32 speed);
+
+f32 Math_FactorialF(f32 n);
+f32 Math_Factorial(s32 n);
+f32 Math_PowF(f32 base, s32 exp);
+f32 Math_SinF(f32 rad);
+f32 Math_CosF(f32 rad);
+f32 Rand_ZeroFloat(f32 scale);
+f32 Rand_CenteredFloat(f32 scale);
+
+f32 Math_FTanF(f32 x);
+f32 Math_FFloorF(f32 x);
+f32 Math_FCeilF(f32 x);
+f32 Math_FRoundF(f32 x);
+f32 Math_FTruncF(f32 x);
+f32 Math_FNearbyIntF(f32 x);
+f32 Math_FAtanTaylorQF(f32 x);
+f32 Math_FAtanTaylorF(f32 x);
+f32 Math_FAtanContFracF(f32 x);
+f32 Math_FAtanF(f32 x);
+f32 Math_FAtan2F(f32 y, f32 x);
+f32 Math_FAsinF(f32 x);
+f32 Math_FAcosF(f32 x);
+
+s16 Math_Atan2S(f32 y, f32 x);
+f32 Math_Atan2F(f32 y, f32 x);
+s16 Math_Atan2S_XY(f32 x, f32 y);
+f32 Math_Atan2F_XY(f32 x, f32 y);
+
#endif
diff --git a/include/z64message.h b/include/z64message.h
index 2b0387045..09c9c4e04 100644
--- a/include/z64message.h
+++ b/include/z64message.h
@@ -9,6 +9,9 @@ struct Actor;
struct MessageTableEntry;
struct OcarinaStaff;
+extern u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX];
+extern u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX];
+
typedef enum TextState {
/* 0 */ TEXT_STATE_NONE,
/* 1 */ TEXT_STATE_1,
@@ -159,8 +162,8 @@ typedef struct MessageContext {
/* 0x120A0 */ s32 unk120A0;
/* 0x120A4 */ s16 unk120A4[6];
/* 0x120B0 */ u8 unk120B0;
- /* 0x120B1 */ u8 unk120B1;
- /* 0x120B2 */ u8 unk120B2[0xA];
+ /* 0x120B1 */ u8 bombersNotebookEventQueueCount;
+ /* 0x120B2 */ u8 bombersNotebookEventQueue[10];
/* 0x120BC */ u16 unk_120BC;
/* 0x120BE */ s16 unk120BE;
/* 0x120C0 */ s16 unk120C0;
diff --git a/include/z64player.h b/include/z64player.h
index 456eba3eb..f10984216 100644
--- a/include/z64player.h
+++ b/include/z64player.h
@@ -22,7 +22,8 @@ typedef enum PlayerBoots {
/* 4 */ PLAYER_BOOTS_ZORA_LAND,
/* 5 */ PLAYER_BOOTS_ZORA_UNDERWATER,
/* 6 */ PLAYER_BOOTS_GORON,
- /* 7 */ PLAYER_BOOTS_MAX
+ /* 7 */ PLAYER_BOOTS_7,
+ /* 8 */ PLAYER_BOOTS_MAX
} PlayerBoots;
typedef enum PlayerStrength {
@@ -42,35 +43,6 @@ typedef enum PlayerTransformation {
/* 5 */ PLAYER_FORM_MAX
} PlayerTransformation;
-typedef enum PlayerMask {
- /* 0x00 */ PLAYER_MASK_NONE,
- /* 0x01 */ PLAYER_MASK_TRUTH,
- /* 0x02 */ PLAYER_MASK_KAFEIS_MASK,
- /* 0x03 */ PLAYER_MASK_ALL_NIGHT,
- /* 0x04 */ PLAYER_MASK_BUNNY,
- /* 0x05 */ PLAYER_MASK_KEATON,
- /* 0x06 */ PLAYER_MASK_GARO,
- /* 0x07 */ PLAYER_MASK_ROMANI,
- /* 0x08 */ PLAYER_MASK_CIRCUS_LEADER,
- /* 0x09 */ PLAYER_MASK_POSTMAN,
- /* 0x0A */ PLAYER_MASK_COUPLE,
- /* 0x0B */ PLAYER_MASK_GREAT_FAIRY,
- /* 0x0C */ PLAYER_MASK_GIBDO,
- /* 0x0D */ PLAYER_MASK_DON_GERO,
- /* 0x0E */ PLAYER_MASK_KAMARO,
- /* 0x0F */ PLAYER_MASK_CAPTAIN,
- /* 0x10 */ PLAYER_MASK_STONE,
- /* 0x11 */ PLAYER_MASK_BREMEN,
- /* 0x12 */ PLAYER_MASK_BLAST,
- /* 0x13 */ PLAYER_MASK_SCENTS,
- /* 0x14 */ PLAYER_MASK_GIANT,
- /* 0x15 */ PLAYER_MASK_FIERCE_DEITY,
- /* 0x16 */ PLAYER_MASK_GORON,
- /* 0x17 */ PLAYER_MASK_ZORA,
- /* 0x18 */ PLAYER_MASK_DEKU,
- /* 0x19 */ PLAYER_MASK_MAX
-} PlayerMask;
-
typedef enum {
/* 0 */ PLAYER_ENV_HAZARD_NONE,
/* 1 */ PLAYER_ENV_HAZARD_HOTROOM,
@@ -84,10 +56,11 @@ typedef enum PlayerItemAction {
/* 0x00 */ PLAYER_IA_NONE,
/* 0x01 */ PLAYER_IA_LAST_USED,
/* 0x02 */ PLAYER_IA_FISHING_ROD,
- /* 0x03 */ PLAYER_IA_SWORD_KOKIRI,
+ /* 0x03 */ PLAYER_IA_SWORD_MIN,
+ /* 0x03 */ PLAYER_IA_SWORD_KOKIRI = PLAYER_IA_SWORD_MIN,
/* 0x04 */ PLAYER_IA_SWORD_RAZOR,
/* 0x05 */ PLAYER_IA_SWORD_GILDED,
- /* 0x06 */ PLAYER_IA_SWORD_GREAT_FAIRY,
+ /* 0x06 */ PLAYER_IA_SWORD_TWO_HANDED,
/* 0x07 */ PLAYER_IA_STICK,
/* 0x08 */ PLAYER_IA_ZORA_FINS,
/* 0x09 */ PLAYER_IA_BOW,
@@ -95,14 +68,16 @@ typedef enum PlayerItemAction {
/* 0x0B */ PLAYER_IA_BOW_ICE,
/* 0x0C */ PLAYER_IA_BOW_LIGHT,
/* 0x0D */ PLAYER_IA_HOOKSHOT,
- /* 0x0E */ PLAYER_IA_BOMB,
+ /* 0x0E */ PLAYER_IA_EXPLOSIVE_MIN,
+ /* 0x0E */ PLAYER_IA_BOMB = PLAYER_IA_EXPLOSIVE_MIN,
/* 0x0F */ PLAYER_IA_POWDER_KEG,
/* 0x10 */ PLAYER_IA_BOMBCHU,
/* 0x11 */ PLAYER_IA_11,
/* 0x12 */ PLAYER_IA_NUT,
/* 0x13 */ PLAYER_IA_PICTO_BOX,
/* 0x14 */ PLAYER_IA_OCARINA,
- /* 0x15 */ PLAYER_IA_BOTTLE,
+ /* 0x15 */ PLAYER_IA_BOTTLE_MIN,
+ /* 0x15 */ PLAYER_IA_BOTTLE_EMPTY = PLAYER_IA_BOTTLE_MIN,
/* 0x16 */ PLAYER_IA_BOTTLE_FISH,
/* 0x17 */ PLAYER_IA_BOTTLE_SPRING_WATER,
/* 0x18 */ PLAYER_IA_BOTTLE_HOT_SPRING_WATER,
@@ -139,7 +114,8 @@ typedef enum PlayerItemAction {
/* 0x37 */ PLAYER_IA_37,
/* 0x38 */ PLAYER_IA_38,
/* 0x39 */ PLAYER_IA_39,
- /* 0x3A */ PLAYER_IA_MASK_TRUTH,
+ /* 0x3A */ PLAYER_IA_MASK_MIN,
+ /* 0x3A */ PLAYER_IA_MASK_TRUTH = PLAYER_IA_MASK_MIN,
/* 0x3B */ PLAYER_IA_MASK_KAFEIS_MASK,
/* 0x3C */ PLAYER_IA_MASK_ALL_NIGHT,
/* 0x3D */ PLAYER_IA_MASK_BUNNY,
@@ -159,14 +135,126 @@ typedef enum PlayerItemAction {
/* 0x4B */ PLAYER_IA_MASK_BLAST,
/* 0x4C */ PLAYER_IA_MASK_SCENTS,
/* 0x4D */ PLAYER_IA_MASK_GIANT,
- /* 0x4E */ PLAYER_IA_MASK_FIERCE_DEITY,
+ /* 0x4E */ PLAYER_IA_MASK_TRANSFORMATION_MIN,
+ /* 0x4E */ PLAYER_IA_MASK_FIERCE_DEITY = PLAYER_IA_MASK_TRANSFORMATION_MIN,
/* 0x4F */ PLAYER_IA_MASK_GORON,
/* 0x50 */ PLAYER_IA_MASK_ZORA,
/* 0x51 */ PLAYER_IA_MASK_DEKU,
+ /* 0x51 */ PLAYER_IA_MASK_MAX = PLAYER_IA_MASK_DEKU,
/* 0x52 */ PLAYER_IA_LENS,
/* 0x53 */ PLAYER_IA_MAX
} PlayerItemAction;
+// Relies on B swords related item actions to be contiguous
+#define GET_B_SWORD_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_SWORD_MIN + 1)
+
+typedef enum PlayerBButtonSword {
+ /* 0 */ PLAYER_B_SWORD_NONE,
+ /* 1 */ PLAYER_B_SWORD_KOKIRI = GET_B_SWORD_FROM_IA(PLAYER_IA_SWORD_KOKIRI),
+ /* 2 */ PLAYER_B_SWORD_RAZOR = GET_B_SWORD_FROM_IA(PLAYER_IA_SWORD_RAZOR),
+ /* 3 */ PLAYER_B_SWORD_GILDED = GET_B_SWORD_FROM_IA(PLAYER_IA_SWORD_GILDED),
+ /* 4 */ PLAYER_B_SWORD_MAX
+} PlayerBButtonSword;
+
+// Relies on melee weapon related item actions to be contiguous
+#define GET_MELEE_WEAPON_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_SWORD_MIN + 1)
+
+typedef enum PlayerMeleeWeapon {
+ /* 0 */ PLAYER_MELEEWEAPON_NONE,
+ /* 1 */ PLAYER_MELEEWEAPON_SWORD_KOKIRI = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_KOKIRI),
+ /* 2 */ PLAYER_MELEEWEAPON_SWORD_RAZOR = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_RAZOR),
+ /* 3 */ PLAYER_MELEEWEAPON_SWORD_GILDED = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_GILDED),
+ /* 4 */ PLAYER_MELEEWEAPON_SWORD_TWO_HANDED = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_SWORD_TWO_HANDED),
+ /* 5 */ PLAYER_MELEEWEAPON_STICK = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_STICK),
+ /* 6 */ PLAYER_MELEEWEAPON_ZORA_FINS = GET_MELEE_WEAPON_FROM_IA(PLAYER_IA_ZORA_FINS),
+ /* 7 */ PLAYER_MELEEWEAPON_MAX
+} PlayerMeleeWeapon;
+
+// Relies on mask item actions to be contiguous
+#define GET_MASK_FROM_IA(itemAction) ((itemAction) - (PLAYER_IA_MASK_MIN - 1))
+#define GET_IA_FROM_MASK(mask) ((mask) + (PLAYER_IA_MASK_MIN - 1))
+
+typedef enum PlayerMask {
+ /* 0x00 */ PLAYER_MASK_NONE,
+ /* 0x01 */ PLAYER_MASK_TRUTH = GET_MASK_FROM_IA(PLAYER_IA_MASK_TRUTH),
+ /* 0x02 */ PLAYER_MASK_KAFEIS_MASK = GET_MASK_FROM_IA(PLAYER_IA_MASK_KAFEIS_MASK),
+ /* 0x03 */ PLAYER_MASK_ALL_NIGHT = GET_MASK_FROM_IA(PLAYER_IA_MASK_ALL_NIGHT),
+ /* 0x04 */ PLAYER_MASK_BUNNY = GET_MASK_FROM_IA(PLAYER_IA_MASK_BUNNY),
+ /* 0x05 */ PLAYER_MASK_KEATON = GET_MASK_FROM_IA(PLAYER_IA_MASK_KEATON),
+ /* 0x06 */ PLAYER_MASK_GARO = GET_MASK_FROM_IA(PLAYER_IA_MASK_GARO),
+ /* 0x07 */ PLAYER_MASK_ROMANI = GET_MASK_FROM_IA(PLAYER_IA_MASK_ROMANI),
+ /* 0x08 */ PLAYER_MASK_CIRCUS_LEADER = GET_MASK_FROM_IA(PLAYER_IA_MASK_CIRCUS_LEADER),
+ /* 0x09 */ PLAYER_MASK_POSTMAN = GET_MASK_FROM_IA(PLAYER_IA_MASK_POSTMAN),
+ /* 0x0A */ PLAYER_MASK_COUPLE = GET_MASK_FROM_IA(PLAYER_IA_MASK_COUPLE),
+ /* 0x0B */ PLAYER_MASK_GREAT_FAIRY = GET_MASK_FROM_IA(PLAYER_IA_MASK_GREAT_FAIRY),
+ /* 0x0C */ PLAYER_MASK_GIBDO = GET_MASK_FROM_IA(PLAYER_IA_MASK_GIBDO),
+ /* 0x0D */ PLAYER_MASK_DON_GERO = GET_MASK_FROM_IA(PLAYER_IA_MASK_DON_GERO),
+ /* 0x0E */ PLAYER_MASK_KAMARO = GET_MASK_FROM_IA(PLAYER_IA_MASK_KAMARO),
+ /* 0x0F */ PLAYER_MASK_CAPTAIN = GET_MASK_FROM_IA(PLAYER_IA_MASK_CAPTAIN),
+ /* 0x10 */ PLAYER_MASK_STONE = GET_MASK_FROM_IA(PLAYER_IA_MASK_STONE),
+ /* 0x11 */ PLAYER_MASK_BREMEN = GET_MASK_FROM_IA(PLAYER_IA_MASK_BREMEN),
+ /* 0x12 */ PLAYER_MASK_BLAST = GET_MASK_FROM_IA(PLAYER_IA_MASK_BLAST),
+ /* 0x13 */ PLAYER_MASK_SCENTS = GET_MASK_FROM_IA(PLAYER_IA_MASK_SCENTS),
+ /* 0x14 */ PLAYER_MASK_GIANT = GET_MASK_FROM_IA(PLAYER_IA_MASK_GIANT),
+ /* 0x15 */ PLAYER_MASK_FIERCE_DEITY = GET_MASK_FROM_IA(PLAYER_IA_MASK_FIERCE_DEITY),
+ /* 0x16 */ PLAYER_MASK_GORON = GET_MASK_FROM_IA(PLAYER_IA_MASK_GORON),
+ /* 0x17 */ PLAYER_MASK_ZORA = GET_MASK_FROM_IA(PLAYER_IA_MASK_ZORA),
+ /* 0x18 */ PLAYER_MASK_DEKU = GET_MASK_FROM_IA(PLAYER_IA_MASK_DEKU),
+ /* 0x19 */ PLAYER_MASK_MAX
+} PlayerMask;
+
+// Relies on bottle-related item actions to be contiguous
+#define GET_BOTTLE_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_BOTTLE_MIN)
+
+typedef enum PlayerBottle {
+ /* -1 */ PLAYER_BOTTLE_NONE = -1,
+ /* 0 */ PLAYER_BOTTLE_EMPTY = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_EMPTY),
+ /* 1 */ PLAYER_BOTTLE_FISH = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_FISH),
+ /* 2 */ PLAYER_BOTTLE_SPRING_WATER = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_SPRING_WATER),
+ /* 3 */ PLAYER_BOTTLE_HOT_SPRING_WATER = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_HOT_SPRING_WATER),
+ /* 4 */ PLAYER_BOTTLE_ZORA_EGG = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_ZORA_EGG),
+ /* 5 */ PLAYER_BOTTLE_DEKU_PRINCESS = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_DEKU_PRINCESS),
+ /* 6 */ PLAYER_BOTTLE_GOLD_DUST = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_GOLD_DUST),
+ /* 7 */ PLAYER_BOTTLE_1C = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_1C),
+ /* 8 */ PLAYER_BOTTLE_SEAHORSE = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_SEAHORSE),
+ /* 9 */ PLAYER_BOTTLE_MUSHROOM = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_MUSHROOM),
+ /* 10 */ PLAYER_BOTTLE_HYLIAN_LOACH = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_HYLIAN_LOACH),
+ /* 11 */ PLAYER_BOTTLE_BUG = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_BUG),
+ /* 12 */ PLAYER_BOTTLE_POE = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_POE),
+ /* 13 */ PLAYER_BOTTLE_BIG_POE = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_BIG_POE),
+ /* 14 */ PLAYER_BOTTLE_POTION_RED = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_POTION_RED),
+ /* 15 */ PLAYER_BOTTLE_POTION_BLUE = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_POTION_BLUE),
+ /* 16 */ PLAYER_BOTTLE_POTION_GREEN = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_POTION_GREEN),
+ /* 17 */ PLAYER_BOTTLE_MILK = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_MILK),
+ /* 18 */ PLAYER_BOTTLE_MILK_HALF = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_MILK_HALF),
+ /* 19 */ PLAYER_BOTTLE_CHATEAU = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_CHATEAU),
+ /* 20 */ PLAYER_BOTTLE_FAIRY = GET_BOTTLE_FROM_IA(PLAYER_IA_BOTTLE_FAIRY),
+ /* 21 */ PLAYER_BOTTLE_MAX
+} PlayerBottle;
+
+// Relies on explosive-related item actions to be contiguous
+#define GET_EXPLOSIVE_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_EXPLOSIVE_MIN)
+
+typedef enum PlayerExplosive {
+ /* -1 */ PLAYER_EXPLOSIVE_NONE = -1,
+ /* 0 */ PLAYER_EXPLOSIVE_BOMB = GET_EXPLOSIVE_FROM_IA(PLAYER_IA_BOMB),
+ /* 1 */ PLAYER_EXPLOSIVE_POWDER_KEG = GET_EXPLOSIVE_FROM_IA(PLAYER_IA_POWDER_KEG),
+ /* 2 */ PLAYER_EXPLOSIVE_BOMBCHU = GET_EXPLOSIVE_FROM_IA(PLAYER_IA_BOMBCHU),
+ /* 3 */ PLAYER_EXPLOSIVE_MAX
+} PlayerExplosive;
+
+// Relies on sword item actions to be contiguous
+#define GET_SWORD_FROM_IA(itemAction) ((itemAction) - PLAYER_IA_SWORD_MIN)
+
+typedef enum PlayerSword {
+ /* -1 */ PLAYER_SWORD_NONE = -1,
+ /* 0 */ PLAYER_SWORD_KOKIRI = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_KOKIRI),
+ /* 1 */ PLAYER_SWORD_RAZOR = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_RAZOR),
+ /* 2 */ PLAYER_SWORD_GILDED = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_GILDED),
+ /* 3 */ PLAYER_SWORD_TWO_HANDED = GET_SWORD_FROM_IA(PLAYER_IA_SWORD_TWO_HANDED),
+ /* 4 */ PLAYER_SWORD_MAX
+} PlayerSword;
+
typedef enum PlayerMeleeWeaponAnimation {
/* 0 */ PLAYER_MWA_FORWARD_SLASH_1H, // Vertical one-handed slash
/* 1 */ PLAYER_MWA_FORWARD_SLASH_2H, // Vertical two-handed slash
@@ -206,6 +294,12 @@ typedef enum PlayerMeleeWeaponAnimation {
/* 34 */ PLAYER_MWA_MAX
} PlayerMeleeWeaponAnimation;
+typedef enum PlayerMeleeWeaponState {
+ /* -1 */ PLAYER_MELEE_WEAPON_STATE_MINUS_1 = -1,
+ /* 0 */ PLAYER_MELEE_WEAPON_STATE_0,
+ /* 1 */ PLAYER_MELEE_WEAPON_STATE_1
+} PlayerMeleeWeaponState;
+
typedef enum PlayerDoorType {
/* -1 */ PLAYER_DOORTYPE_TALKING = -1, // Displays a message instead of opening
/* 0 */ PLAYER_DOORTYPE_NONE,
@@ -217,39 +311,88 @@ typedef enum PlayerDoorType {
} PlayerDoorType;
typedef enum PlayerAnimType {
- /* 0 */ PLAYER_ANIMTYPE_0,
+ /* 0 */ PLAYER_ANIMTYPE_DEFAULT, // DEFAULT
/* 1 */ PLAYER_ANIMTYPE_1,
- /* 2 */ PLAYER_ANIMTYPE_2,
- /* 3 */ PLAYER_ANIMTYPE_3,
+ /* 2 */ PLAYER_ANIMTYPE_2, // Shield but no sword?
+ /* 3 */ PLAYER_ANIMTYPE_3, // Two hand weapon
/* 4 */ PLAYER_ANIMTYPE_4,
/* 5 */ PLAYER_ANIMTYPE_5,
/* 6 */ PLAYER_ANIMTYPE_MAX
} PlayerAnimType;
+typedef enum PlayerAnimGroup {
+ /* 0 */ PLAYER_ANIMGROUP_0, // STANDING_IDLE
+ /* 1 */ PLAYER_ANIMGROUP_1, // WALKING
+ /* 2 */ PLAYER_ANIMGROUP_2, // RUNNING
+ /* 3 */ PLAYER_ANIMGROUP_3,
+ /* 4 */ PLAYER_ANIMGROUP_4,
+ /* 5 */ PLAYER_ANIMGROUP_5, // Z-Targeting ?
+ /* 6 */ PLAYER_ANIMGROUP_6, // Start or finishing some animation
+ /* 7 */ PLAYER_ANIMGROUP_7, // DRAW_MELEE_WEAPON
+ /* 8 */ PLAYER_ANIMGROUP_8, // OPEN_DOOR_LEFT_FIERCE_DEITY
+ /* 9 */ PLAYER_ANIMGROUP_9, // OPEN_DOOR_LEFT_HUMAN
+ /* 10 */ PLAYER_ANIMGROUP_10, // OPEN_DOOR_RIGHT_FIERCE_DEITY
+ /* 11 */ PLAYER_ANIMGROUP_11, // OPEN_DOOR_RIGHT_HUMAN
+ /* 12 */ PLAYER_ANIMGROUP_12, // GRABBING
+ /* 13 */ PLAYER_ANIMGROUP_13, // FALLING/LANDING?
+ /* 14 */ PLAYER_ANIMGROUP_14, // landing from short distances?
+ /* 15 */ PLAYER_ANIMGROUP_15, // ROLLING
+ /* 16 */ PLAYER_ANIMGROUP_16, // BONK/BONKING
+ /* 17 */ PLAYER_ANIMGROUP_17,
+ /* 18 */ PLAYER_ANIMGROUP_18,
+ /* 19 */ PLAYER_ANIMGROUP_19, // START_SHIELDING
+ /* 20 */ PLAYER_ANIMGROUP_20, // SHIELDING
+ /* 21 */ PLAYER_ANIMGROUP_21, // STOP_SHIELDING/END_SHIELDING
+ /* 22 */ PLAYER_ANIMGROUP_22, // SLOW_SIDE_WALK?
+ /* 23 */ PLAYER_ANIMGROUP_23, // SIDE_WALK
+ /* 24 */ PLAYER_ANIMGROUP_24, // SIDE_WALK_RIGHT
+ /* 25 */ PLAYER_ANIMGROUP_25,
+ /* 26 */ PLAYER_ANIMGROUP_26,
+ /* 27 */ PLAYER_ANIMGROUP_27,
+ /* 28 */ PLAYER_ANIMGROUP_28, // THROWING
+ /* 29 */ PLAYER_ANIMGROUP_29, // PUT_DOWN_OBJECT?
+ /* 30 */ PLAYER_ANIMGROUP_30, // back walking slow?
+ /* 31 */ PLAYER_ANIMGROUP_31,
+ /* 32 */ PLAYER_ANIMGROUP_32,
+ /* 33 */ PLAYER_ANIMGROUP_33,
+ /* 34 */ PLAYER_ANIMGROUP_34, // PULLING_START
+ /* 35 */ PLAYER_ANIMGROUP_35, // PULLING
+ /* 36 */ PLAYER_ANIMGROUP_36, // PULLING_END
+ /* 37 */ PLAYER_ANIMGROUP_37, // climbing from a ledge?
+ /* 38 */ PLAYER_ANIMGROUP_38, // ledge
+ /* 39 */ PLAYER_ANIMGROUP_39, // ledge
+ /* 40 */ PLAYER_ANIMGROUP_40, // climbing from a ledge
+ /* 41 */ PLAYER_ANIMGROUP_41,
+ /* 42 */ PLAYER_ANIMGROUP_42,
+ /* 43 */ PLAYER_ANIMGROUP_43,
+ /* 44 */ PLAYER_ANIMGROUP_MAX
+} PlayerAnimGroup;
+
typedef enum PlayerModelType {
// left hand
- /* 0 */ PLAYER_MODELTYPE_LH_OPEN,
- /* 1 */ PLAYER_MODELTYPE_LH_CLOSED,
- /* 2 */ PLAYER_MODELTYPE_LH_ONE_HAND_SWORD,
- /* 3 */ PLAYER_MODELTYPE_LH_TWO_HAND_SWORD,
- /* 4 */ PLAYER_MODELTYPE_LH_4,
- /* 5 */ PLAYER_MODELTYPE_LH_BOTTLE,
+ /* 0 */ PLAYER_MODELTYPE_LH_OPEN,
+ /* 1 */ PLAYER_MODELTYPE_LH_CLOSED,
+ /* 2 */ PLAYER_MODELTYPE_LH_ONE_HAND_SWORD,
+ /* 3 */ PLAYER_MODELTYPE_LH_TWO_HAND_SWORD,
+ /* 4 */ PLAYER_MODELTYPE_LH_4,
+ /* 5 */ PLAYER_MODELTYPE_LH_BOTTLE,
// right hand
- /* 6 */ PLAYER_MODELTYPE_RH_OPEN,
- /* 7 */ PLAYER_MODELTYPE_RH_CLOSED,
- /* 8 */ PLAYER_MODELTYPE_RH_SHIELD,
- /* 9 */ PLAYER_MODELTYPE_RH_BOW,
- /* 10 */ PLAYER_MODELTYPE_RH_INSTRUMENT,
- /* 11 */ PLAYER_MODELTYPE_RH_HOOKSHOT,
+ /* 6 */ PLAYER_MODELTYPE_RH_OPEN,
+ /* 7 */ PLAYER_MODELTYPE_RH_CLOSED,
+ /* 8 */ PLAYER_MODELTYPE_RH_SHIELD,
+ /* 9 */ PLAYER_MODELTYPE_RH_BOW,
+ /* 10 */ PLAYER_MODELTYPE_RH_INSTRUMENT,
+ /* 11 */ PLAYER_MODELTYPE_RH_HOOKSHOT,
// sheath
- /* 12 */ PLAYER_MODELTYPE_SHEATH_12,
- /* 13 */ PLAYER_MODELTYPE_SHEATH_13,
- /* 14 */ PLAYER_MODELTYPE_SHEATH_14,
- /* 15 */ PLAYER_MODELTYPE_SHEATH_15,
+ /* 12 */ PLAYER_MODELTYPE_SHEATH_12,
+ /* 13 */ PLAYER_MODELTYPE_SHEATH_13,
+ /* 14 */ PLAYER_MODELTYPE_SHEATH_14,
+ /* 15 */ PLAYER_MODELTYPE_SHEATH_15,
// waist
- /* 16 */ PLAYER_MODELTYPE_WAIST,
- /* 17 */ PLAYER_MODELTYPE_17, // NULL?
- /* 18 */ PLAYER_MODELTYPE_MAX
+ /* 16 */ PLAYER_MODELTYPE_WAIST,
+ /* 17 */ PLAYER_MODELTYPE_17, // NULL?
+ /* 18 */ PLAYER_MODELTYPE_MAX,
+ /* 255 */ PLAYER_MODELTYPE_RH_FF = 0xFF // disable shield collider, cutscene-specific
} PlayerModelType;
typedef struct PlayerModelIndices {
@@ -368,27 +511,35 @@ typedef enum PlayerBodyPart {
typedef struct PlayerAnimationFrame {
/* 0x000 */ Vec3s frameTable[PLAYER_LIMB_MAX];
- /* 0x108 */ s16 faceInfo;
+ /* 0x108 */ s16 appearanceInfo; // bitpack containing the face and hands info
} PlayerAnimationFrame; // size = 0x10A
#define PLAYER_LIMB_BUF_SIZE (ALIGN16(sizeof(PlayerAnimationFrame)) + 0xF)
+#define GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) (((PlayerAnimationFrame *)(jointTable))->appearanceInfo)
+#define GET_EYE_INDEX_FROM_JOINT_TABLE(jointTable) ((GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) & 0xF) - 1)
+#define GET_MOUTH_INDEX_FROM_JOINT_TABLE(jointTable) (((GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) >> 4) & 0xF) - 1)
+
+// Note the returned value from this macro needs to be shifted
+#define GET_LEFT_HAND_INDEX_FROM_JOINT_TABLE(jointTable) (GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) & 0xF000)
+#define GET_RIGHT_HAND_INDEX_FROM_JOINT_TABLE(jointTable) (GET_APPEARANCE_FROM_JOINT_TABLE(jointTable) & 0x0F00)
+
typedef struct PlayerAgeProperties {
- /* 0x00 */ f32 unk_00; // ceilingCheckHeight?
+ /* 0x00 */ f32 unk_00; // ceilingCheckHeight
/* 0x04 */ f32 shadowScale;
/* 0x08 */ f32 unk_08;
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
- /* 0x14 */ f32 unk_14;
- /* 0x18 */ f32 unk_18;
- /* 0x1C */ f32 unk_1C;
- /* 0x20 */ f32 unk_20;
- /* 0x24 */ f32 unk_24;
- /* 0x28 */ f32 unk_28;
- /* 0x2C */ f32 unk_2C;
- /* 0x30 */ f32 unk_30;
+ /* 0x14 */ f32 unk_14; // compared to wallHeight
+ /* 0x18 */ f32 unk_18; // compared to wallHeight
+ /* 0x1C */ f32 unk_1C; // compared to wallHeight
+ /* 0x20 */ f32 unk_20; // unused?
+ /* 0x24 */ f32 unk_24; // water stuff // depthInWater
+ /* 0x28 */ f32 unk_28; // water stuff // depthInWater
+ /* 0x2C */ f32 unk_2C; // water stuff // depthInWater
+ /* 0x30 */ f32 unk_30; // water stuff // depthInWater
/* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38; // wallCheckHeight?
+ /* 0x38 */ f32 unk_38; // wallCheckHeight
/* 0x3C */ f32 unk_3C;
/* 0x40 */ f32 unk_40;
/* 0x44 */ Vec3s unk_44;
@@ -399,15 +550,15 @@ typedef struct PlayerAgeProperties {
/* 0x94 */ u16 surfaceSfxIdOffset;
/* 0x98 */ f32 unk_98;
/* 0x9C */ f32 unk_9C;
- /* 0xA0 */ LinkAnimationHeader* unk_A0;
- /* 0xA4 */ LinkAnimationHeader* unk_A4;
- /* 0xA8 */ LinkAnimationHeader* unk_A8;
- /* 0xAC */ LinkAnimationHeader* unk_AC;
- /* 0xB0 */ LinkAnimationHeader* unk_B0;
- /* 0xB4 */ LinkAnimationHeader* unk_B4[4];
- /* 0xC4 */ LinkAnimationHeader* unk_C4[2];
- /* 0xCC */ LinkAnimationHeader* unk_CC[2];
- /* 0xD4 */ LinkAnimationHeader* unk_D4[2];
+ /* 0xA0 */ PlayerAnimationHeader* openChestAnim;
+ /* 0xA4 */ PlayerAnimationHeader* unk_A4; // OoT leftovers to interact with the Master Sword
+ /* 0xA8 */ PlayerAnimationHeader* unk_A8; // OoT leftovers to interact with the Master Sword
+ /* 0xAC */ PlayerAnimationHeader* unk_AC;
+ /* 0xB0 */ PlayerAnimationHeader* unk_B0;
+ /* 0xB4 */ PlayerAnimationHeader* unk_B4[4];
+ /* 0xC4 */ PlayerAnimationHeader* unk_C4[2];
+ /* 0xCC */ PlayerAnimationHeader* unk_CC[2];
+ /* 0xD4 */ PlayerAnimationHeader* unk_D4[2];
} PlayerAgeProperties; // size = 0xDC
typedef struct {
@@ -445,8 +596,8 @@ typedef enum PlayerCsMode {
/* 0x03 */ PLAYER_CSMODE_3,
/* 0x04 */ PLAYER_CSMODE_4,
/* 0x05 */ PLAYER_CSMODE_5,
- /* 0x06 */ PLAYER_CSMODE_6,
- /* 0x07 */ PLAYER_CSMODE_7,
+ /* 0x06 */ PLAYER_CSMODE_END,
+ /* 0x07 */ PLAYER_CSMODE_WAIT,
/* 0x08 */ PLAYER_CSMODE_8,
/* 0x09 */ PLAYER_CSMODE_9,
/* 0x0A */ PLAYER_CSMODE_10,
@@ -457,7 +608,7 @@ typedef enum PlayerCsMode {
/* 0x0F */ PLAYER_CSMODE_15,
/* 0x10 */ PLAYER_CSMODE_16,
/* 0x11 */ PLAYER_CSMODE_17,
- /* 0x12 */ PLAYER_CSMODE_18,
+ /* 0x12 */ PLAYER_CSMODE_18, // Strangled by Wallmaster
/* 0x13 */ PLAYER_CSMODE_19,
/* 0x14 */ PLAYER_CSMODE_20,
/* 0x15 */ PLAYER_CSMODE_21,
@@ -465,7 +616,7 @@ typedef enum PlayerCsMode {
/* 0x17 */ PLAYER_CSMODE_23,
/* 0x18 */ PLAYER_CSMODE_24,
/* 0x19 */ PLAYER_CSMODE_25,
- /* 0x1A */ PLAYER_CSMODE_26,
+ /* 0x1A */ PLAYER_CSMODE_26, // Halt!
/* 0x1B */ PLAYER_CSMODE_27,
/* 0x1C */ PLAYER_CSMODE_28,
/* 0x1D */ PLAYER_CSMODE_29,
@@ -523,7 +674,7 @@ typedef enum PlayerCsMode {
/* 0x51 */ PLAYER_CSMODE_81,
/* 0x52 */ PLAYER_CSMODE_82,
/* 0x53 */ PLAYER_CSMODE_83,
- /* 0x54 */ PLAYER_CSMODE_84,
+ /* 0x54 */ PLAYER_CSMODE_84, // Sucked by the moon
/* 0x55 */ PLAYER_CSMODE_85,
/* 0x56 */ PLAYER_CSMODE_86,
/* 0x57 */ PLAYER_CSMODE_87,
@@ -587,7 +738,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_1 (1 << 0)
//
#define PLAYER_STATE1_2 (1 << 1)
-//
+// Climbing ledge
#define PLAYER_STATE1_4 (1 << 2)
//
#define PLAYER_STATE1_8 (1 << 3)
@@ -607,7 +758,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_400 (1 << 10)
//
#define PLAYER_STATE1_800 (1 << 11)
-//
+// charging spin attack
#define PLAYER_STATE1_1000 (1 << 12)
//
#define PLAYER_STATE1_2000 (1 << 13)
@@ -641,7 +792,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE1_8000000 (1 << 27)
//
#define PLAYER_STATE1_10000000 (1 << 28)
-//
+// Time is stopped but Link & NPC animations continue
#define PLAYER_STATE1_20000000 (1 << 29)
//
#define PLAYER_STATE1_40000000 (1 << 30)
@@ -671,7 +822,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE2_200 (1 << 9)
//
#define PLAYER_STATE2_400 (1 << 10)
-//
+// Diving
#define PLAYER_STATE2_800 (1 << 11)
//
#define PLAYER_STATE2_1000 (1 << 12)
@@ -683,7 +834,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE2_8000 (1 << 15)
//
#define PLAYER_STATE2_10000 (1 << 16)
-//
+// A non-magic spin attack
#define PLAYER_STATE2_20000 (1 << 17)
//
#define PLAYER_STATE2_40000 (1 << 18)
@@ -731,7 +882,7 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE3_40 (1 << 6)
//
#define PLAYER_STATE3_80 (1 << 7)
-// Related to form Deku
+// Deku flower dive
#define PLAYER_STATE3_100 (1 << 8)
//
#define PLAYER_STATE3_200 (1 << 9)
@@ -777,10 +928,11 @@ typedef enum PlayerCsMode {
#define PLAYER_STATE3_20000000 (1 << 29)
//
#define PLAYER_STATE3_40000000 (1 << 30)
-//
+// TARGETING_HOSTILE?
#define PLAYER_STATE3_80000000 (1 << 31)
+#define PLAYER_GET_BG_CAM_INDEX(thisx) ((thisx)->params & 0xFF)
#define PLAYER_GET_INITMODE(thisx) (((thisx)->params & 0xF00) >> 8)
typedef enum PlayerInitMode {
@@ -804,6 +956,15 @@ typedef enum PlayerInitMode {
#define PLAYER_PARAMS(startBgCamIndex, initMode) ((startBgCamIndex & 0xFF) | ((initMode & 0xF) << 8))
+typedef enum PlayerUnkAA5 {
+ /* 0 */ PLAYER_UNKAA5_0,
+ /* 1 */ PLAYER_UNKAA5_1,
+ /* 2 */ PLAYER_UNKAA5_2,
+ /* 3 */ PLAYER_UNKAA5_3,
+ /* 4 */ PLAYER_UNKAA5_4,
+ /* 5 */ PLAYER_UNKAA5_5
+} PlayerUnkAA5;
+
typedef void (*PlayerActionFunc)(struct Player* this, struct PlayState* play);
typedef s32 (*PlayerFuncAC4)(struct Player* this, struct PlayState* play);
typedef void (*PlayerFuncD58)(struct PlayState* play, struct Player* this);
@@ -827,31 +988,13 @@ typedef struct Player {
/* 0x151 */ u8 rightHandType;
/* 0x152 */ u8 sheathType;
/* 0x153 */ u8 currentMask; // PlayerMask enum
- /* 0x154 */ s8 unk_154;
+ /* 0x154 */ s8 unk_154; // EquipSlot enum // Last pressed equip slot?
/* 0x155 */ u8 prevMask;
/* 0x158 */ Gfx** rightHandDLists;
/* 0x15C */ Gfx** leftHandDLists;
/* 0x160 */ Gfx** sheathDLists;
/* 0x164 */ Gfx** waistDLists;
- /* 0x168 */ f32 unk_168;
- /* 0x16C */ f32 unk_16C;
- /* 0x170 */ f32 unk_170;
- /* 0x174 */ f32 unk_174;
- /* 0x178 */ f32 unk_178;
- /* 0x17C */ f32 unk_17C;
- /* 0x180 */ f32 unk_180;
- /* 0x184 */ f32 unk_184;
- /* 0x188 */ f32 unk_188;
- /* 0x18C */ f32 unk_18C;
- /* 0x190 */ f32 unk_190;
- /* 0x194 */ f32 unk_194;
- /* 0x198 */ f32 unk_198;
- /* 0x19C */ f32 unk_19C;
- /* 0x1A0 */ f32 unk_1A0;
- /* 0x1A4 */ f32 unk_1A4;
- /* 0x1A8 */ f32 unk_1A8;
- /* 0x1AC */ f32 unk_1AC;
- /* 0x1B0 */ f32 unk_1B0;
+ /* 0x168 */ UNK_TYPE1 unk_168[0x4C];
/* 0x1B4 */ s16 unk_1B4;
/* 0x1B6 */ char unk_1B6[2];
/* 0x1B8 */ u8 giObjectLoading;
@@ -870,8 +1013,7 @@ typedef struct Player {
/* 0x2C8 */ SkelAnime unk_2C8;
/* 0x30C */ Vec3s jointTable[5];
/* 0x32A */ Vec3s morphTable[5];
- /* 0x348 */ s16 eyeTexId;
- /* 0x34A */ s16 eyeAnimTimer;
+ /* 0x348 */ BlinkInfo blinkInfo;
/* 0x34C */ Actor* heldActor;
/* 0x350 */ PosRot leftHandWorld;
/* 0x364 */ Actor* rightHandActor;
@@ -890,12 +1032,12 @@ typedef struct Player {
/* 0x395 */ u8 prevCsMode; // PlayerCsMode enum
/* 0x396 */ u8 unk_396; // currentActorActionId?
/* 0x397 */ u8 unk_397; // PlayerDoorType enum
- /* 0x398 */ Actor* unk_398;
+ /* 0x398 */ Actor* unk_398; // csActor?
/* 0x39C */ UNK_TYPE1 unk_39C[0x4];
/* 0x3A0 */ Vec3f unk_3A0;
/* 0x3AC */ Vec3f unk_3AC;
/* 0x3B8 */ u16 unk_3B8;
- /* 0x3BA */ s16 unk_3BA;
+ /* 0x3BA */ s16 doorBgCamIndex;
/* 0x3BC */ s16 subCamId;
/* 0x3BE */ char unk_3BE[2];
/* 0x3C0 */ Vec3f unk_3C0;
@@ -928,7 +1070,7 @@ typedef struct Player {
/* 0xA7C */ Actor* boomerangActor;
/* 0xA80 */ Actor* tatlActor;
/* 0xA84 */ s16 tatlTextId;
- /* 0xA86 */ s8 unk_A86; // actorCutsceneIndex?
+ /* 0xA86 */ s8 csId;
/* 0xA87 */ s8 exchangeItemId; // PlayerItemAction enum
/* 0xA88 */ Actor* talkActor;
/* 0xA8C */ f32 talkActorDistance;
@@ -938,12 +1080,12 @@ typedef struct Player {
/* 0xA9C */ f32 secretRumbleCharge; // builds per frame until discharges with a rumble request
/* 0xAA0 */ f32 closestSecretDistSq; // Used to augment `secretRumbleCharge`. Cleared every frame
/* 0xAA4 */ s8 unk_AA4;
- /* 0xAA5 */ u8 unk_AA5;
+ /* 0xAA5 */ u8 unk_AA5; // PlayerUnkAA5 enum
/* 0xAA6 */ u16 unk_AA6; // flags of some kind
/* 0xAA8 */ s16 unk_AA8;
/* 0xAAA */ s16 unk_AAA;
- /* 0xAAC */ Vec3s unk_AAC;
- /* 0xAB2 */ Vec3s unk_AB2;
+ /* 0xAAC */ Vec3s headLimbRot;
+ /* 0xAB2 */ Vec3s upperLimbRot;
/* 0xAB8 */ f32 unk_AB8;
/* 0xABC */ f32 unk_ABC;
/* 0xAC0 */ f32 unk_AC0;
@@ -959,18 +1101,22 @@ typedef struct Player {
/* 0xADA */ s8 meleeWeaponAnimation;
/* 0xADB */ s8 meleeWeaponState;
/* 0xADC */ s8 unk_ADC;
- /* 0xADD */ s8 unk_ADD;
+ /* 0xADD */ s8 unk_ADD; // Some sort of combo counter
/* 0xADE */ u8 unk_ADE;
/* 0xADF */ s8 unk_ADF[4]; // Circular buffer used for testing for triggering a quickspin
/* 0xAE3 */ s8 unk_AE3[4]; // Circular buffer used for ?
- /* 0xAE7 */ s8 unk_AE7; // a timer
+ /* 0xAE7 */ s8 unk_AE7; // a timer, used as an index for multiple kinds of animations too, room index?, etc
/* 0xAE8 */ s16 unk_AE8; // multipurpose timer
/* 0xAEC */ f32 unk_AEC;
- /* 0xAF0 */ Vec3f unk_AF0[2];
- /* 0xB08 */ f32 unk_B08[2]; // TODO: Investigate if this member actually is an array
+ /* 0xAF0 */ union {
+ Vec3f unk_AF0[2];
+ f32 arr_AF0[6];
+ };
+ /* 0xB08 */ f32 unk_B08;
+ /* 0xB0C */ f32 unk_B0C;
/* 0xB10 */ f32 unk_B10[6];
- /* 0xB28 */ s16 unk_B28; //Burning stick timer?
- /* 0xB2A */ s8 getItemDrawId;
+ /* 0xB28 */ s16 unk_B28; // Burning stick timer?
+ /* 0xB2A */ s8 getItemDrawIdPlusOne;
/* 0xB2B */ s8 unk_B2B;
/* 0xB2C */ f32 windSpeed;
/* 0xB30 */ s16 windAngleX;
@@ -995,7 +1141,7 @@ typedef struct Player {
/* 0xB64 */ u8 unk_B64;
/* 0xB65 */ u8 shockTimer;
/* 0xB66 */ u8 unk_B66;
- /* 0xB67 */ u8 unk_B67; // deku remaining hops counter
+ /* 0xB67 */ u8 remainingHopsCounter; // Deku hopping on water
/* 0xB68 */ s16 fallStartHeight; // last truncated Y position before falling
/* 0xB6A */ s16 fallDistance; // truncated Y distance the player has fallen so far (positive is down)
/* 0xB6C */ s16 unk_B6C;
@@ -1007,8 +1153,8 @@ typedef struct Player {
/* 0xB76 */ s16 unk_B76;
/* 0xB78 */ f32 unk_B78;
/* 0xB7C */ f32 unk_B7C;
- /* 0xB80 */ f32 unk_B80;
- /* 0xB84 */ s16 unk_B84;
+ /* 0xB80 */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces
+ /* 0xB84 */ s16 pushedYaw; // Yaw of direction in which player is being pushed
/* 0xB86 */ s16 unk_B86[2]; // unknown length
/* 0xB8A */ s16 unk_B8A;
/* 0xB8C */ s16 unk_B8C;
@@ -1019,16 +1165,15 @@ typedef struct Player {
/* 0xB96 */ s16 unk_B96;
/* 0xB98 */ WeaponInfo meleeWeaponInfo[3];
/* 0xBEC */ Vec3f bodyPartsPos[PLAYER_BODYPART_MAX];
- /* 0xCC4 */ MtxF mf_CC4;
+ /* 0xCC4 */ MtxF leftHandMf;
/* 0xD04 */ MtxF shieldMf;
/* 0xD44 */ u8 isBurning;
- /* 0xD45 */ u8 flameTimers[PLAYER_BODYPART_MAX];
+ /* 0xD45 */ u8 flameTimers[PLAYER_BODYPART_MAX]; // one flame per body part
/* 0xD57 */ u8 unk_D57;
/* 0xD58 */ PlayerFuncD58 unk_D58;
/* 0xD5C */ s8 invincibilityTimer; // prevents damage when nonzero (positive = visible, counts towards zero each frame)
/* 0xD5D */ u8 unk_D5D;
- /* 0xD5E */ u8 unk_D5E;
- /* 0xD5F */ u8 unk_D5F;
+ /* 0xD5E */ u8 floorProperty; // FloorProperty enum
/* 0xD60 */ f32 unk_D60;
/* 0xD64 */ s16 unk_D64;
/* 0xD66 */ u16 unk_D66; // sfx
diff --git a/include/z64quake.h b/include/z64quake.h
index f0bd401fc..0150b5404 100644
--- a/include/z64quake.h
+++ b/include/z64quake.h
@@ -1,68 +1,64 @@
#ifndef Z64QUAKE_H
#define Z64QUAKE_H
+#include "z64camera.h"
#include "z64math.h"
struct PlayState;
-struct Camera;
typedef struct {
/* 0x00 */ Vec3f atOffset;
/* 0x0C */ Vec3f eyeOffset;
- /* 0x18 */ s16 rollOffset;
- /* 0x1A */ s16 zoom;
- /* 0x1C */ f32 max; // Set to scaled max data of struct (mag for Vec3f), never used
-} QuakeCamCalc; // size = 0x20
-
-#define QUAKE_SPEED (1 << 0)
-#define QUAKE_VERTICAL_MAG (1 << 1)
-#define QUAKE_HORIZONTAL_MAG (1 << 2)
-#define QUAKE_ZOOM (1 << 3)
-#define QUAKE_ROLL_OFFSET (1 << 4)
-#define QUAKE_SHAKE_PLANE_OFFSET_X (1 << 5)
-#define QUAKE_SHAKE_PLANE_OFFSET_Y (1 << 6)
-#define QUAKE_SHAKE_PLANE_OFFSET_Z (1 << 7)
-#define QUAKE_COUNTDOWN (1 << 8)
-#define QUAKE_IS_SHAKE_PERPENDICULAR (1 << 9)
+ /* 0x18 */ s16 upRollOffset;
+ /* 0x1A */ s16 fovOffset;
+ /* 0x1C */ f32 maxOffset; // Set to scaled max data of struct (mag for Vec3f), never used
+} ShakeInfo; // size = 0x20
typedef enum {
- /* 1 */ QUAKE_TYPE_1 = 1,
- /* 2 */ QUAKE_TYPE_2,
- /* 3 */ QUAKE_TYPE_3,
- /* 4 */ QUAKE_TYPE_4,
- /* 5 */ QUAKE_TYPE_5,
- /* 6 */ QUAKE_TYPE_6
+ /* 0 */ QUAKE_TYPE_NONE,
+ /* 1 */ QUAKE_TYPE_1, // Periodic, sustaining, random X perturbations
+ /* 2 */ QUAKE_TYPE_2, // Aperiodic, sustaining, random X perturbations
+ /* 3 */ QUAKE_TYPE_3, // Periodic, decaying
+ /* 4 */ QUAKE_TYPE_4, // Aperiodic, decaying, random X perturbations
+ /* 5 */ QUAKE_TYPE_5, // Periodic, sustaining
+ /* 6 */ QUAKE_TYPE_6 // See below
} QuakeType;
-u32 Quake_SetValue(s16 quakeIndex, s16 valueType, s16 value);
-u32 Quake_SetSpeed(s16 quakeIndex, s16 speed);
-u32 Quake_SetCountdown(s16 quakeIndex, s16 countdown);
-s16 Quake_GetCountdown(s16 quakeIndex);
-u32 Quake_SetQuakeValues(s16 quakeIndex, s16 verticalMag, s16 horizontalMag, s16 zoom, s16 rollOffset);
-u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakePlaneOffset);
-s16 Quake_Add(Camera* camera, u32 type);
-s16 Quake_Calc(Camera* camera, QuakeCamCalc* camData);
-u32 Quake_Remove(s16 index);
-s32 Quake_NumActiveQuakes(void);
+s16 Quake_Request(Camera* camera, u32 type);
+
+u32 Quake_SetSpeed(s16 index, s16 speed);
+u32 Quake_SetPerturbations(s16 index, s16 y, s16 x, s16 fov, s16 roll);
+u32 Quake_SetDuration(s16 index, s16 duration);
+u32 Quake_SetOrientation(s16 index, s16 isRelativeToScreen, Vec3s orientation);
+
+s16 Quake_GetTimeLeft(s16 index);
+s32 Quake_GetNumActiveQuakes(void);
+u32 Quake_RemoveRequest(s16 index);
+
void Quake_Init(void);
+s16 Quake_Update(Camera* camera, ShakeInfo* camShake);
-#define DISTORTION_TYPE_0 (1 << 0)
-#define DISTORTION_TYPE_NON_ZORA_SWIMMING (1 << 2)
-#define DISTORTION_TYPE_ZORA_SWIMMING (1 << 3)
-#define DISTORTION_TYPE_UNDERWATER_ENTRY (1 << 4)
-#define DISTORTION_TYPE_5 (1 << 5)
-#define DISTORTION_TYPE_6 (1 << 6)
-#define DISTORTION_TYPE_7 (1 << 7)
-#define DISTORTION_TYPE_8 (1 << 8)
-#define DISTORTION_TYPE_9 (1 << 9)
-#define DISTORTION_TYPE_A (1 << 10)
-#define DISTORTION_TYPE_B (1 << 11)
+#define DISTORTION_TYPE_HOT_ROOM (1 << 0) // Hot Room
+#define DISTORTION_TYPE_NON_ZORA_SWIMMING (1 << 2) // Non-Zora swimming
+#define DISTORTION_TYPE_ZORA_SWIMMING (1 << 3) // Zora swimming, also used for boss warp pad part 1
-void Distortion_SetCountdown(s16 countdown);
-s16 Distortion_GetCountdown(void);
+#define DISTORTION_TYPE_UNDERWATER_ENTRY (1 << 4) // Entering water, also used for boss warp pad part 2
+#define DISTORTION_TYPE_SONG_OF_TIME (1 << 5) // Song of Time effects
+#define DISTORTION_TYPE_ZORA_KICK (1 << 6) // PLAYER_MWA_ZORA_PUNCH_KICK
+#define DISTORTION_TYPE_UNK_ATTACK (1 << 7) // Impossible to achieve, inferred to be another `PLAYER_MWA_`,
+
+#define DISTORTION_TYPE_GORON_BUTT (1 << 8) // PLAYER_MWA_GORON_PUNCH_BUTT
+#define DISTORTION_TYPE_MASK_TRANSFORM_1 (1 << 9) // Mask transformation part 1
+#define DISTORTION_TYPE_BOSS_WARP (1 << 10) // Boss warp pad part 3
+#define DISTORTION_TYPE_MASK_TRANSFORM_2 (1 << 11) // Mask transformation part 2
+
+void Distortion_Request(s32 type);
+void Distortion_SetDuration(s16 duration);
+
+s16 Distortion_GetTimeLeft(void);
s16 Distortion_GetType(void);
-void Distortion_SetType(s32 type);
-void Distortion_ClearType(s32 type);
+void Distortion_RemoveRequest(s32 type);
+
void Distortion_Init(PlayState* play);
void Distortion_Update(void);
diff --git a/include/z64save.h b/include/z64save.h
index afabcce34..312b18b2e 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -10,6 +10,13 @@ struct GameState;
struct PlayState;
struct FileSelectState;
+typedef enum {
+ /* 0 */ SAVE_AUDIO_STEREO,
+ /* 1 */ SAVE_AUDIO_MONO,
+ /* 2 */ SAVE_AUDIO_HEADSET,
+ /* 3 */ SAVE_AUDIO_SURROUND
+} AudioOption;
+
// TODO: properly name DOWN, RETURN and TOP
typedef enum RespawnMode {
/* 0 */ RESPAWN_MODE_DOWN, // "RESTART_MODE_DOWN"
@@ -80,7 +87,7 @@ typedef enum {
/* 5 */ TIMER_ID_ENV_HAZARD, // environmental hazard timer (underwater or hot room)
/* 6 */ TIMER_ID_GORON_RACE_UNUSED,
/* 7 */ TIMER_ID_MAX,
- /* 99 */ TIMER_ID_NONE = 99,
+ /* 99 */ TIMER_ID_NONE = 99
} TimerId;
typedef enum {
@@ -157,13 +164,13 @@ typedef enum {
#define PICTO_PHOTO_COMPRESSED_SIZE (PICTO_PHOTO_SIZE * 5 / 8)
typedef struct SramContext {
- /* 0x00 */ u8* readBuff;
- /* 0x04 */ u8 *saveBuf;
+ /* 0x00 */ u8* noFlashSaveBuf; // Never allocated memory
+ /* 0x04 */ u8* saveBuf;
/* 0x08 */ char unk_08[4];
/* 0x0C */ s16 status;
/* 0x10 */ u32 curPage;
/* 0x14 */ u32 numPages;
- /* 0x18 */ OSTime unk_18;
+ /* 0x18 */ OSTime startWriteOsTime;
/* 0x20 */ s16 unk_20;
/* 0x22 */ s16 unk_22;
/* 0x24 */ s16 unk_24;
@@ -226,14 +233,14 @@ typedef struct CycleSceneFlags {
typedef struct SaveOptions {
/* 0x0 */ u16 optionId; // "option_id"
/* 0x2 */ u8 language; // "j_n"
- /* 0x3 */ s8 audioSetting; // "s_sound"
+ /* 0x3 */ u8 audioSetting; // "s_sound"
/* 0x4 */ u8 languageSetting; // "language"
/* 0x5 */ u8 zTargetSetting; // "z_attention", 0: Switch; 1: Hold
} SaveOptions; // size = 0x6
typedef struct SavePlayerData {
/* 0x00 */ char newf[6]; // "newf" Will always be "ZELDA3 for a valid save
- /* 0x06 */ u16 deaths; // "savect"
+ /* 0x06 */ u16 threeDayResetCount; // "savect"
/* 0x08 */ char playerName[8]; // "player_name"
/* 0x10 */ s16 healthCapacity; // "max_life"
/* 0x12 */ s16 health; // "now_life"
@@ -252,61 +259,65 @@ typedef struct SavePlayerData {
/* 0x26 */ s16 savedSceneId; // "scene_data_ID"
} SavePlayerData; // size = 0x28
+typedef struct SaveInfo {
+ /* 0x000 */ SavePlayerData playerData;
+ /* 0x028 */ ItemEquips equips;
+ /* 0x04C */ Inventory inventory;
+ /* 0x0D4 */ PermanentSceneFlags permanentSceneFlags[120];
+ /* 0xDF4 */ UNK_TYPE1 unk_DF4[0x54];
+ /* 0xE48 */ u32 dekuPlaygroundHighScores[3];
+ /* 0xE54 */ u32 pictoFlags0; // Flags set by `PictoActor`s if pictograph is valid
+ /* 0xE58 */ u32 pictoFlags1; // Flags set by Snap_ValidatePictograph() to record errors; volatile since that function is run many times in succession
+ /* 0xE5C */ u32 unk_E5C;
+ /* 0xE60 */ u32 unk_E60;
+ /* 0xE64 */ u32 unk_E64[7]; // Invadepoh flags
+ /* 0xE80 */ u32 scenesVisible[7]; // tingle maps and clouded regions on pause map. Stores scenes bitwise for up to 224 scenes even though there are not that many scenes
+ /* 0xE9C */ u32 skullTokenCount; // upper 16 bits store Swamp skulls, lower 16 bits store Ocean skulls
+ /* 0xEA0 */ u32 unk_EA0; // Gossic stone heart piece flags
+ /* 0xEA4 */ u32 unk_EA4;
+ /* 0xEA8 */ u32 unk_EA8[2]; // Related to blue warps
+ /* 0xEB0 */ u32 stolenItems; // Items stolen by Takkuri and given to Curiosity Shop Man
+ /* 0xEB4 */ u32 unk_EB4;
+ /* 0xEB8 */ u32 bankRupees;
+ /* 0xEBC */ u32 unk_EBC;
+ /* 0xEC0 */ u32 unk_EC0; // Fishing flags
+ /* 0xEC4 */ u32 unk_EC4;
+ /* 0xEC8 */ u32 horseBackBalloonHighScore;
+ /* 0xECC */ u32 lotteryCodeGuess; // Lottery code chosen by player (only uses lower three hex digits)
+ /* 0xED0 */ u32 shootingGalleryHighScores; // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits.
+ /* 0xED4 */ u8 weekEventReg[100]; // "week_event_reg"
+ /* 0xF38 */ u32 regionsVisited; // "area_arrival"
+ /* 0xF3C */ u32 worldMapCloudVisibility; // "cloud_clear"
+ /* 0xF40 */ u8 unk_F40; // "oca_rec_flag" has scarecrows song
+ /* 0xF41 */ u8 unk_F41; // "oca_rec_flag8" scarecrows song set?
+ /* 0xF42 */ u8 scarecrowSpawnSong[128];
+ /* 0xFC2 */ s8 bombersCaughtNum; // "aikotoba_index"
+ /* 0xFC3 */ s8 bombersCaughtOrder[5]; // "aikotoba_table"
+ /* 0xFC8 */ s8 lotteryCodes[3][3]; // "numbers_table", Preset lottery codes
+ /* 0xFD1 */ s8 spiderHouseMaskOrder[6]; // "kinsta_color_table"
+ /* 0xFD7 */ s8 bomberCode[5]; // "bombers_aikotoba_table"
+ /* 0xFDC */ HorseData horseData;
+ /* 0xFE6 */ u16 checksum; // "check_sum"
+} SaveInfo; // size = 0xFE8
+
typedef struct Save {
- /* 0x0000 */ s32 entrance; // "scene_no"
- /* 0x0004 */ u8 equippedMask; // "player_mask"
- /* 0x0005 */ u8 isFirstCycle; // "opening_flag"
- /* 0x0006 */ u8 unk_06;
- /* 0x0007 */ u8 linkAge; // "link_age"
- /* 0x0008 */ s32 cutscene; // "day_time"
- /* 0x000C */ u16 time; // "zelda_time"
- /* 0x000E */ u16 owlSaveLocation;
- /* 0x0010 */ s32 isNight; // "asahiru_fg"
- /* 0x0014 */ s32 timeSpeedOffset; // "change_zelda_time"
- /* 0x0018 */ s32 day; // "totalday"
- /* 0x001C */ s32 daysElapsed; // "eventday"
- /* 0x0020 */ u8 playerForm; // "player_character"
- /* 0x0021 */ u8 snowheadCleared; // "spring_flag"
- /* 0x0022 */ u8 hasTatl; // "bell_flag"
- /* 0x0023 */ u8 isOwlSave;
- /* 0x0024 */ SavePlayerData playerData;
- /* 0x004C */ ItemEquips equips;
- /* 0x0070 */ Inventory inventory;
- /* 0x00F8 */ PermanentSceneFlags permanentSceneFlags[120];
- /* 0x0E18 */ u8 unk_E18[0x54];
- /* 0x0E6C */ u32 dekuPlaygroundHighScores[3];
- /* 0x0E78 */ u32 pictoFlags0; // Flags set by `PictoActor`s if pictograph is valid
- /* 0x0E7C */ u32 pictoFlags1; // Flags set by Snap_ValidatePictograph() to record errors; volatile since that function is run many times in succession
- /* 0x0E80 */ u32 unk_E80;
- /* 0x0E84 */ u32 unk_E84;
- /* 0x0E88 */ u32 unk_E88[7]; // Invadepoh flags
- /* 0x0EA4 */ u32 scenesVisible[7]; // tingle maps and clouded regions on pause map. Stores scenes bitwise for up to 224 scenes even though there are not that many scenes
- /* 0x0EC0 */ u32 skullTokenCount; // upper 16 bits store Swamp skulls, lower 16 bits store Ocean skulls
- /* 0x0EC4 */ u32 unk_EC4; // Gossic stone heart piece flags
- /* 0x0EC8 */ u32 unk_EC8;
- /* 0x0ECC */ u32 unk_ECC[2]; // Related to blue warps
- /* 0x0ED4 */ u32 stolenItems; // Items stolen by Takkuri and given to Curiosity Shop Man
- /* 0x0ED8 */ u32 unk_DD8;
- /* 0x0EDC */ u32 bankRupees;
- /* 0x0EE0 */ u32 unk_EE0;
- /* 0x0EE4 */ u32 unk_EE4; // Fishing flags
- /* 0x0EE8 */ u32 unk_EE8;
- /* 0x0EEC */ u32 horseBackBalloonHighScore;
- /* 0x0EF0 */ u32 lotteryCodeGuess; // Lottery code chosen by player (only uses lower three hex digits)
- /* 0x0EF4 */ u32 shootingGalleryHighScores; // High scores for both shooting galleries. Town uses lower 16 bits, Swamp uses higher 16 bits.
- /* 0x0EF8 */ u8 weekEventReg[100]; // "week_event_reg"
- /* 0x0F5C */ u32 regionsVisited; // "area_arrival"
- /* 0x0F60 */ u32 worldMapCloudVisibility; // "cloud_clear"
- /* 0x0F64 */ u8 unk_F64; // "oca_rec_flag" has scarecrows song
- /* 0x0F65 */ u8 unk_F65; // "oca_rec_flag8" scarecrows song set?
- /* 0x0F66 */ u8 scarecrowSpawnSong[128];
- /* 0x0FE6 */ s8 bombersCaughtNum; // "aikotoba_index"
- /* 0x0FE7 */ s8 bombersCaughtOrder[5]; // "aikotoba_table"
- /* 0x0FEC */ s8 lotteryCodes[3][3]; // "numbers_table", Preset lottery codes
- /* 0x0FF5 */ s8 spiderHouseMaskOrder[6]; // "kinsta_color_table"
- /* 0x0FFB */ s8 bomberCode[5]; // "bombers_aikotoba_table"
- /* 0x1000 */ HorseData horseData;
- /* 0x100A */ u16 checksum; // "check_sum"
+ /* 0x00 */ s32 entrance; // "scene_no"
+ /* 0x04 */ u8 equippedMask; // "player_mask"
+ /* 0x05 */ u8 isFirstCycle; // "opening_flag"
+ /* 0x06 */ u8 unk_06;
+ /* 0x07 */ u8 linkAge; // "link_age"
+ /* 0x08 */ s32 cutsceneIndex; // "day_time"
+ /* 0x0C */ u16 time; // "zelda_time"
+ /* 0x0E */ u16 owlSaveLocation;
+ /* 0x10 */ s32 isNight; // "asahiru_fg"
+ /* 0x14 */ s32 timeSpeedOffset; // "change_zelda_time"
+ /* 0x18 */ s32 day; // "totalday"
+ /* 0x1C */ s32 daysElapsed; // "eventday"
+ /* 0x20 */ u8 playerForm; // "player_character"
+ /* 0x21 */ u8 snowheadCleared; // "spring_flag"
+ /* 0x22 */ u8 hasTatl; // "bell_flag"
+ /* 0x23 */ u8 isOwlSave;
+ /* 0x24 */ SaveInfo saveInfo;
} Save; // size = 0x100C
typedef struct SaveContext {
@@ -333,11 +344,11 @@ typedef struct SaveContext {
/* 0x3DB4 */ f32 entranceSpeed; // "player_wipe_speedF"
/* 0x3DB8 */ u16 entranceSound; // "player_wipe_door_SE"
/* 0x3DBA */ u8 unk_3DBA; // "player_wipe_item"
- /* 0x3DBB */ u8 unk_3DBB; // "next_walk"
- /* 0x3DBC */ s16 dogParams; // "dog_flag"
+ /* 0x3DBB */ u8 retainWeatherMode; // "next_walk"
+ /* 0x3DBC */ s16 dogParams; // OoT leftover. "dog_flag"
/* 0x3DBE */ u8 envHazardTextTriggerFlags; // "guide_status"
/* 0x3DBF */ u8 showTitleCard; // "name_display"
- /* 0x3DC0 */ s16 unk_3DC0; // "shield_magic_timer"
+ /* 0x3DC0 */ s16 nayrusLoveTimer; // remnant of OoT, "shield_magic_timer"
/* 0x3DC2 */ u8 unk_3DC2; // "pad1"
/* 0x3DC8 */ OSTime postmanTimerStopOsTime; // The osTime when the timer stops for the postman minigame. "get_time"
/* 0x3DD0 */ u8 timerStates[TIMER_ID_MAX]; // See the `TimerState` enum. "event_fg"
@@ -370,13 +381,13 @@ typedef struct SaveContext {
/* 0x3F3A */ u16 minigameScore; // "yabusame_total"
/* 0x3F3C */ u16 minigameHiddenScore; // "yabusame_out_ct"
/* 0x3F3E */ u8 unk_3F3E; // "no_save"
- /* 0x3F3F */ u8 unk_3F3F; // "flash_flag"
+ /* 0x3F3F */ u8 flashSaveAvailable; // "flash_flag"
/* 0x3F40 */ SaveOptions options;
- /* 0x3F46 */ u16 unk_3F46; // "NottoriBgm"
+ /* 0x3F46 */ u16 forcedSeqId; // "NottoriBgm"
/* 0x3F48 */ u8 cutsceneTransitionControl; // "fade_go"
/* 0x3F4A */ u16 nextCutsceneIndex; // "next_daytime"
/* 0x3F4C */ u8 cutsceneTrigger; // "doukidemo"
- /* 0x3F4D */ u8 unk_3F4D; // "Kenjya_no"
+ /* 0x3F4D */ u8 chamberCutsceneNum; // remnant of OoT "Kenjya_no"
/* 0x3F4E */ u16 nextDayTime; // "next_zelda_time"
/* 0x3F50 */ u8 transFadeDuration; // "fade_speed"
/* 0x3F51 */ u8 transWipeSpeed; // "wipe_speed" transition related
@@ -429,41 +440,41 @@ typedef enum {
#define GET_PLAYER_FORM ((void)0, gSaveContext.save.playerForm)
#define SLOT(item) gItemSlots[item]
-#define AMMO(item) gSaveContext.save.inventory.ammo[SLOT(item)]
-#define INV_CONTENT(item) gSaveContext.save.inventory.items[SLOT(item)]
-#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.inventory.items)[SLOT(item)]
+#define AMMO(item) gSaveContext.save.saveInfo.inventory.ammo[SLOT(item)]
+#define INV_CONTENT(item) gSaveContext.save.saveInfo.inventory.items[SLOT(item)]
+#define GET_INV_CONTENT(item) ((void)0, gSaveContext.save.saveInfo.inventory.items)[SLOT(item)]
#define CUR_FORM ((gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.save.playerForm)
-#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.equips.equipment)
-#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.inventory.upgrades)
-#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.inventory.questItems)
+#define GET_SAVE_EQUIPS_EQUIPMENT ((void)0, gSaveContext.save.saveInfo.equips.equipment)
+#define GET_SAVE_INVENTORY_UPGRADES ((void)0, gSaveContext.save.saveInfo.inventory.upgrades)
+#define GET_SAVE_INVENTORY_QUEST_ITEMS ((void)0, gSaveContext.save.saveInfo.inventory.questItems)
#define GET_CUR_EQUIP_VALUE(equip) ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipMasks[equip]) >> gEquipShifts[equip])
-#define CUR_UPG_VALUE(upg) ((gSaveContext.save.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
+#define CUR_UPG_VALUE(upg) ((gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define GET_CUR_UPG_VALUE(upg) ((GET_SAVE_INVENTORY_UPGRADES & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
-#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
+#define SET_EQUIP_VALUE(equip, value) (gSaveContext.save.saveInfo.equips.equipment = ((GET_SAVE_EQUIPS_EQUIPMENT & gEquipNegMasks[equip]) | (u16)((u16)(value) << gEquipShifts[equip])))
-#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.equips.buttonItems[form][button])
+#define BUTTON_ITEM_EQUIP(form, button) (gSaveContext.save.saveInfo.equips.buttonItems[form][button])
#define CUR_FORM_EQUIP(button) BUTTON_ITEM_EQUIP(CUR_FORM, button)
-#define C_SLOT_EQUIP(form, button) (gSaveContext.save.equips.cButtonSlots[form][button])
+#define C_SLOT_EQUIP(form, button) (gSaveContext.save.saveInfo.equips.cButtonSlots[form][button])
#define CHECK_QUEST_ITEM(item) (GET_SAVE_INVENTORY_QUEST_ITEMS & gBitFlags[item])
-#define SET_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
-#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
+#define SET_QUEST_ITEM(item) (gSaveContext.save.saveInfo.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS | gBitFlags[item]))
+#define REMOVE_QUEST_ITEM(item) (gSaveContext.save.saveInfo.inventory.questItems = (GET_SAVE_INVENTORY_QUEST_ITEMS & (-1 - gBitFlags[item])))
#define GET_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) >> QUEST_HEART_PIECE_COUNT)
#define EQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) == (4 << QUEST_HEART_PIECE_COUNT))
#define LEQ_MAX_QUEST_HEART_PIECE_COUNT ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) <= (4 << QUEST_HEART_PIECE_COUNT))
-#define INCREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT))
-#define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT))
-#define RESET_HEART_PIECE_COUNT (gSaveContext.save.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT))
+#define INCREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems += (1 << QUEST_HEART_PIECE_COUNT))
+#define DECREMENT_QUEST_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems -= (1 << QUEST_HEART_PIECE_COUNT))
+#define RESET_HEART_PIECE_COUNT (gSaveContext.save.saveInfo.inventory.questItems ^= (4 << QUEST_HEART_PIECE_COUNT))
-#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
-#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
-#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.inventory.dungeonKeys[(void)0, dungeonIndex])
+#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] & gBitFlags[item])
+#define SET_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonItems[(void)0, dungeonIndex] |= (u8)gBitFlags[item])
+#define DUNGEON_KEY_COUNT(dungeonIndex) (gSaveContext.save.saveInfo.inventory.dungeonKeys[(void)0, dungeonIndex])
#define GET_CUR_FORM_BTN_ITEM(btn) ((u8)((btn) == EQUIP_SLOT_B ? BUTTON_ITEM_EQUIP(CUR_FORM, btn) : BUTTON_ITEM_EQUIP(0, btn)))
#define GET_CUR_FORM_BTN_SLOT(btn) ((u8)((btn) == EQUIP_SLOT_B ? C_SLOT_EQUIP(CUR_FORM, btn) : C_SLOT_EQUIP(0, btn)))
@@ -491,21 +502,21 @@ typedef enum {
#define STOLEN_ITEM_NONE (0)
-#define STOLEN_ITEM_1 ((gSaveContext.save.stolenItems & 0xFF000000) >> 0x18)
-#define STOLEN_ITEM_2 ((gSaveContext.save.stolenItems & 0x00FF0000) >> 0x10)
+#define STOLEN_ITEM_1 ((gSaveContext.save.saveInfo.stolenItems & 0xFF000000) >> 0x18)
+#define STOLEN_ITEM_2 ((gSaveContext.save.saveInfo.stolenItems & 0x00FF0000) >> 0x10)
#define SET_STOLEN_ITEM_1(itemId) \
- (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
+ (gSaveContext.save.saveInfo.stolenItems = (gSaveContext.save.saveInfo.stolenItems & ~0xFF000000) | ((itemId & 0xFF) << 0x18))
#define SET_STOLEN_ITEM_2(itemId) \
- (gSaveContext.save.stolenItems = (gSaveContext.save.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
+ (gSaveContext.save.saveInfo.stolenItems = (gSaveContext.save.saveInfo.stolenItems & ~0x00FF0000) | ((itemId & 0xFF) << 0x10))
-#define GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() ((s32)(gSaveContext.save.shootingGalleryHighScores & 0xFFFF))
-#define GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() ((s32)((gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) >> 0x10))
-#define SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = (gSaveContext.save.shootingGalleryHighScores & 0xFFFF0000) | ((u16)(score)))
-#define SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.shootingGalleryHighScores = ((gSaveContext.save.shootingGalleryHighScores) & 0xFFFF) | ((u16)(score) << 0x10))
+#define GET_TOWN_SHOOTING_GALLERY_HIGH_SCORE() ((s32)(gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF))
+#define GET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE() ((s32)((gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF0000) >> 0x10))
+#define SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.saveInfo.shootingGalleryHighScores = (gSaveContext.save.saveInfo.shootingGalleryHighScores & 0xFFFF0000) | ((u16)(score)))
+#define SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(score) (gSaveContext.save.saveInfo.shootingGalleryHighScores = ((gSaveContext.save.saveInfo.shootingGalleryHighScores) & 0xFFFF) | ((u16)(score) << 0x10))
/**
- * gSaveContext.save.weekEventReg
+ * gSaveContext.save.saveInfo.weekEventReg
*/
#define PACK_WEEKEVENTREG_FLAG(index, mask) (((index) << 8) | (mask))
@@ -590,7 +601,7 @@ typedef enum {
#define WEEKEVENTREG_08_04 PACK_WEEKEVENTREG_FLAG(8, 0x04)
#define WEEKEVENTREG_08_08 PACK_WEEKEVENTREG_FLAG(8, 0x08)
#define WEEKEVENTREG_08_10 PACK_WEEKEVENTREG_FLAG(8, 0x10)
-#define WEEKEVENTREG_08_20 PACK_WEEKEVENTREG_FLAG(8, 0x20)
+#define WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE PACK_WEEKEVENTREG_FLAG(8, 0x20)
// Related to final hours
#define WEEKEVENTREG_08_40 PACK_WEEKEVENTREG_FLAG(8, 0x40)
@@ -691,7 +702,9 @@ typedef enum {
#define WEEKEVENTREG_18_10 PACK_WEEKEVENTREG_FLAG(18, 0x10)
#define WEEKEVENTREG_18_20 PACK_WEEKEVENTREG_FLAG(18, 0x20)
#define WEEKEVENTREG_18_40 PACK_WEEKEVENTREG_FLAG(18, 0x40)
-#define WEEKEVENTREG_18_80 PACK_WEEKEVENTREG_FLAG(18, 0x80)
+
+// Player has Powder Keg purchasing privileges.
+#define WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES PACK_WEEKEVENTREG_FLAG(18, 0x80)
#define WEEKEVENTREG_19_01 PACK_WEEKEVENTREG_FLAG(19, 0x01)
#define WEEKEVENTREG_19_02 PACK_WEEKEVENTREG_FLAG(19, 0x02)
#define WEEKEVENTREG_19_04 PACK_WEEKEVENTREG_FLAG(19, 0x04)
@@ -703,7 +716,7 @@ typedef enum {
#define WEEKEVENTREG_20_01 PACK_WEEKEVENTREG_FLAG(20, 0x01)
// woodfall temple purification cutscene watched
-#define WEEKEVENTREG_20_02 PACK_WEEKEVENTREG_FLAG(20, 0x02)
+#define WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE PACK_WEEKEVENTREG_FLAG(20, 0x02)
#define WEEKEVENTREG_20_04 PACK_WEEKEVENTREG_FLAG(20, 0x04)
#define WEEKEVENTREG_20_08 PACK_WEEKEVENTREG_FLAG(20, 0x08)
@@ -713,19 +726,26 @@ typedef enum {
#define WEEKEVENTREG_20_80 PACK_WEEKEVENTREG_FLAG(20, 0x80)
#define WEEKEVENTREG_21_01 PACK_WEEKEVENTREG_FLAG(21, 0x01)
#define WEEKEVENTREG_21_02 PACK_WEEKEVENTREG_FLAG(21, 0x02)
-#define WEEKEVENTREG_21_04 PACK_WEEKEVENTREG_FLAG(21, 0x04)
-#define WEEKEVENTREG_21_08 PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
+// Player has spoken to Goron Graveyard's gravemaker while in Goron form.
+#define WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON PACK_WEEKEVENTREG_FLAG(21, 0x04)
+// Player has spoken to formerly frozen Goron outside Goron Graveyard.
+#define WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
#define WEEKEVENTREG_21_10 PACK_WEEKEVENTREG_FLAG(21, 0x10)
-#define WEEKEVENTREG_21_20 PACK_WEEKEVENTREG_FLAG(21, 0x20)
+#define WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM PACK_WEEKEVENTREG_FLAG(21, 0x20)
#define WEEKEVENTREG_21_40 PACK_WEEKEVENTREG_FLAG(21, 0x40)
#define WEEKEVENTREG_21_80 PACK_WEEKEVENTREG_FLAG(21, 0x80)
// Aliens defeated
// "Winning" the alien invasion
-#define WEEKEVENTREG_22_01 PACK_WEEKEVENTREG_FLAG(22, 0x01)
+#define WEEKEVENTREG_DEFENDED_AGAINST_THEM PACK_WEEKEVENTREG_FLAG(22, 0x01)
#define WEEKEVENTREG_22_02 PACK_WEEKEVENTREG_FLAG(22, 0x02)
-#define WEEKEVENTREG_22_04 PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
+// Goron Elder's son has been calmed from Goron's Lullaby.
+#define WEEKEVENTREG_CALMED_GORON_ELDERS_SON PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
#define WEEKEVENTREG_22_08 PACK_WEEKEVENTREG_FLAG(22, 0x08)
#define WEEKEVENTREG_22_10 PACK_WEEKEVENTREG_FLAG(22, 0x10)
#define WEEKEVENTREG_22_20 PACK_WEEKEVENTREG_FLAG(22, 0x20)
@@ -775,11 +795,11 @@ typedef enum {
#define WEEKEVENTREG_26_40 PACK_WEEKEVENTREG_FLAG(26, 0x40)
#define WEEKEVENTREG_26_80 PACK_WEEKEVENTREG_FLAG(26, 0x80)
#define WEEKEVENTREG_27_01 PACK_WEEKEVENTREG_FLAG(27, 0x01)
-#define WEEKEVENTREG_27_02 PACK_WEEKEVENTREG_FLAG(27, 0x02)
-#define WEEKEVENTREG_27_04 PACK_WEEKEVENTREG_FLAG(27, 0x04)
-#define WEEKEVENTREG_27_08 PACK_WEEKEVENTREG_FLAG(27, 0x08)
-#define WEEKEVENTREG_27_10 PACK_WEEKEVENTREG_FLAG(27, 0x10)
-#define WEEKEVENTREG_27_20 PACK_WEEKEVENTREG_FLAG(27, 0x20)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x02)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x04)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x08)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x10)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x20)
#define WEEKEVENTREG_27_40 PACK_WEEKEVENTREG_FLAG(27, 0x40)
#define WEEKEVENTREG_27_80 PACK_WEEKEVENTREG_FLAG(27, 0x80)
#define WEEKEVENTREG_28_01 PACK_WEEKEVENTREG_FLAG(28, 0x01)
@@ -847,13 +867,13 @@ typedef enum {
#define WEEKEVENTREG_33_40 PACK_WEEKEVENTREG_FLAG(33, 0x40)
// Mountain village is unfrozen
-#define WEEKEVENTREG_33_80 PACK_WEEKEVENTREG_FLAG(33, 0x80)
+#define WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE PACK_WEEKEVENTREG_FLAG(33, 0x80)
// Spoken to MINIFROG_YELLOW
#define WEEKEVENTREG_34_01 PACK_WEEKEVENTREG_FLAG(34, 0x01)
#define WEEKEVENTREG_34_02 PACK_WEEKEVENTREG_FLAG(34, 0x02)
#define WEEKEVENTREG_34_04 PACK_WEEKEVENTREG_FLAG(34, 0x04)
-#define WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED PACK_WEEKEVENTREG_FLAG(34, 0x08)
+#define WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN PACK_WEEKEVENTREG_FLAG(34, 0x08)
#define WEEKEVENTREG_34_10 PACK_WEEKEVENTREG_FLAG(34, 0x10)
#define WEEKEVENTREG_34_20 PACK_WEEKEVENTREG_FLAG(34, 0x20)
#define WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH PACK_WEEKEVENTREG_FLAG(34, 0x40)
@@ -920,62 +940,11 @@ typedef enum {
#define WEEKEVENTREG_41_20 PACK_WEEKEVENTREG_FLAG(41, 0x20)
#define WEEKEVENTREG_41_40 PACK_WEEKEVENTREG_FLAG(41, 0x40)
#define WEEKEVENTREG_41_80 PACK_WEEKEVENTREG_FLAG(41, 0x80)
-#define WEEKEVENTREG_42_01 PACK_WEEKEVENTREG_FLAG(42, 0x01)
-#define WEEKEVENTREG_42_02 PACK_WEEKEVENTREG_FLAG(42, 0x02)
-#define WEEKEVENTREG_42_04 PACK_WEEKEVENTREG_FLAG(42, 0x04)
-#define WEEKEVENTREG_42_08 PACK_WEEKEVENTREG_FLAG(42, 0x08)
-#define WEEKEVENTREG_42_10 PACK_WEEKEVENTREG_FLAG(42, 0x10)
-#define WEEKEVENTREG_42_20 PACK_WEEKEVENTREG_FLAG(42, 0x20)
-#define WEEKEVENTREG_42_40 PACK_WEEKEVENTREG_FLAG(42, 0x40)
-#define WEEKEVENTREG_42_80 PACK_WEEKEVENTREG_FLAG(42, 0x80)
-#define WEEKEVENTREG_43_01 PACK_WEEKEVENTREG_FLAG(43, 0x01)
-#define WEEKEVENTREG_43_02 PACK_WEEKEVENTREG_FLAG(43, 0x02)
-#define WEEKEVENTREG_43_04 PACK_WEEKEVENTREG_FLAG(43, 0x04)
-#define WEEKEVENTREG_43_08 PACK_WEEKEVENTREG_FLAG(43, 0x08)
-#define WEEKEVENTREG_43_10 PACK_WEEKEVENTREG_FLAG(43, 0x10)
-#define WEEKEVENTREG_43_20 PACK_WEEKEVENTREG_FLAG(43, 0x20)
-#define WEEKEVENTREG_43_40 PACK_WEEKEVENTREG_FLAG(43, 0x40)
-#define WEEKEVENTREG_43_80 PACK_WEEKEVENTREG_FLAG(43, 0x80)
-#define WEEKEVENTREG_44_01 PACK_WEEKEVENTREG_FLAG(44, 0x01)
-#define WEEKEVENTREG_44_02 PACK_WEEKEVENTREG_FLAG(44, 0x02)
-#define WEEKEVENTREG_44_04 PACK_WEEKEVENTREG_FLAG(44, 0x04)
-#define WEEKEVENTREG_44_08 PACK_WEEKEVENTREG_FLAG(44, 0x08)
-#define WEEKEVENTREG_44_10 PACK_WEEKEVENTREG_FLAG(44, 0x10)
-#define WEEKEVENTREG_44_20 PACK_WEEKEVENTREG_FLAG(44, 0x20)
-#define WEEKEVENTREG_44_40 PACK_WEEKEVENTREG_FLAG(44, 0x40)
-#define WEEKEVENTREG_44_80 PACK_WEEKEVENTREG_FLAG(44, 0x80)
-#define WEEKEVENTREG_45_01 PACK_WEEKEVENTREG_FLAG(45, 0x01)
-#define WEEKEVENTREG_45_02 PACK_WEEKEVENTREG_FLAG(45, 0x02)
-#define WEEKEVENTREG_45_04 PACK_WEEKEVENTREG_FLAG(45, 0x04)
-#define WEEKEVENTREG_45_08 PACK_WEEKEVENTREG_FLAG(45, 0x08)
-#define WEEKEVENTREG_45_10 PACK_WEEKEVENTREG_FLAG(45, 0x10)
-#define WEEKEVENTREG_45_20 PACK_WEEKEVENTREG_FLAG(45, 0x20)
-#define WEEKEVENTREG_45_40 PACK_WEEKEVENTREG_FLAG(45, 0x40)
-#define WEEKEVENTREG_45_80 PACK_WEEKEVENTREG_FLAG(45, 0x80)
-#define WEEKEVENTREG_46_01 PACK_WEEKEVENTREG_FLAG(46, 0x01)
-#define WEEKEVENTREG_46_02 PACK_WEEKEVENTREG_FLAG(46, 0x02)
-#define WEEKEVENTREG_46_04 PACK_WEEKEVENTREG_FLAG(46, 0x04)
-#define WEEKEVENTREG_46_08 PACK_WEEKEVENTREG_FLAG(46, 0x08)
-#define WEEKEVENTREG_46_10 PACK_WEEKEVENTREG_FLAG(46, 0x10)
-#define WEEKEVENTREG_46_20 PACK_WEEKEVENTREG_FLAG(46, 0x20)
-#define WEEKEVENTREG_46_40 PACK_WEEKEVENTREG_FLAG(46, 0x40)
-#define WEEKEVENTREG_46_80 PACK_WEEKEVENTREG_FLAG(46, 0x80)
-#define WEEKEVENTREG_47_01 PACK_WEEKEVENTREG_FLAG(47, 0x01)
-#define WEEKEVENTREG_47_02 PACK_WEEKEVENTREG_FLAG(47, 0x02)
-#define WEEKEVENTREG_47_04 PACK_WEEKEVENTREG_FLAG(47, 0x04)
-#define WEEKEVENTREG_47_08 PACK_WEEKEVENTREG_FLAG(47, 0x08)
-#define WEEKEVENTREG_47_10 PACK_WEEKEVENTREG_FLAG(47, 0x10)
-#define WEEKEVENTREG_47_20 PACK_WEEKEVENTREG_FLAG(47, 0x20)
-#define WEEKEVENTREG_47_40 PACK_WEEKEVENTREG_FLAG(47, 0x40)
-#define WEEKEVENTREG_47_80 PACK_WEEKEVENTREG_FLAG(47, 0x80)
-#define WEEKEVENTREG_48_01 PACK_WEEKEVENTREG_FLAG(48, 0x01)
-#define WEEKEVENTREG_48_02 PACK_WEEKEVENTREG_FLAG(48, 0x02)
-#define WEEKEVENTREG_48_04 PACK_WEEKEVENTREG_FLAG(48, 0x04)
-#define WEEKEVENTREG_48_08 PACK_WEEKEVENTREG_FLAG(48, 0x08)
-#define WEEKEVENTREG_48_10 PACK_WEEKEVENTREG_FLAG(48, 0x10)
-#define WEEKEVENTREG_48_20 PACK_WEEKEVENTREG_FLAG(48, 0x20)
-#define WEEKEVENTREG_48_40 PACK_WEEKEVENTREG_FLAG(48, 0x40)
-#define WEEKEVENTREG_48_80 PACK_WEEKEVENTREG_FLAG(48, 0x80)
+
+// Used for storing the text ID offsets for the dogs in the Doggy Racetrack (56 entries)
+// The number of weekEventRegs used needs to be kept in sync with RACEDOG_COUNT in z_en_aob_01.h
+// PACK_WEEKEVENTREG_FLAG(42, 0x01) to PACK_WEEKEVENTREG_FLAG(48, 0x80)
+
#define WEEKEVENTREG_49_01 PACK_WEEKEVENTREG_FLAG(49, 0x01)
#define WEEKEVENTREG_49_02 PACK_WEEKEVENTREG_FLAG(49, 0x02)
#define WEEKEVENTREG_49_04 PACK_WEEKEVENTREG_FLAG(49, 0x04)
@@ -987,32 +956,29 @@ typedef enum {
#define WEEKEVENTREG_50_01 PACK_WEEKEVENTREG_FLAG(50, 0x01)
#define WEEKEVENTREG_50_02 PACK_WEEKEVENTREG_FLAG(50, 0x02)
#define WEEKEVENTREG_50_04 PACK_WEEKEVENTREG_FLAG(50, 0x04)
-#define WEEKEVENTREG_50_08 PACK_WEEKEVENTREG_FLAG(50, 0x08)
+#define WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(50, 0x08)
#define WEEKEVENTREG_50_10 PACK_WEEKEVENTREG_FLAG(50, 0x10)
-#define WEEKEVENTREG_50_20 PACK_WEEKEVENTREG_FLAG(50, 0x20)
+#define WEEKEVENTREG_HAD_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(50, 0x20)
#define WEEKEVENTREG_50_40 PACK_WEEKEVENTREG_FLAG(50, 0x40)
-#define WEEKEVENTREG_50_80 PACK_WEEKEVENTREG_FLAG(50, 0x80)
-#define WEEKEVENTREG_51_01 PACK_WEEKEVENTREG_FLAG(51, 0x01)
+#define WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(50, 0x80)
+#define WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(51, 0x01)
#define WEEKEVENTREG_51_02 PACK_WEEKEVENTREG_FLAG(51, 0x02)
#define WEEKEVENTREG_51_04 PACK_WEEKEVENTREG_FLAG(51, 0x04)
#define WEEKEVENTREG_51_08 PACK_WEEKEVENTREG_FLAG(51, 0x08)
#define WEEKEVENTREG_51_10 PACK_WEEKEVENTREG_FLAG(51, 0x10)
-#define WEEKEVENTREG_51_20 PACK_WEEKEVENTREG_FLAG(51, 0x20)
+#define WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT PACK_WEEKEVENTREG_FLAG(51, 0x20)
#define WEEKEVENTREG_51_40 PACK_WEEKEVENTREG_FLAG(51, 0x40)
#define WEEKEVENTREG_51_80 PACK_WEEKEVENTREG_FLAG(51, 0x80)
// ProtectedCremia
-#define WEEKEVENTREG_52_01 PACK_WEEKEVENTREG_FLAG(52, 0x01)
+#define WEEKEVENTREG_ESCORTED_CREMIA PACK_WEEKEVENTREG_FLAG(52, 0x01)
// Lose Milk Run minigame
#define WEEKEVENTREG_52_02 PACK_WEEKEVENTREG_FLAG(52, 0x02)
#define WEEKEVENTREG_52_04 PACK_WEEKEVENTREG_FLAG(52, 0x04)
#define WEEKEVENTREG_52_08 PACK_WEEKEVENTREG_FLAG(52, 0x08)
#define WEEKEVENTREG_52_10 PACK_WEEKEVENTREG_FLAG(52, 0x10)
-
-// cleared Stone Tower Temple
-#define WEEKEVENTREG_52_20 PACK_WEEKEVENTREG_FLAG(52, 0x20)
-
+#define WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE PACK_WEEKEVENTREG_FLAG(52, 0x20)
#define WEEKEVENTREG_52_40 PACK_WEEKEVENTREG_FLAG(52, 0x40)
#define WEEKEVENTREG_52_80 PACK_WEEKEVENTREG_FLAG(52, 0x80)
#define WEEKEVENTREG_53_01 PACK_WEEKEVENTREG_FLAG(53, 0x01)
@@ -1043,7 +1009,7 @@ typedef enum {
#define WEEKEVENTREG_55_40 PACK_WEEKEVENTREG_FLAG(55, 0x40)
// Gyorg has been defeated
-#define WEEKEVENTREG_55_80 PACK_WEEKEVENTREG_FLAG(55, 0x80)
+#define WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE PACK_WEEKEVENTREG_FLAG(55, 0x80)
#define WEEKEVENTREG_56_01 PACK_WEEKEVENTREG_FLAG(56, 0x01)
#define WEEKEVENTREG_56_02 PACK_WEEKEVENTREG_FLAG(56, 0x02)
@@ -1126,70 +1092,74 @@ typedef enum {
#define WEEKEVENTREG_64_10 PACK_WEEKEVENTREG_FLAG(64, 0x10)
#define WEEKEVENTREG_64_20 PACK_WEEKEVENTREG_FLAG(64, 0x20)
#define WEEKEVENTREG_64_40 PACK_WEEKEVENTREG_FLAG(64, 0x40)
-#define WEEKEVENTREG_64_80 PACK_WEEKEVENTREG_FLAG(64, 0x80)
-#define WEEKEVENTREG_65_01 PACK_WEEKEVENTREG_FLAG(65, 0x01)
-#define WEEKEVENTREG_65_02 PACK_WEEKEVENTREG_FLAG(65, 0x02)
-#define WEEKEVENTREG_65_04 PACK_WEEKEVENTREG_FLAG(65, 0x04)
-#define WEEKEVENTREG_65_08 PACK_WEEKEVENTREG_FLAG(65, 0x08)
-#define WEEKEVENTREG_65_10 PACK_WEEKEVENTREG_FLAG(65, 0x10)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1 PACK_WEEKEVENTREG_FLAG(64, 0x80)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1 PACK_WEEKEVENTREG_FLAG(65, 0x01)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2 PACK_WEEKEVENTREG_FLAG(65, 0x02)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2 PACK_WEEKEVENTREG_FLAG(65, 0x04)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3 PACK_WEEKEVENTREG_FLAG(65, 0x08)
+#define WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3 PACK_WEEKEVENTREG_FLAG(65, 0x10)
#define WEEKEVENTREG_65_20 PACK_WEEKEVENTREG_FLAG(65, 0x20)
#define WEEKEVENTREG_65_40 PACK_WEEKEVENTREG_FLAG(65, 0x40)
#define WEEKEVENTREG_65_80 PACK_WEEKEVENTREG_FLAG(65, 0x80)
-#define WEEKEVENTREG_66_01 PACK_WEEKEVENTREG_FLAG(66, 0x01)
-#define WEEKEVENTREG_66_02 PACK_WEEKEVENTREG_FLAG(66, 0x02)
-#define WEEKEVENTREG_66_04 PACK_WEEKEVENTREG_FLAG(66, 0x04)
-#define WEEKEVENTREG_66_08 PACK_WEEKEVENTREG_FLAG(66, 0x08)
-#define WEEKEVENTREG_66_10 PACK_WEEKEVENTREG_FLAG(66, 0x10)
-#define WEEKEVENTREG_66_20 PACK_WEEKEVENTREG_FLAG(66, 0x20)
-#define WEEKEVENTREG_66_40 PACK_WEEKEVENTREG_FLAG(66, 0x40)
-#define WEEKEVENTREG_66_80 PACK_WEEKEVENTREG_FLAG(66, 0x80)
-#define WEEKEVENTREG_67_01 PACK_WEEKEVENTREG_FLAG(67, 0x01)
-#define WEEKEVENTREG_67_02 PACK_WEEKEVENTREG_FLAG(67, 0x02)
-#define WEEKEVENTREG_67_04 PACK_WEEKEVENTREG_FLAG(67, 0x04)
-#define WEEKEVENTREG_67_08 PACK_WEEKEVENTREG_FLAG(67, 0x08)
-#define WEEKEVENTREG_67_10 PACK_WEEKEVENTREG_FLAG(67, 0x10)
-#define WEEKEVENTREG_67_20 PACK_WEEKEVENTREG_FLAG(67, 0x20)
-#define WEEKEVENTREG_67_40 PACK_WEEKEVENTREG_FLAG(67, 0x40)
-#define WEEKEVENTREG_67_80 PACK_WEEKEVENTREG_FLAG(67, 0x80)
-#define WEEKEVENTREG_68_01 PACK_WEEKEVENTREG_FLAG(68, 0x01)
-#define WEEKEVENTREG_68_02 PACK_WEEKEVENTREG_FLAG(68, 0x02)
-#define WEEKEVENTREG_68_04 PACK_WEEKEVENTREG_FLAG(68, 0x04)
-#define WEEKEVENTREG_68_08 PACK_WEEKEVENTREG_FLAG(68, 0x08)
-#define WEEKEVENTREG_68_10 PACK_WEEKEVENTREG_FLAG(68, 0x10)
-#define WEEKEVENTREG_68_20 PACK_WEEKEVENTREG_FLAG(68, 0x20)
-#define WEEKEVENTREG_68_40 PACK_WEEKEVENTREG_FLAG(68, 0x40)
-#define WEEKEVENTREG_68_80 PACK_WEEKEVENTREG_FLAG(68, 0x80)
-#define WEEKEVENTREG_69_01 PACK_WEEKEVENTREG_FLAG(69, 0x01)
-#define WEEKEVENTREG_69_02 PACK_WEEKEVENTREG_FLAG(69, 0x02)
-#define WEEKEVENTREG_69_04 PACK_WEEKEVENTREG_FLAG(69, 0x04)
-#define WEEKEVENTREG_69_08 PACK_WEEKEVENTREG_FLAG(69, 0x08)
-#define WEEKEVENTREG_69_10 PACK_WEEKEVENTREG_FLAG(69, 0x10)
-#define WEEKEVENTREG_69_20 PACK_WEEKEVENTREG_FLAG(69, 0x20)
-#define WEEKEVENTREG_69_40 PACK_WEEKEVENTREG_FLAG(69, 0x40)
-#define WEEKEVENTREG_69_80 PACK_WEEKEVENTREG_FLAG(69, 0x80)
-#define WEEKEVENTREG_70_01 PACK_WEEKEVENTREG_FLAG(70, 0x01)
-#define WEEKEVENTREG_70_02 PACK_WEEKEVENTREG_FLAG(70, 0x02)
-#define WEEKEVENTREG_70_04 PACK_WEEKEVENTREG_FLAG(70, 0x04)
-#define WEEKEVENTREG_70_08 PACK_WEEKEVENTREG_FLAG(70, 0x08)
-#define WEEKEVENTREG_70_10 PACK_WEEKEVENTREG_FLAG(70, 0x10)
-#define WEEKEVENTREG_70_20 PACK_WEEKEVENTREG_FLAG(70, 0x20)
-#define WEEKEVENTREG_70_40 PACK_WEEKEVENTREG_FLAG(70, 0x40)
-#define WEEKEVENTREG_70_80 PACK_WEEKEVENTREG_FLAG(70, 0x80)
-#define WEEKEVENTREG_71_01 PACK_WEEKEVENTREG_FLAG(71, 0x01)
-#define WEEKEVENTREG_71_02 PACK_WEEKEVENTREG_FLAG(71, 0x02)
-#define WEEKEVENTREG_71_04 PACK_WEEKEVENTREG_FLAG(71, 0x04)
-#define WEEKEVENTREG_71_08 PACK_WEEKEVENTREG_FLAG(71, 0x08)
-#define WEEKEVENTREG_71_10 PACK_WEEKEVENTREG_FLAG(71, 0x10)
-#define WEEKEVENTREG_71_20 PACK_WEEKEVENTREG_FLAG(71, 0x20)
-#define WEEKEVENTREG_71_40 PACK_WEEKEVENTREG_FLAG(71, 0x40)
-#define WEEKEVENTREG_71_80 PACK_WEEKEVENTREG_FLAG(71, 0x80)
-#define WEEKEVENTREG_72_01 PACK_WEEKEVENTREG_FLAG(72, 0x01)
-#define WEEKEVENTREG_72_02 PACK_WEEKEVENTREG_FLAG(72, 0x02)
-#define WEEKEVENTREG_72_04 PACK_WEEKEVENTREG_FLAG(72, 0x04)
-#define WEEKEVENTREG_72_08 PACK_WEEKEVENTREG_FLAG(72, 0x08)
-#define WEEKEVENTREG_72_10 PACK_WEEKEVENTREG_FLAG(72, 0x10)
-#define WEEKEVENTREG_72_20 PACK_WEEKEVENTREG_FLAG(72, 0x20)
-#define WEEKEVENTREG_72_40 PACK_WEEKEVENTREG_FLAG(72, 0x40)
+
+/* Bombers' Notebook Events */
+
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU PACK_WEEKEVENTREG_FLAG(66, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI PACK_WEEKEVENTREG_FLAG(66, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN PACK_WEEKEVENTREG_FLAG(66, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY PACK_WEEKEVENTREG_FLAG(66, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI PACK_WEEKEVENTREG_FLAG(66, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA PACK_WEEKEVENTREG_FLAG(66, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR PACK_WEEKEVENTREG_FLAG(66, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA PACK_WEEKEVENTREG_FLAG(66, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO PACK_WEEKEVENTREG_FLAG(67, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN PACK_WEEKEVENTREG_FLAG(67, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN PACK_WEEKEVENTREG_FLAG(67, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS PACK_WEEKEVENTREG_FLAG(67, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND PACK_WEEKEVENTREG_FLAG(67, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER PACK_WEEKEVENTREG_FLAG(67, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO PACK_WEEKEVENTREG_FLAG(67, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG PACK_WEEKEVENTREG_FLAG(67, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS PACK_WEEKEVENTREG_FLAG(68, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO PACK_WEEKEVENTREG_FLAG(68, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU PACK_WEEKEVENTREG_FLAG(68, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS PACK_WEEKEVENTREG_FLAG(68, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY PACK_WEEKEVENTREG_FLAG(68, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(68, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI PACK_WEEKEVENTREG_FLAG(68, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI PACK_WEEKEVENTREG_FLAG(68, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI PACK_WEEKEVENTREG_FLAG(69, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(69, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(69, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT PACK_WEEKEVENTREG_FLAG(69, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM PACK_WEEKEVENTREG_FLAG(69, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM PACK_WEEKEVENTREG_FLAG(69, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE PACK_WEEKEVENTREG_FLAG(69, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA PACK_WEEKEVENTREG_FLAG(69, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK PACK_WEEKEVENTREG_FLAG(70, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK PACK_WEEKEVENTREG_FLAG(70, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(70, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(70, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE PACK_WEEKEVENTREG_FLAG(70, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK PACK_WEEKEVENTREG_FLAG(70, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP PACK_WEEKEVENTREG_FLAG(70, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP PACK_WEEKEVENTREG_FLAG(70, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP PACK_WEEKEVENTREG_FLAG(71, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP PACK_WEEKEVENTREG_FLAG(71, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP PACK_WEEKEVENTREG_FLAG(71, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP PACK_WEEKEVENTREG_FLAG(71, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK PACK_WEEKEVENTREG_FLAG(71, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK PACK_WEEKEVENTREG_FLAG(71, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD PACK_WEEKEVENTREG_FLAG(71, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK PACK_WEEKEVENTREG_FLAG(71, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK PACK_WEEKEVENTREG_FLAG(72, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT PACK_WEEKEVENTREG_FLAG(72, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK PACK_WEEKEVENTREG_FLAG(72, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK PACK_WEEKEVENTREG_FLAG(72, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK PACK_WEEKEVENTREG_FLAG(72, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK PACK_WEEKEVENTREG_FLAG(72, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK PACK_WEEKEVENTREG_FLAG(72, 0x40)
+
#define WEEKEVENTREG_72_80 PACK_WEEKEVENTREG_FLAG(72, 0x80)
#define WEEKEVENTREG_73_01 PACK_WEEKEVENTREG_FLAG(73, 0x01)
#define WEEKEVENTREG_73_02 PACK_WEEKEVENTREG_FLAG(73, 0x02)
@@ -1214,7 +1184,7 @@ typedef enum {
#define WEEKEVENTREG_75_02 PACK_WEEKEVENTREG_FLAG(75, 0x02)
#define WEEKEVENTREG_75_04 PACK_WEEKEVENTREG_FLAG(75, 0x04)
#define WEEKEVENTREG_75_08 PACK_WEEKEVENTREG_FLAG(75, 0x08)
-#define WEEKEVENTREG_75_10 PACK_WEEKEVENTREG_FLAG(75, 0x10)
+#define WEEKEVENTREG_RECEIVED_ROOM_KEY PACK_WEEKEVENTREG_FLAG(75, 0x10)
#define WEEKEVENTREG_75_20 PACK_WEEKEVENTREG_FLAG(75, 0x20)
#define WEEKEVENTREG_75_40 PACK_WEEKEVENTREG_FLAG(75, 0x40)
#define WEEKEVENTREG_75_80 PACK_WEEKEVENTREG_FLAG(75, 0x80)
@@ -1260,7 +1230,7 @@ typedef enum {
// Aveil has spotted Player
#define WEEKEVENTREG_80_08 PACK_WEEKEVENTREG_FLAG(80, 0x08)
-#define WEEKEVENTREG_80_10 PACK_WEEKEVENTREG_FLAG(80, 0x10)
+#define WEEKEVENTREG_RECEIVED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(80, 0x10)
#define WEEKEVENTREG_80_20 PACK_WEEKEVENTREG_FLAG(80, 0x20)
#define WEEKEVENTREG_80_40 PACK_WEEKEVENTREG_FLAG(80, 0x40)
#define WEEKEVENTREG_80_80 PACK_WEEKEVENTREG_FLAG(80, 0x80)
@@ -1343,11 +1313,17 @@ typedef enum {
#define WEEKEVENTREG_88_08 PACK_WEEKEVENTREG_FLAG(88, 0x08)
#define WEEKEVENTREG_88_10 PACK_WEEKEVENTREG_FLAG(88, 0x10)
#define WEEKEVENTREG_88_20 PACK_WEEKEVENTREG_FLAG(88, 0x20)
-#define WEEKEVENTREG_88_40 PACK_WEEKEVENTREG_FLAG(88, 0x40)
-#define WEEKEVENTREG_88_80 PACK_WEEKEVENTREG_FLAG(88, 0x80)
-#define WEEKEVENTREG_89_01 PACK_WEEKEVENTREG_FLAG(89, 0x01)
-#define WEEKEVENTREG_89_02 PACK_WEEKEVENTREG_FLAG(89, 0x02)
-#define WEEKEVENTREG_89_04 PACK_WEEKEVENTREG_FLAG(89, 0x04)
+
+// Goron shrine Gatekeeper has opened shrine.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE PACK_WEEKEVENTREG_FLAG(88, 0x40)
+// Goron shrine Gatekeeper has opened shrine for player in Human form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN PACK_WEEKEVENTREG_FLAG(88, 0x80)
+// Goron shrine Gatekeeper has opened shrine for player in Deku form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU PACK_WEEKEVENTREG_FLAG(89, 0x01)
+// Goron shrine Gatekeeper has opened shrine for player in Zora form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA PACK_WEEKEVENTREG_FLAG(89, 0x02)
+// Goron shrine Gatekeeper has opened shrine for player in Goron form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON PACK_WEEKEVENTREG_FLAG(89, 0x04)
// Unconfirmed: "Postman has delivered priority mail"
#define WEEKEVENTREG_89_08 PACK_WEEKEVENTREG_FLAG(89, 0x08)
@@ -1381,10 +1357,8 @@ typedef enum {
#define WEEKEVENTREG_91_40 PACK_WEEKEVENTREG_FLAG(91, 0x40)
#define WEEKEVENTREG_91_80 PACK_WEEKEVENTREG_FLAG(91, 0x80)
-// RACE_FLAGS
-//#define WEEKEVENTREG_92_01 PACK_WEEKEVENTREG_FLAG(92, 0x01)
-//#define WEEKEVENTREG_92_02 PACK_WEEKEVENTREG_FLAG(92, 0x02)
-//#define WEEKEVENTREG_92_04 PACK_WEEKEVENTREG_FLAG(92, 0x04)
+// HORSE_RACE_STATE (3 entries)
+// WEEKEVENTREG_92_01 to WEEKEVENTREG_92_04
#define WEEKEVENTREG_92_08 PACK_WEEKEVENTREG_FLAG(92, 0x08)
#define WEEKEVENTREG_92_10 PACK_WEEKEVENTREG_FLAG(92, 0x10)
@@ -1448,7 +1422,7 @@ typedef enum {
#define WEEKEVENTREG_99_40 PACK_WEEKEVENTREG_FLAG(99, 0x40)
#define WEEKEVENTREG_99_80 PACK_WEEKEVENTREG_FLAG(99, 0x80)
-#define WEEKEVENTREG(index) (gSaveContext.save.weekEventReg[(index)])
+#define WEEKEVENTREG(index) (gSaveContext.save.saveInfo.weekEventReg[(index)])
#define GET_WEEKEVENTREG(index) ((void)0, WEEKEVENTREG(index))
#define CHECK_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) & ((flag) & 0xFF))
@@ -1456,34 +1430,52 @@ typedef enum {
#define SET_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) = GET_WEEKEVENTREG((flag) >> 8) | ((flag) & 0xFF))
#define CLEAR_WEEKEVENTREG(flag) (WEEKEVENTREG((flag) >> 8) = GET_WEEKEVENTREG((flag) >> 8) & (u8)~((flag) & 0xFF))
-#define WEEKEVENTREG_RACE_FLAG_END 0
-#define WEEKEVENTREG_RACE_FLAG_START 1
-#define WEEKEVENTREG_RACE_FLAG_2 2
-#define WEEKEVENTREG_RACE_FLAG_3 3
-#define WEEKEVENTREG_RACE_FLAG_4 4
-#define WEEKEVENTREG_RACE_FLAGS 7
+typedef enum {
+ /* 0 */ WEEKEVENTREG_HORSE_RACE_STATE_END,
+ /* 1 */ WEEKEVENTREG_HORSE_RACE_STATE_START,
+ /* 2 */ WEEKEVENTREG_HORSE_RACE_STATE_2,
+ /* 3 */ WEEKEVENTREG_HORSE_RACE_STATE_3,
+ /* 4 */ WEEKEVENTREG_HORSE_RACE_STATE_4,
+ /* 7 */ WEEKEVENTREG_HORSE_RACE_STATE_MAX = 7
+} WeekEventRegHorseRaceState;
-#define GET_WEEKEVENTREG_RACE_FLAGS (WEEKEVENTREG(92) & WEEKEVENTREG_RACE_FLAGS)
+#define GET_WEEKEVENTREG_HORSE_RACE_STATE (WEEKEVENTREG(92) & WEEKEVENTREG_HORSE_RACE_STATE_MAX)
-#define SET_WEEKEVENTREG_RACE_FLAGS(flag) \
- { \
- WEEKEVENTREG(92) &= (u8)~WEEKEVENTREG_RACE_FLAGS; \
- WEEKEVENTREG(92) = WEEKEVENTREG(92) | (u8)((WEEKEVENTREG(92) & ~WEEKEVENTREG_RACE_FLAGS) | (flag)); \
- } \
+#define SET_WEEKEVENTREG_HORSE_RACE_STATE(state) \
+ { \
+ WEEKEVENTREG(92) &= (u8)~WEEKEVENTREG_HORSE_RACE_STATE_MAX; \
+ WEEKEVENTREG(92) = WEEKEVENTREG(92) | (u8)((WEEKEVENTREG(92) & ~WEEKEVENTREG_HORSE_RACE_STATE_MAX) | (state)); \
+ } \
(void)0
+#define GET_WEEKEVENTREG_DOG_RACE_TEXT(index, baseTextId) \
+ (index % 2) ? (baseTextId + (((WEEKEVENTREG(42 + (index / 2))) & 0xF0) >> 4)) \
+ : (baseTextId + ((WEEKEVENTREG(42 + (index / 2))) & 0x0F));
+
+#define SET_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(index, packedOffsets) \
+ { \
+ WEEKEVENTREG(42 + index) = ((void)0, WEEKEVENTREG(42 + index)) | packedOffsets; \
+ }
+
+#define CLEAR_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(index) \
+ { \
+ WEEKEVENTREG(42 + index) = 0; \
+ }
+
/**
* gSaveContext.eventInf
*/
-#define EVENTINF_00 0x00
-#define EVENTINF_01 0x01
-#define EVENTINF_02 0x02
-#define EVENTINF_03 0x03
-#define EVENTINF_04 0x04
-#define EVENTINF_05 0x05
-#define EVENTINF_06 0x06
-#define EVENTINF_07 0x07
+// gSaveContext.eventInf[0] is used to dog race information
+// #define EVENTINF_00 0x00
+// #define EVENTINF_01 0x01
+// #define EVENTINF_02 0x02
+// #define EVENTINF_03 0x03
+// #define EVENTINF_04 0x04
+// #define EVENTINF_05 0x05
+// #define EVENTINF_06 0x06
+// #define EVENTINF_07 0x07
+
#define EVENTINF_10 0x10
#define EVENTINF_11 0x11
#define EVENTINF_12 0x12
@@ -1557,12 +1549,31 @@ typedef enum {
#define CLEAR_EVENTINF(flag) (gSaveContext.eventInf[(flag) >> 4] &= (u8)~(1 << ((flag) & 0xF)))
#define CLEAR_EVENTINF_ALT(flag) (gSaveContext.eventInf[(flag) >> 4] &= ~(1 << ((flag) & 0xF)))
+typedef enum {
+ /* 0 */ EVENTINF_DOG_RACE_STATE_NOT_STARTED,
+ /* 2 */ EVENTINF_DOG_RACE_STATE_STARTED = 2,
+ /* 3 */ EVENTINF_DOG_RACE_STATE_ENDED,
+ /* 7 */ EVENTINF_DOG_RACE_STATE_MAX = 7
+} EventInfDogRaceState;
+
+#define GET_EVENTINF_DOG_RACE_STATE (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX)
+#define SET_EVENTINF_DOG_RACE_STATE(state) \
+ (gSaveContext.eventInf[0] = ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) | (state)))
+
+#define GET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) >> 3)
+#define SET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX(selectedDogIndex) \
+ (gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX) | (selectedDogIndex << 3))
+
+// This is exactly the same as the selected dog index; they never need both of them at the same time.
+#define GET_EVENTINF_DOG_RACE_RACE_STANDING ((gSaveContext.eventInf[0] & (u8)~EVENTINF_DOG_RACE_STATE_MAX) >> 3)
+#define SET_EVENTINF_DOG_RACE_RACE_STANDING(raceStanding) \
+ (gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & EVENTINF_DOG_RACE_STATE_MAX) | (raceStanding << 3))
typedef enum {
/* 0 */ DUNGEON_INDEX_WOODFALL_TEMPLE,
/* 1 */ DUNGEON_INDEX_SNOWHEAD_TEMPLE,
/* 2 */ DUNGEON_INDEX_GREAT_BAY_TEMPLE,
- /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE, // Also applies to Inverted Stone Tower Temple
+ /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE // Also applies to Inverted Stone Tower Temple
} DungeonIndex;
void Sram_ActivateOwl(u8 owlId);
@@ -1572,31 +1583,31 @@ void Sram_IncrementDay(void);
u16 Sram_CalcChecksum(void* data, size_t count);
void Sram_InitNewSave(void);
void Sram_InitDebugSave(void);
-void func_80144A94(SramContext* sramCtx);
+void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx);
void Sram_OpenSave(struct FileSelectState* fileSelect, SramContext* sramCtx);
void func_8014546C(SramContext* sramCtx);
-void func_801457CC(struct FileSelectState* fileSelect, SramContext* sramCtx);
-void func_80146580(struct FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum);
-void func_80146628(struct FileSelectState* fileSelect2, SramContext* sramCtx);
+void func_801457CC(struct GameState* gameState, SramContext* sramCtx);
+void Sram_EraseSave(struct FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum);
+void Sram_CopySave(struct FileSelectState* fileSelect2, SramContext* sramCtx);
void Sram_InitSave(struct FileSelectState* fileSelect2, SramContext* sramCtx);
-void func_80146DF8(SramContext* sramCtx);
+void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx);
void Sram_InitSram(struct GameState* gameState, SramContext* sramCtx);
void Sram_Alloc(struct GameState* gameState, SramContext* sramCtx);
void Sram_SaveSpecialEnterClockTown(struct PlayState* play);
void Sram_SaveSpecialNewDay(struct PlayState* play);
-void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages);
-void func_80147020(SramContext* sramCtx);
-void func_80147068(SramContext* sramCtx);
-void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages);
-void func_80147150(SramContext* sramCtx);
-void func_80147198(SramContext* sramCtx);
+void Sram_SetFlashPagesDefault(SramContext* sramCtx, u32 curPage, u32 numPages);
+void Sram_StartWriteToFlashDefault(SramContext* sramCtx);
+void Sram_UpdateWriteToFlashDefault(SramContext* sramCtx);
+void Sram_SetFlashPagesOwlSave(SramContext* sramCtx, s32 curPage, s32 numPages);
+void Sram_StartWriteToFlashOwlSave(SramContext* sramCtx);
+void Sram_UpdateWriteToFlashOwlSave(SramContext* sramCtx);
-extern s32 D_801C6798[];
+extern u32 gSramSlotOffsets[];
extern u8 gAmmoItems[];
-extern s32 D_801C67C8[];
-extern s32 D_801C67F0[];
-extern s32 D_801C6818[];
-extern s32 D_801C6840[];
-extern s32 D_801C6850[];
+extern s32 gFlashSaveStartPages[];
+extern s32 gFlashSaveNumPages[];
+extern s32 gFlashSpecialSaveNumPages[];
+extern s32 gFlashOwlSaveStartPages[];
+extern s32 gFlashOwlSaveNumPages[];
#endif
diff --git a/include/z64scene.h b/include/z64scene.h
index 84b405b90..5505f08e3 100644
--- a/include/z64scene.h
+++ b/include/z64scene.h
@@ -130,8 +130,8 @@ typedef struct {
/* 0x1 */ u8 data1;
/* 0x2 */ UNK_TYPE1 pad2[2];
/* 0x4 */ u8 skyboxId;
- /* 0x5 */ u8 unk5;
- /* 0x6 */ u8 unk6;
+ /* 0x5 */ u8 skyboxConfig;
+ /* 0x6 */ u8 envLightMode;
} SCmdSkyboxSettings; // size = 0x7
typedef struct {
@@ -177,9 +177,9 @@ typedef struct {
typedef struct {
/* 0x0 */ u8 code;
- /* 0x1 */ u8 sceneCsCount;
+ /* 0x1 */ u8 scriptListCount;
/* 0x4 */ void* segment;
-} SCmdCutsceneList; // size = 0x8
+} SCmdCsScriptList; // size = 0x8
typedef struct {
/* 0x0 */ u8 code;
@@ -202,7 +202,7 @@ typedef struct {
/* 0x0 */ u8 code;
/* 0x1 */ u8 num;
/* 0x4 */ void* segment;
-} SCmdCutsceneActorList; // size = 0x8
+} SCmdCutsceneList; // size = 0x8
typedef struct {
/* 0x0 */ u8 code;
@@ -469,10 +469,13 @@ typedef struct {
/* 0x00C */ ObjectStatus status[OBJECT_EXCHANGE_BANK_MAX];
} ObjectContext; // size = 0x958
+#define PATH_INDEX_NONE -1
+#define ADDITIONAL_PATH_INDEX_NONE (u8)-1
+
typedef struct {
- /* 0x0 */ u8 count; // number of points in the path
- /* 0x1 */ u8 unk1;
- /* 0x2 */ s16 unk2;
+ /* 0x0 */ u8 count; // Number of points in the path
+ /* 0x1 */ u8 additionalPathIndex;
+ /* 0x2 */ s16 customValue; // Path specific to help distinguish different paths
/* 0x4 */ Vec3s* points; // Segment Address to the array of points
} Path; // size = 0x8
@@ -531,11 +534,11 @@ typedef union {
/* Command: 0x14 */ SCmdEndMarker endMarker;
/* Command: 0x15 */ SCmdSoundSettings soundSettings;
/* Command: 0x16 */ SCmdEchoSettings echoSettings;
- /* Command: 0x17 */ SCmdCutsceneList cutsceneList;
+ /* Command: 0x17 */ SCmdCsScriptList scriptList;
/* Command: 0x18 */ SCmdAltHeaders altHeaders;
/* Command: 0x19 */ SCmdRegionVisited regionVisited;
/* Command: 0x1A */ SCmdTextureAnimations textureAnimations;
- /* Command: 0x1B */ SCmdCutsceneActorList cutsceneActorList;
+ /* Command: 0x1B */ SCmdCutsceneList cutsceneList;
/* Command: 0x1C */ SCmdMinimapSettings minimapSettings;
/* Command: 0x1D */ // Unused
/* Command: 0x1E */ SCmdMinimapChests minimapChests;
@@ -584,123 +587,17 @@ typedef enum {
/* 6 */ TINGLE_MAP_MAX
} TingleMapId;
-typedef enum {
- /* 0x00 */ SCENE_20SICHITAI2, // Southern Swamp (Clear)
- /* 0x01 */ SCENE_UNSET_1,
- /* 0x02 */ SCENE_UNSET_2,
- /* 0x03 */ SCENE_UNSET_3,
- /* 0x04 */ SCENE_UNSET_4,
- /* 0x05 */ SCENE_UNSET_5,
- /* 0x06 */ SCENE_UNSET_6,
- /* 0x07 */ SCENE_KAKUSIANA, // Lone Peak Shrine & Grottos
- /* 0x08 */ SCENE_SPOT00, // Cutscene Scene
- /* 0x09 */ SCENE_UNSET_9,
- /* 0x0A */ SCENE_WITCH_SHOP, // Magic Hags' Potion Shop
- /* 0x0B */ SCENE_LAST_BS, // Majora's Lair
- /* 0x0C */ SCENE_HAKASHITA, // Beneath the Graveyard
- /* 0x0D */ SCENE_AYASHIISHOP, // Curiosity Shop
- /* 0x0E */ SCENE_UNSET_E,
- /* 0x0F */ SCENE_UNSET_F,
- /* 0x10 */ SCENE_OMOYA, // Mama's House (Ranch House in PAL) & Barn
- /* 0x11 */ SCENE_BOWLING, // Honey & Darling's Shop
- /* 0x12 */ SCENE_SONCHONOIE, // The Mayor's Residence
- /* 0x13 */ SCENE_IKANA, // Ikana Canyon
- /* 0x14 */ SCENE_KAIZOKU, // Pirates' Fortress
- /* 0x15 */ SCENE_MILK_BAR, // Milk Bar
- /* 0x16 */ SCENE_INISIE_N, // Stone Tower Temple
- /* 0x17 */ SCENE_TAKARAYA, // Treasure Chest Shop
- /* 0x18 */ SCENE_INISIE_R, // Inverted Stone Tower Temple
- /* 0x19 */ SCENE_OKUJOU, // Clock Tower Rooftop
- /* 0x1A */ SCENE_OPENINGDAN, // Before Clock Town
- /* 0x1B */ SCENE_MITURIN, // Woodfall Temple
- /* 0x1C */ SCENE_13HUBUKINOMITI, // Path to Mountain Village
- /* 0x1D */ SCENE_CASTLE, // Ancient Castle of Ikana
- /* 0x1E */ SCENE_DEKUTES, // Deku Scrub Playground
- /* 0x1F */ SCENE_MITURIN_BS, // Odolwa's Lair
- /* 0x20 */ SCENE_SYATEKI_MIZU, // Town Shooting Gallery
- /* 0x21 */ SCENE_HAKUGIN, // Snowhead Temple
- /* 0x22 */ SCENE_ROMANYMAE, // Milk Road
- /* 0x23 */ SCENE_PIRATE, // Pirates' Fortress Interior
- /* 0x24 */ SCENE_SYATEKI_MORI, // Swamp Shooting Gallery
- /* 0x25 */ SCENE_SINKAI, // Pinnacle Rock
- /* 0x26 */ SCENE_YOUSEI_IZUMI, // Fairy's Fountain
- /* 0x27 */ SCENE_KINSTA1, // Swamp Spider House
- /* 0x28 */ SCENE_KINDAN2, // Oceanside Spider House
- /* 0x29 */ SCENE_TENMON_DAI, // Astral Observatory
- /* 0x2A */ SCENE_LAST_DEKU, // Moon Deku Trial
- /* 0x2B */ SCENE_22DEKUCITY, // Deku Palace
- /* 0x2C */ SCENE_KAJIYA, // Mountain Smithy
- /* 0x2D */ SCENE_00KEIKOKU, // Termina Field
- /* 0x2E */ SCENE_POSTHOUSE, // Post Office
- /* 0x2F */ SCENE_LABO, // Marine Research Lab
- /* 0x30 */ SCENE_DANPEI2TEST, // Beneath the Graveyard (Day 3) and Dampe's House
- /* 0x31 */ SCENE_UNSET_31,
- /* 0x32 */ SCENE_16GORON_HOUSE, // Goron Shrine
- /* 0x33 */ SCENE_33ZORACITY, // Zora Hall
- /* 0x34 */ SCENE_8ITEMSHOP, // Trading Post
- /* 0x35 */ SCENE_F01, // Romani Ranch
- /* 0x36 */ SCENE_INISIE_BS, // Twinmold's Lair
- /* 0x37 */ SCENE_30GYOSON, // Great Bay Coast
- /* 0x38 */ SCENE_31MISAKI, // Zora Cape
- /* 0x39 */ SCENE_TAKARAKUJI, // Lottery Shop
- /* 0x3A */ SCENE_UNSET_3A,
- /* 0x3B */ SCENE_TORIDE, // Pirates' Fortress Moat
- /* 0x3C */ SCENE_FISHERMAN, // Fisherman's Hut
- /* 0x3D */ SCENE_GORONSHOP, // Goron Shop
- /* 0x3E */ SCENE_DEKU_KING, // Deku King's Chamber
- /* 0x3F */ SCENE_LAST_GORON, // Moon Goron Trial
- /* 0x40 */ SCENE_24KEMONOMITI, // Road to Southern Swamp
- /* 0x41 */ SCENE_F01_B, // Doggy Racetrack
- /* 0x42 */ SCENE_F01C, // Cucco Shack
- /* 0x43 */ SCENE_BOTI, // Ikana Graveyard
- /* 0x44 */ SCENE_HAKUGIN_BS, // Goht's Lair
- /* 0x45 */ SCENE_20SICHITAI, // Southern Swamp (poison)
- /* 0x46 */ SCENE_21MITURINMAE, // Woodfall
- /* 0x47 */ SCENE_LAST_ZORA, // Moon Zora Trial
- /* 0x48 */ SCENE_11GORONNOSATO2, // Goron Village (spring)
- /* 0x49 */ SCENE_SEA, // Great Bay Temple
- /* 0x4A */ SCENE_35TAKI, // Waterfall Rapids
- /* 0x4B */ SCENE_REDEAD, // Beneath the Well
- /* 0x4C */ SCENE_BANDROOM, // Zora Hall Rooms
- /* 0x4D */ SCENE_11GORONNOSATO, // Goron Village (winter)
- /* 0x4E */ SCENE_GORON_HAKA, // Goron Graveyard
- /* 0x4F */ SCENE_SECOM, // Sakon's Hideout
- /* 0x50 */ SCENE_10YUKIYAMANOMURA, // Mountain Village (winter)
- /* 0x51 */ SCENE_TOUGITES, // Ghost Hut
- /* 0x52 */ SCENE_DANPEI, // Deku Shrine
- /* 0x53 */ SCENE_IKANAMAE, // Road to Ikana
- /* 0x54 */ SCENE_DOUJOU, // Swordsman's School
- /* 0x55 */ SCENE_MUSICHOUSE, // Music Box House
- /* 0x56 */ SCENE_IKNINSIDE, // Igos du Ikana's Lair
- /* 0x57 */ SCENE_MAP_SHOP, // Tourist Information
- /* 0x58 */ SCENE_F40, // Stone Tower
- /* 0x59 */ SCENE_F41, // Inverted Stone Tower
- /* 0x5A */ SCENE_10YUKIYAMANOMURA2, // Mountain Village (spring)
- /* 0x5B */ SCENE_14YUKIDAMANOMITI, // Path to Snowhead
- /* 0x5C */ SCENE_12HAKUGINMAE, // Snowhead
- /* 0x5D */ SCENE_17SETUGEN, // Path to Goron Village (winter)
- /* 0x5E */ SCENE_17SETUGEN2, // Path to Goron Village (spring)
- /* 0x5F */ SCENE_SEA_BS, // Gyorg's Lair
- /* 0x60 */ SCENE_RANDOM, // Secret Shrine
- /* 0x61 */ SCENE_YADOYA, // Stock Pot Inn
- /* 0x62 */ SCENE_KONPEKI_ENT, // Great Bay Cutscene
- /* 0x63 */ SCENE_INSIDETOWER, // Clock Tower Interior
- /* 0x64 */ SCENE_26SARUNOMORI, // Woods of Mystery
- /* 0x65 */ SCENE_LOST_WOODS, // Lost Woods (Intro)
- /* 0x66 */ SCENE_LAST_LINK, // Moon Link Trial
- /* 0x67 */ SCENE_SOUGEN, // The Moon
- /* 0x68 */ SCENE_BOMYA, // Bomb Shop
- /* 0x69 */ SCENE_KYOJINNOMA, // Giants' Chamber
- /* 0x6A */ SCENE_KOEPONARACE, // Gorman Track
- /* 0x6B */ SCENE_GORONRACE, // Goron Racetrack
- /* 0x6C */ SCENE_TOWN, // East Clock Town
- /* 0x6D */ SCENE_ICHIBA, // West Clock Town
- /* 0x6E */ SCENE_BACKTOWN, // North Clock Town
- /* 0x6F */ SCENE_CLOCKTOWER, // South Clock Town
- /* 0x70 */ SCENE_ALLEY, // Laundry Pool
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, _restrictionFlags, _persistentCycleFlags) enumValue,
+#define DEFINE_SCENE_UNSET(enumValue) enumValue,
+
+typedef enum SceneId {
+ #include "tables/scene_table.h"
/* 0x71 */ SCENE_MAX
} SceneId;
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
typedef enum {
/* 0x00 */ ENTR_SCENE_MAYORS_RESIDENCE,
/* 0x01 */ ENTR_SCENE_MAJORAS_LAIR,
@@ -822,6 +719,17 @@ typedef enum {
*/
#define ENTRANCE(scene, spawn) ((((ENTR_SCENE_##scene) & 0x7F) << 9) | (((spawn) & 0x1F) << 4))
+#define ENTR_LOAD_OPENING -1
+
+/*
+* Entrances used in cutscene destination. Includes scene layer that's immediately applied to `nextCutsceneIndex` and removed.
+* See `CutsceneScriptEntry.nextEntrance`
+* 0xFE00: Index into sSceneEntranceTable (Scene)
+* 0x01F0: Index into the scenes specific entrance table (Spawn)
+* 0x000F: Index into the specific entrance table (Layer)
+*/
+#define CS_ENTRANCE(scene, spawn, layer) ((((ENTR_SCENE_##scene) & 0x7F) << 9) | (((spawn) & 0x1F) << 4) | ((layer) & 0xF))
+
// SceneTableEntry draw configs
typedef enum {
/* 0 */ SCENE_DRAW_CFG_DEFAULT,
@@ -867,7 +775,7 @@ typedef enum {
/* 0x14 */ SCENE_CMD_ID_END,
/* 0x15 */ SCENE_CMD_ID_SOUND_SETTINGS,
/* 0x16 */ SCENE_CMD_ID_ECHO_SETTINGS,
- /* 0x17 */ SCENE_CMD_ID_CUTSCENE_LIST,
+ /* 0x17 */ SCENE_CMD_ID_CUTSCENE_SCRIPT_LIST,
/* 0x18 */ SCENE_CMD_ID_ALTERNATE_HEADER_LIST,
/* 0x19 */ SCENE_CMD_ID_SET_REGION_VISITED,
/* 0x1A */ SCENE_CMD_ID_ANIMATED_MATERIAL_LIST,
@@ -952,21 +860,20 @@ typedef enum {
#define SCENE_CMD_ECHO_SETTINGS(echo) \
{ SCENE_CMD_ID_ECHO_SETTINGS, 0, CMD_BBBB(0, 0, 0, echo) }
-#define SCENE_CMD_CUTSCENE_LIST(numCutscene, cutsceneList) \
- { SCENE_CMD_ID_CUTSCENE_LIST, numCutscene, CMD_PTR(cutsceneList) }
+#define SCENE_CMD_CUTSCENE_SCRIPT_LIST(numEntries, scriptList) \
+ { SCENE_CMD_ID_CUTSCENE_SCRIPT_LIST, numEntries, CMD_PTR(scriptList) }
#define SCENE_CMD_ALTERNATE_HEADER_LIST(alternateHeaderList) \
{ SCENE_CMD_ID_ALTERNATE_HEADER_LIST, 0, CMD_PTR(alternateHeaderList) }
-#define SCENE_CMD_MISC_SETTINGS SCENE_CMD_SET_REGION_VISITED // TODO: ZAPD Capatability
#define SCENE_CMD_SET_REGION_VISITED() \
{ SCENE_CMD_ID_SET_REGION_VISITED, 0, CMD_W(0) }
#define SCENE_CMD_ANIMATED_MATERIAL_LIST(matAnimList) \
{ SCENE_CMD_ID_ANIMATED_MATERIAL_LIST, 0, CMD_PTR(matAnimList) }
-#define SCENE_CMD_ACTOR_CUTSCENE_LIST(actorCutsceneCount, actorCutsceneList) \
- { SCENE_CMD_ID_ACTOR_CUTSCENE_LIST, actorCutsceneCount, CMD_PTR(actorCutsceneList) }
+#define SCENE_CMD_ACTOR_CUTSCENE_LIST(numEntries, actorCutsceneList) \
+ { SCENE_CMD_ID_ACTOR_CUTSCENE_LIST, numEntries, CMD_PTR(actorCutsceneList) }
#define SCENE_CMD_MINIMAP_INFO(minimapInfo) \
{ SCENE_CMD_ID_MINIMAP_INFO, 0, CMD_PTR(minimapInfo) }
@@ -974,4 +881,8 @@ typedef enum {
#define SCENE_CMD_MINIMAP_COMPASS_ICON_INFO(compassIconCount, compassIconInfo) \
{ SCENE_CMD_ID_MINIMAP_COMPASS_ICON_INFO, compassIconCount, CMD_PTR(compassIconInfo) }
+ // TODO: ZAPD Capatability
+#define SCENE_CMD_MISC_SETTINGS SCENE_CMD_SET_REGION_VISITED
+#define SCENE_CMD_CUTSCENE_LIST SCENE_CMD_CUTSCENE_SCRIPT_LIST
+
#endif
diff --git a/include/z64schedule.h b/include/z64schedule.h
index f3a703f3c..07a942e90 100644
--- a/include/z64schedule.h
+++ b/include/z64schedule.h
@@ -50,13 +50,13 @@ typedef enum {
/* 0x0F */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, // Branches if the current time is less than the command time, short range branch
/* 0x10 */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, // Branches if the current time is less than the command time, long range branch
/* 0x11 */ SCHEDULE_CMD_ID_BRANCH_S, // Always branch, short range branch
- /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L, // Always branch, long range branch
+ /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L // Always branch, long range branch
} ScheduleCommandId;
typedef enum {
/* 0 */ SCHEDULE_CHECK_MISC_ROOM_KEY,
/* 1 */ SCHEDULE_CHECK_MISC_LETTER_TO_KAFEI,
- /* 2 */ SCHEDULE_CHECK_MISC_MASK_ROMANI,
+ /* 2 */ SCHEDULE_CHECK_MISC_MASK_ROMANI
} ScheduleCheckMisc;
typedef struct {
diff --git a/include/z64subs.h b/include/z64subs.h
index cc0e7ba2f..768f81079 100644
--- a/include/z64subs.h
+++ b/include/z64subs.h
@@ -11,9 +11,9 @@ extern Vec3f gOneVec3f;
#define SUBS_TIME_PATHING_ORDER 3
typedef enum {
- /* 0 */ SUBS_CUTSCENE_SET_UNK_LINK_FIELDS,
+ /* 0 */ SUBS_CUTSCENE_WITH_PLAYER,
/* 1 */ SUBS_CUTSCENE_NORMAL,
- /* 2 */ SUBS_CUTSCENE_SET_FLAG
+ /* 2 */ SUBS_CUTSCENE_WITH_PLAYER_SET_FLAG
} SubSCutsceneType;
//! TODO: rename based on func_8013E748 and func_800B8500
@@ -108,7 +108,7 @@ s32 SubS_ChangeAnimationByInfoS(SkelAnime* skelAnime, AnimationInfoS* animationI
s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex);
-Path* SubS_GetDayDependentPath(struct PlayState* play, u8 pathIndex, u8 max, s32* startPointIndex);
+Path* SubS_GetDayDependentPath(struct PlayState* play, u8 pathIndex, u8 pathIndexNone, s32* startPointIndex);
s32 SubS_WeightPathing_ComputePoint(Path* path, s32 waypoint, Vec3f* point, f32 progress, s32 direction);
s32 SubS_WeightPathing_Move(Actor* actor, Path* path, s32* waypoint, f32* progress, s32 direction, s32 returnStart);
@@ -126,7 +126,7 @@ s32 SubS_TrackPoint(Vec3f* target, Vec3f* focusPos, Vec3s* shapeRot, Vec3s* trac
s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB);
-Path* SubS_GetPathByIndex(struct PlayState* play, s16 pathIndex, s16 max);
+Path* SubS_GetPathByIndex(struct PlayState* play, s16 pathIndex, s16 pathIndexNone);
s32 SubS_CopyPointFromPath(Path* path, s32 pointIndex, Vec3f* dst);
s16 SubS_GetDistSqAndOrientPoints(Vec3f* vecA, Vec3f* vecB, f32* distSq);
s32 SubS_MoveActorToPoint(Actor* actor, Vec3f* point, s16 rotStep);
@@ -153,8 +153,8 @@ s32 SubS_ActorPathing_SetNextPoint(struct PlayState* play, ActorPathing* actorPa
void SubS_ChangeAnimationBySpeedInfo(SkelAnime* skelAnime, AnimationSpeedInfo* animationInfo, s32 nextAnimIndex, s32* curAnimIndex);
-s32 SubS_StartActorCutscene(Actor* actor, s16 nextCutscene, s16 curCutscene, s32 type);
-s32 SubS_FillCutscenesList(Actor* actor, s16 cutscenes[], s16 numCutscenes);
+s32 SubS_StartCutscene(Actor* actor, s16 nextCsId, s16 curCsId, s32 type);
+s32 SubS_FillCutscenesList(Actor* actor, s16 csIdList[], s16 numCutscenes);
void SubS_ConstructPlane(Vec3f* point, Vec3f* unitVec, Vec3s* rot, Plane* plane);
s32 SubS_LineSegVsPlane(Vec3f* point, Vec3s* rot, Vec3f* unitVec, Vec3f* linePointA, Vec3f* linePointB, Vec3f* intersect);
diff --git a/include/z64transition.h b/include/z64transition.h
index 741f344d7..fe6027a9f 100644
--- a/include/z64transition.h
+++ b/include/z64transition.h
@@ -2,6 +2,7 @@
#define Z64TRANSITION_H
#include "ultra64.h"
+#include "libc/stdint.h"
#include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
#include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
#include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
@@ -67,7 +68,7 @@ typedef struct {
typedef enum {
/* 1 */ TRANS_INSTANCE_TYPE_FILL_OUT = 1,
- /* 2 */ TRANS_INSTANCE_TYPE_FILL_IN,
+ /* 2 */ TRANS_INSTANCE_TYPE_FILL_IN
} TransitionInstanceType;
#define TRANS_INSTANCE_TYPE_FADE_FLASH 3
@@ -164,31 +165,34 @@ typedef enum {
/* 86 */ TRANS_TYPE_86 = 86
} TransitionType;
-typedef enum {
- /* 0 */ FBDEMO_FADE,
- /* 1 */ FBDEMO_TRIFORCE,
- /* 2 */ FBDEMO_WIPE1,
- /* 3 */ FBDEMO_WIPE3,
- /* 4 */ FBDEMO_WIPE4,
- /* 5 */ FBDEMO_CIRCLE,
- /* 6 */ FBDEMO_WIPE5
+#define DEFINE_TRANSITION(enumValue, _structName, _instanceName, _name) enumValue,
+#define DEFINE_TRANSITION_INTERNAL(enumValue, _structName, _instanceName) enumValue,
+
+typedef enum FbDemoType {
+ #include "tables/transition_table.h"
+ /* 7 */ FBDEMO_MAX
} FbDemoType;
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
#define TRANS_NEXT_TYPE_DEFAULT 0xFF
+#define DEFINE_TRANSITION(_enumValue, structName, instanceName, _name) structName instanceName;
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, instanceName) structName instanceName;
+
+typedef union TransitionInstance {
+ #include "tables/transition_table.h"
+} TransitionInstance; // size = 0x218
+
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
typedef struct {
/* 0x000 */ s16 transitionType;
/* 0x002 */ s8 fbdemoType;
/* 0x003 */ char unk_003[0x5];
- /* 0x008 */ union {
- TransitionFade fade;
- TransitionCircle circle;
- TransitionTriforce triforce;
- TransitionWipe1 wipe1;
- TransitionWipe3 wipe3;
- TransitionWipe4 wipe4;
- TransitionWipe5 wipe5;
- } instanceData;
+ /* 0x008 */ TransitionInstance instanceData;
/* 0x220 */ char unk_220[0x10];
/* 0x230 */ void* (*init)(void* transition);
/* 0x234 */ void (*destroy)(void* transition);
diff --git a/include/z_fireobj.h b/include/z_fireobj.h
index 7bd58d80a..6fe0639bc 100644
--- a/include/z_fireobj.h
+++ b/include/z_fireobj.h
@@ -61,7 +61,7 @@ typedef enum FireState {
/* 0 */ FIRE_STATE_GROWING,
/* 1 */ FIRE_STATE_SHRINKING,
/* 2 */ FIRE_STATE_FULLY_LIT,
- /* 3 */ FIRE_STATE_NOT_LIT,
+ /* 3 */ FIRE_STATE_NOT_LIT
} FireState;
#define FIRE_FLAG_WATER_EXTINGUISHABLE (1 << 0)
diff --git a/include/z_prenmi.h b/include/z_prenmi.h
index 04c3f5f16..7be3eb16f 100644
--- a/include/z_prenmi.h
+++ b/include/z_prenmi.h
@@ -1,15 +1,15 @@
#ifndef Z64PRENMI_H
#define Z64PRENMI_H
-#include "global.h"
-
-void PreNMI_Destroy(GameState* thisx);
-void PreNMI_Init(GameState* thisx);
+#include "z64game.h"
typedef struct {
/* 0x00 */ GameState state;
/* 0xA4 */ u32 timer;
- /* 0xA8 */ UNK_TYPE4 unkA8;
+ /* 0xA8 */ s32 unk_A8;
} PreNMIState; // size = 0xAC
+void PreNMI_Destroy(GameState* thisx);
+void PreNMI_Init(GameState* thisx);
+
#endif
diff --git a/include/z_title_setup.h b/include/z_title_setup.h
index 3b299af97..1bd7c7d7d 100644
--- a/include/z_title_setup.h
+++ b/include/z_title_setup.h
@@ -1,13 +1,13 @@
#ifndef Z64TITLE_SETUP_H
#define Z64TITLE_SETUP_H
-#include "global.h"
-
-void Setup_Destroy(GameState* gameState);
-void Setup_Init(GameState* thisx);
+#include "z64game.h"
typedef struct {
/* 0x00 */ GameState state;
} SetupState; // size = 0xA4
+void Setup_Destroy(GameState* gameState);
+void Setup_Init(GameState* thisx);
+
#endif
diff --git a/spec b/spec
index 9b8ec1486..0666890ee 100644
--- a/spec
+++ b/spec
@@ -36,7 +36,7 @@ beginseg
include "build/data/boot/gfxprint.data.o"
include "build/src/boot_O2/mtxuty-cvt.o"
include "build/src/boot_O2/assert.o"
- include "build/src/boot_O2/boot_800862E0.o"
+ include "build/src/boot_O2/system_heap.o"
include "build/src/boot_O2/padsetup.o"
include "build/src/boot_O2/boot_80086760.o"
include "build/asm/boot/fp.text.o"
@@ -325,7 +325,8 @@ beginseg
name "icon_item_vtx_static"
compress
romalign 0x1000
- include "build/baserom/icon_item_vtx_static.o"
+ include "build/assets/interface/icon_item_vtx_static/icon_item_vtx_static.o"
+ number 11
endseg
beginseg
@@ -372,7 +373,8 @@ endseg
beginseg
name "schedule_static"
compress
- include "build/baserom/schedule_static.o"
+ include "build/assets/interface/schedule_static/schedule_static.o"
+ number 8
endseg
beginseg
@@ -470,11 +472,9 @@ beginseg
include "build/data/code/z_eventmgr.bss.o"
include "build/src/code/z_fcurve_data.o"
include "build/src/code/z_fcurve_data_skelanime.o"
- include "build/data/code/code_801BD830.data.o"
include "build/src/code/z_fireobj.o"
include "build/src/code/z_game_dlftbls.o"
include "build/src/code/z_horse.o"
- include "build/data/code/z_horse.data.o"
include "build/src/code/z_jpeg.o"
include "build/src/code/z_kaleido_setup.o"
include "build/src/code/z_kanfont.o"
@@ -523,11 +523,10 @@ beginseg
include "build/src/code/z_rumble.o"
include "build/src/code/z_view.o"
include "build/src/code/z_vimode.o"
- include "build/src/code/code_80140CE0.o"
- include "build/data/code/code_80140CE0.data.o"
+ include "build/src/code/z_viscvg.o"
include "build/src/code/code_80140E80.o"
include "build/src/code/z_vismono.o"
- include "build/src/code/code_801420C0.o"
+ include "build/src/code/z_viszbuf.o"
include "build/src/code/z_vr_box.o"
include "build/src/code/z_vr_box_draw.o"
include "build/src/code/z_sram_NES.o"
@@ -539,8 +538,8 @@ beginseg
include "build/src/code/z_message_staff.o"
include "build/src/code/z_player_call.o"
include "build/src/code/z_shrink_window.o"
- include "build/src/code/db_camera.o"
- include "build/data/code/db_camera.bss.o"
+ include "build/src/code/cutscene_camera.o"
+ include "build/data/code/cutscene_camera.bss.o"
include "build/src/code/z_kaleido_manager.o"
include "build/src/code/z_kaleido_scope_call.o"
include "build/src/code/z_fbdemo_dlftbls.o"
@@ -550,7 +549,6 @@ beginseg
include "build/src/code/z_overlay.o"
include "build/src/code/z_play.o"
include "build/src/code/z_play_hireso.o"
- include "build/data/code/z_play_hireso.data.o"
include "build/src/code/PreRender.o"
include "build/data/code/PreRender.bss.o"
include "build/src/code/TwoHeadGfxArena.o"
@@ -568,14 +566,12 @@ beginseg
include "build/data/code/main.data.o"
include "build/data/code/main.bss.o"
include "build/src/code/padmgr.o"
- include "build/data/code/padmgr.data.o"
include "build/src/code/sched.o"
include "build/src/code/speed_meter.o"
include "build/data/code/speed_meter.data.o"
include "build/data/code/speed_meter.bss.o"
include "build/src/code/su_mtx.o"
include "build/src/code/sys_cfb.o"
- include "build/data/code/sys_cfb.bss.o"
include "build/src/code/sys_cmpdma.o"
include "build/src/code/sys_initial_check.o"
include "build/src/code/sys_math.o"
@@ -591,7 +587,6 @@ beginseg
include "build/src/code/c_keyframe.o"
include "build/src/code/sys_slowly.o"
include "build/src/code/sys_flashrom.o"
- include "build/data/code/sys_flashrom.bss.o"
include "build/asm/code/code_80185F90.text.o" // handwritten
include "build/src/libultra/flash/osFlash.o"
pad_text
@@ -669,12 +664,15 @@ endseg
beginseg
name "ovl_file_choose"
compress
+ include "build/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.o"
+ include "build/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.o"
include "build/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.o"
- include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.o"
include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.o"
- include "build/data/ovl_file_choose/ovl_file_choose.data.o"
- include "build/data/ovl_file_choose/ovl_file_choose.bss.o"
- include "build/data/ovl_file_choose/ovl_file_choose.reloc.o"
+ #ifdef NON_MATCHING
+ include "build/src/overlays/gamestates/ovl_file_choose/ovl_file_choose_reloc.o"
+ #else
+ include "build/data/ovl_file_choose/ovl_file_choose.reloc.o"
+ #endif
endseg
beginseg
@@ -694,17 +692,14 @@ beginseg
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.bss.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.reloc.o"
+ include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/ovl_kaleido_scope_reloc.o"
endseg
beginseg
name "ovl_player_actor"
compress
include "build/src/overlays/actors/ovl_player_actor/z_player.o"
- include "build/data/ovl_player_actor/ovl_player_actor.data.o"
- include "build/data/ovl_player_actor/ovl_player_actor.bss.o"
- include "build/data/ovl_player_actor/ovl_player_actor.reloc.o"
+ include "build/src/overlays/actors/ovl_player_actor/ovl_player_actor_reloc.o"
endseg
beginseg
@@ -999,8 +994,7 @@ beginseg
name "ovl_Item_B_Heart"
compress
include "build/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.o"
- include "build/data/ovl_Item_B_Heart/ovl_Item_B_Heart.data.o"
- include "build/data/ovl_Item_B_Heart/ovl_Item_B_Heart.reloc.o"
+ include "build/src/overlays/actors/ovl_Item_B_Heart/ovl_Item_B_Heart_reloc.o"
endseg
beginseg
@@ -1035,8 +1029,7 @@ beginseg
name "ovl_Bg_Keikoku_Spr"
compress
include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.data.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr_reloc.o"
endseg
beginseg
@@ -1127,11 +1120,7 @@ beginseg
name "ovl_Object_Kankyo"
compress
include "build/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_Object_Kankyo/ovl_Object_Kankyo_reloc.o"
-#else
- include "build/data/ovl_Object_Kankyo/ovl_Object_Kankyo.reloc.o"
-#endif
endseg
beginseg
@@ -1531,11 +1520,7 @@ beginseg
name "ovl_En_Kanban"
compress
include "build/src/overlays/actors/ovl_En_Kanban/z_en_kanban.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Kanban/ovl_En_Kanban_reloc.o"
-#else
- include "build/data/ovl_En_Kanban/ovl_En_Kanban.reloc.o"
-#endif
endseg
beginseg
@@ -1655,9 +1640,7 @@ beginseg
name "ovl_Bg_F40_Swlift"
compress
include "build/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.data.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.bss.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift_reloc.o"
endseg
beginseg
@@ -2418,11 +2401,7 @@ beginseg
name "ovl_En_Go"
compress
include "build/src/overlays/actors/ovl_En_Go/z_en_go.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Go/ovl_En_Go_reloc.o"
-#else
- include "build/data/ovl_En_Go/ovl_En_Go.reloc.o"
-#endif
endseg
beginseg
@@ -2556,9 +2535,7 @@ beginseg
name "ovl_En_Slime"
compress
include "build/src/overlays/actors/ovl_En_Slime/z_en_slime.o"
- include "build/data/ovl_En_Slime/ovl_En_Slime.data.o"
- include "build/data/ovl_En_Slime/ovl_En_Slime.bss.o"
- include "build/data/ovl_En_Slime/ovl_En_Slime.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Slime/ovl_En_Slime_reloc.o"
endseg
beginseg
@@ -2963,11 +2940,7 @@ beginseg
name "ovl_En_Tru"
compress
include "build/src/overlays/actors/ovl_En_Tru/z_en_tru.o"
- #ifdef NON_MATCHING
- include "build/src/overlays/actors/ovl_En_Tru/ovl_En_Tru_reloc.o"
- #else
- include "build/data/ovl_En_Tru/ovl_En_Tru.reloc.o"
- #endif
+ include "build/src/overlays/actors/ovl_En_Tru/ovl_En_Tru_reloc.o"
endseg
beginseg
@@ -3200,16 +3173,14 @@ beginseg
name "ovl_fbdemo_wipe1"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.o"
- include "build/data/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.data.o"
- include "build/data/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1_reloc.o"
endseg
beginseg
name "ovl_fbdemo_wipe3"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.data.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3_reloc.o"
endseg
beginseg
@@ -3596,8 +3567,7 @@ beginseg
name "ovl_Bg_Tobira01"
compress
include "build/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.o"
- include "build/data/ovl_Bg_Tobira01/ovl_Bg_Tobira01.data.o"
- include "build/data/ovl_Bg_Tobira01/ovl_Bg_Tobira01.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Tobira01/ovl_Bg_Tobira01_reloc.o"
endseg
beginseg
@@ -4633,8 +4603,7 @@ beginseg
name "ovl_Eff_Stk"
compress
include "build/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.o"
- include "build/data/ovl_Eff_Stk/ovl_Eff_Stk.data.o"
- include "build/data/ovl_Eff_Stk/ovl_Eff_Stk.reloc.o"
+ include "build/src/overlays/actors/ovl_Eff_Stk/ovl_Eff_Stk_reloc.o"
endseg
beginseg
@@ -4867,8 +4836,7 @@ beginseg
name "ovl_Demo_Moonend"
compress
include "build/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.data.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.reloc.o"
+ include "build/src/overlays/actors/ovl_Demo_Moonend/ovl_Demo_Moonend_reloc.o"
endseg
beginseg
@@ -4889,8 +4857,7 @@ beginseg
name "ovl_En_And"
compress
include "build/src/overlays/actors/ovl_En_And/z_en_and.o"
- include "build/data/ovl_En_And/ovl_En_And.data.o"
- include "build/data/ovl_En_And/ovl_En_And.reloc.o"
+ include "build/src/overlays/actors/ovl_En_And/ovl_En_And_reloc.o"
endseg
beginseg
@@ -8858,7 +8825,8 @@ beginseg
name "title_static"
compress
romalign 0x1000
- include "build/baserom/title_static.o"
+ include "build/assets/misc/title_static/title_static.o"
+ number 1
endseg
beginseg
diff --git a/src/audio/code_8019AF00.c b/src/audio/code_8019AF00.c
index 5af712e99..40c457cb3 100644
--- a/src/audio/code_8019AF00.c
+++ b/src/audio/code_8019AF00.c
@@ -9,7 +9,7 @@ typedef struct {
/* 0x0 */ Vec3f* pos;
/* 0x4 */ f32 freqScale;
/* 0x8 */ s8 reverbAdd;
-} SfxSettings; // size = 0x9
+} SfxSettings; // size = 0xC
typedef struct {
/* 0x0 */ f32 volume;
@@ -20,7 +20,7 @@ typedef struct {
/* 0xB */ u8 filter;
/* 0xC */ u8 combFilterGain;
/* 0xD */ u8 zVolume;
-} SfxChannelState; // size = 0xE
+} SfxChannelState; // size = 0x10
typedef enum {
/* 0x0 */ SFX_CHANNEL_PLAYER0, // SfxPlayerBank
@@ -50,7 +50,7 @@ typedef enum {
/* 0x4 */ SEQ_PLAYER_IO_PORT_4,
/* 0x5 */ SEQ_PLAYER_IO_PORT_5,
/* 0x6 */ SEQ_PLAYER_IO_PORT_6,
- /* 0x7 */ SEQ_PLAYER_IO_PORT_7,
+ /* 0x7 */ SEQ_PLAYER_IO_PORT_7
} SeqPlayerIOPort;
typedef struct {
@@ -2058,11 +2058,11 @@ const char sAudioOcarinaUnusedText6[] = "last key step is too short !!! %d:%d %d
const char sAudioOcarinaUnusedText7[] = "check is over!!! %d %d %d\n";
void AudioOcarina_ReadControllerInput(void) {
- Input inputs[4];
+ Input inputs[MAXCONTROLLERS];
Input* input = &inputs[0];
u32 ocarinaInputButtonPrev = sOcarinaInputButtonCur;
- Padmgr_GetInput2(inputs, 0);
+ PadMgr_GetInput2(inputs, false);
sOcarinaInputButtonCur = input->cur.button;
sOcarinaInputButtonPrev = ocarinaInputButtonPrev;
sOcarinaInputStickRel.x = input->rel.stick_x;
@@ -2543,8 +2543,8 @@ void AudioOcarina_CheckSongsWithoutMusicStaff(void) {
if ((u32)sOcarinaAvailableSongFlags & (1 << songIndex)) {
// Loops through all possible starting indices?
// Loops through the notes of the song?
- for (j = 0, k = 0; j < gOcarinaSongButtons[songIndex].numButtons && k == 0 &&
- sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[songIndex].numButtons;) {
+ for (j = 0, k = 0; (j < gOcarinaSongButtons[songIndex].numButtons) && (k == 0) &&
+ (sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[songIndex].numButtons);) {
pitch = sCurOcarinaSongWithoutMusicStaff[(sOcarinaWithoutMusicStaffPos -
gOcarinaSongButtons[songIndex].numButtons) +
@@ -2953,7 +2953,7 @@ void AudioOcarina_SetRecordingSong(u8 isRecordingComplete) {
i = sRecordSongPos;
pitch = OCARINA_PITCH_NONE;
- while (i != 0 && pitch == OCARINA_PITCH_NONE) {
+ while ((i != 0) && (pitch == OCARINA_PITCH_NONE)) {
i--;
pitch = recordedSong[i].pitch;
}
@@ -3357,7 +3357,7 @@ void AudioOcarina_Update(void) {
#define OCARINA_INSTRUMENT_OOT_MAX 7
-void AudioOcarina_PlayLongScarecrowAfterCredits(void) {
+void AudioOcarina_PlayLongScarecrowSong(void) {
static u8 sScarecrowAfterCreditsState = 0;
static u8 sScarecrowAfterCreditsIntrumentId = OCARINA_INSTRUMENT_DEFAULT;
static u16 sScarecrowAfterCreditsTimer = 1200;
diff --git a/src/audio/lib/effects.c b/src/audio/lib/effects.c
index feddf73ca..6ef8added 100644
--- a/src/audio/lib/effects.c
+++ b/src/audio/lib/effects.c
@@ -26,7 +26,7 @@ void AudioEffects_SequenceChannelProcessSound(SequenceChannel* channel, s32 reca
for (i = 0; i < ARRAY_COUNT(channel->layers); i++) {
SequenceLayer* layer = channel->layers[i];
- if (layer != NULL && layer->enabled && layer->note != NULL) {
+ if ((layer != NULL) && layer->enabled && (layer->note != NULL)) {
if (layer->notePropertiesNeedInit) {
layer->noteFreqScale = layer->freqScale * chanFreqScale;
layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume;
diff --git a/src/audio/lib/heap.c b/src/audio/lib/heap.c
index 0a64c0d1b..52533da4d 100644
--- a/src/audio/lib/heap.c
+++ b/src/audio/lib/heap.c
@@ -1303,8 +1303,8 @@ void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) {
sampleBankId1 = gAudioCtx.soundFontList[fontId].sampleBankId1;
sampleBankId2 = gAudioCtx.soundFontList[fontId].sampleBankId2;
if (((sampleBankId1 != 0xFF) && (entry->sampleBankId == sampleBankId1)) ||
- ((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || entry->sampleBankId == 0 ||
- entry->sampleBankId == 0xFE) {
+ ((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || (entry->sampleBankId == 0) ||
+ (entry->sampleBankId == 0xFE)) {
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, fontId) != NULL) {
if (1) {}
if (AudioLoad_IsFontLoadComplete(fontId) != 0) {
@@ -1369,7 +1369,7 @@ void AudioHeap_DiscardSampleCaches(void) {
if ((sampleBankId1 == 0xFF) && (sampleBankId2 == 0xFF)) {
continue;
}
- if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_PERMANENT, fontId) == NULL ||
+ if ((AudioHeap_SearchCaches(FONT_TABLE, CACHE_PERMANENT, fontId) == NULL) ||
!AudioLoad_IsFontLoadComplete(fontId)) {
continue;
}
@@ -1386,14 +1386,14 @@ void AudioHeap_DiscardSampleCaches(void) {
}
typedef struct {
- uintptr_t oldAddr;
- uintptr_t newAddr;
- size_t size;
- u8 newMedium;
-} StorageChange;
+ /* 0x0 */ uintptr_t oldAddr;
+ /* 0x4 */ uintptr_t newAddr;
+ /* 0x8 */ size_t size;
+ /* 0xC */ u8 newMedium;
+} StorageChange; // size = 0x10
void AudioHeap_ChangeStorage(StorageChange* change, Sample* sample) {
- if (sample != NULL && ((sample->medium == change->newMedium) || (D_801FD120 != 1)) &&
+ if ((sample != NULL) && ((sample->medium == change->newMedium) || (D_801FD120 != 1)) &&
((sample->medium == MEDIUM_RAM) || (D_801FD120 != 0))) {
uintptr_t startAddr = change->oldAddr;
uintptr_t endAddr = change->oldAddr + change->size;
diff --git a/src/audio/lib/load.c b/src/audio/lib/load.c
index 3a4f1c1e0..8016e9b6a 100644
--- a/src/audio/lib/load.c
+++ b/src/audio/lib/load.c
@@ -80,10 +80,10 @@ typedef enum {
#define OS_MESG_PRI_HIGH 1
typedef struct {
- u16 numInstruments;
- u16 numDrums;
- u16 numSfx;
-} UnloadedFonts;
+ /* 0x0 */ u16 numInstruments;
+ /* 0x2 */ u16 numDrums;
+ /* 0x4 */ u16 numSfx;
+} UnloadedFonts; // size = 0x6
OSMesgQueue sScriptLoadQueue;
OSMesg sScriptLoadMesgBuf[0x10];
@@ -138,13 +138,13 @@ void* AudioLoad_DmaSampleData(uintptr_t devAddr, size_t size, s32 arg2, u8* dmaI
s32 bufferPos;
u32 i;
- if (arg2 != 0 || *dmaIndexRef >= gAudioCtx.sampleDmaListSize1) {
+ if ((arg2 != 0) || (*dmaIndexRef >= gAudioCtx.sampleDmaListSize1)) {
for (i = gAudioCtx.sampleDmaListSize1; i < gAudioCtx.sampleDmaCount; i++) {
dma = &gAudioCtx.sampleDmas[i];
bufferPos = devAddr - dma->devAddr;
- if (0 <= bufferPos && ((u32)bufferPos <= dma->size - size)) {
+ if ((0 <= bufferPos) && ((u32)bufferPos <= (dma->size - size))) {
// We already have a DMA request for this memory range.
- if (dma->ttl == 0 && gAudioCtx.sampleDmaReuseQueue2RdPos != gAudioCtx.sampleDmaReuseQueue2WrPos) {
+ if ((dma->ttl == 0) && (gAudioCtx.sampleDmaReuseQueue2RdPos != gAudioCtx.sampleDmaReuseQueue2WrPos)) {
// Move the DMA out of the reuse queue, by swapping it with the
// read pos, and then incrementing the read pos.
if (dma->reuseIndex != gAudioCtx.sampleDmaReuseQueue2RdPos) {
@@ -1905,7 +1905,7 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* fontData
}
gAudioCtx.numUsedSamples = 0;
- if (gAudioCtx.preloadSampleStackTop != 0 && !preloadInProgress) {
+ if ((gAudioCtx.preloadSampleStackTop != 0) && !preloadInProgress) {
topPreload = &gAudioCtx.preloadSampleStack[gAudioCtx.preloadSampleStackTop - 1];
sample = topPreload->sample;
nChunks = (sample->size >> 12) + 1;
@@ -2160,7 +2160,7 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, SampleBankRelocInfo*
}
gAudioCtx.numUsedSamples = 0;
- if (gAudioCtx.preloadSampleStackTop != 0 && !preloadInProgress) {
+ if ((gAudioCtx.preloadSampleStackTop != 0) && !preloadInProgress) {
topPreload = &gAudioCtx.preloadSampleStack[gAudioCtx.preloadSampleStackTop - 1];
sample = topPreload->sample;
nChunks = (sample->size >> 12) + 1;
diff --git a/src/audio/lib/playback.c b/src/audio/lib/playback.c
index deb6e82b9..678e01089 100644
--- a/src/audio/lib/playback.c
+++ b/src/audio/lib/playback.c
@@ -597,7 +597,7 @@ s32 AudioPlayback_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveI
}
freqScale = layer->freqScale;
- if (layer->portamento.mode != 0 && 0.0f < layer->portamento.extent) {
+ if ((layer->portamento.mode != 0) && (0.0f < layer->portamento.extent)) {
freqScale *= (layer->portamento.extent + 1.0f);
}
@@ -906,7 +906,7 @@ Note* AudioPlayback_AllocNoteFromActive(NotePool* pool, SequenceLayer* layer) {
aPriority = aNote->playbackState.priority;
}
- if (rNote == NULL && aNote == NULL) {
+ if ((rNote == NULL) && (aNote == NULL)) {
return NULL;
}
@@ -928,8 +928,8 @@ Note* AudioPlayback_AllocNote(SequenceLayer* layer) {
if (policy & 1) {
note = layer->note;
- if (note != NULL && note->playbackState.prevParentLayer == layer &&
- note->playbackState.wantedParentLayer == NO_LAYER) {
+ if ((note != NULL) && (note->playbackState.prevParentLayer == layer) &&
+ (note->playbackState.wantedParentLayer == NO_LAYER)) {
AudioPlayback_NoteReleaseAndTakeOwnership(note, layer);
AudioPlayback_AudioListRemove(¬e->listItem);
AudioScript_AudioListPushBack(¬e->listItem.pool->releasing, ¬e->listItem);
diff --git a/src/boot_O2/__osMalloc.c b/src/boot_O2/__osMalloc.c
index 24fa6d39e..71a5a5ba3 100644
--- a/src/boot_O2/__osMalloc.c
+++ b/src/boot_O2/__osMalloc.c
@@ -275,7 +275,7 @@ void __osFree(Arena* arena, void* ptr) {
node = (ArenaNode*)((uintptr_t)ptr - sizeof(ArenaNode));
- if (ptr != NULL && node->magic == NODE_MAGIC && !node->isFree) {
+ if ((ptr != NULL) && (node->magic == NODE_MAGIC) && !node->isFree) {
next = node->next;
prev = node->prev;
node->isFree = true;
@@ -297,7 +297,7 @@ void __osFree(Arena* arena, void* ptr) {
// Checks if the previous node is contiguous to the current node and if it isn't currently allocated. Then merge
// the two nodes into one.
- if (prev != NULL && prev->isFree && (uintptr_t)node == (uintptr_t)prev + sizeof(ArenaNode) + prev->size) {
+ if ((prev != NULL) && prev->isFree && ((uintptr_t)node == (uintptr_t)prev + sizeof(ArenaNode) + prev->size)) {
if (next != NULL) {
next->prev = prev;
}
diff --git a/src/boot_O2/boot_80086760.c b/src/boot_O2/boot_80086760.c
index 398a1e41a..cb77bed50 100644
--- a/src/boot_O2/boot_80086760.c
+++ b/src/boot_O2/boot_80086760.c
@@ -5,57 +5,44 @@
#include "global.h"
#include "fixed_point.h"
-extern f32 func_80086C70(f32 x);
-extern f32 func_80086CA8(f32 x);
-extern f32 func_80086D50(f32 x);
-extern f32 func_80086CE0(f32 x);
-extern f32 func_80086D18(f32 x);
-
s32 gUseAtanContFrac;
/**
* Tangent function computed using libultra sinf and cosf
*/
-// Math_FTanF
-f32 func_80086760(f32 x) {
+f32 Math_FTanF(f32 x) {
return sinf(x) / cosf(x);
}
// Unused
-// Math_FFloorF
-f32 func_80086794(f32 x) {
- return func_80086C70(x);
+f32 Math_FFloorF(f32 x) {
+ return floorf(x);
}
// Unused
-// Math_FCeilF
-f32 func_800867B4(f32 x) {
- return func_80086CA8(x);
+f32 Math_FCeilF(f32 x) {
+ return ceilf(x);
}
// Unused
-// Math_FRoundF
-f32 func_800867D4(f32 x) {
- return func_80086D50(x);
+f32 Math_FRoundF(f32 x) {
+ return roundf(x);
}
// Unused
-// Math_FTruncF
-f32 func_800867F4(f32 x) {
- return func_80086CE0(x);
+f32 Math_FTruncF(f32 x) {
+ return truncf(x);
}
-// Math_FNearbyIntF
-f32 func_80086814(f32 x) {
- return func_80086D18(x);
+f32 Math_FNearbyIntF(f32 x) {
+ return nearbyintf(x);
}
/**
* Arctangent approximation using a Maclaurin series [https://mathworld.wolfram.com/MaclaurinSeries.html]
* (one quadrant, i.e. |x| < 1)
*/
-// Math_FAtanTaylorQF
-f32 func_80086834(f32 x) {
+f32 Math_FAtanTaylorQF(f32 x) {
// Coefficients of Maclaurin series of arctangent
static const f32 coeffs[] = {
-1.0f / 3, +1.0f / 5, -1.0f / 7, +1.0f / 9, -1.0f / 11, +1.0f / 13, -1.0f / 15, +1.0f / 17, 0.0f,
@@ -84,10 +71,9 @@ f32 func_80086834(f32 x) {
* Extends previous arctangent function to the rest of the real numbers.
* Uses the formulae arctan(x) = pi/2 - arctan(1/x)
* and arctan(x) = pi/4 - arctan( (1-x)/(1+x) )
- * to extend the range in which the series computed by func_80086834 is a good approximation
+ * to extend the range in which the series computed by Math_FAtanTaylorQF is a good approximation
*/
-// Math_FAtanTaylorF
-f32 func_80086880(f32 x) {
+f32 Math_FAtanTaylorF(f32 x) {
f32 t;
f32 q;
@@ -102,13 +88,13 @@ f32 func_80086880(f32 x) {
}
if (t <= M_SQRT2 - 1.0f) {
- return func_80086834(x);
+ return Math_FAtanTaylorQF(x);
}
if (t >= M_SQRT2 + 1.0f) {
- q = M_PI / 2 - func_80086834(1.0f / t);
+ q = M_PI / 2 - Math_FAtanTaylorQF(1.0f / t);
} else { // in the interval (\sqrt{2} - 1, \sqrt{2} + 1)
- q = M_PI / 4 - func_80086834((1.0f - t) / (1.0f + t));
+ q = M_PI / 4 - Math_FAtanTaylorQF((1.0f - t) / (1.0f + t));
}
if (x > 0.0f) {
@@ -123,8 +109,7 @@ f32 func_80086880(f32 x) {
* Cf. https://en.wikipedia.org/wiki/Gauss%27s_continued_fraction#The_series_2F1_2 ,
* https://dlmf.nist.gov/4.25#E4
*/
-// Math_FAtanContFracF
-f32 func_800869A4(f32 x) {
+f32 Math_FAtanContFracF(f32 x) {
s32 sector;
f32 z;
f32 conv;
@@ -162,24 +147,22 @@ f32 func_800869A4(f32 x) {
}
}
-// Math_FAtanF
/**
* Single-argument arctangent, only used by the two-argument function.
* Nothing else sets the bss variable gUseAtanContFrac, so the Maclaurin series is always used
*/
-f32 func_80086AF0(f32 x) {
+f32 Math_FAtanF(f32 x) {
if (!gUseAtanContFrac) {
- return func_80086880(x);
+ return Math_FAtanTaylorF(x);
} else {
- return func_800869A4(x);
+ return Math_FAtanContFracF(x);
}
}
-// Math_FAtan2F
/**
* Main two-argument arctangent function
*/
-f32 func_80086B30(f32 y, f32 x) {
+f32 Math_FAtan2F(f32 y, f32 x) {
if (x == 0.0f) {
if (y == 0.0f) {
return 0.0f;
@@ -191,20 +174,18 @@ f32 func_80086B30(f32 y, f32 x) {
return qNaN0x10000;
}
} else if (x >= 0.0f) {
- return func_80086AF0(y / x);
+ return Math_FAtanF(y / x);
} else if (y < 0.0f) {
- return func_80086AF0(y / x) - M_PI;
+ return Math_FAtanF(y / x) - M_PI;
} else {
- return M_PI - func_80086AF0(-(y / x));
+ return M_PI - Math_FAtanF(-(y / x));
}
}
-// Math_FAsinF
-f32 func_80086C18(f32 x) {
- return func_80086B30(x, sqrtf(1.0f - SQ(x)));
+f32 Math_FAsinF(f32 x) {
+ return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
}
-// Math_FAcosF
-f32 func_80086C48(f32 x) {
- return M_PI / 2 - func_80086C18(x);
+f32 Math_FAcosF(f32 x) {
+ return M_PI / 2 - Math_FAsinF(x);
}
diff --git a/src/boot_O2/padutils.c b/src/boot_O2/padutils.c
index 95f1dfa3b..accd09e11 100644
--- a/src/boot_O2/padutils.c
+++ b/src/boot_O2/padutils.c
@@ -66,11 +66,10 @@ s8 PadUtils_GetRelY(Input* input) {
}
void PadUtils_UpdateRelXY(Input* input) {
- s32 curX, curY;
- s32 relX, relY;
-
- curX = PadUtils_GetCurX(input);
- curY = PadUtils_GetCurY(input);
+ s32 curX = PadUtils_GetCurX(input);
+ s32 curY = PadUtils_GetCurY(input);
+ s32 relX;
+ s32 relY;
if (curX > 7) {
relX = (curX < 0x43) ? curX - 7 : 0x43 - 7;
diff --git a/src/boot_O2/sleep.c b/src/boot_O2/sleep.c
index 01a85c5cc..a35abc5b2 100644
--- a/src/boot_O2/sleep.c
+++ b/src/boot_O2/sleep.c
@@ -2,10 +2,10 @@
void Sleep_Cycles(u64 time) {
OSMesgQueue mq;
- OSMesg msg;
+ OSMesg msg[1];
OSTimer timer;
- osCreateMesgQueue(&mq, &msg, OS_MESG_BLOCK);
+ osCreateMesgQueue(&mq, msg, ARRAY_COUNT(msg));
osSetTimer(&timer, time, 0, &mq, NULL);
osRecvMesg(&mq, NULL, OS_MESG_BLOCK);
}
diff --git a/src/boot_O2/stackcheck.c b/src/boot_O2/stackcheck.c
index 20e56f480..edd1e3a30 100644
--- a/src/boot_O2/stackcheck.c
+++ b/src/boot_O2/stackcheck.c
@@ -1,18 +1,19 @@
-#include "global.h"
+#include "stackcheck.h"
+#include "libc/stdbool.h"
+#include "libc/stdint.h"
StackEntry* sStackInfoListStart = NULL;
StackEntry* sStackInfoListEnd = NULL;
-void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 initValue, s32 minSpace,
+void StackCheck_Init(StackEntry* entry, void* stackBottom, void* stackTop, u32 initValue, s32 minSpace,
const char* name) {
- StackEntry* iter;
- u32* addr;
-
- if (!entry) {
+ if (entry == NULL) {
sStackInfoListStart = NULL;
} else {
- entry->head = (u32)stackTop;
- entry->tail = (u32)stackBottom;
+ StackEntry* iter;
+
+ entry->head = stackBottom;
+ entry->tail = stackTop;
entry->initValue = initValue;
entry->minSpace = minSpace;
entry->name = name;
@@ -32,13 +33,14 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i
}
sStackInfoListEnd = entry;
- if (!sStackInfoListStart) {
+ if (sStackInfoListStart == NULL) {
sStackInfoListStart = entry;
}
if (entry->minSpace != -1) {
- addr = (u32*)entry->head;
- while ((u32)addr < entry->tail) {
+ u32* addr = entry->head;
+
+ while (addr < (u32*)entry->tail) {
*addr++ = entry->initValue;
}
}
@@ -46,13 +48,13 @@ void StackCheck_Init(StackEntry* entry, void* stackTop, void* stackBottom, u32 i
}
void StackCheck_Cleanup(StackEntry* entry) {
- u32 inconsistency = 0; // unused variable needed to match
+ u32 inconsistency = false;
- if (!entry->prev) {
+ if (entry->prev == NULL) {
if (entry == sStackInfoListStart) {
sStackInfoListStart = entry->next;
} else {
- inconsistency = 1;
+ inconsistency = true;
}
} else {
entry->prev->next = entry->next;
@@ -62,7 +64,7 @@ void StackCheck_Cleanup(StackEntry* entry) {
if (entry == sStackInfoListEnd) {
sStackInfoListEnd = entry->prev;
} else {
- inconsistency = 1;
+ inconsistency = true;
}
}
@@ -71,22 +73,22 @@ void StackCheck_Cleanup(StackEntry* entry) {
StackStatus StackCheck_GetState(StackEntry* entry) {
u32* last;
- u32 used;
- u32 free;
- s32 status;
+ size_t used;
+ size_t free;
+ StackStatus status;
- for (last = (u32*)entry->head; (u32)last < entry->tail; last++) {
+ for (last = entry->head; last < (u32*)entry->tail; last++) {
if (entry->initValue != *last) {
break;
}
}
- used = entry->tail - (u32)last;
- free = (u32)last - entry->head;
+ used = (uintptr_t)entry->tail - (uintptr_t)last;
+ free = (uintptr_t)last - (uintptr_t)entry->head;
if (free == 0) {
status = STACK_STATUS_OVERFLOW;
- } else if (free < (u32)entry->minSpace && entry->minSpace != -1) {
+ } else if ((free < (size_t)entry->minSpace) && (entry->minSpace != -1)) {
status = STACK_STATUS_WARNING;
} else {
status = STACK_STATUS_OK;
@@ -95,13 +97,14 @@ StackStatus StackCheck_GetState(StackEntry* entry) {
return status;
}
-u32 StackCheck_CheckAll() {
+u32 StackCheck_CheckAll(void) {
u32 ret = 0;
StackEntry* iter = sStackInfoListStart;
- while (iter) {
- u32 state = StackCheck_GetState(iter);
- if (state) {
+ while (iter != NULL) {
+ StackStatus state = StackCheck_GetState(iter);
+
+ if (state != STACK_STATUS_OK) {
ret = 1;
}
iter = iter->next;
@@ -111,7 +114,7 @@ u32 StackCheck_CheckAll() {
}
u32 StackCheck_Check(StackEntry* entry) {
- if (!entry) {
+ if (entry == NULL) {
return StackCheck_CheckAll();
} else {
return StackCheck_GetState(entry);
diff --git a/src/boot_O2/boot_800862E0.c b/src/boot_O2/system_heap.c
similarity index 65%
rename from src/boot_O2/boot_800862E0.c
rename to src/boot_O2/system_heap.c
index 5774af9da..365d94596 100644
--- a/src/boot_O2/boot_800862E0.c
+++ b/src/boot_O2/system_heap.c
@@ -1,3 +1,10 @@
+/**
+ * @file system_heap.c
+ *
+ * @note:
+ * Only SystemHeap_Init() is used, and is essentially just a wrapper for SystemArena_Init().
+ *
+ */
#include "global.h"
#include "system_malloc.h"
@@ -6,20 +13,20 @@ typedef void (*BlockFunc1)(void*, u32);
typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32);
typedef struct InitFunc {
- uintptr_t nextOffset;
- void (*func)(void);
-} InitFunc;
+ /* 0x0 */ uintptr_t nextOffset;
+ /* 0x4 */ void (*func)(void);
+} InitFunc; // size = 0x8
void* sInitFuncs = NULL;
-char sNew[] = { 0x00, 0x00, 0x00, 0x00 };
+char sNew[] = "";
-char D_80097508[] = {
+UNK_TYPE1 D_80097508[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00,
0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
};
-void* SystemArena_MallocMin1(size_t size) {
+void* SystemHeap_Malloc(size_t size) {
if (size == 0) {
size = 1;
}
@@ -27,13 +34,13 @@ void* SystemArena_MallocMin1(size_t size) {
return __osMalloc(&gSystemArena, size);
}
-void SystemArena_FreeNullCheck(void* ptr) {
+void SystemHeap_Free(void* ptr) {
if (ptr != NULL) {
__osFree(&gSystemArena, ptr);
}
}
-void SystemArena_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) {
+void SystemHeap_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -41,7 +48,7 @@ void SystemArena_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc
}
}
-void SystemArena_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) {
+void SystemHeap_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -49,12 +56,12 @@ void SystemArena_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc
}
}
-void* SystemArena_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) {
+void* SystemHeap_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc8 blockFunc) {
if (blk == NULL) {
- blk = SystemArena_MallocMin1(nBlk * blkSize);
+ blk = SystemHeap_Malloc(nBlk * blkSize);
}
- if (blk != NULL && blockFunc != NULL) {
+ if ((blk != NULL) && (blockFunc != NULL)) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -65,7 +72,7 @@ void* SystemArena_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFun
return blk;
}
-void SystemArena_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) {
+void SystemHeap_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc, s32 shouldFree) {
uintptr_t pos;
uintptr_t start;
size_t maskedBlkSize;
@@ -86,11 +93,11 @@ void SystemArena_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, Bl
}
if (shouldFree) {
- SystemArena_FreeNullCheck(blk);
+ SystemHeap_Free(blk);
}
}
-void SystemArena_RunInits(void) {
+void SystemHeap_RunInits(void) {
InitFunc* initFunc = (InitFunc*)&sInitFuncs;
u32 nextOffset = initFunc->nextOffset;
InitFunc* prev = NULL;
@@ -110,7 +117,7 @@ void SystemArena_RunInits(void) {
sInitFuncs = prev;
}
-void SystemArena_Init(void* start, size_t size) {
- SystemArena_InitArena(start, size);
- SystemArena_RunInits();
+void SystemHeap_Init(void* start, size_t size) {
+ SystemArena_Init(start, size);
+ SystemHeap_RunInits();
}
diff --git a/src/boot_O2/system_malloc.c b/src/boot_O2/system_malloc.c
index 56608166c..cea017b38 100644
--- a/src/boot_O2/system_malloc.c
+++ b/src/boot_O2/system_malloc.c
@@ -38,7 +38,7 @@ u32 SystemArena_CheckArena(void) {
return __osCheckArena(&gSystemArena);
}
-void SystemArena_InitArena(void* start, size_t size) {
+void SystemArena_Init(void* start, size_t size) {
__osMallocInit(&gSystemArena, start, size);
}
diff --git a/src/boot_O2_g3/CIC6105.c b/src/boot_O2_g3/CIC6105.c
index 4745ad5c8..78eed1a77 100644
--- a/src/boot_O2_g3/CIC6105.c
+++ b/src/boot_O2_g3/CIC6105.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
UNK_TYPE4 D_8009BE30;
diff --git a/src/boot_O2_g3/boot_main.c b/src/boot_O2_g3/boot_main.c
index 061458a1d..6a561992b 100644
--- a/src/boot_O2_g3/boot_main.c
+++ b/src/boot_O2_g3/boot_main.c
@@ -1,22 +1,22 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
+#include "stackcheck.h"
StackEntry sBootStackInfo;
OSThread sIdleThread;
-STACK(sIdleThreadStack, 0x400);
+STACK(sIdleStack, 0x400);
StackEntry sIdleStackInfo;
-STACK(sBootThreadStack, 0x400);
+STACK(sBootStack, 0x400);
void bootproc(void) {
- StackCheck_Init(&sBootStackInfo, sBootThreadStack, STACK_TOP(sBootThreadStack), 0, -1, "boot");
+ StackCheck_Init(&sBootStackInfo, sBootStack, STACK_TOP(sBootStack), 0, -1, "boot");
osMemSize = osGetMemSize();
func_800818F4();
osInitialize();
osUnmapTLBAll();
gCartHandle = osCartRomInit();
- StackCheck_Init(&sIdleStackInfo, sIdleThreadStack, STACK_TOP(sIdleThreadStack), 0, 0x100, "idle");
- osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack),
- Z_PRIORITY_IDLE);
+ StackCheck_Init(&sIdleStackInfo, sIdleStack, STACK_TOP(sIdleStack), 0, 0x100, "idle");
+ osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleStack), Z_PRIORITY_IDLE);
osStartThread(&sIdleThread);
}
diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c
index 134b120dc..eb190859e 100644
--- a/src/boot_O2_g3/fault.c
+++ b/src/boot_O2_g3/fault.c
@@ -2,6 +2,7 @@
#include "global.h"
#include "stack.h"
#include "vt.h"
+#include "stackcheck.h"
extern FaultThreadStruct* sFaultContext;
extern f32 D_8009BE54;
@@ -203,7 +204,7 @@ void Fault_Sleep(u32 duration) {
}
void Fault_PadCallback(Input* input) {
- Padmgr_GetInput2(input, 0);
+ PadMgr_GetInput2(input, false);
}
void Fault_UpdatePadImpl() {
@@ -446,7 +447,7 @@ void osSyncPrintfThreadContext(OSThread* t) {
OSThread* Fault_FindFaultedThread() {
OSThread* iter = __osGetActiveQueue();
while (iter->priority != -1) {
- if (iter->priority > 0 && iter->priority < 0x7F && (iter->flags & 3)) {
+ if ((iter->priority > 0) && (iter->priority < 0x7F) && (iter->flags & 3)) {
return iter;
}
iter = iter->tlnext;
@@ -473,7 +474,7 @@ void Fault_WaitForButtonCombo(void) {
do {
Fault_Sleep(0x10);
Fault_UpdatePadImpl();
- } while (!CHECK_BTN_ALL(input->press.button, 0x80));
+ } while (!CHECK_BTN_ALL(input->press.button, BTN_RESET));
} while (!CHECK_BTN_ALL(input->cur.button, BTN_DLEFT | BTN_L | BTN_R | BTN_CRIGHT));
}
@@ -762,7 +763,7 @@ void Fault_SetOptionsFromController3(void) {
u32 graphRA;
u32 graphSP;
- if (CHECK_BTN_ALL(input3->press.button, 0x80)) {
+ if (CHECK_BTN_ALL(input3->press.button, BTN_RESET)) {
faultCustomOptions = !faultCustomOptions;
}
@@ -801,8 +802,8 @@ void Fault_ThreadEntry(void* arg) {
u32 pad;
OSThread* faultedThread;
- osSetEventMesg(10, &sFaultContext->queue, (OSMesg)1);
- osSetEventMesg(12, &sFaultContext->queue, (OSMesg)2);
+ osSetEventMesg(OS_EVENT_CPU_BREAK, &sFaultContext->queue, (OSMesg)1);
+ osSetEventMesg(OS_EVENT_FAULT, &sFaultContext->queue, (OSMesg)2);
while (1) {
do {
osRecvMesg(&sFaultContext->queue, &msg, OS_MESG_BLOCK);
diff --git a/src/boot_O2_g3/fault_drawer.c b/src/boot_O2_g3/fault_drawer.c
index 8efc930ec..f694be8aa 100644
--- a/src/boot_O2_g3/fault_drawer.c
+++ b/src/boot_O2_g3/fault_drawer.c
@@ -57,7 +57,7 @@ void FaultDrawer_DrawRecImpl(s32 xStart, s32 yStart, s32 xEnd, s32 yEnd, u16 col
s32 xSize = xEnd - xStart + 1;
s32 ySize = yEnd - yStart + 1;
- if (xDiff > 0 && yDiff > 0) {
+ if ((xDiff > 0) && (yDiff > 0)) {
if (xDiff < xSize) {
xSize = xDiff;
}
@@ -127,11 +127,11 @@ void FaultDrawer_UpdatePrintColor() {
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf(VT_RST);
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->foreColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("3%d"), idx);
}
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->backColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("4%d"), idx);
}
}
@@ -180,7 +180,7 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
for (; count != 0; count--, str++) {
if (sFaultDrawContext->escCode) {
sFaultDrawContext->escCode = false;
- if (*str >= '1' && *str <= '9') {
+ if ((*str >= '1') && (*str <= '9')) {
FaultDrawer_SetForeColor(sFaultDrawContext->printColors[*str - '0']);
}
} else {
@@ -192,9 +192,11 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
sFaultDrawContext->cursorX = sFaultDrawContext->w;
break;
+
case '\x1A':
sFaultDrawContext->escCode = true;
break;
+
default:
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf("%c", *str);
diff --git a/src/boot_O2_g3/idle.c b/src/boot_O2_g3/idle.c
index 40bcf5d0e..6c63e2a70 100644
--- a/src/boot_O2_g3/idle.c
+++ b/src/boot_O2_g3/idle.c
@@ -2,6 +2,7 @@
#include "global.h"
#include "stack.h"
#include "buffers.h"
+#include "stackcheck.h"
u8 D_80096B20 = 1;
vu8 gViConfigUseDefault = 1;
diff --git a/src/boot_O2_g3/irqmgr.c b/src/boot_O2_g3/irqmgr.c
index 152c69b89..1f1e94ab4 100644
--- a/src/boot_O2_g3/irqmgr.c
+++ b/src/boot_O2_g3/irqmgr.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "stackcheck.h"
vs32 gIrqMgrResetStatus = 0;
volatile OSTime sIrqMgrResetTime = 0;
@@ -160,7 +161,7 @@ void IrqMgr_Init(IrqMgr* irqmgr, void* stack, OSPri pri, u8 retraceCount) {
irqmgr->lastPrenmiTime = 0;
osCreateMesgQueue(&irqmgr->irqQueue, (OSMesg*)irqmgr->irqBuffer, ARRAY_COUNT(irqmgr->irqBuffer));
- osSetEventMesg(0xE, &irqmgr->irqQueue, (OSMesg)0x29D);
+ osSetEventMesg(OS_EVENT_PRENMI, &irqmgr->irqQueue, (OSMesg)0x29D);
osViSetEvent(&irqmgr->irqQueue, (OSMesg)0x29A, retraceCount);
osCreateThread(&irqmgr->thread, Z_THREAD_ID_IRQMGR, IrqMgr_ThreadEntry, irqmgr, stack, pri);
diff --git a/src/boot_O2_g3/yaz0.c b/src/boot_O2_g3/yaz0.c
index aa7ecdfe1..76f990659 100644
--- a/src/boot_O2_g3/yaz0.c
+++ b/src/boot_O2_g3/yaz0.c
@@ -58,11 +58,11 @@ void* Yaz0_NextDMA(void* curSrcPos) {
}
typedef struct {
- /* 0x00 */ u32 magic; // Yaz0
- /* 0x04 */ u32 decSize;
- /* 0x08 */ u32 compInfoOffset; // only used in mio0
- /* 0x0C */ u32 uncompDataOffset; // only used in mio0
-} Yaz0Header; // size = 0x10
+ /* 0x0 */ u32 magic; // Yaz0
+ /* 0x4 */ u32 decSize;
+ /* 0x8 */ u32 compInfoOffset; // only used in mio0
+ /* 0xC */ u32 uncompDataOffset; // only used in mio0
+} Yaz0Header; // size = 0x10
#define YAZ0_MAGIC 0x59617A30 // "Yaz0"
diff --git a/src/boot_O2_g3/z_std_dma.c b/src/boot_O2_g3/z_std_dma.c
index dd34d9e87..00d894f74 100644
--- a/src/boot_O2_g3/z_std_dma.c
+++ b/src/boot_O2_g3/z_std_dma.c
@@ -1,6 +1,7 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
+#include "stackcheck.h"
u32 sDmaMgrDmaBuffSize = 0x2000;
diff --git a/src/code/PreRender.c b/src/code/PreRender.c
index 075f941d4..c9f279e75 100644
--- a/src/code/PreRender.c
+++ b/src/code/PreRender.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "slowly.h"
#include "stack.h"
+#include "stackcheck.h"
/**
* Assigns the "save" values in PreRender
@@ -402,7 +403,7 @@ void PreRender_ApplyAntiAliasingFilter(PreRender* this) {
* Applies filters to the framebuffer prerender to make it look smoother
*/
void PreRender_ApplyFilters(PreRender* this) {
- if (this->cvgSave == NULL || this->fbufSave == NULL) {
+ if ((this->cvgSave == NULL) || (this->fbufSave == NULL)) {
this->unk_4D = 0;
} else {
this->unk_4D = 1;
diff --git a/src/code/code_800E8EA0.c b/src/code/code_800E8EA0.c
index 93970cc6a..4ab38fcba 100644
--- a/src/code/code_800E8EA0.c
+++ b/src/code/code_800E8EA0.c
@@ -85,7 +85,7 @@ s32 Actor_TrackPlayerSetFocusHeight(PlayState* play, Actor* actor, Vec3s* headRo
actor->focus.pos = actor->world.pos;
actor->focus.pos.y += focusHeight;
- if (!((play->csCtx.state != 0) || gDbgCamEnabled)) {
+ if (!((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled)) {
yaw = ABS_ALT(BINANG_SUB(actor->yawTowardsPlayer, actor->shape.rot.y));
if (yaw >= 0x4300) {
Actor_TrackNone(headRot, torsoRot);
@@ -93,7 +93,7 @@ s32 Actor_TrackPlayerSetFocusHeight(PlayState* play, Actor* actor, Vec3s* headRo
}
}
- if ((play->csCtx.state != 0) || gDbgCamEnabled) {
+ if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) {
target = play->view.eye;
} else {
target = player->actor.focus.pos;
@@ -127,7 +127,7 @@ s32 Actor_TrackPlayer(PlayState* play, Actor* actor, Vec3s* headRot, Vec3s* tors
actor->focus.pos = focusPos;
- if (!((play->csCtx.state != 0) || gDbgCamEnabled)) {
+ if (!((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled)) {
yaw = ABS_ALT(BINANG_SUB(actor->yawTowardsPlayer, actor->shape.rot.y));
if (yaw >= 0x4300) {
Actor_TrackNone(headRot, torsoRot);
@@ -135,7 +135,7 @@ s32 Actor_TrackPlayer(PlayState* play, Actor* actor, Vec3s* headRot, Vec3s* tors
}
}
- if ((play->csCtx.state != 0) || gDbgCamEnabled) {
+ if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) {
target = play->view.eye;
} else {
target = player->actor.focus.pos;
diff --git a/src/code/code_8012EC80.c b/src/code/code_8012EC80.c
index d120da618..e10290356 100644
--- a/src/code/code_8012EC80.c
+++ b/src/code/code_8012EC80.c
@@ -472,7 +472,7 @@ u16 gSceneIdsPerRegion[REGION_MAX][27] = {
};
s32 Inventory_GetBtnBItem(PlayState* play) {
- if (gSaveContext.buttonStatus[0] == BTN_DISABLED) {
+ if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
return ITEM_NONE;
} else if (gSaveContext.bButtonStatus == BTN_DISABLED) {
return ITEM_NONE;
@@ -511,12 +511,12 @@ u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {
}
void Inventory_ChangeUpgrade(s16 upgrade, u32 value) {
- u32 upgrades = gSaveContext.save.inventory.upgrades;
+ u32 upgrades = gSaveContext.save.saveInfo.inventory.upgrades;
upgrades &= gUpgradeNegMasks[upgrade];
upgrades |= value << gUpgradeShifts[upgrade];
- gSaveContext.save.inventory.upgrades = upgrades;
+ gSaveContext.save.saveInfo.inventory.upgrades = upgrades;
}
s32 Inventory_IsMapVisible(s16 sceneId) {
@@ -543,7 +543,7 @@ s32 Inventory_IsMapVisible(s16 sceneId) {
}
}
- if (gSaveContext.save.scenesVisible[index] & gBitFlags[sceneId - (index << 5)]) {
+ if (gSaveContext.save.saveInfo.scenesVisible[index] & gBitFlags[sceneId - (index << 5)]) {
return true;
}
@@ -656,23 +656,23 @@ void Inventory_SetWorldMapCloudVisibility(s16 tingleIndex) {
index = 6;
}
- gSaveContext.save.scenesVisible[index] =
- gSaveContext.save.scenesVisible[index] | gBitFlags[(s16)(*tingleMapSceneIds)[i] - (index << 5)];
+ gSaveContext.save.saveInfo.scenesVisible[index] = gSaveContext.save.saveInfo.scenesVisible[index] |
+ gBitFlags[(s16)(*tingleMapSceneIds)[i] - (index << 5)];
i++;
}
if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_CLOCK_TOWN]) {
- gSaveContext.save.worldMapCloudVisibility |= 3;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 3;
} else if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_WOODFALL]) {
- gSaveContext.save.worldMapCloudVisibility |= 0x1C;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 0x1C;
} else if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_SNOWHEAD]) {
- gSaveContext.save.worldMapCloudVisibility |= 0xE0;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 0xE0;
} else if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_ROMANI_RANCH]) {
- gSaveContext.save.worldMapCloudVisibility |= 0x100;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 0x100;
} else if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_GREAT_BAY]) {
- gSaveContext.save.worldMapCloudVisibility |= 0x1E00;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 0x1E00;
} else if (*tingleMapSceneIds == sSceneIdsPerTingleMap[TINGLE_MAP_STONE_TOWER]) {
- gSaveContext.save.worldMapCloudVisibility |= 0x6000;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= 0x6000;
}
}
@@ -685,34 +685,34 @@ void Inventory_SetWorldMapCloudVisibility(s16 tingleIndex) {
void Inventory_SaveDekuPlaygroundHighScore(s16 timerId) {
s16 i;
- gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1] = gSaveContext.timerCurTimes[timerId];
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1] = gSaveContext.timerCurTimes[timerId];
for (i = 0; i < 8; i++) {
- gSaveContext.save.inventory.dekuPlaygroundPlayerName[CURRENT_DAY - 1][i] =
- gSaveContext.save.playerData.playerName[i];
+ gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[CURRENT_DAY - 1][i] =
+ gSaveContext.save.saveInfo.playerData.playerName[i];
}
}
void Inventory_IncrementSkullTokenCount(s16 sceneIndex) {
if (sceneIndex == SCENE_KINSTA1) {
// Swamp Spider House (increment high bits of skullTokenCount)
- gSaveContext.save.skullTokenCount =
- ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
- (gSaveContext.save.skullTokenCount & 0xFFFF);
+ gSaveContext.save.saveInfo.skullTokenCount =
+ ((u16)(((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF);
} else {
// Ocean Spider House (increment low bits of skullTokenCount)
- gSaveContext.save.skullTokenCount =
- (((u16)gSaveContext.save.skullTokenCount + 1) & 0xFFFF) | (gSaveContext.save.skullTokenCount & 0xFFFF0000);
+ gSaveContext.save.saveInfo.skullTokenCount = (((u16)gSaveContext.save.saveInfo.skullTokenCount + 1) & 0xFFFF) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000);
}
}
s16 Inventory_GetSkullTokenCount(s16 sceneIndex) {
if (sceneIndex == SCENE_KINSTA1) {
// Swamp Spider House
- return (gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10;
+ return (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000) >> 0x10;
} else {
// Ocean Spider House
- return gSaveContext.save.skullTokenCount & 0xFFFF;
+ return gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF;
}
}
@@ -722,6 +722,6 @@ void Inventory_SaveLotteryCodeGuess(PlayState* play) {
lotteryCodeGuess = ((play->msgCtx.unk12054[0] & 0xF) << 8); // First Digit
lotteryCodeGuess |= ((play->msgCtx.unk12054[1] & 0xF) << 4); // Second Digit
lotteryCodeGuess |= (play->msgCtx.unk12054[2] & 0xF); // Third Digit
- gSaveContext.save.lotteryCodeGuess =
- (gSaveContext.save.lotteryCodeGuess & 0xFFFF0000) | (lotteryCodeGuess & 0xFFFF);
+ gSaveContext.save.saveInfo.lotteryCodeGuess =
+ (gSaveContext.save.saveInfo.lotteryCodeGuess & 0xFFFF0000) | (lotteryCodeGuess & 0xFFFF);
}
diff --git a/src/code/code_80140CE0.c b/src/code/code_80140CE0.c
deleted file mode 100644
index f3d487fab..000000000
--- a/src/code/code_80140CE0.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D10.s")
diff --git a/src/code/code_801420C0.c b/src/code/code_801420C0.c
deleted file mode 100644
index 63c96571e..000000000
--- a/src/code/code_801420C0.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_801420C0/func_801420C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_801420C0/func_801420F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_801420C0/func_80142100.s")
diff --git a/src/code/cutscene_camera.c b/src/code/cutscene_camera.c
new file mode 100644
index 000000000..d92d119dd
--- /dev/null
+++ b/src/code/cutscene_camera.c
@@ -0,0 +1,380 @@
+#include "global.h"
+
+extern CutsceneCamera* sCurCsCamera;
+
+typedef s16 (*CsCamInterpolateCallback)(Vec3f*, f32*, s16*, CsCmdCamPoint*, CsCmdCamMisc*, CutsceneCameraInterp*);
+
+// function declarations
+s16 func_80161180(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_8016237C(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_8016253C(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_80162A50(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_801623E4(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_80161C20(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_80161E4C(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_801620CC(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+s16 func_80163334(Vec3f* pos, f32* fov, s16* roll, CsCmdCamPoint* point, CsCmdCamMisc* misc,
+ CutsceneCameraInterp* interp);
+f32 func_80163660(Actor* actor);
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80161180.s")
+
+/**
+ * Initializes Cutscene Camera Info
+ */
+s32 CutsceneCamera_Init(Camera* camera, CutsceneCamera* csCamera) {
+ csCamera->camera = camera;
+
+ csCamera->nextSplineTimer = csCamera->updateSplineTimer = 0;
+ csCamera->cmdIndex = 0;
+ csCamera->splineIndex = 0xFFFF;
+ csCamera->splineNeedsInit = true;
+ csCamera->state = CS_CAM_STATE_UPDATE_ALL;
+
+ sCurCsCamera = csCamera;
+
+ __osMemset(&csCamera->eyeInterp, 0, sizeof(CutsceneCameraInterp));
+ __osMemset(&csCamera->atInterp, 0, sizeof(CutsceneCameraInterp));
+
+ csCamera->eyeInterp.unk_2D = csCamera->atInterp.unk_2D = 7;
+
+ return 1;
+}
+
+CsCamInterpolateCallback CutsceneCamera_Interpolate(u8 interpType) {
+ switch (interpType) {
+ case CS_CAM_INTERP_7:
+ default:
+ return func_80161180;
+
+ case CS_CAM_INTERP_0:
+ return func_8016237C;
+
+ case CS_CAM_INTERP_5:
+ return func_8016253C;
+
+ case CS_CAM_INTERP_4:
+ return func_80162A50;
+
+ case CS_CAM_INTERP_1:
+ return func_801623E4;
+
+ case CS_CAM_INTERP_2:
+ return func_80161C20;
+
+ case CS_CAM_INTERP_3:
+ return func_80161E4C;
+
+ case CS_CAM_INTERP_6:
+ return func_801620CC;
+ }
+}
+
+u8 CutsceneCamera_ProcessSpline(CutsceneCamera* csCamera) {
+ s32 sp5C;
+ f32* fov;
+ s16* roll;
+ CsCamInterpolateCallback interpHandler;
+ Player* player;
+ Actor* target;
+ s16 numPoints;
+
+ sp5C = true;
+ if (csCamera->state == CS_CAM_STATE_DONE_SPLINE) {
+ return false;
+ }
+
+ player = GET_PLAYER(csCamera->camera->play);
+ target = csCamera->camera->target;
+
+ if (csCamera->eyeCmd[csCamera->atInterp.curPoint].interpType <
+ csCamera->atCmd[csCamera->eyeInterp.curPoint].interpType) {
+ sp5C = false;
+ }
+
+ csCamera->eyeInterp.unk_00 = csCamera->camera->eye;
+ csCamera->atInterp.unk_00 = csCamera->camera->at;
+
+ if (sp5C) {
+ fov = NULL;
+ } else {
+ fov = &csCamera->camera->fov;
+ }
+
+ if (sp5C) {
+ roll = NULL;
+ } else {
+ roll = &csCamera->camera->roll;
+ }
+
+ interpHandler = CutsceneCamera_Interpolate(csCamera->atCmd[csCamera->eyeInterp.curPoint].interpType);
+
+ switch (csCamera->atCmd[csCamera->eyeInterp.curPoint].relativeTo) {
+ case CS_CAM_REL_2:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF);
+ break;
+
+ case CS_CAM_REL_3:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_1:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_4:
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_5:
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_DIFF);
+ break;
+
+ default: // CS_CAM_REL_0
+ break;
+ }
+
+ numPoints = interpHandler(&csCamera->camera->at, fov, roll, &csCamera->atCmd[csCamera->eyeInterp.curPoint],
+ &csCamera->miscCmd[csCamera->eyeInterp.curPoint], &csCamera->eyeInterp);
+
+ switch (csCamera->atCmd[csCamera->eyeInterp.curPoint].relativeTo) {
+ case CS_CAM_REL_2:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD);
+ break;
+
+ case CS_CAM_REL_3:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
+ csCamera->camera->at.y += func_80163660(&player->actor);
+ break;
+
+ case CS_CAM_REL_1:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
+ break;
+
+ case CS_CAM_REL_4:
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD_OFFSET);
+ break;
+
+ case CS_CAM_REL_5:
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->at, &csCamera->camera->at, OLIB_ADD);
+ break;
+
+ default: // CS_CAM_REL_0
+ break;
+ }
+
+ csCamera->eyeInterp.curPoint += numPoints;
+
+ if (sp5C) {
+ fov = &csCamera->camera->fov;
+ } else {
+ fov = NULL;
+ }
+
+ if (sp5C) {
+ roll = &csCamera->camera->roll;
+ } else {
+ roll = NULL;
+ }
+
+ interpHandler = CutsceneCamera_Interpolate(csCamera->eyeCmd[csCamera->atInterp.curPoint].interpType);
+
+ switch (csCamera->eyeCmd[csCamera->atInterp.curPoint].relativeTo) {
+ case CS_CAM_REL_2:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF);
+ break;
+
+ case CS_CAM_REL_3:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_1:
+ OLib_Vec3fDiff(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_4:
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF_OFFSET);
+ break;
+
+ case CS_CAM_REL_5:
+ OLib_Vec3fDiff(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_DIFF);
+ break;
+
+ default: // CS_CAM_REL_0
+ break;
+ }
+
+ numPoints = interpHandler(&csCamera->camera->eye, fov, roll, &csCamera->eyeCmd[csCamera->atInterp.curPoint],
+ &csCamera->miscCmd[csCamera->atInterp.curPoint], &csCamera->atInterp);
+
+ switch (csCamera->eyeCmd[csCamera->atInterp.curPoint].relativeTo) {
+ case CS_CAM_REL_2:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD);
+ break;
+
+ case CS_CAM_REL_3:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
+ csCamera->camera->eye.y += func_80163660(&player->actor);
+ break;
+
+ case CS_CAM_REL_1:
+ OLib_Vec3fAdd(&player->actor.world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
+ break;
+
+ case CS_CAM_REL_4:
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD_OFFSET);
+ break;
+
+ case CS_CAM_REL_5:
+ OLib_Vec3fAdd(&target->world, &csCamera->camera->eye, &csCamera->camera->eye, OLIB_ADD);
+ break;
+
+ default: // CS_CAM_REL_0
+ break;
+ }
+
+ csCamera->atInterp.curPoint += numPoints;
+
+ if ((csCamera->eyeInterp.curPoint >= csCamera->eyeInterp.numEntries) ||
+ (csCamera->atInterp.curPoint >= csCamera->atInterp.numEntries)) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Processes camera cutscene commands
+ */
+s32 CutsceneCamera_UpdateSplines(u8* script, CutsceneCamera* csCamera) {
+ CsCmdCamSpline* spline;
+
+ switch (csCamera->state) {
+ case CS_CAM_STATE_DONE:
+ return 0;
+
+ case CS_CAM_STATE_PAUSE:
+ return csCamera->nextSplineTimer;
+
+ case CS_CAM_STATE_UPDATE_SPLINE:
+ if (csCamera->updateSplineTimer <= csCamera->duration) {
+ csCamera->updateSplineTimer++;
+ if (csCamera->updateSplineTimer <= csCamera->duration) {
+ // Process Spline
+ if (!CutsceneCamera_ProcessSpline(csCamera)) {
+ csCamera->state = CS_CAM_STATE_DONE_SPLINE;
+ }
+ }
+ }
+ break;
+
+ case CS_CAM_STATE_DONE_SPLINE:
+ break;
+
+ default: // CS_CAM_STATE_UPDATE_ALL
+ if (csCamera->splineNeedsInit == true) {
+ // Spline Header
+ spline = (CsCmdCamSpline*)&script[csCamera->cmdIndex];
+ csCamera->atInterp.numEntries = csCamera->eyeInterp.numEntries = spline->numEntries;
+ csCamera->duration = spline->duration;
+ csCamera->cmdIndex += sizeof(CsCmdCamSpline);
+
+ // At Point
+ csCamera->atCmd = (CsCmdCamPoint*)&script[csCamera->cmdIndex];
+ csCamera->cmdIndex += (s16)(csCamera->eyeInterp.numEntries * sizeof(CsCmdCamPoint));
+
+ // Misc Point
+ csCamera->eyeCmd = (CsCmdCamPoint*)&script[csCamera->cmdIndex];
+ csCamera->cmdIndex += (s16)(csCamera->eyeInterp.numEntries * sizeof(CsCmdCamPoint));
+
+ // Misc
+ csCamera->miscCmd = (CsCmdCamMisc*)&script[csCamera->cmdIndex];
+ csCamera->cmdIndex += (s16)(csCamera->eyeInterp.numEntries * sizeof(CsCmdCamMisc));
+
+ // Other Params
+ csCamera->eyeInterp.curPoint = 0;
+ csCamera->atInterp.curPoint = 0;
+
+ csCamera->splineNeedsInit = false;
+ //! FAKE: csCamera->splineIndex++;
+ csCamera->splineIndex = (csCamera->splineIndex & 0xFFFF) + 1;
+ csCamera->state = CS_CAM_STATE_UPDATE_ALL;
+ csCamera->nextSplineTimer = csCamera->updateSplineTimer = 0;
+ csCamera->eyeInterp.unk_2D = csCamera->atInterp.unk_2D = 7;
+ }
+
+ csCamera->nextSplineTimer++;
+
+ if (csCamera->updateSplineTimer <= csCamera->duration) {
+ csCamera->updateSplineTimer++;
+ if (csCamera->updateSplineTimer <= csCamera->duration) {
+ // Process SubCommands
+ if (!CutsceneCamera_ProcessSpline(csCamera)) {
+ csCamera->state = CS_CAM_STATE_DONE_SPLINE;
+ }
+ }
+ }
+ break;
+ }
+
+ if (csCamera->nextSplineTimer > csCamera->duration) {
+ // Next Spline
+ csCamera->splineNeedsInit = true;
+ spline = (CsCmdCamSpline*)&script[csCamera->cmdIndex];
+ if (spline->numEntries == -1) {
+ csCamera->state = CS_CAM_STATE_DONE;
+ return 0;
+ }
+ }
+
+ return csCamera->nextSplineTimer;
+}
+
+// Unused
+s16 func_80161BAC(void) {
+ return (sCurCsCamera->state == CS_CAM_STATE_PAUSE) || (sCurCsCamera->state == CS_CAM_STATE_UPDATE_SPLINE);
+}
+
+void CutsceneCamera_SetState(s16 state) {
+ if (sCurCsCamera->state == CS_CAM_STATE_UPDATE_ALL) {
+ sCurCsCamera->state = state;
+ }
+}
+
+void CutsceneCamera_Reset(void) {
+ sCurCsCamera->state = CS_CAM_STATE_UPDATE_ALL;
+}
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80161C20.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80161E4C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_801620CC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_8016237C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_801623E4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_801624EC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_8016253C.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_801629BC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80162A50.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80162FF8.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_801631DC.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80163334.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/cutscene_camera/func_80163660.s")
diff --git a/src/code/db_camera.c b/src/code/db_camera.c
deleted file mode 100644
index 92b6d87f9..000000000
--- a/src/code/db_camera.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161180.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_8016119C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_8016122C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801612B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161998.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161BAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161BE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161C0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161C20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80161E4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801620CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_8016237C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801623E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801624EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_8016253C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801629BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80162A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80162FF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_801631DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80163334.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/db_camera/func_80163660.s")
diff --git a/src/code/flg_set.c b/src/code/flg_set.c
index a22b62a0e..bb25818a6 100644
--- a/src/code/flg_set.c
+++ b/src/code/flg_set.c
@@ -13,106 +13,106 @@
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
static FlagSetEntry sFlagEntries[] = {
- { &gSaveContext.save.weekEventReg[0], "week_event_reg[0]" },
- { &gSaveContext.save.weekEventReg[1], "week_event_reg[1]" },
- { &gSaveContext.save.weekEventReg[2], "week_event_reg[2]" },
- { &gSaveContext.save.weekEventReg[3], "week_event_reg[3]" },
- { &gSaveContext.save.weekEventReg[4], "week_event_reg[4]" },
- { &gSaveContext.save.weekEventReg[5], "week_event_reg[5]" },
- { &gSaveContext.save.weekEventReg[6], "week_event_reg[6]" },
- { &gSaveContext.save.weekEventReg[7], "week_event_reg[7]" },
- { &gSaveContext.save.weekEventReg[8], "week_event_reg[8]" },
- { &gSaveContext.save.weekEventReg[9], "week_event_reg[9]" },
- { &gSaveContext.save.weekEventReg[10], "week_event_reg[10]" },
- { &gSaveContext.save.weekEventReg[11], "week_event_reg[11]" },
- { &gSaveContext.save.weekEventReg[12], "week_event_reg[12]" },
- { &gSaveContext.save.weekEventReg[13], "week_event_reg[13]" },
- { &gSaveContext.save.weekEventReg[14], "week_event_reg[14]" },
- { &gSaveContext.save.weekEventReg[15], "week_event_reg[15]" },
- { &gSaveContext.save.weekEventReg[16], "week_event_reg[16]" },
- { &gSaveContext.save.weekEventReg[17], "week_event_reg[17]" },
- { &gSaveContext.save.weekEventReg[18], "week_event_reg[18]" },
- { &gSaveContext.save.weekEventReg[19], "week_event_reg[19]" },
- { &gSaveContext.save.weekEventReg[20], "week_event_reg[20]" },
- { &gSaveContext.save.weekEventReg[21], "week_event_reg[21]" },
- { &gSaveContext.save.weekEventReg[22], "week_event_reg[22]" },
- { &gSaveContext.save.weekEventReg[23], "week_event_reg[23]" },
- { &gSaveContext.save.weekEventReg[24], "week_event_reg[24]" },
- { &gSaveContext.save.weekEventReg[25], "week_event_reg[25]" },
- { &gSaveContext.save.weekEventReg[26], "week_event_reg[26]" },
- { &gSaveContext.save.weekEventReg[27], "week_event_reg[27]" },
- { &gSaveContext.save.weekEventReg[28], "week_event_reg[28]" },
- { &gSaveContext.save.weekEventReg[29], "week_event_reg[29]" },
- { &gSaveContext.save.weekEventReg[30], "week_event_reg[30]" },
- { &gSaveContext.save.weekEventReg[31], "week_event_reg[31]" },
- { &gSaveContext.save.weekEventReg[32], "week_event_reg[32]" },
- { &gSaveContext.save.weekEventReg[33], "week_event_reg[33]" },
- { &gSaveContext.save.weekEventReg[34], "week_event_reg[34]" },
- { &gSaveContext.save.weekEventReg[35], "week_event_reg[35]" },
- { &gSaveContext.save.weekEventReg[36], "week_event_reg[36]" },
- { &gSaveContext.save.weekEventReg[37], "week_event_reg[37]" },
- { &gSaveContext.save.weekEventReg[38], "week_event_reg[38]" },
- { &gSaveContext.save.weekEventReg[39], "week_event_reg[39]" },
- { &gSaveContext.save.weekEventReg[40], "week_event_reg[40]" },
- { &gSaveContext.save.weekEventReg[41], "week_event_reg[41]" },
- { &gSaveContext.save.weekEventReg[42], "week_event_reg[42]" },
- { &gSaveContext.save.weekEventReg[43], "week_event_reg[43]" },
- { &gSaveContext.save.weekEventReg[44], "week_event_reg[44]" },
- { &gSaveContext.save.weekEventReg[45], "week_event_reg[45]" },
- { &gSaveContext.save.weekEventReg[46], "week_event_reg[46]" },
- { &gSaveContext.save.weekEventReg[47], "week_event_reg[47]" },
- { &gSaveContext.save.weekEventReg[48], "week_event_reg[48]" },
- { &gSaveContext.save.weekEventReg[49], "week_event_reg[49]" },
- { &gSaveContext.save.weekEventReg[50], "week_event_reg[50]" },
- { &gSaveContext.save.weekEventReg[51], "week_event_reg[51]" },
- { &gSaveContext.save.weekEventReg[52], "week_event_reg[52]" },
- { &gSaveContext.save.weekEventReg[53], "week_event_reg[53]" },
- { &gSaveContext.save.weekEventReg[54], "week_event_reg[54]" },
- { &gSaveContext.save.weekEventReg[55], "week_event_reg[55]" },
- { &gSaveContext.save.weekEventReg[56], "week_event_reg[56]" },
- { &gSaveContext.save.weekEventReg[57], "week_event_reg[57]" },
- { &gSaveContext.save.weekEventReg[58], "week_event_reg[58]" },
- { &gSaveContext.save.weekEventReg[59], "week_event_reg[59]" },
- { &gSaveContext.save.weekEventReg[60], "week_event_reg[60]" },
- { &gSaveContext.save.weekEventReg[61], "week_event_reg[61]" },
- { &gSaveContext.save.weekEventReg[62], "week_event_reg[62]" },
- { &gSaveContext.save.weekEventReg[63], "week_event_reg[63]" },
- { &gSaveContext.save.weekEventReg[64], "week_event_reg[64]" },
- { &gSaveContext.save.weekEventReg[65], "week_event_reg[65]" },
- { &gSaveContext.save.weekEventReg[66], "week_event_reg[66]" },
- { &gSaveContext.save.weekEventReg[67], "week_event_reg[67]" },
- { &gSaveContext.save.weekEventReg[68], "week_event_reg[68]" },
- { &gSaveContext.save.weekEventReg[69], "week_event_reg[69]" },
- { &gSaveContext.save.weekEventReg[70], "week_event_reg[70]" },
- { &gSaveContext.save.weekEventReg[71], "week_event_reg[71]" },
- { &gSaveContext.save.weekEventReg[72], "week_event_reg[72]" },
- { &gSaveContext.save.weekEventReg[73], "week_event_reg[73]" },
- { &gSaveContext.save.weekEventReg[74], "week_event_reg[74]" },
- { &gSaveContext.save.weekEventReg[75], "week_event_reg[75]" },
- { &gSaveContext.save.weekEventReg[76], "week_event_reg[76]" },
- { &gSaveContext.save.weekEventReg[77], "week_event_reg[77]" },
- { &gSaveContext.save.weekEventReg[78], "week_event_reg[78]" },
- { &gSaveContext.save.weekEventReg[79], "week_event_reg[79]" },
- { &gSaveContext.save.weekEventReg[80], "week_event_reg[80]" },
- { &gSaveContext.save.weekEventReg[81], "week_event_reg[81]" },
- { &gSaveContext.save.weekEventReg[82], "week_event_reg[82]" },
- { &gSaveContext.save.weekEventReg[83], "week_event_reg[83]" },
- { &gSaveContext.save.weekEventReg[84], "week_event_reg[84]" },
- { &gSaveContext.save.weekEventReg[85], "week_event_reg[85]" },
- { &gSaveContext.save.weekEventReg[86], "week_event_reg[86]" },
- { &gSaveContext.save.weekEventReg[87], "week_event_reg[87]" },
- { &gSaveContext.save.weekEventReg[88], "week_event_reg[88]" },
- { &gSaveContext.save.weekEventReg[89], "week_event_reg[89]" },
- { &gSaveContext.save.weekEventReg[90], "week_event_reg[90]" },
- { &gSaveContext.save.weekEventReg[91], "week_event_reg[91]" },
- { &gSaveContext.save.weekEventReg[92], "week_event_reg[92]" },
- { &gSaveContext.save.weekEventReg[93], "week_event_reg[93]" },
- { &gSaveContext.save.weekEventReg[94], "week_event_reg[94]" },
- { &gSaveContext.save.weekEventReg[95], "week_event_reg[95]" },
- { &gSaveContext.save.weekEventReg[96], "week_event_reg[96]" },
- { &gSaveContext.save.weekEventReg[97], "week_event_reg[97]" },
- { &gSaveContext.save.weekEventReg[98], "week_event_reg[98]" },
- { &gSaveContext.save.weekEventReg[99], "week_event_reg[99]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[0], "week_event_reg[0]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[1], "week_event_reg[1]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[2], "week_event_reg[2]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[3], "week_event_reg[3]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[4], "week_event_reg[4]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[5], "week_event_reg[5]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[6], "week_event_reg[6]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[7], "week_event_reg[7]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[8], "week_event_reg[8]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[9], "week_event_reg[9]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[10], "week_event_reg[10]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[11], "week_event_reg[11]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[12], "week_event_reg[12]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[13], "week_event_reg[13]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[14], "week_event_reg[14]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[15], "week_event_reg[15]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[16], "week_event_reg[16]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[17], "week_event_reg[17]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[18], "week_event_reg[18]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[19], "week_event_reg[19]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[20], "week_event_reg[20]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[21], "week_event_reg[21]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[22], "week_event_reg[22]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[23], "week_event_reg[23]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[24], "week_event_reg[24]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[25], "week_event_reg[25]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[26], "week_event_reg[26]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[27], "week_event_reg[27]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[28], "week_event_reg[28]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[29], "week_event_reg[29]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[30], "week_event_reg[30]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[31], "week_event_reg[31]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[32], "week_event_reg[32]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[33], "week_event_reg[33]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[34], "week_event_reg[34]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[35], "week_event_reg[35]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[36], "week_event_reg[36]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[37], "week_event_reg[37]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[38], "week_event_reg[38]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[39], "week_event_reg[39]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[40], "week_event_reg[40]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[41], "week_event_reg[41]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[42], "week_event_reg[42]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[43], "week_event_reg[43]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[44], "week_event_reg[44]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[45], "week_event_reg[45]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[46], "week_event_reg[46]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[47], "week_event_reg[47]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[48], "week_event_reg[48]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[49], "week_event_reg[49]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[50], "week_event_reg[50]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[51], "week_event_reg[51]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[52], "week_event_reg[52]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[53], "week_event_reg[53]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[54], "week_event_reg[54]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[55], "week_event_reg[55]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[56], "week_event_reg[56]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[57], "week_event_reg[57]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[58], "week_event_reg[58]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[59], "week_event_reg[59]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[60], "week_event_reg[60]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[61], "week_event_reg[61]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[62], "week_event_reg[62]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[63], "week_event_reg[63]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[64], "week_event_reg[64]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[65], "week_event_reg[65]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[66], "week_event_reg[66]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[67], "week_event_reg[67]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[68], "week_event_reg[68]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[69], "week_event_reg[69]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[70], "week_event_reg[70]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[71], "week_event_reg[71]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[72], "week_event_reg[72]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[73], "week_event_reg[73]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[74], "week_event_reg[74]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[75], "week_event_reg[75]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[76], "week_event_reg[76]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[77], "week_event_reg[77]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[78], "week_event_reg[78]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[79], "week_event_reg[79]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[80], "week_event_reg[80]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[81], "week_event_reg[81]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[82], "week_event_reg[82]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[83], "week_event_reg[83]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[84], "week_event_reg[84]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[85], "week_event_reg[85]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[86], "week_event_reg[86]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[87], "week_event_reg[87]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[88], "week_event_reg[88]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[89], "week_event_reg[89]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[90], "week_event_reg[90]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[91], "week_event_reg[91]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[92], "week_event_reg[92]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[93], "week_event_reg[93]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[94], "week_event_reg[94]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[95], "week_event_reg[95]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[96], "week_event_reg[96]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[97], "week_event_reg[97]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[98], "week_event_reg[98]" },
+ { &gSaveContext.save.saveInfo.weekEventReg[99], "week_event_reg[99]" },
{ &gSaveContext.eventInf[0], "event_inf[0]" },
{ &gSaveContext.eventInf[1], "event_inf[1]" },
@@ -246,8 +246,8 @@ void FlagSet_Update(GameState* gameState) {
if (CHECK_BTN_ALL(input->cur.button, BTN_START)) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.weekEventReg); i++) {
- gSaveContext.save.weekEventReg[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg); i++) {
+ gSaveContext.save.saveInfo.weekEventReg[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
gSaveContext.eventInf[i] = 0;
diff --git a/src/code/game.c b/src/code/game.c
index 4a4be5291..8f4e0f44d 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -11,9 +11,9 @@ f32 gFramerateDivisorThird = 1.0f / 3.0f;
void Game_UpdateFramerateVariables(s32 divisor) {
gFramerateDivisor = divisor;
- gFramerateDivisorF = (f32)divisor;
- gFramerateDivisorHalf = (f32)(divisor * 0.5f);
- gFramerateDivisorThird = (f32)(divisor / 3.0f);
+ gFramerateDivisorF = divisor;
+ gFramerateDivisorHalf = divisor / 2.0f;
+ gFramerateDivisorThird = divisor / 3.0f;
}
void Game_SetFramerateDivisor(GameState* gameState, s32 divisor) {
@@ -22,7 +22,7 @@ void Game_SetFramerateDivisor(GameState* gameState, s32 divisor) {
Game_UpdateFramerateVariables(divisor);
}
-void GameState_SetFBFilter(Gfx** gfx, u32 arg1) {
+void GameState_SetFBFilter(Gfx** gfx, void* zbuffer) {
Gfx* dlist = *gfx;
if ((R_FB_FILTER_TYPE > 0) && (R_FB_FILTER_TYPE < 5)) {
@@ -31,33 +31,29 @@ void GameState_SetFBFilter(Gfx** gfx, u32 arg1) {
D_801F8010.color.g = R_FB_FILTER_PRIM_COLOR(1);
D_801F8010.color.b = R_FB_FILTER_PRIM_COLOR(2);
D_801F8010.color.a = R_FB_FILTER_A;
- func_80140D10(&D_801F8010, &dlist, arg1);
- } else {
- if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) {
- D_801F8020.useRgba = (R_FB_FILTER_TYPE == 6);
- D_801F8020.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
- D_801F8020.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
- D_801F8020.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
- D_801F8020.primColor.a = R_FB_FILTER_A;
- D_801F8020.envColor.r = R_FB_FILTER_ENV_COLOR(0);
- D_801F8020.envColor.g = R_FB_FILTER_ENV_COLOR(1);
- D_801F8020.envColor.b = R_FB_FILTER_ENV_COLOR(2);
- D_801F8020.envColor.a = R_FB_FILTER_A;
- func_80142100(&D_801F8020, &dlist, arg1);
- } else {
- if (R_FB_FILTER_TYPE == 7) {
- sMonoColors.unk_00 = 0;
- sMonoColors.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
- sMonoColors.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
- sMonoColors.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
- sMonoColors.primColor.a = R_FB_FILTER_A;
- sMonoColors.envColor.r = R_FB_FILTER_ENV_COLOR(0);
- sMonoColors.envColor.g = R_FB_FILTER_ENV_COLOR(1);
- sMonoColors.envColor.b = R_FB_FILTER_ENV_COLOR(2);
- sMonoColors.envColor.a = R_FB_FILTER_A;
- VisMono_Draw(&sMonoColors, &dlist);
- }
- }
+ VisCvg_Draw(&D_801F8010, &dlist);
+ } else if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) {
+ sVisZbuf.useRgba = (R_FB_FILTER_TYPE == 6);
+ sVisZbuf.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
+ sVisZbuf.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
+ sVisZbuf.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
+ sVisZbuf.primColor.a = R_FB_FILTER_A;
+ sVisZbuf.envColor.r = R_FB_FILTER_ENV_COLOR(0);
+ sVisZbuf.envColor.g = R_FB_FILTER_ENV_COLOR(1);
+ sVisZbuf.envColor.b = R_FB_FILTER_ENV_COLOR(2);
+ sVisZbuf.envColor.a = R_FB_FILTER_A;
+ VisZbuf_Draw(&sVisZbuf, &dlist, zbuffer);
+ } else if (R_FB_FILTER_TYPE == 7) {
+ sMonoColors.unk_00 = 0;
+ sMonoColors.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
+ sMonoColors.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
+ sMonoColors.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
+ sMonoColors.primColor.a = R_FB_FILTER_A;
+ sMonoColors.envColor.r = R_FB_FILTER_ENV_COLOR(0);
+ sMonoColors.envColor.g = R_FB_FILTER_ENV_COLOR(1);
+ sMonoColors.envColor.b = R_FB_FILTER_ENV_COLOR(2);
+ sMonoColors.envColor.a = R_FB_FILTER_A;
+ VisMono_Draw(&sMonoColors, &dlist);
}
*gfx = dlist;
@@ -76,7 +72,7 @@ void GameState_Draw(GameState* gameState, GraphicsContext* gfxCtx) {
gSPDisplayList(OVERLAY_DISP++, nextDisplayList);
if (R_FB_FILTER_TYPE && R_FB_FILTER_ENV_COLOR(3) == 0) {
- GameState_SetFBFilter(&nextDisplayList, (u32)gfxCtx->zbuffer);
+ GameState_SetFBFilter(&nextDisplayList, gfxCtx->zbuffer);
}
if (R_ENABLE_ARENA_DBG < 0) {
@@ -132,7 +128,7 @@ void func_801736DC(GraphicsContext* gfxCtx) {
}
void Game_UpdateInput(GameState* gameState) {
- Padmgr_GetInput(gameState->input, 1);
+ PadMgr_GetInput(gameState->input, true);
}
void Game_Update(GameState* gameState) {
@@ -198,7 +194,7 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
gameState->main = NULL;
gameState->destroy = NULL;
gameState->running = 1;
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -214,10 +210,10 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
init(gameState);
- func_80140CE0(&D_801F8010);
- func_801420C0(&D_801F8020);
+ VisCvg_Init(&D_801F8010);
+ VisZbuf_Init(&sVisZbuf);
VisMono_Init(&sMonoColors);
- func_80140898(&D_801F8048);
+ ViMode_Init(&D_801F8048);
func_801773A0(&D_801F7FF0);
Rumble_Init();
@@ -236,10 +232,10 @@ void GameState_Destroy(GameState* gameState) {
Rumble_Destroy();
func_801773C4(&D_801F7FF0);
- func_80140D04(&D_801F8010);
- func_801420F4(&D_801F8020);
+ VisCvg_Destroy(&D_801F8010);
+ VisZbuf_Destroy(&sVisZbuf);
VisMono_Destroy(&sMonoColors);
- func_80140900(&D_801F8048);
+ ViMode_Destroy(&D_801F8048);
THA_Destroy(&gameState->heap);
GameAlloc_Cleanup(&gameState->alloc);
}
diff --git a/src/code/graph.c b/src/code/graph.c
index 558f7d563..2e104234e 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -2,7 +2,7 @@
#include "buffers.h"
#include "system_malloc.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
@@ -16,12 +16,12 @@ OSTime sGraphTaskStartTime;
void Graph_FaultClient(void) {
FaultDrawer_DrawText(30, 100, "ShowFrameBuffer PAGE 0/1");
- osViSwapBuffer(SysCfb_GetFbPtr(0));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(0));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
Fault_WaitForInput();
- osViSwapBuffer(SysCfb_GetFbPtr(1));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(1));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
}
@@ -50,7 +50,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) {
gfxCtx->workBuffer = pool->workBuffer;
gfxCtx->debugBuffer = pool->debugBuffer;
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gSegments[0x0F] = gfxCtx->curFrameBuffer;
gfxCtx->zbuffer = SysCfb_GetZBuffer();
@@ -179,7 +179,7 @@ retry:
task->dramStack = (u64*)gGfxSPTaskStack;
task->dramStackSize = sizeof(gGfxSPTaskStack);
task->outputBuff = gGfxSPTaskOutputBufferPtr;
- task->outputBuffSize = gGfxSPTaskOutputBufferSize;
+ task->outputBuffSize = gGfxSPTaskOutputBufferEnd;
task->dataPtr = (u64*)gGfxMasterDL;
task->dataSize = 0;
task->yieldDataPtr = (u64*)gGfxSPTaskYieldBuffer;
@@ -340,18 +340,19 @@ void Graph_ThreadEntry(void* arg) {
u32 size;
s32 pad[2];
- gZBuffer = SystemArena_Malloc(sizeof(*gZBuffer) + sizeof(*gWorkBuffer) + 64 - 1);
- gZBuffer = (void*)ALIGN64((u32)gZBuffer);
+ gZBufferLoRes = SystemArena_Malloc(sizeof(*gZBufferLoRes) + sizeof(*gWorkBufferLoRes) + 64 - 1);
+ gZBufferLoRes = (void*)ALIGN64((u32)gZBufferLoRes);
- gWorkBuffer = (void*)((u8*)gZBuffer + sizeof(*gZBuffer));
+ gWorkBufferLoRes = (void*)((u8*)gZBufferLoRes + sizeof(*gZBufferLoRes));
- gGfxSPTaskOutputBuffer2 = gGfxSPTaskOutputBuffer = SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBuffer));
+ gGfxSPTaskOutputBufferHiRes = gGfxSPTaskOutputBufferLoRes =
+ SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBufferLoRes));
- gGfxSPTaskOutputBufferEnd = (u8*)gGfxSPTaskOutputBuffer + sizeof(*gGfxSPTaskOutputBuffer);
- gGfxSPTaskOutputBufferEnd2 = (u8*)gGfxSPTaskOutputBuffer2 + sizeof(*gGfxSPTaskOutputBuffer2);
+ gGfxSPTaskOutputBufferEndLoRes = (u8*)gGfxSPTaskOutputBufferLoRes + sizeof(*gGfxSPTaskOutputBufferLoRes);
+ gGfxSPTaskOutputBufferEndHiRes = (u8*)gGfxSPTaskOutputBufferHiRes + sizeof(*gGfxSPTaskOutputBufferHiRes);
- func_80178978();
- Fault_SetFB(D_801FBB90, SCREEN_WIDTH, SCREEN_HEIGHT);
+ SysCfb_Init();
+ Fault_SetFB(gWorkBuffer, SCREEN_WIDTH, SCREEN_HEIGHT);
Graph_Init(&gfxCtx);
while (nextOvl) {
diff --git a/src/code/jpegutils.c b/src/code/jpegutils.c
index 904643f46..fbf6c69c2 100644
--- a/src/code/jpegutils.c
+++ b/src/code/jpegutils.c
@@ -86,7 +86,7 @@ u32 JpegUtils_ProcessHuffmanTableImpl(u8* data, JpegHuffmanTable* ht, u8* codesL
s32 temp;
ret = count;
- if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) {
+ if ((count == 0) || (isAc && (count > 0x100)) || (!isAc && (count > 0x10))) {
return 0;
}
if (ret != JpegUtils_GetHuffmanCodes(codesLengths, codes)) {
@@ -141,7 +141,7 @@ u32 JpegUtils_ProcessHuffmanTableImplOld(u8* dht, JpegHuffmanTableOld* ht, u8* c
count2 = count = JpegUtils_ParseHuffmanCodesLengths(dht, codesLengths);
- if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) {
+ if ((count == 0) || (isAc && (count > 0x100)) || (!isAc && (count > 0x10))) {
return true;
}
diff --git a/src/code/main.c b/src/code/main.c
index c4a80f1ea..186240489 100644
--- a/src/code/main.c
+++ b/src/code/main.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "buffers.h"
#include "stack.h"
+#include "stackcheck.h"
+#include "system_heap.h"
extern OSMesgQueue sSiIntMsgQ;
extern OSMesg sSiIntMsgBuf[1];
@@ -25,7 +27,6 @@ extern StackEntry sSchedStackInfo;
extern StackEntry sAudioStackInfo;
extern StackEntry sPadMgrStackInfo;
extern AudioMgr sAudioMgr;
-extern PadMgr gPadMgr;
void Main(void* arg) {
intptr_t fb;
@@ -44,7 +45,7 @@ void Main(void* arg) {
sysHeap = gSystemHeap;
fb = 0x80780000;
startHeapSize = fb - sysHeap;
- SystemArena_Init(sysHeap, startHeapSize);
+ SystemHeap_Init(sysHeap, startHeapSize);
Regs_Init();
diff --git a/src/code/padmgr.c b/src/code/padmgr.c
index 077ef1b2b..a04a14f57 100644
--- a/src/code/padmgr.c
+++ b/src/code/padmgr.c
@@ -1,58 +1,797 @@
+/**
+ * @file padmgr.c
+ *
+ * This file implements communicating with joybus devices at a high level and serving the results to other threads.
+ *
+ * Any device that can be plugged into one of the four controller ports such as a standard N64 controller is a joybus
+ * device. Some joybus devices are also located inside the cartridge such as EEPROM for save data or the Real-Time
+ * Clock, however neither of these are used in Zelda64 and so this type of communication is unimplemented. Unlike the
+ * padmgr implementation in OoT, there are three controller types supported:
+ * - Standard N64 Controller
+ * - N64 Mouse
+ * - Voice Recognition Unit
+ *
+ * Communicating with these devices is broken down into various layers:
+ *
+ * Other threads : The rest of the program that will use the polled data
+ * |
+ * PadMgr : Manages devices, submits polling commands at vertical retrace
+ * |
+ * Libultra osCont* routines : Interface for building commands and safely using the Serial Interface
+ * |
+ * Serial Interface : Hardware unit for sending joybus commands and receiving data via DMA
+ * |
+ * PIF : Forwards joybus commands and receives response data from the devices
+ * |---¬---¬---¬-------¬
+ * 1 2 3 4 5 : The joybus devices plugged into the four controller ports or on the cartridge
+ *
+ * Joybus communication is handled on another thread as polling and receiving controller data is a slow process; the
+ * N64 programming manual section 26.2.4.1 quotes 2 milliseconds as the expected delay from calling
+ * `osContStartReadData` to receiving the data. By running this on a separate thread to the game state, work can be
+ * done while waiting for this operation to complete.
+ */
#include "global.h"
+#include "io/controller.h"
#include "ultra64/motor.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetControllerBitmask.s")
+#define PADMGR_RETRACE_MSG (1 << 0)
+#define PADMGR_PRE_NMI_MSG (1 << 1)
+#define PADMGR_NMI_MSG (1 << 2)
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F24.s")
+typedef enum {
+ /* 0 */ VOICE_INIT_FAILED, // voice initialization failed
+ /* 1 */ VOICE_INIT_TRY, // try to initialize voice
+ /* 2 */ VOICE_INIT_SUCCESS // voice initialized
+} VoiceInitStatus;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F44.s")
+PadMgr* sPadMgrInstance = &gPadMgr;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F7C.s")
+s32 sPadMgrRetraceCount = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80174F9C.s")
+s32 sVoiceInitStatus = VOICE_INIT_TRY;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetEventCallback.s")
+/**
+ * Returns the bitmask of valid controllers.
+ *
+ * bit n set = controller (n+1) available.
+ */
+u8 PadMgr_GetValidControllersMask(void) {
+ return sPadMgrInstance->validCtrlrsMask;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175008.s")
+/**
+ * Sets the callback function intended to be used to modify the rumble pak state on each VI with
+ * calls to `PadMgr_RumbleSetSingle`. The callback may be passed a single user-provided argument.
+ *
+ * @param callback callback to run before rumble state is updated for the current VI
+ * @param arg the argument to pass to the callback
+ *
+ * @see PadMgr_RumbleSetSingle
+ * @see PadMgr_UnsetRumbleRetraceCallback
+ */
+void PadMgr_SetRumbleRetraceCallback(void (*callback)(void*), void* arg) {
+ sPadMgrInstance->rumbleRetraceCallback = callback;
+ sPadMgrInstance->rumbleRetraceArg = arg;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_SetEventCallback.s")
+/**
+ * Unsets the rumble retrace callback if the provided function and argument are the same as those already registered.
+ *
+ * @param callback the callback to test against
+ * @param arg the argument to test against
+ *
+ * @see PadMgr_SetRumbleRetraceCallback
+ */
+void PadMgr_UnsetRumbleRetraceCallback(void (*callback)(void*), void* arg) {
+ if ((sPadMgrInstance->rumbleRetraceCallback == callback) && (sPadMgrInstance->rumbleRetraceArg == arg)) {
+ sPadMgrInstance->rumbleRetraceCallback = NULL;
+ sPadMgrInstance->rumbleRetraceArg = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_8017506C.s")
+/**
+ * Sets the callback function intended to be used to test for particular inputs on each VI, immediately after new
+ * inputs have been polled.
+ *
+ * This is useful for the rare cases where additional resolution is needed in the timings of player inputs,
+ * while the game is still updating comparatively slower.
+ *
+ * @param callback callback to run as soon as new inputs are obtained
+ * @param arg the argument to pass to the callback
+ *
+ * @see PadMgr_UnsetInputRetraceCallback
+ */
+void PadMgr_SetInputRetraceCallback(void (*callback)(void*), void* arg) {
+ sPadMgrInstance->inputRetraceCallback = callback;
+ sPadMgrInstance->inputRetraceArg = arg;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Lock.s")
+/**
+ * Unsets the input retrace callback if the provided function and argument are the same as those already registered.
+ *
+ * @param callback the callback to test against
+ * @param arg the argument to test against
+ *
+ * @see PadMgr_SetInputRetraceCallback
+ */
+void PadMgr_UnsetInputRetraceCallback(void (*callback)(void*), void* arg) {
+ if ((sPadMgrInstance->inputRetraceCallback == callback) && (sPadMgrInstance->inputRetraceArg == arg)) {
+ sPadMgrInstance->inputRetraceCallback = NULL;
+ sPadMgrInstance->inputRetraceArg = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Unlock.s")
+/**
+ * Acquires exclusive access to the serial event queue.
+ *
+ * When a DMA to/from PIF RAM completes, an SI interrupt is generated to notify the process that the DMA has completed
+ * and a message is posted to the serial event queue. If multiple processes are trying to use the SI at the same time
+ * it becomes ambiguous as to which DMA has completed, so a locking system is required to arbitrate access to the SI.
+ *
+ * Once the task requiring the serial event queue is complete, it should be released with a call to
+ * `PadMgr_ReleaseSerialEventQueue()`.
+ *
+ * If another process tries to acquire the event queue, the current thread will be blocked until the event queue is
+ * released. Note the possibility for a deadlock, if the thread that already holds the serial event queue attempts to
+ * acquire it again it will block forever.
+ *
+ * @return The message queue to which SI interrupt events are posted.
+ *
+ * @see PadMgr_ReleaseSerialEventQueue
+ */
+OSMesgQueue* PadMgr_AcquireSerialEventQueue(void) {
+ OSMesgQueue* serialEventQueue;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_801750FC.s")
+ osRecvMesg(&sPadMgrInstance->serialLockQueue, (OSMesg*)&serialEventQueue, OS_MESG_BLOCK);
+ return serialEventQueue;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175364.s")
+/**
+ * Like `PadMgr_AcquireSerialEventQueue` but for Voice access.
+ *
+ * @see PadMgr_AcquireSerialEventQueue
+ * @see PadMgr_VoiceReleaseSerialEventQueue
+ */
+OSMesgQueue* PadMgr_VoiceAcquireSerialEventQueue(void) {
+ OSMesgQueue* serialEventQueue;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175434.s")
+ osRecvMesg(&sPadMgrInstance->serialLockQueue, (OSMesg*)&serialEventQueue, OS_MESG_BLOCK);
+ return serialEventQueue;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_8017544C.s")
+/**
+ * Relinquishes access to the serial message queue, allowing another process to acquire and use it.
+ *
+ * @param serialEventQueue The serial message queue acquired by `PadMgr_AcquireSerialEventQueue`
+ *
+ * @see PadMgr_AcquireSerialEventQueue
+ */
+void PadMgr_ReleaseSerialEventQueue(OSMesgQueue* serialEventQueue) {
+ osSendMesg(&sPadMgrInstance->serialLockQueue, (OSMesg)serialEventQueue, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_RumbleSet.s")
+/**
+ * Like `PadMgr_ReleaseSerialEventQueue` but for Voice access.
+ *
+ * @see PadMgr_VoiceAcquireSerialEventQueue
+ */
+void PadMgr_VoiceReleaseSerialEventQueue(OSMesgQueue* serialEventQueue) {
+ osSendMesg(&sPadMgrInstance->serialLockQueue, (OSMesg)serialEventQueue, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_ControllerHasRumblePak.s")
+/**
+ * Locks controller input data while padmgr is reading new inputs or another thread is using the current inputs.
+ * This prevents new inputs overwriting the current inputs while they are in use.
+ *
+ * @see PadMgr_UnlockPadData
+ */
+void PadMgr_LockPadData(void) {
+ osRecvMesg(&sPadMgrInstance->lockQueue, NULL, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_CalcStickEdges.s")
+/**
+ * Unlocks controller input data, allowing padmgr to read new inputs or another thread to access the most recently
+ * polled inputs.
+ *
+ * @see PadMgr_LockPadData
+ */
+void PadMgr_UnlockPadData(void) {
+ osSendMesg(&sPadMgrInstance->lockQueue, NULL, OS_MESG_BLOCK);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_ParseState.s")
+/**
+ * Activates the rumble pak for all controllers it is enabled on, stops it for all controllers it is disabled on and
+ * attempts to initialize it for a controller if it is not already initialized.
+ */
+void PadMgr_UpdateRumble(void) {
+ s32 i;
+ s32 ret;
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+ s32 triedRumbleComm = false;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_801759BC.s")
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) {
+ // Check status for whether a controller pak is connected
+ if (sPadMgrInstance->padStatus[i].status & CONT_CARD_ON) {
+ if (sPadMgrInstance->pakType[i] == CONT_PAK_RUMBLE) {
+ if (sPadMgrInstance->rumbleEnable[i]) {
+ if (sPadMgrInstance->rumbleTimer[i] < 3) {
+ // Rumble pak start
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175AE0.s")
+ if (osMotorStart(&sPadMgrInstance->rumblePfs[i]) != 0) {
+ // error
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ } else {
+ sPadMgrInstance->rumbleTimer[i] = 3;
+ }
+ triedRumbleComm = true;
+ }
+ } else {
+ if (sPadMgrInstance->rumbleTimer[i] != 0) {
+ // Rumble Pak stop
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Update.s")
+ if (osMotorStop(&sPadMgrInstance->rumblePfs[i]) != 0) {
+ // error
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ } else {
+ sPadMgrInstance->rumbleTimer[i]--;
+ }
+ triedRumbleComm = true;
+ }
+ }
+ }
+ } else if (sPadMgrInstance->pakType[i] != CONT_PAK_NONE) {
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_Stop.s")
+ if (!triedRumbleComm) {
+ // Try to initialize the rumble pak for controller port `i` if a controller pak is connected and not already
+ // known to be an initialized a rumble pak
+ i = sPadMgrRetraceCount % MAXCONTROLLERS;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_80175E68.s")
+ if ((sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) &&
+ (sPadMgrInstance->padStatus[i].status & CONT_CARD_ON) && (sPadMgrInstance->pakType[i] != CONT_PAK_RUMBLE)) {
+ ret = osMotorInit(serialEventQueue, &sPadMgrInstance->rumblePfs[i], i);
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetInput.s")
+ if (ret == 0) {
+ // Got rumble pak
+ sPadMgrInstance->pakType[i] = CONT_PAK_RUMBLE;
+ sPadMgrInstance->rumbleTimer[i] = 2;
+ } else if (ret == PFS_ERR_DEVICE) {
+ // Not a rumble pak
+ if (sPadMgrInstance->pakType[i] != CONT_PAK_OTHER) {
+ sPadMgrInstance->pakType[i] = CONT_PAK_OTHER;
+ }
+ } else if (ret == PFS_ERR_CONTRFAIL) {
+ // Pak communication error
+ } else if (ret == PFS_ERR_NOPACK) {
+ // No controller pak
+ } else {
+ // Unrecognized return code
+ Fault_AddHungupAndCrash("../padmgr.c", 594);
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_GetInput2.s")
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/Padmgr_ThreadEntry.s")
+/**
+ * Immediately stops rumble on all controllers
+ */
+void PadMgr_RumbleStop(void) {
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/PadMgr_Init.s")
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if ((sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL) &&
+ (osMotorInit(serialEventQueue, &sPadMgrInstance->rumblePfs[i], i) == 0)) {
+ // If there is a rumble pak attached to this controller, stop it
+ osMotorStop(&sPadMgrInstance->rumblePfs[i]);
+ }
+ }
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+}
+
+/**
+ * Prevents rumble for 12 VI, ~0.2 seconds at 60 VI/sec
+ */
+void PadMgr_RumblePause(void) {
+ sPadMgrInstance->rumbleOffTimer = 12;
+}
+
+/**
+ * Enables or disables rumble on controller port `port` for 24 VI,
+ * ~0.4 seconds at 60 VI/sec and ~0.48 seconds at 50 VI/sec
+ */
+void PadMgr_RumbleSetSingle(s32 port, s32 enable) {
+ sPadMgrInstance->rumbleEnable[port] = enable;
+ sPadMgrInstance->rumbleOnTimer = 24;
+}
+
+/**
+ * Enables or disables rumble on all controller ports for 24 VI,
+ * ~0.4 seconds at 60 VI/sec and ~0.48 seconds at 50 VI/sec
+ *
+ * @param enable Array of u8 of length MAXCONTROLLERS containing either true or false to enable or disable rumble
+ * for that controller
+ */
+void PadMgr_RumbleSet(u8 enable[MAXCONTROLLERS]) {
+ s32 i;
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ sPadMgrInstance->rumbleEnable[i] = enable[i];
+ }
+ sPadMgrInstance->rumbleOnTimer = 24;
+}
+
+s32 PadMgr_ControllerHasRumblePak(s32 port) {
+ return sPadMgrInstance->pakType[port] == CONT_PAK_RUMBLE;
+}
+
+void PadMgr_AdjustInput(Input* input) {
+ s32 plus;
+ s32 minus;
+ s32 pressX;
+ s32 pressX2;
+ s32 pressY;
+ s32 pressY2;
+ s32 pad1;
+ s32 pad2;
+ s32 pad3;
+ f32 pad4;
+ f32 newX;
+ f32 newY;
+ f32 magnitude;
+ f32 angle;
+ s8 curX = input->cur.stick_x;
+ s8 curY = input->cur.stick_y;
+
+ if (CHECK_BTN_ANY(input->press.button, BTN_RESET) || (input->press.stick_x == 0)) {
+ input->press.stick_x = 61;
+ input->press.errno = -61;
+ input->press.stick_y = 63;
+ input->rel.errno = -63;
+ }
+ pressX = input->press.stick_x;
+ pressX2 = (s8)input->press.errno;
+ pressY = input->press.stick_y;
+ pressY2 = (s8)input->rel.errno;
+
+ if (CHECK_BTN_ANY(input->cur.button, BTN_RESET)) {
+ minus = curX - 7;
+ plus = curX + 7;
+
+ if (minus > 0) {
+ if (pressX < minus - 3) {
+ pressX = minus - 3;
+ input->press.stick_x = minus - 3;
+ }
+ } else if (plus < 0) {
+ if (pressX2 > plus + 3) {
+ pressX2 = plus + 3;
+ input->press.errno = plus + 3;
+ }
+ }
+
+ minus = curY - 7;
+ plus = curY + 7;
+
+ if (minus > 0) {
+ if (pressY < minus - 3) {
+ pressY = minus - 3;
+ input->press.stick_y = minus - 3;
+ }
+ } else if (plus < 0) {
+ if (pressY2 > plus + 3) {
+ pressY2 = plus + 3;
+ input->rel.errno = plus + 3;
+ }
+ }
+ }
+
+ minus = curX - 7;
+ plus = curX + 7;
+
+ if (minus > 0) {
+ newX = (pressX < minus) ? 1.0f : (f32)minus / pressX;
+ } else if (plus < 0) {
+ newX = (pressX2 > plus) ? -1.0f : -(f32)plus / pressX2;
+ } else {
+ newX = 0.0f;
+ }
+
+ minus = curY - 7;
+ plus = curY + 7;
+
+ if (minus > 0) {
+ newY = (pressY < minus) ? 1.0f : (f32)minus / pressY;
+ } else if (plus < 0) {
+ newY = (pressY2 > plus) ? -1.0f : -(f32)plus / pressY2;
+ } else {
+ newY = 0.0f;
+ }
+
+ if (1) {
+ s32 pad;
+
+ magnitude = sqrtf(SQ(newX) + SQ(newY));
+ if (magnitude > 1.0f) {
+ magnitude = 1.0f;
+ }
+ angle = Math_Atan2F_XY(curY, -curX);
+ newX = -sinf(angle) * magnitude;
+ newY = cosf(angle) * magnitude;
+ }
+ input->rel.stick_x = newX * 60.5f;
+ input->rel.stick_y = newY * 60.5f;
+}
+
+/**
+ * Updates `sPadMgrInstance->inputs` based on the error response of each controller
+ */
+void PadMgr_UpdateInputs(void) {
+ s32 diff;
+ Input* input = &sPadMgrInstance->inputs[0];
+ s32 i;
+ OSContPad* pad = &sPadMgrInstance->pads[0];
+
+ for (i = 0; i < sPadMgrInstance->nControllers; i++, input++, pad++) {
+ s32 isStandardController;
+
+ input->prev = input->cur;
+ isStandardController = sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NORMAL;
+ if (isStandardController) {
+ switch (pad->errno) {
+ case 0:
+ // No error, copy inputs
+ input->cur = *pad;
+ break;
+
+ case CHNL_ERR_OVERRUN >> 4:
+ // Overrun error, reuse previous inputs
+ input->cur = input->prev;
+ break;
+
+ case CHNL_ERR_NORESP >> 4:
+ // No response error, take inputs as 0
+ input->cur.button = 0;
+ input->cur.stick_x = 0;
+ input->cur.stick_y = 0;
+ input->cur.errno = pad->errno;
+ if (sPadMgrInstance->ctrlrType[i] != PADMGR_CONT_NONE) {
+ // If we get no response, consider the controller disconnected
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NONE;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ sPadMgrInstance->rumbleTimer[i] = 0xFF;
+ }
+ break;
+
+ default:
+ // Unknown error response
+ Fault_AddHungupAndCrash("../padmgr.c", 1098);
+ break;
+ }
+ } else {
+ input->cur.button = 0;
+ input->cur.stick_x = 0;
+ input->cur.stick_y = 0;
+ input->cur.errno = pad->errno;
+ }
+
+ // If opposed directions on the D-Pad are pressed at the same time, mask both out
+ if ((input->cur.button & (BTN_DDOWN | BTN_DUP)) == (BTN_DDOWN | BTN_DUP)) {
+ input->cur.button &= ~(BTN_DDOWN | BTN_DUP);
+ }
+ if ((input->cur.button & (BTN_DRIGHT | BTN_DLEFT)) == (BTN_DRIGHT | BTN_DLEFT)) {
+ input->cur.button &= ~(BTN_DRIGHT | BTN_DLEFT);
+ }
+
+ // Calculate pressed and relative inputs
+ diff = input->prev.button ^ input->cur.button;
+ input->press.button |= (u16)(diff & input->cur.button);
+ input->rel.button |= (u16)(diff & input->prev.button);
+
+ if (1) {}
+ PadMgr_AdjustInput(input);
+ }
+}
+
+/**
+ * Looks for plugged in voice recognition units and initializes them.
+ *
+ * This runs only on startup, there will be no attempts to initialize
+ * a VRU other than on the first VI retrace.
+ */
+void PadMgr_InitVoice(void) {
+ s32 i;
+ OSMesgQueue* serialEventQueue;
+ s32 ret;
+
+ for (i = 0; i < sPadMgrInstance->nControllers; i++) {
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_VOICE_PLUGGED) {
+ serialEventQueue = PadMgr_AcquireSerialEventQueue();
+
+ ret = osVoiceInit(serialEventQueue, &gVoiceHandle, i);
+
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+
+ if (ret != 0) {
+ // error
+ } else {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE;
+ sVoiceInitStatus = VOICE_INIT_SUCCESS;
+ func_801A4EB0();
+ }
+ }
+ }
+ // If sVoiceInitStatus is still VOICE_INIT_TRY after the first attempt to initialize a VRU, don't try again
+ if (sVoiceInitStatus == VOICE_INIT_TRY) {
+ sVoiceInitStatus = VOICE_INIT_FAILED;
+ }
+}
+
+/**
+ * Update the state of connected controllers
+ */
+void PadMgr_UpdateConnections(void) {
+ s32 ctrlrMask = 0;
+ s32 i;
+ char msg[50];
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (sPadMgrInstance->padStatus[i].errno == 0) {
+ switch (sPadMgrInstance->padStatus[i].type & CONT_TYPE_MASK) {
+ case CONT_TYPE_NORMAL:
+ // Standard N64 Controller
+ ctrlrMask |= (1 << i);
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NORMAL;
+ }
+ break;
+
+ case CONT_TYPE_MOUSE:
+ // N64 Mouse
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_MOUSE;
+ }
+ break;
+
+ case CONT_TYPE_VOICE:
+ // Voice Recognition Unit
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_VOICE_PLUGGED;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ }
+ break;
+
+ default:
+ // Other/Unrecognized
+ if (sPadMgrInstance->ctrlrType[i] == PADMGR_CONT_NONE) {
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_UNK;
+ // "Recognized an unknown type of controller (%04x)"
+ sprintf(msg, "知らない種類のコントローラ(%04x)を認識しました",
+ sPadMgrInstance->padStatus[i].type);
+ }
+ // Missing break required for matching
+ }
+ } else if (sPadMgrInstance->ctrlrType[i] != PADMGR_CONT_NONE) {
+ // Plugged controller errored
+ sPadMgrInstance->ctrlrType[i] = PADMGR_CONT_NONE;
+ sPadMgrInstance->pakType[i] = CONT_PAK_NONE;
+ sPadMgrInstance->rumbleTimer[i] = 0xFF;
+ }
+ }
+ sPadMgrInstance->validCtrlrsMask = ctrlrMask;
+}
+
+void PadMgr_HandleRetrace(void) {
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue();
+
+ // Begin reading controller data
+ osContStartReadData(serialEventQueue);
+
+ // Execute rumble callback
+ if (sPadMgrInstance->rumbleRetraceCallback != NULL) {
+ sPadMgrInstance->rumbleRetraceCallback(sPadMgrInstance->rumbleRetraceArg);
+ }
+
+ // Wait for controller data
+ osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
+ osContGetReadData(sPadMgrInstance->pads);
+
+ // Clear all but controller 1
+ bzero(&sPadMgrInstance->pads[1], sizeof(*sPadMgrInstance->pads) * (MAXCONTROLLERS - 1));
+
+ // If in PreNMI, clear all controllers
+ if (sPadMgrInstance->isResetting) {
+ bzero(sPadMgrInstance->pads, sizeof(sPadMgrInstance->pads));
+ }
+
+ // Query controller statuses
+ osContStartQuery(serialEventQueue);
+ osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
+ osContGetQuery(sPadMgrInstance->padStatus);
+
+ // Lock serial message queue
+ PadMgr_ReleaseSerialEventQueue(serialEventQueue);
+
+ // Update connections
+ PadMgr_UpdateConnections();
+
+ // Lock input data
+ PadMgr_LockPadData();
+
+ // Update input data
+ PadMgr_UpdateInputs();
+
+ // Execute input callback
+ if (sPadMgrInstance->inputRetraceCallback != NULL) {
+ sPadMgrInstance->inputRetraceCallback(sPadMgrInstance->inputRetraceArg);
+ }
+
+ // Unlock input data
+ PadMgr_UnlockPadData();
+
+ // Try and initialize a Voice Recognition Unit if not already attempted
+ if (sVoiceInitStatus != VOICE_INIT_FAILED) {
+ PadMgr_InitVoice();
+ }
+
+ // Rumble Pak
+ if (gFaultStruct.msgId != 0) {
+ // If fault is active, no rumble
+ PadMgr_RumbleStop();
+ } else if (sPadMgrInstance->rumbleOffTimer > 0) {
+ // If the rumble off timer is active, no rumble
+ --sPadMgrInstance->rumbleOffTimer;
+ PadMgr_RumbleStop();
+ } else if (sPadMgrInstance->rumbleOnTimer == 0) {
+ // If the rumble on timer is inactive, no rumble
+ PadMgr_RumbleStop();
+ } else if (!sPadMgrInstance->isResetting) {
+ // If not resetting, update rumble
+ PadMgr_UpdateRumble();
+ --sPadMgrInstance->rumbleOnTimer;
+ }
+
+ sPadMgrRetraceCount++;
+}
+
+void PadMgr_HandlePreNMI(void) {
+ sPadMgrInstance->isResetting = true;
+ PadMgr_RumblePause();
+}
+
+/**
+ * Fetches the most recently polled inputs from padmgr.
+ *
+ * NOTE: This function does not lock the inputs while reading them.
+ * The padmgr thread may interrupt this function and poll new inputs while the thread running this function is
+ * currently copying the old inputs potentially resulting in a mix of newly polled and old inputs being used.
+ * It is preferable to use `PadMgr_GetInput` or `PadMgr_GetInput2`.
+ *
+ * @param inputs Array of Input of length MAXCONTROLLERS to copy inputs into
+ * @param gameRequest True if polling inputs for updating the game state
+ */
+void PadMgr_GetInputNoLock(Input* inputs, s32 gameRequest) {
+ s32 i;
+ Input* input = &sPadMgrInstance->inputs[0];
+ Input* inputOut = &inputs[0];
+ s32 buttonDiff;
+
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (gameRequest) {
+ // Copy inputs as-is, press and rel are calculated prior in `PadMgr_UpdateInputs`
+ *inputOut = *input;
+ // Zero parts of the press and rel inputs in the polled inputs so they are not read more than once
+ input->press.button = 0;
+ input->rel.button = 0;
+ } else {
+ // Take as the previous inputs the inputs that are currently in the destination array
+ inputOut->prev = inputOut->cur;
+ // Copy current inputs from the polled inputs
+ inputOut->cur = input->cur;
+ // Calculate press and rel from these
+ buttonDiff = inputOut->prev.button ^ inputOut->cur.button;
+ inputOut->press.button = inputOut->cur.button & buttonDiff;
+ inputOut->rel.button = inputOut->prev.button & buttonDiff;
+ PadUtils_UpdateRelXY(inputOut);
+ }
+ input++;
+ inputOut++;
+ }
+}
+
+/**
+ * Fetches the most recently polled inputs from padmgr.
+ *
+ * @param inputs Array of Input of length MAXCONTROLLERS to copy inputs into
+ * @param gameRequest True if polling inputs for updating the game state
+ */
+void PadMgr_GetInput(Input* inputs, s32 gameRequest) {
+ PadMgr_LockPadData();
+ PadMgr_GetInputNoLock(inputs, gameRequest);
+ PadMgr_UnlockPadData();
+}
+
+/**
+ * Copy of `PadMgr_GetInput`
+ *
+ * @see PadMgr_GetInput
+ */
+void PadMgr_GetInput2(Input* inputs, s32 gameRequest) {
+ PadMgr_LockPadData();
+ PadMgr_GetInputNoLock(inputs, gameRequest);
+ PadMgr_UnlockPadData();
+}
+
+void PadMgr_ThreadEntry() {
+ s16* interruptMsg = NULL;
+ s32 actionBits;
+ s32 exit;
+
+ osCreateMesgQueue(&sPadMgrInstance->interruptQueue, sPadMgrInstance->interruptMsgBuf,
+ ARRAY_COUNT(sPadMgrInstance->interruptMsgBuf));
+ IrqMgr_AddClient(sPadMgrInstance->irqMgr, &sPadMgrInstance->irqClient, &sPadMgrInstance->interruptQueue);
+
+ actionBits = 0;
+ exit = false;
+
+ while (!exit) {
+ // Process all messages currently in the queue, instead of only a single mssage.
+ // Deduplicates the same message.
+ do {
+ osRecvMesg(&sPadMgrInstance->interruptQueue, (OSMesg*)&interruptMsg, OS_MESG_BLOCK);
+ switch (*interruptMsg) {
+ case OS_SC_RETRACE_MSG:
+ actionBits |= PADMGR_RETRACE_MSG;
+ break;
+
+ case OS_SC_PRE_NMI_MSG:
+ actionBits |= PADMGR_PRE_NMI_MSG;
+ break;
+
+ case OS_SC_NMI_MSG:
+ actionBits |= PADMGR_NMI_MSG;
+ break;
+ }
+ } while (!MQ_IS_EMPTY(&sPadMgrInstance->interruptQueue));
+
+ // Act on received messages
+ while (actionBits != 0) {
+ if (actionBits & PADMGR_NMI_MSG) {
+ actionBits &= ~PADMGR_NMI_MSG;
+ exit = true;
+ } else if (actionBits & PADMGR_PRE_NMI_MSG) {
+ actionBits &= ~PADMGR_PRE_NMI_MSG;
+ PadMgr_HandlePreNMI();
+ } else if (actionBits & PADMGR_RETRACE_MSG) {
+ actionBits &= ~PADMGR_RETRACE_MSG;
+ PadMgr_HandleRetrace();
+ }
+ }
+ }
+
+ IrqMgr_RemoveClient(sPadMgrInstance->irqMgr, &sPadMgrInstance->irqClient);
+}
+
+void PadMgr_Init(OSMesgQueue* siEvtQ, IrqMgr* irqMgr, OSId threadId, OSPri pri, void* stack) {
+ bzero(sPadMgrInstance, sizeof(PadMgr));
+ sPadMgrInstance->irqMgr = irqMgr;
+
+ // These are unique access tokens, there should only ever be room for one OSMesg in these queues
+ osCreateMesgQueue(&sPadMgrInstance->serialLockQueue, &sPadMgrInstance->serialMsg, 1);
+ osCreateMesgQueue(&sPadMgrInstance->lockQueue, &sPadMgrInstance->lockMsg, 1);
+
+ PadMgr_UnlockPadData();
+ PadSetup_Init(siEvtQ, &sPadMgrInstance->validCtrlrsMask, sPadMgrInstance->padStatus);
+ sPadMgrInstance->nControllers = MAXCONTROLLERS;
+ osContSetCh(sPadMgrInstance->nControllers);
+ PadMgr_ReleaseSerialEventQueue(siEvtQ);
+
+ osCreateThread(&sPadMgrInstance->thread, threadId, PadMgr_ThreadEntry, sPadMgrInstance, stack, pri);
+ osStartThread(&sPadMgrInstance->thread);
+}
diff --git a/src/code/sched.c b/src/code/sched.c
index 5f9cdf236..c06eb41ba 100644
--- a/src/code/sched.c
+++ b/src/code/sched.c
@@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h"
#include "global.h"
+#include "stackcheck.h"
#define RSP_DONE_MSG 667
#define RDP_DONE_MSG 668
@@ -24,7 +25,7 @@ void Sched_SwapFramebuffer(CfbInfo* cfbInfo) {
osViSwapBuffer(cfbInfo->swapBuffer);
cfbInfo->updateRate2 = cfbInfo->updateRate;
- if (SREG(62) == 0 && cfbInfo->viMode != NULL) {
+ if ((SREG(62) == 0) && (cfbInfo->viMode != NULL)) {
D_80096B20 = one;
osViSetMode(cfbInfo->viMode);
osViSetSpecialFeatures(cfbInfo->features);
@@ -67,7 +68,7 @@ void Sched_HandleAudioCancel(SchedContext* sched) {
// AUDIO SP Cancel
osSyncPrintf("AUDIO SP キャンセルします\n");
- if (sched->curRSPTask != NULL && sched->curRSPTask->list.t.type == M_AUDTASK) {
+ if ((sched->curRSPTask != NULL) && (sched->curRSPTask->list.t.type == M_AUDTASK)) {
if (!(HW_REG(SP_STATUS_REG, u32) & SP_STATUS_HALT)) {
// Attempts to stop AUDIO SP
osSyncPrintf("AUDIO SP止めようとします\n");
@@ -129,7 +130,7 @@ void Sched_HandleGfxCancel(SchedContext* sched) {
// GRAPH SP Cancel
osSyncPrintf("GRAPH SP キャンセルします\n");
- if (sched->curRSPTask != NULL && sched->curRSPTask->list.t.type == M_GFXTASK) {
+ if ((sched->curRSPTask != NULL) && (sched->curRSPTask->list.t.type == M_GFXTASK)) {
if (!(HW_REG(SP_STATUS_REG, u32) & SP_STATUS_HALT)) {
// GRAPH SP tries to stop
osSyncPrintf("GRAPH SP止めようとします\n");
@@ -226,7 +227,8 @@ s32 Sched_TaskCheckFramebuffers(SchedContext* sched, OSScTask* task) {
void* nextFB = osViGetNextFramebuffer();
void* curFB = osViGetCurrentFramebuffer();
- if (task == NULL || sched->pendingSwapBuf1 != NULL || (curFB == TASK_FRAMEBUFFER(task)->fb1 && curFB != nextFB)) {
+ if ((task == NULL) || (sched->pendingSwapBuf1 != NULL) ||
+ ((curFB == TASK_FRAMEBUFFER(task)->fb1) && (curFB != nextFB))) {
return 0;
}
return 1;
@@ -240,7 +242,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
OSScTask* gfxTask = sched->gfxListHead;
OSScTask* audioTask = sched->audioListHead;
- if ((ret & OS_SC_SP) && sched->audioListHead != NULL) {
+ if ((ret & OS_SC_SP) && (sched->audioListHead != NULL)) {
*spTask = audioTask;
ret &= ~OS_SC_SP;
sched->audioListHead = sched->audioListHead->next;
@@ -248,7 +250,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
sched->audioListTail = NULL;
}
} else if (gfxTask != NULL) {
- if (gfxTask->state & OS_SC_YIELDED || !(gfxTask->flags & OS_SC_NEEDS_RDP)) {
+ if ((gfxTask->state & OS_SC_YIELDED) || !(gfxTask->flags & OS_SC_NEEDS_RDP)) {
if (ret & OS_SC_SP) {
*spTask = gfxTask;
ret &= ~OS_SC_SP;
@@ -258,7 +260,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
}
}
} else if (ret == (OS_SC_SP | OS_SC_DP)) {
- if (TASK_FRAMEBUFFER(gfxTask) == NULL || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
+ if ((TASK_FRAMEBUFFER(gfxTask) == NULL) || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
*spTask = *dpTask = gfxTask;
ret &= ~(OS_SC_SP | OS_SC_DP);
sched->gfxListHead = sched->gfxListHead->next;
@@ -274,7 +276,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
void Sched_TaskUpdateFramebuffer(SchedContext* sched, OSScTask* task) {
sched->pendingSwapBuf1 = TASK_FRAMEBUFFER(task);
- if (sched->curBuf != NULL && sched->curBuf->updateRate2 > 0) {
+ if ((sched->curBuf != NULL) && (sched->curBuf->updateRate2 > 0)) {
return;
}
Sched_RetraceUpdateFramebuffer(sched, sched->pendingSwapBuf1);
@@ -313,7 +315,7 @@ void Sched_RunTask(SchedContext* sched, OSScTask* spTask, OSScTask* dpTask) {
return;
}
// Write back the data cache to ensure imminent SP DMA does not miss anything
- if (spTask->list.t.type != M_AUDTASK && !(spTask->state & OS_SC_YIELDED)) {
+ if ((spTask->list.t.type != M_AUDTASK) && !(spTask->state & OS_SC_YIELDED)) {
osWritebackDCacheAll();
}
spTask->state &= ~(OS_SC_YIELD | OS_SC_YIELDED);
@@ -326,9 +328,11 @@ void Sched_RunTask(SchedContext* sched, OSScTask* spTask, OSScTask* dpTask) {
case M_AUDTASK:
sRSPAudioStartTime = time;
break;
+
case M_GFXTASK:
sRSPGFXStartTime = time;
break;
+
default:
if (1) {}
sRSPOtherStartTime = time;
@@ -365,7 +369,7 @@ void Sched_HandleEntry(SchedContext* sched) {
Sched_QueueTask(sched, msg);
}
// If there is an audio task pending and an RSP task is running, yield the current task.
- if (sched->audioListHead != NULL && sched->curRSPTask != NULL) {
+ if ((sched->audioListHead != NULL) && (sched->curRSPTask != NULL)) {
Sched_Yield(sched);
return;
}
@@ -395,7 +399,7 @@ void Sched_HandleRetrace(SchedContext* sched) {
if (sched->curBuf->updateRate2 > 0) {
sched->curBuf->updateRate2--;
}
- if (sched->curBuf->updateRate2 <= 0 && sched->pendingSwapBuf1 != NULL) {
+ if ((sched->curBuf->updateRate2 <= 0) && (sched->pendingSwapBuf1 != NULL)) {
Sched_RetraceUpdateFramebuffer(sched, sched->pendingSwapBuf1);
}
}
@@ -420,9 +424,11 @@ void Sched_HandleRSPDone(SchedContext* sched) {
case M_AUDTASK:
gRSPAudioTotalTime += time - sRSPAudioStartTime;
break;
+
case M_GFXTASK:
sRSPGFXTotalTime += time - sRSPGFXStartTime;
break;
+
default:
if (1) {}
sRSPOtherTotalTime += time - sRSPOtherStartTime;
@@ -554,15 +560,19 @@ void Sched_ThreadEntry(void* arg) {
case RDP_AUDIO_CANCEL_MSG:
Sched_HandleAudioCancel(sched);
continue;
+
case RSP_GFX_CANCEL_MSG:
Sched_HandleGfxCancel(sched);
continue;
+
case ENTRY_MSG:
Sched_HandleEntry(sched);
continue;
+
case RSP_DONE_MSG:
Sched_HandleRSPDone(sched);
continue;
+
case RDP_DONE_MSG:
Sched_HandleRDPDone(sched);
continue;
@@ -572,9 +582,11 @@ void Sched_ThreadEntry(void* arg) {
case OS_SC_RETRACE_MSG:
Sched_HandleRetrace(sched);
continue;
+
case OS_SC_PRE_NMI_MSG:
Sched_HandleReset(sched);
continue;
+
case OS_SC_NMI_MSG:
Sched_HandleStop(sched);
continue;
diff --git a/src/code/sys_cfb.c b/src/code/sys_cfb.c
index 25d92227c..29d6e39c4 100644
--- a/src/code/sys_cfb.c
+++ b/src/code/sys_cfb.c
@@ -1,21 +1,129 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178750.s")
+extern u16 gFramebufferHiRes0[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
+extern u16 gFramebufferHiRes1[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178818.s")
+OSViMode sNotebookViMode; // placeholder name
+void* gFramebuffers[2];
+OSViMode* gActiveViMode;
+u16* gZBufferPtr;
+void* gWorkBuffer;
+u64* gGfxSPTaskOutputBufferPtr;
+void* gGfxSPTaskOutputBufferEnd;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178978.s")
+void* sCfbLoRes1;
+void* sCfbLoRes0;
+u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndLoRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_801789D4.s")
+void* sCfbHiRes1;
+void* sCfbHiRes0;
+u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndHiRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetFbPtr.s")
+s16 gCfbWidth;
+s16 gCfbHeight;
+s16 gCfbLeftAdjust;
+s16 gCfbUpperAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetZBuffer.s")
+u8 gSysCfbHiResEnabled;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A24.s")
+void SysCfb_SetLoResMode(void) {
+ gFramebuffers[1] = sCfbLoRes1;
+ gFramebuffers[0] = sCfbLoRes0;
+ gZBufferPtr = *gZBufferLoRes;
+ gWorkBuffer = gWorkBufferLoRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferLoRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndLoRes;
+ gCfbWidth = SCREEN_WIDTH;
+ gCfbHeight = SCREEN_HEIGHT;
+ gCfbLeftAdjust = 0;
+ gCfbUpperAdjust = 0;
+ gSysCfbHiResEnabled = false;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ gActiveViMode = &osViModeNtscLan1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A34.s")
+void SysCfb_SetHiResMode(void) {
+ gFramebuffers[1] = sCfbHiRes1;
+ gFramebuffers[0] = sCfbHiRes0;
+ gZBufferPtr = *gZBufferHiRes;
+ gWorkBuffer = gWorkBufferHiRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferHiRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndHiRes;
+ if (1) {}
+ gCfbWidth = HIRES_BUFFER_WIDTH;
+ gCfbHeight = HIRES_BUFFER_HEIGHT;
+ gCfbLeftAdjust = 30;
+ gCfbUpperAdjust = 10;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ if ((gCfbWidth == SCREEN_WIDTH_HIRES) && (gCfbHeight == SCREEN_HEIGHT_HIRES)) {
+ gActiveViMode = &osViModeNtscHpf1;
+ } else {
+ s32 rightAdjust;
+ s32 lowerAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A94.s")
+ //! FAKE:
+ l1:
+ rightAdjust = gCfbWidth - 610;
+ lowerAdjust = gCfbHeight - 470;
+ ViMode_Configure(&sNotebookViMode, -1, osTvType, 0, 1, 0, 1, gCfbWidth, gCfbHeight, 30, rightAdjust, 10,
+ lowerAdjust);
+ gActiveViMode = &sNotebookViMode;
+ }
+ gSysCfbHiResEnabled = true;
+}
+
+void SysCfb_Init(void) {
+ sCfbLoRes1 = gFramebuffer1;
+ sCfbLoRes0 = gFramebuffer0;
+ sCfbHiRes1 = gFramebufferHiRes1;
+ sCfbHiRes0 = gFramebufferHiRes0;
+ SysCfb_SetLoResMode();
+}
+
+// Unused
+void SysCfb_Reset(void) {
+ gFramebuffers[0] = NULL;
+ gFramebuffers[1] = NULL;
+}
+
+void* SysCfb_GetFramebuffer(s32 index) {
+ if (index < 2) {
+ return gFramebuffers[index];
+ }
+ return NULL;
+}
+
+void* SysCfb_GetZBuffer(void) {
+ return gZBufferPtr;
+}
+
+void* SysCfb_GetWorkBuffer(void) {
+ return gWorkBuffer;
+}
+
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y) {
+ u16* zBuff = SysCfb_GetZBuffer();
+ u16 val;
+
+ if (zBuff != NULL) {
+ val = (&zBuff[x])[y * gCfbWidth];
+ } else {
+ val = 0;
+ }
+ return val;
+}
+
+s32 SysCfb_GetZBufferInt(s32 x, s32 y) {
+ return Environment_ZBufValToFixedPoint(SysCfb_GetZBufferPixel(x, y) << 2) >> 3;
+}
diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c
index b2a17d547..715892b49 100644
--- a/src/code/sys_cmpdma.c
+++ b/src/code/sys_cmpdma.c
@@ -2,7 +2,7 @@
#include "system_malloc.h"
typedef struct {
- union {
+ /* 0x0 */ union {
u32 dmaWord[2];
u32 dataStart;
u32 dataSize;
@@ -11,7 +11,7 @@ typedef struct {
u32 end;
} offset;
};
-} CmpDmaBuffer;
+} CmpDmaBuffer; // size = 0x8
CmpDmaBuffer sDmaBuffer;
diff --git a/src/code/sys_flashrom.c b/src/code/sys_flashrom.c
index e9ea6e21e..c2665741e 100644
--- a/src/code/sys_flashrom.c
+++ b/src/code/sys_flashrom.c
@@ -1,43 +1,253 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
+#include "stackcheck.h"
#include "system_malloc.h"
-// extern UNK_TYPE1 D_801FBE10;
-// extern UNK_TYPE1 D_801FBE28;
-// extern UNK_TYPE1 D_801FBE2C;
-// extern UNK_TYPE4 D_801FBE30;
-extern STACK(sSysFlashromStack, 0x1000);
-extern StackEntry sys_flashromStackEntry;
-extern OSThread sys_flashromOSThread;
-extern s80185D40 D_801FD008;
-extern OSMesg D_801FD034;
+OSMesgQueue sFlashromMesgQueue;
+OSMesg sFlashromMesg[1];
+s32 sFlashromIsInit;
+s32 sFlashromVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s")
+STACK(sSysFlashromStack, 0x1000);
+StackEntry sSysFlashromStackInfo;
+OSThread sSysFlashromThread;
+FlashromRequest sFlashromRequest;
+OSMesg sSysFlashromMsgBuf[1];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857D0.s")
+s32 SysFlashrom_IsInit(void) {
+ return sFlashromIsInit;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185864.s")
+const char* SysFlashrom_GetVendorStr(void) {
+ switch (sFlashromVendor) {
+ case FLASH_VERSION_MX_PROTO_A:
+ return "PROTO A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185908.s")
+ case FLASH_VERSION_MX_A:
+ return "A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185968.s")
+ case FLASH_VERSION_MX_C:
+ return "C";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801859F0.s")
+ case FLASH_VERSION_MEI:
+ return "D(NEW)";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185A2C.s")
+ case FLASH_VERSION_MX_B_AND_D:
+ return "B or D";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185B1C.s")
+ default:
+ return "UNKNOWN";
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185BE4.s")
+s32 SysFlashrom_CheckFlashType(void) {
+ u32 flashType;
+ u32 flashVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185C24.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osFlashReadId(&flashType, &flashVendor);
+ sFlashromVendor = flashVendor;
+ if (flashType == FLASH_TYPE_MAGIC) {
+ if ((flashVendor == FLASH_VERSION_MX_PROTO_A) || (flashVendor == FLASH_VERSION_MX_A) ||
+ (flashVendor == FLASH_VERSION_MX_C) || (flashVendor == FLASH_VERSION_MEI) ||
+ (flashVendor == FLASH_VERSION_MX_B_AND_D)) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s")
+s32 SysFlashrom_InitFlash(void) {
+ osCreateMesgQueue(&sFlashromMesgQueue, sFlashromMesg, ARRAY_COUNT(sFlashromMesg));
+ osFlashInit();
+ sFlashromIsInit = true;
+ if (SysFlashrom_CheckFlashType() != 0) {
+ sFlashromIsInit = false;
+ return -1;
+ }
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185DDC.s")
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185EC4.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osInvalDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ osFlashReadArray(&msg, OS_MESG_PRI_NORMAL, pageNum, addr, pageCount, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F04.s")
+s32 SysFlashrom_EraseSector(u32 page) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return osFlashSectorErase(page);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F64.s")
+s32 SysFlashrom_ExecWrite(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
+ s32 result;
+ u32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ // Ensure the page is always aligned to a sector boundary.
+ if ((pageNum % FLASH_PAGE_SIZE) != 0) {
+ Fault_AddHungupAndCrash("../sys_flashrom.c", 275);
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ for (i = 0; i < pageCount; i++) {
+ osFlashWriteBuffer(&msg, OS_MESG_PRI_NORMAL, (u8*)addr + i * FLASH_PAGE_SIZE, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ result = osFlashWriteArray(i + pageNum);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return 0;
+}
+
+s32 SysFlashrom_AttemptWrite(void* addr, u32 pageNum, u32 pageCount) {
+ s32 result;
+ s32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ i = 0;
+failRetry:
+ result = SysFlashrom_EraseSector(pageNum);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ result = SysFlashrom_ExecWrite(addr, pageNum, pageCount);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ return 0;
+}
+
+// Flash bits can only by flipped with a write from 1 -> 0. Going from 0 -> 1 requires an erasure.
+// This function will try to determine if any sectors need to be erased before writing saving erase cycles.
+s32 SysFlashrom_NeedsToErase(void* data, void* addr, u32 pageCount) {
+ u32 size;
+ u32 i;
+
+ for (i = 0; i < pageCount * FLASH_PAGE_SIZE; i += 4) {
+ if ((*(s32*)data & *(s32*)addr) != *(s32*)addr) {
+ return false;
+ }
+ }
+ return true;
+}
+
+s32 SysFlashrom_WriteData(void* addr, u32 pageNum, u32 pageCount) {
+ void* data;
+ size_t size;
+ s32 ret;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ size = pageCount * FLASH_PAGE_SIZE;
+ data = SystemArena_Malloc(size);
+ if (data == NULL) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ // Will always erase the sector even if it wouldn't normally need to.
+ if (SysFlashrom_NeedsToErase(data, addr, pageCount)) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ }
+ if (ret == 0) {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ ret = -1;
+ }
+ }
+ }
+ SystemArena_Free(data);
+ }
+ return ret;
+}
+
+void SysFlashrom_ThreadEntry(void* arg) {
+ FlashromRequest* req = (FlashromRequest*)arg;
+
+ switch (req->requestType) {
+ case FLASHROM_REQUEST_WRITE:
+ req->response = SysFlashrom_WriteData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+
+ case FLASHROM_REQUEST_READ:
+ req->response = SysFlashrom_ReadData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+ }
+}
+
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount) {
+ FlashromRequest* req = &sFlashromRequest;
+ if (SysFlashrom_IsInit()) {
+ req->requestType = FLASHROM_REQUEST_WRITE;
+ req->addr = addr;
+ req->pageNum = pageNum;
+ req->pageCount = pageCount;
+ osCreateMesgQueue(&req->messageQueue, sSysFlashromMsgBuf, ARRAY_COUNT(sSysFlashromMsgBuf));
+ StackCheck_Init(&sSysFlashromStackInfo, sSysFlashromStack, STACK_TOP(sSysFlashromStack), 0, 0x100,
+ "sys_flashrom");
+ osCreateThread(&sSysFlashromThread, Z_THREAD_ID_FLASHROM, SysFlashrom_ThreadEntry, req,
+ STACK_TOP(sSysFlashromStack), Z_PRIORITY_FLASHROM);
+ osStartThread(&sSysFlashromThread);
+ }
+}
+
+s32 SysFlashrom_IsBusy(void) {
+ OSMesgQueue* queue = &sFlashromRequest.messageQueue;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return MQ_IS_FULL(queue);
+}
+
+s32 SysFlashrom_AwaitResult(void) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osRecvMesg(&sFlashromRequest.messageQueue, NULL, OS_MESG_BLOCK);
+ osDestroyThread(&sSysFlashromThread);
+ StackCheck_Cleanup(&sSysFlashromStackInfo);
+ return sFlashromRequest.response;
+}
+
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount) {
+ SysFlashrom_WriteDataAsync(addr, pageNum, pageCount);
+ SysFlashrom_AwaitResult();
+}
diff --git a/src/code/sys_math.c b/src/code/sys_math.c
index da4ccc9d2..99d13c332 100644
--- a/src/code/sys_math.c
+++ b/src/code/sys_math.c
@@ -4,15 +4,17 @@
*/
#include "global.h"
-static f32 sFactorialTbl[] = { 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f,
- 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f };
+static f32 sFactorialTbl[] = {
+ 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f, 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f,
+};
-// Rename to Math_FactorialF
/**
* Takes a float, returns the factorial of it(s trunctation), iteratively
* Unused
+ *
+ * @remark original name: "ffact"
*/
-f32 func_80179300(f32 n) {
+f32 Math_FactorialF(f32 n) {
f32 ret = 1.0f;
s32 i;
@@ -23,12 +25,13 @@ f32 func_80179300(f32 n) {
return ret;
}
-// Rename to Math_Factorial
/**
* Takes an int and returns its factorial as a float. Uses the lookup table for n <= 12.
* Unused
+ *
+ * @remark original name: "ifact"
*/
-f32 func_80179400(s32 n) {
+f32 Math_Factorial(s32 n) {
f32 ret;
s32 i;
@@ -45,12 +48,13 @@ f32 func_80179400(s32 n) {
return ret;
}
-// Rename to Math_PowF
/**
* Returns base^{exp} if exp is nonnegative and 1.0f otherwise.
* Unused
+ *
+ * @remark original name: "powi"
*/
-f32 pow_int(f32 base, s32 exp) {
+f32 Math_PowF(f32 base, s32 exp) {
f32 ret = 1.0f;
while (exp > 0) {
@@ -61,20 +65,22 @@ f32 pow_int(f32 base, s32 exp) {
return ret;
}
-// Rename to Math_SinF
/**
* Takes an angle in radians and returns the sine.
+ *
+ * @remark original name: "sinf_table"
*/
-f32 sin_rad(f32 rad) {
- return sins(RADF_TO_BINANG(rad)) * SHT_MINV;
+f32 Math_SinF(f32 rad) {
+ return sins(RAD_TO_BINANG(rad)) * SHT_MINV;
}
-// Rename to Math_CosF
/**
* Takes an angle in radians and returns the cosine.
+ *
+ * @remark original name: "cosf_table"
*/
-f32 cos_rad(f32 rad) {
- return coss(RADF_TO_BINANG(rad)) * SHT_MINV;
+f32 Math_CosF(f32 rad) {
+ return coss(RAD_TO_BINANG(rad)) * SHT_MINV;
}
/**
@@ -84,10 +90,9 @@ f32 Rand_ZeroFloat(f32 scale) {
return Rand_ZeroOne() * scale;
}
-// Rename to Rand_CenteredFloat
/**
* Returns a pseudo-random floating-point number between (- scale / 2) and (scale / 2). Originally in z_actor in OoT.
*/
-f32 randPlusMinusPoint5Scaled(f32 scale) {
+f32 Rand_CenteredFloat(f32 scale) {
return Rand_Centered() * scale;
}
diff --git a/src/code/sys_math_atan.c b/src/code/sys_math_atan.c
index 72383b6b9..ef05676f5 100644
--- a/src/code/sys_math_atan.c
+++ b/src/code/sys_math_atan.c
@@ -127,7 +127,7 @@ s16 Math_Atan2S(f32 y, f32 x) {
}
f32 Math_Atan2F(f32 y, f32 x) {
- return Math_Atan2S(y, x) * (M_PI / 0x8000);
+ return BINANG_TO_RAD(Math_Atan2S(y, x));
}
// Match the OoT implementation of Math_Atan2S
diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c
index 63857676e..de8da3def 100644
--- a/src/code/sys_matrix.c
+++ b/src/code/sys_matrix.c
@@ -444,8 +444,8 @@ void Matrix_RotateXFApply(f32 x) {
if (x != 0.0f) {
cmf = sCurrentMatrix;
- sin = sins(RADF_TO_BINANG(x)) * SHT_MINV;
- cos = coss(RADF_TO_BINANG(x)) * SHT_MINV;
+ sin = sins(RAD_TO_BINANG(x)) * SHT_MINV;
+ cos = coss(RAD_TO_BINANG(x)) * SHT_MINV;
tempY = cmf->xy;
tempZ = cmf->xz;
diff --git a/src/code/sys_rumble.c b/src/code/sys_rumble.c
index 4101758be..06bef6e34 100644
--- a/src/code/sys_rumble.c
+++ b/src/code/sys_rumble.c
@@ -24,12 +24,12 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
if (D_801D1E70) {
for (i = 0; i < MAXCONTROLLERS; i++) {
- func_8017544C(i, false);
+ PadMgr_RumbleSetSingle(i, false);
}
}
D_801D1E70 = rumbleMgr->updateEnabled;
- func_80175434();
+ PadMgr_RumblePause();
return;
}
@@ -39,7 +39,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
// Start up the manager by wiping old requests
if (rumbleMgr->state == RUMBLEMANAGER_STATE_INITIAL) {
for (i = 0; i < MAXCONTROLLERS; i++) {
- func_8017544C(i, false);
+ PadMgr_RumbleSetSingle(i, false);
}
for (i = 0; i < RUMBLE_REQUEST_BUFFER_SIZE; i++) {
@@ -59,7 +59,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
rumbleMgr->state = RUMBLEMANAGER_STATE_RUNNING;
- func_80175434();
+ PadMgr_RumblePause();
}
if (rumbleMgr->state != RUMBLEMANAGER_STATE_WIPE) {
@@ -146,7 +146,7 @@ void RumbleManager_Update(RumbleManager* rumbleMgr) {
rumbleMgr->overrideDecayStep = 0;
rumbleMgr->overrideAccumulator = 0;
- func_80175434();
+ PadMgr_RumblePause();
}
}
diff --git a/src/code/sys_slowly.c b/src/code/sys_slowly.c
index 29ac0db78..754c5d472 100644
--- a/src/code/sys_slowly.c
+++ b/src/code/sys_slowly.c
@@ -10,6 +10,7 @@
*/
#include "slowly.h"
#include "global.h"
+#include "stackcheck.h"
void Slowly_Main(SlowlyMgr* slowly) {
slowly->status |= SLOWLY_STATUS_STARTED;
diff --git a/src/code/title_setup.c b/src/code/title_setup.c
index 4e9293ce7..841c301e2 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -48,7 +48,7 @@ void Setup_SetRegs(void) {
}
void Setup_InitImpl(SetupState* this) {
- func_80185908();
+ SysFlashrom_InitFlash();
SaveContext_Init();
Setup_SetRegs();
diff --git a/src/code/z_DLF.c b/src/code/z_DLF.c
index 020edcf27..aa5c0325d 100644
--- a/src/code/z_DLF.c
+++ b/src/code/z_DLF.c
@@ -46,7 +46,7 @@ void Overlay_FreeGameState(GameStateOverlay* overlayEntry) {
s32 var_v0;
if (overlayEntry->loadedRamAddr != NULL) {
- var_v0 = overlayEntry->unk_28 != 0 ? -1 : 0;
+ var_v0 = (overlayEntry->unk_28 != 0) ? -1 : 0;
if (var_v0 == 0) {
overlayEntry->unk_14 = (uintptr_t)(
(overlayEntry->unk_14 != NULL)
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 8a516eb71..e7bc92a26 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -4,6 +4,7 @@
*/
#include "global.h"
+#include "z64horse.h"
#include "z64load.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -76,7 +77,7 @@ void ActorShadow_Draw(Actor* actor, Lights* lights, PlayState* play, Gfx* dlist,
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
COMBINED);
@@ -218,7 +219,7 @@ void ActorShadow_DrawFeet(Actor* actor, Lights* mapper, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
actor->shape.feetFloorFlags = 0;
spB8 = 2;
@@ -234,8 +235,9 @@ void ActorShadow_DrawFeet(Actor* actor, Lights* mapper, PlayState* play) {
if (distToFloor <= 10.0f) {
actor->shape.feetFloorFlags |= spB8;
- if ((actor->depthInWater < 0.0f) && (bgId == 0x32) && ((actor->shape.unk_17 & spB8) != 0)) {
- if (func_800C9C24(&play->colCtx, poly, bgId, 1)) {
+ if ((actor->depthInWater < 0.0f) && (bgId == BGCHECK_SCENE) && (actor->shape.unk_17 & spB8)) {
+ if (SurfaceType_HasMaterialProperty(&play->colCtx, poly, bgId,
+ MATERIAL_PROPERTY_SOFT_IMPRINT)) {
SkinMatrix_MtxFCopy(&sp13C, &spFC);
SkinMatrix_MulYRotation(&spFC, actor->shape.rot.y);
EffFootmark_Add(play, &spFC, actor, i, feetPosPtr, (actor->shape.shadowScale * 0.3f),
@@ -359,7 +361,7 @@ void func_800B4B50(Actor* actor, Lights* mapper, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
func_800C0094(actor->floorPoly, actor->world.pos.x, actor->floorHeight, actor->world.pos.z, &sp94);
temp_f22 = (f32)actor->shape.shadowAlpha * (1.0f - (spEC * (1.0f / 30.0f)));
@@ -474,6 +476,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
Actor* actor = targetCtx->targetedActor;
OPEN_DISPS(play->state.gfxCtx);
+
if (targetCtx->unk48 != 0) {
TargetContextEntry* entry;
s16 alpha = 255;
@@ -521,7 +524,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
Target_SetPos(targetCtx, targetCtx->unk4C, projectedPos.x, projectedPos.y, projectedPos.z);
if ((!(player->stateFlags1 & PLAYER_STATE1_40)) || (actor != player->targetedActor)) {
- OVERLAY_DISP = Gfx_CallSetupDL(OVERLAY_DISP, 0x39);
+ OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_57);
for (spB0 = 0, spAC = targetCtx->unk4C; spB0 < spB8; spB0++, spAC = (spAC + 1) % 3) {
entry = &targetCtx->unk50[spAC];
@@ -563,7 +566,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
if ((actor != NULL) && !(actor->flags & ACTOR_FLAG_CANT_LOCK_ON)) {
TatlColor* color = &sTatlColorList[actor->category];
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x07);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_7);
Matrix_Translate(actor->focus.pos.x,
actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y) + 17.0f,
@@ -596,10 +599,10 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
targetCtx->unk_94 = sp68;
}
- if (targetCtx->unk8C != 0) {
+ if (targetCtx->unk8C != NULL) {
sp68 = targetCtx->unk8C;
targetCtx->unk8C = NULL;
- } else if (actor != 0) {
+ } else if (actor != NULL) {
sp68 = actor;
}
@@ -638,7 +641,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
Target_SetColors(targetCtx, sp68, category, play);
}
- if (actor != NULL && targetCtx->unk4B == 0) {
+ if ((actor != NULL) && (targetCtx->unk4B == 0)) {
Actor_GetProjectedPos(play, &actor->focus.pos, &projectedPos, &invW);
if ((projectedPos.z <= 0.0f) || (fabsf(projectedPos.x * invW) >= 1.0f) ||
(fabsf(projectedPos.y * invW) >= 1.0f)) {
@@ -693,7 +696,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
* Tests if current scene switch flag is set.
*/
s32 Flags_GetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -703,7 +706,7 @@ s32 Flags_GetSwitch(PlayState* play, s32 flag) {
* Sets current scene switch flag.
*/
void Flags_SetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -712,7 +715,7 @@ void Flags_SetSwitch(PlayState* play, s32 flag) {
* Unsets current scene switch flag.
*/
void Flags_UnsetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] &= ~(1 << (flag & 0x1F));
}
}
@@ -791,7 +794,7 @@ void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) {
* Tests if current scene collectible flag is set.
*/
s32 Flags_GetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -801,7 +804,7 @@ s32 Flags_GetCollectible(PlayState* play, s32 flag) {
* Sets current scene collectible flag.
*/
void Flags_SetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -848,17 +851,12 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
if (titleCtx->alpha != 0) {
s32 width = titleCtx->width;
s32 height = titleCtx->height;
- s32 unk1;
- s32 spC0;
- s32 sp38;
- s32 spB8;
- s32 spB4;
- s32 temp;
-
- temp = width * 2;
- spC0 = (titleCtx->x * 4) - temp;
- spB8 = (titleCtx->y * 4) - (height * 2);
- sp38 = width * 2;
+ s32 doubleWidth = width * 2;
+ s32 titleX = (titleCtx->x * 4) - doubleWidth;
+ s32 doubleHeight = height * 2;
+ s32 titleY = (titleCtx->y * 4) - doubleHeight;
+ s32 titleSecondY;
+ s32 textureLanguageOffset;
OPEN_DISPS(gameState->gfxCtx);
@@ -866,29 +864,30 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
height = TMEM_SIZE / width;
}
- spB4 = spB8 + (height * 4);
+ titleSecondY = titleY + (height * 4);
- OVERLAY_DISP = func_8012C014(OVERLAY_DISP);
+ OVERLAY_DISP = Gfx_SetupDL52_NoCD(OVERLAY_DISP);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32*)titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
+ gDPLoadTextureBlock(OVERLAY_DISP++, titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB8, ((sp38 * 2) + spC0) - 4, spB8 + (height * 4) - 1,
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
height = titleCtx->height - height;
+ // If texture is bigger than 0x1000, display the rest
if (height > 0) {
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
+ gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB4, ((sp38 * 2) + spC0) - 4, spB4 + (height * 4) - 1,
- G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
+ titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
CLOSE_DISPS(gameState->gfxCtx);
@@ -907,41 +906,38 @@ s32 func_800B6434(PlayState* play, TitleCardContext* titleCtx) {
return true;
}
-// ActorContext_1F4 Init
-void func_800B6468(PlayState* play) {
- play->actorCtx.unk_1F4.timer = 0;
+void Actor_InitPlayerImpact(PlayState* play) {
+ play->actorCtx.playerImpact.timer = 0;
}
-// ActorContext_1F4 Update
-void func_800B6474(PlayState* play) {
- DECR(play->actorCtx.unk_1F4.timer);
+void Actor_UpdatePlayerImpact(PlayState* play) {
+ DECR(play->actorCtx.playerImpact.timer);
}
-// ActorContext_1F4 setter something
-s32 func_800B648C(PlayState* play, s32 arg1, s32 timer, f32 arg3, Vec3f* arg4) {
- if ((play->actorCtx.unk_1F4.timer != 0) && (arg3 < play->actorCtx.unk_1F4.unk_04)) {
+s32 Actor_SetPlayerImpact(PlayState* play, PlayerImpactType type, s32 timer, f32 dist, Vec3f* pos) {
+ if ((play->actorCtx.playerImpact.timer != 0) && (dist < play->actorCtx.playerImpact.dist)) {
return false;
}
- play->actorCtx.unk_1F4.unk_00 = arg1;
- play->actorCtx.unk_1F4.timer = timer;
- play->actorCtx.unk_1F4.unk_04 = arg3;
- Math_Vec3f_Copy(&play->actorCtx.unk_1F4.unk_08, arg4);
+ play->actorCtx.playerImpact.type = type;
+ play->actorCtx.playerImpact.timer = timer;
+ play->actorCtx.playerImpact.dist = dist;
+ Math_Vec3f_Copy(&play->actorCtx.playerImpact.pos, pos);
return true;
}
-// ActorContext_1F4 getter something
-f32 func_800B64FC(PlayState* play, f32 arg1, Vec3f* arg2, s32* arg3) {
- f32 temp_f8;
+f32 Actor_GetPlayerImpact(PlayState* play, f32 range, Vec3f* pos, PlayerImpactType* type) {
+ f32 dist;
- if ((play->actorCtx.unk_1F4.timer == 0) || (arg1 == 0.0f)) {
+ if ((play->actorCtx.playerImpact.timer == 0) || (range == 0.0f)) {
return -1.0f;
}
- temp_f8 = Math_Vec3f_DistXYZ(&play->actorCtx.unk_1F4.unk_08, arg2) / arg1;
- *arg3 = play->actorCtx.unk_1F4.unk_00;
- return play->actorCtx.unk_1F4.unk_04 - temp_f8;
+ dist = Math_Vec3f_DistXYZ(&play->actorCtx.playerImpact.pos, pos) / range;
+ *type = play->actorCtx.playerImpact.type;
+
+ return play->actorCtx.playerImpact.dist - dist;
}
/**
@@ -1363,20 +1359,20 @@ s32 func_800B7200(Player* player) {
return (player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) || (player->csMode != PLAYER_CSMODE_0);
}
-void func_800B722C(GameState* gameState, Player* player) {
- func_800F40A0(gameState, player);
+void Actor_SpawnHorse(PlayState* play, Player* player) {
+ Horse_Spawn(play, player);
}
s32 func_800B724C(PlayState* play, Actor* actor, u8 csMode) {
Player* player = GET_PLAYER(play);
- if ((player->csMode == PLAYER_CSMODE_5) || ((csMode == PLAYER_CSMODE_6) && (player->csMode == PLAYER_CSMODE_0))) {
+ if ((player->csMode == PLAYER_CSMODE_5) || ((csMode == PLAYER_CSMODE_END) && (player->csMode == PLAYER_CSMODE_0))) {
return false;
}
player->csMode = csMode;
player->unk_398 = actor;
- player->unk_3BA = 0;
+ player->doorBgCamIndex = 0;
return true;
}
@@ -1384,7 +1380,7 @@ s32 func_800B7298(PlayState* play, Actor* actor, u8 csMode) {
Player* player = GET_PLAYER(play);
if (func_800B724C(play, actor, csMode)) {
- player->unk_3BA = 1;
+ player->doorBgCamIndex = 1;
return true;
}
return false;
@@ -1502,12 +1498,12 @@ void Actor_GetSlopeDirection(CollisionPoly* floorPoly, Vec3f* slopeNormal, s16*
*downwardSlopeYaw = Math_Atan2S_XY(slopeNormal->z, slopeNormal->x);
}
-s32 func_800B761C(Actor* actor, f32 arg1, s32 arg2) {
+s32 func_800B761C(Actor* actor, f32 arg1, s32 updBgCheckInfoFlags) {
if (actor->bgCheckFlags & BGCHECKFLAG_GROUND) {
actor->bgCheckFlags &= ~BGCHECKFLAG_GROUND;
actor->bgCheckFlags |= BGCHECKFLAG_GROUND_LEAVE;
- if ((actor->velocity.y < 0.0f) && (arg2 & 0x10)) {
+ if ((actor->velocity.y < 0.0f) && (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_10)) {
actor->velocity.y = 0.0f;
}
return false;
@@ -1516,16 +1512,16 @@ s32 func_800B761C(Actor* actor, f32 arg1, s32 arg2) {
return true;
}
-s32 func_800B7678(PlayState* play, Actor* actor, Vec3f* pos, s32 flags) {
+s32 func_800B7678(PlayState* play, Actor* actor, Vec3f* pos, s32 updBgCheckInfoFlags) {
f32 distToFloor;
s32 bgId;
- pos->y += (flags & 0x800) ? 10.0f : 50.0f;
+ pos->y += (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_800) ? 10.0f : 50.0f;
actor->floorHeight = BgCheck_EntityRaycastFloor5_2(play, &play->colCtx, &actor->floorPoly, &bgId, actor, pos);
actor->bgCheckFlags &= ~(BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_GROUND_LEAVE | BGCHECKFLAG_GROUND_STRICT);
if (actor->floorHeight <= BGCHECK_Y_MIN) {
- return func_800B761C(actor, BGCHECK_Y_MIN, flags);
+ return func_800B761C(actor, BGCHECK_Y_MIN, updBgCheckInfoFlags);
}
distToFloor = actor->floorHeight - actor->world.pos.y;
@@ -1551,47 +1547,47 @@ s32 func_800B7678(PlayState* play, Actor* actor, Vec3f* pos, s32 flags) {
if (actor->velocity.y <= 0.0f) {
if (!(actor->bgCheckFlags & BGCHECKFLAG_GROUND)) {
actor->bgCheckFlags |= BGCHECKFLAG_GROUND_TOUCH;
- } else if ((flags & 8) && (actor->gravity < 0.0f)) {
+ } else if ((updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_8) && (actor->gravity < 0.0f)) {
actor->velocity.y = -4.0f;
- } else if (!(flags & 0x100)) {
+ } else if (!(updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_100)) {
actor->velocity.y = 0.0f;
}
actor->bgCheckFlags |= BGCHECKFLAG_GROUND;
- BgCheck2_AttachToMesh(&play->colCtx, actor, (s32)actor->floorBgId);
+ DynaPolyActor_AttachCarriedActor(&play->colCtx, actor, actor->floorBgId);
}
} else {
- return func_800B761C(actor, distToFloor, flags);
+ return func_800B761C(actor, distToFloor, updBgCheckInfoFlags);
}
return true;
}
void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight, f32 wallCheckRadius,
- f32 ceilingCheckHeight, u32 flags) {
+ f32 ceilingCheckHeight, u32 updBgCheckInfoFlags) {
f32 sp94 = actor->world.pos.y - actor->prevPos.y;
s32 pad;
Vec3f pos;
if ((actor->floorBgId != BGCHECK_SCENE) && (actor->bgCheckFlags & BGCHECKFLAG_GROUND)) {
- BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, actor->floorBgId, actor);
+ DynaPolyActor_TransformCarriedActor(&play->colCtx, actor->floorBgId, actor);
}
- if (flags & 1) {
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_1) {
s32 bgId;
actor->bgCheckFlags &= ~BGCHECKFLAG_PLAYER_1000;
- if ((!(flags & 0x80) &&
+ if ((!(updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_80) &&
(BgCheck_EntitySphVsWall3(&play->colCtx, &pos, &actor->world.pos, &actor->prevPos, wallCheckRadius,
&actor->wallPoly, &bgId, actor, wallCheckHeight))) ||
- ((flags & 0x80) &&
+ ((updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_80) &&
(BgCheck_EntitySphVsWall4(&play->colCtx, &pos, &actor->world.pos, &actor->prevPos, wallCheckRadius,
&actor->wallPoly, &bgId, actor, wallCheckHeight)))) {
CollisionPoly* sp7C = actor->wallPoly;
actor->bgCheckFlags |= BGCHECKFLAG_WALL;
- if ((flags & 0x200) && (actor->bgCheckFlags & BGCHECKFLAG_PLAYER_1000) && ((s32)sp7C->normal.y > 0) &&
- (sqrtf(SQXYZ(actor->colChkInfo.displacement)) < 10.0f)) {
+ if ((updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_200) && (actor->bgCheckFlags & BGCHECKFLAG_PLAYER_1000) &&
+ ((s32)sp7C->normal.y > 0) && (sqrtf(SQXYZ(actor->colChkInfo.displacement)) < 10.0f)) {
actor->bgCheckFlags &= ~BGCHECKFLAG_WALL;
} else if (actor->bgCheckFlags & BGCHECKFLAG_WALL) {
Math_Vec3f_Copy(&actor->world.pos, &pos);
@@ -1606,7 +1602,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
pos.x = actor->world.pos.x;
pos.z = actor->world.pos.z;
- if (flags & 2) {
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_2) {
f32 y;
pos.y = actor->prevPos.y + 4.0f;
@@ -1618,12 +1614,12 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
actor->bgCheckFlags &= ~BGCHECKFLAG_CEILING;
}
}
- if (flags & 4) {
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_4) {
WaterBox* waterbox;
f32 y;
pos.y = actor->prevPos.y;
- func_800B7678(play, actor, &pos, flags);
+ func_800B7678(play, actor, &pos, updBgCheckInfoFlags);
y = actor->world.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, actor->world.pos.x, actor->world.pos.z, &y, &waterbox)) {
@@ -1632,7 +1628,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
actor->bgCheckFlags &= ~(BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
} else if (!(actor->bgCheckFlags & BGCHECKFLAG_WATER)) {
actor->bgCheckFlags |= (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
- if (!(flags & 0x40)) {
+ if (!(updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_40)) {
Vec3f sp64;
sp64.x = actor->world.pos.x;
@@ -1652,7 +1648,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
}
}
- if (flags & 0x400) {
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_400) {
WaterBox* waterbox;
f32 y = actor->world.pos.y;
@@ -1663,7 +1659,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
actor->bgCheckFlags &= ~(BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
} else if (!(actor->bgCheckFlags & BGCHECKFLAG_WATER)) {
actor->bgCheckFlags |= (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
- if (!(flags & 0x40)) {
+ if (!(updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_40)) {
Vec3f sp50;
sp50.x = actor->world.pos.x;
@@ -1879,7 +1875,7 @@ s32 func_800B8500(Actor* actor, PlayState* play, f32 xzRange, f32 yRange, Player
player->talkActorDistance = actor->xzDistToPlayer;
player->exchangeItemId = exchangeItemId;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
return true;
}
@@ -2031,12 +2027,12 @@ s32 Actor_OfferGetItem(Actor* actor, PlayState* play, GetItemId getItemId, f32 x
if (!(player->stateFlags1 &
(PLAYER_STATE1_80 | PLAYER_STATE1_1000 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000 |
PLAYER_STATE1_80000 | PLAYER_STATE1_100000 | PLAYER_STATE1_200000)) &&
- Player_GetExplosiveHeld(player) < 0) {
+ (Player_GetExplosiveHeld(player) <= PLAYER_EXPLOSIVE_NONE)) {
if ((actor->xzDistToPlayer <= xzRange) && (fabsf(actor->playerHeightRel) <= fabsf(yRange))) {
- if ((getItemId == GI_MASK_CIRCUS_LEADER || getItemId == GI_PENDANT_OF_MEMORIES ||
- getItemId == GI_DEED_LAND ||
- ((player->heldActor != NULL || actor == player->talkActor) &&
- (getItemId > GI_NONE && getItemId < GI_MAX))) ||
+ if (((getItemId == GI_MASK_CIRCUS_LEADER) || (getItemId == GI_PENDANT_OF_MEMORIES) ||
+ (getItemId == GI_DEED_LAND) ||
+ (((player->heldActor != NULL) || (actor == player->talkActor)) &&
+ ((getItemId > GI_NONE) && (getItemId < GI_MAX)))) ||
!(player->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_20000000))) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
s32 absYawDiff = ABS_ALT(yawDiff);
@@ -2047,7 +2043,7 @@ s32 Actor_OfferGetItem(Actor* actor, PlayState* play, GetItemId getItemId, f32 x
player->getItemDirection = absYawDiff;
if ((getItemId > GI_NONE) && (getItemId < GI_MAX)) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[1]);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_ITEM_GET]);
}
return true;
@@ -2122,7 +2118,7 @@ s32 Actor_SetRideActor(PlayState* play, Actor* horse, s32 mountSide) {
PLAYER_STATE1_40000 | PLAYER_STATE1_80000 | PLAYER_STATE1_100000 | PLAYER_STATE1_200000))) {
player->rideActor = horse;
player->mountSide = mountSide;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
return true;
}
@@ -2183,20 +2179,20 @@ void Actor_PlaySfx(Actor* actor, u16 sfxId) {
}
void func_800B8EF4(PlayState* play, Actor* actor) {
- u32 sfxId;
+ SurfaceSfxOffset surfaceSfxOffset;
if (actor->bgCheckFlags & BGCHECKFLAG_WATER) {
if (actor->depthInWater < 20.0f) {
- sfxId = NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_SHALLOW;
} else {
- sfxId = NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_DEEP;
}
} else {
- sfxId = SurfaceType_GetSfx(&play->colCtx, actor->floorPoly, actor->floorBgId);
+ surfaceSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, actor->floorPoly, actor->floorBgId);
}
Audio_PlaySfxAtPos(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
- Audio_PlaySfxAtPos(&actor->projectedPos, sfxId + SFX_FLAG);
+ Audio_PlaySfxAtPos(&actor->projectedPos, NA_SE_PL_WALK_GROUND + surfaceSfxOffset);
}
void func_800B8F98(Actor* actor, u16 sfxId) {
@@ -2248,7 +2244,7 @@ void func_800B9098(Actor* actor) {
}
s32 func_800B90AC(PlayState* play, Actor* actor, CollisionPoly* polygon, s32 bgId, Vec3f* arg4) {
- if (func_800C99D4(&play->colCtx, polygon, bgId) == 8) {
+ if (SurfaceType_GetFloorType(&play->colCtx, polygon, bgId) == FLOOR_TYPE_8) {
return true;
}
@@ -2302,7 +2298,7 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
actorCtx->sceneFlags.clearedRoom = cycleFlags->clearedRoom;
TitleCard_ContextInit(&play->state, &actorCtx->titleCtxt);
- func_800B6468(play);
+ Actor_InitPlayerImpact(play);
actorCtx->absoluteSpace = NULL;
@@ -2310,7 +2306,7 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
Actor_TargetContextInit(&actorCtx->targetContext, actorCtx->actorLists[ACTORCAT_PLAYER].first, play);
Actor_InitHalfDaysBit(actorCtx);
Fault_AddClient(&sActorFaultClient, (void*)Actor_PrintLists, actorCtx, NULL);
- func_800B722C(&play->state, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
+ Actor_SpawnHorse(play, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
}
/**
@@ -2391,12 +2387,12 @@ Actor* Actor_UpdateActor(UpdateActor_Params* params) {
} else {
if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) {
Actor_Kill(actor);
- } else if (((params->requiredActorFlag) && !(actor->flags & params->requiredActorFlag)) ||
- ((((!params->requiredActorFlag) != 0)) &&
+ } else if ((params->requiredActorFlag && !(actor->flags & params->requiredActorFlag)) ||
+ (((!params->requiredActorFlag) != 0) &&
(!(actor->flags & ACTOR_FLAG_100000) ||
((actor->category == ACTORCAT_EXPLOSIVES) && (params->player->stateFlags1 & PLAYER_STATE1_200))) &&
- params->canFreezeCategory && (actor != params->talkActor) &&
- ((actor != params->player->heldActor)) && (actor->parent != ¶ms->player->actor))) {
+ params->canFreezeCategory && (actor != params->talkActor) && (actor != params->player->heldActor) &&
+ (actor->parent != ¶ms->player->actor))) {
CollisionCheck_ResetDamage(&actor->colChkInfo);
} else {
Math_Vec3f_Copy(&actor->prevPos, &actor->world.pos);
@@ -2425,7 +2421,7 @@ Actor* Actor_UpdateActor(UpdateActor_Params* params) {
}
actor->update(actor, play);
- BgCheck_ResetFlagsIfLoadedActor(play, &play->colCtx.dyna, actor);
+ DynaPoly_UnsetAllInteractFlags(play, &play->colCtx.dyna, actor);
}
CollisionCheck_ResetDamage(&actor->colChkInfo);
@@ -2515,7 +2511,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
}
if (i == ACTORCAT_BG) {
- DynaPoly_Setup(play, &play->colCtx.dyna);
+ DynaPoly_UpdateContext(play, &play->colCtx.dyna);
}
}
@@ -2558,7 +2554,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
}
TitleCard_Update(&play->state, &actorCtx->titleCtxt);
- func_800B6474(play);
+ Actor_UpdatePlayerImpact(play);
DynaPoly_UpdateBgActorTransforms(play, &play->colCtx.dyna);
}
@@ -2576,7 +2572,7 @@ void Actor_Draw(PlayState* play, Actor* actor) {
(actor->flags & (ACTOR_FLAG_10000000 | ACTOR_FLAG_400000)) ? NULL : &actor->world.pos, play);
Lights_Draw(light, play->state.gfxCtx);
- if (actor->flags & ACTOR_FLAG_1000) {
+ if (actor->flags & ACTOR_FLAG_IGNORE_QUAKE) {
Matrix_SetTranslateRotateYXZ(actor->world.pos.x + play->mainCamera.quakeOffset.x,
actor->world.pos.y +
((actor->shape.yOffset * actor->scale.y) + play->mainCamera.quakeOffset.y),
@@ -2655,11 +2651,11 @@ void func_800B9D1C(Actor* actor) {
if (sfxId) {}
if (actor->audioFlags & 0x40) {
- func_801A1FB4(3, &actor->projectedPos, NA_BGM_MUSIC_BOX_HOUSE, 1500.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &actor->projectedPos, NA_BGM_MUSIC_BOX_HOUSE, 1500.0f);
}
if (actor->audioFlags & 0x20) {
- func_801A1FB4(0, &actor->projectedPos, NA_BGM_KAMARO_DANCE, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_MAIN, &actor->projectedPos, NA_BGM_KAMARO_DANCE, 900.0f);
}
}
@@ -2711,7 +2707,7 @@ void Actor_DrawLensActors(PlayState* play, s32 numLensActors, Actor** lensActors
spA4 = play->unk_18E68;
if (dbgVar2) {
- PreRender_SetValues(&play->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, zbuffer);
+ PreRender_SetValues(&play->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, zbuffer);
gfxTemp = gfx;
func_80170200(&play->pauseBgPreRender, &gfxTemp, zbuffer, spA4);
@@ -3125,8 +3121,8 @@ void Actor_FreeOverlay(ActorOverlay* entry) {
Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 posX, f32 posY, f32 posZ, s16 rotX,
s16 rotY, s16 rotZ, s32 params) {
- return Actor_SpawnAsChildAndCutscene(actorCtx, play, actorId, posX, posY, posZ, rotX, rotY, rotZ, params, -1,
- HALFDAYBIT_ALL, NULL);
+ return Actor_SpawnAsChildAndCutscene(actorCtx, play, actorId, posX, posY, posZ, rotX, rotY, rotZ, params,
+ CS_ID_NONE, HALFDAYBIT_ALL, NULL);
}
ActorInit* Actor_LoadOverlay(ActorContext* actorCtx, s16 index) {
@@ -3170,7 +3166,7 @@ ActorInit* Actor_LoadOverlay(ActorContext* actorCtx, s16 index) {
}
Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s16 index, f32 x, f32 y, f32 z, s16 rotX,
- s16 rotY, s16 rotZ, s32 params, u32 cutscene, u32 halfDaysBits, Actor* parent) {
+ s16 rotY, s16 rotZ, s32 params, u32 csId, u32 halfDaysBits, Actor* parent) {
s32 pad;
Actor* actor;
ActorInit* actorInit;
@@ -3200,7 +3196,7 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1
}
overlayEntry = &gActorOverlayTable[index];
- if (overlayEntry->vramStart != 0) {
+ if (overlayEntry->vramStart != NULL) {
overlayEntry->numLoaded++;
}
@@ -3236,10 +3232,10 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1
actor->home.rot.y = rotY;
actor->home.rot.z = rotZ;
actor->params = params & 0xFFFF;
- actor->cutscene = (cutscene & 0x7F);
+ actor->csId = csId & 0x7F;
- if (actor->cutscene == 0x7F) {
- actor->cutscene = -1;
+ if (actor->csId == 0x7F) {
+ actor->csId = CS_ID_NONE;
}
if (halfDaysBits != 0) {
@@ -3262,8 +3258,8 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1
Actor* Actor_SpawnAsChild(ActorContext* actorCtx, Actor* parent, PlayState* play, s16 actorId, f32 posX, f32 posY,
f32 posZ, s16 rotX, s16 rotY, s16 rotZ, s32 params) {
- return Actor_SpawnAsChildAndCutscene(actorCtx, play, actorId, posX, posY, posZ, rotX, rotY, rotZ, params, -1,
- parent->halfDaysBits, parent);
+ return Actor_SpawnAsChildAndCutscene(actorCtx, play, actorId, posX, posY, posZ, rotX, rotY, rotZ, params,
+ CS_ID_NONE, parent->halfDaysBits, parent);
}
void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
@@ -3273,12 +3269,12 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
for (i = 0; i < numTransitionActors; transitionActorList++, i++) {
if (transitionActorList->id >= 0) {
- if ((transitionActorList->sides[0].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[0].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[0].room)) ||
- (transitionActorList->sides[1].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[1].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[1].room))) {
+ if (((transitionActorList->sides[0].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[0].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[0].room))) ||
+ ((transitionActorList->sides[1].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[1].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[1].room)))) {
s16 rotY = DEG_TO_BINANG((transitionActorList->rotY >> 7) & 0x1FF);
if (Actor_SpawnAsChildAndCutscene(actorCtx, play, transitionActorList->id & 0x1FFF,
@@ -3394,7 +3390,7 @@ void func_800BB604(GameState* gameState, ActorContext* actorCtx, Player* player,
if ((actor != targetedActor) || (actor->flags & ACTOR_FLAG_80000)) {
temp_f0_2 = func_800B82EC(actor, player, D_801ED8DC);
- phi_s2_2 = (actor->flags & 1) != 0;
+ phi_s2_2 = (actor->flags & ACTOR_FLAG_1) != 0;
if (phi_s2_2) {
phi_s2_2 = temp_f0_2 < D_801ED8C8;
}
@@ -3492,49 +3488,50 @@ void Enemy_StartFinishingBlow(PlayState* play, Actor* actor) {
}
// blinking routine
-s16 func_800BBAC0(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
+s16 func_800BBAC0(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
}
- if (arg0[1] - arg3 > 0) {
- arg0[0] = 0;
- } else if ((arg0[1] - arg3 >= -1) || (arg0[1] < 2)) {
- arg0[0] = 1;
+ if (info->blinkTimer - arg3 > 0) {
+ info->eyeTexIndex = 0;
+ } else if ((info->blinkTimer - arg3 >= -1) || (info->blinkTimer < 2)) {
+ info->eyeTexIndex = 1;
} else {
- arg0[0] = 2;
+ info->eyeTexIndex = 2;
}
- return arg0[0];
+ return info->eyeTexIndex;
}
// blinking routine
-s16 func_800BBB74(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
+s16 func_800BBB74(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
}
- if (arg0[1] - arg3 > 0) {
- arg0[0] = 0;
- } else if (arg0[1] - arg3 == 0) {
- arg0[0] = 1;
+ if (info->blinkTimer - arg3 > 0) {
+ info->eyeTexIndex = 0;
+ } else if (info->blinkTimer - arg3 == 0) {
+ info->eyeTexIndex = 1;
} else {
- arg0[0] = 2;
+ info->eyeTexIndex = 2;
}
- return arg0[0];
+ return info->eyeTexIndex;
}
// unused blinking routine
-s16 func_800BBC20(s16 arg0[2], s16 arg1, s16 arg2, s16 arg3) {
- if (DECR(arg0[1]) == 0) {
- arg0[1] = Rand_S16Offset(arg1, arg2);
- arg0[0]++;
- if ((arg0[0] % 3) == 0) {
- arg0[0] = (s32)(Rand_ZeroOne() * arg3) * 3;
+s16 func_800BBC20(BlinkInfo* info, s16 arg1, s16 arg2, s16 arg3) {
+ if (DECR(info->blinkTimer) == 0) {
+ info->blinkTimer = Rand_S16Offset(arg1, arg2);
+ info->eyeTexIndex++;
+ if ((info->eyeTexIndex % 3) == 0) {
+ info->eyeTexIndex = (s32)(Rand_ZeroOne() * arg3) * 3;
}
}
- return arg0[0];
+
+ return info->eyeTexIndex;
}
void Actor_SpawnBodyParts(Actor* actor, PlayState* play, s32 partParams, Gfx** dList) {
@@ -3570,8 +3567,8 @@ void Actor_SpawnFloorDustRing(PlayState* play, Actor* actor, Vec3f* posXZ, f32 r
accel.y += (Rand_ZeroOne() - 0.5f) * 0.2f;
for (i = countMinusOne; i >= 0; i--) {
- pos.x = (sin_rad(angle) * radius) + posXZ->x;
- pos.z = (cos_rad(angle) * radius) + posXZ->z;
+ pos.x = (Math_SinF(angle) * radius) + posXZ->x;
+ pos.z = (Math_CosF(angle) * radius) + posXZ->z;
accel.x = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
accel.z = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
@@ -3616,15 +3613,15 @@ void func_800BC154(PlayState* play, ActorContext* actorCtx, Actor* actor, u8 act
// Damage flags for EnArrow
u32 sArrowDmgFlags[] = {
- DMG_FIRE_ARROW, // ENARROW_0
- DMG_NORMAL_ARROW, // ENARROW_1
- DMG_NORMAL_ARROW, // ENARROW_2
- DMG_FIRE_ARROW, // ENARROW_3
- DMG_ICE_ARROW, // ENARROW_4
- DMG_LIGHT_ARROW, // ENARROW_5
- DMG_DEKU_NUT, // ENARROW_6
- DMG_DEKU_BUBBLE, // ENARROW_7
- DMG_DEKU_NUT, // ENARROW_8
+ DMG_FIRE_ARROW, // ARROW_TYPE_NORMAL_LIT
+ DMG_NORMAL_ARROW, // ARROW_TYPE_NORMAL_HORSE
+ DMG_NORMAL_ARROW, // ARROW_TYPE_NORMAL
+ DMG_FIRE_ARROW, // ARROW_TYPE_FIRE
+ DMG_ICE_ARROW, // ARROW_TYPE_ICE
+ DMG_LIGHT_ARROW, // ARROW_TYPE_LIGHT
+ DMG_DEKU_NUT, // ARROW_TYPE_SLINGSHOT
+ DMG_DEKU_BUBBLE, // ARROW_TYPE_DEKU_BUBBLE
+ DMG_DEKU_NUT, // ARROW_TYPE_DEKU_NUT
};
u32 Actor_GetArrowDmgFlags(s32 params) {
@@ -3726,7 +3723,7 @@ s16 Actor_TestFloorInDirection(Actor* actor, PlayState* play, f32 distance, s16
actor->world.pos.x += dx;
actor->world.pos.z += dz;
- Actor_UpdateBgCheckInfo(play, actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Math_Vec3f_Copy(&actor->world.pos, &actorPos);
ret = actor->bgCheckFlags & BGCHECKFLAG_GROUND;
@@ -3770,7 +3767,7 @@ void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
adjustedPos.x = pos->x;
@@ -3793,30 +3790,29 @@ void func_800BC620(Vec3f* pos, Vec3f* scale, u8 alpha, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-void Actor_AddQuake(PlayState* play, s16 verticalMag, s16 countdown) {
- s16 quakeIndex = Quake_Add(&play->mainCamera, QUAKE_TYPE_3);
+void Actor_RequestQuake(PlayState* play, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(&play->mainCamera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
}
-void Actor_AddQuakeWithSpeed(PlayState* play, s16 verticalMag, s16 countdown, s16 speed) {
- s16 quakeIndex = Quake_Add(&play->mainCamera, QUAKE_TYPE_3);
+void Actor_RequestQuakeWithSpeed(PlayState* play, s16 y, s16 duration, s16 speed) {
+ s16 quakeIndex = Quake_Request(&play->mainCamera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, speed);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
}
-// Actor_RequestRumble?
-void func_800BC848(Actor* actor, PlayState* play, s16 y, s16 countdown) {
- if (y >= 5) {
+void Actor_RequestQuakeAndRumble(Actor* actor, PlayState* play, s16 quakeY, s16 quakeDuration) {
+ if (quakeY >= 5) {
Rumble_Request(actor->xyzDistToPlayerSq, 255, 20, 150);
} else {
Rumble_Request(actor->xyzDistToPlayerSq, 180, 20, 100);
}
- Actor_AddQuake(play, y, countdown);
+ Actor_RequestQuake(play, quakeY, quakeDuration);
}
typedef struct {
@@ -4375,26 +4371,30 @@ Gfx* func_800BD9A0(GraphicsContext* gfxCtx) {
void func_800BD9E0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw,
Actor* actor, s16 alpha) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, alpha);
gSPSegment(POLY_OPA_DISP++, 0x0C, gEmptyDL);
POLY_OPA_DISP = SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_OPA_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_800BDAA0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw,
Actor* actor, s16 alpha) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, alpha);
gSPSegment(POLY_XLU_DISP++, 0x0C, func_800BD9A0(play->state.gfxCtx));
POLY_XLU_DISP = SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_XLU_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -4403,7 +4403,7 @@ s16 func_800BDB6C(Actor* actor, PlayState* play, s16 arg2, f32 arg3) {
Player* player = GET_PLAYER(play);
f32 phi_f2;
- if ((play->csCtx.state != CS_STATE_0) || gDbgCamEnabled) {
+ if ((play->csCtx.state != CS_STATE_IDLE) || gDbgCamEnabled) {
phi_f2 = Math_Vec3f_DistXYZ(&actor->world.pos, &play->view.eye) * 0.25f;
} else {
phi_f2 = Math_Vec3f_DistXYZ(&actor->world.pos, &player->actor.world.pos);
@@ -4479,7 +4479,7 @@ s32 func_800BE184(PlayState* play, Actor* actor, f32 xzDist, s16 arg3, s16 arg4,
s16 phi_v0 = BINANG_SUB(BINANG_ROT180(actor->yawTowardsPlayer), player->actor.shape.rot.y);
s16 temp_t0 = actor->yawTowardsPlayer - arg5;
- if ((actor->xzDistToPlayer <= xzDist) && (player->meleeWeaponState != 0)) {
+ if ((actor->xzDistToPlayer <= xzDist) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0)) {
if ((arg4 >= ABS_ALT(phi_v0)) && (arg3 >= ABS_ALT(temp_t0))) {
return true;
}
@@ -4656,7 +4656,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
switch (type) {
case ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX:
@@ -4816,7 +4816,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// Apply and draw a light orb over each limb of frozen actor
for (limbIndex = 0; limbIndex < limbPosCount; limbIndex++, limbPos++) {
- Matrix_RotateZF(randPlusMinusPoint5Scaled(2 * M_PI), MTXMODE_APPLY);
+ Matrix_RotateZF(Rand_CenteredFloat(2 * M_PI), MTXMODE_APPLY);
currentMatrix->mf[3][0] = limbPos->x;
currentMatrix->mf[3][1] = limbPos->y;
currentMatrix->mf[3][2] = limbPos->z;
@@ -4857,9 +4857,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// first electric spark
Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI));
Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY);
- currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x;
- currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y;
- currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z;
+ currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x;
+ currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y;
+ currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z;
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -4869,9 +4869,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// second electric spark
Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI));
Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY);
- currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x;
- currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y;
- currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z;
+ currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x;
+ currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y;
+ currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z;
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/code/z_bg_collect.c b/src/code/z_bg_collect.c
index 0d4f4a21f..b0c0971ea 100644
--- a/src/code/z_bg_collect.c
+++ b/src/code/z_bg_collect.c
@@ -1,103 +1,116 @@
#include "global.h"
-void BgCheck2_UpdateActorPosition(CollisionContext* colCtx, s32 bgId, Actor* actor) {
- MtxF prevMatrix;
- MtxF prevMatrixInv;
- MtxF currMatrix;
- Vec3f newPos;
- Vec3f posWithInv;
+/**
+ * Update the `carriedActor`'s position based on the dynapoly actor identified by `bgId`.
+ */
+void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
+ MtxF prevTransform;
+ MtxF prevTransformInv;
+ MtxF curTransform;
+ Vec3f pos;
+ Vec3f tempPos;
if (!DynaPoly_IsBgIdBgActor(bgId)) {
return;
}
SkinMatrix_SetScaleRotateYRPTranslate(
- &prevMatrix, colCtx->dyna.bgActors[bgId].prevTransform.scale.x,
+ &prevTransform, colCtx->dyna.bgActors[bgId].prevTransform.scale.x,
colCtx->dyna.bgActors[bgId].prevTransform.scale.y, colCtx->dyna.bgActors[bgId].prevTransform.scale.z,
colCtx->dyna.bgActors[bgId].prevTransform.rot.x, colCtx->dyna.bgActors[bgId].prevTransform.rot.y,
colCtx->dyna.bgActors[bgId].prevTransform.rot.z, colCtx->dyna.bgActors[bgId].prevTransform.pos.x,
colCtx->dyna.bgActors[bgId].prevTransform.pos.y, colCtx->dyna.bgActors[bgId].prevTransform.pos.z);
- if (SkinMatrix_Invert(&prevMatrix, &prevMatrixInv) == 2) {
+ if (SkinMatrix_Invert(&prevTransform, &prevTransformInv) == 2) {
return;
}
SkinMatrix_SetScaleRotateYRPTranslate(
- &currMatrix, colCtx->dyna.bgActors[bgId].curTransform.scale.x, colCtx->dyna.bgActors[bgId].curTransform.scale.y,
- colCtx->dyna.bgActors[bgId].curTransform.scale.z, colCtx->dyna.bgActors[bgId].curTransform.rot.x,
- colCtx->dyna.bgActors[bgId].curTransform.rot.y, colCtx->dyna.bgActors[bgId].curTransform.rot.z,
- colCtx->dyna.bgActors[bgId].curTransform.pos.x, colCtx->dyna.bgActors[bgId].curTransform.pos.y,
- colCtx->dyna.bgActors[bgId].curTransform.pos.z);
+ &curTransform, colCtx->dyna.bgActors[bgId].curTransform.scale.x,
+ colCtx->dyna.bgActors[bgId].curTransform.scale.y, colCtx->dyna.bgActors[bgId].curTransform.scale.z,
+ colCtx->dyna.bgActors[bgId].curTransform.rot.x, colCtx->dyna.bgActors[bgId].curTransform.rot.y,
+ colCtx->dyna.bgActors[bgId].curTransform.rot.z, colCtx->dyna.bgActors[bgId].curTransform.pos.x,
+ colCtx->dyna.bgActors[bgId].curTransform.pos.y, colCtx->dyna.bgActors[bgId].curTransform.pos.z);
- SkinMatrix_Vec3fMtxFMultXYZ(&prevMatrixInv, &actor->world.pos, &posWithInv);
- SkinMatrix_Vec3fMtxFMultXYZ(&currMatrix, &posWithInv, &newPos);
+ // Apply the movement of the dynapoly actor `bgId` over the last frame to the `carriedActor` position
+ // pos = curTransform * prevTransformInv * pos
+ // Note (curTransform * prevTransformInv) represents the transform relative to the previous frame
+ SkinMatrix_Vec3fMtxFMultXYZ(&prevTransformInv, &carriedActor->world.pos, &tempPos);
+ SkinMatrix_Vec3fMtxFMultXYZ(&curTransform, &tempPos, &pos);
- actor->world.pos = newPos;
+ carriedActor->world.pos = pos;
}
-void BgCheck2_UpdateActorYRotation(CollisionContext* colCtx, s32 bgId, Actor* actor) {
- s16 angleChange;
+/**
+ * Update the `carriedActor`'s Y rotation based on the dynapoly actor identified by `bgId`.
+ */
+void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
+ s16 rotY;
if (!DynaPoly_IsBgIdBgActor(bgId)) {
return;
}
- angleChange = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y;
+ rotY = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y;
- if (actor->id == 0) {
- ((Player*)actor)->currentYaw += angleChange;
+ if (carriedActor->id == ACTOR_PLAYER) {
+ ((Player*)carriedActor)->currentYaw += rotY;
}
- actor->shape.rot.y += angleChange;
- actor->world.rot.y += angleChange;
+ carriedActor->shape.rot.y += rotY;
+ carriedActor->world.rot.y += rotY;
}
-void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 bgId) {
- DynaPolyActor* meshActor;
+void DynaPolyActor_AttachCarriedActor(CollisionContext* colCtx, Actor* carriedActor, s32 bgId) {
+ DynaPolyActor* dynaActor;
if (!DynaPoly_IsBgIdBgActor(bgId)) {
return;
}
- meshActor = DynaPoly_GetActor(colCtx, bgId);
- if (meshActor != NULL) {
- DynaPolyActor_SetRidingFallingState(meshActor);
+ dynaActor = DynaPoly_GetActor(colCtx, bgId);
+ if (dynaActor != NULL) {
+ DynaPolyActor_SetActorOnTop(dynaActor);
- if ((actor->flags & 0x4000000) == 0x4000000) {
- DynaPolyActor_SetSwitchPressedState(meshActor);
+ if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_SWITCH)) {
+ DynaPolyActor_SetActorOnSwitch(dynaActor);
}
- if ((actor->flags & 0x20000) == 0x20000) {
- DynaPolyActor_SetHeavySwitchPressedState(meshActor);
+ if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH)) {
+ DynaPolyActor_SetActorOnHeavySwitch(dynaActor);
}
}
}
-u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 bgId, Actor* actor) {
- u32 wasUpdated = 0;
- DynaPolyActor* meshActor;
+/**
+ * Update the `carriedActor`'s position and Y rotation based on the dynapoly actor identified by `bgId`, according to
+ * the dynapoly actor's move flags (see `DYNA_TRANSFORM_POS` and `DYNA_TRANSFORM_ROT_Y`).
+ */
+u32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
+ u32 wasUpdated = false;
+ DynaPolyActor* dynaActor;
if (!DynaPoly_IsBgIdBgActor(bgId)) {
- return 0;
+ return false;
}
- if (colCtx->dyna.bgActorFlags[bgId] & 2 || !(colCtx->dyna.bgActorFlags[bgId] & 1)) {
- return 0;
+ if ((colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) {
+ return false;
}
- meshActor = DynaPoly_GetActor(colCtx, bgId);
+ dynaActor = DynaPoly_GetActor(colCtx, bgId);
- if (meshActor == NULL) {
- return 0;
+ if (dynaActor == NULL) {
+ return false;
}
- if (meshActor->flags & 1) {
- BgCheck2_UpdateActorPosition(colCtx, bgId, actor);
- wasUpdated = 1;
+ if (dynaActor->transformFlags & DYNA_TRANSFORM_POS) {
+ DynaPolyActor_UpdateCarriedActorPos(colCtx, bgId, carriedActor);
+ wasUpdated = true;
}
- if (meshActor->flags & 2) {
- BgCheck2_UpdateActorYRotation(colCtx, bgId, actor);
- wasUpdated = 1;
+ if (dynaActor->transformFlags & DYNA_TRANSFORM_ROT_Y) {
+ DynaPolyActor_UpdateCarriedActorRotY(colCtx, bgId, carriedActor);
+ wasUpdated = true;
}
return wasUpdated;
diff --git a/src/code/z_bg_item.c b/src/code/z_bg_item.c
index 79bdf2b82..cedd77194 100644
--- a/src/code/z_bg_item.c
+++ b/src/code/z_bg_item.c
@@ -1,18 +1,15 @@
#include "global.h"
-#define DYNAPOLY_STATE_NONE 0
-#define DYNAPOLY_STATE_RIDING_FALLING (1 << 0)
-#define DYNAPOLY_STATE_RIDING_MOVING (1 << 1)
-#define DYNAPOLY_STATE_RIDING_ROTATING (1 << 2)
-#define DYNAPOLY_STATE_SWITCH_PRESSED (1 << 3)
-#define DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED (1 << 4)
-
-void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags) {
+/**
+ * @param transformFlags How other actors standing on the dynapoly actor's collision move when the dynapoly actor moves.
+ * See `DYNA_TRANSFORM_POS`, `DYNA_TRANSFORM_ROT_Y`.
+ */
+void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags) {
dynaActor->bgId = -1;
dynaActor->pushForce = 0.0f;
dynaActor->unk14C = 0.0f;
- dynaActor->flags = flags;
- dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
+ dynaActor->transformFlags = transformFlags;
+ dynaActor->interactFlags = 0;
}
void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, CollisionHeader* meshHeader) {
@@ -22,80 +19,80 @@ void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, Collision
dynaActor->bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &dynaActor->actor, header);
}
-void DynaPolyActor_ResetState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
+void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags = 0;
}
-void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_FALLING;
+void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_TOP;
}
-void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_MOVING;
+void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ON_TOP;
}
-void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 bgId) {
+void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 bgId) {
DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId);
if (dynaActor != NULL) {
- DynaPolyActor_SetRidingMovingState(dynaActor);
+ DynaPolyActor_SetPlayerOnTop(dynaActor);
}
}
-void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_ROTATING;
+void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ABOVE;
}
-void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 bgId) {
+void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 bgId) {
DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId);
if (dynaActor != NULL) {
- DynaPolyActor_SetRidingRotatingState(dynaActor);
+ DynaPolyActor_SetPlayerAbove(dynaActor);
}
}
-void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags |= DYNAPOLY_STATE_SWITCH_PRESSED;
+void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_SWITCH;
}
-void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor) {
- dynaActor->stateFlags |= DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED;
+void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor) {
+ dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH;
}
-s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor) {
- if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_FALLING) {
+s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) {
+ if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_TOP) {
return true;
} else {
return false;
}
}
-s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor) {
- if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_MOVING) {
+s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor) {
+ if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ON_TOP) {
return true;
} else {
return false;
}
}
-s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor) {
- if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_ROTATING) {
+s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) {
+ if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ABOVE) {
return true;
} else {
return false;
}
}
-s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor) {
- if (dynaActor->stateFlags & DYNAPOLY_STATE_SWITCH_PRESSED) {
+s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) {
+ if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_SWITCH) {
return true;
} else {
return false;
}
}
-s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor) {
- if (dynaActor->stateFlags & DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED) {
+s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor) {
+ if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH) {
return true;
} else {
return false;
@@ -129,13 +126,16 @@ s32 DynaPolyActor_ValidateMove(PlayState* play, DynaPolyActor* dynaActor, s16 st
&bgId, &dynaActor->actor, 0.0f)) {
return false;
}
+
startPos.x = (dynaActor->actor.world.pos.x * 2.0f) - startPos.x;
startPos.z = (dynaActor->actor.world.pos.z * 2.0f) - startPos.z;
endPos.x = sign * adjustedEndRadius * sin + startPos.x;
endPos.z = sign * adjustedEndRadius * cos + startPos.z;
+
if (BgCheck_EntityLineTest3(&play->colCtx, &startPos, &endPos, &intersectionPos, &poly, true, false, false, true,
&bgId, &dynaActor->actor, 0.0f)) {
return false;
}
+
return true;
}
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index ad04236fe..a263d4393 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "fixed_point.h"
#include "vt.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
@@ -6,44 +7,51 @@
#define DYNA_RAYCAST_WALLS 2
#define DYNA_RAYCAST_CEILINGS 4
-u32 sWallFlags[32] = {
- 0, 1, 3, 5, 8, 16, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+u32 sWallFlags[WALL_TYPE_MAX] = {
+ 0, // WALL_TYPE_0
+ WALL_FLAG_0, // WALL_TYPE_1
+ WALL_FLAG_0 | WALL_FLAG_1, // WALL_TYPE_2
+ WALL_FLAG_0 | WALL_FLAG_2, // WALL_TYPE_3
+ WALL_FLAG_3, // WALL_TYPE_4
+ WALL_FLAG_4, // WALL_TYPE_5
+ WALL_FLAG_5, // WALL_TYPE_6
+ WALL_FLAG_6, // WALL_TYPE_7
};
-u16 sSurfaceTypeSfx[] = {
- /* 0x00 */ NA_SE_PL_WALK_GROUND - SFX_FLAG,
- /* 0x01 */ NA_SE_PL_WALK_SAND - SFX_FLAG,
- /* 0x02 */ NA_SE_PL_WALK_CONCRETE - SFX_FLAG,
- /* 0x03 */ NA_SE_PL_WALK_DIRT - SFX_FLAG,
- /* 0x04 */ NA_SE_PL_WALK_WATER0 - SFX_FLAG,
- /* 0x05 */ NA_SE_PL_WALK_WATER1 - SFX_FLAG,
- /* 0x06 */ NA_SE_PL_WALK_WATER2 - SFX_FLAG,
- /* 0x07 */ NA_SE_PL_WALK_MAGMA - SFX_FLAG,
- /* 0x08 */ NA_SE_PL_WALK_GRASS - SFX_FLAG,
- /* 0x09 */ NA_SE_PL_WALK_GLASS - SFX_FLAG,
- /* 0x0A */ NA_SE_PL_WALK_LADDER - SFX_FLAG,
- /* 0x0B */ NA_SE_PL_WALK_GROUND - SFX_FLAG,
- /* 0x0C */ NA_SE_PL_WALK_ICE - SFX_FLAG,
- /* 0x0D */ NA_SE_PL_WALK_IRON - SFX_FLAG,
- /* 0x0E */ NA_SE_PL_WALK_SNOW - SFX_FLAG
+u16 sSurfaceSfxOffsets[SURFACE_MATERIAL_MAX] = {
+ SURFACE_SFX_OFFSET_DIRT, // SURFACE_MATERIAL_DIRT
+ SURFACE_SFX_OFFSET_SAND, // SURFACE_MATERIAL_SAND
+ SURFACE_SFX_OFFSET_STONE, // SURFACE_MATERIAL_STONE
+ SURFACE_SFX_OFFSET_DIRT_SHALLOW, // SURFACE_MATERIAL_DIRT_SHALLOW
+ SURFACE_SFX_OFFSET_WATER_SHALLOW, // SURFACE_MATERIAL_WATER_SHALLOW
+ SURFACE_SFX_OFFSET_WATER_DEEP, // SURFACE_MATERIAL_WATER_DEEP
+ SURFACE_SFX_OFFSET_TALL_GRASS, // SURFACE_MATERIAL_TALL_GRASS
+ SURFACE_SFX_OFFSET_LAVA, // SURFACE_MATERIAL_LAVA
+ SURFACE_SFX_OFFSET_GRASS, // SURFACE_MATERIAL_GRASS
+ SURFACE_SFX_OFFSET_BRIDGE, // SURFACE_MATERIAL_BRIDGE
+ SURFACE_SFX_OFFSET_WOOD, // SURFACE_MATERIAL_WOOD
+ SURFACE_SFX_OFFSET_DIRT, // SURFACE_MATERIAL_DIRT_SOFT
+ SURFACE_SFX_OFFSET_ICE, // SURFACE_MATERIAL_ICE
+ SURFACE_SFX_OFFSET_CARPET, // SURFACE_MATERIAL_CARPET
+ SURFACE_SFX_OFFSET_SNOW, // SURFACE_MATERIAL_SNOW
};
-u8 D_801B46C0[] = {
- /* 0x00 */ 1,
- /* 0x01 */ 1,
- /* 0x02 */ 0,
- /* 0x03 */ 1,
- /* 0x04 */ 0,
- /* 0x05 */ 0,
- /* 0x06 */ 0,
- /* 0x07 */ 0,
- /* 0x08 */ 0,
- /* 0x09 */ 0,
- /* 0x0A */ 0,
- /* 0x0B */ 0,
- /* 0x0C */ 0,
- /* 0x0D */ 0,
- /* 0x0E */ 1
+u8 sSurfaceMaterialProperties[SURFACE_MATERIAL_MAX] = {
+ MATERIAL_PROPERTY_SOFT_IMPRINT, // SURFACE_MATERIAL_DIRT
+ MATERIAL_PROPERTY_SOFT_IMPRINT, // SURFACE_MATERIAL_SAND
+ 0, // SURFACE_MATERIAL_STONE
+ MATERIAL_PROPERTY_SOFT_IMPRINT, // SURFACE_MATERIAL_DIRT_SHALLOW
+ 0, // SURFACE_MATERIAL_WATER_SHALLOW
+ 0, // SURFACE_MATERIAL_WATER_DEEP
+ 0, // SURFACE_MATERIAL_TALL_GRASS
+ 0, // SURFACE_MATERIAL_LAVA
+ 0, // SURFACE_MATERIAL_GRASS
+ 0, // SURFACE_MATERIAL_BRIDGE
+ 0, // SURFACE_MATERIAL_WOOD
+ 0, // SURFACE_MATERIAL_DIRT_SOFT
+ 0, // SURFACE_MATERIAL_ICE
+ 0, // SURFACE_MATERIAL_CARPET
+ MATERIAL_PROPERTY_SOFT_IMPRINT, // SURFACE_MATERIAL_SNOW
};
s16 sSmallMemSceneIds[] = {
@@ -51,9 +59,9 @@ s16 sSmallMemSceneIds[] = {
};
typedef struct {
- s16 sceneId;
- u32 memSize;
-} BgCheckSceneMemEntry;
+ /* 0x0 */ s16 sceneId;
+ /* 0x4 */ u32 memSize;
+} BgCheckSceneMemEntry; // size = 0x8
BgCheckSceneMemEntry sSceneMemList[] = {
{ SCENE_00KEIKOKU, 0xC800 },
@@ -89,7 +97,7 @@ char D_801ED9A0[80];
char D_801EDAA8[80];
char D_801EDAF8[80];
-MtxF D_801EDA40;
+MtxF sModelToWorldMtxF;
void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector);
f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast);
@@ -954,12 +962,12 @@ s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionConte
s32 BgCheck_CheckLineAgainstSSList(StaticLineTest* arg0) {
CollisionPoly* polyList;
s32 result;
- Vec3f polyIntersect; // sp7C
+ Vec3f polyIntersect;
SSNode* curNode;
u8* checkedPoly;
f32 minY;
f32 distSq;
- BgLineVsPolyTest test; // sp50
+ BgLineVsPolyTest test;
s16 polyId;
result = false;
@@ -1658,7 +1666,7 @@ CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId)
if ((bgId < 0) || (bgId > BG_ACTOR_MAX)) {
return NULL;
}
- if (!(colCtx->dyna.bgActorFlags[bgId] & 1)) {
+ if (!(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) {
return NULL;
}
return colCtx->dyna.bgActors[bgId].colHeader;
@@ -1734,7 +1742,7 @@ f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFl
}
}
- if ((yIntersect != BGCHECK_Y_MIN) && func_800C9B68(colCtx, *outPoly, *outBgId)) {
+ if ((yIntersect != BGCHECK_Y_MIN) && SurfaceType_IsSoft(colCtx, *outPoly, *outBgId)) {
yIntersect -= 1.0f;
}
return yIntersect;
@@ -1913,12 +1921,14 @@ s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResul
s32 bgId;
f32 temp_f0_2;
f32 f32temp;
- f32 nx2, nz2;
+ f32 nx2;
+ f32 nz2;
Vec3f checkLineNext;
Vec3f checkLinePrev;
f32 n2XZDist;
f32 n3XZDist;
- f32 nx3, nz3;
+ f32 nx3;
+ f32 nz3;
s32 bccFlags;
Vec3f posIntersect2;
s32 bgId2;
@@ -2712,8 +2722,8 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
s32 foundSlot = false;
for (bgId = 0; bgId < BG_ACTOR_MAX; bgId++) {
- if (!(dyna->bgActorFlags[bgId] & 1)) {
- dyna->bgActorFlags[bgId] |= 1;
+ if (!(dyna->bgActorFlags[bgId] & BGACTOR_IN_USE)) {
+ dyna->bgActorFlags[bgId] |= BGACTOR_IN_USE;
foundSlot = true;
break;
}
@@ -2726,7 +2736,7 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
BgActor_SetActor(&dyna->bgActors[bgId], actor, colHeader);
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
- dyna->bgActorFlags[bgId] &= ~2;
+ dyna->bgActorFlags[bgId] &= ~BGACTOR_1;
return bgId;
}
@@ -2734,51 +2744,51 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
* Gets the actor assigned to `bgId`
*/
DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId) {
- if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & 1) ||
- (colCtx->dyna.bgActorFlags[bgId] & 2)) {
+ if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE) ||
+ (colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1)) {
return NULL;
}
return (DynaPolyActor*)colCtx->dyna.bgActors[bgId].actor;
}
-void func_800C62BC(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_DisableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] |= 4;
+ dyna->bgActorFlags[bgId] |= BGACTOR_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
-void func_800C6314(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_EnableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] &= ~4;
+ dyna->bgActorFlags[bgId] &= ~BGACTOR_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
-void func_800C636C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_DisableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] |= 8;
+ dyna->bgActorFlags[bgId] |= BGACTOR_CEILING_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
-void func_800C63C4(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_EnableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] &= ~8;
+ dyna->bgActorFlags[bgId] &= ~BGACTOR_CEILING_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
-void func_800C641C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_DisableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] |= 0x20;
+ dyna->bgActorFlags[bgId] |= BGACTOR_FLOOR_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
-void func_800C6474(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
+void DynaPoly_EnableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
if (DynaPoly_IsBgIdBgActor(bgId)) {
- dyna->bgActorFlags[bgId] &= ~0x20;
+ dyna->bgActorFlags[bgId] &= ~BGACTOR_FLOOR_COLLISION_DISABLED;
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
}
@@ -2797,11 +2807,11 @@ void DynaPoly_DeleteBgActor(PlayState* play, DynaCollisionContext* dyna, s32 bgI
actor->bgId = BGACTOR_NEG_ONE;
dyna->bgActors[bgId].actor = NULL;
- dyna->bgActorFlags[bgId] |= 2;
+ dyna->bgActorFlags[bgId] |= BGACTOR_1;
}
}
-void func_800C6554(PlayState* play, DynaCollisionContext* dyna) {
+void DynaPoly_InvalidateLookup(PlayState* play, DynaCollisionContext* dyna) {
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
}
@@ -2855,38 +2865,28 @@ void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPo
}
}
-#ifdef NON_MATCHING
/**
* original name: DynaPolyInfo_expandSRT
*/
-void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex,
- s32* waterBoxStartIndex) {
+void DynaPoly_AddBgActorToLookup(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex,
+ s32* polyStartIndex, s32* waterBoxStartIndex) {
Actor* actor;
- s32 pad;
- s32 pad2;
- f32 numVtxInverse;
s32 i;
- Vec3f pos; // sp170
+ s32 j;
+ s32 wi;
+ f32 numVtxInverse;
+ Vec3f pos;
Sphere16* sphere;
Vec3s* dVtxList;
Vec3s* point;
- Vec3f newCenterPoint; // sp158
-
+ Vec3f newCenterPoint;
f32 newRadiusSq;
CollisionHeader* pbgdata;
- Vec3f newVtx; // sp144
- Vec3f vtxA; // sp138
- Vec3f vtxB; // sp12C
- Vec3f vtxC; // sp120
+ Vec3f newVtx;
+ Vec3f vtxA;
+ Vec3f vtxB;
+ Vec3f vtxC;
Vec3f newNormal;
- s32 wi;
- Vec3f spB8; // waterbox ?
- Vec3f spAC;
- Vec3f spA0; // waterbox ?
- Vec3f sp94;
- Vec3f sp88; // waterbox ?
- Vec3f sp7C;
- WaterBox* waterBox;
pbgdata = dyna->bgActors[bgId].colHeader;
sphere = &dyna->bgActors[bgId].boundingSphere;
@@ -2897,12 +2897,15 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
pos = actor->world.pos;
pos.y += actor->shape.yOffset * actor->scale.y;
+ //! FAKE:
+ if (pbgdata && pbgdata) {}
+
ScaleRotPos_SetValue(&dyna->bgActors[bgId].curTransform, &actor->scale, &actor->shape.rot, &pos);
- if (dyna->bgActorFlags[bgId] & 4) {
+ if (dyna->bgActorFlags[bgId] & BGACTOR_COLLISION_DISABLED) {
return;
}
- // if(&pos){} // fake but considerably improves match. commented out to stop warnings
+
if (*waterBoxStartIndex + pbgdata->numWaterBoxes > DYNA_WATERBOX_MAX) {
sprintf(D_801EDAA8, "water_poly Error:[MoveBG OSUGI!!!]");
sprintf(D_801EDAF8, "num = %d > %d\n", *waterBoxStartIndex + pbgdata->numWaterBoxes, DYNA_WATERBOX_MAX);
@@ -2929,13 +2932,13 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
s16 normalY = poly->normal.y;
if (normalY > COLPOLY_SNORMAL(0.5f)) {
- if (!(dyna->bgActorFlags[bgId] & 0x20)) {
+ if (!(dyna->bgActorFlags[bgId] & BGACTOR_FLOOR_COLLISION_DISABLED)) {
s16 polyIndex = pi;
DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.floor, &polyIndex);
}
} else if (normalY < COLPOLY_SNORMAL(-0.8f)) {
- if (!(dyna->bgActorFlags[bgId] & 8)) {
+ if (!(dyna->bgActorFlags[bgId] & BGACTOR_CEILING_COLLISION_DISABLED)) {
s16 polyIndex = pi;
DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.ceiling,
@@ -2951,150 +2954,156 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
*polyStartIndex += pbgdata->numPolygons;
*vtxStartIndex += pbgdata->numVertices;
*waterBoxStartIndex += pbgdata->numWaterBoxes;
- } else {
- SkinMatrix_SetScaleRotateYRPTranslate(
- &D_801EDA40, dyna->bgActors[bgId].curTransform.scale.x, dyna->bgActors[bgId].curTransform.scale.y,
- dyna->bgActors[bgId].curTransform.scale.z, dyna->bgActors[bgId].curTransform.rot.x,
- dyna->bgActors[bgId].curTransform.rot.y, dyna->bgActors[bgId].curTransform.rot.z,
- dyna->bgActors[bgId].curTransform.pos.x, dyna->bgActors[bgId].curTransform.pos.y,
- dyna->bgActors[bgId].curTransform.pos.z);
-
- if ((pbgdata->numVertices != 0) && (pbgdata->numPolygons != 0)) {
- s32 j;
- numVtxInverse = 1.0f / pbgdata->numVertices;
- newCenterPoint.x = newCenterPoint.y = newCenterPoint.z = 0.0f;
- for (i = 0; i < pbgdata->numVertices; i++) {
- Vec3f vtx; // spF4
- Vec3f vtxT; // spE8 Vtx after mtx transform
-
- Math_Vec3s_ToVec3f(&vtx, &pbgdata->vtxList[i]);
- SkinMatrix_Vec3fMtxFMultXYZ(&D_801EDA40, &vtx, &vtxT);
- BgCheck_Vec3fToVec3s(&dyna->vtxList[*vtxStartIndex + i], &vtxT);
-
- if (i == 0) {
- dyna->bgActors[bgId].minY = dyna->bgActors[bgId].maxY = vtxT.y;
- } else if (vtxT.y < dyna->bgActors[bgId].minY) {
- dyna->bgActors[bgId].minY = vtxT.y;
- } else if (dyna->bgActors[bgId].maxY < vtxT.y) {
- dyna->bgActors[bgId].maxY = vtxT.y;
- }
- newCenterPoint.x += vtxT.x;
- newCenterPoint.y += vtxT.y;
- newCenterPoint.z += vtxT.z;
- }
-
- newCenterPoint.x *= numVtxInverse;
- newCenterPoint.y *= numVtxInverse;
- newCenterPoint.z *= numVtxInverse;
- sphere->center.x = newCenterPoint.x;
- sphere->center.y = newCenterPoint.y;
- sphere->center.z = newCenterPoint.z;
- newRadiusSq = -100.0f;
-
- for (i = 0, j = *vtxStartIndex; i < pbgdata->numVertices; i++, j++) {
- f32 radiusSq;
-
- newVtx.x = dyna->vtxList[j].x;
- newVtx.y = dyna->vtxList[j].y;
- newVtx.z = dyna->vtxList[j].z;
- radiusSq = Math3D_Vec3fDistSq(&newVtx, &newCenterPoint);
- if (newRadiusSq < radiusSq) {
- newRadiusSq = radiusSq;
- }
- }
-
- sphere->radius = sqrtf(newRadiusSq) * 1.1f;
-
- for (i = 0; i < pbgdata->numPolygons; i++) {
- CollisionPoly* newPoly = &dyna->polyList[*polyStartIndex + i];
- f32 newNormMagnitude;
- u32 vIA;
- u32 vIB;
- u32 vIC;
-
- *newPoly = pbgdata->polyList[i];
-
- vIA = (COLPOLY_VTX_INDEX(newPoly->flags_vIA) + *vtxStartIndex);
- vIB = (COLPOLY_VTX_INDEX(newPoly->flags_vIB) + *vtxStartIndex);
- vIC = newPoly->vIC + *vtxStartIndex;
-
- newPoly->flags_vIA = vIA | ((*newPoly).flags_vIA & 0xE000);
- newPoly->flags_vIB = vIB | ((*newPoly).flags_vIB & 0xE000);
- newPoly->vIC = vIC;
- dVtxList = dyna->vtxList;
- vtxA.x = dVtxList[vIA].x;
- vtxA.y = dVtxList[vIA].y;
- vtxA.z = dVtxList[vIA].z;
- vtxB.x = dVtxList[vIB].x;
- vtxB.y = dVtxList[vIB].y;
- vtxB.z = dVtxList[vIB].z;
- vtxC.x = dVtxList[vIC].x;
- vtxC.y = dVtxList[vIC].y;
- vtxC.z = dVtxList[vIC].z;
- Math3D_SurfaceNorm(&vtxA, &vtxB, &vtxC, &newNormal);
- newNormMagnitude = Math3D_Vec3fMagnitude(&newNormal);
-
- if (!IS_ZERO(newNormMagnitude)) {
- newNormal.x *= (1.0f / newNormMagnitude);
- newNormal.y *= (1.0f / newNormMagnitude);
- newNormal.z *= (1.0f / newNormMagnitude);
- newPoly->normal.x = COLPOLY_SNORMAL(newNormal.x);
- newPoly->normal.y = COLPOLY_SNORMAL(newNormal.y);
- newPoly->normal.z = COLPOLY_SNORMAL(newNormal.z);
- }
-
- newPoly->dist = func_80086D24(-DOTXYZ(newNormal, vtxA));
- if (newNormal.y > 0.5f) {
- s16 polyId = *polyStartIndex + i;
-
- DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.floor, &polyId);
- } else if (newNormal.y < -0.8f) {
- s16 polyId = *polyStartIndex + i;
-
- DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.ceiling, &polyId);
- } else {
- s16 polyId = *polyStartIndex + i;
-
- DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.wall, &polyId);
- }
- }
- }
-
- if (pbgdata->numWaterBoxes > 0) {
- for (wi = 0; wi < pbgdata->numWaterBoxes; wi++) {
- Math_Vec3s_ToVec3f(&spB8, &pbgdata->waterBoxes[wi].minPos);
- Math_Vec3f_Copy(&spA0, &spB8);
- spA0.x += pbgdata->waterBoxes[wi].xLength;
- Math_Vec3f_Copy(&sp88, &spB8);
- sp88.z += pbgdata->waterBoxes[wi].zLength;
- SkinMatrix_Vec3fMtxFMultXYZ(&D_801EDA40, &spB8, &spAC);
- SkinMatrix_Vec3fMtxFMultXYZ(&D_801EDA40, &spA0, &sp94);
- SkinMatrix_Vec3fMtxFMultXYZ(&D_801EDA40, &sp88, &sp7C);
- waterBox = &dyna->waterBoxList.boxes[*waterBoxStartIndex + wi];
- BgCheck_CalcWaterboxDimensions(&spAC, &sp94, &sp7C, &waterBox->minPos, &waterBox->xLength,
- &waterBox->zLength);
- waterBox->properties = pbgdata->waterBoxes[wi].properties;
- }
- }
- *polyStartIndex += pbgdata->numPolygons;
- *vtxStartIndex += pbgdata->numVertices;
- *waterBoxStartIndex += pbgdata->numWaterBoxes;
+ return;
}
-}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/DynaPoly_ExpandSRT.s")
-#endif
-void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna, Actor* actor) {
+ SkinMatrix_SetScaleRotateYRPTranslate(
+ &sModelToWorldMtxF, dyna->bgActors[bgId].curTransform.scale.x, dyna->bgActors[bgId].curTransform.scale.y,
+ dyna->bgActors[bgId].curTransform.scale.z, dyna->bgActors[bgId].curTransform.rot.x,
+ dyna->bgActors[bgId].curTransform.rot.y, dyna->bgActors[bgId].curTransform.rot.z,
+ dyna->bgActors[bgId].curTransform.pos.x, dyna->bgActors[bgId].curTransform.pos.y,
+ dyna->bgActors[bgId].curTransform.pos.z);
+
+ if ((pbgdata->numVertices != 0) && (pbgdata->numPolygons != 0)) {
+ f32 radiusSq;
+
+ numVtxInverse = 1.0f / pbgdata->numVertices;
+ newCenterPoint.x = newCenterPoint.y = newCenterPoint.z = 0.0f;
+ for (i = 0; i < pbgdata->numVertices; i++) {
+ Vec3f vtx;
+ Vec3f vtxT; // Vtx after mtx transform
+ s32 pad;
+
+ Math_Vec3s_ToVec3f(&vtx, &pbgdata->vtxList[i]);
+ SkinMatrix_Vec3fMtxFMultXYZ(&sModelToWorldMtxF, &vtx, &vtxT);
+ BgCheck_Vec3fToVec3s(&dyna->vtxList[*vtxStartIndex + (u32)i], &vtxT);
+
+ if (i == 0) {
+ dyna->bgActors[bgId].minY = dyna->bgActors[bgId].maxY = vtxT.y;
+ } else if (vtxT.y < dyna->bgActors[bgId].minY) {
+ dyna->bgActors[bgId].minY = vtxT.y;
+ } else if (dyna->bgActors[bgId].maxY < vtxT.y) {
+ dyna->bgActors[bgId].maxY = vtxT.y;
+ }
+ newCenterPoint.x += vtxT.x;
+ newCenterPoint.y += vtxT.y;
+ newCenterPoint.z += vtxT.z;
+ }
+
+ newCenterPoint.x *= numVtxInverse;
+ newCenterPoint.y *= numVtxInverse;
+ newCenterPoint.z *= numVtxInverse;
+ sphere->center.x = newCenterPoint.x;
+ sphere->center.y = newCenterPoint.y;
+ sphere->center.z = newCenterPoint.z;
+ newRadiusSq = -100.0f;
+
+ for (i = 0, j = *vtxStartIndex; i < pbgdata->numVertices; i++, j++) {
+ newVtx.x = dyna->vtxList[j].x;
+ newVtx.y = dyna->vtxList[j].y;
+ newVtx.z = dyna->vtxList[j].z;
+ radiusSq = Math3D_Vec3fDistSq(&newVtx, &newCenterPoint);
+ if (newRadiusSq < radiusSq) {
+ newRadiusSq = radiusSq;
+ }
+ }
+
+ sphere->radius = sqrtf(newRadiusSq) * 1.1f;
+
+ for (i = 0; i < pbgdata->numPolygons; i++) {
+ CollisionPoly* newPoly = &dyna->polyList[*polyStartIndex + i];
+ f32 newNormMagnitude;
+ u32 vIA;
+ u32 vIB;
+ u32 vIC;
+
+ *newPoly = pbgdata->polyList[i];
+
+ vIA = (COLPOLY_VTX_INDEX(newPoly->flags_vIA) + *vtxStartIndex);
+ vIB = (COLPOLY_VTX_INDEX(newPoly->flags_vIB) + *vtxStartIndex);
+ vIC = newPoly->vIC + *vtxStartIndex;
+
+ newPoly->flags_vIA = vIA | (newPoly->flags_vIA & 0xE000);
+ newPoly->flags_vIB = vIB | (newPoly->flags_vIB & 0xE000);
+ newPoly->vIC = vIC;
+ dVtxList = dyna->vtxList;
+ vtxA.x = dVtxList[vIA].x;
+ vtxA.y = dVtxList[vIA].y;
+ vtxA.z = dVtxList[vIA].z;
+ vtxB.x = dVtxList[vIB].x;
+ vtxB.y = dVtxList[vIB].y;
+ vtxB.z = dVtxList[vIB].z;
+ vtxC.x = dVtxList[vIC].x;
+ vtxC.y = dVtxList[vIC].y;
+ vtxC.z = dVtxList[vIC].z;
+ Math3D_SurfaceNorm(&vtxA, &vtxB, &vtxC, &newNormal);
+ newNormMagnitude = Math3D_Vec3fMagnitude(&newNormal);
+
+ if (!IS_ZERO(newNormMagnitude)) {
+ newNormal.x *= 1.0f / newNormMagnitude;
+ newNormal.y *= 1.0f / newNormMagnitude;
+ newNormal.z *= 1.0f / newNormMagnitude;
+ newPoly->normal.x = COLPOLY_SNORMAL(newNormal.x);
+ newPoly->normal.y = COLPOLY_SNORMAL(newNormal.y);
+ newPoly->normal.z = COLPOLY_SNORMAL(newNormal.z);
+ }
+
+ newPoly->dist = nearbyint(-DOTXYZ(newNormal, vtxA));
+ if (newNormal.y > 0.5f) {
+ s16 polyId = *polyStartIndex + i;
+
+ DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.floor, &polyId);
+ } else if (newNormal.y < -0.8f) {
+ s16 polyId = *polyStartIndex + i;
+
+ DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.ceiling, &polyId);
+ } else {
+ s16 polyId = *polyStartIndex + i;
+
+ DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.wall, &polyId);
+ }
+ }
+ }
+
+ if (pbgdata->numWaterBoxes > 0) {
+ for (wi = 0; wi < pbgdata->numWaterBoxes; wi++) {
+ WaterBox* waterBox;
+ Vec3f modelMinPos;
+ Vec3f worldMinPos;
+ Vec3f modelMinPosXOffset;
+ Vec3f worldMinPosXOffset;
+ Vec3f modelMinPosZOffset;
+ Vec3f worldMinPosZOffset;
+
+ Math_Vec3s_ToVec3f(&modelMinPos, &pbgdata->waterBoxes[wi].minPos);
+ Math_Vec3f_Copy(&modelMinPosXOffset, &modelMinPos);
+ modelMinPosXOffset.x += pbgdata->waterBoxes[wi].xLength;
+ Math_Vec3f_Copy(&modelMinPosZOffset, &modelMinPos);
+ modelMinPosZOffset.z += pbgdata->waterBoxes[wi].zLength;
+ SkinMatrix_Vec3fMtxFMultXYZ(&sModelToWorldMtxF, &modelMinPos, &worldMinPos);
+ SkinMatrix_Vec3fMtxFMultXYZ(&sModelToWorldMtxF, &modelMinPosXOffset, &worldMinPosXOffset);
+ SkinMatrix_Vec3fMtxFMultXYZ(&sModelToWorldMtxF, &modelMinPosZOffset, &worldMinPosZOffset);
+ waterBox = &dyna->waterBoxList.boxes[*waterBoxStartIndex + wi];
+ BgCheck_CalcWaterboxDimensions(&worldMinPos, &worldMinPosXOffset, &worldMinPosZOffset, &waterBox->minPos,
+ &waterBox->xLength, &waterBox->zLength);
+ waterBox->properties = pbgdata->waterBoxes[wi].properties;
+ }
+ }
+ *polyStartIndex += pbgdata->numPolygons;
+ *vtxStartIndex += pbgdata->numVertices;
+ *waterBoxStartIndex += pbgdata->numWaterBoxes;
+}
+
+void DynaPoly_UnsetAllInteractFlags(PlayState* play, DynaCollisionContext* dyna, Actor* actor) {
DynaPolyActor* dynaActor;
s32 i;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if ((dyna->bgActorFlags[i] & 1)) {
+ if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE)) {
dynaActor = DynaPoly_GetActor(&play->colCtx, i);
if ((dynaActor != NULL) && (&dynaActor->actor == actor)) {
- DynaPolyActor_ResetState((DynaPolyActor*)actor);
- return;
+ DynaPolyActor_UnsetAllInteractFlags((DynaPolyActor*)actor);
+ break;
}
}
}
@@ -3103,7 +3112,7 @@ void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna
/**
* original name: DynaPolyInfo_setup
*/
-void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
+void DynaPoly_UpdateContext(PlayState* play, DynaCollisionContext* dyna) {
DynaPolyActor* actor;
s32 vtxStartIndex;
s32 polyStartIndex;
@@ -3117,7 +3126,7 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
}
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (dyna->bgActorFlags[i] & 2) {
+ if (dyna->bgActorFlags[i] & BGACTOR_1) {
// Initialize BgActor
dyna->bgActorFlags[i] = 0;
BgActor_Init(play, &dyna->bgActors[i]);
@@ -3140,8 +3149,8 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
polyStartIndex = 0;
waterBoxStartIndex = 0;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2)) {
- DynaPoly_ExpandSRT(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex);
+ if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1)) {
+ DynaPoly_AddBgActorToLookup(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex);
}
}
dyna->bitFlag &= ~DYNAPOLY_INVALIDATE_LOOKUP;
@@ -3159,7 +3168,8 @@ void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertice
*numWaterBoxes = 0;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2) && !(dyna->bgActorFlags[i] & 4)) {
+ if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1) &&
+ !(dyna->bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) {
colHeader = dyna->bgActors[i].colHeader;
*numPolygons += colHeader->numPolygons;
*numVertices += colHeader->numVertices;
@@ -3175,7 +3185,7 @@ void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyn
s32 i;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (dyna->bgActorFlags[i] & 1) {
+ if (dyna->bgActorFlags[i] & BGACTOR_IN_USE) {
DynaPoly_SetBgActorPrevTransform(play, &dyna->bgActors[i]);
}
}
@@ -3205,7 +3215,8 @@ f32 BgCheck_RaycastFloorDynaList(DynaRaycast* dynaRaycast, u32 listType) {
(COLPOLY_VIA_FLAG_TEST(polyList[id].flags_vIB, 4) &&
(((dynaRaycast->actor != NULL) && (dynaRaycast->actor->category != ACTORCAT_PLAYER)) ||
((dynaRaycast->actor == NULL) && (dynaRaycast->xpFlags != COLPOLY_IGNORE_CAMERA)))) ||
- ((dynaRaycast->unk_24 & 0x20) && func_800C9B68(dynaRaycast->colCtx, &polyList[id], dynaRaycast->unk1C))) {
+ ((dynaRaycast->unk_24 & 0x20) &&
+ SurfaceType_IsSoft(dynaRaycast->colCtx, &polyList[id], dynaRaycast->unk1C))) {
if (curNode->next == SS_NULL) {
break;
} else {
@@ -3268,7 +3279,8 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
*dynaRaycast->bgId = BGCHECK_SCENE;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & 1) || (dynaRaycast->colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
+ (dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
@@ -3321,7 +3333,7 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
if (!pauseState) {
pauseState = dynaRaycast->play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE;
}
- if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & 2)) {
+ if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & BGACTOR_1)) {
curTransform = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].curTransform;
polyMin = &dynaRaycast->dyna
->polyList[(u16)dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].dynaLookup.polyStartIndex];
@@ -3580,7 +3592,7 @@ s32 BgCheck_SphVsDynaWall(CollisionContext* colCtx, u16 xpFlags, f32* outX, f32*
resultPos = *pos;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
if ((colCtx->dyna.bgActors + i)->actor == actor) {
@@ -3702,7 +3714,7 @@ s32 BgCheck_CheckDynaCeiling(CollisionContext* colCtx, u16 xpFlags, f32* outY, V
resultY = tempY;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
if (actor == colCtx->dyna.bgActors[i].actor) {
@@ -3848,7 +3860,7 @@ s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* p
f32 by;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if ((colCtx->dyna.bgActorFlags[i] & 1) && !(colCtx->dyna.bgActorFlags[i] & 2)) {
+ if ((colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) && !(colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
if (actor != colCtx->dyna.bgActors[i].actor) {
ay = posA->y;
by = posB->y;
@@ -3957,7 +3969,7 @@ s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionP
Sphere16 testSphere;
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
if (colCtx->dyna.bgActors[i].actor == actor) {
@@ -4012,7 +4024,7 @@ void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, PlayState* play) {
for (i = 0; i < BG_ACTOR_MAX; i++) {
flag = dyna->bgActorFlags[i];
- if ((flag & 1) && !(flag & 2)) {
+ if ((flag & BGACTOR_IN_USE) && !(flag & BGACTOR_1)) {
Actor_SetObjectDependency(play, dyna->bgActors[i].actor);
CollisionHeader_SegmentedToVirtual(dyna->bgActors[i].colHeader);
}
@@ -4188,17 +4200,11 @@ Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s
return BgCheck_GetBgCamFuncDataImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
}
-/**
- * SurfaceType Get Scene Exit Index
- */
u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 8 & 0x1F;
}
-/**
- * SurfaceType Get ? Property (& 0x0003_E000)
- */
-u32 func_800C99D4(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+FloorType SurfaceType_GetFloorType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 13 & 0x1F;
}
@@ -4209,126 +4215,85 @@ u32 func_800C99FC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 18 & 7;
}
-/**
- * SurfaceType Get Wall Property (Internal)
- */
-u32 func_800C9A24(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+WallType SurfaceType_GetWallType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 21 & 0x1F;
}
-/**
- * SurfaceType Get Wall Flags
- */
-s32 func_800C9A4C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- return sWallFlags[func_800C9A24(colCtx, poly, bgId)];
+s32 SurfaceType_GetWallFlags(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ return sWallFlags[SurfaceType_GetWallType(colCtx, poly, bgId)];
}
-/**
- * SurfaceType Is Wall Flag (1 << 0) Set
- */
-s32 func_800C9A7C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- return (func_800C9A4C(colCtx, poly, bgId) & 1) ? true : false;
+s32 SurfaceType_CheckWallFlag0(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ return (SurfaceType_GetWallFlags(colCtx, poly, bgId) & WALL_FLAG_0) ? true : false;
}
-/**
- * SurfaceType Is Wall Flag (1 << 1) Set
- */
-s32 func_800C9AB0(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- return (func_800C9A4C(colCtx, poly, bgId) & 2) ? true : false;
+s32 SurfaceType_CheckWallFlag1(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ return (SurfaceType_GetWallFlags(colCtx, poly, bgId) & WALL_FLAG_1) ? true : false;
}
-/**
- * SurfaceType Is Wall Flag (1 << 2) Set
- */
-s32 func_800C9AE4(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- return (func_800C9A4C(colCtx, poly, bgId) & 4) ? true : false;
+s32 SurfaceType_CheckWallFlag2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ return (SurfaceType_GetWallFlags(colCtx, poly, bgId) & WALL_FLAG_2) ? true : false;
}
-u32 func_800C9B18(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+FloorProperty SurfaceType_GetFloorProperty2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 26 & 0xF;
}
-/**
- * SurfaceType Get Floor Property
- */
-u32 func_800C9B40(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+FloorProperty SurfaceType_GetFloorProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 26 & 0xF;
}
-/**
- * SurfaceType Is Floor Minus 1
- */
-u32 func_800C9B68(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+u32 SurfaceType_IsSoft(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 30 & 1;
}
-/**
- * SurfaceType Is Horse Blocked
- */
u32 SurfaceType_IsHorseBlocked(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) >> 31 & 1;
}
-u32 func_800C9BB8(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+SurfaceMaterial SurfaceType_GetMaterial(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) & 0xF;
}
-/**
- * SurfaceType Get Poly Sfx
- */
-u16 SurfaceType_GetSfx(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- s32 id = func_800C9BB8(colCtx, poly, bgId);
+u16 SurfaceType_GetSfxOffset(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ SurfaceMaterial surfaceMaterial = SurfaceType_GetMaterial(colCtx, poly, bgId);
- if ((id < 0) || (id > 14)) {
- return NA_SE_PL_WALK_GROUND - SFX_FLAG;
+ if ((surfaceMaterial < 0) || (surfaceMaterial >= ARRAY_COUNT(sSurfaceSfxOffsets))) {
+ return SURFACE_SFX_OFFSET_DIRT;
}
- return sSurfaceTypeSfx[id];
+
+ return sSurfaceSfxOffsets[surfaceMaterial];
}
/**
- * SurfaceType Get ? (same indexer as Get Poly Sfx)
+ * Checks if the material has the bitwise propertyType
*/
-s32 func_800C9C24(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 arg3) {
- s32 id = func_800C9BB8(colCtx, poly, bgId);
+s32 SurfaceType_HasMaterialProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 propertyType) {
+ SurfaceMaterial surfaceMaterial = SurfaceType_GetMaterial(colCtx, poly, bgId);
- if ((id < 0) || (id > 14)) {
+ if ((surfaceMaterial < 0) || (surfaceMaterial >= ARRAY_COUNT(sSurfaceMaterialProperties))) {
return 0;
}
- return D_801B46C0[id] & arg3;
+
+ return sSurfaceMaterialProperties[surfaceMaterial] & propertyType;
}
-/**
- * SurfaceType get terrain slope surface
- */
-u32 SurfaceType_GetSlope(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+FloorEffect SurfaceType_GetFloorEffect(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) >> 4 & 3;
}
-/**
- * SurfaceType get surface lighting setting
- */
u32 SurfaceType_GetLightSettingIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) >> 6 & 0x1F;
}
-/**
- * SurfaceType get echo
- */
u32 SurfaceType_GetEcho(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) >> 11 & 0x3F;
}
-/**
- * SurfaceType Is Hookshot Surface
- */
u32 SurfaceType_IsHookshotSurface(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) >> 17 & 1;
}
-/**
- * CollisionPoly is ignored by entities
- * Returns true if poly is ignored by entities, else false
- */
s32 SurfaceType_IsIgnoredByEntities(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
u32 flags;
@@ -4339,10 +4304,6 @@ s32 SurfaceType_IsIgnoredByEntities(CollisionContext* colCtx, CollisionPoly* pol
return !!flags;
}
-/**
- * CollisionPoly is ignored by projectiles
- * Returns true if poly is ignored by projectiles, else false
- */
s32 SurfaceType_IsIgnoredByProjectiles(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
u32 flags;
@@ -4385,10 +4346,7 @@ s32 func_800C9DDC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return !!flags;
}
-/**
- * SurfaceType Get Conveyor Surface Speed
- */
-u32 SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
+ConveyorSpeed SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 1) >> 18 & 7;
}
@@ -4406,9 +4364,6 @@ u32 SurfaceType_GetConveyorDirection(CollisionContext* colCtx, CollisionPoly* po
return data & 0x3F;
}
-/**
- * SurfaceType is Wall Damage
- */
u32 SurfaceType_IsWallDamage(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return (SurfaceType_GetData(colCtx, poly, bgId, 1) & 0x8000000) ? true : false;
}
@@ -4449,7 +4404,8 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3
}
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
+ (colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) {
continue;
}
bgActor = &colCtx->dyna.bgActors[i];
@@ -4534,8 +4490,8 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos,
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4) ||
- (colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
+ (colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
bgActor = &colCtx->dyna.bgActors[i];
@@ -4668,7 +4624,7 @@ s32 func_800CA6F0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32*
}
}
for (i = 0; i < BG_ACTOR_MAX; i++) {
- if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
+ if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
continue;
}
bgActor = &colCtx->dyna.bgActors[i];
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index f54fc93da..ce09f7c4d 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -1,22 +1,97 @@
+/**
+ * @file camera.c
+ * Implements the camera system. Camera functionality depends on the current combination of
+ * setting and mode.
+ *
+ * When working with the camera, you should be familiar with MM's coordinate system.
+ * Relative to the camera, the coordinate system follows the right hand rule:
+ * +X points right.
+ * +Y points up.
+ * +Z points out of the screen.
+ *
+ * You should also be familiar with Euler angles: 'pitch', 'yaw', and 'roll'.
+ * pitch: rotation about the X-axis, measured from +Y.
+ * Unlike yaw and roll, pitch is bounded in +-0x4000 (90 degrees).
+ * Pitch is 0 when the camera points parallel to the xz-plane (+Y points straight up).
+ *
+ * yaw: rotation about the Y-axis, measured from (absolute) +Z.
+ * Positive yaw rotates clockwise, towards +X.
+ *
+ * roll: rotation about the Z-axis, measured from the camera's right direction.
+ * Unfortunately, it's weird: For some reason, roll is flipped. Positive roll makes the camera
+ * rotate counterclockwise, which means the WORLD rotates clockwise. Luckily roll is rarely
+ * used.
+ *
+ * Remember the right hand rule: make a thumbs-up with your right hand, stick your thumb in the
+ * +direction (except for roll), and the angle follows the rotation of your curled fingers.
+ *
+ * Illustrations:
+ * Following the right hand rule, each hidden axis's positive direction points out of the screen.
+ *
+ * YZ-Plane (pitch) XZ-Plane (yaw) XY-Plane (roll -- Note flipped)
+ * +Y -Z +Y
+ * ^ ^ (into the ^
+ * --|-- | screen) |<-
+ * +pitch / | \ -pitch | | \ -roll
+ * v | v | | |
+ * +Z <------O------> -Z -X <------O------> +X -X <------O------> +X
+ * | ^ | ^ | |
+ * | \ | / | / +roll
+ * | -yaw --|-- +yaw |<-
+ * v v v
+ * -Y +Z -Y
+ *
+ */
+
#include "global.h"
#include "z64quake.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
+
+void func_800DDFE0(Camera* camera);
+s32 Camera_ChangeMode(Camera* camera, s16 mode);
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags);
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags);
#include "z_camera_data.inc.c"
-// BSS
-s16 D_801EDBF0;
-f32 D_801EDBF4;
-f32 D_801EDBF8;
-CameraCollision D_801EDC00;
-
PlayState* sCamPlayState;
SwingAnimation D_801EDC30[4];
Vec3f D_801EDDD0;
Vec3f D_801EDDE0;
Vec3f D_801EDDF0;
+// Camera will reload its paramData. Usually that means setting the read-only data from what is stored in
+// CameraModeValue arrays. Although sometimes some read-write data is reset as well
+#define RELOAD_PARAMS(camera) ((camera->animState == 0) || (camera->animState == 10) || (camera->animState == 20))
+
+/**
+ * Camera data is stored in both read-only data and OREG as s16, and then converted to the appropriate type during
+ * runtime. If a small f32 is being stored as an s16, it is common to store that value 100 times larger than the
+ * original value. This is then scaled back down during runtime with the CAM_RODATA_UNSCALE macro.
+ */
+#define CAM_RODATA_SCALE(x) ((x)*100.0f)
+#define CAM_RODATA_UNSCALE(x) ((x)*0.01f)
+
+// Load the next value from camera read-only data stored in CameraModeValue
+#define GET_NEXT_RO_DATA(values) ((values++)->val)
+// Load the next value and scale down from camera read-only data stored in CameraModeValue
+#define GET_NEXT_SCALED_RO_DATA(values) CAM_RODATA_UNSCALE(GET_NEXT_RO_DATA(values))
+
+// Camera bg surface flags
+#define FLG_ADJSLOPE (1 << 0)
+#define FLG_OFFGROUND (1 << 7)
+
+#define CAM_CHANGE_SETTING_0 (1 << 0)
+#define CAM_CHANGE_SETTING_1 (1 << 1)
+#define CAM_CHANGE_SETTING_2 (1 << 2)
+#define CAM_CHANGE_SETTING_3 (1 << 3)
+
+/*===============================================================*/
+/* Camera Internal Functions */
+/*===============================================================*/
+
/**
* Returns the absolute value for floats
*/
@@ -81,47 +156,63 @@ f32 Camera_QuadraticAttenuation(f32 xRange, f32 x) {
return y;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-f32 Camera_LerpCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
+f32 Camera_ScaledStepToCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
f32 diff = target - cur;
f32 step = diff * stepScale;
return (Camera_fabsf(diff) >= minDiff) ? cur + step : target;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-s16 Camera_LerpCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
+s16 Camera_ScaledStepToCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
s16 step = diff * stepScale + 0.5f;
return (ABS(diff) >= minDiff) ? cur + step : target;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded down to `cur`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `current`
+ *
+ * @return new current value
*/
-s16 Camera_LerpFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
+s16 Camera_ScaledStepToFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
s16 step = diff * stepScale + 0.5f;
return (ABS(diff) >= minDiff) ? cur + step : cur;
}
-/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, the result is rounded up to `target`. Output is written to `cur`
+/**
+ * @param[in] target target value
+ * @param[in] cur current value
+ * @param[in] stepScale fraction of (target - cur) to step towards target
+ * @param[in] minDiff minimum value of (target - cur) perform a step. Otherwise, return `target`
+ *
+ * @return new current value
*/
-void Camera_LerpCeilVec3f(Vec3f* target, Vec3f* cur, f32 xzStepScale, f32 yStepScale, f32 minDiff) {
- cur->x = Camera_LerpCeilF(target->x, cur->x, xzStepScale, minDiff);
- cur->y = Camera_LerpCeilF(target->y, cur->y, yStepScale, minDiff);
- cur->z = Camera_LerpCeilF(target->z, cur->z, xzStepScale, minDiff);
+void Camera_ScaledStepToCeilVec3f(Vec3f* target, Vec3f* cur, f32 xzStepScale, f32 yStepScale, f32 minDiff) {
+ cur->x = Camera_ScaledStepToCeilF(target->x, cur->x, xzStepScale, minDiff);
+ cur->y = Camera_ScaledStepToCeilF(target->y, cur->y, yStepScale, minDiff);
+ cur->z = Camera_ScaledStepToCeilF(target->z, cur->z, xzStepScale, minDiff);
}
void Camera_SetUpdateRatesFastPitch(Camera* camera) {
@@ -149,14 +240,11 @@ void Camera_SetUpdateRatesSlow(Camera* camera) {
camera->rUpdateRateInv = 1800.0f;
camera->yawUpdateRateInv = 1800.0f;
camera->pitchUpdateRateInv = 1800.0f;
- camera->yOffsetUpdateRate = 0.01;
- camera->xzOffsetUpdateRate = 0.01;
- camera->fovUpdateRate = 0.01;
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ camera->fovUpdateRate = 0.01f;
}
-/**
- * Converts a 3D s16 vector into a 3D f32 vector
- */
Vec3f* Camera_Vec3sToVec3f(Vec3f* dest, Vec3s* src) {
Vec3f copy;
@@ -176,29 +264,29 @@ s16 Camera_AngleDiffAndScale(s16 angle1, s16 angle2, f32 scale) {
}
/**
- * Calculates the current offset between the camera's at-coordinates and the centered actor's coordinates
+ * Calculates the current offset between the camera's at-coordinates and the focal actors coordinates
*/
-void Camera_UpdateAtActorOffset(Camera* camera, Vec3f* actorOffset) {
- camera->atActorOffset.x = camera->at.x - actorOffset->x;
- camera->atActorOffset.y = camera->at.y - actorOffset->y;
- camera->atActorOffset.z = camera->at.z - actorOffset->z;
+void Camera_SetFocalActorAtOffset(Camera* camera, Vec3f* focalActorPos) {
+ camera->focalActorAtOffset.x = camera->at.x - focalActorPos->x;
+ camera->focalActorAtOffset.y = camera->at.y - focalActorPos->y;
+ camera->focalActorAtOffset.z = camera->at.z - focalActorPos->z;
}
f32 Camera_GetFocalActorHeight(Camera* camera) {
- PosRot actorFocus;
+ PosRot focalActorFocus;
Actor* focalActor = camera->focalActor;
- f32 focalHeight;
+ f32 focalActorHeight;
if (focalActor == &GET_PLAYER(camera->play)->actor) {
- focalHeight = Player_GetHeight((Player*)focalActor);
+ focalActorHeight = Player_GetHeight((Player*)focalActor);
} else {
- Actor_GetFocus(&actorFocus, focalActor);
- focalHeight = actorFocus.pos.y - camera->focalActorPosRot.pos.y;
- if (focalHeight == 0.0f) {
- focalHeight = 10.0f;
+ Actor_GetFocus(&focalActorFocus, focalActor);
+ focalActorHeight = focalActorFocus.pos.y - camera->focalActorPosRot.pos.y;
+ if (focalActorHeight == 0.0f) {
+ focalActorHeight = 10.0f;
}
}
- return focalHeight;
+ return focalActorHeight;
}
f32 Camera_GetRunSpeedLimit(Camera* camera) {
@@ -223,6 +311,7 @@ s32 func_800CB7CC(Camera* camera) {
return 0;
}
}
+
s32 Camera_IsMountedOnHorse(Camera* camera) {
Actor* focalActor = camera->focalActor;
@@ -310,7 +399,7 @@ s32 func_800CB950(Camera* camera) {
f32 yDiff;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
- yDiff = Camera_fabsf(camera->focalActorPosRot.pos.y - camera->playerFloorHeight);
+ yDiff = Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight);
phi_v0 = false;
if (yDiff < 11.0f) {
@@ -377,13 +466,13 @@ s32 func_800CBA7C(Camera* camera) {
}
}
-s32 func_800CBAAC(Camera* camera) {
+PlayerMeleeWeaponState func_800CBAAC(Camera* camera) {
Actor* focalActor = camera->focalActor;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
return ((Player*)focalActor)->meleeWeaponState;
} else {
- return 0;
+ return PLAYER_MELEE_WEAPON_STATE_0;
}
}
@@ -418,13 +507,13 @@ s32 func_800CBB88(Camera* camera) {
Actor* focalActor = camera->focalActor;
if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
- if ((((Player*)focalActor)->meleeWeaponState != 0) &&
+ if ((((Player*)focalActor)->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
(((Player*)focalActor)->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_BUTT)) {
return 3;
}
if ((((Player*)focalActor)->stateFlags2 & PLAYER_STATE2_20000) ||
- ((((Player*)focalActor)->meleeWeaponState != 0) &&
+ ((((Player*)focalActor)->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
(((Player*)focalActor)->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK))) {
return 1;
}
@@ -444,7 +533,7 @@ s32 Camera_IsUsingZoraFins(Camera* camera) {
}
s32 func_800CBC30(Camera* camera, f32 waterYMax, f32 waterYMin) {
- if ((camera->playerFloorHeight != camera->waterYPos) && (camera->waterYPos < waterYMax) &&
+ if ((camera->focalActorFloorHeight != camera->waterYPos) && (camera->waterYPos < waterYMax) &&
(camera->waterYPos > waterYMin)) {
return true;
} else {
@@ -452,23 +541,258 @@ s32 func_800CBC30(Camera* camera, f32 waterYMax, f32 waterYMin) {
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBC84.s")
+s32 func_800CBC84(Camera* camera, Vec3f* from, CameraCollision* to, s32 arg3) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ Vec3f toNewPos;
+ Vec3f toPoint;
+ Vec3f fromToNorm;
+ f32 floorPolyY;
+ CollisionPoly** floorPoly;
+ s32 floorBgId;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBFA4.s")
+ OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos);
+ toPoint.x = to->pos.x + fromToNorm.x;
+ toPoint.y = to->pos.y + fromToNorm.y;
+ toPoint.z = to->pos.z + fromToNorm.z;
+ floorPoly = &to->poly;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC000.s")
+ if (!BgCheck_CameraLineTest1(colCtx, from, &toPoint, &toNewPos, floorPoly, (arg3 & 1) ? 0 : 1, 1,
+ (arg3 & 2) ? 0 : 1, -1, &floorBgId)) {
+ toNewPos = to->pos;
+ //! FAKE
+ if (1) {}
+ if (1) {}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC128.s")
+ toNewPos.y += 5.0f;
+ if ((arg3 != 0) && func_800CB7CC(camera)) {
+ to->poly = camera->focalActor->floorPoly;
+ floorBgId = camera->focalActor->floorBgId;
+ to->norm.x = COLPOLY_GET_NORMAL(to->poly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(to->poly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(to->poly->normal.z);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC1C4.s")
+ if (!Math3D_LineSegVsPlane(to->norm.x, to->norm.y, to->norm.z, to->poly->dist, from, &toPoint, &toNewPos,
+ 1)) {
+ floorPolyY = to->pos.y - 20.0f;
+ } else {
+ toNewPos.y += 5.0f;
+ floorPolyY = to->pos.y;
+ }
+ } else {
+ floorPolyY = BgCheck_CameraRaycastFloor2(colCtx, floorPoly, &floorBgId, &toNewPos);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC260.s")
+ if ((to->pos.y - floorPolyY) > 5.0f) {
+ to->norm.x = -fromToNorm.x;
+ to->norm.y = -fromToNorm.y;
+ to->norm.z = -fromToNorm.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC488.s")
+ return 0;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC56C.s")
+ to->bgId = floorBgId;
+ to->norm.x = COLPOLY_GET_NORMAL(to->poly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(to->poly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(to->poly->normal.z);
+ to->pos.x = to->norm.x + toNewPos.x;
+ to->pos.y = to->norm.y + toNewPos.y;
+ to->pos.z = to->norm.z + toNewPos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC5C8.s")
+ return floorBgId + 1;
+}
+
+void func_800CBFA4(Camera* camera, Vec3f* arg1, Vec3f* arg2, s32 arg3) {
+ CameraCollision sp20;
+ s32 pad;
+
+ sp20.pos = *arg2;
+ func_800CBC84(camera, arg1, &sp20, arg3);
+ *arg2 = sp20.pos;
+}
+
+/**
+ * Detects the collision poly between `from` and `to`, places collision info in `to`
+ */
+s32 Camera_BgCheckInfo(Camera* camera, Vec3f* from, CameraCollision* to) {
+ CollisionPoly* floorPoly;
+ Vec3f toNewPos;
+ Vec3f fromToNorm;
+
+ if (BgCheck_CameraLineTest1(&camera->play->colCtx, from, &to->pos, &toNewPos, &to->poly, 1, 1, 1, -1, &to->bgId)) {
+ floorPoly = to->poly;
+ to->norm.x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ to->norm.y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ to->norm.z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ to->pos = toNewPos;
+
+ return to->bgId + 1;
+ }
+
+ OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos);
+ to->norm.x = -fromToNorm.x;
+ to->norm.y = -fromToNorm.y;
+ to->norm.z = -fromToNorm.z;
+
+ return 0;
+}
+
+/**
+ * Detects if there is collision between `from` and `to`
+ */
+s32 Camera_BgCheck(Camera* camera, Vec3f* from, Vec3f* to) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ Vec3f intersect;
+ s32 bgId;
+ CollisionPoly* poly = NULL;
+
+ if (BgCheck_CameraLineTest1(colCtx, from, to, &intersect, &poly, 1, 1, 1, -1, &bgId)) {
+ *to = intersect;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Checks if `from` to `to` is looking from the outside of a poly towards the front
+ */
+s32 Camera_CheckOOB(Camera* camera, Vec3f* from, Vec3f* to) {
+ s32 pad;
+ Vec3f intersect;
+ s32 pad2;
+ s32 bgId;
+ CollisionPoly* poly;
+ CollisionContext* colCtx = &camera->play->colCtx;
+
+ poly = NULL;
+ if ((BgCheck_CameraLineTest1(colCtx, from, to, &intersect, &poly, 1, 1, 1, 0, &bgId)) &&
+ (CollisionPoly_GetPointDistanceFromPlane(poly, from) < 0.0f)) {
+ return true;
+ }
+
+ return false;
+}
+
+s16 func_800CC260(Camera* camera, Vec3f* arg1, Vec3f* arg2, VecGeo* arg3, Actor** exclusions, s16 numExclusions) {
+ VecGeo sp90;
+ s32 ret;
+ s32 angleCount;
+ f32 rand;
+ PosRot playerFocus;
+ Vec3f sp64;
+ Player* player = GET_PLAYER(camera->play);
+ s32 i;
+
+ sp64 = *arg2;
+ Actor_GetFocus(&playerFocus, &player->actor); // playerFocus unused
+ sp90 = *arg3;
+
+ angleCount = ARRAY_COUNT(D_801B9E18);
+
+ for (i = 0; i < angleCount; i++) {
+ OLib_AddVecGeoToVec3f(arg1, arg2, &sp90);
+
+ if (!Camera_CheckOOB(camera, arg1, &sp64) && !func_800CBC30(camera, arg2->y, arg1->y) &&
+ !CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, arg2, arg1, exclusions,
+ numExclusions)) {
+ break;
+ }
+
+ sp90.yaw = D_801B9E18[i] + arg3->yaw;
+ rand = Rand_ZeroOne();
+ sp90.pitch = D_801B9E34[i] + (s16)(arg3->pitch * rand);
+
+ if (sp90.pitch > 0x36B0) { // 76.9 degrees
+ sp90.pitch -= 0x3E80; // -87.9 degrees
+ }
+ if (sp90.pitch < -0x36B0) { // -76.9 degrees
+ sp90.pitch += 0x3A98; // 82.4 degrees
+ }
+
+ sp90.r *= 0.9f;
+ sp64 = *arg2;
+ }
+
+ *arg3 = sp90;
+
+ if (i == angleCount) {
+ ret = -1;
+ } else {
+ ret = i;
+ }
+
+ return ret;
+}
+
+/**
+ * Gets the floor position underneath `chkPos`, and returns the normal of the floor to `floorNorm`,
+ * and bgId to `bgId`. If no floor is found, then the normal is a flat surface pointing upwards.
+ */
+f32 Camera_GetFloorYNorm(Camera* camera, Vec3f* floorNorm, Vec3f* chkPos, s32* bgId) {
+ CollisionContext* colCtx = &camera->play->colCtx;
+ CollisionPoly* floorPoly;
+ f32 floorY = BgCheck_EntityRaycastFloor3(colCtx, &floorPoly, bgId, chkPos);
+
+ if (floorY == BGCHECK_Y_MIN) {
+ // no floor
+ floorNorm->x = 0.0f;
+ floorNorm->y = 1.0f;
+ floorNorm->z = 0.0f;
+ } else {
+ floorNorm->x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ floorNorm->y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ floorNorm->z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ }
+
+ return floorY;
+}
+
+/**
+ * Gets the position of the floor from `pos`
+ */
+f32 Camera_GetFloorY(Camera* camera, Vec3f* pos) {
+ Vec3f posCheck;
+ Vec3f floorNorm;
+ s32 bgId;
+
+ posCheck = *pos;
+ posCheck.y += 80.0f;
+
+ return Camera_GetFloorYNorm(camera, &floorNorm, &posCheck, &bgId);
+}
+
+/**
+ * Gets the position of the floor from `pos`, and if the floor is considered not solid,
+ * it checks the next floor below that. Returns the normal of the floor into `norm`
+ */
+f32 Camera_GetFloorYLayer(Camera* camera, Vec3f* norm, Vec3f* pos, s32* bgId) {
+ CollisionPoly* floorPoly;
+ CollisionContext* colCtx = &camera->play->colCtx;
+ f32 floorY;
+
+ if (camera->focalActor != NULL) {
+ floorY = BgCheck_EntityRaycastFloor5_3(camera->play, &camera->play->colCtx, &floorPoly, bgId,
+ camera->focalActor, pos);
+ } else {
+ floorY = BgCheck_CameraRaycastFloor2(colCtx, &floorPoly, bgId, pos);
+ }
+
+ if ((floorY == BGCHECK_Y_MIN) ||
+ ((camera->focalActorFloorHeight < floorY) && !(COLPOLY_GET_NORMAL(floorPoly->normal.y) > 0.5f))) {
+ // no floor, or player is below the floor and floor is not considered steep
+ norm->x = 0.0f;
+ norm->y = 1.0f;
+ norm->z = 0.0f;
+ floorY = BGCHECK_Y_MIN;
+ } else {
+ norm->x = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ norm->y = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+ norm->z = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+ }
+
+ return floorY;
+}
#define CAM_DATA_IS_BG (1 << 12) // if not set, then cam data is for actor cutscenes
@@ -543,163 +867,5086 @@ s32 Camera_GetWaterBoxBgCamSetting(Camera* camera, f32* waterY) {
return (camSetting == CAM_SET_NONE) ? -2 : camSetting;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC938.s")
+void func_800CC938(Camera* camera) {
+ func_800DDFE0(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC958.s")
+/**
+ * Calculates the angle between points `from` and `to`
+ */
+s16 Camera_CalcXZAngle(Vec3f* to, Vec3f* from) {
+ return CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(from->x - to->x, from->z - to->z)));
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC9C0.s")
+// BSS
+s16 D_801EDBF0;
-s32 D_801B9E5C = 0;
-f32 D_801B9E60 = 0.0f;
+/**
+ * Calculates a pitch adjustment by sampling a position in front of the focal actor and testing the floor height.
+ * Used to detect if the focal actor is near a slope, edge, or cliff.
+ *
+ * @param camera
+ * @param viewYaw The yaw the camera is facing, gives a direction to sample a position
+ * @param shouldInit
+ *
+ * @return pitchOffset resulting pitch adjustment
+ */
+s16 Camera_GetPitchAdjFromFloorHeightDiffs(Camera* camera, s16 viewYaw, s16 shouldInit) {
+ static f32 sFloorYNear;
+ static f32 sFloorYFar;
+ static CameraCollision sFarColChk;
+ Vec3f focalActorPos;
+ Vec3f nearPos;
+ Vec3f floorNorm;
+ f32 checkOffsetY;
+ s16 pitchNear;
+ s16 pitchFar;
+ f32 floorYDiffFar;
+ f32 viewForwardsUnitX;
+ f32 viewForwardsUnitZ;
+ s32 bgId;
+ f32 nearDist;
+ f32 farDist;
+ f32 floorYDiffNear;
+ f32 focalActorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CCCEC.s")
+ viewForwardsUnitX = Math_SinS(viewYaw);
+ viewForwardsUnitZ = Math_CosS(viewYaw);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD04C.s")
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD288.s")
+ checkOffsetY = focalActorHeight * 1.2f;
+ nearDist = focalActorHeight * 1.0f;
+ farDist = focalActorHeight * 2.5f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2E0.s")
+ focalActorPos.x = camera->focalActorPosRot.pos.x;
+ focalActorPos.y = camera->focalActorFloorHeight + checkOffsetY;
+ focalActorPos.z = camera->focalActorPosRot.pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2F0.s")
+ nearPos.x = focalActorPos.x + (nearDist * viewForwardsUnitX);
+ nearPos.y = focalActorPos.y;
+ nearPos.z = focalActorPos.z + (nearDist * viewForwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD3E4.s")
+ if (shouldInit || ((camera->play->state.frames % 2) == 0)) {
+ sFarColChk.pos.x = focalActorPos.x + (farDist * viewForwardsUnitX);
+ sFarColChk.pos.y = focalActorPos.y;
+ sFarColChk.pos.z = focalActorPos.z + (farDist * viewForwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD44C.s")
+ Camera_BgCheckInfo(camera, &focalActorPos, &sFarColChk);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD634.s")
+ if (shouldInit) {
+ sFloorYNear = sFloorYFar = camera->focalActorFloorHeight;
+ }
+ } else {
+ farDist = OLib_Vec3fDistXZ(&focalActorPos, &sFarColChk.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6CC.s")
+ sFarColChk.pos.x += sFarColChk.norm.x * 5.0f;
+ sFarColChk.pos.y += sFarColChk.norm.y * 5.0f;
+ sFarColChk.pos.z += sFarColChk.norm.z * 5.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6F8.s")
+ if (nearDist > farDist) {
+ nearDist = farDist;
+ sFloorYNear = sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
+ } else {
+ sFloorYNear = Camera_GetFloorYLayer(camera, &floorNorm, &nearPos, &bgId);
+ sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD834.s")
+ if (sFloorYNear == BGCHECK_Y_MIN) {
+ sFloorYNear = camera->focalActorFloorHeight;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDA14.s")
+ if (sFloorYFar == BGCHECK_Y_MIN) {
+ sFloorYFar = sFloorYNear;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDB6C.s")
+ floorYDiffNear = (sFloorYNear - camera->focalActorFloorHeight) * 0.8f;
+ floorYDiffFar = (sFloorYFar - camera->focalActorFloorHeight) * (20.0f * 0.01f);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDE6C.s")
+ pitchNear = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffNear, nearDist)));
+ pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffFar, farDist)));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE2B8.s")
+ return pitchNear + pitchFar;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE5E0.s")
+f32 func_800CCCEC(Camera* camera, s16 reset) {
+ static s32 D_801B9E5C = 0;
+ static f32 D_801B9E60 = 0.0f;
+ Vec3f offsetForwards;
+ Vec3f angledOffsetForwards;
+ PosRot focalActorPosRot;
+ CameraCollision camCollision;
+ f32 forwardsUnitZ;
+ f32 focalActorHeight;
+ f32 forwardsUnitX;
+ f32 distResult;
+ s16 yawForwardsOffset;
+ f32 distResultAdj;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE79C.s")
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE930.s")
+ if (reset) {
+ D_801B9E5C = 0;
+ D_801B9E60 = 0.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEAD8.s")
+ focalActorPosRot = camera->focalActorPosRot;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEC38.s")
+ forwardsUnitX = Math_SinS(focalActorPosRot.rot.y);
+ forwardsUnitZ = Math_CosS(focalActorPosRot.rot.y);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CED90.s")
+ offsetForwards.x = focalActorPosRot.pos.x + (30.0f * forwardsUnitX);
+ offsetForwards.y = focalActorPosRot.pos.y + focalActorHeight;
+ offsetForwards.z = focalActorPosRot.pos.z + (30.0f * forwardsUnitZ);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Noop.s")
+ camCollision.pos.x = focalActorPosRot.pos.x + (12.0f * forwardsUnitX);
+ camCollision.pos.y = offsetForwards.y;
+ camCollision.pos.z = focalActorPosRot.pos.z + (12.0f * forwardsUnitZ);
+ if ((camera->play->state.frames % 2) != 0) {
+ // Turn and project 65.92 degrees left
+ yawForwardsOffset = focalActorPosRot.rot.y + DEG_TO_BINANG(65.92f);
+
+ angledOffsetForwards.x = (Math_SinS(yawForwardsOffset) * 50.0f) + offsetForwards.x;
+ angledOffsetForwards.y = offsetForwards.y;
+ angledOffsetForwards.z = (Math_CosS(yawForwardsOffset) * 50.0f) + offsetForwards.z;
+
+ if ((Camera_BgCheckInfo(camera, &angledOffsetForwards, &camCollision) != 0) &&
+ Camera_CheckOOB(camera, &offsetForwards, &angledOffsetForwards)) {
+ // Always going to result in 28.0f?
+ distResult = OLib_Vec3fDistXZ(&offsetForwards, &camCollision.pos);
+
+ // (-D_801B9E60 < (50.0f - distResult))
+ if (!((D_801B9E5C == 2) && (-D_801B9E60 >= (50.0f - distResult)))) {
+ D_801B9E5C = 1;
+ distResult = 50.0f - distResult; // 22.0f
+ D_801B9E60 = distResult;
+
+ // if (distResult == 0.0f)
+ if (distResult == -distResult) {
+ distResultAdj = 0.0f;
+ } else {
+ distResultAdj = distResult;
+ }
+
+ return distResultAdj;
+ }
+ }
+ } else {
+ // Turn and project 90 degrees right
+ yawForwardsOffset = focalActorPosRot.rot.y - DEG_TO_BINANG(90);
+
+ angledOffsetForwards.x = (Math_SinS(yawForwardsOffset) * 50.0f) + offsetForwards.x;
+ angledOffsetForwards.y = offsetForwards.y;
+ angledOffsetForwards.z = (Math_CosS(yawForwardsOffset) * 50.0f) + offsetForwards.z;
+
+ if ((Camera_BgCheckInfo(camera, &angledOffsetForwards, &camCollision) != 0) &&
+ Camera_CheckOOB(camera, &offsetForwards, &angledOffsetForwards)) {
+ // Always going to result in 28.0f?
+ distResult = OLib_Vec3fDistXZ(&offsetForwards, &camCollision.pos);
+
+ if (!((D_801B9E5C == 1) && (D_801B9E60 >= -(distResult - 50.0f)))) {
+ D_801B9E5C = 2;
+ distResult = distResult - 50.0f;
+ D_801B9E60 = distResult;
+ if (distResult == -distResult) {
+ distResultAdj = 0.0f;
+ } else {
+ distResultAdj = distResult;
+ }
+ return distResultAdj;
+ }
+ }
+ }
+
+ if (D_801B9E5C != 0) {
+ distResult = D_801B9E60;
+ } else {
+ distResult = 0.0f;
+ }
+
+ D_801B9E5C = 0;
+ D_801B9E60 = 0.0f;
+
+ return distResult;
+}
+
+/**
+ * Calculates a new Up vector from the pitch, yaw, roll
+ */
+Vec3f* Camera_CalcUpVec(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) {
+ f32 sinP = Math_SinS(pitch);
+ f32 cosP = Math_CosS(pitch);
+ f32 sinY = Math_SinS(yaw);
+ f32 cosY = Math_CosS(yaw);
+ f32 sinR = Math_SinS(-roll);
+ f32 cosR = Math_CosS(-roll);
+ Vec3f up;
+ Vec3f baseUp;
+ Vec3f u;
+ Vec3f rollMtxRow1;
+ Vec3f rollMtxRow2;
+ Vec3f rollMtxRow3;
+ f32 pad;
+
+ // Axis to roll around
+ u.x = cosP * sinY;
+ u.y = sinP;
+ u.z = cosP * cosY;
+
+ // Matrix to apply the roll to the Up vector without roll
+ rollMtxRow1.x = ((1.0f - SQ(u.x)) * cosR) + SQ(u.x);
+ rollMtxRow1.y = ((u.x * u.y) * (1.0f - cosR)) - (u.z * sinR);
+ rollMtxRow1.z = ((u.z * u.x) * (1.0f - cosR)) + (u.y * sinR);
+
+ rollMtxRow2.x = ((u.x * u.y) * (1.0f - cosR)) + (u.z * sinR);
+ rollMtxRow2.y = ((1.0f - SQ(u.y)) * cosR) + SQ(u.y);
+ rollMtxRow2.z = ((u.y * u.z) * (1.0f - cosR)) - (u.x * sinR);
+
+ rollMtxRow3.x = ((u.z * u.x) * (1.0f - cosR)) - (u.y * sinR);
+ rollMtxRow3.y = ((u.y * u.z) * (1.0f - cosR)) + (u.x * sinR);
+ rollMtxRow3.z = ((1.0f - SQ(u.z)) * cosR) + SQ(u.z);
+
+ // Up without roll
+ baseUp.x = -sinP * sinY;
+ baseUp.y = cosP;
+ baseUp.z = -sinP * cosY;
+
+ // rollMtx * baseUp
+ up.x = DOTXYZ(baseUp, rollMtxRow1);
+ up.y = DOTXYZ(baseUp, rollMtxRow2);
+ up.z = DOTXYZ(baseUp, rollMtxRow3);
+
+ *viewUp = up;
+
+ return viewUp;
+}
+
+f32 Camera_ClampLerpScale(Camera* camera, f32 maxLerpScale) {
+ f32 ret;
+
+ if (camera->atLerpStepScale < 0.12f) {
+ ret = 0.12f;
+ } else if (camera->atLerpStepScale >= maxLerpScale) {
+ ret = maxLerpScale;
+ } else {
+ ret = 1.1f * camera->atLerpStepScale;
+ }
+
+ return ret;
+}
+
+void Camera_ResetActionFuncState(Camera* camera, s32 mode) {
+ camera->animState = 0;
+}
+
+void Camera_UpdateInterface(s32 interfaceFlags) {
+ s32 hudVisibility;
+
+ if ((interfaceFlags & CAM_LETTERBOX_MASK) != CAM_LETTERBOX_IGNORE) {
+ switch (interfaceFlags & CAM_LETTERBOX_SIZE_MASK) {
+ case CAM_LETTERBOX_SMALL:
+ sCameraLetterboxSize = 26;
+ break;
+
+ case CAM_LETTERBOX_MEDIUM:
+ sCameraLetterboxSize = 27;
+ break;
+
+ case CAM_LETTERBOX_LARGE:
+ sCameraLetterboxSize = 32;
+ break;
+
+ default:
+ sCameraLetterboxSize = 0;
+ break;
+ }
+
+ if (interfaceFlags & CAM_LETTERBOX_INSTANT) {
+ ShrinkWindow_Letterbox_SetSize(sCameraLetterboxSize);
+ } else {
+ ShrinkWindow_Letterbox_SetSizeTarget(sCameraLetterboxSize);
+ }
+ }
+
+ if ((interfaceFlags & CAM_HUD_VISIBILITY_MASK) != CAM_HUD_VISIBILITY_IGNORE) {
+ hudVisibility = (interfaceFlags & CAM_HUD_VISIBILITY_MASK) >> CAM_HUD_VISIBILITY_SHIFT;
+ if (hudVisibility == (CAM_HUD_VISIBILITY_ALL >> CAM_HUD_VISIBILITY_SHIFT)) {
+ hudVisibility = 50;
+ }
+ if (hudVisibility != sCameraHudVisibility) {
+ sCameraHudVisibility = hudVisibility;
+ Interface_SetHudVisibility(sCameraHudVisibility);
+ }
+ }
+}
+
+Vec3f* Camera_BgCheckCorner(Vec3f* dst, Vec3f* linePointA, Vec3f* linePointB, CameraCollision* pointAColChk,
+ CameraCollision* pointBColChk) {
+ Vec3f closestPoint;
+
+ func_800CAA14(pointAColChk->poly, pointBColChk->poly, linePointA, linePointB, &closestPoint);
+ *dst = closestPoint;
+
+ return dst;
+}
+
+/**
+ * Checks collision between at and eyeNext, if `checkEye` is set, if there is no collsion between
+ * eyeNext->at, then eye->at is also checked.
+ * Returns:
+ * 0 if no collsion is found between at->eyeNext
+ * 1 if the angle between the polys is between 60 degrees and 120 degrees
+ * 3 ?
+ * 6 if the angle between the polys is greater than 120 degrees
+ */
+s32 func_800CD44C(Camera* camera, VecGeo* diffGeo, CameraCollision* camEyeCollision, CameraCollision* camAtCollision,
+ s16 checkEye) {
+ Vec3f* at = &camera->at;
+ s32 pad[2];
+ s32 atEyeBgId;
+ s32 eyeAtBgId;
+ s32 ret;
+ f32 cosEyeAt;
+ CameraCollision camCollision;
+
+ camEyeCollision->pos = camera->eyeNext;
+
+ ret = 0;
+
+ atEyeBgId = func_800CBC84(camera, at, camEyeCollision, 0);
+ if (atEyeBgId != 0) {
+ // collision found between at->ey
+ camAtCollision->pos = *at;
+
+ OLib_Vec3fToVecGeo(&camEyeCollision->geoNorm, &camEyeCollision->norm);
+
+ if (camEyeCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees
+ camEyeCollision->geoNorm.yaw = diffGeo->yaw;
+ }
+
+ if (checkEye & 1) {
+ memcpy(&camCollision, camAtCollision, sizeof(CameraCollision));
+ }
+
+ eyeAtBgId = Camera_BgCheckInfo(camera, &camera->eye, camAtCollision);
+
+ if (eyeAtBgId == 0) {
+ // no collision from eyeNext->at
+ if (checkEye & 1) {
+ memcpy(camAtCollision, &camCollision, sizeof(CameraCollision));
+ } else {
+ return 3;
+ }
+ }
+
+ if (camEyeCollision->poly == camAtCollision->poly) {
+ // at->eyeNext and eyeNext->at is the same poly
+ return 3;
+ }
+
+ OLib_Vec3fToVecGeo(&camAtCollision->geoNorm, &camAtCollision->norm);
+
+ if (camAtCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees
+ camAtCollision->geoNorm.yaw = BINANG_ROT180(diffGeo->yaw);
+ }
+
+ if (atEyeBgId != eyeAtBgId) {
+ // different bgIds for at->eye[Next] and eye[Next]->at
+ ret = 3;
+ } else {
+ cosEyeAt = Math3D_Parallel(&camEyeCollision->norm, &camAtCollision->norm);
+ if (cosEyeAt < -0.5f) {
+ ret = 6;
+ } else if ((cosEyeAt > 0.5f) || (checkEye & 2)) {
+ ret = 3;
+ } else {
+ ret = 1;
+ }
+ }
+ }
+ return ret;
+}
+
+/**
+ * Calculates how much to adjust the camera at's y value when on a slope.
+ */
+f32 Camera_CalcSlopeYAdj(Vec3f* floorNorm, s16 playerYRot, s16 eyeAtYaw, f32 adjAmt) {
+ f32 tmp;
+ VecGeo floorNormGeo;
+
+ OLib_Vec3fToVecGeo(&floorNormGeo, floorNorm);
+
+ tmp = Math_CosS(floorNormGeo.pitch) * Math_CosS(playerYRot - floorNormGeo.yaw);
+
+ return (Camera_fabsf(tmp) * adjAmt) * Math_CosS(playerYRot - eyeAtYaw);
+}
+
+f32 func_800CD6CC(Actor* actor) {
+ return sqrtf(gTargetRanges[actor->targetMode].rangeSq / gTargetRanges[actor->targetMode].leashScale);
+}
+
+/**
+ * Calculates new at vector for the camera pointing in `eyeAtDir`
+ */
+s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, s16 calcSlope) {
+ Vec3f* at = &camera->at;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ s32 pad;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ if (calcSlope) {
+ focalActorAtOffsetTarget.y -= OLib_ClampMaxDist(
+ Camera_CalcSlopeYAdj(&camera->floorNorm, focalActorPosRot->rot.y, eyeAtDir->yaw, 25.0f), focalActorHeight);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+
+ if (atTarget.y < (camera->focalActorFloorHeight + 10.0f)) {
+ atTarget.y = camera->focalActorFloorHeight + 10.0f;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForScreen(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* focalActorPosY, f32 deltaYMax) {
+ f32 deltaY;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ s32 pad;
+ f32 clampedDeltaY;
+ f32 clampedAbsScreenY;
+ s16 absScreenY;
+ s16 screenY;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ Actor_GetScreenPos(camera->play, camera->focalActor, &absScreenY, &screenY);
+ screenY -= SCREEN_HEIGHT / 2;
+ absScreenY = ABS(screenY);
+
+ // result unused
+ clampedAbsScreenY = OLib_ClampMaxDist(absScreenY / (f32)(SCREEN_HEIGHT / 2), 1.0f);
+
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ clampedDeltaY = OLib_ClampMaxDist(deltaY, deltaYMax);
+
+ if (absScreenY > (SCREEN_HEIGHT / 4)) {
+ absScreenY = SCREEN_HEIGHT / 4;
+ }
+
+ clampedAbsScreenY = OLib_ClampMaxDist(absScreenY / (f32)(SCREEN_HEIGHT / 4), 1.0f);
+
+ focalActorAtOffsetTarget.y -= clampedDeltaY * clampedAbsScreenY * clampedAbsScreenY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ atTarget.y = CLAMP_MIN(atTarget.y, camera->focalActorFloorHeight + 10.0f);
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.1f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForNormal1(Camera* camera, VecGeo* arg1, f32 yOffset, f32 forwardDist) {
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f collisionFromPos;
+ s32 pad;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ focalActorAtOffsetTarget.x = Math_SinS(focalActorPosRot->rot.y) * forwardDist;
+ focalActorAtOffsetTarget.z = Math_CosS(focalActorPosRot->rot.y) * forwardDist;
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+
+ collisionFromPos.x = focalActorPosRot->pos.x;
+ collisionFromPos.y = atTarget.y;
+ collisionFromPos.z = focalActorPosRot->pos.z;
+
+ if (Camera_BgCheck(camera, &collisionFromPos, &atTarget)) {
+ atTarget.x -= camera->focalActorAtOffset.x - (atTarget.x - collisionFromPos.x);
+ atTarget.z -= camera->focalActorAtOffset.z - (atTarget.z - collisionFromPos.z);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+/**
+ * Adjusts the camera's at position for Camera_Parallel1
+ */
+s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32 xzOffsetMax, f32* focalActorPosY,
+ s16 flags) {
+ f32 pad;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ f32 fovHeight;
+ Vec3f* at = &camera->at;
+ f32 deltaY;
+ f32 eyeAtDistXZ;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ VecGeo focalActorAtOffsetTargetGeo;
+
+ // Calculate the `focalActorAtOffsetTarget`
+ // @TODO: Only uses `PARALLEL1_FLAG_` flags, but may need separate flags for `CalcAt` system
+ if (flags & 0x40) {
+ focalActorAtOffsetTargetGeo.r = func_800CCCEC(camera, flags & 0x10);
+ focalActorAtOffsetTargetGeo.yaw = focalActorPosRot->rot.y + 0x4000;
+ focalActorAtOffsetTargetGeo.pitch = 0;
+ OLib_VecGeoToVec3f(&focalActorAtOffsetTarget, &focalActorAtOffsetTargetGeo);
+ } else {
+ f32 xOffset = camera->focalActorAtOffset.x + camera->unk_0F0.x;
+ f32 zOffset = camera->focalActorAtOffset.z + camera->unk_0F0.z;
+
+ if (sqrtf(SQ(xOffset) + SQ(zOffset)) < xzOffsetMax) {
+ focalActorAtOffsetTarget.x = xOffset;
+ focalActorAtOffsetTarget.z = zOffset;
+ } else {
+ focalActorAtOffsetTarget.x = camera->focalActorAtOffset.x;
+ focalActorAtOffsetTarget.z = camera->focalActorAtOffset.z;
+ }
+ }
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+
+ // focalActorAtOffsetTarget.y based on slope
+ if (PREG(76) && flags) {
+ focalActorAtOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, focalActorPosRot->rot.y, arg1->yaw, 25.0f);
+ }
+
+ // Adjust posOffsetTarget.y based on something
+ if (func_800CB950(camera)) {
+ *focalActorPosY = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, *focalActorPosY, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ deltaY = focalActorPosRot->pos.y - *focalActorPosY;
+ eyeAtDistXZ = OLib_Vec3fDistXZ(at, &camera->eye);
+
+ // Get the height based on 80% of the fov
+ fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * (0.8f * 0.5f))) * eyeAtDistXZ;
+
+ if (deltaY > fovHeight) {
+ //! FAKE
+ if (1) {}
+ *focalActorPosY += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *focalActorPosY += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.3f, 0.2f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.3f;
+ camera->yOffsetUpdateRate = 0.2f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f32 yOffset, f32 distance,
+ f32* yPosOffset, VecGeo* outPlayerToTargetDir, s16 flags) {
+ Vec3f* at = &camera->at;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f sp68;
+ f32 temp_f0_6;
+ VecGeo sp5C;
+ f32 deltaY;
+ f32 fovHeight;
+ f32 phi_f16;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ f32 sp50;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+
+ focalActorAtOffsetTarget.y = focalActorHeight + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ if (PREG(76) && (flags & FLG_ADJSLOPE)) {
+ focalActorAtOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, camera->focalActorPosRot.rot.y, eyeAtDir->yaw, 25.0f);
+ }
+
+ atTarget = focalActorPosRot->pos;
+ atTarget.y += focalActorHeight;
+
+ OLib_Vec3fDiffToVecGeo(outPlayerToTargetDir, &atTarget, targetPos);
+
+ sp5C = *outPlayerToTargetDir;
+ sp5C.r = (distance < sp5C.r) ? (sp5C.r * 0.2f) : ((sp5C.r * 0.9f) - (sp5C.r * 0.7f * (sp5C.r / distance)));
+
+ if (flags & FLG_OFFGROUND) {
+ sp5C.r *= 0.2f;
+ camera->yOffsetUpdateRate = camera->xzOffsetUpdateRate = 0.01f;
+ }
+
+ OLib_VecGeoToVec3f(&sp68, &sp5C);
+
+ focalActorAtOffsetTarget.x += sp68.x;
+ focalActorAtOffsetTarget.y += sp68.y;
+ focalActorAtOffsetTarget.z += sp68.z;
+
+ if (func_800CB950(camera)) {
+ *yPosOffset = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, *yPosOffset, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ if (!(flags & 0x80)) {
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ sp50 = OLib_Vec3fDistXZ(at, &camera->eye);
+ phi_f16 = sp50;
+ Math_FAtan2F(deltaY, sp50);
+ fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * 0.4f)) * phi_f16;
+
+ if (fovHeight < deltaY) {
+ *yPosOffset += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *yPosOffset += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+ focalActorAtOffsetTarget.y -= deltaY;
+ } else {
+ deltaY = focalActorPosRot->pos.y - *yPosOffset;
+ temp_f0_6 = Math_FAtan2F(deltaY, OLib_Vec3fDistXZ(at, &camera->eye));
+
+ if (temp_f0_6 > 0.34906584f) { // (M_PI / 9)
+ phi_f16 = 1.0f - Math_SinF(temp_f0_6 - 0.34906584f);
+ } else if (temp_f0_6 < -0.17453292f) { // (M_PI / 18)
+ phi_f16 = 1.0f - Math_SinF(-0.17453292f - temp_f0_6);
+ } else {
+ phi_f16 = 1.0f;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY * phi_f16;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.5f, 0.5f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return 1;
+}
+
+s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset, f32 arg4, f32 arg5, f32* arg6,
+ VecGeo* arg7, s16 flags) {
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f focalActorAtOffsetTarget;
+ Vec3f atTarget;
+ Vec3f sp60;
+ VecGeo sp58;
+ f32 temp_f0_3;
+ f32 deltaY;
+ f32 new_var2;
+ f32 sp4C;
+ f32 phi_f14;
+ f32 fovHeight;
+
+ focalActorAtOffsetTarget.y = Camera_GetFocalActorHeight(camera) + yOffset;
+ focalActorAtOffsetTarget.x = 0.0f;
+ focalActorAtOffsetTarget.z = 0.0f;
+
+ sp58 = *arg7;
+ sp58.r = arg7->r * (arg5 * arg4);
+
+ if (flags & 0x80) {
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ }
+
+ OLib_VecGeoToVec3f(&sp60, &sp58);
+
+ focalActorAtOffsetTarget.x += sp60.x;
+ focalActorAtOffsetTarget.y += sp60.y;
+ focalActorAtOffsetTarget.z += sp60.z;
+
+ if (func_800CB950(camera)) {
+ phi_f14 = *arg6;
+ *arg6 = Camera_ScaledStepToCeilF(focalActorPosRot->pos.y, phi_f14, 0.4f, 0.1f);
+ deltaY = focalActorPosRot->pos.y - *arg6;
+ focalActorAtOffsetTarget.y -= deltaY;
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+ } else {
+ //! FAKE:
+ if (focalActorPosRot->pos.x) {}
+
+ //! FAKE: unnecessary temp?
+ new_var2 = *arg1;
+ sp4C = new_var2;
+ deltaY = focalActorPosRot->pos.y - *arg6;
+ temp_f0_3 = Math_FAtan2F(deltaY, sp4C);
+
+ if (!(flags & 0x80)) {
+ fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * 0.4f)) * sp4C;
+
+ if (fovHeight < deltaY) {
+ *arg6 += deltaY - fovHeight;
+ deltaY = fovHeight;
+ } else if (deltaY < -fovHeight) {
+ *arg6 += deltaY + fovHeight;
+ deltaY = -fovHeight;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY;
+ } else {
+ if (temp_f0_3 > 0.34906584f) { // (M_PI / 9)
+ phi_f14 = 1.0f - Math_SinF(temp_f0_3 - 0.34906584f);
+ } else if (temp_f0_3 < -0.17453292f) { // (M_PI / 18)
+ phi_f14 = 1.0f - Math_SinF(-0.17453292f - temp_f0_3);
+ } else {
+ phi_f14 = 1.0f;
+ }
+
+ focalActorAtOffsetTarget.y -= deltaY * phi_f14;
+ }
+ Camera_ScaledStepToCeilVec3f(&focalActorAtOffsetTarget, &camera->focalActorAtOffset, 0.5f, 0.5f, 0.1f);
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, &camera->at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return true;
+}
+
+s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yPosOffset, s16 calcSlope) {
+ Vec3f* at = &camera->at;
+ Vec3f posOffsetTarget;
+ Vec3f atTarget;
+ s32 pad[2];
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Player* player = (Player*)camera->focalActor;
+ PosRot horsePosRot;
+
+ Actor_GetWorld(&horsePosRot, player->rideActor);
+
+ if (EN_HORSE_CHECK_JUMPING((EnHorse*)player->rideActor)) {
+ horsePosRot.pos.y -= 49.0f;
+ *yPosOffset = Camera_ScaledStepToCeilF(horsePosRot.pos.y, *yPosOffset, 0.1f, 0.1f);
+ camera->atLerpStepScale = Camera_ScaledStepToCeilF(0.4f, camera->atLerpStepScale, 0.2f, 0.02f);
+ } else {
+ *yPosOffset = Camera_ScaledStepToCeilF(horsePosRot.pos.y, *yPosOffset, 0.5f, 0.1f);
+ }
+
+ posOffsetTarget.x = 0.0f;
+ posOffsetTarget.y = focalActorHeight + yOffset;
+ posOffsetTarget.z = 0.0f;
+
+ if (calcSlope) {
+ posOffsetTarget.y -=
+ Camera_CalcSlopeYAdj(&camera->floorNorm, camera->focalActorPosRot.rot.y, eyeAtDir->yaw, 25.0f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&posOffsetTarget, &camera->focalActorAtOffset, camera->xzOffsetUpdateRate,
+ camera->yOffsetUpdateRate, 0.1f);
+
+ atTarget.x = camera->focalActorAtOffset.x + horsePosRot.pos.x;
+ atTarget.y = camera->focalActorAtOffset.y + horsePosRot.pos.y;
+ atTarget.z = camera->focalActorAtOffset.z + horsePosRot.pos.z;
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, camera->atLerpStepScale, camera->atLerpStepScale, 0.2f);
+
+ return true;
+}
+
+f32 Camera_ClampDist1(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 timer) {
+ f32 distTarget;
+
+ if ((dist / maxDist) > 1.2f) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = 20.0f / (dist / maxDist);
+ if ((20.0f / (dist / maxDist)) < 10) {
+ camera->rUpdateRateInv = 10;
+ }
+ } else if (dist < minDist) {
+ distTarget = minDist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 10.0f : 20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if (maxDist < dist) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 10.0f : 20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ distTarget = dist;
+
+ camera->rUpdateRateInv =
+ Camera_ScaledStepToCeilF((timer != 0) ? 20.0f : 1.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ }
+
+ return Camera_ScaledStepToCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+}
+
+f32 Camera_ClampDist2(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 timer) {
+ f32 distTarget;
+
+ if (timer == 0) {
+ distTarget = ((maxDist * 0.25f) > 80.0f) ? maxDist * 0.25f : 80.0f;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(1000.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if ((dist / maxDist) > 1.2f) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = 20.0f / (dist / maxDist);
+ if ((20.0f / (dist / maxDist)) < 10.0f) {
+ camera->rUpdateRateInv = 10.0f;
+ }
+ } else if (dist < minDist) {
+ distTarget = minDist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else if (maxDist < dist) {
+ distTarget = maxDist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ distTarget = dist;
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(1.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ }
+
+ return Camera_ScaledStepToCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+}
+
+/**
+ * Calculates the camera pitch to update to as player moves around
+ * The pitch target starts with a default value on a flat surface, then standing on a sloped surface will create an
+ * offset in default pitch Camera "AI" for pitch
+ */
+s16 Camera_CalcDefaultPitch(Camera* camera, s16 pitch, s16 flatSurfacePitchTarget, s16 slopePitchAdj) {
+ f32 attenuation;
+ f32 pitchStepScale;
+ f32 t;
+ s16 slopePitchAdjAttenuated;
+ s16 pitchMag = ABS(pitch);
+ s16 pitchTarget;
+
+ // if slopePitchAdj is positive, then it is attenuated by a factor of Math_CosS(slopePitchAdj)
+ slopePitchAdjAttenuated = (slopePitchAdj > 0) ? (s16)(Math_CosS(slopePitchAdj) * slopePitchAdj) : slopePitchAdj;
+ pitchTarget = flatSurfacePitchTarget - slopePitchAdjAttenuated;
+
+ if (ABS(pitchTarget) < pitchMag) {
+ // pitch is decreasing
+ pitchStepScale = (1.0f / camera->pitchUpdateRateInv) * 3.0f;
+ } else {
+ // pitch is increasing
+ t = pitchMag * (1.0f / DEG_TO_BINANG(79.655f));
+ attenuation =
+ Camera_QuadraticAttenuation(0.8f, 1.0f - t); // attenuation starts above pitch = 0xB54 (16 degrees)
+ pitchStepScale = (1.0f / camera->pitchUpdateRateInv) * attenuation;
+ }
+
+ return Camera_ScaledStepToCeilS(pitchTarget, pitch, pitchStepScale, 5);
+}
+
+/**
+ * Calculates the camera pitch to update to as player moves around
+ * The yaw target starts with a default value, but will only update to that target yaw in proportion to players velocity
+ * No velocity means yaw does not update
+ * Camera "AI" for yaw
+ */
+s16 Camera_CalcDefaultYaw(Camera* camera, s16 yaw, s16 target, f32 attenuationYawDiffRange,
+ f32 attenuationYawDiffInterpParam) {
+ f32 attenuationYawDiffAdj;
+ f32 attenuationYawDiff;
+ f32 attenuationYawDiffParam;
+ f32 attenuationSpeedRatio;
+ f32 yawUpdRate;
+ s16 yawDiffToTarget;
+
+ if (camera->xzSpeed > 0.001f) {
+ yawDiffToTarget = target - BINANG_ROT180(yaw);
+ attenuationYawDiffParam = BINANG_ROT180(yawDiffToTarget) / (f32)0x8000;
+ } else {
+ yawDiffToTarget = target - BINANG_ROT180(yaw);
+ attenuationYawDiffParam = 0.3f;
+ }
+
+ // Attenuation 1 based on YawDiffToTarget.
+ attenuationYawDiff = Camera_QuadraticAttenuation(attenuationYawDiffRange, attenuationYawDiffParam);
+ attenuationYawDiffAdj = LERPIMP(attenuationYawDiff, 1.0f, attenuationYawDiffInterpParam);
+ attenuationYawDiffAdj = CLAMP_MIN(attenuationYawDiffAdj, 0.0f);
+
+ // attenuation 2 based on SpeedRatio
+ attenuationSpeedRatio = Camera_QuadraticAttenuation(0.5f, camera->speedRatio);
+
+ yawUpdRate = 1.0f / camera->yawUpdateRateInv;
+ return yaw + (s16)(yawDiffToTarget * attenuationYawDiffAdj * attenuationSpeedRatio * yawUpdRate);
+}
+
+void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg3, f32 arg4, SwingAnimation* swing2,
+ s16* flags) {
+ SwingAnimation* swing = swing2;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f peekAroundPoint;
+ s32 sp8C = 0;
+ f32 sp88;
+ s32 checkEyeBit1;
+ s32 checkEyeBit2;
+ CameraCollision sp58;
+ VecGeo sp50;
+ Vec3f* sp30;
+
+ if (swing->unk_64 == 1) {
+ if (arg3 < (sp88 = OLib_Vec3fDist(at, &swing->collisionClosePoint))) {
+ //! FAKE:
+ dummy:;
+ swing->unk_64 = 0;
+ } else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->eyeAtColChk.norm.x, swing->eyeAtColChk.norm.y,
+ swing->eyeAtColChk.norm.z, swing->eyeAtColChk.poly->dist,
+ at)) > 0.0f) {
+ swing->unk_64 = 0;
+ } else if ((sp88 = OLib_Vec3fDist(eye, &swing->eyeAtColChk.pos)) < 10.0f) {
+ swing->unk_64 = 0;
+ } else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->atEyeColChk.norm.x, swing->atEyeColChk.norm.y,
+ swing->atEyeColChk.norm.z, swing->atEyeColChk.poly->dist,
+ eye)) > 0.0f) {
+ swing->unk_64 = 0;
+ } else if (swing->atEyeColChk.norm.y > 0.50f) {
+ swing->unk_64 = 0;
+ } else {
+ Math3D_AngleBetweenVectors(&camera->unk_0F0, &swing->eyeAtColChk.norm, &sp88);
+ if (sp88 > 0.0f) {
+ swing->unk_64 = 0;
+ }
+ }
+
+ if (swing->unk_64 == 1) {
+ sp8C = 2;
+ }
+ } else if (swing->unk_64 == 2) {
+ swing->unk_64 = 0;
+ }
+
+ if (sp8C == 0) {
+ if (*flags & 2) {
+ checkEyeBit1 = 1 << 1;
+ } else {
+ checkEyeBit1 = 0;
+ }
+
+ if (swing->unk_64 != 1) {
+ checkEyeBit2 = 1 << 0;
+ } else {
+ checkEyeBit2 = 0;
+ }
+
+ sp8C =
+ func_800CD44C(camera, arg1, &swing->atEyeColChk, &swing->eyeAtColChk, ((s16)checkEyeBit2 | checkEyeBit1));
+ }
+
+ switch (sp8C) {
+ case 1:
+ Camera_BgCheckCorner(&swing->collisionClosePoint, &camera->at, &camera->eyeNext, &swing->atEyeColChk,
+ &swing->eyeAtColChk);
+ // fallthrough
+ case 2:
+ peekAroundPoint.x = swing->collisionClosePoint.x + (swing->atEyeColChk.norm.x + swing->eyeAtColChk.norm.x);
+ peekAroundPoint.y = swing->collisionClosePoint.y + (swing->atEyeColChk.norm.y + swing->eyeAtColChk.norm.y);
+ peekAroundPoint.z = swing->collisionClosePoint.z + (swing->atEyeColChk.norm.z + swing->eyeAtColChk.norm.z);
+
+ sp30 = &camera->eyeNext;
+ OLib_Vec3fDiffToVecGeo(&sp50, at, &peekAroundPoint);
+ sp50.r = arg1->r;
+ swing->unk_64 = 1;
+ swing->swingUpdateRate = 1.5f;
+ OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50);
+
+ if (func_800CBC84(camera, &swing->eyeAtColChk.pos, &sp58, 0) == 0) {
+ sp50.yaw =
+ Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, (camera->speedRatio * 0.5f) + 0.5f) + arg2->yaw;
+ sp50.pitch = Camera_AngleDiffAndScale(arg1->pitch, arg2->pitch, (camera->speedRatio * 0.5f) + 0.5f) +
+ arg2->pitch;
+ if (swing->atEyeColChk.geoNorm.pitch < 0x2AA8) { // 60 degrees
+ swing->yaw = sp50.yaw;
+ swing->pitch = sp50.pitch;
+ } else {
+ swing->yaw = arg1->yaw;
+ swing->pitch = arg1->pitch;
+ }
+ }
+ *eye = *sp30 = sp58.pos;
+ break;
+
+ case 3:
+ case 6:
+ sp30 = &swing->atEyeColChk.pos;
+ sp88 = OLib_Vec3fDist(at, sp30);
+ if (sp88 < 60.0f) {
+ sp50.yaw = Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, camera->speedRatio) + arg2->yaw;
+ if (*flags & 0x1000) {
+ sp50.pitch = arg2->pitch;
+ } else {
+ sp50.pitch = Math_CosS(swing->atEyeColChk.geoNorm.pitch) * 0x3FFC;
+ }
+ sp50.r = 60.0f - sp88;
+ OLib_AddVecGeoToVec3f(&sp58.pos, sp30, &sp50);
+ } else {
+ sp50.yaw = Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, camera->speedRatio) + arg2->yaw;
+ sp50.pitch = Camera_AngleDiffAndScale(arg1->pitch, arg2->pitch, camera->speedRatio) + arg2->pitch;
+ sp50.r = arg1->r;
+ OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50);
+ }
+ func_800CBC84(camera, at, &sp58, 0);
+ *eye = sp58.pos;
+ break;
+
+ default:
+ sp30 = &swing->atEyeColChk.pos;
+ *flags &= ~0x1000;
+ swing->swingUpdateRate = arg4;
+ *eye = *sp30;
+ break;
+ }
+}
+
+/*===============================================================*/
+/* Camera Update Functions (Chosen by Settings & Modes) */
+/*===============================================================*/
+
+s32 Camera_Noop(Camera* camera) {
+ return 1;
+}
+
+// SP, FLOATS - Many temps reused to get the stack pointer down, even though it doesn't seem logical
+// https://decomp.me/scratch/zVOSG
+#ifdef NON_EQUIVALENT
+s32 Camera_Normal1(Camera* camera) {
+ CameraModeValue* values;
+ f32 phi_f16_2;
+ Vec3f spD8; // D8-DC-E0
+ f32 spD4;
+ f32 spD0;
+ f32 spC8;
+ f32 spC4;
+ f32 spC0;
+ VecGeo spB4; // B4-B8-BA
+ VecGeo spAC; // AC-B0-B2
+ VecGeo spA4; // A4-A8-AA
+ VecGeo sp9C; // 9C-A0-A2
+ VecGeo sp74; // 74-78-7A
+ s16 sp72;
+ f32 sp6C;
+ VecGeo sp64; // 64-68-6A
+ CollisionPoly* sp60;
+ f32 sp88 = Camera_GetFocalActorHeight(camera);
+ s32 sp5C; // BgID
+ f32 sp58;
+ f32 phi_f2;
+ // Vec3f *sp48;
+ // Vec3f *sp44;
+
+ // f32 phi_f0;
+ f32 phi_f2_2;
+ f32 phi_f0_4;
+ s32 phi_v1_2;
+ Vec3f* sp4C = &camera->eye;
+ PosRot* sp40 = &camera->focalActorPosRot;
+ // f32 phi_f16_5;
+
+ s16 phi_a0;
+ s16 temp_a0_3; // May be fake
+ Vec3f* new_var3;
+
+ Normal1ReadOnlyData* roData = &camera->paramData.norm1.roData;
+ Normal1ReadWriteData* rwData = &camera->paramData.norm1.rwData;
+
+ // sp48 = &camera->at;
+ // sp4C;/
+ // sp44 = &camera->eyeNext;
+ // sp40;
+ // sp88;
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_04 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_08 = GET_NEXT_RO_DATA(values) * (sp88 * 0.01f * (0.8f - ((68.0f / sp88) * -0.2f)));
+ roData->unk_04 = roData->unk_08 - (roData->unk_08 - roData->unk_04);
+
+ if (RELOAD_PARAMS(camera)) {
+ roData->unk_20 = (s16)((GET_NEXT_RO_DATA(values) * 182.04167f) + .5f);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = 40.0f - (40.0f - roData->unk_0C);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_14 = 1.0f - (1.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ OLib_Vec3fDiffToVecGeo(&spA4, &camera->at, sp4C);
+ OLib_Vec3fDiffToVecGeo(&sp9C, &camera->at, &camera->eyeNext);
+
+ switch (camera->animState) {
+ case 20:
+ Camera_SetUpdateRatesFastYaw(camera);
+ // fallthrough?
+ case 0:
+ rwData->unk_0C = 1;
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) && (camera->animState != 20)) {
+ rwData->unk_0C |= 0x1000;
+ }
+ // fallthrough?
+ case 10:
+ if (camera->animState == 10) {
+ rwData->unk_0C = 0;
+ }
+ rwData->unk_08 = 0;
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ rwData->unk_0A = 0x514;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ rwData->unk_00 = camera->focalActorPosRot.pos.y;
+ rwData->unk_04 = camera->xzSpeed;
+ D_801EDC30[camera->camId].timer = 0;
+ sUpdateCameraDirection = false;
+ rwData->unk_10 = 120.0f;
+ break;
+ }
+
+ camera->animState = 1;
+ sUpdateCameraDirection = true;
+
+ if ((camera->speedRatio < 0.01f) || (rwData->unk_0A > 0x4B0)) {
+ if (rwData->unk_0A > -0x4B0) {
+ rwData->unk_0A--;
+ }
+ } else {
+ rwData->unk_0A = 0x4B0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_00 = camera->focalActorPosRot.pos.y;
+ }
+
+ if (rwData->unk_0C & 0x1000) {
+ spC8 = camera->speedRatio;
+ } else {
+ spC8 = ((camera->speedRatio * 3.0f) + 1.0f) * 0.25f;
+ }
+
+ spD8 = camera->focalActorAtOffset;
+ spD8.y -= sp88 + roData->unk_00;
+ spC4 = Camera_Vec3fMagnitude(&spD8);
+
+ if ((roData->unk_04 + roData->unk_08) < spC4) {
+ spC4 = 1.0f;
+ } else {
+ spC4 = spC4 / (roData->unk_04 + roData->unk_08);
+ }
+
+ // Everything above matches except stack pointers
+ // PERM_RANDOMIZE(
+
+ phi_f16_2 = 0.2f;
+
+ phi_f2 = (camera->xzSpeed - rwData->unk_04) * 0.2f;
+ phi_f0_4 = phi_f2;
+ if (phi_f2 < 0.0f) {
+ phi_f0_4 = 0.0f;
+ }
+
+ spC0 = OLib_ClampMaxDist(SQ(phi_f0_4), 1.0f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, (0.5f * spC8) + (0.5f * spC4), 0.0001f);
+
+ if (D_801EDC30[camera->camId].unk_64 == 1) {
+ phi_f2 = 0.5f;
+ } else {
+ phi_f2 = (0.5f * spC8) + (0.5f * spC4);
+ }
+
+ rwData->unk_04 = camera->xzSpeed;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + D_801EDC30[camera->camId].swingUpdateRate,
+ camera->yawUpdateRateInv, phi_f2, 0.1f);
+ if (roData->interfaceFlags & NORMAL1_FLAG_3) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(100.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + 16.0f,
+ camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ }
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(
+ D_801EDC30[camera->camId].swingUpdateRate - (D_801EDC30[camera->camId].swingUpdateRate * 0.7f * spC0),
+ camera->yawUpdateRateInv, phi_f2, 0.1f);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_3) && (camera->speedRatio > 0.01f)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(100.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else if (D_801ED920 != NULL) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(32.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ }
+ }
+
+ if (roData->interfaceFlags & NORMAL1_FLAG_0) {
+ //! FAKE
+ if (!spC8) {}
+ temp_a0_3 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, spA4.yaw + 0x8000, rwData->unk_0C & 1);
+ phi_f2 = (1.0f / roData->unk_10) * 0.7f;
+ phi_f16_2 = (1.0f / roData->unk_10) * 0.3f * (1.0f - camera->speedRatio);
+ spD0 = phi_f16_2;
+ rwData->unk_08 = Camera_ScaledStepToCeilS(temp_a0_3, rwData->unk_08, phi_f2 + phi_f16_2, 5);
+ } else {
+ rwData->unk_08 = 0;
+ }
+
+ if ((D_801EDC30[camera->camId].unk_64 == 1) && (roData->unk_00 > -40.0f)) {
+ phi_f0_4 = Math_SinS(D_801EDC30[camera->camId].pitch);
+ phi_f2 = roData->unk_00;
+ phi_f2 = phi_f2 * (1.0f - phi_f0_4); // TODO: phi_f2 should not be on the LHS and RHS
+ // phi_f2 = roData->unk_00 * (1.0f - phi_f0_4);
+ camera->yawUpdateRateInv = 80.0f;
+ camera->pitchUpdateRateInv = 80.0f;
+ phi_f2_2 = ((-40.0f) * phi_f0_4) + phi_f2;
+ phi_f16_2 = phi_f0_4;
+ } else {
+ phi_f2_2 = roData->unk_00;
+ }
+
+ if (roData->interfaceFlags & (NORMAL1_FLAG_6 | NORMAL1_FLAG_5)) {
+ if (camera->dist < roData->unk_04) {
+ phi_f16_2 = 0.0f;
+ } else if (roData->unk_08 < camera->dist) {
+ phi_f16_2 = 1.0f;
+ } else if (roData->unk_08 == roData->unk_04) {
+ phi_f16_2 = 1.0f;
+ } else {
+ // phi_f16_2 = camera->dist - roData->unk_04;
+ spD4 = (camera->dist - roData->unk_04) / (roData->unk_08 - roData->unk_04);
+ phi_f16_2 = spD4;
+ }
+
+ Camera_CalcAtForNormal1(camera, &sp9C, phi_f2_2, 25.0f * phi_f16_2 * camera->speedRatio);
+ rwData->unk_10 = 120.0f;
+ spD0 = phi_f16_2;
+ } else if ((roData->interfaceFlags & NORMAL1_FLAG_7) && (rwData->unk_0A < 0)) {
+ phi_f0_4 = rwData->unk_0A / -1200.0f; // May be used to swap $f registers
+ Camera_CalcAtForNormal1(
+ camera, &sp9C,
+ phi_f2_2 - ((phi_f2_2 - ((0.8f - ((68.0f / sp88) * -0.2f)) * sp88 * -0.45f)) * phi_f0_4 * 0.75f),
+ 10.0f * phi_f0_4);
+ rwData->unk_10 = 120.0f;
+ spD0 = phi_f16_2;
+ //! FAKE
+ if (0) {}
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_3) {
+ spD0 = phi_f16_2;
+ Camera_CalcAtForScreen(camera, &sp9C, roData->unk_00, &rwData->unk_00, rwData->unk_10);
+ if (rwData->unk_10 > 20.0f) {
+ rwData->unk_10 -= 0.2f;
+ }
+ } else {
+ spD0 = phi_f16_2;
+ Camera_CalcAtDefault(camera, &sp9C, phi_f2_2, roData->interfaceFlags & NORMAL1_FLAG_0);
+ rwData->unk_10 = 120.0f;
+ }
+
+ phi_f16_2 = spD0;
+ OLib_Vec3fDiffToVecGeo(&spB4, &camera->at, &camera->eyeNext);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_7) && (rwData->unk_0A < 0)) {
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ switch (((Player*)camera->focalActor)->transformation) {
+ case PLAYER_FORM_HUMAN:
+ phi_f16_2 = 66.0f;
+ break;
+
+ case PLAYER_FORM_DEKU:
+ phi_f16_2 = 66.0f;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ phi_f16_2 = 115.0f;
+ break;
+
+ case PLAYER_FORM_GORON:
+ phi_f16_2 = 115.0f;
+ break;
+
+ case PLAYER_FORM_FIERCE_DEITY:
+ phi_f16_2 = roData->unk_04;
+ break;
+
+ default:
+ phi_f16_2 = roData->unk_04;
+ break;
+ }
+ }
+ phi_f0_4 = Camera_ClampDist2(camera, spB4.r, phi_f16_2, phi_f16_2, 0);
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_7) {
+ phi_f0_4 = Camera_ClampDist2(camera, spB4.r, roData->unk_04, roData->unk_08, 1);
+ } else {
+ phi_f0_4 = Camera_ClampDist1(camera, spB4.r, roData->unk_04, roData->unk_08, rwData->unk_0A > 0);
+ }
+
+ camera->dist = spB4.r = phi_f0_4;
+
+ if (D_801EDC30[camera->camId].unk_64 != 0) {
+ //! FAKE
+ if (phi_v1_2) {}
+ spB4.pitch =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].pitch, sp9C.pitch, 1.0f / camera->yawUpdateRateInv, 5);
+ spB4.yaw =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].yaw, sp9C.yaw, 1.0f / camera->yawUpdateRateInv, 5);
+ } else {
+ if (roData->interfaceFlags & NORMAL1_FLAG_5) {
+ spB4.yaw = sp9C.yaw;
+ spB4.pitch = sp9C.pitch;
+ camera->animState = 20;
+ } else {
+ if (D_801ED920 != NULL) {
+ //! FAKE
+ if (sp40) {}
+ new_var3 = &D_801ED920->world.pos;
+ OLib_Vec3fDiffToVecGeo(&sp74, &sp40->pos, new_var3); // TODO: arg0 & arg1 swapped
+ sp72 = sp40->rot.y - sp74.yaw;
+ // Interface and shrink-window flags
+ if ((roData->interfaceFlags & 0xFF00) == 0xFF00) {
+ sp6C = 1.0f;
+ } else {
+ sp6C = 1.0f - (ABS(sp72) / 10922.0f);
+ }
+
+ if (ABS((s16)(sp9C.yaw - sp74.yaw)) < 0x4000) {
+ sp74.yaw += 0x8000;
+ }
+
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || !func_800CB924(camera)) {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, (s16)(sp40->rot.y - (s16)(sp72 * sp6C)),
+ roData->unk_14, spC0);
+ }
+
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || (camera->speedRatio < 0.01f)) {
+ spB4.pitch = Camera_CalcDefaultPitch(
+ camera, sp9C.pitch, roData->unk_20 + (s16)((roData->unk_20 - sp74.pitch) * sp6C * 0.75f),
+ rwData->unk_08);
+ }
+ dummy:; // TODO: Will this be needed?
+ } else if (roData->interfaceFlags & NORMAL1_FLAG_1) {
+ if ((camera->speedRatio > 0.1f) || (rwData->unk_0A > 0x4B0)) {
+ OLib_Vec3fToVecGeo(&sp64, &camera->unk_0F0);
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || !func_800CB924(camera)) {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, sp64.yaw, roData->unk_14, spC0);
+ }
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ } else if ((camera->unk_0F0.y > 0.0f) && func_800CB924(camera)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ }
+ } else {
+ spB4.yaw = sp9C.yaw;
+ spB4.pitch = sp9C.pitch;
+ dummy4:; // TODO: Will this be needed?
+ }
+ } else {
+ spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, sp40->rot.y, roData->unk_14, spC0);
+ if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || (camera->speedRatio < 0.1f)) {
+ spB4.pitch = Camera_CalcDefaultPitch(camera, sp9C.pitch, roData->unk_20, rwData->unk_08);
+ }
+ }
+ }
+ }
+
+ // 76.9 degrees
+ if (spB4.pitch > 0x36B0) {
+ spB4.pitch = 0x36B0;
+ }
+
+ // -76.9 degrees
+ if (spB4.pitch < -0x36B0) {
+ spB4.pitch = -0x36B0;
+ }
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, &camera->at, &spB4);
+ if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & NORMAL1_FLAG_4) && (spC4 <= 0.9f)) {
+
+ if (func_800CBA7C(camera) == 0) {
+ Camera_CalcDefaultSwing(camera, &spB4, &sp9C, roData->unk_04, roData->unk_0C, &D_801EDC30[camera->camId],
+ &rwData->unk_0C);
+ sp58 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &sp60, &sp5C, sp4C);
+ if ((roData->interfaceFlags & NORMAL1_FLAG_3) && func_800CB924(camera)) {
+ phi_f16_2 = 25.0f;
+ } else {
+ phi_f16_2 = 5.0f;
+ }
+ spD0 = sp4C->y; // TODO: another fake reuse of temp
+ phi_f0_4 = sp4C->y;
+ phi_f0_4 -= sp58;
+ // new_var2 = sp4C->y;
+ if ((sp58 != BGCHECK_Y_MIN) && (phi_f0_4 < phi_f16_2)) {
+ sp4C->y = sp58 + phi_f16_2;
+ } else if ((camera->waterYPos != camera->focalActorFloorHeight) && ((spD0 - camera->waterYPos) < 5.0f) &&
+ ((spD0 - camera->waterYPos) > -5.0f)) {
+ sp4C->y = camera->waterYPos + 5.0f;
+ }
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spAC, sp4C, &camera->at);
+ camera->inputDir.x = spAC.pitch;
+ camera->inputDir.y = spAC.yaw;
+ camera->inputDir.z = 0;
+ if (gSaveContext.save.saveInfo.playerData.health < 17) {
+ phi_v1_2 = (camera->play->state.frames << 0x18);
+ phi_v1_2 = (s16)((phi_v1_2 >> 0x15) & 0xFD68);
+ camera->inputDir.y += phi_v1_2;
+ }
+ } else {
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ D_801EDC30[camera->camId].unk_64 = 0;
+ sUpdateCameraDirection = false;
+ *sp4C = camera->eyeNext;
+ }
+
+ // Everything below OLib_Vec3fDiffToVecGeo matches except stack pointers
+ // )
+
+ phi_f2 = (gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18 * phi_f2, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ if (roData->interfaceFlags & NORMAL1_FLAG_2) {
+ spD4 = Math_SinS((s16)(spA4.yaw - spB4.yaw));
+ camera->roll = Camera_ScaledStepToCeilS(((Rand_ZeroOne() - 0.5f) * 500.0f * camera->speedRatio) +
+ (spD4 * spD4 * spD4 * 10000.0f),
+ camera->roll, 0.1f, 5);
+ } else {
+ if (gSaveContext.save.saveInfo.playerData.health <= 16) {
+ phi_a0 = (Rand_ZeroOne() - 0.5f) * 100.0f * camera->speedRatio;
+ } else {
+ phi_a0 = 0.0f;
+ }
+ camera->roll = Camera_ScaledStepToCeilS(phi_a0, camera->roll, 0.2f, 5);
+ }
+
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_1C);
+ rwData->unk_0C &= ~1;
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal2.s")
+/**
+ * Unused Camera RemoteBomb Setting
+ */
+s32 Camera_Normal2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal3.s")
+#define NORMAL3_RW_FLAG (1 << 0)
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal4.s")
+/**
+ * Riding Epona and Zora
+ */
+s32 Camera_Normal3(Camera* camera) {
+ Normal3ReadOnlyData* roData = &camera->paramData.norm3.roData;
+ Normal3ReadWriteData* rwData = &camera->paramData.norm3.rwData;
+ f32 sp8C;
+ f32 sp90;
+ f32 temp_f2; // multi-use temp
+ f32 sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ VecGeo sp70;
+ VecGeo sp68;
+ f32 phi_f2;
+ s16 sp62;
+ s16 phi_v1_2;
+ Player* player = (Player*)camera->focalActor;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Normal0.s")
+ temp_f2 = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel1.s")
+ if ((camera->setting == CAM_SET_HORSE) && (player->rideActor == NULL)) {
+ Camera_ChangeSettingFlags(camera, camera->prevSetting, CAM_CHANGE_SETTING_1);
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel2.s")
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel3.s")
+ temp_f2 = CAM_RODATA_UNSCALE(temp_f2);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel4.s")
+ roData->yOffset = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->distMin = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->distMax = GET_NEXT_RO_DATA(values) * temp_f2;
+ roData->pitchTarget = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->yawUpdateRateInv = GET_NEXT_RO_DATA(values);
+ roData->pitchUpdateRateInv = GET_NEXT_RO_DATA(values);
+ roData->fovTarget = GET_NEXT_RO_DATA(values);
+ roData->maxAtLERPScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Parallel0.s")
+ OLib_Vec3fDiffToVecGeo(&sp70, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sUpdateCameraDirection = true;
+ sCameraInterfaceFlags = roData->interfaceFlags;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump1.s")
+ //! FAKE: fake temp
+ phi_v1_2 = camera->animState;
+ if (!(((phi_v1_2 == 0) || (phi_v1_2 == 10)) || (phi_v1_2 == 20))) {
+ } else {
+ rwData->isZero = 0;
+ rwData->curPitch = 0;
+ rwData->yPosOffset = camera->focalActorFloorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump2.s")
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->yawUpdateRateInv;
+ rwData->yawUpdateRate = BINANG_SUB(BINANG_ROT180(camera->focalActorPosRot.rot.y), sp70.yaw) * (1.0f / 6.0f);
+ rwData->distTimer = 0;
+ rwData->is1200 = 1200;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump3.s")
+ if (roData->interfaceFlags & NORMAL3_FLAG_1) {
+ rwData->yawTimer = 6;
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ } else {
+ rwData->yawTimer = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump4.s")
+ camera->animState = 1;
+ D_801EDC30[camera->camId].timer = 0;
+ rwData->flag = NORMAL3_RW_FLAG;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Jump0.s")
+ if (rwData->distTimer != 0) {
+ rwData->distTimer--;
+ }
+ sp90 = ((camera->speedRatio * 3.0f) + 1.0f) * 0.25f * 0.5f;
+ sp8C = temp_f2 = camera->speedRatio * 0.2f;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(
+ (D_801EDC30[camera->camId].timer * 2) + roData->yawUpdateRateInv, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].timer * 2) + 16.0f,
+ camera->pitchUpdateRateInv, sp8C, 0.1f);
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF(roData->yawUpdateRateInv, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, sp8C, 0.1f);
+ }
+
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, sp90, 0.001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp8C, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, sp8C, 0.0001f);
+
+ phi_v1_2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, BINANG_ROT180(sp70.yaw), rwData->flag & NORMAL3_RW_FLAG);
+ temp_f2 = ((1.0f / roData->pitchUpdateRateInv) * 0.5f) * (1.0f - camera->speedRatio);
+ rwData->curPitch =
+ Camera_ScaledStepToCeilS(phi_v1_2, rwData->curPitch, ((1.0f / roData->pitchUpdateRateInv) * 0.5f) + temp_f2, 5);
+
+ if ((roData->interfaceFlags & NORMAL3_FLAG_6) || (player->rideActor == NULL)) {
+ Camera_CalcAtDefault(camera, &sp68, roData->yOffset, 1);
+ } else {
+ Camera_CalcAtForHorse(camera, &sp68, roData->yOffset, &rwData->yPosOffset, 1);
+ }
+
+ sp88 = (roData->distMax + roData->distMin) * 0.5f;
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext);
+ temp_f2 = Camera_ClampDist1(camera, sp80.r, roData->distMin, roData->distMax, rwData->distTimer);
+
+ phi_f2 = sp88 - temp_f2;
+ phi_f2 *= 0.002f;
+ camera->dist = sp80.r = temp_f2 + phi_f2;
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_7) {
+ sp80.pitch = Camera_ScaledStepToCeilS(camera->focalActor->focus.rot.x - rwData->curPitch, sp68.pitch, 0.25f, 5);
+ } else {
+ sp62 = roData->pitchTarget - rwData->curPitch;
+ sp80.pitch = Camera_ScaledStepToCeilS(sp62, sp68.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+
+ sp80.pitch = CLAMP_MAX(sp80.pitch, DEG_TO_BINANG(79.655f));
+
+ if (sp80.pitch < -DEG_TO_BINANG(29.995f)) {
+ sp80.pitch = -DEG_TO_BINANG(29.995f);
+ }
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_7) {
+ sp62 = BINANG_SUB(camera->focalActor->focus.rot.y, BINANG_ROT180(sp68.yaw));
+ temp_f2 = 1.0f;
+ } else {
+ sp62 = BINANG_SUB(focalActorPosRot->rot.y, BINANG_ROT180(sp68.yaw));
+ OLib_Vec3fToVecGeo(&sp78, &camera->unk_0F0);
+ phi_v1_2 = focalActorPosRot->rot.y - sp78.yaw;
+ if (phi_v1_2 < 0) {
+ phi_v1_2 *= -1;
+ }
+
+ if (phi_v1_2 < 0x555A) {
+ temp_f2 = 1.0f;
+ } else {
+ temp_f2 = ((f32)0x8000 - phi_v1_2) / (f32)0x2AA6;
+ }
+ }
+
+ sp90 = (sp62 * ((SQ(camera->speedRatio) * 0.8f) + 0.2f) * temp_f2) / camera->yawUpdateRateInv;
+ if ((Camera_fabsf(sp90) > 150.0f) && (camera->speedRatio > 0.05f)) {
+ sp80.yaw = sp68.yaw + sp90;
+ }
+
+ if (rwData->yawTimer > 0) {
+ sp80.yaw += rwData->yawUpdateRate;
+ rwData->yawTimer--;
+ if (rwData->yawTimer == 0) {
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp80);
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 0);
+ } else {
+ *eye = *eyeNext;
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->fovTarget, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ if (roData->interfaceFlags & NORMAL3_FLAG_5) {
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.05f, 5);
+ } else {
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+ }
+
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->maxAtLERPScale);
+ rwData->flag &= ~NORMAL3_RW_FLAG;
+
+ return 1;
+}
+
+/**
+ * Used for the unknown Naname setting.
+ * Identical to Normal1 except reads camera scene data to apply a camera roll
+ */
+s32 Camera_Normal4(Camera* camera) {
+ BgCamFuncData* bgCamFuncData;
+ s16 roll;
+
+ if (RELOAD_PARAMS(camera)) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ D_801EDBF0 = bgCamFuncData->rot.z;
+ }
+
+ roll = camera->roll;
+ Camera_Normal1(camera);
+ camera->roll = Camera_ScaledStepToCeilS(D_801EDBF0, roll, 0.05f, 5);
+
+ return 1;
+}
+
+s32 Camera_Normal0(Camera* camera) {
+ f32 phi_f0;
+ f32 yNormal;
+ s32 pad;
+ f32 playerHeight;
+ f32 spA4;
+ f32 spA0;
+ VecGeo sp98;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ s16 temp_v1_2;
+ s16 phi_a1;
+ s16 phi_a0;
+ BgCamFuncData* bgCamFuncData;
+ f32 new_var;
+ Normal0ReadOnlyData* roData = &camera->paramData.norm0.roData;
+ Normal0ReadWriteData* rwData = &camera->paramData.norm0.rwData;
+
+ playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ yNormal = 0.8f - ((68.0f / playerHeight) * -0.2f);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_08 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
+ roData->unk_1C = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos);
+ rwData->unk_20 = bgCamFuncData->rot.x;
+ rwData->unk_22 = bgCamFuncData->rot.y;
+ rwData->unk_24 = focalActorPosRot->pos.y;
+ if (bgCamFuncData->fov == -1) {
+ rwData->unk_1C = roData->unk_14;
+ } else {
+ if (bgCamFuncData->fov > 360) {
+ phi_f0 = CAM_RODATA_UNSCALE(bgCamFuncData->fov);
+ } else {
+ phi_f0 = bgCamFuncData->fov;
+ }
+ rwData->unk_1C = phi_f0;
+ }
+
+ if (bgCamFuncData->unk_0E == -1) {
+ rwData->unk_2C = 0;
+ } else {
+ rwData->unk_2C = bgCamFuncData->unk_0E;
+ }
+
+ rwData->unk_18 = 0.0f;
+ rwData->unk_28 = 120.0f;
+
+ if (roData->interfaceFlags & NORMAL0_FLAG_2) {
+ sp88.pitch = rwData->unk_20;
+ sp88.yaw = rwData->unk_22;
+ sp88.r = 100.0f;
+ OLib_VecGeoToVec3f(&rwData->unk_0C, &sp88);
+ }
+ camera->animState = 1;
+ camera->yawUpdateRateInv = 50.0f;
+ } else {
+ if (func_800CB950(camera)) {
+ rwData->unk_24 = focalActorPosRot->pos.y;
+ }
+ //! FAKE:
+ if (1) {}
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext);
+
+ camera->speedRatio *= 0.50f;
+ spA4 = camera->speedRatio * 0.5f;
+ spA0 = camera->speedRatio * 0.2f;
+
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio, 0.5f, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(16.0f, camera->pitchUpdateRateInv, spA0, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spA4, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, spA0, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (!(roData->interfaceFlags & NORMAL0_FLAG_7)) {
+ Camera_CalcAtDefault(camera, &sp78, roData->unk_00, roData->interfaceFlags & NORMAL0_FLAG_0);
+ rwData->unk_28 = 120.0f;
+ } else {
+ Camera_CalcAtForScreen(camera, &sp78, roData->unk_00, &rwData->unk_24, rwData->unk_28);
+ if (rwData->unk_28 > 20.0f) {
+ rwData->unk_28 -= 0.2f;
+ }
+ }
+
+ if (roData->interfaceFlags & NORMAL0_FLAG_2) {
+ rwData->unk_00.x = focalActorPosRot->pos.x + rwData->unk_0C.x;
+ rwData->unk_00.z = focalActorPosRot->pos.z + rwData->unk_0C.z;
+ }
+
+ rwData->unk_00.y = focalActorPosRot->pos.y;
+ OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_00, at);
+ OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext);
+
+ if (rwData->unk_2C & 2) {
+ phi_a1 = rwData->unk_22;
+ } else {
+ phi_a1 = roData->unk_1C;
+ }
+
+ temp_v1_2 = sp90.yaw - sp88.yaw;
+ if (((phi_a1 <= 0x4000) && (phi_a1 < ABS(temp_v1_2))) || ((phi_a1 > 0x4000) && (ABS(temp_v1_2) < phi_a1))) {
+ //! FAKE: Needed to swap v0/v1
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ if (1) {}
+
+ //! FAKE: Needed because the *1.0f isn't being multiplied
+ new_var = 1.0f;
+
+ if (temp_v1_2 < 0) {
+ phi_a0 = -phi_a1;
+ } else {
+ phi_a0 = phi_a1;
+ }
+
+ phi_a0 += sp88.yaw;
+ sp98.yaw = Camera_ScaledStepToCeilS(phi_a0, sp80.yaw,
+ (1.0f / camera->yawUpdateRateInv) * new_var * camera->speedRatio, 5);
+ if (rwData->unk_2C & 1) {
+ sp98.pitch = Camera_CalcDefaultPitch(camera, sp78.pitch, rwData->unk_20, 0);
+ } else {
+ sp98.pitch = sp80.pitch;
+ }
+ } else {
+ sp98 = sp90;
+ }
+
+ camera->dist = sp98.r = Camera_ClampDist1(camera, sp90.r, roData->unk_04, roData->unk_08, 0);
+ if (!(rwData->unk_2C & 1)) {
+ if (sp98.pitch > 0xE38) { // 20 degrees
+ sp98.pitch += ((s16)(0xE38 - sp98.pitch) >> 2);
+ }
+ if (sp98.pitch < 0) {
+ sp98.pitch += ((s16)(-0x38E - sp98.pitch) >> 2);
+ }
+ }
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp98);
+
+ *eye = *eyeNext;
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & NORMAL0_FLAG_4)) {
+ Camera_BgCheck(camera, at, eye);
+ } else {
+ func_800CBFA4(camera, at, eye, 3);
+ OLib_Vec3fDiffToVecGeo(&sp98, eye, at);
+ camera->inputDir.x = sp98.pitch;
+ camera->inputDir.y = sp98.yaw;
+ camera->inputDir.z = 0;
+ }
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_1C, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_18);
+
+ return 1;
+}
+
+/**
+ * Used for targeting
+ */
+s32 Camera_Parallel1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spB0;
+ Vec3f spA4;
+ f32 spA0;
+ f32 sp9C;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ VecGeo sp78;
+ BgCamFuncData* bgCamFuncData;
+ s16 sp72;
+ s16 tangle;
+ Parallel1ReadOnlyData* roData = &camera->paramData.para1.roData;
+ Parallel1ReadWriteData* rwData = &camera->paramData.para1.rwData;
+ s32 parallelFlagCond;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ s16 new_var2;
+ s16 phi_a0;
+ s32 phi_a0_2;
+ CameraModeValue* values;
+ f32 yNormal;
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_08 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_20 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_22 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_RO_DATA(values);
+ rwData->unk_00 = roData->unk_04;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext);
+ Camera_GetFocalActorPos(&spA4, camera);
+
+ switch (camera->animState) {
+ case 20:
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) == 0) {
+ Camera_SetUpdateRatesFastYaw(camera);
+ }
+ // fallthrough
+ case 0:
+ case 10:
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ rwData->unk_10 = focalActorPosRot->pos;
+ } else {
+ camera->xzOffsetUpdateRate = 0.5f;
+ camera->yOffsetUpdateRate = 0.5f;
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ PARALLEL1_FLAG_3) {
+ rwData->unk_10 = camera->focalActorPosRot.pos;
+ }
+
+ rwData->timer1 = 200.0f;
+
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ sp78.r = camera->dist;
+ sp80.r = sp78.r;
+ OLib_AddVecGeoToVec3f(eye, at, &sp80);
+ *eyeNext = *eye;
+ }
+
+ rwData->unk_1C = 0;
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_2) {
+ rwData->timer2 = 20;
+ } else {
+ rwData->timer2 = 6;
+ }
+
+ if ((camera->focalActor == &GET_PLAYER(camera->play)->actor) && (camera->mode == CAM_MODE_CHARGE)) {
+ rwData->timer2 = 30;
+ if (((Player*)camera->focalActor)->transformation == PLAYER_FORM_DEKU) {
+ roData->unk_24 = -1;
+ }
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_1)) {
+ rwData->timer2 = 1;
+ yNormal = 0.8f - ((68.0f / focalActorHeight) * -0.2f);
+
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+
+ rwData->unk_20 = bgCamFuncData->rot.x;
+ rwData->unk_1E = bgCamFuncData->rot.y;
+ rwData->unk_08 = (bgCamFuncData->fov == -1) ? roData->unk_14
+ : (bgCamFuncData->fov > 360) ? CAM_RODATA_UNSCALE(bgCamFuncData->fov)
+ : bgCamFuncData->fov;
+ rwData->unk_00 = (bgCamFuncData->unk_0E == -1)
+ ? roData->unk_04
+ : CAM_RODATA_UNSCALE(bgCamFuncData->unk_0E) * focalActorHeight * yNormal;
+ //! FAKE
+ dummy:;
+ } else {
+ rwData->unk_08 = roData->unk_14;
+ rwData->unk_00 = roData->unk_04;
+ }
+
+ rwData->timer3 = roData->unk_24;
+ rwData->unk_04 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+ rwData->unk_26 = 1;
+ camera->animState = 1;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ break;
+ }
+
+ if (rwData->timer2 != 0) {
+ switch (roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ case PARALLEL1_FLAG_1:
+ case (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1):
+ rwData->unk_1E = BINANG_ROT180(camera->focalActorPosRot.rot.y) + roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case PARALLEL1_FLAG_2:
+ rwData->unk_1E = roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1):
+ if (rwData->timer3 == 1) {
+ OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_10, &spA4);
+ rwData->unk_1E = ((ABS(BINANG_SUB(sp88.yaw, sp80.yaw)) < 0x3A98) || Camera_IsClimbingLedge(camera))
+ ? sp80.yaw
+ : sp80.yaw + (s16)((BINANG_SUB(sp88.yaw, sp80.yaw) >> 2) * 3);
+ }
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case PARALLEL1_FLAG_3:
+ rwData->unk_1E = sp80.yaw;
+ rwData->unk_20 = roData->unk_20;
+ break;
+
+ case (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_1):
+ break;
+
+ default:
+ rwData->unk_1E = sp78.yaw + roData->unk_22;
+ rwData->unk_20 = roData->unk_20;
+ break;
+ }
+ } else if (roData->interfaceFlags & PARALLEL1_FLAG_5) {
+ rwData->unk_1E = BINANG_ROT180(camera->focalActorPosRot.rot.y) + roData->unk_22;
+ }
+
+ if (camera->animState == 21) {
+ camera->animState = 1;
+ } else if (camera->animState == 11) {
+ camera->animState = 1;
+ }
+
+ spA0 = camera->speedRatio * 0.5f;
+ sp9C = camera->speedRatio * 0.2f;
+
+ if (((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) == PARALLEL1_FLAG_3) ||
+ (roData->interfaceFlags & PARALLEL1_FLAG_5)) {
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.5f, 0.1f);
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv, 0.5f, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ } else {
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, spA0, 0.1f);
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_0C, camera->yawUpdateRateInv, spA0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(2.0f, camera->pitchUpdateRateInv, sp9C, 0.1f);
+ }
+
+ if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.1f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.1f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ } else if (roData->interfaceFlags & PARALLEL1_FLAG_7) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.5f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.5f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ } else {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spA0, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp9C, 0.0001f);
+ }
+
+ // TODO: Extra trailing 0 in 0.050f needed?
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_0) {
+ tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, BINANG_ROT180(sp80.yaw), rwData->unk_26 = 1);
+ spA0 = ((1.0f / roData->unk_10));
+ spA0 *= 0.6f;
+ sp9C = ((1.0f / roData->unk_10) * 0.4f) * (1.0f - camera->speedRatio);
+ rwData->unk_1C = Camera_ScaledStepToCeilS(tangle, rwData->unk_1C, spA0 + sp9C, 5);
+ } else {
+ rwData->unk_1C = 0;
+ }
+
+ if (func_800CB950(camera) || (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_1000) ||
+ (((Player*)camera->focalActor)->stateFlags3 & PLAYER_STATE3_100)) {
+ rwData->unk_04 = camera->focalActorPosRot.pos.y;
+ sp72 = false;
+ } else {
+ sp72 = true;
+ }
+
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1))) {
+ spB0 = spA4;
+ spB0.y += ((focalActorHeight * 0.6f) + roData->unk_00);
+ Camera_ScaledStepToCeilVec3f(&spB0, at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate, 0.0001f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else if ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ spB0 = focalActorPosRot->pos;
+ spB0.y += focalActorHeight + roData->unk_00;
+ Camera_ScaledStepToCeilVec3f(&spB0, at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate, 0.0001f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else if (rwData->timer2 != 0) {
+ Camera_CalcAtDefault(camera, &sp78, roData->unk_00, 0);
+ rwData->timer1 = 200.0f;
+ } else if (!(roData->interfaceFlags & PARALLEL1_FLAG_7) && !sp72) {
+ Camera_CalcAtForParallel(camera, &sp78, roData->unk_00, roData->unk_08, &rwData->unk_04,
+ roData->interfaceFlags & (PARALLEL1_FLAG_6 | PARALLEL1_FLAG_0));
+ rwData->timer1 = 200.0f;
+ } else {
+ Camera_CalcAtForScreen(camera, &sp78, roData->unk_00, &rwData->unk_04, rwData->timer1);
+ if (rwData->timer1 > 10.0f) {
+ rwData->timer1--;
+ }
+ }
+
+ camera->dist = Camera_ScaledStepToCeilF(rwData->unk_00, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+
+ if (rwData->timer2 != 0) {
+ if (rwData->timer3 <= 0) {
+ if (rwData->timer3 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+
+ tangle = ((rwData->timer2 + 1) * rwData->timer2) >> 1;
+ sp90.yaw = sp80.yaw + ((BINANG_SUB(rwData->unk_1E, sp80.yaw) / tangle) * rwData->timer2);
+ phi_a0 = ((roData->interfaceFlags & PARALLEL1_FLAG_0) ? BINANG_SUB(rwData->unk_20, rwData->unk_1C)
+ : rwData->unk_20);
+ new_var2 = BINANG_SUB(phi_a0, sp80.pitch);
+ sp90.pitch = sp80.pitch + ((new_var2 / tangle) * rwData->timer2);
+ sp90.r = camera->dist;
+ rwData->timer2--;
+ } else {
+ sp90 = sp80;
+ sp90.r = camera->dist;
+ }
+ } else {
+ OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext);
+ sp90.r = camera->dist;
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_1) {
+ sp90.yaw = Camera_ScaledStepToCeilS(rwData->unk_1E, sp78.yaw, 1.0f / camera->yawUpdateRateInv, 0xC8);
+ }
+
+ parallelFlagCond = (roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1));
+
+ if (roData->interfaceFlags & PARALLEL1_FLAG_0) {
+ phi_a0 = (rwData->unk_20 - rwData->unk_1C);
+ } else {
+ phi_a0 = rwData->unk_20;
+ }
+
+ if (parallelFlagCond == (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) {
+ spA0 = CLAMP_MAX(camera->speedRatio, 1.0f);
+ phi_a0 = (sp90.pitch * spA0) + (phi_a0 * (1.0f - spA0));
+ sp90.pitch = Camera_ScaledStepToCeilS(phi_a0, sp78.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ } else if (parallelFlagCond != PARALLEL1_FLAG_3) {
+ sp90.pitch = Camera_ScaledStepToCeilS(phi_a0, sp78.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+
+ if (sp90.pitch > DEG_TO_BINANG(79.655f)) {
+ sp90.pitch = DEG_TO_BINANG(79.655f);
+ }
+
+ if (sp90.pitch < -DEG_TO_BINANG(29.995f)) {
+ sp90.pitch = -DEG_TO_BINANG(29.995f);
+ }
+ }
+
+ if (rwData->timer3 > 0) {
+ rwData->timer3--;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp90);
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & PARALLEL1_FLAG_4)) {
+ spB0 = *at;
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4) ||
+ ((roData->interfaceFlags & (PARALLEL1_FLAG_3 | PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1)) ==
+ (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1))) {
+ spB0.y += focalActorHeight;
+ }
+ *eye = *eyeNext;
+ func_800CBFA4(camera, &spB0, eye, 0);
+ } else {
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 3);
+ }
+
+ if (rwData->timer2 != 0) {
+ sUpdateCameraDirection = true;
+ } else {
+ sUpdateCameraDirection = false;
+ }
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_08, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp72 ? roData->unk_1C : roData->unk_18);
+ rwData->unk_26 &= ~1;
+
+ return 1;
+}
+
+/**
+ * Unused Camera Maze Setting
+ */
+s32 Camera_Parallel2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Parallel0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Jump1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Camera for climbing structures
+ */
+s32 Camera_Jump2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spC8;
+ Vec3f spBC;
+ VecGeo spB4;
+ VecGeo spAC;
+ VecGeo spA4;
+ VecGeo sp9C;
+ s16 temp_t2;
+ s16 yawDiff;
+ s32 pad;
+ f32 sp90;
+ f32 sp8C;
+ s32 sp88;
+ CameraCollision sp60;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Jump2ReadOnlyData* roData = &camera->paramData.jump2.roData;
+ Jump2ReadWriteData* rwData = &camera->paramData.jump2.rwData;
+ f32 phi_f2;
+ f32 yNormal; // used twice
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ f32 temp_f16;
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ yNormal = 0.8f - (-0.2f * (68.0f / focalActorHeight));
+
+ if (camera->unk_0F0.y > 0.0f) {
+ phi_f2 = -10.0f;
+ } else {
+ phi_f2 = 10.0f;
+ }
+
+ roData->unk_00 = CAM_RODATA_UNSCALE(phi_f2 + GET_NEXT_RO_DATA(values)) * focalActorHeight * yNormal;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->unk_08 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->unk_0C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp9C, at, eye);
+ OLib_Vec3fDiffToVecGeo(&spA4, at, eyeNext);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ spC8 = focalActorPosRot->pos;
+ rwData->unk_00 = Camera_GetFloorY(camera, &spC8);
+ rwData->unk_04 = spA4.yaw;
+ rwData->unk_06 = 0;
+
+ if (rwData->unk_00 == BGCHECK_Y_MIN) {
+ rwData->unk_0A = -1;
+ rwData->unk_00 = focalActorPosRot->pos.y - 1000.0f;
+ } else if ((focalActorPosRot->pos.y - rwData->unk_00) < focalActorHeight) {
+ rwData->unk_0A = 1;
+ } else {
+ rwData->unk_0A = -1;
+ }
+
+ yawDiff = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spA4.yaw);
+ rwData->unk_06 = ((yawDiff / 6) / 4) * 3;
+
+ if (roData->interfaceFlags & JUMP2_FLAG_1) {
+ rwData->unk_08 = 10;
+ } else {
+ rwData->unk_08 = 10000;
+ }
+
+ focalActorPosRot->pos.x -= camera->unk_0F0.x;
+ focalActorPosRot->pos.y -= camera->unk_0F0.y;
+ focalActorPosRot->pos.z -= camera->unk_0F0.z;
+
+ rwData->timer = 6;
+ camera->animState++;
+ camera->atLerpStepScale = roData->unk_1C;
+ }
+
+ sp90 = camera->speedRatio * 0.5f;
+ sp8C = camera->speedRatio * 0.2f;
+
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(roData->unk_10, camera->yawUpdateRateInv, sp90, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(roData->unk_14, camera->yOffsetUpdateRate, sp90, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, sp8C, 0.0001f);
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->fovUpdateRate, camera->speedRatio * .05f, 0.0001f);
+ camera->rUpdateRateInv = 1800.0f;
+
+ Camera_CalcAtDefault(camera, &spA4, roData->unk_00, 0);
+ OLib_Vec3fDiffToVecGeo(&spB4, at, eye);
+
+ //! FAKE: Unused
+ yNormal = roData->unk_04;
+
+ phi_f2 = roData->unk_08 + (roData->unk_08 * roData->unk_0C);
+ temp_f16 = roData->unk_04 - (roData->unk_04 * roData->unk_0C);
+
+ if (spB4.r > phi_f2) {
+ spB4.r = phi_f2;
+ } else if (spB4.r < temp_f16) {
+ spB4.r = temp_f16;
+ }
+
+ yawDiff = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spB4.yaw);
+ if (rwData->timer != 0) {
+ rwData->unk_04 = BINANG_ROT180(focalActorPosRot->rot.y);
+ rwData->timer--;
+ spB4.yaw = Camera_ScaledStepToCeilS(rwData->unk_04, spA4.yaw, 0.5f, 5);
+ } else if (rwData->unk_08 < ABS(yawDiff)) {
+ temp_t2 = BINANG_ROT180(focalActorPosRot->rot.y);
+ spB4.yaw = Camera_ScaledStepToFloorS((yawDiff < 0) ? (temp_t2 + rwData->unk_08) : (temp_t2 - rwData->unk_08),
+ spA4.yaw, 0.1f, 1);
+ } else {
+ spB4.yaw = Camera_ScaledStepToCeilS(spB4.yaw, spA4.yaw, 0.25f, 5);
+ }
+
+ spC8.x = focalActorPosRot->pos.x + (Math_SinS(focalActorPosRot->rot.y) * 25.0f);
+ spC8.y = focalActorPosRot->pos.y + (focalActorHeight * 2.2f);
+ spC8.z = focalActorPosRot->pos.z + (Math_CosS(focalActorPosRot->rot.y) * 25.0f);
+
+ yNormal = Camera_GetFloorYNorm(camera, &spBC, &spC8, &sp88);
+ if (camera->focalActor->bgCheckFlags & 0x10) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ spB4.pitch = Camera_ScaledStepToCeilS(-DEG_TO_BINANG(27.47f), spA4.pitch, 0.2f, 5);
+ } else if ((yNormal != BGCHECK_Y_MIN) && (focalActorPosRot->pos.y < yNormal)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ if (camera->unk_0F0.y > 1.0f) {
+ spB4.pitch = Camera_ScaledStepToCeilS(0x1F4, spA4.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+ } else if ((focalActorPosRot->pos.y - rwData->unk_00) < focalActorHeight) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->pitchUpdateRateInv, 0.2f, 0.1f);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(20.0f, camera->rUpdateRateInv, 0.2f, 0.1f);
+ if (camera->unk_0F0.y > 1.0f) {
+ spB4.pitch = Camera_ScaledStepToCeilS(0x1F4, spA4.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ }
+ } else {
+ camera->pitchUpdateRateInv = 100.0f;
+ camera->rUpdateRateInv = 100.0f;
+ }
+
+ spB4.pitch = CLAMP_MAX(spB4.pitch, DEG_TO_BINANG(60.43f));
+ spB4.pitch = CLAMP_MIN(spB4.pitch, -DEG_TO_BINANG(60.43f));
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB4);
+ sp60.pos = *eyeNext;
+
+ if (func_800CBC84(camera, at, &sp60, 0) != 0) {
+ spC8 = sp60.pos;
+ spAC.pitch = 0;
+ spAC.r = spB4.r;
+ spAC.yaw = spB4.yaw;
+ OLib_AddVecGeoToVec3f(&sp60.pos, at, &spAC);
+ if (func_800CBC84(camera, at, &sp60, 0) != 0) {
+ *eye = spC8;
+ } else {
+ spB4.pitch = Camera_ScaledStepToCeilS(0, spB4.pitch, 0.2f, 5);
+ OLib_AddVecGeoToVec3f(eye, at, &spB4);
+ func_800CBFA4(camera, at, eye, 0);
+ }
+ } else {
+ *eye = *eyeNext;
+ }
+
+ camera->dist = spB4.r;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+
+ return true;
+}
+
+/**
+ * Used for water-based camera settings
+ * e.g. Gyorg, Pinnacle Rock, whirlpool, water
+ */
+s32 Camera_Jump3(Camera* camera) {
+ Vec3f* sp48 = &camera->eye;
+ Vec3f* sp44 = &camera->at;
+ Vec3f* sp40 = &camera->eyeNext;
+ f32 spD0;
+ f32 spCC;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 phi_f0;
+ f32 spC0;
+ Vec3f spB4;
+ VecGeo spAC;
+ CameraModeValue* values;
+ f32 phi_f14;
+ VecGeo sp9C;
+ VecGeo sp94;
+ f32 phi_f2_2;
+ f32 temp_f0;
+ f32 temp1;
+ f32 pad;
+ Jump3ReadOnlyData* roData = &camera->paramData.jump3.roData;
+ Jump3ReadWriteData* rwData = &camera->paramData.jump3.rwData;
+ f32 focalActorHeight;
+ PosRot focalActorFocus;
+ f32 sp60;
+ f32 sp5C;
+ s32 sp58;
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ sp60 = camera->waterYPos - sp48->y;
+
+ sp58 = false;
+
+ if (RELOAD_PARAMS(camera)) {
+ rwData->unk_0A = camera->mode;
+ rwData->timer2 = 0;
+ }
+
+ if (camera->mode == CAM_MODE_NORMAL) {
+ if ((camera->focalActor->bgCheckFlags & 0x10) || (rwData->timer2 != 0)) {
+ if (rwData->unk_0A != 0xF) {
+ rwData->unk_0A = 0xF;
+ sp58 = true;
+ rwData->timer2 = 10;
+ }
+ } else if (sp60 < 50.0f) {
+ if (rwData->unk_0A != 0) {
+ rwData->unk_0A = 0;
+ sp58 = true;
+ }
+ } else if (Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) {
+ if (rwData->unk_0A != 5) {
+ rwData->unk_0A = 5;
+ sp58 = true;
+ }
+ } else if ((sp60 > 250.0f) && (rwData->unk_0A != 0x1A)) {
+ rwData->unk_0A = 0x1A;
+ sp58 = true;
+ }
+ }
+
+ if (rwData->timer2 != 0) {
+ rwData->timer2--;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp9C, sp44, sp48);
+ OLib_Vec3fDiffToVecGeo(&sp94, sp44, sp40);
+
+ if (!RELOAD_PARAMS(camera) && !sp58) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[rwData->unk_0A].values;
+
+ sp5C = 0.8f - (-0.2f * (68.0f / focalActorHeight));
+ spD0 = focalActorHeight * 0.01f * sp5C;
+
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_04 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_08 = GET_NEXT_RO_DATA(values) * spD0;
+ roData->unk_20 = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ rwData->unk_10 = 0x1000;
+ // fallthrough
+ case 10:
+ case 20:
+ rwData->unk_00 = camera->focalActorFloorHeight;
+ D_801EDC30[camera->camId].yaw = D_801EDC30[camera->camId].pitch = D_801EDC30[camera->camId].unk_64 = 0;
+ rwData->timer1 = 10;
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ camera->animState++;
+ D_801EDC30[camera->camId].timer = 0;
+ break;
+
+ default:
+ if (rwData->timer1 != 0) {
+ rwData->timer1--;
+ }
+ break;
+ }
+
+ spC0 = focalActorFocus.pos.y - focalActorPosRot->pos.y;
+ spB4 = *sp48;
+
+ spD0 = camera->speedRatio * 0.5f;
+ spCC = camera->speedRatio * 0.2f;
+
+ temp_f0 = (D_801EDC30[camera->camId].unk_64 == 1) ? 0.5f : spD0;
+
+ if (D_801EDC30[camera->camId].timer != 0) {
+ camera->yawUpdateRateInv =
+ Camera_ScaledStepToCeilF((D_801EDC30[camera->camId].swingUpdateRate + D_801EDC30[camera->camId].timer * 2),
+ camera->yawUpdateRateInv, spD0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF((40.0f + D_801EDC30[camera->camId].timer * 2),
+ camera->pitchUpdateRateInv, spCC, 0.1f);
+ D_801EDC30[camera->camId].timer--;
+ } else {
+ camera->yawUpdateRateInv = Camera_ScaledStepToCeilF(D_801EDC30[camera->camId].swingUpdateRate,
+ camera->yawUpdateRateInv, temp_f0, 0.1f);
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(40.0f, camera->pitchUpdateRateInv, spCC, 0.1f);
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_7) {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.01f, camera->yOffsetUpdateRate, spD0, 0.0001f);
+ sp5C = sqrtf((camera->unk_0F0.x * camera->unk_0F0.x) + (camera->unk_0F0.z * camera->unk_0F0.z)) /
+ Camera_GetRunSpeedLimit(camera);
+ camera->speedRatio = OLib_ClampMaxDist(sp5C / Camera_GetRunSpeedLimit(camera), 1.8f);
+ spCC = camera->speedRatio * 0.2f;
+ } else {
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->yOffsetUpdateRate, spD0, 0.0001f);
+ }
+
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.05f, camera->xzOffsetUpdateRate, spCC, 0.0001f);
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (sp60 < 50.0f) {
+ sp5C = camera->waterYPos - spC0;
+
+ Camera_CalcAtForScreen(camera, &sp94, roData->unk_00, &sp5C,
+ ((sp60 < 0.0f) ? 1.0f : 1.0f - (sp60 / 50.0f)) * 50.0f);
+ } else {
+ Camera_CalcAtDefault(camera, &sp94, roData->unk_00, roData->interfaceFlags);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spAC, sp44, sp40);
+ spAC.r = Camera_ClampDist1(camera, spAC.r, roData->unk_04, roData->unk_08, rwData->timer1);
+ camera->dist = spAC.r;
+
+ if (!(Camera_fabsf(focalActorPosRot->pos.y - camera->focalActorFloorHeight) < 10.0f) &&
+ !(Camera_fabsf(focalActorFocus.pos.y - camera->waterYPos) < 50.f)) {
+ camera->pitchUpdateRateInv = 100.0f;
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_5) {
+ spD0 = CLAMP_MAX(camera->speedRatio * 1.3f, 0.6f);
+
+ //! FAKE: spCC =
+ spAC.pitch = Camera_ScaledStepToCeilS(
+ (spAC.pitch * spD0) + (roData->unk_20 * (1.0f - spD0)), sp94.pitch,
+ 1.0f / (spCC = ((camera->pitchUpdateRateInv + 1.0f) - (camera->pitchUpdateRateInv * spD0))), 5);
+ } else if (D_801EDC30[camera->camId].unk_64 == 1) {
+ spAC.yaw =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].yaw, sp94.yaw, 1.0f / camera->yawUpdateRateInv, 5);
+
+ // Bug? Should be pitchUpdateRateInv
+ spAC.pitch =
+ Camera_ScaledStepToCeilS(D_801EDC30[camera->camId].pitch, sp94.pitch, 1.0f / camera->yawUpdateRateInv, 5);
+ } else if (roData->interfaceFlags & (JUMP3_FLAG_7 | JUMP3_FLAG_3)) {
+ spAC.yaw = Camera_CalcDefaultYaw(camera, sp94.yaw, focalActorPosRot->rot.y, roData->unk_14, 0.0f);
+
+ spD0 = CLAMP_MAX(camera->speedRatio * 1.3f, 1.0f);
+
+ //! FAKE: spCC =
+ spAC.pitch = Camera_ScaledStepToCeilS(
+ (spAC.pitch * spD0) + (roData->unk_20 * (1.0f - spD0)), sp94.pitch,
+ 1.0f / (spCC = (camera->pitchUpdateRateInv + 1.0f) - (camera->pitchUpdateRateInv * spD0)), 5);
+ } else {
+ spAC.yaw = Camera_CalcDefaultYaw(camera, sp94.yaw, focalActorPosRot->rot.y, roData->unk_14, 0.0f);
+ spAC.pitch = Camera_CalcDefaultPitch(camera, sp94.pitch, roData->unk_20, 0);
+ }
+
+ if (spAC.pitch > DEG_TO_BINANG(79.655f)) {
+ spAC.pitch = DEG_TO_BINANG(79.655f);
+ }
+
+ if (spAC.pitch < -DEG_TO_BINANG(29.995f)) {
+ spAC.pitch = -DEG_TO_BINANG(29.995f);
+ }
+
+ OLib_AddVecGeoToVec3f(sp40, sp44, &spAC);
+
+ if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & JUMP3_FLAG_6)) {
+ if (func_800CBA7C(camera) == 0) {
+ Camera_CalcDefaultSwing(camera, &spAC, &sp9C, roData->unk_04, roData->unk_0C, &D_801EDC30[camera->camId],
+ &rwData->unk_10);
+ }
+
+ if (roData->interfaceFlags & JUMP3_FLAG_2) {
+ camera->inputDir.x = -sp9C.pitch;
+ camera->inputDir.y = sp9C.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ } else {
+ OLib_Vec3fDiffToVecGeo(&spAC, sp48, sp44);
+ camera->inputDir.x = spAC.pitch;
+ camera->inputDir.y = spAC.yaw;
+ camera->inputDir.z = 0;
+ }
+ } else {
+ D_801EDC30[camera->camId].swingUpdateRate = roData->unk_0C;
+ D_801EDC30[camera->camId].unk_64 = 0;
+ sUpdateCameraDirection = false;
+ *sp48 = *sp40;
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, .5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_1C);
+
+ return 1;
+}
+
+s32 Camera_Jump4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Jump0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+#ifdef NON_EQUIVALENT
+s32 Camera_Battle1(Camera* camera) {
+ Battle1ReadOnlyData* roData = &camera->paramData.batt1.roData;
+ Battle1ReadWriteData* rwData = &camera->paramData.batt1.rwData;
+ Vec3f sp120;
+ Vec3f sp114;
+ f32 sp104;
+ f32 spFC;
+ f32 spF8;
+ f32 spF8_2;
+ f32 spF4;
+ s32 spF0; // bool
+ f32 spEC;
+ Vec3f spC4;
+ VecGeo spBC;
+ VecGeo spB4;
+ VecGeo spAC;
+ VecGeo spA4;
+ VecGeo sp9C;
+ VecGeo sp94;
+ PosRot* sp8C;
+ s16 sp8A;
+ s16 sp88;
+ s16 sp86;
+ s16 sp84;
+ f32 sp80;
+ f32 sp7C;
+ f32 sp78;
+ f32 sp68;
+ s16 sp5E;
+ s16 sp5C;
+ Vec3f* sp50;
+ Vec3f* sp4C;
+ Vec3f* sp48;
+ PosRot* sp40;
+
+ f32 temp_f12;
+ f32 temp_f14;
+ f32 temp_f2_3;
+ s16 temp_v0_5;
+ s16 temp_v0_6;
+ s32 temp_f4;
+ f32 phi_f0_3;
+ f32 phi_f12;
+
+ f32 new_var;
+ f32 new_var2;
+ f32 new_var3;
+ f32 new_var5;
+ f32 new_var4;
+
+ sp50 = &camera->eye;
+ sp4C = &camera->at;
+ sp48 = &camera->eyeNext;
+ sp40 = &camera->targetPosRot;
+
+ spF0 = false;
+ sp8C = &camera->focalActor->focus;
+ sp68 = Camera_GetFocalActorHeight(camera);
+
+ if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_RO_DATA(values) * 0.01f * sp68 * (0.8f - ((68.0f / sp68) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = 80.0f - (80.0f - roData->unk_0C);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = 0.0f - (0.0f - roData->unk_10);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = 40.0f - (40.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = 20.0f - (20.0f - roData->unk_18);
+ roData->unk_1C = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_1C = 1.0f - (1.0f - roData->unk_1C);
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_24 = 1.0f - (1.0f - roData->unk_24);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_RO_DATA(values) * 0.01f;
+ roData->unk_28 = 0.2f - (0.2f - roData->unk_28);
+ roData->unk_2C = GET_NEXT_RO_DATA(values) * 0.01f;
+ if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) {
+ } else {
+ rwData->unk_18 = 0x28;
+ camera->pitchUpdateRateInv = 9.0f;
+ }
+ }
+
+ sp80 = roData->unk_14;
+ sp7C = roData->unk_18;
+ sp78 = roData->unk_20;
+
+ if (Camera_IsChargingSwordOrDekuFlowerDive(camera)) {
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(18.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->yOffsetUpdateRate, 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->xzOffsetUpdateRate, 0.5f, 0.0001f);
+ if (rwData->unk_18 >= -0x13) {
+ rwData->unk_18--;
+ } else {
+ sp80 = 50.0f;
+ sp7C = 40.0f;
+ sp78 = 60.0f;
+ }
+ } else {
+ if (rwData->unk_18 < 0) {
+ sp80 = 50.0f;
+ sp7C = 40.0f;
+ sp78 = 60.0f;
+ rwData->unk_18++;
+ } else {
+ rwData->unk_18 = 0x28;
+ camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(9.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.6f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(0.6f, camera->xzOffsetUpdateRate, camera->speedRatio * 0.2f, 0.0001f);
+ }
+ }
+
+ camera->fovUpdateRate =
+ Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+ sp68 += roData->unk_00;
+ OLib_Vec3fDiffToVecGeo(&sp9C, sp4C, sp50);
+ OLib_Vec3fDiffToVecGeo(&sp94, sp4C, sp48);
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return true;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if ((camera->animState == 0) || (camera->animState == 0xA) || (camera->animState == 0x14)) {
+ rwData->unk_10 = 0;
+ rwData->unk_1A = 0;
+ rwData->unk_08 = camera->target;
+ camera->animState++;
+ rwData->unk_16 = 7;
+ rwData->unk_12 = sp9C.yaw;
+ rwData->unk_14 = sp9C.pitch;
+ rwData->unk_00 = sp9C.r;
+ rwData->unk_04 = camera->focalActorPosRot.pos.y - camera->unk_0F0.y;
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ sp94.r = camera->dist;
+ sp9C.r = sp94.r;
+ OLib_AddVecGeoToVec3f(sp50, sp4C, &sp9C);
+ *sp48 = *sp50;
+ }
+ }
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ sUpdateCameraDirection = true;
+ camera->inputDir.x = -sp9C.pitch;
+ camera->inputDir.y = sp9C.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_04 = camera->focalActorPosRot.pos.y;
+ sp84 = 0;
+ } else {
+ sp84 = 1;
+ }
+
+ if (rwData->unk_16 == 0) {
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp84 ? roData->unk_28 : roData->unk_24);
+ }
+
+ Actor_GetFocus(&sp40->pos, camera->target);
+
+ if (rwData->unk_08 != camera->target) {
+ camera->animState = 0;
+ return true;
+ }
+
+ sp120 = camera->focalActorPosRot.pos;
+ sp120.y += sp68;
+ OLib_Vec3fDiffToVecGeo(&spA4, &sp120, &sp40->pos);
+ sp104 = func_800CD6CC(camera->target);
+ if (PREG(86) + 800.0f < sp104) {
+ sp104 = PREG(86) + 800.0f;
+ }
+
+ // new_var5 = sp104; // TODO: Fake temp but helps when used?
+ // sp104 = new_var5;
+
+ // Above is down to SP and Floats
+
+ if ((sp104 < spA4.r) || Camera_IsChargingSwordOrDekuFlowerDive(camera)) {
+ spEC = 1.0f;
+ spF8 = 10.0f;
+ // dummy:; // Helps?
+ // sp80 = roData->unk_14; // Fake & Non-equivalent but helps?
+ } else {
+ spEC = spA4.r / sp104;
+ spF8 = 2.0f;
+ }
+ // spF8 should be set with swc1 twice, not once
+
+ // sp94 is loading in too early
+ Camera_CalcAtForEnemyLockOn(camera, &sp94.r, sp40, roData->unk_00, roData->unk_2C, 1.0f - spEC, &rwData->unk_04,
+ &spA4,
+ (sp84 ? (BATTLE1_FLAG_7 | BATTLE1_FLAG_0) : BATTLE1_FLAG_0) | roData->interfaceFlags);
+
+ sp88 = spA4.yaw;
+ OLib_Vec3fDiffToVecGeo(&spBC, sp4C, sp48);
+ spF4 = roData->unk_04 + ((roData->unk_08 - roData->unk_04) * spEC);
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f);
+ spBC.r = camera->dist = Camera_ScaledStepToCeilF(spF4, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+ OLib_Vec3fDiffToVecGeo(&spAC, sp4C, &sp40->pos);
+
+ spAC.r = spBC.r - (((spAC.r >= spBC.r) ? spBC.r : spAC.r) * 0.5f);
+
+ if (rwData->unk_1A & 0x1000) {
+ spFC = 15.0f;
+ } else {
+ spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - spEC));
+ }
+ spBC.yaw = sp94.yaw;
+ temp_v0_5 = (sp94.yaw + 0x8000);
+ temp_v0_5 = spAC.yaw - temp_v0_5;
+ if (rwData->unk_16 != 0) {
+ if (rwData->unk_16 > 0) {
+ sp86 = rwData->unk_16 - 1;
+ OLib_Vec3fDiffToVecGeo(&spB4, sp4C, sp50);
+ spB4.yaw = sp88 + 0x8000;
+ new_var = (rwData->unk_00 - spB4.r) * 0.16666667f;
+ sp8A = (s16)(rwData->unk_12 - spB4.yaw) * 0.16666667f;
+ sp88 = (s16)(rwData->unk_14 - spB4.pitch) * 0.16666667f;
+ spBC.r = Camera_ScaledStepToCeilF((sp86 * new_var) + spB4.r, sp9C.r, 0.5f,
+ 1.0f); // TODO: extra float calcs going on here
+ spBC.yaw = Camera_ScaledStepToCeilS(spB4.yaw + (sp8A * sp86), sp9C.yaw, 0.5f, 5);
+ spBC.pitch = Camera_ScaledStepToCeilS(spB4.pitch + (sp88 * sp86), sp9C.pitch, 0.5f, 5);
+ } else {
+ spF0 = true;
+ }
+ rwData->unk_16--;
+ } else {
+ // s32 phi_v0_2 = ABS(temp_v0_5);
+ temp_f4 = (s16)((spFC * 182.04167f) + .5f);
+ if ((temp_f4 < ABS(temp_v0_5)) && (sp84 == 0)) {
+
+ sp8A = temp_v0_5;
+ sp104 = temp_v0_5 * 0.00549325f;
+
+ temp_f2_3 = ((OLib_ClampMaxDist(spAC.r, spBC.r) / spBC.r) * ((spFC + 10.0f) - spFC)) + spFC;
+ temp_f12 = (SQ(temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f);
+ new_var3 = temp_f12 * sp104;
+ temp_f14 = SQ(sp104) / (new_var3 + (2.0f - (360.0f * temp_f12)));
+
+ if (sp8A >= 0) {
+ sp88 = CAM_DEG_TO_BINANG(temp_f14);
+ } else {
+ sp88 = -CAM_DEG_TO_BINANG(temp_f14);
+ }
+
+ spBC.yaw = (s16)(sp94.yaw + 0x8000) + (s16)(sp88 + 0x8000);
+ } else {
+ new_var2 = (1.0f - camera->speedRatio) * 0.05f;
+ if (temp_v0_5 >= 0) {
+ sp88 = temp_f4 & 0xFFFFu; // TODO: Is this needed?
+ } else {
+ sp88 = -temp_f4;
+ }
+ spBC.yaw = sp94.yaw - (s16)((sp88 - temp_v0_5) * new_var2);
+ }
+ }
+
+ if (spF0 == false) {
+ new_var4 = spAC.pitch * roData->unk_1C;
+ temp_v0_6 = ((s16)(((((sp7C - sp80) * spEC) + sp80) * 182.04167f) + .5f) -
+ (s16)((spA4.pitch * (0.5f + (spEC * 0.5f))) + 0.5f));
+ temp_v0_6 += (s16)new_var4;
+
+ if (temp_v0_6 < -0x2AA8) {
+ temp_v0_6 = -0x2AA8;
+ } else if (temp_v0_6 > 0x2AA8) {
+ temp_v0_6 = 0x2AA8;
+ }
+
+ spBC.pitch = Camera_ScaledStepToCeilS(temp_v0_6, sp94.pitch, 1.0f / camera->pitchUpdateRateInv, 5);
+ OLib_AddVecGeoToVec3f(sp48, sp4C, &spBC);
+ spC4 = *sp48;
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (!(roData->interfaceFlags & BATTLE1_FLAG_4)) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) {
+ if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) {
+ rwData->unk_1A |= 0x1000;
+ } else {
+ rwData->unk_1A &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & BATTLE1_FLAG_1) {
+ func_800CBC84(camera, sp4C, &spC4, 3);
+ } else {
+ OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4);
+ spC4.x -= sp114.x;
+ spC4.y -= sp114.y;
+ spC4.z -= sp114.z;
+ }
+ *sp50 = spC4;
+ ;
+ rwData->unk_1A &= ~0x10;
+ } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) {
+ if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) {
+ rwData->unk_1A |= 0x1000;
+ spF8 = OLib_Vec3fDist(sp4C, sp8C);
+ spF4 = OLib_Vec3fDist(sp4C, &spC4);
+ phi_f0_3 = (rwData->unk_1A & 0x10) ? 40.0f : 0.0f;
+ spF8 = spF8 + phi_f0_3;
+ Actor_GetScreenPos(camera->play, camera->focalActor, &sp5E, &sp5C);
+ if ((spF4 < spF8) || ((sp5E >= 0) && (sp5E < 0x141) && (sp5C >= 0) && (sp5C < 0xF1))) {
+ rwData->unk_1A |= 0x10;
+ spB4.yaw = spA4.yaw + 0x8000;
+ spB4.pitch = -spA4.pitch;
+ spB4.r = 40.0f;
+ sp114 = sp8C->pos;
+ sp114.y += 40.0f;
+ OLib_AddVecGeoToVec3f(&sp120, &sp114, &spB4);
+ Camera_ScaledStepToCeilVec3f(&sp120, sp50, 0.15f, 0.15f, 0.2f);
+ } else if (rwData->unk_1A & 0x10) {
+ if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ }
+ dummy:; // TODO: Is Needed?
+ } else {
+ if (rwData->unk_1A & 0x10) {
+ if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = spC4;
+ }
+ rwData->unk_1A &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & BATTLE1_FLAG_1) {
+ rwData->unk_1A &= ~0x10;
+ if (func_800CBC84(camera, sp4C, &spC4, 3) != 0) {
+ *sp50 = spC4;
+ } else {
+ *sp50 = spC4;
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4);
+ spC4.x -= sp114.x;
+ spC4.y -= sp114.y;
+ spC4.z -= sp114.z;
+ *sp50 = spC4;
+ }
+ } else {
+ rwData->unk_1A &= ~0x10;
+ *sp50 = *sp48;
+ }
+ }
+
+ if (rwData->unk_16 != 0) {
+ sp88 = 0;
+ } else {
+ sp88 = (s16)(sp94.yaw - spBC.yaw) * 0.50f;
+ }
+
+ camera->roll = Camera_ScaledStepToCeilS(sp88, camera->roll, 0.06f, 5);
+ if (func_800CBAAC(camera) != PLAYER_MELEE_WEAPON_STATE_0) {
+ phi_f12 = ((camera->play->state.frames & 8) != 0) ? roData->unk_20 - (roData->unk_20 * 0.5f) : roData->unk_20;
+ } else {
+ phi_f12 = ((gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f) * (sp78 - (sp78 * 0.05f * spEC));
+ }
+ camera->fov = Camera_ScaledStepToCeilF(phi_f12, camera->fov, camera->fovUpdateRate, 0.1f);
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle2.s")
+s32 Camera_Battle2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle3.s")
+s32 Camera_Battle3(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle4.s")
+s32 Camera_Battle4(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle0.s")
+s32 Camera_Battle0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+/**
+ * Used for following a secondary target such as zora fins or a z-target
+ */
+// Very non-equivalent, many fakes. May need to restart from scratch (mips2c)
+#ifdef NON_EQUIVALENT
+s32 Camera_KeepOn1(Camera* camera) {
+ f32 pad1;
+ f32* pad2;
+ Vec3f* sp48 = &camera->eye;
+ Vec3f* sp44 = &camera->at;
+ Vec3f* sp40 = &camera->eyeNext;
+ Vec3f sp130;
+ Vec3f sp124;
+ Vec3f sp118;
+ f32 sp114;
+ PosRot* sp3C = &camera->focalActorPosRot;
+ PosRot* sp30 = &camera->targetPosRot;
+ f32 sp104;
+ f32 temp_f2_3;
+ f32 new_var;
+ f32 spFC;
+ f32 spF8;
+ f32 spF4;
+ s16 spF2;
+ s16 spF0;
+ VecGeo spE8;
+ VecGeo spE0;
+ VecGeo spD8;
+ VecGeo spD0;
+ VecGeo spC8;
+ VecGeo spC0;
+ f32 new_var2;
+ s32 new_var3;
+ f32 temp_f0;
+ Vec3f spA8;
+ PosRot* spA4;
+ CameraCollision sp7C;
+
+ s32 sp78;
+ f32 sp74;
+ s16 sp72;
+ s16 sp70;
+ f32 sp60;
+ s16 sp56;
+ s16 sp54;
+
+ s16 phi_v1_3;
+ s16 phi_a0;
+ KeepOn1ReadOnlyData* roData = &camera->paramData.keep1.roData;
+ KeepOn1ReadWriteData* rwData = &camera->paramData.keep1.rwData;
+ s16 temp_v0_3;
+ s16 new_var4;
+
+ spA4 = &camera->focalActor->focus;
+ //! FAKE
+ if (temp_v0_3) {}
+ sp78 = 0;
+ temp_f0 = Camera_GetFocalActorHeight(camera);
+ // temp_a1 = camera->target;
+
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return 1;
+ }
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * temp_f0 * (0.8f - ((68.0f / temp_f0) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = 40.0f - (40.0f - roData->unk_14);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = 20.0f - (20.0f - roData->unk_18);
+ // roData->unk_18 = roData->unk_18; // TODO: Fake
+ // if (!roData->unk_08) {}
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_1C = 1.000f - (1.00f - roData->unk_1C); // TODO: Necessary?
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_24 = 1.0f - (1.0f - roData->unk_24);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_28 = 0.2f - (0.2f - roData->unk_28);
+ }
+
+ sp60 = temp_f0;
+ sp114 = roData->unk_00; // TODO: likely fake temp
+ sp60 += sp114;
+ OLib_Vec3fDiffToVecGeo(&spC8, sp44, sp48);
+ OLib_Vec3fDiffToVecGeo(&spC0, sp44, sp40);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (RELOAD_PARAMS(camera)) {
+ camera->animState++;
+ rwData->unk_18 = 0;
+ rwData->unk_10 = 0;
+ rwData->unk_04 = 0.0f;
+ rwData->unk_0C = camera->target;
+ rwData->unk_16 = 7;
+ rwData->unk_12 = spC8.yaw;
+ rwData->unk_14 = spC8.pitch;
+ rwData->unk_00 = spC8.r;
+ rwData->unk_08 = sp3C->pos.y - camera->unk_0F0.y;
+ if ((2.0f * roData->unk_04) < camera->dist) {
+ camera->dist = 2.0f * roData->unk_04;
+ spC0.r = camera->dist;
+ spC8.r = spC0.r;
+ OLib_AddVecGeoToVec3f(sp48, sp44, &spC8);
+ *sp40 = *sp48;
+ }
+ }
+
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ sUpdateCameraDirection = true;
+ camera->inputDir.x = -spC8.pitch;
+ camera->inputDir.y = spC8.yaw + 0x8000;
+ camera->inputDir.z = 0;
+ }
+
+ if (func_800CB950(camera)) {
+ rwData->unk_08 = sp3C->pos.y;
+ }
+
+ sp114 = roData->unk_04;
+
+ if (camera->target->id != ACTOR_EN_BOOM) {
+ Actor_GetWorldPosShapeRot(sp30, camera->target);
+ Actor_GetFocus(&spA8, camera->target);
+ camera->targetPosRot.pos.y = spA8.y;
+ } else {
+ Actor_GetFocus(sp30, camera->target);
+ }
+ if (rwData->unk_0C != camera->target) {
+ rwData->unk_0C = camera->target;
+ camera->atLerpStepScale = 0.0f;
+ }
+
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(1.0f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(1.0f, camera->xzOffsetUpdateRate, camera->speedRatio * 0.2f, 0.0001f);
+ // TODO: No f on 0.05?
+ camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f);
+
+ if (func_800CB950(camera)) {
+ rwData->unk_08 = sp3C->pos.y;
+ sp70 = false;
+ } else {
+ sp70 = true;
+ }
+
+ Camera_CalcAtForFriendlyLockOn(camera, &spC0, sp30, roData->unk_00, roData->unk_08, &rwData->unk_08, &spD0,
+ roData->interfaceFlags | (sp70 ? KEEPON1_FLAG_7 : 0));
+ sp124 = sp3C->pos;
+ sp124.y += sp60;
+ OLib_Vec3fDiffToVecGeo(&spD0, &sp124, sp30);
+
+ if (sp114 < spD0.r) {
+ sp74 = 1.0f;
+ } else {
+ sp74 = spD0.r / sp114;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spE8, sp44, sp40);
+
+ if (spE8.r < roData->unk_04) {
+ sp114 = roData->unk_04;
+ spF8 = 20.0f;
+ } else if (roData->unk_08 < spE8.r) {
+ sp114 = roData->unk_08;
+ spF8 = 20.0f;
+ } else {
+ sp114 = spE8.r;
+ spF8 = 1.0f;
+ }
+
+ camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f);
+ camera->dist = Camera_ScaledStepToCeilF(sp114, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f);
+ spF8 = camera->dist;
+ spE8.r = camera->dist;
+ sp118 = sp30->pos;
+ OLib_Vec3fDiffToVecGeo(&spD8, sp44, &sp118);
+ //! FAKE
+ if (1) {}
+ if (1) {}
+ if (1) {} // TODO: Is needed?
+ pad1 = spD8.r; // TODO: Fake temp?
+ spD8.r = spF8 - (((pad1 <= spF8) ? spD8.r : spF8) * .5f);
+ camera->dist = Camera_ScaledStepToCeilF(pad1, camera->dist, 0.06f, 0.1f);
+ spE8.r = camera->dist;
+ spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - sp74));
+ spE8.yaw = spC0.yaw;
+ temp_v0_3 = (s16)(spD8.yaw - (s16)(spC0.yaw + 0x8000));
+ if (rwData->unk_16 != 0) {
+ if (rwData->unk_16 > 0) {
+ sp72 = rwData->unk_16 - 1;
+ spF2 = spD0.yaw;
+ OLib_Vec3fDiffToVecGeo(&spD0, sp44, sp48);
+ spD0.yaw = (s16)(spF2 + 0x8000);
+ sp60 = (rwData->unk_00 - spD0.r) * 0.16666667f;
+ spF2 = (s16)(rwData->unk_12 - (s16)(spF2 + 0x8000)) * 0.16666667f;
+ spF0 = ((s16)(rwData->unk_14 - (s64)spD0.pitch)); // TODO: s16 cast on F0
+ spF0 = (s16)(spF0 * 0.16666667f);
+ spE8.r = Camera_ScaledStepToCeilF(spD0.r + (sp60 * sp72), spC8.r, .5f, 0.1f);
+ spE8.yaw = Camera_ScaledStepToCeilS(spD0.yaw + (spF2 * sp72), spC8.yaw, .5f, 5);
+ spE8.pitch = Camera_ScaledStepToCeilS(spD0.pitch + (spF0 * sp72), spC8.pitch, .5f, 5);
+ }
+ sp78 = 1;
+ rwData->unk_16--;
+ } else {
+ new_var3 = ABS(temp_v0_3); // TODO: Fake temp?
+ if ((s16)((spFC * 182.04167f) + .5f) < new_var3) {
+ spF2 = temp_v0_3;
+ sp104 = temp_v0_3 * 0.00549325f;
+ temp_f2_3 = ((OLib_ClampMaxDist(spD8.r, spE8.r) / spE8.r) * ((spFC + 10.0f) - spFC)) + spFC;
+ pad2 = &sp104; // TODO: Fake temp
+ temp_f2_3 = ((temp_f2_3 * temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f);
+ temp_f2_3 = (sp104 * (*pad2)) / ((temp_f2_3 * (*pad2)) + (2.0f - (360.0f * temp_f2_3)));
+
+ if (spF2 >= 0) {
+ phi_v1_3 = (s16)((temp_f2_3 * 182.04167f) + .5f);
+ } else {
+ phi_v1_3 = -(s16)((temp_f2_3 * 182.04167f) + .5f);
+ }
+ spE8.yaw = (s16)(spC0.yaw + 0x8000) + (s16)(phi_v1_3 + 0x8000);
+ } else {
+ new_var = (1.0f - camera->speedRatio) * 0.05f; // TODO: Fake temp?
+ phi_v1_3 = (temp_v0_3 >= 0) ? CAM_DEG_TO_BINANG(spFC) : -CAM_DEG_TO_BINANG(spFC);
+ //! FAKE
+ if (phi_a0) {} // TODO: Fake to shaft a registers
+ spE8.yaw = (s16)(spC0.yaw - (s16)((phi_v1_3 - temp_v0_3) * new_var));
+ }
+ }
+
+ //! FAKE
+ if (!spF0) {} // TODO: Is needed?
+ if (sp78 == 0) {
+ // TODO: extra 0 on 0.050f needed?
+ phi_a0 = (s16)(((roData->unk_14 + ((roData->unk_18 - roData->unk_14) * sp74)) * 182.04167f) + .5f);
+ phi_a0 -= (s16)((spD0.pitch * (0.5f + (sp74 * 0.5f))) + 0.5f);
+ //! FAKE
+ if (1) {} // TODO: Needed?
+ sp60 = spD8.pitch * roData->unk_1C; // TODO: Fake sp60 temp?
+ phi_a0 += (s16)sp60;
+
+ if (phi_a0 < -0x3200) {
+ phi_a0 = -0x3200;
+ } else if (phi_a0 > 0x3200) {
+ phi_a0 = 0x3200;
+ }
+
+ spE8.pitch = Camera_ScaledStepToCeilS(phi_a0, spC0.pitch, 0.11111111f, 5);
+ OLib_AddVecGeoToVec3f(sp40, sp44, &spE8);
+ sp7C.pos = *sp40;
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (!(roData->interfaceFlags & KEEPON1_FLAG_4)) {
+ if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) {
+ if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) {
+ rwData->unk_18 |= 0x1000;
+ } else {
+ rwData->unk_18 &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & KEEPON1_FLAG_1) {
+ func_800CBC84(camera, sp44, &sp7C, 3);
+ } else {
+ OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos);
+ sp7C.pos.x -= sp130.x;
+ sp7C.pos.y -= sp130.y;
+ sp7C.pos.z -= sp130.z;
+ }
+ *sp48 = sp7C.pos;
+ rwData->unk_18 &= ~0x10;
+ } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) {
+ if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) {
+ rwData->unk_18 |= 0x1000;
+ spF8 = OLib_Vec3fDist(sp44, spA4);
+ spF4 = OLib_Vec3fDist(sp44, &sp7C.pos);
+ spF8 += (rwData->unk_18 & 0x10) ? 40 : 0.0f; // TODO: 40.0f?
+ Actor_GetScreenPos(camera->play, camera->focalActor, &sp56, &sp54);
+ if ((spF4 < spF8) || ((sp56 >= 0) && (sp56 <= 320) && (sp54 >= 0) && (sp54 <= 240))) {
+ rwData->unk_18 |= 0x10;
+ spE0.yaw = (s16)(spD0.yaw + 0x8000);
+ spE0.pitch = -spD0.pitch;
+ spE0.r = 40.0f;
+ sp130 = spA4->pos;
+ sp130.y += 40.0f;
+ OLib_AddVecGeoToVec3f(&sp124, &sp130, &spE0);
+ Camera_ScaledStepToCeilVec3f(&sp124, sp48, 0.15f, 0.15f, 0.2f);
+ } else if (rwData->unk_18 & 0x10) {
+ if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ }
+ dummy:; // TODO: Is this needed?
+ } else {
+ if (rwData->unk_18 & 0x10) {
+ if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ } else {
+ Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f);
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = sp7C.pos;
+ // if (sp104) {} // TODO: Is this needed?
+ }
+ rwData->unk_18 &= ~0x1000;
+ }
+ } else if (roData->interfaceFlags & KEEPON1_FLAG_1) {
+ rwData->unk_18 &= ~0x10;
+ if (func_800CBC84(camera, sp44, &sp7C, 3) != 0) {
+ *sp48 = sp7C.pos;
+ } else {
+ *sp48 = sp7C.pos;
+ ;
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos);
+ sp7C.pos.x -= sp130.x;
+ sp7C.pos.y -= sp130.y;
+ sp7C.pos.z -= sp130.z;
+ *sp48 = sp7C.pos;
+ }
+ } else {
+ rwData->unk_18 &= ~0x10;
+ *sp48 = *sp40;
+ }
+ }
+
+ // TODO: spF8 temp needed?
+ camera->fov = Camera_ScaledStepToCeilF(spF8 = roData->unk_20, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.2f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp70 ? roData->unk_28 : roData->unk_24);
+
+ return true;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn1.s")
+#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn2.s")
+s32 Camera_KeepOn2(Camera* camera) {
+ return Camera_Noop(camera);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn3.s")
+/**
+ * Talking to an NPC
+ */
+s32 Camera_KeepOn3(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ s32 temp_f0;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spD8;
+ Vec3f spCC;
+ Vec3f spC0;
+ f32 timer;
+ f32 spB8;
+ f32 spB4;
+ f32 swingAngle;
+ Actor* spA8[2];
+ VecGeo spA0;
+ VecGeo sp98;
+ VecGeo sp90;
+ VecGeo sp88;
+ VecGeo sp80;
+ Vec3f* at = &camera->at;
+ s32 sp78;
+ f32 phi_f14;
+ PosRot* sp70;
+ s16 sp6E;
+ s16 sp6C;
+ s16 sp6A;
+ s16 phi_a3;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ KeepOn3ReadOnlyData* roData = &camera->paramData.keep3.roData;
+ KeepOn3ReadWriteData* rwData = &camera->paramData.keep3.rwData;
+ f32 focalActorHeight;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn4.s")
+ sp70 = &camera->focalActor->focus; // TODO: Move above?
+ sp6A = 0;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn0.s")
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ Camera_ChangeMode(camera, CAM_MODE_TARGET);
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed1.s")
+ if (RELOAD_PARAMS(camera)) {
+ if (camera->play->view.unk164 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return 1;
+ }
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed2.s")
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed3.s")
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_20 = GET_NEXT_RO_DATA(values);
+ roData->unk_24 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timer = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_28 = GET_NEXT_SCALED_RO_DATA(values);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed4.s")
+ if (camera->animState == 10) {
+ roData->timer >>= 1;
+ if (roData->timer < 20) {
+ roData->timer = 20;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Fixed0.s")
+ OLib_Vec3fDiffToVecGeo(&sp88, at, eye);
+ OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext);
+ Actor_GetFocus(&camera->targetPosRot, camera->target);
+ spD8 = focalActorPosRot->pos;
+ spD8.y += focalActorHeight;
+ OLib_Vec3fDiffToVecGeo(&spA0, &spD8, &camera->targetPosRot.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject1.s")
+ if (RELOAD_PARAMS(camera)) {
+ camera->animState++;
+ spA8[0] = camera->target;
+ spA8[1] = camera->focalActor;
+ rwData->unk_0C = camera->target;
+ phi_f14 = (roData->unk_08 < spA0.r) ? 1.0f : (spA0.r / roData->unk_08);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject2.s")
+ rwData->timer = roData->timer;
+ spB8 = ((1.0f - phi_f14) * spA0.r) / rwData->timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject3.s")
+ if (roData->interfaceFlags & KEEPON3_FLAG_6) {
+ spA0.pitch = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject4.s")
+ swingAngle = LERPIMP(roData->unk_14, roData->unk_18, phi_f14);
+ sp98.pitch = CAM_DEG_TO_BINANG(swingAngle) + ((s16) - (spA0.pitch * roData->unk_1C));
+ swingAngle = LERPIMP(roData->unk_0C, roData->unk_10, phi_f14);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Subject0.s")
+ phi_a3 = CAM_DEG_TO_BINANG(swingAngle);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data0.s")
+ sp78 = 1;
+ if ((camera->target->category == ACTORCAT_DOOR) || (camera->target->id == ACTOR_EN_TALK)) {
+ if ((s16)(camera->targetPosRot.rot.y - sp80.yaw) > 0) {
+ phi_a3 = -phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data1.s")
+ if (ABS(spA0.pitch) < 0x157C) { // 30.2 degrees
+ sp98.yaw = BINANG_ROT180(spA0.yaw) + phi_a3;
+ sp6A = (s16)(BINANG_ROT180(spA0.yaw) - phi_a3);
+ } else {
+ sp78 = 0;
+ sp90.r = 30.0f;
+ sp90.yaw = BINANG_ROT180(spA0.yaw) + (phi_a3 >> 2);
+ sp90.pitch = -spA0.pitch;
+ spCC = sp70->pos;
+ spCC.y += 30.0f;
+ OLib_AddVecGeoToVec3f(&spC0, &spCC, &sp90);
+ spCC.x = (camera->targetPosRot.pos.x + spD8.x) * 0.5f;
+ spCC.y = (camera->targetPosRot.pos.y + spD8.y) * 0.5f;
+ spCC.z = (camera->targetPosRot.pos.z + spD8.z) * 0.5f;
+ OLib_Vec3fDiffToVecGeo(&sp98, &spCC, &spC0);
+ if (sp98.pitch < -0x2328) { // 49.4 degrees
+ sp98.pitch = -0x2328;
+ }
+ }
+ } else if (!(roData->interfaceFlags & KEEPON3_FLAG_5) && (ABS((s16)(spA0.yaw - sp80.yaw)) < 0x4000)) {
+ if ((s16)(spA0.yaw - sp80.yaw) > 0) {
+ phi_a3 = -phi_a3;
+ }
+ sp98.yaw = (s16)(spA0.yaw + phi_a3);
+ sp6A = (s16)(spA0.yaw - phi_a3);
+ } else {
+ if ((s16)(BINANG_ROT180(spA0.yaw) - sp80.yaw) < 0) {
+ phi_a3 = -phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data2.s")
+ sp98.yaw = BINANG_ROT180(spA0.yaw) + phi_a3;
+ sp6A = BINANG_ROT180(spA0.yaw) - phi_a3;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data3.s")
+ sp6C = sp98.yaw;
+ sp6E = sp98.pitch;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Data4.s")
+ //! FAKE
+ if (roData->unk_28) {}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique1.s")
+ spB4 = spA0.r;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique2.s")
+ phi_f14 = roData->unk_28;
+ spA0.r = spB8 * phi_f14 + (spB4 * (1.0f - phi_f14));
+ spD8 = focalActorPosRot->pos;
+ spD8.y += focalActorHeight;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique3.s")
+ OLib_AddVecGeoToVec3f(&rwData->unk_10, &spD8, &spA0);
+ rwData->unk_10.y += roData->unk_00;
+ spA0.r = spB4;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique4.s")
+ if (sp78 != 0) {
+ sp98.r = ((roData->unk_04 + (spA0.r * 0.5f)) - sp80.r) + sp80.r;
+ i = 0;
+ sp78 = 14;
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ if (!(roData->interfaceFlags & KEEPON3_FLAG_7)) {
+ if (CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC, spA8,
+ 2) ||
+ Camera_BgCheck(camera, &rwData->unk_10, &spCC)) {
+ sp98.yaw = sp6A;
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ }
+ while (i < sp78) {
+ if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC,
+ spA8, 2) &&
+ !Camera_BgCheck(camera, &rwData->unk_10, &spCC)) {
+ break;
+ }
+ sp98.yaw = sp6C + D_801B9E18[i];
+ sp98.pitch = sp6E + D_801B9E34[i];
+ OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98);
+ i++;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique5.s")
+ Camera_UnsetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2);
+ temp_f0 = ((rwData->timer + 1) * rwData->timer) >> 1;
+ rwData->unk_04 = (f32)(s16)(sp98.yaw - sp80.yaw) / temp_f0;
+ rwData->unk_08 = (f32)(s16)(sp98.pitch - sp80.pitch) / temp_f0;
+ rwData->unk_00 = (sp98.r - sp80.r) / temp_f0;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique0.s")
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique6.s")
+ sCameraInterfaceFlags = roData->interfaceFlags;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique7.s")
+ if (rwData->timer != 0) {
+ timer = rwData->timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique8.s")
+ at->x += (rwData->unk_10.x - at->x) / timer;
+ at->y += (rwData->unk_10.y - at->y) / timer;
+ at->z += (rwData->unk_10.z - at->z) / timer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Unique9.s")
+ sp98.r = (rwData->unk_00 * timer) + sp80.r + 1.0f;
+ sp98.yaw = sp80.yaw + (s16)(rwData->unk_04 * timer);
+ sp98.pitch = sp80.pitch + (s16)(rwData->unk_08 * timer);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp98);
+ *eye = *eyeNext;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_20, camera->fov, 0.5f, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->unk_24);
+ func_800CBFA4(camera, at, eye, 3);
+ rwData->timer--;
+ } else {
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo1.s")
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->dist = OLib_Vec3fDist(at, eye);
+ if (camera->stateFlags & CAM_STATE_3) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ Camera_SetUpdateRatesSlow(camera);
+ camera->atLerpStepScale = 0.0f;
+
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) {
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+ Camera_UnsetStateFlag(camera, CAM_STATE_3);
+ }
+ }
+
+ if (rwData->unk_0C != camera->target) {
+ rwData->unk_0C = camera->target;
+ camera->animState = 10;
+ }
+
+ return 1;
+}
+
+/**
+ * Used for settings where camera turns around and faces player
+ * eg. all item-based settings, elegy shell cutscene, death cutscene, ...
+ */
+s32 Camera_KeepOn4(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Actor* spCC[2];
+ f32 temp_f0_2;
+ f32 new_var;
+ CollisionPoly* spC0;
+ VecGeo spB8;
+ VecGeo spB0;
+ VecGeo spA8;
+ s16* sp44 = &camera->data2;
+ s16 spA2;
+ s16 spA0;
+ s16 sp9E;
+ s16 sp9C;
+ s16 pad1;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ KeepOn4ReadOnlyData* roData = &camera->paramData.keep4.roData;
+ KeepOn4ReadWriteData* rwData = &camera->paramData.keep4.rwData;
+ f32 focalActorHeight;
+ s32 bgId;
+ s16 camMode;
+ Player* player;
+ Vec3f* data;
+ CameraModeValue* values;
+ PosRot sp60;
+ PosRot sp4C;
+
+ if (RELOAD_PARAMS(camera)) {
+ if (camera->play->view.unk164 == 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+ rwData->unk_18 = *sp44;
+ Camera_UnsetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ }
+
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ player = (Player*)camera->focalActor;
+
+ switch (((Player*)camera->focalActor)->transformation) {
+ case PLAYER_FORM_DEKU:
+ camMode = CAM_MODE_DEKUSHOOT;
+ break;
+
+ case PLAYER_FORM_GORON:
+ camMode = CAM_MODE_GORONDASH;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ camMode = CAM_MODE_DEKUFLY;
+ break;
+
+ case PLAYER_FORM_FIERCE_DEITY:
+ camMode = CAM_MODE_JUMP;
+ break;
+
+ default:
+ camMode = CAM_MODE_NORMAL;
+ break;
+ }
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera) - (player->unk_AB8 * camera->focalActor->scale.y);
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ }
+
+ if (rwData->unk_18 != *sp44) {
+ camera->animState = 20;
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camMode].values;
+ new_var = -0.5f;
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight *
+ ((1.0f + new_var) - ((68.0f / focalActorHeight) * new_var));
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight *
+ ((1.0f + new_var) - ((68.0f / focalActorHeight) * new_var));
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values);
+ roData->unk_18 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timer = GET_NEXT_RO_DATA(values);
+ }
+
+ sUpdateCameraDirection = true;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ OLib_Vec3fDiffToVecGeo(&spB0, at, eye);
+ data = &D_801EDDD0;
+ OLib_Vec3fDiffToVecGeo(&spA8, at, eyeNext);
+ D_801EDDD0 = focalActorPosRot->pos;
+ D_801EDDD0.y = data->y + focalActorHeight;
+ temp_f0_2 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &spC0, &bgId, &D_801EDDD0);
+
+ if ((roData->unk_00 + data->y) < temp_f0_2) {
+ D_801EDDD0.y = temp_f0_2 + 10.0f;
+ } else {
+ D_801EDDD0.y = roData->unk_00 + data->y;
+ }
+
+ if (roData->unk_10 != 0.0f) {
+ D_801EDDE0 = (*data);
+ spB8.r = roData->unk_10;
+ spB8.pitch = 0;
+ spB8.yaw = focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(&D_801EDDD0, &D_801EDDD0, &spB8);
+ }
+
+ sp9C = 0;
+
+ switch (camera->animState) {
+ case 0:
+ case 20:
+ spCC[sp9C] = camera->focalActor;
+ sp9C++;
+ Camera_SetUpdateRatesFastPitch(camera);
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ rwData->timer = roData->timer;
+ rwData->unk_08 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+
+ switch (roData->interfaceFlags & (KEEPON4_FLAG_3 | KEEPON4_FLAG_2 | KEEPON4_FLAG_1)) {
+ case KEEPON4_FLAG_1:
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = BINANG_SUB(BINANG_ROT180(focalActorPosRot->rot.y), spA8.yaw) < 0
+ ? BINANG_ROT180(focalActorPosRot->rot.y) + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : BINANG_ROT180(focalActorPosRot->rot.y) - CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_2):
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ pad1 = BINANG_ROT180(focalActorPosRot->rot.y);
+ spA0 = pad1 + CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case KEEPON4_FLAG_2:
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case (KEEPON4_FLAG_2 | KEEPON4_FLAG_1):
+ spA2 = spA8.pitch + CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = spA8.yaw + CAM_DEG_TO_BINANG(roData->unk_0C);
+ break;
+
+ case KEEPON4_FLAG_3:
+ if (camera->target != NULL) {
+ Actor_GetWorldPosShapeRot(&sp60, camera->target);
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08) - sp60.rot.x;
+ spA0 = (BINANG_SUB(BINANG_ROT180(sp60.rot.y), spA8.yaw) > 0)
+ ? BINANG_ROT180(sp60.rot.y) + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : BINANG_ROT180(sp60.rot.y) - CAM_DEG_TO_BINANG(roData->unk_0C);
+
+ spCC[1] = camera->target;
+ sp9C++;
+ break;
+ }
+ // fallthrough
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_1):
+ if (camera->target != 0) {
+ Actor_GetWorld(&sp4C, camera->target);
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ sp9E = Camera_CalcXZAngle(&sp4C.pos, &focalActorPosRot->pos);
+ spA0 = (BINANG_SUB(sp9E, spA8.yaw) > 0) ? sp9E + CAM_DEG_TO_BINANG(roData->unk_0C)
+ : sp9E - CAM_DEG_TO_BINANG(roData->unk_0C);
+ spCC[1] = camera->target;
+ sp9C++;
+ break;
+ }
+ // fallthrough
+ case (KEEPON4_FLAG_3 | KEEPON4_FLAG_2 | KEEPON4_FLAG_1):
+ spA2 = CAM_DEG_TO_BINANG(roData->unk_08);
+ spA0 = spA8.yaw;
+ break;
+
+ default:
+ spA2 = spA8.pitch;
+ spA0 = spA8.yaw;
+ break;
+ }
+
+ spB8.pitch = spA2;
+ spB8.yaw = spA0;
+ spB8.r = roData->unk_04;
+ // Odd that the return is set to bgId and remains unused
+ bgId = func_800CC260(camera, &D_801EDDF0, &D_801EDDD0, &spB8, spCC, sp9C);
+ rwData->unk_04 = (f32)(s16)(spB8.pitch - spA8.pitch) / rwData->timer;
+ rwData->unk_00 = (f32)(s16)(spB8.yaw - spA8.yaw) / rwData->timer;
+ rwData->unk_10 = spA8.yaw;
+ rwData->unk_12 = spA8.pitch;
+ camera->animState++;
+ rwData->unk_16 = 1;
+ break;
+
+ case 10:
+ rwData->unk_08 = focalActorPosRot->pos.y - camera->unk_0F0.y;
+ break;
+ }
+
+ if (roData->interfaceFlags & KEEPON4_FLAG_6) {
+ if (rwData->timer != 0) {
+ at->x += ((data->x - at->x) / rwData->timer);
+ at->y += ((data->y - at->y) / rwData->timer);
+ at->z += ((data->z - at->z) / rwData->timer);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ }
+ camera->yOffsetUpdateRate = 0.25f;
+ camera->xzOffsetUpdateRate = 0.25f;
+ camera->atLerpStepScale = 0.0f;
+ } else {
+ camera->yOffsetUpdateRate = 0.25f;
+ camera->xzOffsetUpdateRate = 0.25f;
+ camera->atLerpStepScale = 0.75f;
+ Camera_ScaledStepToCeilVec3f(data, at, 0.2f, 0.2f, 0.2f);
+ camera->atLerpStepScale = 0.0f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ }
+
+ camera->dist = Camera_ScaledStepToCeilF(roData->unk_04, camera->dist, 0.25f, 1.0f);
+ spB8.r = camera->dist;
+
+ if (rwData->timer != 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_DISABLE_MODE_CHANGE);
+ rwData->unk_10 += (s16)rwData->unk_00;
+ rwData->unk_12 += (s16)rwData->unk_04;
+ rwData->timer--;
+ } else {
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ }
+
+ spB8.yaw = Camera_ScaledStepToCeilS(rwData->unk_10, spA8.yaw, roData->unk_14, 5);
+ spB8.pitch = Camera_ScaledStepToCeilS(rwData->unk_12, spA8.pitch, roData->unk_14, 5);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB8);
+ *eye = *eyeNext;
+ func_800CBFA4(camera, at, eye, 3);
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+
+ return 1;
+}
+
+s32 Camera_KeepOn0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Used for many fixed-based camera settings i.e. camera is fixed in rotation, and often position (but not always)
+ */
+s32 Camera_Fixed1(Camera* camera) {
+ s32 pad[2];
+ s32 yawDiff;
+ VecGeo eyeOffset;
+ VecGeo eyeAtOffset;
+ VecGeo sp7C;
+ u32 negOne;
+ Vec3f adjustedPos;
+ BgCamFuncData* bgCamFuncData;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ CameraModeValue* values;
+ PosRot* targetHome;
+ PosRot* targetWorld;
+ VecGeo sp44;
+ Fixed1ReadOnlyData* roData = &camera->paramData.fixd1.roData;
+ Fixed1ReadWriteData* rwData = &camera->paramData.fixd1.rwData;
+
+ OLib_Vec3fDiffToVecGeo(&sp7C, at, eye);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->eyePosRotTarget.pos, &bgCamFuncData->pos);
+
+ rwData->eyePosRotTarget.rot = bgCamFuncData->rot;
+ rwData->fov = bgCamFuncData->fov;
+ rwData->focalActor = camera->focalActor;
+
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight;
+ roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+
+ if (roData->interfaceFlags & FIXED1_FLAG_4) {
+ if (camera->target == NULL) {
+ return false;
+ }
+
+ targetHome = &camera->target->home;
+ targetWorld = &camera->target->world;
+
+ OLib_Vec3fDiffToVecGeo(&sp44, &targetHome->pos, &rwData->eyePosRotTarget.pos);
+ sp44.yaw = targetWorld->rot.y + (s16)(sp44.yaw - targetHome->rot.y);
+ OLib_AddVecGeoToVec3f(&rwData->eyePosRotTarget.pos, &targetWorld->pos, &sp44);
+ yawDiff = (s16)(rwData->eyePosRotTarget.rot.y - targetHome->rot.y);
+ rwData->eyePosRotTarget.rot.y = targetWorld->rot.y + yawDiff;
+ }
+ }
+
+ negOne = -1;
+
+ if (rwData->focalActor != camera->focalActor) {
+ camera->animState = 20;
+ }
+
+ if (rwData->fov == (s32)negOne) {
+ rwData->fov = roData->fov * 100;
+ } else if (rwData->fov <= 360) {
+ rwData->fov *= 100;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ Camera_SetUpdateRatesSlow(camera);
+ if (rwData->fov != (s32)negOne) {
+ roData->fov = CAM_RODATA_UNSCALE(rwData->fov);
+ }
+
+ if (bgCamFuncData->unk_0E != (s32)negOne) {
+ roData->unk_04 = CAM_RODATA_UNSCALE(bgCamFuncData->unk_0E);
+ }
+ }
+
+ OLib_Vec3fDiffToVecGeo(&eyeAtOffset, eye, at);
+ Camera_ScaledStepToCeilVec3f(&rwData->eyePosRotTarget.pos, eye, roData->unk_04, roData->unk_04, 0.2f);
+ adjustedPos = focalActorPosRot->pos;
+ adjustedPos.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&adjustedPos, eye);
+ eyeOffset.r = camera->dist;
+ eyeOffset.pitch =
+ Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.x * -1, eyeAtOffset.pitch, roData->unk_04, 5);
+ eyeOffset.yaw = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.y, eyeAtOffset.yaw, roData->unk_04, 5);
+ OLib_AddVecGeoToVec3f(at, eye, &eyeOffset);
+ camera->eyeNext = *eye;
+ Camera_BgCheck(camera, eye, at);
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->fov, camera->fov, roData->unk_04, 0.1f);
+ camera->roll = 0;
+ camera->atLerpStepScale = 0.0f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->roll = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.z, camera->roll, roData->unk_04, 5);
+
+ return 1;
+}
+
+/**
+ * Used for many pivot-based camera settings i.e. camera fixed in position but free to rotate
+ */
+s32 Camera_Fixed2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f spB0;
+ Vec3f spA4;
+ Vec3f sp98;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ f32 temp_f0_3;
+ f32 new_var;
+ BgCamFuncData* bgCamFuncData;
+ VecGeo sp80;
+ PosRot* sp7C;
+ PosRot* sp78;
+ VecGeo sp70;
+ Vec3f* new_var1;
+ Vec3f* new_var2;
+ Player* player;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Actor* actor;
+ Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData;
+ Fixed2ReadWriteData* rwData = &camera->paramData.fixd2.rwData;
+ CameraModeValue* values;
+ Vec3f sp44;
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ //! FAKE
+ if (new_var2) {}
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_SCALED_RO_DATA(values);
+ roData->unk_14 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ rwData->unk_1C = roData->unk_14 * 100.0f;
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ if (bgCamFuncData != NULL) {
+ if (!(roData->interfaceFlags & FIXED2_FLAG_1)) {
+ Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos);
+ } else {
+ if (camera->focalActor != &GET_PLAYER(camera->play)->actor) {
+ player = GET_PLAYER(camera->play);
+ OLib_Vec3fDiffToVecGeo(&sp70, &player->actor.focus.pos, eye);
+ if (sp70.r < roData->unk_04) {
+ sp70.r = roData->unk_04;
+ if (sp70.pitch < 0xBB8) { // 16.5 degrees
+ sp70.pitch = 0xBB8;
+ }
+
+ new_var1 = &player->actor.focus.pos;
+
+ OLib_AddVecGeoToVec3f(&rwData->unk_00, new_var1, &sp70);
+ } else {
+ rwData->unk_00 = *eye;
+ //! FAKE:
+ dummy:;
+ }
+ } else {
+ rwData->unk_00 = camera->eye;
+ }
+ }
+
+ if (bgCamFuncData->fov != -1) {
+ if (roData->interfaceFlags & FIXED2_FLAG_7) {
+ rwData->unk_1C = (bgCamFuncData->fov >> 1) + (bgCamFuncData->fov >> 2);
+ if (rwData->unk_1C < 0x1E) {
+ rwData->unk_1C = 0x1E;
+ }
+ } else {
+ rwData->unk_1C = bgCamFuncData->fov;
+ }
+ }
+
+ if (bgCamFuncData->unk_0E != -1) {
+ rwData->unk_0C = bgCamFuncData->unk_0E;
+ } else {
+ rwData->unk_0C = roData->unk_08;
+ }
+
+ if (bgCamFuncData->unk_10 != -1) {
+ if (roData->interfaceFlags & FIXED2_FLAG_2) {
+ rwData->unk_14 = bgCamFuncData->unk_10 * 0.01f;
+ rwData->unk_18 = roData->unk_0C;
+ } else {
+ temp_f0_3 = bgCamFuncData->unk_10 * 0.01f;
+ rwData->unk_18 = temp_f0_3;
+ rwData->unk_14 = temp_f0_3;
+ }
+ } else {
+ rwData->unk_14 = roData->unk_10;
+ rwData->unk_18 = roData->unk_0C;
+ }
+ if (roData->interfaceFlags & FIXED2_FLAG_4) {
+ if (camera->target == 0) {
+ return 0;
+ }
+ sp7C = &camera->target->home;
+ sp78 = &camera->target->world;
+ OLib_Vec3fDiffToVecGeo(&sp70, &sp7C->pos, &rwData->unk_00);
+ sp70.yaw = sp78->rot.y + (s16)(sp70.yaw - sp7C->rot.y);
+ OLib_AddVecGeoToVec3f(&rwData->unk_00, &sp78->pos, &sp70);
+ }
+ } else {
+ rwData->unk_00 = camera->eye;
+ rwData->unk_0C = roData->unk_08;
+ rwData->unk_14 = roData->unk_10;
+ rwData->unk_18 = roData->unk_0C;
+ }
+ if (rwData->unk_1C <= 360) {
+ rwData->unk_1C *= 100;
+ }
+ if (camera->animState == 20) {
+ rwData->unk_14 = 0.2f;
+ }
+ //! FAKE:
+ if (1) {}
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ //! FAKE:
+ new_var = 0.0f;
+
+ if (roData->interfaceFlags & FIXED2_FLAG_3) {
+ if (camera->target == NULL) {
+ return false;
+ }
+
+ spB0.x = camera->target->focus.pos.x;
+ spB0.y = camera->target->focus.pos.y;
+ spB0.z = camera->target->focus.pos.z;
+
+ camera->focalActorAtOffset.x = spB0.x - focalActorPosRot->pos.x;
+ camera->focalActorAtOffset.y = spB0.y - focalActorPosRot->pos.y;
+ camera->focalActorAtOffset.z = spB0.z - focalActorPosRot->pos.z;
+ } else if (roData->interfaceFlags & FIXED2_FLAG_6) {
+ sp98.x = new_var;
+ sp98.y = roData->unk_00 + focalActorHeight;
+ sp98.z = new_var;
+
+ if (camera->target != NULL) {
+ new_var1 = &camera->focalActor->focus.pos;
+ new_var2 = &camera->target->focus.pos;
+ //! FAKE:
+ sp98.x = ((void)0, new_var) + ((new_var2->x - new_var1->x) * 0.4f);
+ sp98.y += (new_var2->y - new_var1->y) * 0.4f;
+ sp98.z = ((void)0, new_var) + ((new_var2->z - new_var1->z) * 0.4f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, 0.25f, 0.25f, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ } else if (roData->interfaceFlags & FIXED2_FLAG_7) {
+ sp98.x = new_var;
+ sp98.y = roData->unk_00 + focalActorHeight;
+ sp98.z = new_var;
+
+ if (camera->target != NULL) {
+ new_var1 = &camera->focalActor->focus.pos;
+ new_var2 = &camera->target->focus.pos;
+ //! FAKE:
+ sp98.x = ((void)0, new_var) + ((new_var2->x - new_var1->x) * 0.7f);
+ sp98.y += (new_var2->y - new_var1->y) * 0.7f;
+ sp98.z = ((void)0, new_var) + ((new_var2->z - new_var1->z) * 0.7f);
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, 0.25f, 0.25f, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ } else {
+ sp98.x = new_var;
+ sp98.z = new_var;
+
+ if ((((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4000) ||
+ (((Player*)camera->focalActor)->stateFlags1 & PLAYER_STATE1_4)) {
+ sp98.y = roData->unk_00;
+ } else {
+ sp98.y = roData->unk_00 + focalActorHeight;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&sp98, &camera->focalActorAtOffset, rwData->unk_14, rwData->unk_14, 0.1f);
+ spB0.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ spB0.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ spB0.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ }
+
+ if (camera->animState == 0) {
+ Camera_SetUpdateRatesSlow(camera);
+ if (!(roData->interfaceFlags & FIXED2_FLAG_0)) {
+ *at = spB0;
+ OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00);
+ if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) {
+ sp80.r = rwData->unk_0C;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ if (sp80.r < roData->unk_04) {
+ sp80.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ spA4 = rwData->unk_00;
+ }
+ }
+ sp44 = spA4;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ camera->fov = rwData->unk_1C * 0.01f;
+ }
+ }
+
+ Camera_ScaledStepToCeilVec3f(&spB0, at, rwData->unk_14, rwData->unk_14, 1.0f);
+ OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00);
+ if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) {
+ sp80.r = rwData->unk_0C;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else if (sp80.r < roData->unk_04) {
+ sp80.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&spA4, at, &sp80);
+ } else {
+ spA4 = rwData->unk_00;
+ }
+
+ Camera_ScaledStepToCeilVec3f(&spA4, eyeNext, rwData->unk_18, rwData->unk_18, 0.1f);
+ *eye = *eyeNext;
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->roll = 0;
+ camera->xzSpeed = 0;
+ rwData->unk_10 = rwData->unk_1C * 0.01f;
+ camera->fov = Camera_ScaledStepToCeilF(rwData->unk_10, camera->fov, rwData->unk_14, 0.1f);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ camera->animState = 1;
+
+ return true;
+}
+
+/**
+ * Used by the unused PREREND_FIXED Camera Setting. Remnant of OoT
+ */
+s32 Camera_Fixed3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Fixed4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Fixed0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * First person view
+ */
+s32 Camera_Subject1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Vec3f sp90;
+ Vec3f sp84;
+ VecGeo sp7C;
+ VecGeo sp74;
+ VecGeo tgeo;
+ PosRot sp58;
+ f32 sp54;
+ f32 temp_f0_2;
+ s16 sp4E;
+ s16 sp4C;
+ Subject1ReadOnlyData* roData = &camera->paramData.subj1.roData;
+ Subject1ReadWriteData* rwData = &camera->paramData.subj1.rwData;
+ CameraModeValue* values;
+ f32 temp_f0;
+ f32 focalActorHeight;
+
+ Actor_GetFocus(&sp58, camera->focalActor);
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Camera_SetUpdateRatesFastPitch(camera);
+
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight;
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = GET_NEXT_RO_DATA(values);
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->unk_10 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_14 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_18 = GET_NEXT_RO_DATA(values) * 0.1f;
+ roData->unk_1C = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+
+ sp7C.r = roData->unk_08;
+ sp7C.yaw = BINANG_ROT180(sp58.rot.y);
+ sp7C.pitch = sp58.rot.x;
+ sp90 = sp58.pos;
+ sp90.y += roData->unk_00;
+
+ OLib_AddVecGeoToVec3f(&sp84, &sp90, &sp7C);
+ OLib_Vec3fDiffToVecGeo(&sp74, &camera->at, eye);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->play->view.unk164 == 0) {
+ camera->play->view.unk164 = camera->camId | 0x50;
+ return true;
+ }
+
+ if (RELOAD_PARAMS(camera)) {
+ rwData->unk_00 = sp74.r;
+ rwData->unk_04 = sp74.yaw;
+ rwData->unk_06 = sp74.pitch;
+
+ if (roData->interfaceFlags & SUBJECT1_FLAG_4) {
+ camera->fov = roData->unk_1C;
+ rwData->timer = 0;
+ } else {
+ rwData->timer = 6;
+ }
+ camera->dist = roData->unk_08;
+ camera->rUpdateRateInv = 1.0f;
+ camera->animState++;
+ camera->dist = roData->unk_08;
+ }
+
+ tgeo.r = rwData->unk_00;
+ tgeo.pitch = rwData->unk_04;
+ tgeo.yaw = rwData->unk_06;
+
+ if (rwData->timer != 0) {
+ temp_f0 = (1.0f / rwData->timer);
+
+ VEC3F_LERPIMPDST(at, at, &sp90, temp_f0);
+
+ sp54 = ((tgeo.r - sp7C.r) * (1.0f / 6.0f));
+ sp4E = BINANG_SUB(tgeo.pitch, sp7C.yaw) * (1.0f / 6.0f);
+ sp4C = BINANG_SUB(tgeo.yaw, sp7C.pitch) * (1.0f / 6.0f);
+
+ sp74.r = Camera_ScaledStepToCeilF((rwData->timer * sp54) + sp7C.r, sp74.r, 0.5f, 1.0f);
+ sp74.yaw = Camera_ScaledStepToCeilS(sp7C.yaw + (sp4E * rwData->timer), sp74.yaw, 0.5f, 5);
+ sp74.pitch = Camera_ScaledStepToCeilS(sp7C.pitch + (sp4C * rwData->timer), sp74.pitch, 0.5f, 5);
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp74);
+ *eye = *eyeNext;
+ rwData->timer--;
+ } else {
+ sp54 = Math_SinS(-sp58.rot.x);
+ temp_f0_2 = Math_CosS(-sp58.rot.x);
+
+ sp90.x = roData->unk_10;
+ sp90.y = (roData->unk_14 * temp_f0_2) - (roData->unk_18 * sp54);
+ sp90.z = (roData->unk_14 * sp54) + (roData->unk_18 * temp_f0_2);
+
+ sp54 = Math_SinS(BINANG_ROT180(sp58.rot.y));
+ temp_f0_2 = Math_CosS(BINANG_ROT180(sp58.rot.y));
+
+ roData->unk_10 = (sp90.z * sp54) + (sp90.x * temp_f0_2);
+ roData->unk_14 = sp90.y;
+ roData->unk_18 = (sp90.z * temp_f0_2) - (sp90.x * sp54);
+
+ at->x = roData->unk_10 + sp58.pos.x;
+ at->y = roData->unk_14 + sp58.pos.y;
+ at->z = roData->unk_18 + sp58.pos.z;
+
+ sp74.r = roData->unk_08;
+ sp74.yaw = BINANG_ROT180(sp58.rot.y);
+ sp74.pitch = sp58.rot.x;
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &sp74);
+ sp74.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(eye, at, &sp74);
+ }
+
+ // TODO: is skyboxDisabled accurate here?
+ if (camera->play->envCtx.skyboxDisabled == 0) {
+ Camera_BgCheck(camera, at, eye);
+ } else {
+ func_800CBFA4(camera, at, eye, 3);
+ }
+
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_1C, camera->fov, 0.25f, 0.1f);
+ camera->roll = 0;
+ camera->atLerpStepScale = 0.0f;
+
+ return true;
+}
+
+s32 Camera_Subject2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Subject0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data1(Camera* camera) {
+ return Camera_Normal1(camera);
+}
+
+s32 Camera_Data2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Data4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Player diving from the surface of the water to underwater not as zora
+ * Also used when using a door to leave a scene
+ */
+s32 Camera_Unique2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ f32 phi_f16;
+ Vec3f sp70;
+ VecGeo sp68;
+ VecGeo sp60;
+ s32 pad[3];
+ Unique2ReadOnlyData* roData = &camera->paramData.uniq2.roData;
+ Unique2ReadWriteData* rwData = &camera->paramData.uniq2.rwData;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ Vec3f* eyeNext = &camera->eyeNext;
+ CameraModeValue* values;
+
+ OLib_Vec3fDiffToVecGeo(&sp60, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 =
+ GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->unk_08 = 0.25f;
+ roData->unk_0C = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if ((camera->animState == 0) || (rwData->unk_04 != roData->interfaceFlags)) {
+ rwData->unk_04 = roData->interfaceFlags;
+ }
+
+ if (camera->animState == 0) {
+ camera->animState = 1;
+ Camera_SetUpdateRatesSlow(camera);
+ rwData->unk_00 = 200.0f;
+ }
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_4) {
+ *eyeNext = *eye;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ }
+
+ sp70 = camera->focalActorPosRot.pos;
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_0) {
+ phi_f16 = 1.0f;
+ } else {
+ phi_f16 = camera->speedRatio;
+ }
+
+ at->x += (sp70.x - at->x) * phi_f16 * 0.3f;
+ at->y += ((sp70.y + focalActorHeight + roData->unk_00) - at->y) * 0.2f;
+ at->z += (sp70.z - at->z) * phi_f16 * 0.3f;
+
+ rwData->unk_00 = rwData->unk_00 + ((2.0f - rwData->unk_00) * 0.05f);
+
+ if (roData->interfaceFlags & UNIQUE2_FLAG_0) {
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sp68.r = roData->unk_04;
+ OLib_AddVecGeoToVec3f(&sp70, at, &sp68);
+ Camera_ScaledStepToCeilVec3f(&sp70, eye, roData->unk_08, roData->unk_08, 0.2f);
+ } else if (roData->interfaceFlags & UNIQUE2_FLAG_1) {
+ if (OLib_Vec3fDistXZ(at, eyeNext) < roData->unk_04) {
+ OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext);
+ sp68.yaw = Camera_ScaledStepToCeilS(sp68.yaw, sp60.yaw, 0.1f, 5);
+ sp68.r = roData->unk_04;
+ sp68.pitch = 0;
+ OLib_AddVecGeoToVec3f(eye, at, &sp68);
+ eye->y = eyeNext->y;
+ } else {
+ Camera_ScaledStepToCeilVec3f(eyeNext, eye, roData->unk_08, roData->unk_08, 0.2f);
+ }
+ }
+
+ if (!(roData->interfaceFlags & UNIQUE2_FLAG_5)) {
+ Camera_BgCheck(camera, at, eye);
+ }
+
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->roll = 0;
+ camera->fov = Camera_ScaledStepToCeilF(roData->unk_0C, camera->fov, 0.2f, 0.1f);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+
+ return true;
+}
+
+/**
+ * Woodfall inside the Swamp, used for normal camModes and derivative modes
+ */
+s32 Camera_Unique3(Camera* camera) {
+ s32 ret = Camera_Normal1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Woodfall inside the Swamp, used for parallel camModes and derivative modes
+ */
+s32 Camera_Unique4(Camera* camera) {
+ s32 ret = Camera_Parallel1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Woodfall inside the Swamp, used for battle camMode
+ */
+s32 Camera_Unique5(Camera* camera) {
+ s32 ret = Camera_Battle1(camera);
+
+ if ((camera->play->sceneId == SCENE_21MITURINMAE) && (camera->eye.y < 5.0f)) {
+ camera->eye.y = 5.0f;
+ }
+ return ret;
+}
+
+/**
+ * Entering a room or scene (camera settings START0/START1/START2)
+ */
+s32 Camera_Unique0(Camera* camera) {
+ f32 playerHeight;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ PosRot sp9C;
+ Player* player;
+ Vec3f sp8C;
+ VecGeo sp84;
+ VecGeo sp7C;
+ BgCamFuncData* bgCamFuncData;
+ f32 sp74;
+ s32 pad;
+ s16 temp_v1;
+ Unique0ReadOnlyData* roData = &camera->paramData.uniq0.roData;
+ Unique0ReadWriteData* rwData = &camera->paramData.uniq0.rwData;
+ CameraModeValue* values;
+ Vec3f sp54;
+
+ playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ player = (Player*)camera->focalActor;
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->unk_00 = GET_NEXT_RO_DATA(values);
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&sp7C, &camera->at, &camera->eye);
+
+ if (player->rideActor != NULL) {
+ Actor_GetWorld(&sp9C, player->rideActor);
+ sp8C = sp9C.pos;
+ sp8C.y += playerHeight + 20.0f;
+ } else {
+ sp8C = camera->focalActorPosRot.pos;
+ sp8C.y += playerHeight;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(&rwData->unk_1C, &bgCamFuncData->pos);
+ camera->eye = camera->eyeNext = rwData->unk_1C;
+ rwData->unk_34 = bgCamFuncData->rot;
+
+ temp_v1 = bgCamFuncData->fov;
+ if (temp_v1 != -1) {
+ if (temp_v1 <= 360) {
+ camera->fov = temp_v1;
+ } else {
+ camera->fov = temp_v1 * 0.01f;
+ }
+ }
+
+ rwData->timer = bgCamFuncData->unk_0E;
+ if (rwData->timer == -1) {
+ rwData->timer = 60;
+ }
+
+ if (bgCamFuncData->unk_10 != -1) {
+ rwData->unk_18 = bgCamFuncData->unk_10 * 0.01f;
+ } else {
+ rwData->unk_18 = roData->unk_04 * 0.01f;
+ }
+
+ rwData->unk_00 = focalActorPosRot->pos;
+ if (roData->interfaceFlags & UNIQUE0_FLAG_4) {
+ rwData->unk_0C.x = focalActorPosRot->pos.x;
+ rwData->unk_0C.y = focalActorPosRot->pos.y + playerHeight + roData->unk_00;
+ rwData->unk_0C.z = focalActorPosRot->pos.z;
+ }
+ rwData->unk_3A = camera->focalActor->world.rot.y;
+ rwData->unk_3E = 0;
+ camera->eye = camera->eyeNext = rwData->unk_1C;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ camera->animState++;
+ // fallthrough
+ case 1:
+ sp84.r = OLib_Vec3fDist(&sp8C, &camera->eye);
+ sp84.yaw = rwData->unk_34.y;
+ sp84.pitch = -rwData->unk_34.x;
+ OLib_VecGeoToVec3f(&rwData->unk_28, &sp84);
+ func_80179A44(&rwData->unk_1C, focalActorPosRot, &rwData->unk_0C);
+ camera->at = rwData->unk_0C;
+
+ if (player->stateFlags1 & PLAYER_STATE1_20000000) {
+ rwData->unk_00 = focalActorPosRot->pos;
+ }
+
+ if (roData->interfaceFlags & UNIQUE0_FLAG_4) {
+ sp54.x = focalActorPosRot->pos.x;
+ sp54.y = focalActorPosRot->pos.y + playerHeight + roData->unk_00;
+ sp54.z = focalActorPosRot->pos.z;
+ Camera_ScaledStepToCeilVec3f(&sp54, &camera->at, camera->xzOffsetUpdateRate, camera->yOffsetUpdateRate,
+ 0.1f);
+ camera->yOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(rwData->unk_18, camera->yOffsetUpdateRate, 0.1f, 0.0001f);
+ camera->xzOffsetUpdateRate =
+ Camera_ScaledStepToCeilF(rwData->unk_18, camera->xzOffsetUpdateRate, 0.1f, 0.0001f);
+ }
+
+ if ((camera->animState == 999) || (camera->animState == 666)) {
+ rwData->unk_3E = 2;
+ }
+
+ if (roData->interfaceFlags & UNIQUE0_FLAG_0) {
+ if (rwData->timer > 0) {
+ rwData->timer--;
+ rwData->unk_00 = focalActorPosRot->pos;
+ } else if (!(player->stateFlags1 & PLAYER_STATE1_20000000) &&
+ ((OLib_Vec3fDistXZ(&focalActorPosRot->pos, &rwData->unk_00) >= 10.0f) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & UNIQUE0_FLAG_1))) {
+ rwData->unk_3E = 1;
+ }
+ } else {
+ if (rwData->timer > 0) {
+ rwData->timer--;
+ if (rwData->timer == 0) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ }
+ } else {
+ rwData->unk_00 = focalActorPosRot->pos;
+ }
+
+ if (!(player->stateFlags1 & PLAYER_STATE1_20000000)) { // TODO: Merge into 1 if-statement
+ if ((rwData->unk_3A != camera->focalActor->world.rot.y) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & UNIQUE0_FLAG_1)) {
+ rwData->unk_3E = 1;
+ }
+ }
+ }
+ break;
+
+ case 3:
+ sp74 = 1.0f / rwData->timer;
+ sp8C.y -= playerHeight * 0.2f;
+
+ Camera_ScaledStepToCeilVec3f(&sp8C, &camera->at, sp74, sp74, 0.001f);
+
+ sp84.r = OLib_Vec3fDist(&camera->at, &camera->eye);
+ sp84.pitch = sp7C.pitch;
+ sp84.yaw = sp7C.yaw;
+ sp84.r = Camera_ScaledStepToCeilF(100.0f, sp84.r, sp74, 1.0f);
+
+ OLib_AddVecGeoToVec3f(&sp8C, &camera->at, &sp84);
+
+ sp74 = (QREG(64) * 0.01f) + 0.2f;
+
+ Camera_ScaledStepToCeilVec3f(&sp8C, &camera->eye, sp74, sp74, 0.001f);
+
+ rwData->timer--;
+ if (rwData->timer == 0) {
+ rwData->unk_3E = 9;
+ }
+ break;
+ }
+
+ if ((rwData->unk_3E == 1) || (rwData->unk_3E == 2) || (rwData->unk_3E == 9)) {
+ camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ camera->atLerpStepScale = 0.0f;
+
+ Camera_ChangeSettingFlags(camera, camera->prevSetting, CAM_CHANGE_SETTING_1);
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+
+ camera->yawUpdateRateInv = 1200.0f;
+ camera->pitchUpdateRateInv = 1200.0f;
+ camera->yOffsetUpdateRate = 0.001f;
+ camera->xzOffsetUpdateRate = 0.001f;
+ camera->fovUpdateRate = 0.01f;
+ }
+
+ return true;
+}
+
+/**
+ * Does the minimal amount of camera update.
+ * Allows for manual control of camera parameters without interference from update
+ */
+s32 Camera_Unique6(Camera* camera) {
+ f32 focalActorHeight;
+ CameraModeValue* values;
+ Vec3f playerPosDisp;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Unique6ReadOnlyData* roData = &camera->paramData.uniq6.roData;
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ Camera_SetUpdateRatesFastPitch(camera);
+ }
+
+ if (camera->focalActor != NULL) {
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ playerPosDisp = focalActorPosRot->pos;
+ playerPosDisp.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&playerPosDisp, &camera->eye);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else {
+ camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
+ }
+
+ if (roData->interfaceFlags & UNIQUE6_FLAG_0) {
+ if (camera->timer > 0) {
+ camera->timer--;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Used by the unused PREREND_PIVOT Camera Setting. Remnant of OoT
+ */
+s32 Camera_Unique7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique8(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Unique9(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Used by unknown settings DEMO0 and ATTENTION
+ */
+s32 Camera_Demo1(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* targetPosRot = &camera->targetPosRot;
+ f32 temp_f0;
+ Actor* sp98[1];
+ s16 screenX;
+ s16 screenY;
+ s32 phi_v0;
+ VecGeo sp88;
+ PosRot sp74;
+ PosRot targetHead;
+ Demo1ReadOnlyData* roData = &camera->paramData.demo1.roData;
+ Demo1ReadWriteData* rwData = &camera->paramData.demo1.rwData;
+ s32 pad;
+
+ if (camera->animState == 0) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ if (camera->animState == 0) {
+ rwData->unk_1C = 0;
+ OLib_Vec3fDiffToVecGeo(&rwData->unk_0C, &camera->targetPosRot.pos, eye);
+ OLib_Vec3fDiffToVecGeo(&rwData->unk_14, &camera->at, eye);
+ Actor_GetFocus(&targetHead, camera->target);
+ Actor_GetWorld(&sp74, camera->target);
+ camera->targetPosRot.pos.x = (sp74.pos.x + targetHead.pos.x) * 0.5f;
+ camera->targetPosRot.pos.y = (sp74.pos.y + targetHead.pos.y) * 0.5f;
+ camera->targetPosRot.pos.z = (sp74.pos.z + targetHead.pos.z) * 0.5f;
+ camera->targetPosRot.rot = targetHead.rot;
+ camera->animState++;
+ }
+
+ Actor_GetScreenPos(camera->play, camera->target, &screenX, &screenY);
+
+ temp_f0 = rwData->unk_0C.r;
+ if ((screenX > 20) && (screenX < (SCREEN_WIDTH - 20)) && (screenY > 40) && (screenY < (SCREEN_HEIGHT - 40))) {
+ if (temp_f0 < 700.0f) {
+ phi_v0 = 0;
+ } else {
+ phi_v0 = 1;
+ }
+ } else if (temp_f0 < 50.0f) {
+ phi_v0 = 2;
+ } else if (temp_f0 < 300.0f) {
+ phi_v0 = 3;
+ } else if (temp_f0 < 700.0f) {
+ phi_v0 = 4;
+ } else {
+ phi_v0 = 5;
+ }
+
+ if (camera->target->category == ACTORCAT_DOOR) {
+ if ((phi_v0 > 0) && (phi_v0 < 5)) {
+ phi_v0 = 6;
+ } else if (phi_v0 >= 5) {
+ phi_v0 = 7;
+ }
+ }
+
+ if (camera->target->category == ACTORCAT_CHEST) {
+ if ((phi_v0 > 1) && (phi_v0 < 5)) {
+ phi_v0 = 8;
+ }
+ }
+
+ switch (phi_v0) {
+ Vec3f sp44;
+
+ case 1:
+ Camera_ScaledStepToCeilVec3f(&camera->targetPosRot.pos, at, 0.1f, 0.1f, 0.1f);
+ OLib_Vec3fDiffToVecGeo(&sp88, at, eye);
+ sp88.r = rwData->unk_0C.r;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &sp88);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 2:
+ Camera_ScaledStepToCeilVec3f(&camera->targetPosRot.pos, &camera->at, 0.1f, 0.1f, 0.1f);
+ break;
+
+ case 3:
+ eyeNext = &targetPosRot->pos;
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_14, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(eyeNext, at, 0.1f, 0.1f, 0.1f);
+ eyeNext = &camera->eyeNext;
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 4:
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ rwData->unk_14.r = rwData->unk_0C.r;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_14, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 5:
+ eyeNext = &targetPosRot->pos;
+ if (rwData->unk_1C == 0) {
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ *at = *eyeNext;
+ sp44 = rwData->unk_00;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ break;
+
+ case 6:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ rwData->unk_0C.r = rwData->unk_14.r;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+
+ case 7:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ *at = targetPosRot->pos;
+ sp44 = rwData->unk_00;
+ camera->eyeNext = sp44;
+ *eye = sp44;
+ break;
+
+ case 8:
+ if (rwData->unk_1C == 0) {
+ rwData->unk_0C.yaw = camera->target->shape.rot.y;
+ sp98[0] = camera->target;
+ func_800CC260(camera, &rwData->unk_00, &targetPosRot->pos, &rwData->unk_0C, sp98, 1);
+ }
+ Camera_ScaledStepToCeilVec3f(&targetPosRot->pos, at, 0.1f, 0.1f, 0.1f);
+ Camera_ScaledStepToCeilVec3f(&rwData->unk_00, eyeNext, 0.1f, 0.1f, 0.1f);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, at, eye);
+ break;
+ }
+
+ rwData->unk_1C++;
+
+ return true;
+}
// Data for opening chests (default)
-VecSph D_801B9E64[] = {
+VecGeo D_801B9E64[] = {
{ 50.0f, 0xEE3A, 0xD558 },
{ 75.0f, 0x0000, 0x8008 },
{ 80.0f, 0xEE3A, 0x8008 },
@@ -713,7 +5960,7 @@ Vec3f D_801B9E84[] = {
};
// Data for opening chests (goron)
-VecSph D_801B9EB4[] = {
+VecGeo D_801B9EB4[] = {
{ 60.0f, 0xEE3A, 0xD558 },
{ 95.0f, 0x0000, 0x8008 },
{ 90.0f, 0xEE3A, 0x8008 },
@@ -726,140 +5973,2312 @@ Vec3f D_801B9ED4[] = {
{ 0.0f, 3.0f, -3.0f },
};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo2.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo3.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo5.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo6.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo7.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo9.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Demo0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special1.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special2.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special3.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special5.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special6.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special7.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Special9.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Alloc.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Free.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DDFE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE0E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_InitPlayerSettings.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeStatus.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE324.s")
-
-s16 sEarthquakeFreq[] = {
- 0xFFC, // 1 Large Earthquake between CLOCK_TIME(0, 00) to CLOCK_TIME(1, 30)
- 0x7FC, // 2 Large Earthquakes between CLOCK_TIME(1, 30) to CLOCK_TIME(3, 00)
- 0x3FC, // 4 Large Earthquakes between CLOCK_TIME(3, 00) to CLOCK_TIME(4, 30)
- 0x1FC, // 8 Large Earthquakes between CLOCK_TIME(4, 30) to CLOCK_TIME(6, 00)
-};
-s16 sEarthquakeTimer = 0;
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE840.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE890.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE954.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Update.s")
-
-s32 sModeChangeFlags = 0;
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF498.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetMode.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeMode.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF86C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF8EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeSetting.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDir.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_AddQuake.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetViewParam.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFEF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetFlags.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ClearFlags.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Copy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0228.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0238.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetToTrackActor.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetTargetActor.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetWaterYPos.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0348.s")
+/**
+ * Opening large chests.
+ * The camera position will be at a fixed point, and rotate around at different intervals.
+ * The direction, and initial position is dependent on when the camera was started.
+ */
+s32 Camera_Demo2(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo atToEye;
+ VecGeo eyeOffset;
+ VecGeo atOffset;
+ Vec3f sp7C;
+ Vec3f sp70;
+ Vec3f sp64;
+ f32 sp60;
+ s32 pad;
+ u8 skipUpdateEye = false;
+ f32 playerHeight = Player_GetHeight((Player*)camera->focalActor);
+ s16 angle;
+ VecGeo* sp4C = D_801B9E64;
+ Vec3f* sp48 = D_801B9E84;
+ Actor* focalActor = camera->focalActor;
+ Demo2ReadOnlyData* roData = &camera->paramData.demo2.roData;
+ Demo2ReadWriteData* rwData = &camera->paramData.demo2.rwData;
+
+ if (((focalActor == &GET_PLAYER(camera->play)->actor) &&
+ (((Player*)focalActor)->transformation == PLAYER_FORM_GORON))) {
+ sp4C = D_801B9EB4;
+ sp48 = D_801B9ED4;
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->unk_04 = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ Camera_UnsetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2);
+ Camera_SetUpdateRatesSlow(camera);
+ camera->fov = roData->fov;
+ camera->roll = rwData->animFrame = 0;
+ rwData->initialAt = focalActorPosRot->pos;
+ if (camera->focalActorFloorHeight != BGCHECK_Y_MIN) {
+ rwData->initialAt.y = camera->focalActorFloorHeight;
+ }
+ angle = focalActorPosRot->rot.y;
+ sp70.x = rwData->initialAt.x + (Math_SinS(angle) * 40.0f);
+ sp70.y = rwData->initialAt.y + 40.0f;
+ sp70.z = rwData->initialAt.z + (Math_CosS(angle) * 40.0f);
+ if (camera->play->state.frames & 2) {
+ angle -= 0x4000;
+ rwData->yawDir = 1;
+ } else {
+ angle += 0x4000;
+ rwData->yawDir = -1;
+ }
+
+ sp7C.x = sp70.x + (sp4C[1].r * Math_SinS(angle));
+ sp7C.y = rwData->initialAt.y + 5.0f;
+ sp7C.z = sp70.z + (sp4C[1].r * Math_CosS(angle));
+ if (Camera_BgCheck(camera, &sp70, &sp7C)) {
+ rwData->yawDir = -rwData->yawDir;
+ }
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp48[0]);
+ atOffset.yaw += focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ eyeOffset.r = sp4C[0].r;
+ eyeOffset.pitch = sp4C[0].pitch;
+ eyeOffset.yaw = (sp4C[0].yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C = 1.0f;
+ break;
+
+ case 1:
+ // This is the case taken for nearly the entire cutscene
+ sp60 = (rwData->animFrame - 2) * (1.0f / 146.0f);
+
+ VEC3F_LERPIMPDST(&sp64, &sp48[0], &sp48[1], sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[0].r, sp4C[1].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[0].pitch, sp4C[1].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[0].yaw, sp4C[1].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C -= (1.0f / 365.0f);
+ break;
+
+ case 2:
+ sp60 = (rwData->animFrame - 148) * 0.1f;
+
+ sp64.x = LERPIMP(sp48[1].x, sp48[2].x, sp60);
+ sp64.y = LERPIMP((sp48[1].y - playerHeight), sp48[2].y, sp60);
+ sp64.y += playerHeight;
+ sp64.z = LERPIMP(sp48[1].z, sp48[2].z, sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[1].r, sp4C[2].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[1].pitch, sp4C[2].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[1].yaw, sp4C[2].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C -= 0.04f;
+ break;
+
+ case 3:
+ sp60 = (rwData->animFrame - 159) * (1.0f / 9.0f);
+
+ sp64.x = LERPIMP(sp48[2].x, sp48[3].x, sp60);
+ sp64.y = LERPIMP(sp48[2].y, sp48[3].y, sp60);
+ sp64.y += playerHeight;
+ sp64.z = LERPIMP(sp48[2].z, sp48[3].z, sp60);
+
+ OLib_Vec3fToVecGeo(&atOffset, &sp64);
+ atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+ OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset);
+
+ atOffset.r = LERPIMP(sp4C[2].r, sp4C[3].r, sp60);
+ atOffset.pitch = BINANG_LERPIMP(sp4C[2].pitch, sp4C[3].pitch, sp60);
+ atOffset.yaw = BINANG_LERPIMP(sp4C[2].yaw, sp4C[3].yaw, sp60);
+
+ eyeOffset.r = atOffset.r;
+ eyeOffset.pitch = atOffset.pitch;
+ eyeOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y;
+
+ rwData->unk_0C += (4.0f / 45.0f);
+ break;
+
+ case 30:
+ Camera_SetStateFlag(camera, CAM_STATE_10);
+ if (camera->stateFlags & CAM_STATE_3) {
+ camera->animState = 4;
+ }
+ // fallthrough
+ case 10:
+ case 20:
+ // Taken on the 1st and 158th animation frame
+ skipUpdateEye = true;
+ break;
+ case 4:
+ eyeOffset.r = 80.0f;
+ eyeOffset.pitch = 0;
+ eyeOffset.yaw = atToEye.yaw;
+ rwData->unk_0C = 0.1f;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_A, 0);
+
+ if (!(((rwData->animFrame < 0) || (camera->xzSpeed > 0.001f) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) &&
+ (camera->stateFlags & CAM_STATE_3))) {
+ goto skipeyeUpdate;
+ }
+ // fallthrough
+ default:
+ Camera_SetStateFlag(camera, CAM_STATE_4 | CAM_STATE_2);
+ Camera_UnsetStateFlag(camera, CAM_STATE_3);
+ func_800CC938(camera);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+ skipeyeUpdate:
+ skipUpdateEye = true;
+ break;
+ }
+
+ rwData->animFrame++;
+
+ /**
+ * Opening a large chest only lasts 135 frames
+ *
+ * So for one frame, the animState is set to 10,
+ * allowing the static data to be loaded into the subCamera mini-heap
+ *
+ * For the remainder of the cutscene, animState is set to 1
+ */
+ if (rwData->animFrame == 1) {
+ camera->animState = 10;
+ } else if (rwData->animFrame == 2) {
+ camera->animState = 1;
+ } else if (rwData->animFrame == 148) {
+ camera->animState = 2;
+ } else if (rwData->animFrame == 158) {
+ camera->animState = 20;
+ } else if (rwData->animFrame == 159) {
+ camera->animState = 3;
+ } else if (rwData->animFrame == 168) {
+ camera->animState = 30;
+ } else if (rwData->animFrame == 228) {
+ camera->animState = 4;
+ }
+
+ if (!skipUpdateEye) {
+ eyeOffset.r = Camera_ScaledStepToCeilF(eyeOffset.r, atToEye.r, rwData->unk_0C, 1.0f);
+ eyeOffset.pitch = Camera_ScaledStepToCeilS(eyeOffset.pitch, atToEye.pitch, rwData->unk_0C, 5);
+ eyeOffset.yaw = Camera_ScaledStepToCeilS(eyeOffset.yaw, atToEye.yaw, rwData->unk_0C, 5);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &eyeOffset);
+ *eye = *eyeNext;
+ }
+
+ camera->dist = OLib_Vec3fDist(at, eye);
+ camera->atLerpStepScale = 0.1f;
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ return true;
+}
+
+/**
+ * Taking the warp pad from the start of a dungeon to the boss-room
+ */
+s32 Camera_Demo3(Camera* camera) {
+ s32 pad2;
+ f32 temp;
+ CameraModeValue* values;
+ VecGeo atToEye;
+ PosRot focalActorFocus;
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ Demo3ReadOnlyData* roData = &camera->paramData.demo3.roData;
+ Demo3ReadWriteData* rwData = &camera->paramData.demo3.rwData;
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ focalActorFocus.pos.x = camera->focalActorPosRot.pos.x;
+ focalActorFocus.pos.z = camera->focalActorPosRot.pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.4f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ }
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ // Init Data
+ camera->animState++;
+ rwData->timer = 125;
+ Distortion_Request(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_SetDuration(60);
+ break;
+
+ case 1:
+ // Zoom into player, start to rise
+ temp = 1.0f / rwData->timer;
+ atToEye.r = Camera_ScaledStepToCeilF(140.0f, atToEye.r, temp, 0.1f);
+ rwData->timer--;
+ camera->fov = Camera_ScaledStepToCeilF(50.0f, camera->fov, 0.1f, 0.1f);
+ if (rwData->timer <= 0) {
+ rwData->timer = 20;
+ camera->animState++;
+ Distortion_Request(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_SetDuration(80);
+ }
+ break;
+
+ case 2:
+ // continue rising
+ rwData->timer--;
+ if (rwData->timer <= 0) {
+ rwData->unk_04 = 120;
+ rwData->timer = 0;
+ rwData->unk_00 = (175.0f - camera->fov) / rwData->unk_04;
+ camera->animState++;
+ Distortion_Request(DISTORTION_TYPE_BOSS_WARP);
+ Distortion_SetDuration(15);
+ }
+ break;
+
+ case 3:
+ rwData->timer++;
+ camera->fov += rwData->unk_00 * rwData->timer;
+ if (rwData->timer >= 15) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_BOSS_WARP);
+ Distortion_RemoveRequest(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
+ camera->animState++;
+ }
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye);
+ *eye = *eyeNext;
+ return true;
+}
+
+/**
+ * Mask Transformation Cutscene 0:
+ * starting as a human and transforming into anything else
+ */
+s32 Camera_Demo4(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ VecGeo atToEye;
+ CameraModeValue* values;
+ PosRot focalActorFocus;
+ f32 sp58;
+ f32 sin;
+ Demo4ReadOnlyData* roData = &camera->paramData.demo4.roData;
+ Demo4ReadWriteData* rwData = &camera->paramData.demo4.rwData;
+ s32 pad[2];
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ rwData->unk_00 = *at;
+ rwData->unk_18 = atToEye;
+ rwData->unk_14 = camera->fov;
+ }
+
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ //! FAKE:
+ if (1) {}
+ case 0:
+ camera->animState++;
+ rwData->timer = 0;
+
+ if (!(atToEye.r < 40.0f)) {
+ atToEye.r = 40.0f;
+ }
+
+ camera->fov = 80.0f;
+ rwData->unk_10 = (Rand_ZeroOne() - 0.5f) * 40.0f;
+ // fallthrough
+ case 1:
+ // Camera fixed on human player as the mask moves from the pocket to the face
+ // Camera rolls left and right
+ if (rwData->timer >= 12) {
+ rwData->unk_0C = (rwData->timer - 12) * (135.0f / 13.0f);
+ sin = Math_SinF(DEG_TO_RAD(rwData->unk_0C));
+ rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin;
+ if (rwData->timer == 12) {
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_SetDuration(26);
+ }
+ } else {
+ rwData->unk_0C = 0.0f;
+ }
+
+ sp58 = rwData->timer * (6.0f / 19.0f);
+ rwData->unk_20 = focalActorPosRot->rot.y + 0x4000;
+ focalActorFocus.pos.x = (Math_SinS(rwData->unk_20) * sp58 * rwData->unk_0C) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = (Math_CosS(rwData->unk_20) * sp58 * rwData->unk_0C) + focalActorPosRot->pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - focalActorPosRot->pos.y) * 0.099999994f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.2f, 0.2f, 0.1f);
+
+ sp58 = (rwData->timer * (30.0f / 19.0f));
+ camera->roll = CAM_DEG_TO_BINANG(sp58 * rwData->unk_0C);
+
+ sp58 = 1.0f / (38 - rwData->timer);
+ rwData->timer++;
+ atToEye.r = Camera_ScaledStepToCeilF(30.0f, atToEye.r, sp58, 0.1f);
+ atToEye.pitch = 0;
+
+ if (rwData->timer >= 38) {
+ rwData->timer = 24;
+ camera->animState++;
+ rwData->unk_0C = (32.0f - camera->fov) / 24.0f;
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ }
+ break;
+
+ case 2:
+ // Camera steadies as human player is fully croutched down and hiding face
+ if (rwData->timer == 24) {
+ at->x = (Math_SinS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.x;
+ at->y = focalActorFocus.pos.y - ((focalActorFocus.pos.y - focalActorPosRot->pos.y) * 0.1f);
+ at->z = (Math_CosS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.z;
+ } else {
+ focalActorFocus.pos.x = (Math_SinS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ focalActorFocus.pos.z = (Math_CosS(focalActorPosRot->rot.y) * -7.0f) + focalActorPosRot->pos.z;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.25f, 0.25f, 0.1f);
+ }
+
+ if (rwData->timer > 0) {
+ camera->fov += rwData->unk_0C;
+ }
+
+ rwData->timer--;
+
+ atToEye.r = 35.0f;
+ atToEye.pitch = 0x2000;
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+
+ if (rwData->timer <= 0) {
+ rwData->unk_20 = 630;
+ rwData->timer = 0;
+ rwData->unk_0C = (60.0f - camera->fov) / rwData->unk_20;
+ camera->animState = 3;
+ }
+ break;
+
+ case 3:
+ // Camera zooms into human players face with bulging eyes
+ focalActorFocus.pos.x = focalActorPosRot->pos.x;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ focalActorFocus.pos.z = focalActorPosRot->pos.z;
+
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.25f, 0.25f, 0.1f);
+
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.1f, 5);
+ rwData->timer++;
+ camera->fov += rwData->unk_0C * rwData->timer;
+ atToEye.pitch = 0x2000;
+ atToEye.r = 35.0f;
+
+ if (rwData->timer >= 35) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ camera->animState = 4;
+ }
+ break;
+
+ case 999:
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_2);
+ camera->animState = 4;
+ break;
+
+ case 4:
+ // Camera backs up as player is now in a transformed state
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ atToEye = rwData->unk_18;
+ camera->fov = rwData->unk_14;
+ camera->roll = 0;
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &atToEye);
+ *eye = camera->eyeNext;
+
+ return true;
+}
+
+/**
+ * Mask Transformation Cutscene 1:
+ * starting as non-human/fierce diety and transforming into anything else
+ */
+s32 Camera_Demo5(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ VecGeo atToEye;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ PosRot focalActorFocus;
+ f32 new_var;
+ f32 sp58;
+ f32 sin;
+ Demo5ReadOnlyData* roData = &camera->paramData.demo5.roData;
+ Demo5ReadWriteData* rwData = &camera->paramData.demo5.rwData;
+ CameraModeValue* values;
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+
+ if (RELOAD_PARAMS(camera)) {
+ values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ camera->animState = 0;
+ rwData->unk_00 = *at;
+ rwData->unk_1C = atToEye;
+ rwData->unk_18 = camera->fov;
+ }
+
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ camera->animState++;
+ atToEye.pitch = 0;
+ rwData->timer = 0x12;
+ rwData->unk_14 = 80.0f;
+ atToEye.r = 30.0f;
+ camera->fov = 80.0f;
+ rwData->unk_10 = (Rand_ZeroOne() - 0.5f) * 40.0f;
+ camera->roll = 0;
+ focalActorFocus.pos.x = focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = focalActorPosRot->pos.z;
+ *at = focalActorFocus.pos;
+ // fallthrough
+ case 1:
+ // Camera remains still as player moves hands to face
+ rwData->timer--;
+ if (rwData->timer <= 0) {
+ rwData->timer = 0;
+ camera->animState = 2;
+ rwData->unk_24 = camera->focalActorPosRot.rot.y + 0x4000;
+ rwData->timer = 46;
+ Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ Distortion_SetDuration(46);
+ }
+ break;
+
+ case 2:
+ // Camera zooms out while rolling back and forth
+ rwData->unk_0C = rwData->timer * (180.0f / 23.0f);
+ sp58 = DEG_TO_RAD(rwData->unk_0C);
+ sin = Math_SinF(sp58);
+ rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin;
+ new_var = (46 - rwData->timer) * (5.0f / 46.0f);
+ focalActorFocus.pos.x = (Math_SinS(rwData->unk_24) * new_var * rwData->unk_0C) + focalActorPosRot->pos.x;
+ focalActorFocus.pos.z = (Math_CosS(rwData->unk_24) * new_var * rwData->unk_0C) + focalActorPosRot->pos.z;
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.2f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ new_var = rwData->timer * (10.0f / 23.0f);
+ camera->roll = CAM_DEG_TO_BINANG(rwData->unk_0C * new_var);
+ new_var = 1.0f / rwData->timer;
+ atToEye.r = Camera_ScaledStepToCeilF(rwData->unk_14, atToEye.r, new_var, 0.1f);
+ rwData->timer--;
+ atToEye.pitch = 0;
+ if (rwData->timer <= 0) {
+ camera->animState = 3;
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ }
+ break;
+
+ case 999:
+ Actor_GetFocus(&focalActorFocus, camera->focalActor);
+ camera->animState = 3;
+ Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1);
+ break;
+
+ case 3:
+ // Player is in new form
+ focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.1f;
+ Camera_ScaledStepToCeilVec3f(&focalActorFocus.pos, at, 0.1f, 0.1f, 0.1f);
+ camera->roll = 0;
+ atToEye = rwData->unk_1C;
+ camera->fov = rwData->unk_18;
+ break;
+ }
+
+ OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye);
+ *eye = *eyeNext;
+
+ return true;
+}
+
+s32 Camera_Demo6(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo8(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Demo9(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Smoothly and gradually return camera to Player after a cutscene
+ * Used for global actorCsId = 0x7E (Connect Camera Setting)
+ */
+s32 Camera_Demo0(Camera* camera) {
+ s32 pad;
+ f32 timer;
+ s16 phi_v1;
+ Camera* subCam = &camera->play->subCameras[2];
+ Vec3f* eye = &camera->eye;
+ Vec3f* subEye = &subCam->eye;
+ Vec3f* at = &camera->at;
+ Demo0ReadOnlyData* roData = &camera->paramData.demo0.roData;
+ Demo0ReadWriteData* rwData = &camera->paramData.demo0.rwData;
+
+ // Initialize
+ if (camera->animState == 0) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ // Initialize
+ if (camera->animState == 0) {
+ OLib_Vec3fDiffToVecGeo(&rwData->subAtToEye, &subCam->at, subEye);
+ OLib_Vec3fDiffToVecGeo(&rwData->atToEye, &camera->at, eye);
+ if (rwData->subAtToEye.r < 50.0f) {
+ rwData->subAtToEye.r = 50.0f;
+ if (rwData->subAtToEye.pitch < 0x7D0) { // 11 degrees
+ rwData->subAtToEye.pitch = 0x7D0;
+ }
+ }
+
+ rwData->unk_00 = OLib_Vec3fDist(eye, subEye);
+ if (rwData->unk_00 < 300.0f) {
+ rwData->timer = 0;
+ } else {
+ rwData->timer = sqrtf(rwData->unk_00 - 200.0f);
+ }
+
+ rwData->unk_14 = subCam->inputDir.x - camera->inputDir.x;
+ if (rwData->unk_14 >= 0) {
+ phi_v1 = rwData->unk_14;
+ } else {
+ phi_v1 = -rwData->unk_14;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ rwData->unk_16 = subCam->inputDir.y - camera->inputDir.y;
+ if (rwData->unk_16 >= 0) {
+ phi_v1 = rwData->unk_16;
+ } else {
+ phi_v1 = -rwData->unk_16;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ rwData->unk_18 = subCam->inputDir.z - camera->inputDir.z;
+ if (rwData->unk_18 >= 0) {
+ phi_v1 = rwData->unk_18;
+ } else {
+ phi_v1 = -rwData->unk_18;
+ }
+
+ if (phi_v1 > 10000) {
+ phi_v1 /= 1000;
+ if (rwData->timer < phi_v1) {
+ rwData->timer = phi_v1;
+ }
+ }
+
+ if (rwData->timer != 0) {
+ rwData->unk_00 = (rwData->subAtToEye.r - rwData->atToEye.r) / rwData->timer;
+ rwData->unk_14 = (s16)(rwData->subAtToEye.pitch - rwData->atToEye.pitch) / rwData->timer;
+ rwData->unk_16 = (s16)(rwData->subAtToEye.yaw - rwData->atToEye.yaw) / rwData->timer;
+ rwData->unk_18 = (s16)(subCam->roll - camera->roll) / rwData->timer;
+ }
+ camera->animState++;
+ }
+
+ if (rwData->timer != 0) {
+ timer = rwData->timer;
+
+ // Update At (Inverse Interpolation)
+ at->x += (subCam->at.x - camera->at.x) / timer;
+ at->y += (subCam->at.y - camera->at.y) / timer;
+ at->z += (subCam->at.z - camera->at.z) / timer;
+
+ rwData->atToEye.r += rwData->unk_00;
+ rwData->atToEye.pitch += rwData->unk_14;
+ rwData->atToEye.yaw += rwData->unk_16;
+
+ camera->roll += rwData->unk_18;
+
+ // Update Eye
+ OLib_AddVecGeoToVec3f(eye, at, &rwData->atToEye);
+ camera->eyeNext = *eye;
+
+ rwData->timer--;
+ }
+
+ if (rwData->timer == 0) {
+ CutsceneManager_Stop(0x7E);
+ }
+
+ return true;
+}
+
+s32 Camera_Special0(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special1(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special2(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special3(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special4(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Flying with hookshot
+ */
+s32 Camera_Special5(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot spA8;
+ s16 pad1;
+ s16 spA4;
+ CameraCollision sp7C;
+ VecGeo sp74;
+ VecGeo sp6C;
+ VecGeo atToEye;
+ VecGeo atToEyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Special5ReadOnlyData* roData = &camera->paramData.spec5.roData;
+ Special5ReadWriteData* rwData = &camera->paramData.spec5.rwData;
+ f32 rand;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+
+ if (RELOAD_PARAMS(camera)) {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+ f32 yNormal = (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+
+ roData->yOffset = (GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight) * yNormal;
+ roData->eyeDist = GET_NEXT_RO_DATA(values);
+ roData->minDistForRot = GET_NEXT_RO_DATA(values);
+ roData->pitch = CAM_DEG_TO_BINANG(GET_NEXT_RO_DATA(values));
+ roData->fovTarget = GET_NEXT_RO_DATA(values);
+ roData->atMaxLERPScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->timerInit = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ OLib_Vec3fDiffToVecGeo(&atToEye, at, eye);
+ OLib_Vec3fDiffToVecGeo(&atToEyeNext, at, eyeNext);
+ Actor_GetWorld(&spA8, camera->target);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ if (camera->animState == 0) {
+ camera->animState++;
+ rwData->animTimer = roData->timerInit;
+ }
+
+ if (rwData->animTimer > 0) {
+ rwData->animTimer--;
+ } else if (rwData->animTimer == 0) {
+ if ((camera->target == NULL) || (camera->target->update == NULL)) {
+ camera->target = NULL;
+ return true;
+ }
+
+ rwData->animTimer--;
+ if (roData->minDistForRot < OLib_Vec3fDist(&spA8.pos, &focalActorPosRot->pos)) {
+ sp6C.yaw = focalActorPosRot->rot.y;
+ sp6C.pitch = -focalActorPosRot->rot.x;
+ sp6C.r = 20.0f;
+ OLib_AddVecGeoToVec3f(&sp7C.pos, &spA8.pos, &sp6C);
+ func_800CBC84(camera, at, &sp7C, 0);
+ OLib_Vec3fToVecGeo(&sp6C, &sp7C.norm);
+ spA4 = BINANG_SUB(focalActorPosRot->rot.y, sp6C.yaw);
+ sp74.r = roData->eyeDist;
+ rand = Rand_ZeroOne();
+ sp74.yaw =
+ BINANG_ROT180(focalActorPosRot->rot.y) +
+ (s16)((spA4 < 0) ? -(s16)(0x1553 + (s16)(rand * 2730.0f)) : (s16)(0x1553 + (s16)(rand * 2730.0f)));
+ sp74.pitch = roData->pitch;
+ OLib_AddVecGeoToVec3f(eyeNext, &spA8.pos, &sp74);
+ *eye = *eyeNext;
+ Camera_BgCheck(camera, &spA8.pos, eye);
+ }
+ }
+
+ Camera_CalcAtDefault(camera, &atToEyeNext, roData->yOffset, 0);
+ camera->fov = Camera_ScaledStepToCeilF(roData->fovTarget, camera->fov, camera->atLerpStepScale * 0.05f, 0.1f);
+ camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, roData->atMaxLERPScale);
+
+ return true;
+}
+
+s32 Camera_Special6(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+s32 Camera_Special7(Camera* camera) {
+ return Camera_Noop(camera);
+}
+
+/**
+ * Exiting a spiral staircase cutscene.
+ * Camera remains fixed at given position, and tracks player for the duration of the cutscene
+ */
+s32 Camera_Special8(Camera* camera) {
+ Vec3f* at = &camera->at;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ Vec3f atTarget;
+ Vec3f posOffsetTarget;
+ f32 yNormal;
+ f32 focalActorHeight = Camera_GetFocalActorHeight(camera);
+ DoorParams* doorParams = &camera->paramData.doorParams;
+ Special8ReadOnlyData* roData = &camera->paramData.spec8.roData;
+ Special8ReadWriteData* rwData = &camera->paramData.spec8.rwData;
+ s32 pad[2];
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ yNormal = (0.8f - ((68.0f / focalActorHeight) * -0.2f));
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ // Initialize data
+ roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->eyeStepScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->posStepScale = GET_NEXT_SCALED_RO_DATA(values);
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->spiralDoorCsLength = GET_NEXT_RO_DATA(values) * 5;
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ rwData->fov = roData->fov * 100.0f;
+ rwData->spiralDoorCsFrame = 0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ rwData->eye.x = doorParams->eye.x;
+ rwData->eye.y = doorParams->eye.y;
+ rwData->eye.z = doorParams->eye.z;
+ }
+
+ // Check if cutscene is still playing
+ if (rwData->spiralDoorCsFrame < roData->spiralDoorCsLength) {
+ rwData->spiralDoorCsFrame++;
+ sCameraInterfaceFlags = roData->interfaceFlags;
+ posOffsetTarget.x = 0.0f;
+ posOffsetTarget.y = roData->yOffset + focalActorHeight;
+ posOffsetTarget.z = 0.0f;
+ Camera_ScaledStepToCeilVec3f(&posOffsetTarget, &camera->focalActorAtOffset, roData->posStepScale,
+ roData->posStepScale, 0.1f);
+
+ // Camera follows player as they exit the stairwell
+ atTarget.x = focalActorPosRot->pos.x + camera->focalActorAtOffset.x;
+ atTarget.y = focalActorPosRot->pos.y + camera->focalActorAtOffset.y;
+ atTarget.z = focalActorPosRot->pos.z + camera->focalActorAtOffset.z;
+ if (camera->animState == 0) {
+ camera->animState++;
+ if (!(roData->interfaceFlags & SPECIAL8_FLAG_0)) {
+ camera->eyeNext = rwData->eye;
+ camera->at = atTarget;
+ }
+ }
+
+ // Update at to look at player
+ Camera_ScaledStepToCeilVec3f(&atTarget, at, roData->posStepScale, roData->posStepScale, 10.0f);
+
+ // Move camera position &rwData->eye and remain there for the entire cutscen
+ Camera_ScaledStepToCeilVec3f(&rwData->eye, eyeNext, roData->eyeStepScale, roData->eyeStepScale, 0.1f);
+ camera->eye = *eyeNext;
+ camera->dist = OLib_Vec3fDist(at, &camera->eye);
+ camera->roll = 0;
+ camera->xzSpeed = 0.0f;
+ camera->fov = CAM_RODATA_UNSCALE(rwData->fov);
+ camera->atLerpStepScale = Camera_ClampLerpScale(camera, 1.0f);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+ } else {
+ // Cutscene is finished
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+
+ // Wait for user input to move to the next camera update function
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & SPECIAL8_FLAG_3)) {
+ func_800CC938(camera);
+ Camera_SetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ }
+ }
+ return true;
+}
+
+/**
+ * Entering and exiting a door between rooms (eg. sliding doors)
+ * Camera closely follows player on both the front and the back room
+ */
+s32 Camera_Special9(Camera* camera) {
+ Vec3f* eye = &camera->eye;
+ Vec3f* at = &camera->at;
+ s32 rand1;
+ Vec3f spB8;
+ VecGeo spB0;
+ VecGeo spA8;
+ f32 focalActorHeight;
+ s32 phi_v1_2;
+ s16 actorCsId;
+ f32 yNormal;
+ PosRot sp84;
+ Vec3f* eyeNext = &camera->eyeNext;
+ PosRot* focalActorPosRot = &camera->focalActorPosRot;
+ DoorParams* doorParams = &camera->paramData.doorParams;
+ Special9ReadOnlyData* roData = &camera->paramData.spec9.roData;
+ Special9ReadWriteData* rwData = &camera->paramData.spec9.rwData;
+ s32 sp50[1];
+ BgCamFuncData* bgCamFuncData;
+
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ actorCsId = CutsceneManager_GetCurrentCsId();
+
+ if ((actorCsId != -1) && (actorCsId != 0x7D)) {
+ func_800E0348(camera);
+ }
+
+ Camera_UnsetStateFlag(camera, CAM_STATE_4);
+ yNormal = 0.8f - ((68.0f / focalActorHeight) * -0.2f);
+
+ if (!RELOAD_PARAMS(camera)) {
+ } else {
+ CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
+
+ roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * yNormal;
+ roData->fov = GET_NEXT_RO_DATA(values);
+ roData->interfaceFlags = GET_NEXT_RO_DATA(values);
+ }
+
+ if (doorParams->doorActor != NULL) {
+ Actor_GetWorldPosShapeRot(&sp84, doorParams->doorActor);
+ } else {
+ sp84 = *focalActorPosRot;
+ sp84.pos.y += focalActorHeight + roData->yOffset;
+ sp84.rot.x = 0;
+ }
+
+ OLib_Vec3fDiffToVecGeo(&spA8, at, eye);
+
+ sCameraInterfaceFlags = roData->interfaceFlags;
+
+ switch (camera->animState) {
+ case 0:
+ // Init
+ Camera_UnsetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ camera->animState++;
+ if (ABS((s16)(focalActorPosRot->rot.y - sp84.rot.y)) > 0x4000) {
+ rwData->unk_00 = BINANG_ROT180(sp84.rot.y);
+ } else {
+ rwData->unk_00 = sp84.rot.y;
+ }
+ // fallthrough
+ case 1:
+ // Camera is fixed in front of the door
+ doorParams->timer1--;
+ if (doorParams->timer1 > 0) {
+ break;
+ }
+
+ camera->animState++;
+
+ // Setup for the camera moving behind the door
+ if (roData->interfaceFlags & SPECIAL9_FLAG_0) {
+ bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex);
+ Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
+ spB8 = *eye = *eyeNext;
+ } else {
+ s16 camEyeSide;
+ s16 randFloat;
+
+ spB0.pitch = ((s16)(Rand_ZeroOne() * 0x280) + 0xBB8);
+ randFloat = ((s16)(Rand_ZeroOne() * 0x4CE) + 0x5DC);
+
+ // The camera will either position itself either to the left or to the right
+ // of the door when it jumps behind it. It's effectively 50/50 percent chance
+ camEyeSide = (s16)(randFloat * ((camera->play->state.frames % 2) ? 1 : -1));
+
+ spB0.yaw = rwData->unk_00 + camEyeSide;
+ spB0.r = 200.0f * yNormal;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+ spB8 = *eye = *eyeNext;
+
+ // If the side chosen moves the camera out-of-bounds, move to the other side
+ if (Camera_CheckOOB(camera, &spB8, &focalActorPosRot->pos)) {
+ camEyeSide = (s16)-camEyeSide;
+ spB0.yaw = rwData->unk_00 + camEyeSide;
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+ *eye = *eyeNext;
+ }
+ }
+ // fallthrough
+ case 2:
+ // Camera is behind the door looking at player
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight + roData->yOffset;
+ // Update camera at to follow the player
+ Camera_ScaledStepToCeilVec3f(&spB8, at, 0.25f, 0.25f, 0.1f);
+
+ doorParams->timer2--;
+ if (doorParams->timer2 > 0) {
+ break;
+ }
+
+ // Setup for the camera turning around to look in front of player
+ camera->animState++;
+ rwData->unk_00 = BINANG_ROT180(rwData->unk_00);
+ // fallthrough
+ case 3:
+ // Camera turns around to look in front of player
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight + roData->yOffset;
+ Camera_ScaledStepToCeilVec3f(&spB8, at, 0.5f, 0.5f, 0.1f);
+ spB0.pitch = Camera_ScaledStepToCeilS(0xAAA, spA8.pitch, 0.3f, 5);
+ spB0.yaw = Camera_ScaledStepToCeilS(rwData->unk_00, spA8.yaw, 0.3f, 5);
+ spB0.r = Camera_ScaledStepToCeilF(60.0f, spA8.r, 0.3f, 1.0f);
+ OLib_AddVecGeoToVec3f(eyeNext, at, &spB0);
+
+ *eye = *eyeNext;
+
+ doorParams->timer3--;
+ if (doorParams->timer3 > 0) {
+ break;
+ }
+
+ camera->animState++;
+ // fallthrough
+ case 4:
+ camera->animState++;
+ // fallthrough
+ case 999:
+ default:
+ // Door is closed and is waiting for user input to toggle to a new setting
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4);
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_NONE, CAM_HUD_VISIBILITY_ALL, 0);
+
+ if ((camera->xzSpeed > 0.001f) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_A) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_B) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CUP) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) ||
+ CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) ||
+ (roData->interfaceFlags & SPECIAL9_FLAG_3)) {
+
+ func_800CC938(camera);
+ Camera_SetStateFlag(camera, CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ }
+ break;
+ }
+
+ spB8 = focalActorPosRot->pos;
+ spB8.y += focalActorHeight;
+ camera->dist = OLib_Vec3fDist(&spB8, eye);
+ Camera_SetFocalActorAtOffset(camera, &focalActorPosRot->pos);
+
+ return true;
+}
+
+/*===============================================================*/
+/* Camera Public Functions */
+/*===============================================================*/
+
+Camera* Camera_Create(View* view, CollisionContext* colCtx, PlayState* play) {
+ Camera* newCamera = ZeldaArena_Malloc(sizeof(Camera));
+
+ if (newCamera != NULL) {
+ Camera_Init(newCamera, view, colCtx, play);
+ }
+ return newCamera;
+}
+
+void Camera_Destroy(Camera* camera) {
+ if (camera != NULL) {
+ ZeldaArena_Free(camera);
+ }
+}
+
+void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState* play) {
+ Camera* cameraPtr;
+ s32 i;
+ s16 curUID;
+ s16 j;
+
+ __osMemset(camera, 0, sizeof(Camera));
+
+ camera->play = sCamPlayState = play;
+ curUID = sCameraNextUID;
+ sCameraNextUID++;
+ while (curUID != 0) {
+ if (curUID == 0) {
+ sCameraNextUID++;
+ }
+
+ for (j = 0; j < NUM_CAMS; j++) {
+ cameraPtr = camera->play->cameraPtrs[j];
+ if ((cameraPtr != NULL) && (curUID == cameraPtr->uid)) {
+ break;
+ }
+ }
+
+ if (j == NUM_CAMS) {
+ break;
+ }
+
+ curUID = sCameraNextUID++;
+ }
+
+ camera->inputDir.y = 0x4000;
+ camera->uid = curUID;
+ camera->camDir = camera->inputDir;
+ camera->nextCamSceneDataId = -1;
+ camera->up.z = camera->up.x = 0.0f;
+ camera->up.y = 1.0f;
+ camera->fov = 60.0f;
+ camera->yOffsetUpdateRate = 0.05f;
+ camera->xzOffsetUpdateRate = 0.05f;
+ camera->fovUpdateRate = 0.05f;
+ camera->rUpdateRateInv = 10.0f;
+ camera->yawUpdateRateInv = 10.0f;
+ camera->pitchUpdateRateInv = 16.0f;
+
+ sCameraLetterboxSize = 32;
+ sCameraHudVisibility = 0;
+
+ camera->setting = camera->prevSetting = CAM_SET_FREE0;
+ camera->bgCamIndex = camera->prevBgCamDataId = -1;
+ camera->stateFlags = 0;
+ camera->mode = CAM_MODE_NORMAL;
+ camera->bgId = BGCHECK_SCENE;
+ camera->unk168 = 0xF;
+ camera->timer = -1;
+ camera->focalActor = NULL;
+ camera->target = NULL;
+ Camera_SetStateFlag(camera, CAM_STATE_INITIALIZED);
+ camera->quakeOffset.z = camera->quakeOffset.y = camera->quakeOffset.x = 0;
+ camera->up.z = camera->up.x = 0.0f;
+ camera->atLerpStepScale = 1;
+ camera->up.y = 1.0f;
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
+ sCameraInitSceneTimer = 3;
+}
+
+void func_800DDFE0(Camera* camera) {
+ if (camera != &camera->play->mainCamera) {
+ camera->prevSetting = camera->setting = CAM_SET_FREE0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_2);
+ } else {
+ switch (camera->play->roomCtx.curRoom.behaviorType1) {
+ case ROOM_BEHAVIOR_TYPE1_1:
+ camera->prevSetting = CAM_SET_DUNGEON0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_DUNGEON0, CAM_CHANGE_SETTING_1);
+ break;
+
+ case ROOM_BEHAVIOR_TYPE1_0:
+ camera->prevSetting = CAM_SET_NORMAL0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL0, CAM_CHANGE_SETTING_1);
+ break;
+
+ case ROOM_BEHAVIOR_TYPE1_2:
+ camera->prevSetting = CAM_SET_ROOM0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_ROOM0, CAM_CHANGE_SETTING_1);
+ break;
+
+ default:
+ camera->prevSetting = CAM_SET_NORMAL0;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL0, CAM_CHANGE_SETTING_1);
+ break;
+ }
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+ }
+}
+
+/**
+ * Unused empty function
+ */
+void Camera_Stub800DE0E0(Camera* camera) {
+}
+
+void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor) {
+ PosRot focalActorPosRot;
+ VecGeo eyeNextAtOffset;
+ s32 bgId;
+ Vec3f floorPos;
+ s32 upXZ;
+ f32 focalActorHeight;
+ Vec3f* eye = &camera->eye;
+
+ Actor_GetWorldPosShapeRot(&focalActorPosRot, focalActor);
+
+ camera->focalActor = focalActor;
+ focalActorHeight = Camera_GetFocalActorHeight(camera);
+ camera->focalActorPosRot = focalActorPosRot;
+ camera->dist = eyeNextAtOffset.r = 180.0f;
+ camera->inputDir.y = focalActorPosRot.rot.y;
+ eyeNextAtOffset.yaw = BINANG_ROT180(camera->inputDir.y);
+ camera->inputDir.x = eyeNextAtOffset.pitch = 0x71C;
+ camera->inputDir.z = 0;
+ camera->camDir = camera->inputDir;
+ camera->xzSpeed = 0.0f;
+ camera->unk_0F0.y = 0.0f;
+ camera->at = focalActorPosRot.pos;
+ camera->at.y += focalActorHeight;
+
+ camera->focalActorAtOffset.x = 0;
+ camera->focalActorAtOffset.y = focalActorHeight;
+ camera->focalActorAtOffset.z = 0;
+
+ OLib_AddVecGeoToVec3f(&camera->eyeNext, &camera->at, &eyeNextAtOffset);
+ *eye = camera->eyeNext;
+ camera->roll = 0;
+
+ upXZ = 0;
+ camera->up.z = upXZ;
+ camera->up.y = 1.0f;
+ camera->up.x = upXZ;
+
+ {
+ s32 pad;
+
+ if (Camera_GetFloorYNorm(camera, &floorPos, &camera->at, &bgId) != BGCHECK_Y_MIN) {
+ camera->bgId = bgId;
+ }
+ }
+
+ camera->waterPrevBgCamDataId = -1;
+ camera->waterPrevCamSetting = -1;
+ camera->waterQuakeId = -1;
+
+ {
+ s32 pad;
+
+ func_800DDFE0(camera);
+ }
+
+ Camera_SetStateFlag(camera, CAM_STATE_2);
+
+ camera->viewFlags = 0;
+ camera->nextCamSceneDataId = -1;
+ camera->yOffsetUpdateRate = 0.01f;
+ camera->xzOffsetUpdateRate = 0.01f;
+ camera->fovUpdateRate = 0.01f;
+ camera->atLerpStepScale = 1;
+ Camera_ResetActionFuncState(camera, camera->mode);
+
+ if (camera == &camera->play->mainCamera) {
+ sCameraInterfaceFlags =
+ CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE | CAM_LETTERBOX_INSTANT, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ CutsceneManager_StoreCamera(camera);
+ } else {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ }
+ Camera_UpdateWater(camera);
+}
+
+/**
+ * Updates the camera status
+ */
+s32 Camera_ChangeStatus(Camera* camera, s16 status) {
+ camera->status = status;
+ return camera->status;
+}
+
+s32 Camera_UpdateWater(Camera* camera) {
+ f32 waterY;
+ s16 camSetting;
+ s32 pad[2];
+ s32* waterPrevCamSetting = &camera->waterPrevCamSetting;
+ s16 prevBgId;
+
+ if (!(camera->stateFlags & CAM_STATE_CHECK_WATER) || (sCameraSettings[camera->setting].flags & 0x40000000)) {
+ return false;
+ }
+
+ if (camera->stateFlags & CAM_STATE_9) {
+ if (Camera_IsDiving(camera)) {
+ if (!Camera_IsPlayerFormZora(camera)) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_PIVOT_DIVING, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ } else {
+ Camera_ChangeSettingFlags(camera, CAM_SET_ZORA_DIVING, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ }
+ Camera_SetStateFlag(camera, CAM_STATE_15);
+ } else if (camera->stateFlags & CAM_STATE_15) {
+ Camera_ChangeSettingFlags(camera, *waterPrevCamSetting, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_1);
+ Camera_UnsetStateFlag(camera, CAM_STATE_15);
+ }
+ }
+
+ if (!(camera->stateFlags & CAM_STATE_15)) {
+ camSetting = Camera_GetWaterBoxBgCamSetting(camera, &waterY);
+ if (camSetting == -2) {
+ // CAM_SET_NONE
+ if (!(camera->stateFlags & CAM_STATE_9)) {
+ Camera_SetStateFlag(camera, CAM_STATE_9);
+ camera->waterPrevBgCamDataId = camera->bgCamIndex;
+ camera->waterQuakeId = -1;
+ }
+
+ if (!(Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (Camera_IsSwimming(camera) && !Camera_IsUnderwaterAsZora(camera))) {
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ waterPrevCamSetting = &camera->waterPrevCamSetting;
+ Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL3, CAM_CHANGE_SETTING_1);
+ *waterPrevCamSetting = camera->setting;
+ camera->bgId = prevBgId;
+ camera->bgCamIndex = -2;
+ }
+
+ } else if (camSetting != -1) {
+ // player is in a water box
+ if (!(camera->stateFlags & CAM_STATE_9)) {
+ Camera_SetStateFlag(camera, CAM_STATE_9);
+ camera->waterPrevBgCamDataId = camera->bgCamIndex;
+ camera->waterQuakeId = -1;
+ }
+
+ if (!(Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (Camera_IsSwimming(camera) && !Camera_IsUnderwaterAsZora(camera))) {
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ waterPrevCamSetting = &camera->waterPrevCamSetting;
+ Camera_ChangeSettingFlags(camera, camSetting, CAM_CHANGE_SETTING_1);
+ *waterPrevCamSetting = camera->setting;
+ camera->bgId = prevBgId;
+ }
+
+ } else if (camera->stateFlags & CAM_STATE_9) {
+ // player is out of a water box.
+ Camera_UnsetStateFlag(camera, CAM_STATE_9);
+ prevBgId = camera->bgId;
+ camera->bgId = BGCHECK_SCENE;
+ if (camera->waterPrevBgCamDataId < 0) {
+ func_800DDFE0(camera);
+ camera->bgCamIndex = -1;
+ } else {
+ Camera_ChangeActorCsCamIndex(camera, camera->waterPrevBgCamDataId);
+ }
+ camera->bgId = prevBgId;
+ }
+ camera->waterYPos = waterY;
+ }
+ return true;
+}
+
+void Camera_EarthquakeDay3(Camera* camera) {
+ static s16 sEarthquakeTimer = 0;
+ u16 time;
+ s16 quakeIndex;
+ s32 timeSpeedOffset;
+ s16 sEarthquakeFreq[] = {
+ 0xFFC, // 1 Large Earthquake between CLOCK_TIME(0, 00) to CLOCK_TIME(1, 30)
+ 0x7FC, // 2 Large Earthquakes between CLOCK_TIME(1, 30) to CLOCK_TIME(3, 00)
+ 0x3FC, // 4 Large Earthquakes between CLOCK_TIME(3, 00) to CLOCK_TIME(4, 30)
+ 0x1FC, // 8 Large Earthquakes between CLOCK_TIME(4, 30) to CLOCK_TIME(6, 00)
+ };
+
+ if ((CURRENT_DAY == 3) && (CutsceneManager_GetCurrentCsId() == -1)) {
+ time = gSaveContext.save.time;
+ timeSpeedOffset = gSaveContext.save.timeSpeedOffset;
+
+ // Large earthquake created
+ // Times based on sEarthquakeFreq
+ if ((time > CLOCK_TIME(0, 0)) && (time < CLOCK_TIME(6, 0)) && ((sEarthquakeFreq[time >> 12] & time) == 0) &&
+ (Quake_GetNumActiveQuakes() < 2)) {
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_4);
+ if (quakeIndex != 0) {
+ Quake_SetSpeed(quakeIndex, 30000);
+ Quake_SetPerturbations(quakeIndex, (time >> 12) + 2, 1, 5, 60);
+ sEarthquakeTimer = ((time >> 10) - timeSpeedOffset) + 80;
+ Quake_SetDuration(quakeIndex, sEarthquakeTimer);
+ }
+ }
+
+ // Small earthquake created
+ // Around CLOCK_TIME(17, 33) || Around CLOCK_TIME(20, 33) || Every 1024 frames (around every 51s)
+ if (((((time + 0x4D2) & 0xDFFC) == 0xC000) || ((camera->play->state.frames % 1024) == 0)) &&
+ (Quake_GetNumActiveQuakes() < 2)) {
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
+ if (quakeIndex != 0) {
+ Quake_SetSpeed(quakeIndex, 16000);
+ Quake_SetPerturbations(quakeIndex, 1, 0, 0, time & 0x3F); // %64
+ sEarthquakeTimer = 120 - timeSpeedOffset;
+ Quake_SetDuration(quakeIndex, sEarthquakeTimer);
+ }
+ }
+
+ if (sEarthquakeTimer != 0) {
+ sEarthquakeTimer--;
+ func_8019F128(NA_SE_SY_EARTHQUAKE_OUTDOOR - SFX_FLAG);
+ }
+ }
+}
+
+/**
+ * Sets the distortion to type 1 for a hot room
+ * Remnant of OoT as no room in any MM scene is set to a hot-room
+ */
+s32 Camera_UpdateHotRoom(Camera* camera) {
+ Distortion_RemoveRequest(DISTORTION_TYPE_HOT_ROOM);
+ if (camera->play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_HOT) {
+ Distortion_Request(DISTORTION_TYPE_HOT_ROOM);
+ }
+ return true;
+}
+
+s32 Camera_SetSwordDistortion(Camera* camera) {
+ switch (func_800CBB88(camera)) {
+ case 1:
+ // non-magic spin attack
+ if (Distortion_GetType() != DISTORTION_TYPE_ZORA_KICK) {
+ Distortion_Request(DISTORTION_TYPE_ZORA_KICK);
+ Distortion_SetDuration(12);
+ }
+ break;
+
+ case 2:
+ // Unused: case 2 is impossible to achieve
+ if (Distortion_GetType() != DISTORTION_TYPE_UNK_ATTACK) {
+ Distortion_Request(DISTORTION_TYPE_UNK_ATTACK);
+ Distortion_SetDuration(5);
+ }
+ break;
+
+ case 3:
+ if (Distortion_GetType() != DISTORTION_TYPE_GORON_BUTT) {
+ Distortion_Request(DISTORTION_TYPE_GORON_BUTT);
+ Distortion_SetDuration(15);
+ }
+ break;
+ }
+ return true;
+}
+
+s32 Camera_RequestGiantsMaskSetting(Camera* camera) {
+ Player* player = GET_PLAYER(camera->play);
+
+ if ((camera->camId == CAM_ID_MAIN) && (camera->focalActor == &GET_PLAYER(camera->play)->actor) &&
+ (player->currentMask == PLAYER_MASK_GIANT)) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_GIANT, CAM_CHANGE_SETTING_1);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) {
+ Vec3f viewAt;
+ Vec3f viewEye;
+ Vec3f viewUp;
+ Vec3f focalActorPos;
+ s32 bgId;
+ s32 sp98;
+ s32 changeCamSceneDataType;
+ CollisionPoly* sp90;
+ CollisionPoly* sp8C;
+ f32 runSpeedLimit;
+ f32 speed;
+ f32 viewFov;
+ DynaPolyActor* meshActor;
+ PosRot focalActorPosRot;
+ ShakeInfo camShake;
+ Actor* focalActor = camera->focalActor;
+ VecGeo sp3C;
+ s16 bgCamIndex;
+ s16 numQuakesApplied;
+ f32 focalActorFloorHeight;
+
+ // Camera of status CUT only updates to this point
+ if (camera->status == CAM_STATUS_CUT) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ sUpdateCameraDirection = false;
+ sIsFalse = false;
+
+ if (camera->play->view.unk164 == 0) {
+ if (camera->focalActor != NULL) {
+ // Updates camera info on the actor it's tracking
+
+ if (camera->focalActor == &GET_PLAYER(camera->play)->actor) {
+ Actor_GetWorldPosShapeRot(&focalActorPosRot, camera->focalActor);
+ } else {
+ Actor_GetWorld(&focalActorPosRot, camera->focalActor);
+ }
+ camera->unk_0F0.x = focalActorPosRot.pos.x - camera->focalActorPosRot.pos.x;
+ camera->unk_0F0.y = focalActorPosRot.pos.y - camera->focalActorPosRot.pos.y;
+ camera->unk_0F0.z = focalActorPosRot.pos.z - camera->focalActorPosRot.pos.z;
+
+ // bg related to tracked actor
+ sp98 = 0;
+ if (Camera_IsMountedOnHorse(camera)) {
+ if (((Player*)focalActor)->rideActor->floorPoly != NULL) {
+ sp90 = ((Player*)focalActor)->rideActor->floorPoly;
+ camera->bgId = ((Player*)focalActor)->rideActor->floorBgId;
+ camera->focalActorFloorHeight = ((Player*)focalActor)->rideActor->floorHeight;
+ sp98 = 3;
+ }
+ } else if (func_800CB7CC(camera)) {
+ if (camera->focalActor->floorPoly != NULL) {
+ sp90 = camera->focalActor->floorPoly;
+ camera->bgId = camera->focalActor->floorBgId;
+ camera->focalActorFloorHeight = camera->focalActor->floorHeight;
+ sp98 = 1;
+ }
+ } else {
+ focalActorPos = focalActorPosRot.pos;
+ focalActorPos.y += Camera_GetFocalActorHeight(camera);
+ focalActorFloorHeight = BgCheck_EntityRaycastFloor5_3(camera->play, &camera->play->colCtx, &sp90, &bgId,
+ camera->focalActor, &focalActorPos);
+ if (focalActorFloorHeight != BGCHECK_Y_MIN) {
+ camera->bgId = bgId;
+ camera->focalActorFloorHeight = focalActorFloorHeight;
+ sp98 = 2;
+ }
+ }
+
+ if ((sp98 != 0) && (Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f)) {
+ meshActor = DynaPoly_GetActor(&camera->play->colCtx, camera->bgId);
+ if (meshActor != NULL) {
+ camera->floorNorm.x = COLPOLY_GET_NORMAL(sp90->normal.x);
+ camera->floorNorm.y = COLPOLY_GET_NORMAL(sp90->normal.y);
+ camera->floorNorm.z = COLPOLY_GET_NORMAL(sp90->normal.z);
+ camera->unk_0F0.x -= meshActor->actor.world.pos.x - camera->meshActorPos.x;
+ camera->unk_0F0.y -= meshActor->actor.world.pos.y - camera->meshActorPos.y;
+ camera->unk_0F0.z -= meshActor->actor.world.pos.z - camera->meshActorPos.z;
+ camera->meshActorPos = meshActor->actor.world.pos;
+ }
+ }
+
+ // Set camera speed
+ runSpeedLimit = Camera_GetRunSpeedLimit(camera) * 1.5f;
+ speed = Camera_Vec3fMagnitude(&camera->unk_0F0);
+ camera->xzSpeed = OLib_ClampMaxDist(speed, runSpeedLimit);
+ camera->speedRatio = OLib_ClampMaxDist(speed / runSpeedLimit, 1.8f);
+ camera->focalActorPosRot = focalActorPosRot;
+
+ if (camera->camId == CAM_ID_MAIN) {
+ Camera_UpdateWater(camera);
+ Camera_UpdateHotRoom(camera);
+ Camera_EarthquakeDay3(camera);
+ Camera_SetSwordDistortion(camera);
+ }
+
+ /**
+ * This section is about updating the camera setting based on the camera scene data
+ *
+ */
+
+ // If doorTimer1 is active, set CAM_STATE_10 which suppresses bg camera scene data from being read
+ if (camera->doorTimer1 != 0) {
+ Camera_SetStateFlag(camera, CAM_STATE_10);
+ } else if (!(camera->stateFlags & CAM_STATE_2)) {
+ camera->nextCamSceneDataId = -1;
+ }
+
+ changeCamSceneDataType = 0; // default to no change in the cam scene data
+ bgId = camera->bgId;
+
+ // Sets the next cam scene data Index based on the bg surface
+ if ((camera->stateFlags & CAM_STATE_0) && (camera->stateFlags & CAM_STATE_2) &&
+ !(camera->stateFlags & CAM_STATE_10) &&
+ (!(camera->stateFlags & CAM_STATE_9) || Camera_IsUnderwaterAsZora(camera)) &&
+ !(camera->stateFlags & CAM_STATE_15) && !Camera_IsMountedOnHorse(camera) &&
+ !Camera_RequestGiantsMaskSetting(camera) && !Camera_IsDekuHovering(camera) && (sp98 != 0)) {
+
+ bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, sp90);
+ if ((bgCamIndex != -1) && (camera->bgId == BGCHECK_SCENE)) {
+ if (Camera_IsUsingZoraFins(camera) == 0) {
+ camera->nextCamSceneDataId = bgCamIndex | CAM_DATA_IS_BG;
+ }
+ }
+
+ focalActorPos = focalActorPosRot.pos;
+ focalActorPos.y += Camera_GetFocalActorHeight(camera);
+ focalActorFloorHeight =
+ BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &sp8C, &bgId, &focalActorPos);
+
+ if ((focalActorFloorHeight != BGCHECK_Y_MIN) && (sp8C != sp90) && (bgId == BGCHECK_SCENE) &&
+ ((camera->focalActorFloorHeight - 2.0f) < focalActorFloorHeight)) {
+ bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, sp8C);
+ if ((bgCamIndex != -1) && (bgId == BGCHECK_SCENE)) {
+ camera->nextCamSceneDataId = bgCamIndex | CAM_DATA_IS_BG;
+ changeCamSceneDataType = 1; // change cam scene data based on the bg cam data
+ }
+ }
+ }
+
+ if (camera->doorTimer1 != 0) {
+ camera->doorTimer1--;
+ if (camera->doorTimer1 == 0) {
+ Camera_UnsetStateFlag(camera, CAM_STATE_10);
+ changeCamSceneDataType = 5; // change cam scene data based on the cutscene cam data
+ }
+ }
+
+ if (((camera->camId == CAM_ID_MAIN) || (camera->stateFlags & CAM_STATE_6)) &&
+ ((camera->bgId == BGCHECK_SCENE) || ((bgId == BGCHECK_SCENE) && (changeCamSceneDataType != 0))) &&
+ (camera->nextCamSceneDataId != -1) && (camera->doorTimer1 == 0) &&
+ ((Camera_fabsf(camera->focalActorPosRot.pos.y - camera->focalActorFloorHeight) < 11.0f) ||
+ (changeCamSceneDataType != 0)) &&
+ (!(camera->stateFlags & CAM_STATE_9) || Camera_IsUnderwaterAsZora(camera))) {
+
+ Camera_ChangeActorCsCamIndex(camera, camera->nextCamSceneDataId);
+ camera->nextCamSceneDataId = -1;
+ if (camera->doorTimer2 != 0) {
+ camera->doorTimer1 = camera->doorTimer2;
+ camera->doorTimer2 = 0;
+ }
+ }
+ }
+
+ // Camera of status WAIT only updates to this point
+ if (camera->status == CAM_STATUS_WAIT) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ camera->behaviorFlags = 0;
+ Camera_UnsetStateFlag(camera, CAM_STATE_10 | CAM_STATE_DISABLE_MODE_CHANGE);
+ Camera_SetStateFlag(camera, CAM_STATE_4);
+ }
+
+ // Call the camera update function
+ sCameraUpdateHandlers[sCameraSettings[camera->setting].cameraModes[camera->mode].funcId](camera);
+
+ // Update the interface
+ if (sCameraInitSceneTimer != 0) {
+ sCameraInitSceneTimer--;
+ }
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ if (((sCameraInitSceneTimer != 0) || func_800CB854(camera)) && (camera->camId == CAM_ID_MAIN)) {
+ // Surpresses the interface for the first few frames of a scene
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NONE_ALT, 0);
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ } else if ((camera->play->transitionMode != TRANS_MODE_OFF) && (camera->camId != CAM_ID_MAIN)) {
+ sCameraInterfaceFlags = CAM_INTERFACE_FLAGS(CAM_LETTERBOX_IGNORE, CAM_HUD_VISIBILITY_IGNORE, 0);
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ } else {
+ Camera_UpdateInterface(sCameraInterfaceFlags);
+ }
+ }
+
+ // Camera of status UNK3 only updates to this point
+ if (camera->status == CAM_STATUS_UNK3) {
+ *inputDir = camera->inputDir;
+ return inputDir;
+ }
+
+ /**
+ * This section is about updating view structs from the active camera,
+ * which view uses to calculate the viewing/projection matrices
+ */
+ numQuakesApplied = Quake_Update(camera, &camShake);
+
+ bgId = numQuakesApplied; // required to match
+
+ if (numQuakesApplied != 0) {
+ viewAt.x = camera->at.x + camShake.atOffset.x;
+ viewAt.y = camera->at.y + camShake.atOffset.y;
+ viewAt.z = camera->at.z + camShake.atOffset.z;
+ viewEye.x = camera->eye.x + camShake.eyeOffset.x;
+ viewEye.y = camera->eye.y + camShake.eyeOffset.y;
+ viewEye.z = camera->eye.z + camShake.eyeOffset.z;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll + camShake.upRollOffset);
+ viewFov = camera->fov + CAM_BINANG_TO_DEG(camShake.fovOffset);
+ } else if (sIsFalse) {
+ //! condition is impossible to achieve
+ viewAt = camera->at;
+ viewEye = camera->eye;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ viewUp = camera->up;
+ viewFov = camera->fov;
+ } else {
+ viewAt = camera->at;
+ viewEye = camera->eye;
+ OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt);
+ Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll);
+ viewFov = camera->fov;
+ }
+
+ // set view up
+ if (camera->viewFlags & CAM_VIEW_UP) {
+ camera->viewFlags &= ~CAM_VIEW_UP;
+ viewUp = camera->up;
+ } else {
+ camera->up = viewUp;
+ }
+
+ camera->quakeOffset = camShake.eyeOffset;
+ View_SetScale(&camera->play->view, (OREG(67) * 0.01f) + 1.0f);
+ camera->play->view.fovy = viewFov;
+ View_LookAt(&camera->play->view, &viewEye, &viewAt, &viewUp);
+ camera->camDir.x = sp3C.pitch;
+ camera->camDir.y = sp3C.yaw;
+ camera->camDir.z = 0;
+
+ if (!sUpdateCameraDirection) {
+ camera->inputDir.x = sp3C.pitch;
+ camera->inputDir.y = sp3C.yaw;
+ camera->inputDir.z = 0;
+ }
+
+ *inputDir = camera->inputDir;
+
+ return inputDir;
+}
+
+s32 func_800DF498(Camera* camera) {
+ Camera_SetStateFlag(camera, CAM_STATE_3 | CAM_STATE_2); // CAM_STATE_3 is set only immediately to be unset
+ Camera_UnsetStateFlag(camera, CAM_STATE_12 | CAM_STATE_3);
+ return true;
+}
+
+#define CAM_CHANGE_MODE_0 (1 << 0)
+#define CAM_CHANGE_MODE_1 (1 << 1)
+#define CAM_CHANGE_MODE_BATTLE (1 << 2)
+#define CAM_CHANGE_MODE_FOLLOW_TARGET (1 << 3)
+#define CAM_CHANGE_MODE_4 (1 << 4)
+#define CAM_CHANGE_MODE_FIRST_PERSON (1 << 5)
+
+s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 forceChange) {
+ static s32 sModeChangeFlags = 0;
+
+ if ((camera->setting == CAM_SET_TELESCOPE) && ((mode == CAM_MODE_FIRSTPERSON) || (mode == CAM_MODE_DEKUHIDE))) {
+ forceChange = true;
+ }
+
+ // Mode change rejected by flag
+ if ((camera->stateFlags & CAM_STATE_DISABLE_MODE_CHANGE) && !forceChange) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ return -1;
+ }
+
+ // Mode change rejected by validModes
+ if (!(sCameraSettings[camera->setting].validModes & (1 << mode))) {
+ if (camera->mode != CAM_MODE_NORMAL) {
+ camera->mode = CAM_MODE_NORMAL;
+ Camera_ResetActionFuncState(camera, camera->mode);
+ func_800DF498(camera);
+ return mode | 0xC0000000;
+ } else {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_1;
+ return 0;
+ }
+ }
+
+ // Mode change rejected due to mode already being set. (otherwise, reset mode)
+ if ((mode == camera->mode) && !forceChange) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_VALID;
+ camera->behaviorFlags |= CAM_BEHAVIOR_MODE_1;
+
+ Camera_ResetActionFuncState(camera, mode);
+
+ sModeChangeFlags = 0;
+
+ // Process Requested Camera Mode
+ switch (mode) {
+ case CAM_MODE_FIRSTPERSON:
+ sModeChangeFlags = CAM_CHANGE_MODE_FIRST_PERSON;
+ break;
+
+ case CAM_MODE_BATTLE:
+ sModeChangeFlags = CAM_CHANGE_MODE_BATTLE;
+ break;
+
+ case CAM_MODE_FOLLOWTARGET:
+ if ((camera->target != NULL) && (camera->target->id != ACTOR_EN_BOOM)) {
+ sModeChangeFlags = CAM_CHANGE_MODE_FOLLOW_TARGET;
+ }
+ break;
+
+ case CAM_MODE_BOWARROWZ:
+ case CAM_MODE_TARGET:
+ case CAM_MODE_TALK:
+ case CAM_MODE_HANGZ:
+ case CAM_MODE_PUSHPULL:
+ sModeChangeFlags = CAM_CHANGE_MODE_1;
+ break;
+
+ case CAM_MODE_NORMAL:
+ case CAM_MODE_HANG:
+ sModeChangeFlags = CAM_CHANGE_MODE_4;
+ break;
+
+ default:
+ break;
+ }
+
+ // Process Current Camera Mode
+ switch (camera->mode) {
+ case CAM_MODE_FIRSTPERSON:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_FIRST_PERSON) {
+ camera->animState = 10;
+ }
+ break;
+
+ case CAM_MODE_JUMP:
+ case CAM_MODE_HANG:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_CHARGE:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_FOLLOWTARGET:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_FOLLOW_TARGET) {
+ camera->animState = 10;
+ }
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_BATTLE:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_BATTLE) {
+ camera->animState = 10;
+ }
+ sModeChangeFlags |= 1;
+ break;
+
+ case CAM_MODE_BOWARROWZ:
+ case CAM_MODE_HANGZ:
+ case CAM_MODE_PUSHPULL:
+ sModeChangeFlags |= CAM_CHANGE_MODE_0;
+ break;
+
+ case CAM_MODE_NORMAL:
+ if (sModeChangeFlags & CAM_CHANGE_MODE_4) {
+ camera->animState = 20;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ sModeChangeFlags &= ~CAM_CHANGE_MODE_4;
+
+ // Z-Pressing Sfx
+ if (camera->status == CAM_STATUS_ACTIVE) {
+ switch (sModeChangeFlags) {
+ case CAM_CHANGE_MODE_0:
+ play_sound(0);
+ break;
+
+ case CAM_CHANGE_MODE_1:
+ if (camera->play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_1) {
+ play_sound(NA_SE_SY_ATTENTION_URGENCY);
+ } else {
+
+ play_sound(NA_SE_SY_ATTENTION_ON);
+ }
+ break;
+
+ case CAM_CHANGE_MODE_BATTLE:
+ play_sound(NA_SE_SY_ATTENTION_URGENCY);
+ break;
+
+ case CAM_CHANGE_MODE_FOLLOW_TARGET:
+ play_sound(NA_SE_SY_ATTENTION_ON);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ func_800DF498(camera);
+ camera->mode = mode;
+
+ return mode | 0x80000000;
+}
+
+s32 Camera_ChangeMode(Camera* camera, s16 mode) {
+ return Camera_ChangeModeFlags(camera, mode, false);
+}
+
+s32 Camera_CheckValidMode(Camera* camera, s16 mode) {
+ if (camera->stateFlags & CAM_STATE_DISABLE_MODE_CHANGE) {
+ return 0;
+ } else if (!(sCameraSettings[camera->setting].validModes & (1 << mode))) {
+ return 0;
+ } else if (mode == camera->mode) {
+ return -1;
+ } else {
+ return mode | 0x80000000;
+ }
+}
+
+s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags) {
+ // Reject settings change based on priority
+ if ((camera->behaviorFlags & CAM_BEHAVIOR_SETTING_USE_PRIORITY) &&
+ ((sCameraSettings[camera->setting].flags & 0xF) >= (sCameraSettings[setting].flags & 0xF))) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+ return -2;
+ }
+
+ // Reject settings change based on NONE setting
+ if (setting == CAM_SET_NONE) {
+ return 0;
+ }
+
+ // Reject settings change based on an invalid setting
+ if (setting >= CAM_SET_MAX) {
+ return -99;
+ }
+
+ // Reject settings change based on setting already set (and flags)
+ if ((setting == camera->setting) && !(flags & CAM_CHANGE_SETTING_0)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_2;
+
+ if (!(flags & CAM_CHANGE_SETTING_1)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_SETTING_USE_PRIORITY;
+ }
+
+ func_800DF498(camera);
+
+ if (!(sCameraSettings[camera->setting].flags & 0x40000000)) {
+ camera->prevSetting = camera->setting;
+ }
+
+ if (flags & CAM_CHANGE_SETTING_3) {
+ camera->bgCamIndex = camera->prevBgCamDataId;
+ camera->prevBgCamDataId = -1;
+ } else if (!(flags & CAM_CHANGE_SETTING_2)) {
+ if (!(sCameraSettings[camera->setting].flags & 0x40000000)) {
+ camera->prevBgCamDataId = camera->bgCamIndex;
+ }
+ camera->bgCamIndex = -1;
+ }
+
+ camera->setting = setting;
+
+ if (Camera_ChangeModeFlags(camera, camera->mode, true) >= 0) {
+ Camera_ResetActionFuncState(camera, camera->mode);
+ }
+
+ return setting;
+}
+
+s32 Camera_ChangeSetting(Camera* camera, s16 setting) {
+ s32 settingChangeSuccessful = Camera_ChangeSettingFlags(camera, setting, 0);
+
+ if (settingChangeSuccessful >= 0) {
+ camera->bgCamIndex = -1;
+ }
+ return settingChangeSuccessful;
+}
+
+s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex) {
+ s16 setting;
+
+ if ((bgCamIndex == -1) || (bgCamIndex == camera->bgCamIndex)) {
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_2;
+ return -1;
+ }
+
+ if (bgCamIndex < 0) {
+ setting = sGlobalCamDataSettingsPtr[bgCamIndex];
+ } else if (!(camera->behaviorFlags & CAM_BEHAVIOR_BGCAM_2)) {
+ setting = Camera_GetBgCamOrActorCsCamSetting(camera, bgCamIndex);
+ } else {
+ return -1;
+ }
+
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_2;
+
+ // Sets camera setting based on bg/scene data
+ if ((Camera_ChangeSettingFlags(camera, setting, CAM_CHANGE_SETTING_2 | CAM_CHANGE_SETTING_0) >= 0) ||
+ (sCameraSettings[camera->setting].flags & 0x80000000)) {
+ camera->bgCamIndex = bgCamIndex;
+ camera->behaviorFlags |= CAM_BEHAVIOR_BGCAM_1;
+ Camera_ResetActionFuncState(camera, camera->mode);
+ }
+
+ return bgCamIndex | 0x80000000;
+}
+
+Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera) {
+ *dst = camera->inputDir;
+ return dst;
+}
+
+s16 Camera_GetInputDirPitch(Camera* camera) {
+ Vec3s dir;
+
+ Camera_GetInputDir(&dir, camera);
+ return dir.x;
+}
+
+s16 Camera_GetInputDirYaw(Camera* camera) {
+ Vec3s dir;
+
+ Camera_GetInputDir(&dir, camera);
+ return dir.y;
+}
+
+Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera) {
+ *dst = camera->camDir;
+ return dst;
+}
+
+s16 Camera_GetCamDirPitch(Camera* camera) {
+ Vec3s camDir;
+
+ Camera_GetCamDir(&camDir, camera);
+ return camDir.x;
+}
+
+s16 Camera_GetCamDirYaw(Camera* camera) {
+ Vec3s camDir;
+
+ Camera_GetCamDir(&camDir, camera);
+ return camDir.y;
+}
+
+s32 Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown) {
+ s16 quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
+
+ if (quakeIndex == 0) {
+ return false;
+ }
+
+ Quake_SetSpeed(quakeIndex, 25000);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, countdown);
+ return true;
+}
+
+s32 Camera_SetViewParam(Camera* camera, s32 viewFlag, void* param) {
+ s32 pad[3];
+
+ if (param != NULL) {
+ switch (viewFlag) {
+ case CAM_VIEW_AT:
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ camera->at = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_TARGET_POS:
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ camera->targetPosRot.pos = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_TARGET:
+ camera->target = (Actor*)param;
+ camera->viewFlags &= ~(CAM_VIEW_TARGET_POS | CAM_VIEW_TARGET | CAM_VIEW_AT);
+ break;
+
+ case CAM_VIEW_EYE:
+ camera->eye = camera->eyeNext = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_UP:
+ camera->up = *(Vec3f*)param;
+ break;
+
+ case CAM_VIEW_ROLL:
+ camera->roll = CAM_DEG_TO_BINANG(*(f32*)param);
+ break;
+
+ case CAM_VIEW_FOV:
+ camera->fov = *(f32*)param;
+ break;
+
+ default:
+ return false;
+ }
+ camera->viewFlags |= viewFlag;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+s32 Camera_UnsetViewFlag(Camera* camera, s16 viewFlag) {
+ camera->viewFlags &= ~viewFlag;
+ return true;
+}
+
+s32 Camera_OverwriteStateFlags(Camera* camera, s16 stateFlags) {
+ camera->stateFlags = stateFlags;
+ return true;
+}
+
+s32 Camera_ResetActionFuncStateUnused(Camera* camera) {
+ camera->animState = 0;
+ return true;
+}
+
+/**
+ * Unused Remnant of OoT. `CutsceneCameraPoint` struct no longer exists.
+ */
+s32 Camera_SetCsParams(Camera* camera, void* atPoints, void* eyePoints, Player* player, s16 relativeToPlayer) {
+ return true;
+}
+
+s16 Camera_SetStateFlag(Camera* camera, s16 flags) {
+ camera->stateFlags |= flags;
+ return camera->stateFlags;
+}
+
+s16 Camera_UnsetStateFlag(Camera* camera, s16 flags) {
+ camera->stateFlags &= ~flags;
+ return camera->stateFlags;
+}
+
+s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2,
+ s16 timer3) {
+ DoorParams* doorParams = &camera->paramData.doorParams;
+
+ if (camera->setting == CAM_SET_DOORC) {
+ return 0;
+ }
+
+ doorParams->doorActor = doorActor;
+ doorParams->timer1 = timer1;
+ doorParams->timer2 = timer2;
+ doorParams->timer3 = timer3;
+ doorParams->bgCamIndex = bgCamIndex;
+
+ if (bgCamIndex == -99) {
+ Camera_ResetActionFuncState(camera, camera->mode);
+ return -99;
+ }
+
+ if (bgCamIndex == -1) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_DOORC, 0);
+ } else if (bgCamIndex == -2) {
+ Camera_ChangeSettingFlags(camera, CAM_SET_SPIRAL_DOOR, 0);
+ } else {
+ camera->nextCamSceneDataId = bgCamIndex;
+ camera->doorTimer1 = timer1;
+ camera->doorTimer2 = timer2 + timer3;
+ }
+
+ Camera_ResetActionFuncState(camera, camera->mode);
+ return -1;
+}
+
+s32 Camera_Copy(Camera* dstCam, Camera* srcCam) {
+ s32 pad;
+
+ dstCam->focalActorAtOffset.z = 0.0f;
+ dstCam->focalActorAtOffset.y = 0.0f;
+ dstCam->focalActorAtOffset.x = 0.0f;
+ dstCam->atLerpStepScale = 0.1f;
+ dstCam->at = srcCam->at;
+
+ dstCam->eye = dstCam->eyeNext = srcCam->eye;
+
+ dstCam->dist = OLib_Vec3fDist(&dstCam->at, &dstCam->eye);
+ dstCam->fov = srcCam->fov;
+ dstCam->roll = srcCam->roll;
+ Camera_SetUpdateRatesSlow(dstCam);
+
+ if (dstCam->focalActor != NULL) {
+ if (dstCam->focalActor == &GET_PLAYER(dstCam->play)->actor) {
+ Actor_GetWorldPosShapeRot(&dstCam->focalActorPosRot, dstCam->focalActor);
+ } else {
+ Actor_GetWorld(&dstCam->focalActorPosRot, dstCam->focalActor);
+ }
+ Camera_SetFocalActorAtOffset(dstCam, &dstCam->focalActorPosRot.pos);
+ }
+ return true;
+}
+
+/**
+ * Unused Remnant of OoT/Debug
+ */
+s32 Camera_IsDbgCamEnabled(void) {
+ return false;
+}
+
+Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera) {
+ *quakeOffset = camera->quakeOffset;
+
+ return quakeOffset;
+}
+
+void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3) {
+ if (setDataFlags & 1) {
+ camera->data0 = data0;
+ }
+
+ if (setDataFlags & 2) {
+ camera->data1 = data1;
+ }
+
+ if (setDataFlags & 4) {
+ camera->data2 = data2;
+ }
+
+ if (setDataFlags & 8) {
+ camera->data3 = data3;
+ }
+}
+
+s32 Camera_GetNegOne(void) {
+ return sCameraNegOne;
+}
+
+s16 func_800E0238(Camera* camera) {
+ Camera_SetStateFlag(camera, CAM_STATE_3);
+ if ((camera->camId == CAM_ID_MAIN) && (camera->play->activeCamId != CAM_ID_MAIN)) {
+ Camera_SetStateFlag(GET_ACTIVE_CAM(camera->play), CAM_STATE_3);
+ return camera->play->activeCamId;
+ } else {
+ return camera->camId;
+ }
+}
+
+void Camera_SetFocalActor(Camera* camera, Actor* actor) {
+ camera->focalActor = actor;
+ if (actor == &GET_PLAYER(camera->play)->actor) {
+ Actor_GetWorldPosShapeRot(&camera->focalActorPosRot, actor);
+ } else {
+ Actor_GetWorld(&camera->focalActorPosRot, camera->focalActor);
+ }
+
+ camera->animState = 0;
+}
+
+void Camera_SetTargetActor(Camera* camera, Actor* actor) {
+ camera->target = actor;
+ camera->animState = 20;
+}
+
+f32 Camera_GetWaterYPos(Camera* camera) {
+ if (camera->stateFlags & CAM_STATE_UNDERWATER) {
+ return camera->waterYPos;
+ } else {
+ return BGCHECK_Y_MIN;
+ }
+}
+
+void func_800E0348(Camera* camera) {
+ if (!RELOAD_PARAMS(camera)) {
+ camera->animState = 999;
+ Camera_SetStateFlag(camera, CAM_STATE_10 | CAM_STATE_4 | CAM_STATE_2 | CAM_STATE_CHECK_WATER);
+ } else {
+ camera->animState = 666;
+ }
+}
diff --git a/src/code/z_camera_data.inc.c b/src/code/z_camera_data.inc.c
index a8e9fbb80..6e1501fd8 100644
--- a/src/code/z_camera_data.inc.c
+++ b/src/code/z_camera_data.inc.c
@@ -3613,31 +3613,31 @@ CameraSetting sCameraSettings[] = {
};
s16 sGlobalCamDataSettings[] = {
- /* -25 */ CAM_SET_ELEGY_SHELL,
- /* -24 */ CAM_SET_SIDED,
- /* -23 */ CAM_SET_BOAT_CRUISE,
- /* -22 */ CAM_SET_NONE,
- /* -21 */ CAM_SET_SUBJECTD,
- /* -20 */ CAM_SET_NORMALD,
- /* -19 */ CAM_SET_NONE,
- /* -18 */ CAM_SET_NONE,
- /* -17 */ CAM_SET_NONE,
- /* -16 */ CAM_SET_WARP_PAD_ENTRANCE,
- /* -15 */ CAM_SET_ATTENTION,
- /* -14 */ CAM_SET_CONNECT0,
- /* -13 */ CAM_SET_REMOTEBOMB,
- /* -12 */ CAM_SET_NONE,
- /* -11 */ CAM_SET_MASK_TRANSFORMATION,
- /* -10 */ CAM_SET_LONG_CHEST_OPENING,
- /* -9 */ CAM_SET_REBIRTH,
- /* -8 */ CAM_SET_DEATH,
- /* -7 */ CAM_SET_WARP_PAD_MOON,
- /* -6 */ CAM_SET_NAVI,
- /* -5 */ CAM_SET_ITEM3,
- /* -4 */ CAM_SET_ITEM2,
- /* -3 */ CAM_SET_ITEM1,
- /* -2 */ CAM_SET_ITEM0,
- /* -1 */ CAM_SET_STOP0,
+ /* -25 */ CAM_SET_ELEGY_SHELL, // CS_CAM_ID_GLOBAL_ELEGY
+ /* -24 */ CAM_SET_SIDED, // CS_CAM_ID_GLOBAL_SIDED
+ /* -23 */ CAM_SET_BOAT_CRUISE, // CS_CAM_ID_GLOBAL_BOAT_CRUISE
+ /* -22 */ CAM_SET_NONE, // CS_CAM_ID_GLOBAL_N16
+ /* -21 */ CAM_SET_SUBJECTD, // CS_CAM_ID_GLOBAL_SUBJECTD
+ /* -20 */ CAM_SET_NORMALD, // CS_CAM_ID_GLOBAL_NORMALD
+ /* -19 */ CAM_SET_NONE, // CS_CAM_ID_GLOBAL_N13
+ /* -18 */ CAM_SET_NONE, // CS_CAM_ID_GLOBAL_N12
+ /* -17 */ CAM_SET_NONE, // CS_CAM_ID_GLOBAL_N11
+ /* -16 */ CAM_SET_WARP_PAD_ENTRANCE, // CS_CAM_ID_GLOBAL_WARP_PAD_ENTRANCE
+ /* -15 */ CAM_SET_ATTENTION, // CS_CAM_ID_GLOBAL_ATTENTION
+ /* -14 */ CAM_SET_CONNECT0, // CS_CAM_ID_GLOBAL_CONNECT
+ /* -13 */ CAM_SET_REMOTEBOMB, // CS_CAM_ID_GLOBAL_REMOTE_BOMB
+ /* -12 */ CAM_SET_NONE, // CS_CAM_ID_GLOBAL_N0C
+ /* -11 */ CAM_SET_MASK_TRANSFORMATION, // CS_CAM_ID_GLOBAL_MASK_TRANSFORMATION
+ /* -10 */ CAM_SET_LONG_CHEST_OPENING, // CS_CAM_ID_GLOBAL_LONG_CHEST_OPENING
+ /* -9 */ CAM_SET_REBIRTH, // CS_CAM_ID_GLOBAL_REVIVE
+ /* -8 */ CAM_SET_DEATH, // CS_CAM_ID_GLOBAL_DEATH
+ /* -7 */ CAM_SET_WARP_PAD_MOON, // CS_CAM_ID_GLOBAL_WARP_PAD_MOON
+ /* -6 */ CAM_SET_NAVI, // CS_CAM_ID_GLOBAL_SONG_WARP
+ /* -5 */ CAM_SET_ITEM3, // CS_CAM_ID_GLOBAL_ITEM_SHOW
+ /* -4 */ CAM_SET_ITEM2, // CS_CAM_ID_GLOBAL_ITEM_BOTTLE
+ /* -3 */ CAM_SET_ITEM1, // CS_CAM_ID_GLOBAL_ITEM_OCARINA
+ /* -2 */ CAM_SET_ITEM0, // CS_CAM_ID_GLOBAL_ITEM_GET
+ /* -1 */ CAM_SET_STOP0, // CS_CAM_ID_NONE
/* 0 */ CAM_SET_NONE,
};
@@ -3795,12 +3795,12 @@ s32 sCameraHudVisibility = 2;
s32 sCameraLetterboxSize = 32;
s32 sCameraNegOne = -1;
-// VecSph yaw data
+// VecGeo yaw data
s16 D_801B9E18[] = {
0x0AAA, 0xF556, 0x1555, 0xEAAB, 0x2AAA, 0xD556, 0x3FFF, 0xC001, 0x5555, 0xAAAB, 0x6AAA, 0x9556, 0x7FFF, 0x0000,
};
-// VecSph pitch data
+// VecGeo pitch data
s16 D_801B9E34[] = {
0x0000, 0x02C6, 0x058C, 0x0000, 0x0000, 0xFD3A, 0x0000, 0x0852, 0x0000, 0x0000, 0x0B18, 0x02C6, 0xFA74, 0x0000,
};
diff --git a/src/code/z_cheap_proc.c b/src/code/z_cheap_proc.c
index 2b4f67cae..82303a172 100644
--- a/src/code/z_cheap_proc.c
+++ b/src/code/z_cheap_proc.c
@@ -10,7 +10,7 @@ void Gfx_DrawDListOpa(PlayState* play, Gfx* dlist) {
dl = POLY_OPA_DISP;
- gSPDisplayList(&dl[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dl[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&dl[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&dl[2], dlist);
@@ -29,7 +29,7 @@ void Gfx_DrawDListXlu(PlayState* play, Gfx* dlist) {
dl = POLY_XLU_DISP;
- gSPDisplayList(&dl[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dl[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&dl[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&dl[2], dlist);
diff --git a/src/code/z_collision_btltbls.c b/src/code/z_collision_btltbls.c
index c9f014f4f..36528e467 100644
--- a/src/code/z_collision_btltbls.c
+++ b/src/code/z_collision_btltbls.c
@@ -790,7 +790,7 @@ DamageTable sDamageTablePresets[] = {
* is out of range.
*/
DamageTable* DamageTable_Get(s32 index) {
- if (index < 0 || index > ARRAY_COUNT(sDamageTablePresets) - 1) {
+ if ((index < 0) || (index >= ARRAY_COUNT(sDamageTablePresets))) {
return NULL;
}
diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c
index 6ecbd617a..b7f07d14d 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
Vec3f D_801EDE00;
@@ -24,16 +23,24 @@ Vec3f D_801EE0D8;
TriNorm D_801EE0E8[2];
TriNorm D_801EE150;
TriNorm D_801EE188;
+
+#ifndef NON_MATCHING
Vec3f D_801EE1C0;
Vec3f D_801EE1D0;
Vec3f D_801EE1E0;
Vec3f D_801EE1F0;
EffectSparkInit D_801EE200;
+#endif
+
TriNorm D_801EE6C8;
TriNorm D_801EE700;
+
+#ifndef NON_MATCHING
EffectSparkInit D_801EE738;
EffectSparkInit D_801EEC00;
EffectSparkInit D_801EF0C8;
+#endif
+
TriNorm D_801EF590;
TriNorm D_801EF5C8;
TriNorm D_801EF600;
@@ -85,7 +92,8 @@ f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderInfo* ac) {
* factors such as the ac collider's defense.
*/
s32 CollisionCheck_GetToucherDamage(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo) {
- if (at->actor != NULL && at->actor->id == ACTOR_EN_BOM && ac->actor != NULL && ac->actor->id == ACTOR_PLAYER) {
+ if ((at->actor != NULL) && (at->actor->id == ACTOR_EN_BOM) && (ac->actor != NULL) &&
+ (ac->actor->id == ACTOR_PLAYER)) {
return 8;
}
return atInfo->toucher.damage;
@@ -1146,7 +1154,7 @@ s32 CollisionCheck_SetAT(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sATResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colATCount >= ARRAY_COUNT(colCtxt->colAT)) {
@@ -1172,7 +1180,7 @@ s32 CollisionCheck_SetAT_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sATResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1206,7 +1214,7 @@ s32 CollisionCheck_SetAC(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sACResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colACCount >= ARRAY_COUNT(colCtxt->colAC)) {
@@ -1232,7 +1240,7 @@ s32 CollisionCheck_SetAC_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sACResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1266,7 +1274,7 @@ s32 CollisionCheck_SetOC(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sOCResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colOCCount >= ARRAY_COUNT(colCtxt->colOC)) {
@@ -1292,7 +1300,7 @@ s32 CollisionCheck_SetOC_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sOCResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1516,7 +1524,7 @@ void CollisionCheck_RedBloodUnused(PlayState* play, Collider* collider, Vec3f* v
void CollisionCheck_HitSolid(PlayState* play, ColliderInfo* info, Collider* collider, Vec3f* hitPos) {
s32 flags = info->toucherFlags & TOUCH_SFX_NONE;
- if (flags == TOUCH_SFX_NORMAL && collider->colType != COLTYPE_METAL) {
+ if ((flags == TOUCH_SFX_NORMAL) && (collider->colType != COLTYPE_METAL)) {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (collider->actor == NULL) {
play_sound(NA_SE_IT_SHIELD_BOUND);
@@ -1551,7 +1559,7 @@ void CollisionCheck_HitSolid(PlayState* play, ColliderInfo* info, Collider* coll
* Plays a hit sound effect for AT colliders attached to Player based on the AC element's elemType.
*/
s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo) {
- if (at->actor != NULL && at->actor->category == ACTORCAT_PLAYER) {
+ if ((at->actor != NULL) && (at->actor->category == ACTORCAT_PLAYER)) {
if (acInfo->elemType == ELEMTYPE_UNK0) {
Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
} else if (acInfo->elemType == ELEMTYPE_UNK1) {
@@ -1645,7 +1653,7 @@ s32 CollisionCheck_SetATvsAC(PlayState* play, Collider* at, ColliderInfo* atInfo
return 0;
}
}
- if ((ac->acFlags & AC_HARD) && at->actor != NULL && ac->actor != NULL) {
+ if ((ac->acFlags & AC_HARD) && (at->actor != NULL) && (ac->actor != NULL)) {
CollisionCheck_SetBounce(at, ac);
}
if (!(acInfo->bumperFlags & BUMP_NO_AT_INFO)) {
@@ -1676,8 +1684,8 @@ s32 CollisionCheck_SetATvsAC(PlayState* play, Collider* at, ColliderInfo* atInfo
acInfo->bumper.hitPos.y = hitPos->y;
acInfo->bumper.hitPos.z = hitPos->z;
}
- if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && ac->colType != COLTYPE_METAL && ac->colType != COLTYPE_WOOD &&
- ac->colType != COLTYPE_HARD) {
+ if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && (ac->colType != COLTYPE_METAL) && (ac->colType != COLTYPE_WOOD) &&
+ (ac->colType != COLTYPE_HARD)) {
acInfo->bumperFlags |= BUMP_DRAW_HITMARK;
} else {
CollisionCheck_HitEffects(play, at, atInfo, ac, acInfo, hitPos);
@@ -1712,7 +1720,7 @@ void CollisionCheck_AC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->count > 0) && (ac->elements != NULL)) {
for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) {
if (CollisionCheck_SkipTouch(&atElem->info)) {
continue;
@@ -1766,7 +1774,7 @@ void CollisionCheck_AC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL && ac->dim.radius > 0 && ac->dim.height > 0) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->dim.radius > 0) && (ac->dim.height > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1815,7 +1823,7 @@ void CollisionCheck_AC_JntSphVsTris(PlayState* play, CollisionCheckContext* colC
ColliderTrisElement* acElem;
Vec3f hitPos;
- if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->count > 0) && (ac->elements != NULL)) {
for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) {
if (CollisionCheck_SkipTouch(&atElem->info)) {
continue;
@@ -1851,7 +1859,7 @@ void CollisionCheck_AC_JntSphVsQuad(PlayState* play, CollisionCheckContext* colC
Vec3f hitPos;
ColliderJntSphElement* sphElem;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1891,7 +1899,7 @@ void CollisionCheck_AC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1936,7 +1944,7 @@ void CollisionCheck_AC_CylVsJntSph(PlayState* play, CollisionCheckContext* colCt
f32 centerDist;
ColliderJntSphElement* sphElem;
- if (ac->count > 0 && ac->elements != NULL && at->dim.radius > 0 && at->dim.height > 0) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->dim.radius > 0) && (at->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -1987,7 +1995,7 @@ void CollisionCheck_AC_CylVsCyl(PlayState* play, CollisionCheckContext* colCtxt,
f32 overlapSize;
f32 centerDist;
- if (at->dim.radius > 0 && at->dim.height > 0 && ac->dim.radius > 0 && ac->dim.height > 0) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0) && (ac->dim.radius > 0) && (ac->dim.height > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2039,7 +2047,7 @@ void CollisionCheck_AC_CylVsTris(PlayState* play, CollisionCheckContext* colCtxt
ColliderTrisElement* acElem;
Vec3f hitPos;
- if (at->dim.radius > 0 && at->dim.height > 0 && ac->count > 0 && ac->elements != NULL) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0) && (ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2072,7 +2080,7 @@ void CollisionCheck_AC_CylVsQuad(PlayState* play, CollisionCheckContext* colCtxt
ColliderCylinder* at = (ColliderCylinder*)colAT;
ColliderQuad* ac = (ColliderQuad*)colAC;
- if (at->dim.height > 0 && at->dim.radius > 0) {
+ if ((at->dim.height > 0) && (at->dim.radius > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2112,7 +2120,7 @@ void CollisionCheck_AC_CylVsSphere(PlayState* play, CollisionCheckContext* colCt
f32 overlapSize;
f32 centerDist;
- if (at->dim.radius > 0 && at->dim.height > 0) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2159,7 +2167,7 @@ void CollisionCheck_AC_TrisVsJntSph(PlayState* play, CollisionCheckContext* colC
ColliderTrisElement* atElem;
Vec3f hitPos;
- if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->count > 0) && (at->elements != NULL)) {
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
if (CollisionCheck_SkipBump(&acElem->info)) {
continue;
@@ -2197,7 +2205,7 @@ void CollisionCheck_AC_TrisVsCyl(PlayState* play, CollisionCheckContext* colCtxt
ColliderCylinder* ac = (ColliderCylinder*)colAC;
ColliderTrisElement* atElem;
- if (ac->dim.radius > 0 && ac->dim.height > 0 && at->count > 0 && at->elements != NULL) {
+ if ((ac->dim.radius > 0) && (ac->dim.height > 0) && (at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2231,7 +2239,7 @@ void CollisionCheck_AC_TrisVsTris(PlayState* play, CollisionCheckContext* colCtx
ColliderTris* ac = (ColliderTris*)colAC;
ColliderTrisElement* acElem;
- if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->count > 0) && (at->elements != NULL)) {
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
if (CollisionCheck_SkipBump(&acElem->info)) {
continue;
@@ -2266,7 +2274,7 @@ void CollisionCheck_AC_TrisVsQuad(PlayState* play, CollisionCheckContext* colCtx
ColliderQuad* ac = (ColliderQuad*)colAC;
ColliderTrisElement* atElem;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2305,7 +2313,7 @@ void CollisionCheck_AC_TrisVsSphere(PlayState* play, CollisionCheckContext* colC
ColliderSphere* ac = (ColliderSphere*)colAC;
Vec3f hitPos;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2337,7 +2345,7 @@ void CollisionCheck_AC_QuadVsJntSph(PlayState* play, CollisionCheckContext* colC
ColliderQuad* at = (ColliderQuad*)colAT;
ColliderJntSph* ac = (ColliderJntSph*)colAC;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2378,7 +2386,7 @@ void CollisionCheck_AC_QuadVsCyl(PlayState* play, CollisionCheckContext* colCtxt
ColliderQuad* at = (ColliderQuad*)colAT;
ColliderCylinder* ac = (ColliderCylinder*)colAC;
- if (ac->dim.height > 0 && ac->dim.radius > 0) {
+ if ((ac->dim.height > 0) && (ac->dim.radius > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2424,7 +2432,7 @@ void CollisionCheck_AC_QuadVsTris(PlayState* play, CollisionCheckContext* colCtx
ColliderTris* ac = (ColliderTris*)colAC;
ColliderTrisElement* acElem;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2539,7 +2547,7 @@ void CollisionCheck_AC_SphereVsJntSph(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2732,7 +2740,7 @@ void CollisionCheck_SetJntSphHitFX(PlayState* play, CollisionCheckContext* colCt
ColliderJntSphElement* element;
for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) {
- if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL &&
+ if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && (element->info.acHitInfo != NULL) &&
!(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2751,7 +2759,7 @@ void CollisionCheck_SetJntSphHitFX(PlayState* play, CollisionCheckContext* colCt
void CollisionCheck_SetCylHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderCylinder* cylinder = (ColliderCylinder*)collider;
- if ((cylinder->info.bumperFlags & BUMP_DRAW_HITMARK) && cylinder->info.acHitInfo != NULL &&
+ if ((cylinder->info.bumperFlags & BUMP_DRAW_HITMARK) && (cylinder->info.acHitInfo != NULL) &&
!(cylinder->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2770,7 +2778,7 @@ void CollisionCheck_SetTrisHitFX(PlayState* play, CollisionCheckContext* colCtxt
ColliderTrisElement* element;
for (element = tris->elements; element < &tris->elements[tris->count]; element++) {
- if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL &&
+ if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && (element->info.acHitInfo != NULL) &&
!(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2789,7 +2797,7 @@ void CollisionCheck_SetTrisHitFX(PlayState* play, CollisionCheckContext* colCtxt
void CollisionCheck_SetQuadHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderQuad* quad = (ColliderQuad*)collider;
- if ((quad->info.bumperFlags & BUMP_DRAW_HITMARK) && quad->info.acHitInfo != NULL &&
+ if ((quad->info.bumperFlags & BUMP_DRAW_HITMARK) && (quad->info.acHitInfo != NULL) &&
!(quad->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2805,7 +2813,7 @@ void CollisionCheck_SetQuadHitFX(PlayState* play, CollisionCheckContext* colCtxt
void CollisionCheck_SetSphereHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderSphere* sphere = (ColliderSphere*)collider;
- if ((sphere->info.bumperFlags & BUMP_DRAW_HITMARK) && sphere->info.acHitInfo != NULL &&
+ if ((sphere->info.bumperFlags & BUMP_DRAW_HITMARK) && (sphere->info.acHitInfo != NULL) &&
!(sphere->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2830,8 +2838,8 @@ void CollisionCheck_SetHitEffects(PlayState* play, CollisionCheckContext* colCtx
for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->acFlags & AC_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->acFlags & AC_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
sColChkApplyFuncs[colAC->shape](play, colCtxt, colAC);
@@ -2861,12 +2869,12 @@ void CollisionCheck_AC(PlayState* play, CollisionCheckContext* colCtxt, Collider
for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->acFlags & AC_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->acFlags & AC_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
- if ((colAC->acFlags & colAT->atFlags & AC_TYPE_ALL) && colAT != colAC) {
- if (!(colAT->atFlags & AT_SELF) && colAT->actor != NULL && colAC->actor == colAT->actor) {
+ if ((colAC->acFlags & colAT->atFlags & AC_TYPE_ALL) && (colAT != colAC)) {
+ if (!(colAT->atFlags & AT_SELF) && (colAT->actor != NULL) && (colAC->actor == colAT->actor)) {
continue;
}
sACVsFuncs[colAT->shape][colAC->shape](play, colCtxt, colAT, colAC);
@@ -2884,15 +2892,15 @@ void CollisionCheck_AC(PlayState* play, CollisionCheckContext* colCtxt, Collider
void CollisionCheck_AT(PlayState* play, CollisionCheckContext* colCtxt) {
Collider** col;
- if (colCtxt->colATCount == 0 || colCtxt->colACCount == 0) {
+ if ((colCtxt->colATCount == 0) || (colCtxt->colACCount == 0)) {
return;
}
for (col = &colCtxt->colAT[0]; col < &colCtxt->colAT[colCtxt->colATCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->atFlags & AT_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->atFlags & AT_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
CollisionCheck_AC(play, colCtxt, colAC);
@@ -2951,7 +2959,8 @@ void CollisionCheck_SetOCvsOC(PlayState* play, Collider* left, ColliderInfo* lef
right->ocFlags2 |= OC2_HIT_PLAYER;
}
- if (leftActor == NULL || rightActor == NULL || (left->ocFlags1 & OC1_NO_PUSH) || (right->ocFlags1 & OC1_NO_PUSH)) {
+ if ((leftActor == NULL) || (rightActor == NULL) || (left->ocFlags1 & OC1_NO_PUSH) ||
+ (right->ocFlags1 & OC1_NO_PUSH)) {
return;
}
@@ -3025,7 +3034,7 @@ void CollisionCheck_OC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
ColliderJntSphElement* rightElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && right->count > 0 && right->elements != NULL &&
+ if ((left->count > 0) && (left->elements != NULL) && (right->count > 0) && (right->elements != NULL) &&
(left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3060,7 +3069,7 @@ void CollisionCheck_OC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
ColliderJntSphElement* leftElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) &&
+ if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3089,7 +3098,7 @@ void CollisionCheck_OC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
ColliderJntSphElement* leftElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) &&
+ if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3245,11 +3254,11 @@ void CollisionCheck_OC(PlayState* play, CollisionCheckContext* colCtxt) {
ColChkVsFunc vsFunc;
for (left = colCtxt->colOC; left < colCtxt->colOC + colCtxt->colOCCount; left++) {
- if (*left == NULL || CollisionCheck_SkipOC(*left)) {
+ if ((*left == NULL) || CollisionCheck_SkipOC(*left)) {
continue;
}
for (right = left + 1; right < colCtxt->colOC + colCtxt->colOCCount; right++) {
- if (*right == NULL || CollisionCheck_SkipOC(*right) || CollisionCheck_Incompatible(*left, *right)) {
+ if ((*right == NULL) || CollisionCheck_SkipOC(*right) || CollisionCheck_Incompatible(*left, *right)) {
continue;
}
vsFunc = sOCVsFuncs[(*left)->shape][(*right)->shape];
@@ -3346,7 +3355,7 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colCtxt,
at = info->acHit;
atInfo = info->acHitInfo;
- if (at != NULL && atInfo != NULL && collider != NULL && info != NULL) {
+ if ((at != NULL) && (atInfo != NULL) && (collider != NULL) && (info != NULL)) {
damage = CollisionCheck_GetDamageAndEffectOnBumper(at, atInfo, collider, info, &effect);
if (CollisionCheck_GetToucherDamage(at, atInfo, collider, info) != 0) {
@@ -3366,7 +3375,7 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colCtxt,
collider->actor->colChkInfo.damageEffect = effect;
}
if (!(collider->acFlags & AC_HARD) ||
- ((collider->acFlags & AC_HARD) && atInfo->toucher.dmgFlags == 0x20000000)) {
+ ((collider->acFlags & AC_HARD) && (atInfo->toucher.dmgFlags == 0x20000000))) {
if (collider->actor->colChkInfo.damage < finalDamage) {
collider->actor->colChkInfo.damage = finalDamage;
}
@@ -3381,7 +3390,7 @@ void CollisionCheck_ApplyDamageJntSph(PlayState* play, CollisionCheckContext* co
ColliderJntSph* jntSph = (ColliderJntSph*)collider;
s32 i;
- if (jntSph->count > 0 && jntSph->elements != NULL) {
+ if ((jntSph->count > 0) && (jntSph->elements != NULL)) {
for (i = 0; i < jntSph->count; i++) {
CollisionCheck_ApplyDamage(play, colCtxt, &jntSph->base, &jntSph->elements[i].info);
}
@@ -3958,7 +3967,7 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
if (SQ(actorDotItemXZ) < (4.0f * SQXZ(itemStep) * radSqDiff)) {
return 0;
}
- if (SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff) > zero) {
+ if ((SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff)) > zero) {
intersect1 = intersect2 = 1;
} else {
intersect1 = 1;
@@ -3998,12 +4007,12 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
}
if (intersect2 == 0) {
- if (frac1 < 0.0f || 1.0f < frac1) {
+ if ((frac1 < 0.0f) || (1.0f < frac1)) {
return 0;
}
} else {
- test1 = (frac1 < 0.0f || 1.0f < frac1);
- test2 = (frac2 < 0.0f || 1.0f < frac2);
+ test1 = (frac1 < 0.0f) || (1.0f < frac1);
+ test2 = (frac2 < 0.0f) || (1.0f < frac2);
if (test1 && test2) {
return 0;
@@ -4017,14 +4026,14 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
}
if ((intersect1 != 0) &&
- ((frac1 * itemStep.y + actorToItem.y < 0.0f) || (height < frac1 * itemStep.y + actorToItem.y))) {
+ (((frac1 * itemStep.y + actorToItem.y) < 0.0f) || (height < (frac1 * itemStep.y + actorToItem.y)))) {
intersect1 = 0;
}
if ((intersect2 != 0) &&
- ((frac2 * itemStep.y + actorToItem.y < 0.0f) || (height < frac2 * itemStep.y + actorToItem.y))) {
+ (((frac2 * itemStep.y + actorToItem.y) < 0.0f) || (height < (frac2 * itemStep.y + actorToItem.y)))) {
intersect2 = 0;
}
- if (intersect1 == 0 && intersect2 == 0) {
+ if ((intersect1 == 0) && (intersect2 == 0)) {
return 0;
} else if ((intersect1 != 0) && (intersect2 != 0)) {
out1->x = frac1 * itemStep.x + actorToItem.x + actorPos->x;
diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c
index 0e682231f..46dfe189e 100644
--- a/src/code/z_common_data.c
+++ b/src/code/z_common_data.c
@@ -8,10 +8,10 @@ void SaveContext_Init(void) {
gSaveContext.save.playerForm = 0;
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
- gSaveContext.unk_3F46 = NA_BGM_GENERAL_SFX;
+ gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX;
gSaveContext.nextCutsceneIndex = 0xFFEF;
gSaveContext.cutsceneTrigger = 0;
- gSaveContext.unk_3F4D = 0;
+ gSaveContext.chamberCutsceneNum = 0;
gSaveContext.nextDayTime = 0xFFFF;
gSaveContext.skyboxTime = 0;
gSaveContext.dogIsLost = true;
@@ -19,6 +19,6 @@ void SaveContext_Init(void) {
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.zTargetSetting = 0;
}
diff --git a/src/code/z_debug_display.c b/src/code/z_debug_display.c
index d9f20d72b..9dd4d86b2 100644
--- a/src/code/z_debug_display.c
+++ b/src/code/z_debug_display.c
@@ -67,7 +67,7 @@ void DebugDisplay_DrawObjects(PlayState* play) {
void DebugDisplay_DrawSpriteI8(DebugDispObject* dispObj, void* texture, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C6FC(play->state.gfxCtx);
+ Gfx_SetupDL47_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, dispObj->color.r, dispObj->color.g, dispObj->color.b, dispObj->color.a);
Matrix_Translate(dispObj->pos.x, dispObj->pos.y, dispObj->pos.z, MTXMODE_NEW);
@@ -90,7 +90,7 @@ Lights1 sDebugDisplayLight1 = gdSPDefLights1(128, 128, 128, 255, 255, 255, 73, 7
void DebugDisplay_DrawPolygon(DebugDispObject* dispObj, void* dList, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C588(play->state.gfxCtx);
+ Gfx_SetupDL4_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, dispObj->color.r, dispObj->color.g, dispObj->color.b, dispObj->color.a);
@@ -113,7 +113,7 @@ void DebugDisplay_DrawPath(PlayState* play, Path* path) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C560(play->state.gfxCtx);
+ Gfx_SetupDL38_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, DebugDisplay_PathDisplayList(play->state.gfxCtx, path));
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 08d56de69..00ee877e9 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -4,222 +4,235 @@
#include "z64shrink_window.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
-void Cutscene_DoNothing(PlayState* play, CutsceneContext* csCtx);
-void func_800EA258(PlayState* play, CutsceneContext* csCtx);
-void func_800ED9C4(PlayState* play, CutsceneContext* csCtx);
-void func_800EA2B8(PlayState* play, CutsceneContext* csCtx);
-void func_800ED980(PlayState* play, CutsceneContext* csCtx);
-void func_800EDA04(PlayState* play, CutsceneContext* csCtx);
-void func_800EDA84(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_DoNothing(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StartManual(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StopManual(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StartScript(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_RunScript(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StopScript(PlayState* play, CutsceneContext* csCtx);
+void Cutscene_SetupScripted(PlayState* play, CutsceneContext* csCtx);
// Unused
UNK_TYPE4 D_801BB120 = 0;
-u16 D_801BB124 = 0;
-u16 D_801BB128 = 0;
-u8 D_801BB12C = 0;
+u16 sCurTextId = 0;
+u16 sCurOcarinaAction = 0;
+u8 gOpeningEntranceIndex = 0;
u8 sCutsceneStoredPlayerForm = 0;
// bss
#ifndef NON_MATCHING
-static u16 seqId;
+static u16 sSeqId;
#endif
s16 sCutsceneQuakeIndex;
-DbCameraUnkStruct sCutsceneCameraInfo;
-u16 D_801F4DC8[10];
+CutsceneCamera sCutsceneCameraInfo;
+u16 sCueTypeList[10];
UNK_TYPE D_801F4DDC;
-u8 D_801F4DE0;
-s16 D_801F4DE2;
+u8 gDisablePlayerCsModeStartPos;
+s16 gDungeonBossWarpSceneId;
-void Cutscene_Init(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_InitContext(PlayState* play, CutsceneContext* csCtx) {
s32 i;
- csCtx->state = CS_STATE_0;
- csCtx->frames = 0;
- csCtx->unk_0C = 0.0f;
- play->csCtx.sceneCsCount = 0;
- play->csCtx.currentCsIndex = 0;
+ csCtx->state = CS_STATE_IDLE;
+ csCtx->curFrame = 0;
+ csCtx->timer = 0.0f;
+ play->csCtx.scriptListCount = 0;
+ play->csCtx.scriptIndex = 0;
- for (i = 0; i < ARRAY_COUNT(D_801F4DC8); i++) {
- D_801F4DC8[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(sCueTypeList); i++) {
+ sCueTypeList[i] = 0;
}
- D_801F4DE0 = 0;
+ gDisablePlayerCsModeStartPos = 0;
Audio_SetCutsceneFlag(false);
}
-void Cutscene_Start(PlayState* play, CutsceneContext* csCtx) {
- csCtx->state = CS_STATE_1;
- csCtx->playerAction = NULL;
+void Cutscene_StartManual(PlayState* play, CutsceneContext* csCtx) {
+ csCtx->state = CS_STATE_START;
+ csCtx->playerCue = NULL;
}
-void Cutscene_End(PlayState* play, CutsceneContext* csCtx) {
- if (csCtx->state != CS_STATE_4) {
- csCtx->state = CS_STATE_3;
+void Cutscene_StopManual(PlayState* play, CutsceneContext* csCtx) {
+ if (csCtx->state != CS_STATE_RUN_UNSTOPPABLE) {
+ csCtx->state = CS_STATE_STOP;
}
}
-typedef void (*CutsceneStateHandler)(PlayState* play, CutsceneContext* csCtx);
+typedef void (*CutsceneHandler)(PlayState* play, CutsceneContext* csCtx);
-CutsceneStateHandler sCsStateHandlers1[] = {
- Cutscene_DoNothing, // CS_STATE_0
- func_800EA258, // CS_STATE_1
- Cutscene_DoNothing, // CS_STATE_2
- func_800ED9C4, // CS_STATE_3
- Cutscene_DoNothing, // CS_STATE_4
+CutsceneHandler sManualCutsceneHandlers[] = {
+ CutsceneHandler_DoNothing, // CS_STATE_IDLE
+ CutsceneHandler_StartManual, // CS_STATE_START
+ CutsceneHandler_DoNothing, // CS_STATE_RUN
+ CutsceneHandler_StopManual, // CS_STATE_STOP
+ CutsceneHandler_DoNothing, // CS_STATE_RUN_UNSTOPPABLE
};
-void Cutscene_Update1(PlayState* play, CutsceneContext* csCtx) {
- if (gSaveContext.save.cutscene < 0xFFF0) {
- sCsStateHandlers1[csCtx->state](play, csCtx);
+void Cutscene_UpdateManual(PlayState* play, CutsceneContext* csCtx) {
+ if (gSaveContext.save.cutsceneIndex < 0xFFF0) {
+ sManualCutsceneHandlers[csCtx->state](play, csCtx);
}
}
-CutsceneStateHandler sCsStateHandlers2[] = {
- Cutscene_DoNothing, // CS_STATE_0
- func_800EA2B8, // CS_STATE_1
- func_800ED980, // CS_STATE_2
- func_800EDA04, // CS_STATE_3
- func_800ED980, // CS_STATE_4
+CutsceneHandler sScriptedCutsceneHandlers[] = {
+ CutsceneHandler_DoNothing, // CS_STATE_IDLE
+ CutsceneHandler_StartScript, // CS_STATE_START
+ CutsceneHandler_RunScript, // CS_STATE_RUN
+ CutsceneHandler_StopScript, // CS_STATE_STOP
+ CutsceneHandler_RunScript, // CS_STATE_RUN_UNSTOPPABLE
};
-void Cutscene_Update2(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_UpdateScripted(PlayState* play, CutsceneContext* csCtx) {
if ((gSaveContext.cutsceneTrigger != 0) && (play->transitionTrigger == TRANS_TRIGGER_START)) {
gSaveContext.cutsceneTrigger = 0;
}
- if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_0)) {
- gSaveContext.save.cutscene = 0xFFFD;
+ if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_IDLE)) {
+ gSaveContext.save.cutsceneIndex = 0xFFFD;
gSaveContext.cutsceneTrigger = 1;
}
- if (gSaveContext.save.cutscene >= 0xFFF0) {
- func_800EDA84(play, csCtx);
- sCsStateHandlers2[csCtx->state](play, csCtx);
+ if (gSaveContext.save.cutsceneIndex >= 0xFFF0) {
+ Cutscene_SetupScripted(play, csCtx);
+ sScriptedCutsceneHandlers[csCtx->state](play, csCtx);
}
}
-void Cutscene_DoNothing(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_DoNothing(PlayState* play, CutsceneContext* csCtx) {
}
-s32 func_800EA220(PlayState* play, CutsceneContext* csCtx, f32 target) {
- return Math_StepToF(&csCtx->unk_0C, target, 0.1f);
+s32 Cutscene_StepTimer(PlayState* play, CutsceneContext* csCtx, f32 target) {
+ return Math_StepToF(&csCtx->timer, target, 0.1f);
}
-void func_800EA258(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_StartManual(PlayState* play, CutsceneContext* csCtx) {
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
ShrinkWindow_Letterbox_SetSizeTarget(32);
- if (func_800EA220(play, csCtx, 1.0f)) {
+
+ if (Cutscene_StepTimer(play, csCtx, 1.0f)) {
Audio_SetCutsceneFlag(true);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
}
-void func_800EA2B8(PlayState* play, CutsceneContext* csCtx) {
- func_800ED980(play, csCtx);
+void CutsceneHandler_StartScript(PlayState* play, CutsceneContext* csCtx) {
+ CutsceneHandler_RunScript(play, csCtx);
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
ShrinkWindow_Letterbox_SetSizeTarget(32);
- if (func_800EA220(play, csCtx, 1.0f)) {
+
+ if (Cutscene_StepTimer(play, csCtx, 1.0f)) {
Audio_SetCutsceneFlag(true);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
}
/* Start of command handling section */
-// Command 0x96: Miscellaneous commands.
-void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
+void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
static u16 D_801BB15C = 0xFFFF;
Player* player = GET_PLAYER(play);
- f32 progress;
- u8 isStartFrame = false;
+ f32 lerp;
+ u8 isFirstFrame = false;
SceneTableEntry* loadedScene;
- if ((csCtx->frames < cmd->startFrame) || ((csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame))) {
+ if (!((csCtx->curFrame >= cmd->startFrame) &&
+ ((csCtx->curFrame < cmd->endFrame) || (cmd->endFrame == cmd->startFrame)))) {
return;
}
- progress = Environment_LerpWeight(cmd->endFrame - 1, cmd->startFrame, csCtx->frames);
- if (csCtx->frames == cmd->startFrame) {
- isStartFrame = true;
+ lerp = Environment_LerpWeight(cmd->endFrame - 1, cmd->startFrame, csCtx->curFrame);
+
+ if (csCtx->curFrame == cmd->startFrame) {
+ isFirstFrame = true;
}
- // TODO: consider creating an enum for this when we understand what each value does
- switch (cmd->base) {
- case 0x1:
- if (isStartFrame) {
+ switch (cmd->type) {
+ case CS_MISC_RAIN:
+ if (isFirstFrame) {
func_800FD78C(play);
- play->envCtx.unk_F2[0] = 0x3C;
+ play->envCtx.unk_F2[0] = 60;
}
break;
- case 0x2:
- if (isStartFrame) {
+
+ case CS_MISC_LIGHTNING:
+ if (isFirstFrame) {
Audio_SetAmbienceChannelIO(AMBIENCE_CHANNEL_LIGHTNING, CHANNEL_IO_PORT_0, 0);
Environment_AddLightningBolts(play, 3);
D_801F4E68 = 1;
}
break;
- case 0x3:
+
+ case CS_MISC_LIFT_FOG:
if (play->envCtx.lightSettings.zFar < 12800) {
play->envCtx.lightSettings.zFar += 35;
}
break;
- case 0x4:
- if (isStartFrame) {
- play->envCtx.unk_19 = 1;
- play->envCtx.unk_17 = 1;
- play->envCtx.unk_18 = 0;
- play->envCtx.unk_1A = 0x3C;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = 0;
- play->envCtx.unk_20 = 1;
- play->envCtx.unk_24 = 0x3C;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+
+ case CS_MISC_CLOUDY_SKY:
+ if (isFirstFrame) {
+ play->envCtx.changeSkyboxState = 1;
+ play->envCtx.skyboxConfig = 1;
+ play->envCtx.changeSkyboxNextConfig = 0;
+ play->envCtx.changeSkyboxTimer = 60;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = 0;
+ play->envCtx.changeLightNextConfig = 1;
+ play->envCtx.changeDuration = 60;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
break;
- case 0x5:
- if (isStartFrame && (csCtx->state != CS_STATE_4)) {
- csCtx->state = CS_STATE_3;
+
+ case CS_MISC_STOP_CUTSCENE:
+ if (isFirstFrame && (csCtx->state != CS_STATE_RUN_UNSTOPPABLE)) {
+ csCtx->state = CS_STATE_STOP;
}
break;
- case 0x7:
- if (isStartFrame) {
+
+ case CS_MISC_SHOW_TITLE_CARD:
+ if (isFirstFrame) {
loadedScene = play->loadedScene;
if (loadedScene->titleTextId != 0) {
func_80151A68(play, loadedScene->titleTextId);
}
}
break;
- case 0x8:
+
+ case CS_MISC_EARTHQUAKE_MEDIUM:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ if (isFirstFrame) {
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 22000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 6, 4, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 6, 4, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
- case 0x9:
- if (isStartFrame) {
+
+ case CS_MISC_EARTHQUAKE_STOP:
+ if (isFirstFrame) {
Quake_Init();
}
break;
- case 0xA:
+
+ case CS_MISC_VISMONO_BLACK_AND_WHITE:
gVisMonoColor.r = 255;
gVisMonoColor.g = 255;
gVisMonoColor.b = 255;
- gVisMonoColor.a = 255 * progress;
+ gVisMonoColor.a = 255 * lerp;
break;
- case 0xB:
+
+ case CS_MISC_VISMONO_SEPIA:
gVisMonoColor.r = 255;
gVisMonoColor.g = 180;
gVisMonoColor.b = 100;
- gVisMonoColor.a = 255 * progress;
+ gVisMonoColor.a = 255 * lerp;
break;
- case 0xC:
+
+ case CS_MISC_HIDE_ROOM:
play->roomCtx.curRoom.segment = NULL;
break;
- case 0xD:
+
+ case CS_MISC_RED_PULSATING_LIGHTS:
if (play->state.frames & 8) {
if (play->envCtx.lightSettings.ambientColor[0] < 40) {
play->envCtx.lightSettings.ambientColor[0] += 2;
@@ -234,96 +247,117 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c
}
}
break;
- case 0xE:
+
+ case CS_MISC_HALT_ALL_ACTORS:
play->haltAllActors = true;
break;
- case 0xF:
+
+ case CS_MISC_RESUME_ALL_ACTORS:
play->haltAllActors = false;
break;
- case 0x10:
- if (isStartFrame) {
+
+ case CS_MISC_SANDSTORM_FILL:
+ if (isFirstFrame) {
play->envCtx.sandstormState = 1;
}
func_8019F128(NA_SE_EV_SAND_STORM - SFX_FLAG);
break;
- case 0x11:
+
+ case CS_MISC_SUNSSONG_START:
gSaveContext.sunsSongState = SUNSSONG_START;
break;
- case 0x12:
+
+ case CS_MISC_FREEZE_TIME:
if (!gSaveContext.save.isNight) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)R_TIME_SPEED;
} else {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) - (u16)(2 * R_TIME_SPEED);
}
break;
- case 0x13:
- AudioOcarina_PlayLongScarecrowAfterCredits();
- csCtx->frames = cmd->startFrame - 1;
+
+ case CS_MISC_LONG_SCARECROW_SONG:
+ AudioOcarina_PlayLongScarecrowSong();
+ csCtx->curFrame = cmd->startFrame - 1; // the cutscene runs forever
break;
- case 0x14:
- EnvFlags_Set(play, 3);
+
+ case CS_MISC_SET_CSFLAG_3:
+ CutsceneFlags_Set(play, 3);
break;
- case 0x15:
- EnvFlags_Set(play, 4);
+
+ case CS_MISC_SET_CSFLAG_4:
+ CutsceneFlags_Set(play, 4);
break;
- case 0x16:
+
+ case CS_MISC_PLAYER_FORM_DEKU:
gSaveContext.save.playerForm = PLAYER_FORM_DEKU;
break;
- case 0x17:
+
+ case CS_MISC_ENABLE_PLAYER_REFLECTION:
player->stateFlags2 |= PLAYER_STATE2_4000000;
break;
- case 0x18:
+
+ case CS_MISC_DISABLE_PLAYER_REFLECTION:
player->stateFlags2 &= ~PLAYER_STATE2_4000000;
break;
- case 0x19:
+
+ case CS_MISC_PLAYER_FORM_HUMAN:
sCutsceneStoredPlayerForm = gSaveContext.save.playerForm;
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
break;
- case 0x1A:
+
+ case CS_MISC_EARTHQUAKE_STRONG:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ if (isFirstFrame) {
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 30000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 20, 10, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 20, 10, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
- case 0x1B:
- if (isStartFrame) {
+
+ case CS_MISC_DEST_MOON_CRASH_FIRE_WALL:
+ if (isFirstFrame) {
play->nextEntrance = ENTRANCE(CUTSCENE, 0);
gSaveContext.nextCutsceneIndex = 0xFFF8;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
}
break;
- case 0x1C:
- if (isStartFrame) {
- play->envCtx.unk_17 = 0xD;
+
+ case CS_MISC_MOON_CRASH_SKYBOX:
+ if (isFirstFrame) {
+ play->envCtx.skyboxConfig = 0xD;
}
break;
- case 0x1D:
+
+ case CS_MISC_PLAYER_FORM_RESTORED:
gSaveContext.save.playerForm = sCutsceneStoredPlayerForm;
break;
- case 0x1E:
- D_801F4DE0 = true;
+
+ case CS_MISC_DISABLE_PLAYER_CSMODE_START_POS:
+ gDisablePlayerCsModeStartPos = true;
break;
- case 0x1F:
- D_801F4DE0 = false;
+
+ case CS_MISC_ENABLE_PLAYER_CSMODE_START_POS:
+ gDisablePlayerCsModeStartPos = false;
break;
- case 0x21:
- if (isStartFrame) {
+
+ case CS_MISC_SAVE_ENTER_CLOCK_TOWN:
+ if (isFirstFrame) {
Sram_SaveSpecialEnterClockTown(play);
}
break;
- case 0x22:
- if (isStartFrame) {
- func_80144A94(&play->sramCtx);
+
+ case CS_MISC_RESET_SAVE_FROM_MOON_CRASH:
+ if (isFirstFrame) {
+ Sram_ResetSaveFromMoonCrash(&play->sramCtx);
}
break;
- case 0x23:
- if (csCtx->frames != D_801BB15C) {
- D_801BB15C = csCtx->frames;
+
+ case CS_MISC_TIME_ADVANCE:
+ if (csCtx->curFrame != D_801BB15C) {
+ D_801BB15C = csCtx->curFrame;
if (R_TIME_SPEED != 0) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
@@ -332,20 +366,19 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c
}
}
break;
- case 0x24:
+
+ case CS_MISC_EARTHQUAKE_WEAK:
func_8019F128(NA_SE_EV_EARTHQUAKE_LAST - SFX_FLAG);
- if (isStartFrame) {
- sCutsceneQuakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ if (isFirstFrame) {
+ sCutsceneQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sCutsceneQuakeIndex, 22000);
- Quake_SetQuakeValues(sCutsceneQuakeIndex, 2, 1, 0, 0);
- Quake_SetCountdown(sCutsceneQuakeIndex, 800);
+ Quake_SetPerturbations(sCutsceneQuakeIndex, 2, 1, 0, 0);
+ Quake_SetDuration(sCutsceneQuakeIndex, 800);
}
break;
- case 0x26:
- // Seems to be used to trigger "Dawn of A New Day"
-
- gSaveContext.save.day = 9;
+ case CS_MISC_DAWN_OF_A_NEW_DAY:
+ gSaveContext.save.day = 9; // 9 % 5 is day number 4, see `CURRENT_DAY`
STOP_GAMESTATE(&play->state);
SET_NEXT_GAMESTATE(&play->state, DayTelop_Init, sizeof(DayTelopState));
@@ -353,21 +386,23 @@ void Cutscene_Command_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdBase* c
Sram_SaveSpecialNewDay(play);
break;
- case 0x27:
+ case CS_MISC_PLAYER_FORM_ZORA:
gSaveContext.save.playerForm = PLAYER_FORM_ZORA;
break;
- case 0x28:
- csCtx->frames = cmd->startFrame - 1;
+ case CS_MISC_FINALE:
+ csCtx->curFrame = cmd->startFrame - 1; // the cutscene runs forever
+ break;
+
+ default:
break;
}
}
-// Command 0x97: Set Environment Lighting
-void Cutscene_Command_SetLighting(PlayState* play, CutsceneContext* csCtx, CsCmdEnvLighting* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- if (cmd->setting != 0x20) {
- play->envCtx.lightSettingOverride = cmd->setting - 1;
+void CutsceneCmd_SetLightSetting(PlayState* play, CutsceneContext* csCtx, CsCmdLightSetting* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ if (cmd->settingPlusOne != 32) {
+ play->envCtx.lightSettingOverride = cmd->settingPlusOne - 1;
play->envCtx.lightBlend = 1.0f;
} else {
play->envCtx.lightSettingOverride = 0xFF;
@@ -375,51 +410,45 @@ void Cutscene_Command_SetLighting(PlayState* play, CutsceneContext* csCtx, CsCmd
}
}
-// Command 0x12C: Plays a sequence (Background music or Fanfare)
-void Cutscene_Command_PlaySequence(PlayState* play, CutsceneContext* csCtx, CsCmdSequenceChange* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- Audio_PlaySequenceInCutscene(cmd->sequence - 1);
+void CutsceneCmd_StartSequence(PlayState* play, CutsceneContext* csCtx, CsCmdStartSeq* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Audio_PlaySequenceInCutscene(cmd->seqIdPlusOne - 1);
}
}
-// Command 0x12D: Stops a sequence (Background music or Fanfare)
-void Cutscene_Command_StopSequence(PlayState* play, CutsceneContext* csCtx, CsCmdSequenceChange* cmd) {
- if ((csCtx->frames >= cmd->startFrame) && (cmd->endFrame >= csCtx->frames)) {
- Audio_StopSequenceInCutscene(cmd->sequence - 1);
+void CutsceneCmd_StopSequence(PlayState* play, CutsceneContext* csCtx, CsCmdStopSeq* cmd) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (csCtx->curFrame <= cmd->endFrame)) {
+ Audio_StopSequenceInCutscene(cmd->seqIdPlusOne - 1);
}
}
-// Command 0x9C: Fade a sequence (Background music or Fanfare) over duration
-void Cutscene_Command_FadeSequence(PlayState* play, CutsceneContext* csCtx, CsCmdSequenceFade* cmd) {
- if ((csCtx->frames == cmd->startFrame) && (csCtx->frames < cmd->endFrame)) {
- u8 fadeTimer = cmd->endFrame - cmd->startFrame;
+void CutsceneCmd_FadeOutSequence(PlayState* play, CutsceneContext* csCtx, CsCmdFadeOutSeq* cmd) {
+ if ((csCtx->curFrame == cmd->startFrame) && (csCtx->curFrame < cmd->endFrame)) {
+ u8 fadeOutDuration = cmd->endFrame - cmd->startFrame;
- if (cmd->type == 2) {
- SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeTimer);
- } else {
- SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeTimer);
+ if (cmd->seqPlayer == CS_FADE_OUT_FANFARE) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeOutDuration);
+ } else { // CS_FADE_OUT_BGM_MAIN
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeOutDuration);
}
}
}
-// Command 0x12E: Play Ambience sequence
-void Cutscene_Command_PlayAmbienceSequence(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (csCtx->frames == cmd->startFrame) {
+void CutsceneCmd_StartAmbience(PlayState* play, CutsceneContext* csCtx, CsCmdStartAmbience* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
Audio_PlayAmbience(play->sequenceCtx.ambienceId);
}
}
-// Command 0x130:
-void func_800EAD48(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (csCtx->frames == cmd->startFrame) {
+void Cutscene_SetSfxReverbIndexTo2(PlayState* play, CutsceneContext* csCtx, CsCmdSfxReverbIndexTo2* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
// Audio_SetSfxReverbIndexExceptOcarinaBank
func_801A4428(2);
}
}
-// Command 0x131:
-void func_800EAD7C(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (csCtx->frames == cmd->startFrame) {
+void Cutscene_SetSfxReverbIndexTo1(PlayState* play, CutsceneContext* csCtx, CsCmdSfxReverbIndexTo1* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
// Audio_SetSfxReverbIndexExceptOcarinaBank
func_801A4428(1);
}
@@ -427,107 +456,103 @@ void func_800EAD7C(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
#ifdef NON_MATCHING
// needs in-function static bss
-// audio related
-void func_800EADB0(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- static u16 seqId;
+void CutsceneCmd_ModifySequence(PlayState* play, CutsceneContext* csCtx, CsCmdModifySeq* cmd) {
+ static u16 sSeqId;
u8 dayMinusOne;
- if (csCtx->frames == cmd->startFrame) {
- dayMinusOne = (gSaveContext.save.day - 1);
+ if (csCtx->curFrame == cmd->startFrame) {
+ dayMinusOne = gSaveContext.save.day - 1;
if (dayMinusOne >= 3) {
dayMinusOne = 0;
}
- switch (cmd->base) {
- case 1:
- // func_801A246C(SEQ_PLAYER_BGM_MAIN, TYPE_1);
+ switch (cmd->type) {
+ case CS_MOD_SEQ_0:
func_801A246C(SEQ_PLAYER_BGM_MAIN, 1);
break;
- case 2:
- // func_801A246C(SEQ_PLAYER_BGM_MAIN, TYPE_0);
+ case CS_MOD_SEQ_1:
func_801A246C(SEQ_PLAYER_BGM_MAIN, 0);
break;
- case 3:
- // func_801A246C(SEQ_PLAYER_BGM_MAIN, TYPE_2);
+ case CS_MOD_SEQ_2:
func_801A246C(SEQ_PLAYER_BGM_MAIN, 2);
break;
- case 4:
- // func_801A246C(SEQ_PLAYER_AMBIENCE, TYPE_1);
+ case CS_MOD_AMBIENCE_0:
func_801A246C(SEQ_PLAYER_AMBIENCE, 1);
break;
- case 5:
- // func_801A246C(SEQ_PLAYER_AMBIENCE, TYPE_0);
+ case CS_MOD_AMBIENCE_1:
func_801A246C(SEQ_PLAYER_AMBIENCE, 0);
break;
- case 6:
- // func_801A246C(SEQ_PLAYER_AMBIENCE, TYPE_2);
+ case CS_MOD_AMBIENCE_2:
func_801A246C(SEQ_PLAYER_AMBIENCE, 2);
break;
- case 7:
- seqId = AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN);
+ case CS_MOD_SEQ_STORE:
+ sSeqId = AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN);
break;
- case 8:
- if (seqId != NA_BGM_DISABLED) {
- Audio_PlaySceneSequence(seqId, dayMinusOne);
+ case CS_MOD_SEQ_RESTORE:
+ if (sSeqId != NA_BGM_DISABLED) {
+ Audio_PlaySceneSequence(sSeqId, dayMinusOne);
}
break;
+
+ default:
+ break;
}
}
}
#else
-void func_800EADB0(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/func_800EADB0.s")
+void CutsceneCmd_ModifySequence(PlayState* play, CutsceneContext* csCtx, CsCmdModifySeq* cmd);
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/CutsceneCmd_ModifySequence.s")
#endif
-// Command 0x12F: Fade Ambience sequence
-void Cutscene_Command_FadeAmbienceSequence(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (csCtx->frames == cmd->startFrame && csCtx->frames < cmd->endFrame) {
- u8 fadeTimer = cmd->endFrame - cmd->startFrame;
+void CutsceneCmd_FadeOutAmbience(PlayState* play, CutsceneContext* csCtx, CsCmdFadeOutAmbience* cmd) {
+ if ((csCtx->curFrame == cmd->startFrame) && (csCtx->curFrame < cmd->endFrame)) {
+ u8 fadeOutDuration = cmd->endFrame - cmd->startFrame;
- SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_AMBIENCE, fadeTimer);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_AMBIENCE, fadeOutDuration);
}
}
-// Command 0x190: Rumble
-void Cutscene_Command_Rumble(PlayState* play, CutsceneContext* csCtx, CsCmdRumble* cmd) {
+void CutsceneCmd_RumbleController(PlayState* play, CutsceneContext* csCtx, CsCmdRumble* cmd) {
switch (cmd->type) {
- case 1:
- if (csCtx->frames == cmd->startFrame) {
+ case CS_RUMBLE_ONCE:
+ if (csCtx->curFrame == cmd->startFrame) {
Rumble_Request(0.0f, cmd->intensity, cmd->decayTimer, cmd->decayStep);
}
break;
- case 2:
- if ((csCtx->frames >= cmd->startFrame) && (cmd->endFrame >= csCtx->frames)) {
- if ((csCtx->frames == cmd->startFrame) || (play->state.frames % 64 == 0)) {
+ case CS_RUMBLE_PULSE:
+ if ((csCtx->curFrame >= cmd->startFrame) && (csCtx->curFrame <= cmd->endFrame)) {
+ if ((csCtx->curFrame == cmd->startFrame) || (play->state.frames % 64 == 0)) {
Rumble_Request(0.0f, cmd->intensity, cmd->decayTimer, cmd->decayStep);
}
}
break;
+
+ default:
+ break;
}
}
-// Command 0x9B:
-void Cutscene_Command_FadeColorScreen(PlayState* play, CutsceneContext* csCtx, CsCmdFadeScreen* cmd) {
- if ((csCtx->frames >= cmd->startFrame) && (cmd->endFrame >= csCtx->frames)) {
+void CutsceneCmd_TransitionGeneral(PlayState* play, CutsceneContext* csCtx, CsCmdTransitionGeneral* cmd) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (cmd->endFrame >= csCtx->curFrame)) {
f32 alpha;
play->envCtx.fillScreen = true;
- alpha = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->frames);
+ alpha = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->curFrame);
- if (((cmd->unk0 == 1)) || (cmd->unk0 == 2)) {
+ if (((cmd->type == CS_TRANS_GENERAL_FILL_IN)) || (cmd->type == CS_TRANS_GENERAL_FILL_OUT)) {
play->envCtx.screenFillColor[0] = cmd->color.r;
play->envCtx.screenFillColor[1] = cmd->color.g;
play->envCtx.screenFillColor[2] = cmd->color.b;
- if (cmd->unk0 == 2) {
+ if (cmd->type == CS_TRANS_GENERAL_FILL_OUT) {
play->envCtx.screenFillColor[3] = (1.0f - alpha) * 255.0f;
} else {
play->envCtx.screenFillColor[3] = 255.0f * alpha;
@@ -536,43 +561,45 @@ void Cutscene_Command_FadeColorScreen(PlayState* play, CutsceneContext* csCtx, C
}
}
-// Command 0x9D: Set Time of Day & Environment Time
-void Cutscene_Command_SetTime(PlayState* play, CutsceneContext* csCtx, CsCmdDayTime* cmd) {
- u16 nextTime;
+void CutsceneCmd_SetTime(PlayState* play, CutsceneContext* csCtx, CsCmdTime* cmd) {
u16 hourAsMinutes;
u16 minutes;
- if (csCtx->frames == cmd->startFrame) {
+ if (csCtx->curFrame == cmd->startFrame) {
hourAsMinutes = CLOCK_TIME_ALT_F(cmd->hour, 0);
minutes = CLOCK_TIME_ALT_F(0, cmd->minute + 1);
- nextTime = hourAsMinutes + minutes;
- gSaveContext.save.time = nextTime;
- gSaveContext.skyboxTime = nextTime;
+ gSaveContext.save.time = hourAsMinutes + minutes;
+ gSaveContext.skyboxTime = hourAsMinutes + minutes;
}
}
-void Cutscene_TerminatorImpl(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- csCtx->state = CS_STATE_4;
+void CutsceneCmd_DestinationDefault(PlayState* play, CutsceneContext* csCtx, CsCmdDestination* cmd) {
+ csCtx->state = CS_STATE_RUN_UNSTOPPABLE;
Play_DisableMotionBlur();
Audio_SetCutsceneFlag(false);
gSaveContext.cutsceneTransitionControl = 1;
- if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->frames != cmd->startFrame)) {
+ // `hudVisibilityForceButtonAlphasByStatus` has a secondary purpose, which is to signal to the title
+ // screen actor that it should display immediately. This occurs when a title screen cutscene that
+ // is not the main clock town scene is skipped.
+ if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->curFrame != cmd->startFrame)) {
gSaveContext.hudVisibilityForceButtonAlphasByStatus = true;
}
- gSaveContext.save.cutscene = 0;
- if (cmd->base == 1) {
- play->nextEntrance = play->csCtx.sceneCsList[play->csCtx.currentCsIndex].nextEntrance;
+ gSaveContext.save.cutsceneIndex = 0;
+
+ if (cmd->type == CS_DESTINATION_DEFAULT) {
+ play->nextEntrance = play->csCtx.scriptList[play->csCtx.scriptIndex].nextEntrance;
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
+
if (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN) {
Scene_SetExitFade(play);
} else {
- D_801BB12C++;
- if (D_801BB12C >= 2) {
- D_801BB12C = 0;
+ gOpeningEntranceIndex++;
+ if (gOpeningEntranceIndex >= 2) {
+ gOpeningEntranceIndex = 0;
}
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
}
@@ -585,19 +612,18 @@ void Cutscene_TerminatorImpl(PlayState* play, CutsceneContext* csCtx, CsCmdBase*
}
}
-// Command 0x15E
-void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if (cmd->base == 1) {
- if (csCtx->frames == cmd->startFrame) {
- Cutscene_TerminatorImpl(play, csCtx, cmd);
+void CutsceneCmd_Destination(PlayState* play, CutsceneContext* csCtx, CsCmdDestination* cmd) {
+ if (cmd->type == CS_DESTINATION_DEFAULT) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ CutsceneCmd_DestinationDefault(play, csCtx, cmd);
}
- } else if (cmd->base == 2) {
- if (csCtx->frames == cmd->startFrame) {
+ } else if (cmd->type == CS_DESTINATION_BOSS_WARP) {
+ if (csCtx->curFrame == cmd->startFrame) {
Play_DisableMotionBlur();
- switch (D_801F4DE2) {
- case 0x1F:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ switch (gDungeonBossWarpSceneId) {
+ case SCENE_MITURIN_BS:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
play->nextEntrance = ENTRANCE(WOODFALL_TEMPLE, 1);
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
@@ -609,8 +635,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
}
break;
- case 0x44:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ case SCENE_HAKUGIN_BS:
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
play->nextEntrance = ENTRANCE(MOUNTAIN_VILLAGE_SPRING, 7);
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
@@ -622,36 +648,38 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
}
break;
- case 0x5F:
- SET_WEEKEVENTREG(WEEKEVENTREG_55_80);
+ case SCENE_SEA_BS:
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE);
play->nextEntrance = ENTRANCE(ZORA_CAPE, 8);
gSaveContext.nextCutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 0x36:
- SET_WEEKEVENTREG(WEEKEVENTREG_52_20);
+ case SCENE_INISIE_BS:
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE);
play->nextEntrance = ENTRANCE(IKANA_CANYON, 0);
gSaveContext.nextCutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
+
+ default:
+ break;
}
}
}
}
-// Command 0x15F: Chooses between a cutscene or a rotating mask depending on whether the player has the corresponding
-// mask
-void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if ((csCtx->frames >= cmd->startFrame) && (func_801A3950(SEQ_PLAYER_BGM_MAIN, true) != 0xFF)) {
- switch (cmd->base) {
- case 1:
- Cutscene_TerminatorImpl(play, csCtx, cmd);
+// Chooses between a cutscene or a rotating mask depending on whether the player has the corresponding mask
+void CutsceneCmd_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCtx, CsCmdChooseCreditsScene* cmd) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (func_801A3950(SEQ_PLAYER_BGM_MAIN, true) != 0xFF)) {
+ switch (cmd->type) {
+ case CS_CREDITS_DESTINATION:
+ CutsceneCmd_DestinationDefault(play, csCtx, (CsCmdDestination*)cmd);
break;
- case 2:
+ case CS_CREDITS_MASK_KAMARO:
if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
play->nextEntrance = ENTRANCE(MILK_BAR, 0);
gSaveContext.nextCutsceneIndex = 0xFFF0;
@@ -662,7 +690,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 3:
+ case CS_CREDITS_MASK_GREAT_FAIRY:
if (INV_CONTENT(ITEM_MASK_GREAT_FAIRY) == ITEM_MASK_GREAT_FAIRY) {
play->nextEntrance = ENTRANCE(FAIRY_FOUNTAIN, 0);
gSaveContext.nextCutsceneIndex = 0xFFF0;
@@ -673,7 +701,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 4:
+ case CS_CREDITS_MASK_ROMANI:
if (INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) {
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 0);
gSaveContext.nextCutsceneIndex = 0xFFF1;
@@ -684,7 +712,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 5:
+ case CS_CREDITS_MASK_BLAST:
if (INV_CONTENT(ITEM_MASK_BLAST) == ITEM_MASK_BLAST) {
play->nextEntrance = ENTRANCE(WEST_CLOCK_TOWN, 0);
gSaveContext.nextCutsceneIndex = 0xFFF0;
@@ -695,7 +723,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 6:
+ case CS_CREDITS_MASK_CIRCUS_LEADER:
if (INV_CONTENT(ITEM_MASK_CIRCUS_LEADER) == ITEM_MASK_CIRCUS_LEADER) {
play->nextEntrance = ENTRANCE(MILK_BAR, 0);
gSaveContext.nextCutsceneIndex = 0xFFF1;
@@ -706,7 +734,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 7:
+ case CS_CREDITS_MASK_BREMEN:
if (INV_CONTENT(ITEM_MASK_BREMEN) == ITEM_MASK_BREMEN) {
play->nextEntrance = ENTRANCE(MILK_BAR, 0);
gSaveContext.nextCutsceneIndex = 0xFFF3;
@@ -717,13 +745,13 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 8:
+ case CS_CREDITS_IKANA:
play->nextEntrance = ENTRANCE(IKANA_CANYON, 0);
gSaveContext.nextCutsceneIndex = 0xFFF3;
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 9:
+ case CS_CREDITS_MASK_COUPLE:
if (INV_CONTENT(ITEM_MASK_COUPLE) == ITEM_MASK_COUPLE) {
play->nextEntrance = ENTRANCE(TERMINA_FIELD, 0);
gSaveContext.nextCutsceneIndex = 0xFFF8;
@@ -734,7 +762,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 10:
+ case CS_CREDITS_MASK_BUNNY:
if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
play->nextEntrance = ENTRANCE(CUCCO_SHACK, 0);
gSaveContext.nextCutsceneIndex = 0xFFF0;
@@ -745,7 +773,7 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
play->transitionTrigger = TRANS_TRIGGER_START;
break;
- case 11:
+ case CS_CREDITS_MASK_POSTMAN:
if (INV_CONTENT(ITEM_MASK_POSTMAN) == ITEM_MASK_POSTMAN) {
play->nextEntrance = ENTRANCE(TERMINA_FIELD, 1);
gSaveContext.nextCutsceneIndex = 0xFFF8;
@@ -755,35 +783,36 @@ void Cutscene_Command_ChooseCreditsScenes(PlayState* play, CutsceneContext* csCt
}
play->transitionTrigger = TRANS_TRIGGER_START;
break;
+
+ default:
+ break;
}
}
}
-// Command 0x99: Motion blur
-void Cutscene_Command_MotionBlur(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if ((csCtx->frames >= cmd->startFrame) && (cmd->endFrame >= csCtx->frames)) {
- if ((csCtx->frames == cmd->startFrame) && (cmd->base == 1)) {
+void CutsceneCmd_MotionBlur(PlayState* play, CutsceneContext* csCtx, CsCmdMotionBlur* cmd) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (cmd->endFrame >= csCtx->curFrame)) {
+ if ((csCtx->curFrame == cmd->startFrame) && (cmd->type == CS_MOTION_BLUR_ENABLE)) {
Play_EnableMotionBlur(180);
}
- if (cmd->base == 2) {
- f32 progress = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->frames);
+ if (cmd->type == CS_MOTION_BLUR_DISABLE) {
+ f32 lerp = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->curFrame);
- if (progress >= 0.9f) {
+ if (lerp >= 0.9f) {
Play_DisableMotionBlur();
} else {
- Play_SetMotionBlurAlpha((1.0f - progress) * 180.0f);
+ Play_SetMotionBlurAlpha((1.0f - lerp) * 180.0f);
}
}
}
}
-// Command 0x9A: Gives Tatl to the player
-void Cutscene_Command_GiveTatlToPlayer(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
+void CutsceneCmd_GiveTatlToPlayer(PlayState* play, CutsceneContext* csCtx, CsCmdGiveTatl* cmd) {
Player* player = GET_PLAYER(play);
- if (csCtx->frames == cmd->startFrame) {
- if (cmd->base == 1) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ if (cmd->giveTatl == true) {
gSaveContext.save.hasTatl = true;
if (player->tatlActor != NULL) {
return;
@@ -794,109 +823,112 @@ void Cutscene_Command_GiveTatlToPlayer(PlayState* play, CutsceneContext* csCtx,
}
}
-// Command 0x98
-void Cutscene_Command_TransitionFX(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- if ((csCtx->frames >= cmd->startFrame) && (cmd->endFrame >= csCtx->frames)) {
- f32 temp_f0;
+void CutsceneCmd_Transition(PlayState* play, CutsceneContext* csCtx, CsCmdTransition* cmd) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (cmd->endFrame >= csCtx->curFrame)) {
+ f32 lerp;
play->envCtx.fillScreen = true;
- temp_f0 = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->frames);
+ lerp = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->curFrame);
- switch (cmd->base) {
- case 1:
- case 5:
+ switch (cmd->type) {
+ case CS_TRANS_GRAY_FILL_IN:
+ case CS_TRANS_GRAY_FILL_OUT:
play->envCtx.screenFillColor[0] = 160;
play->envCtx.screenFillColor[1] = 160;
play->envCtx.screenFillColor[2] = 160;
- if (cmd->base == 1) {
- play->envCtx.screenFillColor[3] = 255.0f * temp_f0;
- if (temp_f0 == 0.0f) {
+
+ if (cmd->type == CS_TRANS_GRAY_FILL_IN) {
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
+ if (lerp == 0.0f) {
func_8019F128(NA_SE_EV_S_STONE_FLASH);
}
} else {
- play->envCtx.screenFillColor[3] = (1.0f - temp_f0) * 255.0f;
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
}
break;
- case 2:
- case 6:
+ case CS_TRANS_BLUE_FILL_IN:
+ case CS_TRANS_BLUE_FILL_OUT:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 255;
- if (cmd->base == 2) {
- play->envCtx.screenFillColor[3] = 255.0f * temp_f0;
+ if (cmd->type == CS_TRANS_BLUE_FILL_IN) {
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
} else {
- play->envCtx.screenFillColor[3] = (1.0f - temp_f0) * 255.0f;
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
}
break;
- case 3:
- case 7:
+ case CS_TRANS_RED_FILL_OUT:
+ case CS_TRANS_RED_FILL_IN:
play->envCtx.screenFillColor[0] = 255;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 3) {
- play->envCtx.screenFillColor[3] = (1.0f - temp_f0) * 255.0f;
+ if (cmd->type == CS_TRANS_RED_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp_f0;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 4:
- case 8:
+ case CS_TRANS_GREEN_FILL_OUT:
+ case CS_TRANS_GREEN_FILL_IN:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 255;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 4) {
- play->envCtx.screenFillColor[3] = (1.0f - temp_f0) * 255.0f;
+ if (cmd->type == CS_TRANS_GREEN_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp_f0;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 9:
+ case CS_TRANS_TRIGGER_INSTANCE:
gSaveContext.cutsceneTransitionControl = 1;
break;
- case 10:
- case 11:
+ case CS_TRANS_BLACK_FILL_OUT:
+ case CS_TRANS_BLACK_FILL_IN:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 10) {
- play->envCtx.screenFillColor[3] = (1.0f - temp_f0) * 255.0f;
+ if (cmd->type == CS_TRANS_BLACK_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp_f0;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 12:
- play->envCtx.screenFillColor[0] = (160.0f * (1.0f - temp_f0));
+ case CS_TRANS_GRAY_TO_BLACK:
+ play->envCtx.screenFillColor[0] = (1.0f - lerp) * 160.0f;
play->envCtx.screenFillColor[1] = play->envCtx.screenFillColor[0];
play->envCtx.screenFillColor[2] = play->envCtx.screenFillColor[0];
play->envCtx.screenFillColor[3] = 255;
break;
- case 13:
- play->envCtx.screenFillColor[0] = (160.0f * temp_f0);
+ case CS_TRANS_BLACK_TO_GRAY:
+ play->envCtx.screenFillColor[0] = 160.0f * lerp;
play->envCtx.screenFillColor[1] = play->envCtx.screenFillColor[0];
play->envCtx.screenFillColor[2] = play->envCtx.screenFillColor[0];
play->envCtx.screenFillColor[3] = 255;
break;
+
+ default:
+ break;
}
}
}
-// Command 0x5A: Camera
-s32 Cutscene_Command_Camera(PlayState* play, u8* cmd) {
- s32 sp1C = 0;
+s32 CutsceneCmd_UpdateCamSpline(PlayState* play, u8* script) {
+ s32 cmdBytes = 0;
+
+ bcopy(script, &cmdBytes, sizeof(cmdBytes));
+ script += sizeof(cmdBytes);
- bcopy(cmd, &sp1C, sizeof(s32));
- cmd += sizeof(s32);
if (!Play_IsDebugCamEnabled()) {
- func_80161998(cmd, &sCutsceneCameraInfo);
+ CutsceneCamera_UpdateSplines(script, &sCutsceneCameraInfo);
}
- return sp1C + sizeof(s32);
+ return cmdBytes + sizeof(cmdBytes);
}
/**
@@ -970,144 +1002,146 @@ s32 Cutscene_CountNormalMasks(void) {
return count;
}
-// Command 0xA: Textbox
-void Cutscene_Command_Textbox(PlayState* play, CutsceneContext* csCtx, CsCmdTextbox* cmd) {
- static s32 D_801BB160 = CS_TEXTBOX_TYPE_DEFAULT;
+void CutsceneCmd_Text(PlayState* play, CutsceneContext* csCtx, CsCmdText* cmd) {
+ static s32 sCutsceneTextboxType = CS_TEXT_TYPE_DEFAULT;
u8 talkState;
s32 pad;
- u16 originalCsFrames;
- s32 pad2;
+ u16 endFrame;
- if ((cmd->startFrame >= csCtx->frames) || ((cmd->endFrame < csCtx->frames))) {
+ if ((csCtx->curFrame <= cmd->startFrame) || (csCtx->curFrame > cmd->endFrame)) {
return;
}
- if (cmd->type != CS_TEXTBOX_TYPE_LEARN_SONG) {
- if (D_801BB124 != cmd->base) {
- if (D_801BB160 == CS_TEXTBOX_TYPE_3) {
- csCtx->frames--;
+ if (cmd->type != CS_TEXT_OCARINA_ACTION) {
+ if (sCurTextId != cmd->textId) {
+ if (sCutsceneTextboxType == CS_TEXT_TYPE_3) {
+ csCtx->curFrame--;
}
- D_801BB160 = CS_TEXTBOX_TYPE_1;
- D_801BB124 = cmd->base;
- if (cmd->type == CS_TEXTBOX_TYPE_BOSSES_REMAINS) {
+ sCutsceneTextboxType = CS_TEXT_TYPE_1;
+ sCurTextId = cmd->textId;
+ if (cmd->type == CS_TEXT_TYPE_BOSSES_REMAINS) {
if (CHECK_QUEST_ITEM(QUEST_REMAINS_ODOLWA) && CHECK_QUEST_ITEM(QUEST_REMAINS_GOHT) &&
CHECK_QUEST_ITEM(QUEST_REMAINS_GYORG) && CHECK_QUEST_ITEM(QUEST_REMAINS_TWINMOLD)) {
- if (cmd->textId1 != 0xFFFF) {
- Message_StartTextbox(play, cmd->textId1, NULL);
+ if (cmd->altTextId1 != 0xFFFF) {
+ Message_StartTextbox(play, cmd->altTextId1, NULL);
}
} else {
- Message_StartTextbox(play, cmd->base, NULL);
+ Message_StartTextbox(play, cmd->textId, NULL);
}
- } else if (cmd->type == CS_TEXTBOX_TYPE_ALL_NORMAL_MASKS) {
+ } else if (cmd->type == CS_TEXT_TYPE_ALL_NORMAL_MASKS) {
if (Cutscene_CountNormalMasks() == 20) {
- if (cmd->textId1 != 0xFFFF) {
- Message_StartTextbox(play, cmd->textId1, NULL);
+ if (cmd->altTextId1 != 0xFFFF) {
+ Message_StartTextbox(play, cmd->altTextId1, NULL);
}
} else {
- Message_StartTextbox(play, cmd->base, NULL);
+ Message_StartTextbox(play, cmd->textId, NULL);
}
} else {
- Message_StartTextbox(play, cmd->base, NULL);
+ Message_StartTextbox(play, cmd->textId, NULL);
}
- } else {
- goto else_label;
+ //! FAKE: return;
+ goto end;
}
- } else if (D_801BB128 != cmd->base) {
- D_801BB160 = CS_TEXTBOX_TYPE_LEARN_SONG;
- D_801BB128 = cmd->base;
- func_80152434(play, cmd->base);
} else {
- else_label:
- if (csCtx->frames >= cmd->endFrame) {
- // The Textbox command can change the current cutscene frame, mainly to prevent advancing the cutscene when
- // a textbox that is expected to be closed by the user is still open.
-
- originalCsFrames = csCtx->frames;
- talkState = Message_GetState(&play->msgCtx);
- if ((talkState != TEXT_STATE_CLOSING) && (talkState != TEXT_STATE_NONE) && (talkState != TEXT_STATE_7) &&
- (talkState != TEXT_STATE_8)) {
- csCtx->frames--;
- if ((talkState == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
- if (play->msgCtx.choiceIndex == 0) {
- if (cmd->base == 0x33BD) {
- func_8019F230();
- }
-
- if (cmd->textId1 != 0xFFFF) {
- Message_ContinueTextbox(play, cmd->textId1);
- if (cmd->type == CS_TEXTBOX_TYPE_3) {
- D_801BB160 = CS_TEXTBOX_TYPE_3;
- if (cmd->textId2 != 0xFFFF) {
- csCtx->frames++;
- }
- }
- } else {
- Message_CloseTextbox(play);
- csCtx->frames++;
- }
- } else {
- if (cmd->base == 0x33BD) {
- func_8019F208();
- }
-
- if (cmd->textId2 != 0xFFFF) {
- Message_ContinueTextbox(play, cmd->textId2);
- if (cmd->type == CS_TEXTBOX_TYPE_3) {
- D_801BB160 = CS_TEXTBOX_TYPE_3;
- if (cmd->textId1 != 0xFFFF) {
- csCtx->frames++;
- }
- }
- } else {
- Message_CloseTextbox(play);
- csCtx->frames++;
- }
- }
- }
-
- if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- func_80152434(play, cmd->base);
- }
- }
-
- if ((talkState == TEXT_STATE_CLOSING) && (D_801BB160 == CS_TEXTBOX_TYPE_3)) {
- csCtx->frames--;
- D_801BB124++;
- }
-
- if (originalCsFrames == csCtx->frames) {
- Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
- D_801BB124 = 0;
- D_801BB128 = 0;
- func_80161C0C();
- } else {
- func_80161BE0(1);
- }
+ if (sCurOcarinaAction != cmd->textId) {
+ sCutsceneTextboxType = CS_TEXT_OCARINA_ACTION;
+ sCurOcarinaAction = cmd->textId;
+ func_80152434(play, cmd->textId);
+ return;
}
}
-}
-// Related to actorActions. Maybe a generic actorAction setter?
-void func_800ECD7C(CutsceneContext* csCtx, u8** cutscenePtr, s16 index) {
- s32 i;
- s32 count;
+ if (csCtx->curFrame >= cmd->endFrame) {
+ // The Textbox command can change the current cutscene frame, mainly to prevent advancing the cutscene when
+ // a textbox that is expected to be closed by the user is still open.
+ endFrame = csCtx->curFrame;
+ talkState = Message_GetState(&play->msgCtx);
+ if ((talkState != TEXT_STATE_CLOSING) && (talkState != TEXT_STATE_NONE) && (talkState != TEXT_STATE_7) &&
+ (talkState != TEXT_STATE_8)) {
+ csCtx->curFrame--;
- bcopy(*cutscenePtr, &count, sizeof(s32));
- *cutscenePtr += sizeof(s32);
+ if ((talkState == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
+ if (play->msgCtx.choiceIndex == 0) {
+ if (cmd->textId == 0x33BD) {
+ // Gorman Track: do you understand?
+ func_8019F230();
+ }
- for (i = 0; i < count; i++) {
- CsCmdActorAction* actorAction = *(CsCmdActorAction**)cutscenePtr;
+ if (cmd->altTextId1 != 0xFFFF) {
+ Message_ContinueTextbox(play, cmd->altTextId1);
+ if (cmd->type == CS_TEXT_TYPE_3) {
+ sCutsceneTextboxType = CS_TEXT_TYPE_3;
+ if (cmd->altTextId2 != 0xFFFF) {
+ csCtx->curFrame++;
+ }
+ }
+ } else {
+ Message_CloseTextbox(play);
+ csCtx->curFrame++;
+ }
+ } else {
+ if (cmd->textId == 0x33BD) {
+ // Gorman Track: do you understand?
+ func_8019F208();
+ }
- if ((csCtx->frames >= actorAction->startFrame) && (csCtx->frames < actorAction->endFrame)) {
- csCtx->actorActions[index] = actorAction;
+ if (cmd->altTextId2 != 0xFFFF) {
+ Message_ContinueTextbox(play, cmd->altTextId2);
+ if (cmd->type == CS_TEXT_TYPE_3) {
+ sCutsceneTextboxType = CS_TEXT_TYPE_3;
+ if (cmd->altTextId1 != 0xFFFF) {
+ csCtx->curFrame++;
+ }
+ }
+ } else {
+ Message_CloseTextbox(play);
+ csCtx->curFrame++;
+ }
+ }
+ }
+
+ if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
+ func_80152434(play, cmd->textId);
+ }
}
- *cutscenePtr += sizeof(CsCmdActorAction);
+ if ((talkState == TEXT_STATE_CLOSING) && (sCutsceneTextboxType == CS_TEXT_TYPE_3)) {
+ csCtx->curFrame--;
+ sCurTextId++;
+ }
+
+ if (endFrame == csCtx->curFrame) {
+ Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
+ sCurTextId = 0;
+ sCurOcarinaAction = 0;
+ CutsceneCamera_Reset();
+ } else {
+ CutsceneCamera_SetState(CS_CAM_STATE_UPDATE_SPLINE);
+ }
+ }
+end:;
+}
+
+void Cutscene_SetActorCue(CutsceneContext* csCtx, u8** script, s16 cueChannel) {
+ s32 i;
+ s32 numCues;
+
+ bcopy(*script, &numCues, sizeof(numCues));
+ *script += sizeof(numCues);
+
+ for (i = 0; i < numCues; i++) {
+ CsCmdActorCue* cue = *(CsCmdActorCue**)script;
+
+ if ((csCtx->curFrame >= cue->startFrame) && (csCtx->curFrame < cue->endFrame)) {
+ csCtx->actorCues[cueChannel] = cue;
+ }
+
+ *script += sizeof(CsCmdActorCue);
}
}
/**
- * Loops over the cutscene data itself (`cutscenePtr`), applying the effects of each command instantaneously (for most
+ * Loops over the cutscene data itself (`script`), applying the effects of each command instantaneously (for most
* commands).
*
* The cutscene data is an irregularly-structured array of words, which is made up of
@@ -1124,15 +1158,15 @@ void func_800ECD7C(CutsceneContext* csCtx, u8** cutscenePtr, s16 index) {
* has (N). This is followed by N commands of the said category. (The exception is Camera, which has the length of the
* list in bytes instead of the number of commands).
*
- * For most command lists categories (all but the actorActions and Camera commands):
+ * For most command lists categories (all but the actorCues and Camera commands):
* - For each command list found, read the number of commands and loop over them, passing each one to the corresponding
* function which handles the command, applying its effects and checking the frame range stored in the command.
*
* This function is invoked once per frame that a cutscene is active.
*
- * TODO: consider changing the type of `cutscenePtr` to `uintptr_t` when this function matches.
+ * TODO: consider changing the type of `script` to `uintptr_t` when this function matches.
*/
-void Cutscene_ProcessCommands(PlayState* play, CutsceneContext* csCtx, u8* cutscenePtr) {
+void Cutscene_ProcessScript(PlayState* play, CutsceneContext* csCtx, u8* script) {
s32 i;
s32 j;
s32 pad;
@@ -1140,44 +1174,46 @@ void Cutscene_ProcessCommands(PlayState* play, CutsceneContext* csCtx, u8* cutsc
u32 cmdType;
s32 cmdEntries;
s32 pad2;
- s32 cutsceneEndFrame;
- CsCmdBase* cmd;
+ s32 csFrameCount;
+ void* cmd;
// Read the command list count and the ending frame for this cutscene
- bcopy(cutscenePtr, &totalEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
- bcopy(cutscenePtr, &cutsceneEndFrame, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ bcopy(script, &totalEntries, sizeof(totalEntries));
+ script += sizeof(totalEntries);
- if (((u16)cutsceneEndFrame < csCtx->frames) && (play->transitionTrigger != TRANS_TRIGGER_START) &&
- (csCtx->state != CS_STATE_4)) {
- csCtx->state = CS_STATE_3;
+ bcopy(script, &csFrameCount, sizeof(csFrameCount));
+ script += sizeof(csFrameCount);
+
+ if ((csCtx->curFrame > (u16)csFrameCount) && (play->transitionTrigger != TRANS_TRIGGER_START) &&
+ (csCtx->state != CS_STATE_RUN_UNSTOPPABLE)) {
+ csCtx->state = CS_STATE_STOP;
return;
}
// Loop over every command list
for (i = 0; i < totalEntries; i++) {
// Read the command type of the current command list.
- bcopy(cutscenePtr, &cmdType, sizeof(u32));
- cutscenePtr += sizeof(u32);
+ bcopy(script, &cmdType, sizeof(cmdType));
+ script += sizeof(cmdType);
- // TODO: This should probably be added to the CutsceneCmd enum. Consider doing it when this function matches.
- if (cmdType == 0xFFFFFFFF) {
+ if (cmdType == CS_CAM_STOP) {
break;
}
- // Check special cases of command types. This are generic ActorActions
- // Ranges: [0x64, 0x96), 0xC9, [0x1C2, 0x258)
- if (((cmdType >= 100) && (cmdType < 150)) || (cmdType == 201) || ((cmdType >= 450) && (cmdType < 600))) {
- for (j = 0; j < ARRAY_COUNT(D_801F4DC8); j = (s16)(j + 1)) {
- if (D_801F4DC8[j] == (u16)cmdType) {
- func_800ECD7C(csCtx, &cutscenePtr, j);
- cmdType = -2;
+ if (((cmdType >= CS_CMD_ACTOR_CUE_100) && (cmdType <= CS_CMD_ACTOR_CUE_149)) ||
+ (cmdType == CS_CMD_ACTOR_CUE_201) ||
+ ((cmdType >= CS_CMD_ACTOR_CUE_450) && (cmdType <= CS_CMD_ACTOR_CUE_599))) {
+ for (j = 0; j < ARRAY_COUNT(sCueTypeList); j = (s16)(j + 1)) {
+ if (sCueTypeList[j] == (u16)cmdType) {
+ Cutscene_SetActorCue(csCtx, &script, j);
+ cmdType = CS_CMD_ACTOR_CUE_POST_PROCESS;
break;
- } else if (D_801F4DC8[j] == 0) {
- D_801F4DC8[j] = cmdType;
- func_800ECD7C(csCtx, &cutscenePtr, j);
- cmdType = -2;
+ }
+
+ if (sCueTypeList[j] == 0) {
+ sCueTypeList[j] = cmdType;
+ Cutscene_SetActorCue(csCtx, &script, j);
+ cmdType = CS_CMD_ACTOR_CUE_POST_PROCESS;
break;
}
}
@@ -1185,203 +1221,227 @@ void Cutscene_ProcessCommands(PlayState* play, CutsceneContext* csCtx, u8* cutsc
switch (cmdType) {
case CS_CMD_MISC:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_Misc(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_Misc(play, csCtx, (CsCmdMisc*)script);
+ script += sizeof(CsCmdMisc);
}
break;
- case CS_CMD_SET_LIGHTING:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_LIGHT_SETTING:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_SetLighting(play, csCtx, (CsCmdEnvLighting*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdEnvLighting);
+ CutsceneCmd_SetLightSetting(play, csCtx, (CsCmdLightSetting*)script);
+ script += sizeof(CsCmdLightSetting);
}
break;
- case CS_CMD_PLAYSEQ:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_START_SEQ:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_PlaySequence(play, csCtx, (CsCmdSequenceChange*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdSequenceChange);
+ CutsceneCmd_StartSequence(play, csCtx, (CsCmdStartSeq*)script);
+ script += sizeof(CsCmdStartSeq);
}
break;
- case CS_CMD_STOPSEQ:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_STOP_SEQ:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_StopSequence(play, csCtx, (CsCmdSequenceChange*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdSequenceChange);
+ CutsceneCmd_StopSequence(play, csCtx, (CsCmdStopSeq*)script);
+ script += sizeof(CsCmdStartSeq);
}
break;
- case CS_CMD_FADESEQ:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_FADE_OUT_SEQ:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_FadeSequence(play, csCtx, (CsCmdSequenceFade*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdSequenceFade);
+ CutsceneCmd_FadeOutSequence(play, csCtx, (CsCmdFadeOutSeq*)script);
+ script += sizeof(CsCmdFadeOutSeq);
}
break;
- case CS_CMD_PLAYAMBIENCE:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_START_AMBIENCE:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_PlayAmbienceSequence(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_StartAmbience(play, csCtx, (CsCmdStartAmbience*)script);
+ script += sizeof(CsCmdStartAmbience);
}
break;
- case CS_CMD_FADEAMBIENCE:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_FADE_OUT_AMBIENCE:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_FadeAmbienceSequence(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_FadeOutAmbience(play, csCtx, (CsCmdFadeOutAmbience*)script);
+ script += sizeof(CsCmdFadeOutAmbience);
}
break;
- case CS_CMD_130:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_SFX_REVERB_INDEX_2:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- func_800EAD48(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ Cutscene_SetSfxReverbIndexTo2(play, csCtx, (CsCmdSfxReverbIndexTo2*)script);
+ script += sizeof(CsCmdSfxReverbIndexTo2);
}
break;
- case CS_CMD_131:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_SFX_REVERB_INDEX_1:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- func_800EAD7C(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ Cutscene_SetSfxReverbIndexTo1(play, csCtx, (CsCmdSfxReverbIndexTo1*)script);
+ script += sizeof(CsCmdSfxReverbIndexTo1);
}
break;
- case CS_CMD_132:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_MODIFY_SEQ:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- func_800EADB0(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_ModifySequence(play, csCtx, (CsCmdModifySeq*)script);
+ script += sizeof(CsCmdModifySeq);
}
break;
case CS_CMD_RUMBLE:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_Rumble(play, csCtx, (CsCmdRumble*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdRumble);
+ CutsceneCmd_RumbleController(play, csCtx, (CsCmdRumble*)script);
+ script += sizeof(CsCmdRumble);
}
break;
- case CS_CMD_FADESCREEN:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_TRANSITION_GENERAL:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_FadeColorScreen(play, csCtx, (CsCmdFadeScreen*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdFadeScreen);
+ CutsceneCmd_TransitionGeneral(play, csCtx, (CsCmdTransitionGeneral*)script);
+ script += sizeof(CsCmdTransitionGeneral);
}
break;
- case CS_CMD_SETTIME:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_TIME:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_SetTime(play, csCtx, (CsCmdDayTime*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdDayTime);
+ CutsceneCmd_SetTime(play, csCtx, (CsCmdTime*)script);
+ script += sizeof(CsCmdTime);
}
break;
- case CS_CMD_SET_PLAYER_ACTION:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_PLAYER_CUE:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame <= csCtx->frames) && (csCtx->frames < cmd->endFrame)) {
- csCtx->playerAction = (CsCmdActorAction*)cmd;
+ cmd = script;
+
+ if ((((CsCmdActorCue*)cmd)->startFrame <= csCtx->curFrame) &&
+ (csCtx->curFrame < ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->playerCue = (CsCmdActorCue*)cmd;
}
- cutscenePtr += sizeof(CsCmdActorAction);
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_CAMERA:
- cutscenePtr += Cutscene_Command_Camera(play, cutscenePtr);
+ case CS_CMD_CAMERA_SPLINE:
+ script += CutsceneCmd_UpdateCamSpline(play, script);
break;
- case CS_CMD_TERMINATOR:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_DESTINATION:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_Terminator(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_Destination(play, csCtx, (CsCmdDestination*)script);
+ script += sizeof(CsCmdDestination);
}
break;
case CS_CMD_CHOOSE_CREDITS_SCENES:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_ChooseCreditsScenes(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_ChooseCreditsScenes(play, csCtx, (CsCmdChooseCreditsScene*)script);
+ script += sizeof(CsCmdChooseCreditsScene);
}
break;
- case CS_CMD_TEXTBOX:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_TEXT:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if (cmd->base != 0xFFFF) {
- Cutscene_Command_Textbox(play, csCtx, (CsCmdTextbox*)cmd);
+ cmd = script;
+
+ if (((CsCmdText*)cmd)->textId != 0xFFFF) {
+ CutsceneCmd_Text(play, csCtx, (CsCmdText*)cmd);
}
- cutscenePtr += sizeof(CsCmdTextbox);
+ script += sizeof(CsCmdText);
}
break;
- case CS_CMD_SCENE_TRANS_FX:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_TRANSITION:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_TransitionFX(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_Transition(play, csCtx, (CsCmdTransition*)script);
+ script += sizeof(CsCmdTransition);
}
break;
- case CS_CMD_MOTIONBLUR:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_MOTION_BLUR:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_MotionBlur(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_MotionBlur(play, csCtx, (CsCmdMotionBlur*)script);
+ script += sizeof(CsCmdMotionBlur);
}
break;
- case CS_CMD_GIVETATL:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ case CS_CMD_GIVE_TATL:
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_GiveTatlToPlayer(play, csCtx, (CsCmdBase*)cutscenePtr);
- cutscenePtr += sizeof(CsCmdBase);
+ CutsceneCmd_GiveTatlToPlayer(play, csCtx, (CsCmdGiveTatl*)script);
+ script += sizeof(CsCmdGiveTatl);
}
break;
- case -2:
+ case CS_CMD_ACTOR_CUE_POST_PROCESS:
break;
default:
- bcopy(cutscenePtr, &cmdEntries, sizeof(s32));
- cutscenePtr += sizeof(s32);
+ bcopy(script, &cmdEntries, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cutscenePtr += sizeof(CsCmdBase);
+ script += sizeof(CsCmdUnimplemented);
}
break;
}
@@ -1390,119 +1450,125 @@ void Cutscene_ProcessCommands(PlayState* play, CutsceneContext* csCtx, u8* cutsc
/* End of command handling section */
-void func_800ED980(PlayState* play, CutsceneContext* csCtx) {
- if (gSaveContext.save.cutscene >= 0xFFF0) {
- csCtx->frames++;
- Cutscene_ProcessCommands(play, csCtx, (u8*)play->csCtx.csData);
+void CutsceneHandler_RunScript(PlayState* play, CutsceneContext* csCtx) {
+ if (gSaveContext.save.cutsceneIndex >= 0xFFF0) {
+ csCtx->curFrame++;
+ Cutscene_ProcessScript(play, csCtx, (u8*)play->csCtx.script);
}
}
-void func_800ED9C4(PlayState* play, CutsceneContext* csCtx) {
- if (func_800EA220(play, csCtx, 0.0f)) {
+void CutsceneHandler_StopManual(PlayState* play, CutsceneContext* csCtx) {
+ if (Cutscene_StepTimer(play, csCtx, 0.0f)) {
Audio_SetCutsceneFlag(false);
- csCtx->state = CS_STATE_0;
+ csCtx->state = CS_STATE_IDLE;
}
}
-// unused
-void func_800EDA04(PlayState* play, CutsceneContext* csCtx) {
- if (func_800EA220(play, csCtx, 0.0f)) {
+void CutsceneHandler_StopScript(PlayState* play, CutsceneContext* csCtx) {
+ if (Cutscene_StepTimer(play, csCtx, 0.0f)) {
s16 i;
- csCtx->playerAction = NULL;
+ csCtx->playerCue = NULL;
- for (i = 0; i < ARRAY_COUNT(csCtx->actorActions); i++) {
- csCtx->actorActions[i] = NULL;
+ for (i = 0; i < ARRAY_COUNT(csCtx->actorCues); i++) {
+ csCtx->actorCues[i] = NULL;
}
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
gSaveContext.gameMode = GAMEMODE_NORMAL;
- ActorCutscene_Stop(0x7F);
+
+ CutsceneManager_Stop(CS_ID_GLOBAL_END);
Audio_SetCutsceneFlag(false);
- csCtx->state = CS_STATE_0;
+ csCtx->state = CS_STATE_IDLE;
}
}
-void func_800EDA84(PlayState* play, CutsceneContext* csCtx) {
- if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_0) && !Player_InCsMode(play)) {
- gSaveContext.save.cutscene = 0xFFFD;
+void Cutscene_SetupScripted(PlayState* play, CutsceneContext* csCtx) {
+ if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_IDLE) && !Player_InCsMode(play)) {
+ gSaveContext.save.cutsceneIndex = 0xFFFD;
}
- if ((gSaveContext.save.cutscene >= 0xFFF0) && (csCtx->state == CS_STATE_0)) {
+ if ((gSaveContext.save.cutsceneIndex >= 0xFFF0) && (csCtx->state == CS_STATE_IDLE)) {
s16 i;
- D_801BB124 = 0;
- D_801BB128 = 0;
- csCtx->playerAction = NULL;
+ sCurTextId = 0;
+ sCurOcarinaAction = 0;
+ csCtx->playerCue = NULL;
- for (i = 0; i < ARRAY_COUNT(csCtx->actorActions); i++) {
- csCtx->actorActions[i] = NULL;
+ for (i = 0; i < ARRAY_COUNT(csCtx->actorCues); i++) {
+ csCtx->actorCues[i] = NULL;
}
- csCtx->state++;
- if (csCtx->state == CS_STATE_1) {
+ csCtx->state++; // CS_STATE_START
+
+ if (csCtx->state == CS_STATE_START) {
Audio_SetCutsceneFlag(true);
- csCtx->frames = 0xFFFF;
- csCtx->subCamId = ActorCutscene_GetCurrentSubCamId(0x7F);
- func_8016119C(Play_GetCamera(play, csCtx->subCamId), &sCutsceneCameraInfo);
- csCtx->unk_18 = 0xFFFF;
+ csCtx->curFrame = 0xFFFF;
+
+ csCtx->subCamId = CutsceneManager_GetCurrentSubCamId(CS_ID_GLOBAL_END);
+ CutsceneCamera_Init(Play_GetCamera(play, csCtx->subCamId), &sCutsceneCameraInfo);
+
+ // OoT Remnant
+ csCtx->camEyeSplinePointsAppliedFrame = CS_CAM_DATA_NOT_APPLIED;
if (gSaveContext.cutsceneTrigger == 0) {
Interface_SetHudVisibility(HUD_VISIBILITY_NONE);
ShrinkWindow_Letterbox_SetSizeTarget(32);
ShrinkWindow_Letterbox_SetSize(32);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
- func_800ED980(play, csCtx);
+ CutsceneHandler_RunScript(play, csCtx);
}
gSaveContext.cutsceneTrigger = 0;
}
}
-// HandleFlags?
-void func_800EDBE0(PlayState* play) {
+void Cutscene_HandleEntranceTriggers(PlayState* play) {
s32 pad;
- s16 sp2A;
- SceneTableEntry* sp24;
- s32 temp_v0_3;
+ s16 csId;
+ SceneTableEntry* scene;
+ s32 scriptIndex;
if (((gSaveContext.gameMode == GAMEMODE_NORMAL) || (gSaveContext.gameMode == GAMEMODE_TITLE_SCREEN)) &&
(gSaveContext.respawnFlag <= 0)) {
- sp2A = func_800F21CC();
- if (sp2A != -1) {
- temp_v0_3 = func_800F2138(sp2A);
- if (temp_v0_3 != -1) {
- if ((play->csCtx.sceneCsList[temp_v0_3].unk7 != 0xFF) && (gSaveContext.respawnFlag == 0)) {
- if (play->csCtx.sceneCsList[temp_v0_3].unk7 == 0xFE) {
- ActorCutscene_Start(sp2A, NULL);
+ // Try to find an actor cutscene that's triggered by the current spawn
+ csId = CutsceneManager_FindEntranceCsId();
+ if (csId != CS_ID_NONE) {
+ scriptIndex = CutsceneManager_GetCutsceneScriptIndex(csId);
+ if (scriptIndex != CS_SCRIPT_ID_NONE) {
+ // A scripted cutscene is triggered by a spawn
+ if ((play->csCtx.scriptList[scriptIndex].spawnFlags != CS_SPAWN_FLAG_NONE) &&
+ (gSaveContext.respawnFlag == 0)) {
+ if (play->csCtx.scriptList[scriptIndex].spawnFlags == CS_SPAWN_FLAG_ALWAYS) {
+ // Entrance cutscenes that always run
+ CutsceneManager_Start(csId, NULL);
gSaveContext.showTitleCard = false;
- } else if (!(((void)0,
- gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)]) &
- (1 << (play->csCtx.sceneCsList[temp_v0_3].unk7 % 8)))) {
- // TODO: macros for this kind of weekEventReg access
- gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)] =
- ((void)0, gSaveContext.save.weekEventReg[(play->csCtx.sceneCsList[temp_v0_3].unk7 / 8)]) |
- (1 << (play->csCtx.sceneCsList[temp_v0_3].unk7 % 8));
- ActorCutscene_Start(sp2A, NULL);
+
+ } else if (!CHECK_CS_SPAWN_FLAG_WEEKEVENTREG(play->csCtx.scriptList[scriptIndex].spawnFlags)) {
+ // Entrance cutscenes that only run once
+ SET_CS_SPAWN_FLAG_WEEKEVENTREG(play->csCtx.scriptList[scriptIndex].spawnFlags);
+ CutsceneManager_Start(csId, NULL);
+ // The title card will be used by the cs misc command if necessary.
gSaveContext.showTitleCard = false;
}
}
} else {
- ActorCutscene_StartAndSetUnkLinkFields(sp2A, NULL);
+ // A non-scripted cutscene is triggered by a spawn
+ CutsceneManager_StartWithPlayerCs(csId, NULL);
}
}
}
if ((gSaveContext.respawnFlag == 0) || (gSaveContext.respawnFlag == -2)) {
- sp24 = play->loadedScene;
- if ((sp24->titleTextId != 0) && gSaveContext.showTitleCard) {
+ scene = play->loadedScene;
+ if ((scene->titleTextId != 0) && gSaveContext.showTitleCard) {
if ((Entrance_GetTransitionFlags(((void)0, gSaveContext.save.entrance) +
((void)0, gSaveContext.sceneLayer)) &
0x4000) != 0) {
- func_80151A68(play, sp24->titleTextId);
+ func_80151A68(play, scene->titleTextId);
}
}
@@ -1516,10 +1582,10 @@ void func_800EDDB0(PlayState* play) {
void func_800EDDBC(UNK_TYPE arg0, UNK_TYPE arg1) {
}
-void Cutscene_LoadCutsceneData(PlayState* play, u8 csIndex) {
- if (dREG(95) == 0) {
- play->csCtx.currentCsIndex = csIndex;
- play->csCtx.csData = Lib_SegmentedToVirtual(play->csCtx.sceneCsList[csIndex].segmentedData);
+void Cutscene_StartScripted(PlayState* play, u8 scriptIndex) {
+ if (!R_USE_DEBUG_CUTSCENE) {
+ play->csCtx.scriptIndex = scriptIndex;
+ play->csCtx.script = Lib_SegmentedToVirtual(play->csCtx.scriptList[scriptIndex].script);
}
gSaveContext.cutsceneTrigger = 1;
@@ -1531,32 +1597,32 @@ void Cutscene_LoadCutsceneData(PlayState* play, u8 csIndex) {
* Interpolates the actor's position based on the corresponding actor action's position
* and the current cutscene frame
*/
-void Cutscene_ActorTranslate(Actor* actor, PlayState* play, s32 actorActionIndex) {
- Vec3f start;
- Vec3f end;
- CsCmdActorAction* entry = play->csCtx.actorActions[actorActionIndex];
- f32 progress;
+void Cutscene_ActorTranslate(Actor* actor, PlayState* play, s32 cueChannel) {
+ Vec3f startPos;
+ Vec3f endPos;
+ CsCmdActorCue* cue = play->csCtx.actorCues[cueChannel];
+ f32 lerp;
- start.x = entry->startPos.x;
- start.y = entry->startPos.y;
- start.z = entry->startPos.z;
- end.x = entry->endPos.x;
- end.y = entry->endPos.y;
- end.z = entry->endPos.z;
+ startPos.x = cue->startPos.x;
+ startPos.y = cue->startPos.y;
+ startPos.z = cue->startPos.z;
+ endPos.x = cue->endPos.x;
+ endPos.y = cue->endPos.y;
+ endPos.z = cue->endPos.z;
- progress = Environment_LerpWeight(entry->endFrame, entry->startFrame, play->csCtx.frames);
+ lerp = Environment_LerpWeight(cue->endFrame, cue->startFrame, play->csCtx.curFrame);
- VEC3F_LERPIMPDST(&actor->world.pos, &start, &end, progress);
+ VEC3F_LERPIMPDST(&actor->world.pos, &startPos, &endPos, lerp);
}
/**
* Interpolates the actor's position based on the corresponding actor action's position
* and the current cutscene frame, and sets the actor's yaw using the actor action yaw
*/
-void Cutscene_ActorTranslateAndYaw(Actor* actor, PlayState* play, s32 actorActionIndex) {
- Cutscene_ActorTranslate(actor, play, actorActionIndex);
+void Cutscene_ActorTranslateAndYaw(Actor* actor, PlayState* play, s32 cueChannel) {
+ Cutscene_ActorTranslate(actor, play, cueChannel);
- actor->world.rot.y = play->csCtx.actorActions[actorActionIndex]->urot.y;
+ actor->world.rot.y = play->csCtx.actorCues[cueChannel]->rot.y;
actor->shape.rot.y = actor->world.rot.y;
}
@@ -1564,25 +1630,25 @@ void Cutscene_ActorTranslateAndYaw(Actor* actor, PlayState* play, s32 actorActio
* Interpolates the actor's position and yaw based on the corresponding actor action's
* position and the current cutscene frame
*/
-void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, PlayState* play, s32 actorActionIndex) {
- Vec3f start;
- Vec3f end;
- CsCmdActorAction* entry;
- f32 progress;
+void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, PlayState* play, s32 cueChannel) {
+ Vec3f startPos;
+ Vec3f endPos;
+ CsCmdActorCue* cue;
+ f32 lerp;
- start.x = play->csCtx.actorActions[actorActionIndex]->startPos.x;
- start.y = play->csCtx.actorActions[actorActionIndex]->startPos.y;
- start.z = play->csCtx.actorActions[actorActionIndex]->startPos.z;
- end.x = play->csCtx.actorActions[actorActionIndex]->endPos.x;
- end.y = play->csCtx.actorActions[actorActionIndex]->endPos.y;
- end.z = play->csCtx.actorActions[actorActionIndex]->endPos.z;
+ startPos.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ startPos.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ startPos.z = play->csCtx.actorCues[cueChannel]->startPos.z;
+ endPos.x = play->csCtx.actorCues[cueChannel]->endPos.x;
+ endPos.y = play->csCtx.actorCues[cueChannel]->endPos.y;
+ endPos.z = play->csCtx.actorCues[cueChannel]->endPos.z;
- entry = play->csCtx.actorActions[actorActionIndex];
- progress = Environment_LerpWeight(entry->endFrame, entry->startFrame, play->csCtx.frames);
+ cue = play->csCtx.actorCues[cueChannel];
+ lerp = Environment_LerpWeight(cue->endFrame, cue->startFrame, play->csCtx.curFrame);
- VEC3F_LERPIMPDST(&actor->world.pos, &start, &end, progress);
+ VEC3F_LERPIMPDST(&actor->world.pos, &startPos, &endPos, lerp);
- Math_SmoothStepToS(&actor->world.rot.y, Math_Vec3f_Yaw(&start, &end), 10, 1000, 1);
+ Math_SmoothStepToS(&actor->world.rot.y, Math_Vec3f_Yaw(&startPos, &endPos), 10, 1000, 1);
actor->shape.rot.y = actor->world.rot.y;
}
@@ -1590,24 +1656,24 @@ void Cutscene_ActorTranslateAndYawSmooth(Actor* actor, PlayState* play, s32 acto
* Interpolates the actor's XZ position and yaw based on the corresponding actor action's
* position and the current cutscene frame
*/
-void Cutscene_ActorTranslateXZAndYawSmooth(Actor* actor, PlayState* play, s32 actorActionIndex) {
- Vec3f start;
- Vec3f end;
- CsCmdActorAction* entry;
- f32 progress;
+void Cutscene_ActorTranslateXZAndYawSmooth(Actor* actor, PlayState* play, s32 cueChannel) {
+ Vec3f startPos;
+ Vec3f endPos;
+ CsCmdActorCue* cue;
+ f32 lerp;
- start.x = play->csCtx.actorActions[actorActionIndex]->startPos.x;
- start.z = play->csCtx.actorActions[actorActionIndex]->startPos.z;
- end.x = play->csCtx.actorActions[actorActionIndex]->endPos.x;
- end.z = play->csCtx.actorActions[actorActionIndex]->endPos.z;
+ startPos.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ startPos.z = play->csCtx.actorCues[cueChannel]->startPos.z;
+ endPos.x = play->csCtx.actorCues[cueChannel]->endPos.x;
+ endPos.z = play->csCtx.actorCues[cueChannel]->endPos.z;
- entry = play->csCtx.actorActions[actorActionIndex];
- progress = Environment_LerpWeight(entry->endFrame, entry->startFrame, play->csCtx.frames);
+ cue = play->csCtx.actorCues[cueChannel];
+ lerp = Environment_LerpWeight(cue->endFrame, cue->startFrame, play->csCtx.curFrame);
- actor->world.pos.x = start.x + (end.x - start.x) * progress;
- actor->world.pos.z = start.z + (end.z - start.z) * progress;
+ actor->world.pos.x = startPos.x + (endPos.x - startPos.x) * lerp;
+ actor->world.pos.z = startPos.z + (endPos.z - startPos.z) * lerp;
- Math_SmoothStepToS(&actor->world.rot.y, Math_Vec3f_Yaw(&start, &end), 10, 1000, 1);
+ Math_SmoothStepToS(&actor->world.rot.y, Math_Vec3f_Yaw(&startPos, &endPos), 10, 1000, 1);
actor->shape.rot.y = actor->world.rot.y;
}
@@ -1620,25 +1686,35 @@ s32 Cutscene_GetSceneLayer(PlayState* play) {
return sceneLayer;
}
-s32 Cutscene_GetActorActionIndex(PlayState* play, u16 actorActionCmd) {
+/**
+ * @param play See `PlayState`
+ * @param cueType See `cmdType`
+ * @return cue channel
+ */
+s32 Cutscene_GetCueChannel(PlayState* play, u16 cueType) {
s32 i;
- s32 index = -1;
+ s32 cueChannel = -1;
- for (i = 0; i < ARRAY_COUNT(D_801F4DC8); i++) {
- if (actorActionCmd == D_801F4DC8[i]) {
- index = i;
+ for (i = 0; i < ARRAY_COUNT(sCueTypeList); i++) {
+ if (cueType == sCueTypeList[i]) {
+ cueChannel = i;
}
}
- return index;
+ return cueChannel;
}
-s32 Cutscene_CheckActorAction(PlayState* play, u16 actorActionCmd) {
- if (play->csCtx.state != CS_STATE_0) {
- s32 index = Cutscene_GetActorActionIndex(play, actorActionCmd);
+/**
+ * @param play See `PlayState`
+ * @param cueType See `cmdType`
+ * @return is cuetype in a channel
+ */
+s32 Cutscene_IsCueInChannel(PlayState* play, u16 cueType) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, cueType);
- if (index != -1) {
- return play->csCtx.actorActions[index] != NULL;
+ if (cueChannel != -1) {
+ return play->csCtx.actorCues[cueChannel] != NULL;
}
}
@@ -1646,7 +1722,7 @@ s32 Cutscene_CheckActorAction(PlayState* play, u16 actorActionCmd) {
}
u8 Cutscene_IsPlaying(PlayState* play) {
- return (gSaveContext.cutsceneTrigger != 0) || (play->csCtx.state != CS_STATE_0);
+ return (gSaveContext.cutsceneTrigger != 0) || (play->csCtx.state != CS_STATE_IDLE);
}
/* End of actor utilities section */
diff --git a/src/code/z_draw.c b/src/code/z_draw.c
index a2686be8e..e6a814e2a 100644
--- a/src/code/z_draw.c
+++ b/src/code/z_draw.c
@@ -115,9 +115,9 @@ void GetItem_DrawWallet(PlayState* play, s16 drawId);
void GetItem_DrawRemains(PlayState* play, s16 drawId);
typedef struct {
- /* 0x00 */ void (*drawFunc)(PlayState*, s16);
- /* 0x04 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*)
-} DrawItemTableEntry; // size = 0x24
+ /* 0x0 */ void (*drawFunc)(PlayState*, s16);
+ /* 0x4 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*)
+} DrawItemTableEntry; // size = 0x24
static DrawItemTableEntry sDrawItemTable[] = {
// GID_BOTTLE, OBJECT_GI_BOTTLE
@@ -386,7 +386,7 @@ void GetItem_DrawBombchu(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C214(play->state.gfxCtx);
+ Gfx_SetupDL23_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -399,12 +399,12 @@ void GetItem_DrawPoes(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[1]);
@@ -430,12 +430,12 @@ void GetItem_DrawFairyBottle(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[1]);
@@ -459,12 +459,12 @@ void GetItem_DrawSkullToken(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 5),
@@ -480,12 +480,12 @@ void GetItem_DrawCompass(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 5);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_5);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -498,7 +498,7 @@ void GetItem_DrawPotion(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, -play->state.frames, play->state.frames, 32, 32, 1,
@@ -509,7 +509,7 @@ void GetItem_DrawPotion(PlayState* play, s16 drawId) {
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[2]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[3]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[4]);
@@ -523,7 +523,7 @@ void GetItem_DrawGoronSword(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 1, play->state.frames * 0, 32,
@@ -539,7 +539,7 @@ void GetItem_DrawDekuNuts(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 6, play->state.frames * 6, 32,
@@ -555,7 +555,7 @@ void GetItem_DrawRecoveryHeart(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, -(play->state.frames * 3),
@@ -571,7 +571,7 @@ void GetItem_DrawFish(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, play->state.frames * 0, play->state.frames * 1, 32,
@@ -590,7 +590,7 @@ void GetItem_DrawOpa0(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -606,12 +606,12 @@ void GetItem_DrawOpa0Xlu1(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[1]);
@@ -627,7 +627,7 @@ void GetItem_DrawOpa01(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
@@ -644,7 +644,7 @@ void GetItem_DrawXlu01(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[0]);
@@ -659,12 +659,12 @@ void GetItem_DrawSeahorse(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[1]);
@@ -685,8 +685,8 @@ void GetItem_DrawFairyContainer(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiFairyBottleTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -710,8 +710,8 @@ void GetItem_DrawMoonsTear(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -730,12 +730,12 @@ void GetItem_DrawMagicArrow(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[1]);
@@ -749,7 +749,7 @@ void GetItem_DrawUpgrades(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -765,13 +765,13 @@ void GetItem_DrawRupee(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[3]);
@@ -786,13 +786,13 @@ void GetItem_DrawSmallRupee(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Scale(0.7f, 0.7f, 0.7f, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[0]);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, sDrawItemTable[drawId].drawResources[3]);
@@ -806,7 +806,7 @@ void GetItem_DrawWallet(PlayState* play, s16 drawId) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDrawItemTable[drawId].drawResources[1]);
@@ -831,7 +831,7 @@ void GetItem_DrawRemains(PlayState* play, s16 drawId) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[objectIndex].segment);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c
index 5f0221969..775db80e1 100644
--- a/src/code/z_eff_blure.c
+++ b/src/code/z_eff_blure.c
@@ -114,23 +114,17 @@ void EffectBlure_Init1(void* thisx, void* initParamsx) {
EffectBlureInit1* initParams = (EffectBlureInit1*)initParamsx;
if ((this != NULL) && (initParams != NULL)) {
+ s32 i;
+
EffectBlure_InitElements(this);
- this->p1StartColor.r = initParams->p1StartColor[0];
- this->p2StartColor.r = initParams->p2StartColor[0];
- this->p1EndColor.r = initParams->p1EndColor[0];
- this->p2EndColor.r = initParams->p2EndColor[0];
- this->p1StartColor.g = initParams->p1StartColor[1];
- this->p2StartColor.g = initParams->p2StartColor[1];
- this->p1EndColor.g = initParams->p1EndColor[1];
- this->p2EndColor.g = initParams->p2EndColor[1];
- this->p1StartColor.b = initParams->p1StartColor[2];
- this->p2StartColor.b = initParams->p2StartColor[2];
- this->p1EndColor.b = initParams->p1EndColor[2];
- this->p2EndColor.b = initParams->p2EndColor[2];
- this->p1StartColor.a = initParams->p1StartColor[3];
- this->p2StartColor.a = initParams->p2StartColor[3];
- this->p1EndColor.a = initParams->p1EndColor[3];
- this->p2EndColor.a = initParams->p2EndColor[3];
+
+ for (i = 0; i < 4; i++) {
+ this->p1StartColor[i] = initParams->p1StartColor[i];
+ this->p2StartColor[i] = initParams->p2StartColor[i];
+ this->p1EndColor[i] = initParams->p1EndColor[i];
+ this->p2EndColor[i] = initParams->p2EndColor[i];
+ }
+
this->elemDuration = initParams->elemDuration;
this->unkFlag = initParams->unkFlag;
this->calcMode = initParams->calcMode;
@@ -155,23 +149,17 @@ void EffectBlure_Init2(void* thisx, void* initParamsx) {
EffectBlureInit2* initParams = (EffectBlureInit2*)initParamsx;
if ((this != NULL) && (initParams != NULL)) {
+ s32 i;
+
EffectBlure_InitElements(this);
- this->p1StartColor.r = initParams->p1StartColor[0];
- this->p2StartColor.r = initParams->p2StartColor[0];
- this->p1EndColor.r = initParams->p1EndColor[0];
- this->p2EndColor.r = initParams->p2EndColor[0];
- this->p1StartColor.g = initParams->p1StartColor[1];
- this->p2StartColor.g = initParams->p2StartColor[1];
- this->p1EndColor.g = initParams->p1EndColor[1];
- this->p2EndColor.g = initParams->p2EndColor[1];
- this->p1StartColor.b = initParams->p1StartColor[2];
- this->p2StartColor.b = initParams->p2StartColor[2];
- this->p1EndColor.b = initParams->p1EndColor[2];
- this->p2EndColor.b = initParams->p2EndColor[2];
- this->p1StartColor.a = initParams->p1StartColor[3];
- this->p2StartColor.a = initParams->p2StartColor[3];
- this->p1EndColor.a = initParams->p1EndColor[3];
- this->p2EndColor.a = initParams->p2EndColor[3];
+
+ for (i = 0; i < 4; i++) {
+ this->p1StartColor[i] = initParams->p1StartColor[i];
+ this->p2StartColor[i] = initParams->p2StartColor[i];
+ this->p1EndColor[i] = initParams->p1EndColor[i];
+ this->p2EndColor[i] = initParams->p2EndColor[i];
+ }
+
this->elemDuration = initParams->elemDuration;
this->unkFlag = initParams->unkFlag;
this->calcMode = initParams->calcMode;
@@ -372,21 +360,21 @@ void EffectBlure_GetComputedValues(EffectBlure* this, s32 index, f32 ratio, Vec3
color1->r = color1->g = color1->b = color1->a = 255;
color2->r = color2->g = color2->b = color2->a = 255;
} else {
- color1->r = func_800B0A24(this->p1StartColor.r, this->p1EndColor.r, ratio);
- color1->g = func_800B0A24(this->p1StartColor.g, this->p1EndColor.g, ratio);
- color1->b = func_800B0A24(this->p1StartColor.b, this->p1EndColor.b, ratio);
- color1->a = func_800B0A24(this->p1StartColor.a, this->p1EndColor.a, ratio);
- color2->r = func_800B0A24(this->p2StartColor.r, this->p2EndColor.r, ratio);
- color2->g = func_800B0A24(this->p2StartColor.g, this->p2EndColor.g, ratio);
- color2->b = func_800B0A24(this->p2StartColor.b, this->p2EndColor.b, ratio);
- color2->a = func_800B0A24(this->p2StartColor.a, this->p2EndColor.a, ratio);
+ color1->r = func_800B0A24(this->p1StartColor[0], this->p1EndColor[0], ratio);
+ color1->g = func_800B0A24(this->p1StartColor[1], this->p1EndColor[1], ratio);
+ color1->b = func_800B0A24(this->p1StartColor[2], this->p1EndColor[2], ratio);
+ color1->a = func_800B0A24(this->p1StartColor[3], this->p1EndColor[3], ratio);
+ color2->r = func_800B0A24(this->p2StartColor[0], this->p2EndColor[0], ratio);
+ color2->g = func_800B0A24(this->p2StartColor[1], this->p2EndColor[1], ratio);
+ color2->b = func_800B0A24(this->p2StartColor[2], this->p2EndColor[2], ratio);
+ color2->a = func_800B0A24(this->p2StartColor[3], this->p2EndColor[3], ratio);
}
}
void EffectBlure_SetupSmooth(EffectBlure* this, GraphicsContext* gfxCtx) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
CLOSE_DISPS(gfxCtx);
}
@@ -573,16 +561,16 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem
vtx[0].v = baseVtx;
vtx[1].v = baseVtx;
- vtx[0].v.ob[0] = func_80086814(sp158.x);
- vtx[0].v.ob[1] = func_80086814(sp158.y);
- vtx[0].v.ob[2] = func_80086814(sp158.z);
+ vtx[0].v.ob[0] = Math_FNearbyIntF(sp158.x);
+ vtx[0].v.ob[1] = Math_FNearbyIntF(sp158.y);
+ vtx[0].v.ob[2] = Math_FNearbyIntF(sp158.z);
vtx[0].v.cn[0] = sp148.r;
vtx[0].v.cn[1] = sp148.g;
vtx[0].v.cn[2] = sp148.b;
vtx[0].v.cn[3] = sp148.a;
- vtx[1].v.ob[0] = func_80086814(sp14C.x);
- vtx[1].v.ob[1] = func_80086814(sp14C.y);
- vtx[1].v.ob[2] = func_80086814(sp14C.z);
+ vtx[1].v.ob[0] = Math_FNearbyIntF(sp14C.x);
+ vtx[1].v.ob[1] = Math_FNearbyIntF(sp14C.y);
+ vtx[1].v.ob[2] = Math_FNearbyIntF(sp14C.z);
vtx[1].v.cn[0] = sp144.r;
vtx[1].v.cn[1] = sp144.g;
vtx[1].v.cn[2] = sp144.b;
@@ -618,17 +606,17 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem
vtx[j1].v = baseVtx;
vtx[j2].v = baseVtx;
- vtx[j1].v.ob[0] = func_80086814(sp158.x);
- vtx[j1].v.ob[1] = func_80086814(sp158.y);
- vtx[j1].v.ob[2] = func_80086814(sp158.z);
+ vtx[j1].v.ob[0] = Math_FNearbyIntF(sp158.x);
+ vtx[j1].v.ob[1] = Math_FNearbyIntF(sp158.y);
+ vtx[j1].v.ob[2] = Math_FNearbyIntF(sp158.z);
vtx[j1].v.cn[0] = func_800B0A24(sp1A4.r, sp19C.r, temp_f28);
vtx[j1].v.cn[1] = func_800B0A24(sp1A4.g, sp19C.g, temp_f28);
vtx[j1].v.cn[2] = func_800B0A24(sp1A4.b, sp19C.b, temp_f28);
vtx[j1].v.cn[3] = func_800B0A24(sp1A4.a, sp19C.a, temp_f28);
- vtx[j2].v.ob[0] = func_80086814(sp14C.x);
- vtx[j2].v.ob[1] = func_80086814(sp14C.y);
- vtx[j2].v.ob[2] = func_80086814(sp14C.z);
+ vtx[j2].v.ob[0] = Math_FNearbyIntF(sp14C.x);
+ vtx[j2].v.ob[1] = Math_FNearbyIntF(sp14C.y);
+ vtx[j2].v.ob[2] = Math_FNearbyIntF(sp14C.z);
vtx[j2].v.cn[0] = func_800B0A24(sp1A0.r, sp198.r, temp_f28);
vtx[j2].v.cn[1] = func_800B0A24(sp1A0.g, sp198.g, temp_f28);
vtx[j2].v.cn[2] = func_800B0A24(sp1A0.b, sp198.b, temp_f28);
@@ -705,7 +693,7 @@ void EffectBlure_DrawSmooth(EffectBlure* this2, GraphicsContext* gfxCtx) {
void EffectBlure_SetupSimple(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
CLOSE_DISPS(gfxCtx);
}
@@ -714,7 +702,7 @@ void EffectBlure_SetupSimpleAlt(GraphicsContext* gfxCtx, EffectBlure* this, Vtx*
OPEN_DISPS(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPSetTextureLUT(POLY_XLU_DISP++, G_TT_NONE);
@@ -765,7 +753,7 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
j = 0;
- for (i = 0; i < this->numElements - 1; i++) {
+ for (i = 0; i < this->numElements - 1; i++, j += 4) {
if (this->drawMode == 1) {
alphaRatio = (f32)this->elements[i].timer / (f32)this->elemDuration;
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x80, this->altPrimColor.r, this->altPrimColor.g,
@@ -773,45 +761,43 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
gDPPipeSync(POLY_XLU_DISP++);
}
- if (1) {} // Necessary to match
-
gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- if (this->flags & 4) {
- sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) * 0.5f;
- sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) * 0.5f;
- sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) * 0.5f;
- sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) * 0.5f;
- sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) * 0.5f;
- sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) * 0.5f;
-
- Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
- scale = sqrtf(SQXYZ(sp198));
-
- if (fabsf(scale) > 0.0005f) {
- scale = 1.0f / scale;
- Math_Vec3f_Scale(&sp198, scale);
-
- SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
- SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
- SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
- SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
- SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
-
- mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
- if (mtx == NULL) {
- break;
- }
-
- gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
- gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- }
+ if (!(this->flags & 4)) {
+ continue;
}
- j += 4;
+ sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) / 2.0f;
+ sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) / 2.0f;
+ sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) / 2.0f;
+ sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) / 2.0f;
+ sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) / 2.0f;
+ sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) / 2.0f;
+
+ Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
+ scale = sqrtf(SQXYZ(sp198));
+
+ if (fabsf(scale) > 0.0005f) {
+ scale = 1.0f / scale;
+ Math_Vec3f_Scale(&sp198, scale);
+
+ SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
+ SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
+ SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
+ SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
+ SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
+ if (mtx == NULL) {
+ break;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
}
}
@@ -938,7 +924,7 @@ void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (this->numElements != 0) {
if (this->flags == 0) {
- func_8012C560(gfxCtx);
+ Gfx_SetupDL38_Xlu(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
vtx = GRAPH_ALLOC(gfxCtx, 32 * sizeof(Vtx));
@@ -992,19 +978,19 @@ void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx) {
vtx[j].v.flag = 0;
vtx[j].v.tc[0] = 0;
vtx[j].v.tc[1] = 0;
- vtx[j].v.cn[0] = func_800B0A24(this->p1StartColor.r, this->p1EndColor.r, ratio);
- vtx[j].v.cn[1] = func_800B0A24(this->p1StartColor.g, this->p1EndColor.g, ratio);
- vtx[j].v.cn[2] = func_800B0A24(this->p1StartColor.b, this->p1EndColor.b, ratio);
- vtx[j].v.cn[3] = func_800B0A24(this->p1StartColor.a, this->p1EndColor.a, ratio);
+ vtx[j].v.cn[0] = func_800B0A24(this->p1StartColor[0], this->p1EndColor[0], ratio);
+ vtx[j].v.cn[1] = func_800B0A24(this->p1StartColor[1], this->p1EndColor[1], ratio);
+ vtx[j].v.cn[2] = func_800B0A24(this->p1StartColor[2], this->p1EndColor[2], ratio);
+ vtx[j].v.cn[3] = func_800B0A24(this->p1StartColor[3], this->p1EndColor[3], ratio);
j++;
vtx[j].v.flag = 0;
vtx[j].v.tc[0] = 0;
vtx[j].v.tc[1] = 0;
- vtx[j].v.cn[0] = func_800B0A24(this->p2StartColor.r, this->p2EndColor.r, ratio);
- vtx[j].v.cn[1] = func_800B0A24(this->p2StartColor.g, this->p2EndColor.g, ratio);
- vtx[j].v.cn[2] = func_800B0A24(this->p2StartColor.b, this->p2EndColor.b, ratio);
- vtx[j].v.cn[3] = func_800B0A24(this->p2StartColor.a, this->p2EndColor.a, ratio);
+ vtx[j].v.cn[0] = func_800B0A24(this->p2StartColor[0], this->p2EndColor[0], ratio);
+ vtx[j].v.cn[1] = func_800B0A24(this->p2StartColor[1], this->p2EndColor[1], ratio);
+ vtx[j].v.cn[2] = func_800B0A24(this->p2StartColor[2], this->p2EndColor[2], ratio);
+ vtx[j].v.cn[3] = func_800B0A24(this->p2StartColor[3], this->p2EndColor[3], ratio);
j++;
}
}
diff --git a/src/code/z_eff_footmark.c b/src/code/z_eff_footmark.c
index bcf6ff824..806cc45e0 100644
--- a/src/code/z_eff_footmark.c
+++ b/src/code/z_eff_footmark.c
@@ -105,7 +105,7 @@ void EffFootmark_Draw(PlayState* play) {
s32 i;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gSPDisplayList(gfxCtx->polyXlu.p++, gEffFootprintMaterialDL);
diff --git a/src/code/z_eff_shield_particle.c b/src/code/z_eff_shield_particle.c
index 90833947b..e15874a78 100644
--- a/src/code/z_eff_shield_particle.c
+++ b/src/code/z_eff_shield_particle.c
@@ -149,7 +149,7 @@ void EffectShieldParticle_Draw(void* thisx, GraphicsContext* gfxCtx) {
OPEN_DISPS(gfxCtx);
if (this != NULL) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/code/z_eff_spark.c b/src/code/z_eff_spark.c
index fdd25a6b4..77b40e3ed 100644
--- a/src/code/z_eff_spark.c
+++ b/src/code/z_eff_spark.c
@@ -148,7 +148,7 @@ void EffectSpark_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (this != NULL) {
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_38);
gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/code/z_eff_tire_mark.c b/src/code/z_eff_tire_mark.c
index f19eb1289..d14d6926c 100644
--- a/src/code/z_eff_tire_mark.c
+++ b/src/code/z_eff_tire_mark.c
@@ -11,7 +11,7 @@ void func_800AE930(CollisionContext* colCtx, EffectTireMark* this, Vec3f* pos, f
u32 spA0;
Vec3s* vtxList = colCtx->colHeader->vtxList;
- if ((bgId != 50) || (this->numElements >= (ARRAY_COUNT(this->elements) - 1)) || (colPoly == NULL)) {
+ if ((bgId != BGCHECK_SCENE) || (this->numElements >= (ARRAY_COUNT(this->elements) - 1)) || (colPoly == NULL)) {
func_800AEF44(this);
return;
}
@@ -231,7 +231,7 @@ void EffectTireMark_Draw(void* thisx, GraphicsContext* gfxCtx) {
if (vtx != NULL) {
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP++, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP++, SETUPDL_44);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
gDPLoadTextureBlock(POLY_OPA_DISP++, gameplay_keep_Tex_014570, G_IM_FMT_I, G_IM_SIZ_8b, 64, 32, 0,
diff --git a/src/code/z_effect.c b/src/code/z_effect.c
index b4a76380e..60a98c4d9 100644
--- a/src/code/z_effect.c
+++ b/src/code/z_effect.c
@@ -187,33 +187,31 @@ void Effect_DrawAll(GraphicsContext* gfxCtx) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {
- if (gfxCtx) {}
- } // necessary to match
- if (sEffectContext.blures[i].status.active) {
- sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
}
- if (1) {} // necessary to match
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (sEffectContext.tireMarks[i].status.active) {
- sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
}
}
@@ -221,38 +219,38 @@ void Effect_UpdateAll(PlayState* play) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
- Effect_Destroy(play, i);
- }
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
+ Effect_Destroy(play, i);
}
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.blures[i].status.active) {
- if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT);
- }
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT);
}
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
- }
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
}
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.tireMarks[i].status.active) {
- if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
- }
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
}
}
}
diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c
index 775b68f01..186608729 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -273,6 +273,7 @@ void EffectSS_DrawAllParticles(PlayState* play) {
s16 func_800B096C(s16 arg0, s16 arg1, s32 arg2) {
s16 ret = (arg2 == 0) ? arg1 : arg0 + (s32)((arg1 - arg0) / (f32)arg2);
+
return ret;
}
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 0b08f4dd0..17852c4c1 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -58,7 +58,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, TexturePtr texture) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(texture));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rgPrimColorR, this->rgPrimColorG, this->rgPrimColorB,
this->rgPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rgEnvColorR, this->rgEnvColorG, this->rgEnvColorB, this->rgEnvColorA);
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 830824024..1b005443d 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -45,7 +45,7 @@ u16 QuestHint_GetTatlTextId(PlayState* play) {
return 0x21D;
}
- if (gSaveContext.save.playerData.isMagicAcquired != true) {
+ if (gSaveContext.save.saveInfo.playerData.isMagicAcquired != true) {
return 0x21F;
}
diff --git a/src/code/z_en_hy_code.c b/src/code/z_en_hy_code.c
index 2f508bb94..b5992dec4 100644
--- a/src/code/z_en_hy_code.c
+++ b/src/code/z_en_hy_code.c
@@ -69,13 +69,13 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
do {
doorIter = SubS_FindActor(play, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
door = (EnDoor*)doorIter;
- dist = Actor_WorldDistXYZToActor(actor, &door->dyna.actor);
+ dist = Actor_WorldDistXYZToActor(actor, &door->knobDoor.dyna.actor);
if (!isSetup || (dist < minDist)) {
nearestDoor = door;
minDist = dist;
isSetup = true;
}
- doorIter = door->dyna.actor.next;
+ doorIter = door->knobDoor.dyna.actor.next;
} while (doorIter != NULL);
if (1) {}
@@ -134,16 +134,16 @@ void func_800F0BB4(EnHy* enHy, PlayState* play, EnDoor* door, s16 arg3, s16 arg4
Vec3f offset;
f32 phi_f0;
- Actor_OffsetOfPointInActorCoords(&door->dyna.actor, &offset, &enHy->actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&door->knobDoor.dyna.actor, &offset, &enHy->actor.world.pos);
phi_f0 = (offset.z >= 0.0f) ? 1.0f : -1.0f;
animIndex = ((s8)phi_f0 < 0) ? 0 : 2;
EnHy_ChangeObjectAndAnim(enHy, play, (animIndex == 0) ? arg3 : arg4);
enHy->skelAnime.baseTransl = *enHy->skelAnime.jointTable;
enHy->skelAnime.prevTransl = *enHy->skelAnime.jointTable;
- enHy->skelAnime.moveFlags |= (ANIM_FLAG_UPDATEY | ANIM_FLAG_1);
+ enHy->skelAnime.moveFlags |= (ANIM_FLAG_UPDATE_Y | ANIM_FLAG_1);
AnimationContext_SetMoveActor(play, &enHy->actor, &enHy->skelAnime, 1.0f);
- door->unk_1A1 = 1;
- door->animIndex = animIndex;
+ door->knobDoor.playOpenAnim = true;
+ door->knobDoor.animIndex = animIndex;
}
s32 func_800F0CE4(EnHy* enHy, PlayState* play, ActorFunc draw, s16 arg3, s16 arg4, f32 arg5) {
@@ -157,7 +157,7 @@ s32 func_800F0CE4(EnHy* enHy, PlayState* play, ActorFunc draw, s16 arg3, s16 arg
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, play, door, arg3, arg4);
- yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->dyna.actor.world.pos);
+ yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->knobDoor.dyna.actor.world.pos);
enHy->actor.world.pos.x += arg5 * Math_SinS(yaw);
enHy->actor.world.pos.z += arg5 * Math_CosS(yaw);
enHy->actor.world.rot.y = -yaw;
@@ -179,7 +179,7 @@ s32 func_800F0DD4(EnHy* enHy, PlayState* play, s16 arg2, s16 arg3) {
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, play, door, arg2, arg3);
- enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->dyna.actor.world.pos);
+ enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->knobDoor.dyna.actor.world.pos);
enHy->actor.world.rot.y = enHy->actor.shape.rot.y;
enHy->actor.gravity = 0.0f;
enHy->actor.flags &= ~ACTOR_FLAG_1;
@@ -250,19 +250,20 @@ void EnHy_UpdateCollider(EnHy* enHy, PlayState* play) {
s32 EnHy_PlayWalkingSound(EnHy* enHy, PlayState* play, f32 distAboveThreshold) {
u8 wasLeftFootOnGround = enHy->isLeftFootOnGround;
u8 wasRightFootOnGround = enHy->isRightFootOnGround;
- s32 waterSfxId;
+ SurfaceSfxOffset surfaceSfxOffset;
u16 sfxId;
u8 isFootOnGround;
if (enHy->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
if (enHy->actor.depthInWater < 20.0f) {
- waterSfxId = NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_SHALLOW;
} else {
- waterSfxId = NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_DEEP;
}
- sfxId = waterSfxId + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND + surfaceSfxOffset;
} else {
- sfxId = SurfaceType_GetSfx(&play->colCtx, enHy->actor.floorPoly, enHy->actor.floorBgId) + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND +
+ SurfaceType_GetSfxOffset(&play->colCtx, enHy->actor.floorPoly, enHy->actor.floorBgId);
}
enHy->isLeftFootOnGround = isFootOnGround = SubS_IsFloorAbove(play, &enHy->leftFootPos, distAboveThreshold);
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 3d78f00df..886c3c942 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -127,7 +127,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
break;
case ITEM00_RECOVERY_HEART:
- this->actor.home.rot.z = randPlusMinusPoint5Scaled(0xFFFF);
+ this->actor.home.rot.z = Rand_CenteredFloat(0xFFFF);
shadowOffset = 430.0f;
Actor_SetScale(&this->actor, 0.02f);
this->unk154 = 0.02f;
@@ -381,9 +381,9 @@ void func_800A6650(EnItem00* this, PlayState* play) {
}
if ((play->gameplayFrames & 1) != 0) {
- pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f);
- pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f);
- pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f);
+ pos.x = this->actor.world.pos.x + Rand_CenteredFloat(10.0f);
+ pos.y = this->actor.world.pos.y + Rand_CenteredFloat(10.0f);
+ pos.z = this->actor.world.pos.z + Rand_CenteredFloat(10.0f);
EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor);
}
@@ -507,7 +507,9 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
if (this->actor.gravity != 0.0f) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 15.0f, 15.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 15.0f, 15.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->actor.floorHeight <= BGCHECK_Y_MIN) {
Actor_Kill(&this->actor);
@@ -781,7 +783,7 @@ void EnItem00_DrawRupee(EnItem00* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->actor.params <= ITEM00_RUPEE_RED) {
@@ -832,7 +834,7 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
}
}
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sItemDropTextures[texIndex]));
@@ -849,7 +851,7 @@ void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play) {
if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(20.0f, 20.0f, 20.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
@@ -866,7 +868,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
@@ -883,12 +885,13 @@ s16 func_800A7650(s16 dropId) {
(dropId == ITEM00_ARROWS_50)) &&
(INV_CONTENT(ITEM_BOW) == ITEM_NONE)) ||
(((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) &&
- (gSaveContext.save.playerData.magicLevel == 0))) {
+ (gSaveContext.save.saveInfo.playerData.magicLevel == 0))) {
return ITEM00_NO_DROP;
}
if (dropId == ITEM00_RECOVERY_HEART) {
- if (((void)0, gSaveContext.save.playerData.healthCapacity) == ((void)0, gSaveContext.save.playerData.health)) {
+ if (((void)0, gSaveContext.save.saveInfo.playerData.healthCapacity) ==
+ ((void)0, gSaveContext.save.saveInfo.playerData.health)) {
return ITEM00_RUPEE_GREEN;
}
}
@@ -953,7 +956,7 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
}
spawnedActor->speed = 2.0f;
spawnedActor->gravity = -0.9f;
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000);
Actor_SetScale(spawnedActor, 0.0f);
((EnItem00*)spawnedActor)->actionFunc = func_800A6780;
((EnItem00*)spawnedActor)->unk152 = 0xDC;
@@ -1008,7 +1011,7 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
} else {
spawnedActor->gravity = -0.9f;
}
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000);
spawnedActor->flags |= 0x10;
}
}
@@ -1146,27 +1149,29 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
}
if (dropId == ITEM00_FLEXIBLE) {
- if (gSaveContext.save.playerData.health <= 0x10) {
+ if (gSaveContext.save.saveInfo.playerData.health <= 0x10) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0,
2);
SoundSource_PlaySfxAtFixedWorldPos(play, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
return;
}
- if (gSaveContext.save.playerData.health <= 0x30) {
+ if (gSaveContext.save.saveInfo.playerData.health <= 0x30) {
params = 0x10;
dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 3;
- } else if (gSaveContext.save.playerData.health <= 0x50) {
+ } else if (gSaveContext.save.saveInfo.playerData.health <= 0x50) {
params = 0x10;
dropId = ITEM00_RECOVERY_HEART;
dropQuantity = 1;
- } else if ((gSaveContext.save.playerData.magicLevel != 0) && (gSaveContext.save.playerData.magic == 0)) {
+ } else if ((gSaveContext.save.saveInfo.playerData.magicLevel != 0) &&
+ (gSaveContext.save.saveInfo.playerData.magic == 0)) {
params = 0xD0;
dropId = ITEM00_MAGIC_LARGE;
dropQuantity = 1;
- } else if ((gSaveContext.save.playerData.magicLevel != 0) &&
- ((gSaveContext.save.playerData.magicLevel >> 1) >= gSaveContext.save.playerData.magic)) {
+ } else if ((gSaveContext.save.saveInfo.playerData.magicLevel != 0) &&
+ ((gSaveContext.save.saveInfo.playerData.magicLevel >> 1) >=
+ gSaveContext.save.saveInfo.playerData.magic)) {
params = 0xD0;
dropId = ITEM00_MAGIC_LARGE;
dropQuantity = 1;
@@ -1178,7 +1183,7 @@ void Item_DropCollectibleRandom(PlayState* play, Actor* fromActor, Vec3f* spawnP
params = 0xB0;
dropId = ITEM00_BOMBS_A;
dropQuantity = 1;
- } else if (gSaveContext.save.playerData.rupees < 11) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < 11) {
params = 0xA0;
dropId = ITEM00_RUPEE_RED;
dropQuantity = 1;
diff --git a/src/code/z_env_flags.c b/src/code/z_env_flags.c
index 06e216cd3..0057128e2 100644
--- a/src/code/z_env_flags.c
+++ b/src/code/z_env_flags.c
@@ -1,33 +1,33 @@
#include "global.h"
-void EnvFlags_UnsetAll(PlayState* play) {
+void CutsceneFlags_UnsetAll(PlayState* play) {
u8 i;
- for (i = 0; i < ARRAY_COUNT(play->envFlags); i++) {
- play->envFlags[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(play->cutsceneFlags); i++) {
+ play->cutsceneFlags[i] = 0;
}
}
-void EnvFlags_Set(PlayState* play, s16 flag) {
+void CutsceneFlags_Set(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = 1 << bit;
- play->envFlags[index] |= mask;
+ play->cutsceneFlags[index] |= mask;
}
-void EnvFlags_Unset(PlayState* play, s16 flag) {
+void CutsceneFlags_Unset(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = (1 << bit) ^ 0xFFFF;
- play->envFlags[index] &= mask;
+ play->cutsceneFlags[index] &= mask;
}
-s32 EnvFlags_Get(PlayState* play, s16 flag) {
+s32 CutsceneFlags_Get(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = 1 << bit;
- return play->envFlags[index] & mask;
+ return play->cutsceneFlags[index] & mask;
}
diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c
index 5b8b8dce3..121957396 100644
--- a/src/code/z_eventmgr.c
+++ b/src/code/z_eventmgr.c
@@ -1,52 +1,554 @@
+/**
+ * @file z_eventmgr.c
+ *
+ * Manages all cutscenes except for manual
+ */
#include "global.h"
#include "z64shrink_window.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F1460.s")
+ActorCutscene sGlobalCutsceneList[] = {
+ // CS_ID_GLOBAL_78
+ { -100, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_ALL_ALT, 255,
+ 255 },
+ // CS_ID_GLOBAL_79
+ { -100, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_ALL_ALT, 255,
+ 255 },
+ // CS_ID_GLOBAL_7A
+ { -100, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_ALL_ALT, 255,
+ 255 },
+ // CS_ID_GLOBAL_ELEGY
+ { 2, -1, CS_CAM_ID_GLOBAL_ELEGY, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_NONE,
+ CS_END_CAM_0, 32 },
+ // CS_ID_GLOBAL_TALK
+ { 32765, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_ALL_ALT,
+ CS_END_CAM_0, 255 },
+ // CS_ID_GLOBAL_DOOR
+ { 32764, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE_ALT, 255, CS_HUD_VISIBILITY_ALL_ALT,
+ CS_END_CAM_0, 255 },
+ // CS_ID_GLOBAL_RETURN_TO_CAM
+ { 32766, -2, CS_CAM_ID_GLOBAL_CONNECT, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE, 255,
+ CS_HUD_VISIBILITY_ALL_ALT, CS_END_CAM_0, 32 },
+ // CS_ID_GLOBAL_END
+ { 0, -1, CS_CAM_ID_NONE, CS_SCRIPT_ID_NONE, CS_ID_NONE, CS_END_SFX_NONE, 255, CS_HUD_VISIBILITY_ALL_ALT,
+ CS_END_CAM_0, 32 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCutsceneImpl.s")
+typedef enum {
+ /* 0 */ CS_START_0,
+ /* 1 */ CS_START_1,
+ /* 2 */ CS_START_2
+} ActorCutsceneStartMethod;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Init.s")
+typedef struct {
+ /* 0x00 */ s16 csId;
+ /* 0x02 */ s16 length;
+ /* 0x04 */ s16 endCsId;
+ /* 0x06 */ s16 subCamId;
+ /* 0x08 */ Actor* targetActor;
+ /* 0x0C */ s32 startMethod;
+ /* 0x10 */ PlayState* play;
+ /* 0x14 */ s16 retCamId;
+ /* 0x16 */ s16 isCameraStored;
+} CutsceneManager; // size = 0x18
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F15D8.s")
+CutsceneManager sCutsceneMgr = {
+ CS_ID_NONE, 0, CS_ID_NONE, SUB_CAM_ID_DONE, NULL, CS_START_0, NULL, CAM_ID_MAIN, false,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_ClearWaiting.s")
+s16 CutsceneManager_SetHudVisibility(s16 csHudVisibility) {
+ u16 hudVisibility;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_ClearNextCutscenes.s")
+ switch (csHudVisibility) {
+ case CS_HUD_VISIBILITY_NONE:
+ hudVisibility = HUD_VISIBILITY_NONE_ALT;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_MarkNextCutscenes.s")
+ case CS_HUD_VISIBILITY_ALL:
+ hudVisibility = HUD_VISIBILITY_ALL;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_End.s")
+ case CS_HUD_VISIBILITY_A_HEARTS_MAGIC:
+ hudVisibility = HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Update.s")
+ case CS_HUD_VISIBILITY_C_HEARTS_MAGIC:
+ hudVisibility = HUD_VISIBILITY_HEARTS_MAGIC_C;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_SetIntentToPlay.s")
+ case CS_HUD_VISIBILITY_ALL_NO_MINIMAP:
+ hudVisibility = HUD_VISIBILITY_ALL_NO_MINIMAP;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCanPlayNext.s")
+ case CS_HUD_VISIBILITY_A_B_C:
+ hudVisibility = HUD_VISIBILITY_A_B_C;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_StartAndSetUnkLinkFields.s")
+ case CS_HUD_VISIBILITY_B_MINIMAP:
+ hudVisibility = HUD_VISIBILITY_B_MINIMAP;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_StartAndSetFlag.s")
+ case CS_HUD_VISIBILITY_A:
+ hudVisibility = HUD_VISIBILITY_A;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Start.s")
+ default:
+ hudVisibility = HUD_VISIBILITY_ALL;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_Stop.s")
+ Interface_SetHudVisibility(hudVisibility);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentIndex.s")
+ return hudVisibility;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCutscene.s")
+ActorCutscene* CutsceneManager_GetCutsceneEntryImpl(s16 csId) {
+ if (csId < CS_ID_GLOBAL_78) {
+ return &sSceneCutsceneList[csId];
+ } else {
+ csId -= CS_ID_GLOBAL_78;
+ return &sGlobalCutsceneList[csId];
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetAdditionalCutscene.s")
+void CutsceneManager_Init(PlayState* play, ActorCutscene* cutsceneList, s16 numEntries) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetLength.s")
+ sSceneCutsceneList = cutsceneList;
+ sSceneCutsceneCount = numEntries;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F2138.s")
+ for (i = 0; i < ARRAY_COUNT(sWaitingCutsceneList); i++) {
+ sWaitingCutsceneList[i] = 0;
+ sNextCutsceneList[i] = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F2178.s")
+ sCutsceneMgr.endCsId = CS_ID_NONE;
+ sCutsceneMgr.play = play;
+ sCutsceneMgr.length = -1;
+ sCutsceneMgr.targetActor = NULL;
+ sCutsceneMgr.subCamId = SUB_CAM_ID_DONE;
+ sCutsceneMgr.isCameraStored = false;
+ sCutsceneMgr.csId = sCutsceneMgr.endCsId;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentSubCamId.s")
+/**
+ * Store camera into subCam 2, and keep subCam 2 INACTIVE to preserve the struct.
+ */
+void CutsceneManager_StoreCamera(Camera* camera) {
+ if (camera != NULL) {
+ memcpy(&sCutsceneMgr.play->subCameras[2], camera, sizeof(Camera));
+ sCutsceneMgr.play->subCameras[2].camId = camera->camId;
+ Camera_ChangeStatus(&sCutsceneMgr.play->subCameras[2], CAM_STATUS_INACTIVE);
+ sCutsceneMgr.isCameraStored = true;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F21CC.s")
+void CutsceneManager_ClearWaiting(void) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/func_800F22C4.s")
+ for (i = 0; i < ARRAY_COUNT(sWaitingCutsceneList); i++) {
+ sWaitingCutsceneList[i] = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eventmgr/ActorCutscene_SetReturnCamera.s")
+void CutsceneManager_ClearNextCutscenes(void) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(sNextCutsceneList); i++) {
+ sNextCutsceneList[i] = 0;
+ }
+}
+
+s16 CutsceneManager_MarkNextCutscenes(void) {
+ s16 bit;
+ s32 i;
+ s32 j;
+ s32 count = 0;
+ s16 csIdMax = CS_ID_NONE;
+ s16 priorityMax = SHT_MAX; // lower number means higher priority
+ s16 csId;
+ s16 priority;
+
+ for (i = 0; i < ARRAY_COUNT(sNextCutsceneList); i++) {
+ for (bit = 1, j = 0; j < 8; j++) {
+ if (sWaitingCutsceneList[i] & bit) {
+ csId = (i << 3) | j;
+ priority = CutsceneManager_GetCutsceneEntryImpl(csId)->priority;
+
+ if ((priority ^ 0) == -1) {
+ sNextCutsceneList[i] |= bit;
+ } else if ((priority < priorityMax) && (priority > 0)) {
+ csIdMax = csId;
+ priorityMax = priority;
+ }
+ count++;
+ }
+ bit <<= 1;
+ }
+ }
+ if (csIdMax != CS_ID_NONE) {
+ sNextCutsceneList[csIdMax >> 3] |= 1 << (csIdMax & 7);
+ }
+ return count;
+}
+
+#define RET_CAM sCutsceneMgr.play->cameraPtrs[sCutsceneMgr.retCamId]
+#define CUR_CAM sCutsceneMgr.play->cameraPtrs[sCutsceneMgr.subCamId]
+
+void CutsceneManager_End(void) {
+ ActorCutscene* csEntry;
+ s16 oldCamId;
+ s16 oldStateFlags;
+
+ switch (sCutsceneMgr.startMethod) {
+ case CS_START_2:
+ sCutsceneMgr.targetActor->flags &= ~ACTOR_FLAG_100000;
+ // fallthrough
+ case CS_START_1:
+ func_800B7298(sCutsceneMgr.play, 0, PLAYER_CSMODE_END);
+ sCutsceneMgr.startMethod = CS_START_0;
+ break;
+
+ default:
+ break;
+ }
+
+ csEntry = CutsceneManager_GetCutsceneEntryImpl(sCutsceneMgr.csId);
+
+ switch (csEntry->endSfx) {
+ case CS_END_SFX_TRE_BOX_APPEAR:
+ play_sound(NA_SE_SY_TRE_BOX_APPEAR);
+ break;
+
+ case CS_END_SFX_CORRECT_CHIME:
+ play_sound(NA_SE_SY_CORRECT_CHIME);
+ break;
+
+ default: // CS_END_SFX_NONE
+ break;
+ }
+
+ switch (csEntry->endCam) {
+ case CS_END_CAM_SMOOTH:
+ Play_CopyCamera(sCutsceneMgr.play, sCutsceneMgr.retCamId, sCutsceneMgr.subCamId);
+ RET_CAM->stateFlags =
+ (RET_CAM->stateFlags & ~CAM_STATE_UNDERWATER) | (CUR_CAM->stateFlags & CAM_STATE_UNDERWATER);
+ CutsceneManager_Queue(CS_ID_GLOBAL_RETURN_TO_CAM);
+ break;
+
+ case CS_END_CAM_0:
+ default:
+ Play_CopyCamera(sCutsceneMgr.play, sCutsceneMgr.retCamId, sCutsceneMgr.subCamId);
+ RET_CAM->stateFlags =
+ (RET_CAM->stateFlags & ~CAM_STATE_UNDERWATER) | (CUR_CAM->stateFlags & CAM_STATE_UNDERWATER);
+ break;
+
+ case CS_END_CAM_1:
+ oldCamId = RET_CAM->camId;
+ oldStateFlags = RET_CAM->stateFlags;
+
+ if (sCutsceneMgr.isCameraStored) {
+ // Restore the camera that was stored in subCam 2
+ memcpy(RET_CAM, &sCutsceneMgr.play->subCameras[2], sizeof(Camera));
+
+ RET_CAM->stateFlags =
+ (RET_CAM->stateFlags & ~CAM_STATE_UNDERWATER) | (CUR_CAM->stateFlags & CAM_STATE_UNDERWATER);
+
+ RET_CAM->stateFlags = (RET_CAM->stateFlags & ~CAM_STATE_2) | (oldStateFlags & CAM_STATE_2);
+ sCutsceneMgr.isCameraStored = false;
+ }
+ RET_CAM->camId = oldCamId;
+ break;
+ }
+
+ if (sCutsceneMgr.subCamId != SUB_CAM_ID_DONE) {
+ Play_ClearCamera(sCutsceneMgr.play, sCutsceneMgr.subCamId);
+ Play_ChangeCameraStatus(sCutsceneMgr.play, sCutsceneMgr.retCamId, CAM_STATUS_ACTIVE);
+ }
+
+ sCutsceneMgr.csId = CS_ID_NONE;
+ sCutsceneMgr.endCsId = CS_ID_NONE;
+ sCutsceneMgr.length = -1;
+ sCutsceneMgr.targetActor = NULL;
+ sCutsceneMgr.subCamId = SUB_CAM_ID_DONE;
+}
+
+s16 CutsceneManager_Update(void) {
+ s16 sp1E = 0;
+
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_RETURN_TO_CAM)) {
+ CutsceneManager_StartWithPlayerCs(CS_ID_GLOBAL_RETURN_TO_CAM, &GET_PLAYER(sCutsceneMgr.play)->actor);
+ }
+
+ if (sCutsceneMgr.endCsId == CS_ID_NONE) {
+ if (sCutsceneMgr.csId != CS_ID_NONE) {
+ if (sCutsceneMgr.length > 0) {
+ sCutsceneMgr.length--;
+ }
+ sp1E = 1;
+ if (sCutsceneMgr.length == 0) {
+ CutsceneManager_Stop(sCutsceneMgr.csId);
+ }
+ }
+ }
+
+ if (sCutsceneMgr.endCsId != CS_ID_NONE) {
+ CutsceneManager_End();
+ sp1E = 2;
+ }
+
+ CutsceneManager_ClearNextCutscenes();
+
+ if (sCutsceneMgr.csId == CS_ID_NONE) {
+ if ((CutsceneManager_MarkNextCutscenes() == 0) && (sp1E != 0)) {
+ ShrinkWindow_Letterbox_SetSizeTarget(0);
+ } else if (sp1E == 0) {
+ CutsceneManager_StoreCamera(Play_GetCamera(sCutsceneMgr.play, sCutsceneMgr.retCamId));
+ }
+ }
+ return sp1E;
+}
+
+void CutsceneManager_Queue(s16 csId) {
+ if (csId >= 0) {
+ sWaitingCutsceneList[csId >> 3] |= 1 << (csId & 7);
+ }
+}
+
+s16 CutsceneManager_IsNext(s16 csId) {
+ if (csId == CS_ID_GLOBAL_END) {
+ if (sCutsceneMgr.csId == CS_ID_NONE) {
+ return 0x7F;
+ } else {
+ return 0;
+ }
+ }
+ if (csId <= CS_ID_NONE) {
+ return -1;
+ }
+ return (sNextCutsceneList[csId >> 3] & (1 << (csId & 7))) ? 1 : 0;
+}
+
+/**
+ * Start an actor cutscene, activate Player Cutscene Mode "Wait"
+ */
+s16 CutsceneManager_StartWithPlayerCs(s16 csId, Actor* actor) {
+ s16 startCsId = CutsceneManager_Start(csId, actor);
+
+ if (startCsId >= 0) {
+ func_800B7298(sCutsceneMgr.play, 0, PLAYER_CSMODE_WAIT);
+ if (sCutsceneMgr.length == 0) {
+ CutsceneManager_Stop(sCutsceneMgr.csId);
+ }
+ sCutsceneMgr.startMethod = CS_START_1;
+ }
+ return startCsId;
+}
+
+/**
+ * Start an actor cutscene, activate Player Cutscene Mode "Wait", turn on ACTOR_FLAG_100000
+ */
+s16 CutsceneManager_StartWithPlayerCsAndSetFlag(s16 csId, Actor* actor) {
+ s16 startCsId = CutsceneManager_Start(csId, actor);
+
+ if (startCsId >= 0) {
+ func_800B7298(sCutsceneMgr.play, 0, PLAYER_CSMODE_WAIT);
+ if (sCutsceneMgr.length == 0) {
+ CutsceneManager_Stop(sCutsceneMgr.csId);
+ }
+ if (actor != NULL) {
+ actor->flags |= ACTOR_FLAG_100000;
+ sCutsceneMgr.startMethod = CS_START_2;
+ } else {
+ sCutsceneMgr.startMethod = CS_START_1;
+ }
+ }
+ return startCsId;
+}
+
+s16 CutsceneManager_Start(s16 csId, Actor* actor) {
+ ActorCutscene* csEntry;
+ Camera* subCam;
+ Camera* retCam;
+ s32 csType = 0;
+
+ if ((csId <= CS_ID_NONE) || (sCutsceneMgr.csId != CS_ID_NONE)) {
+ return csId;
+ }
+
+ sCutsceneMgr.startMethod = CS_START_0;
+ csEntry = CutsceneManager_GetCutsceneEntryImpl(csId);
+
+ ShrinkWindow_Letterbox_SetSizeTarget(csEntry->letterboxSize);
+ CutsceneManager_SetHudVisibility(csEntry->hudVisibility);
+
+ if (csId == CS_ID_GLOBAL_END) {
+ csType = 1;
+ } else if (csEntry->scriptIndex != CS_SCRIPT_ID_NONE) {
+ // scripted cutscene
+ csType = 1;
+ } else if ((csId != CS_ID_GLOBAL_DOOR) && (csId != CS_ID_GLOBAL_TALK)) {
+ csType = 2;
+ }
+
+ if (csType != 0) {
+ sCutsceneMgr.retCamId = Play_GetActiveCamId(sCutsceneMgr.play);
+ sCutsceneMgr.subCamId = Play_CreateSubCamera(sCutsceneMgr.play);
+
+ subCam = Play_GetCamera(sCutsceneMgr.play, sCutsceneMgr.subCamId);
+ retCam = Play_GetCamera(sCutsceneMgr.play, sCutsceneMgr.retCamId);
+
+ if ((retCam->setting == CAM_SET_START0) || (retCam->setting == CAM_SET_START2) ||
+ (retCam->setting == CAM_SET_START1)) {
+ if (CutsceneManager_FindEntranceCsId() != csId) {
+ func_800E0348(retCam);
+ } else {
+ Camera_UnsetStateFlag(retCam, CAM_STATE_2);
+ }
+ }
+
+ memcpy(subCam, retCam, sizeof(Camera));
+ subCam->camId = sCutsceneMgr.subCamId;
+ Camera_UnsetStateFlag(subCam, CAM_STATE_6 | CAM_STATE_0);
+
+ Play_ChangeCameraStatus(sCutsceneMgr.play, sCutsceneMgr.retCamId, CAM_STATUS_WAIT);
+ Play_ChangeCameraStatus(sCutsceneMgr.play, sCutsceneMgr.subCamId, CAM_STATUS_ACTIVE);
+
+ subCam->target = sCutsceneMgr.targetActor = actor;
+ subCam->behaviorFlags = 0;
+
+ if (csType == 1) {
+ Camera_ChangeSetting(subCam, CAM_SET_FREE0);
+ Cutscene_StartScripted(sCutsceneMgr.play, csEntry->scriptIndex);
+ sCutsceneMgr.length = csEntry->length;
+ } else {
+ if (csEntry->csCamId != CS_CAM_ID_NONE) {
+ Camera_ChangeActorCsCamIndex(subCam, csEntry->csCamId);
+ } else {
+ Camera_ChangeSetting(subCam, CAM_SET_FREE0);
+ }
+ sCutsceneMgr.length = csEntry->length;
+ }
+ }
+ sCutsceneMgr.csId = csId;
+
+ return csId;
+}
+
+s16 CutsceneManager_Stop(s16 csId) {
+ ActorCutscene* csEntry;
+
+ if (csId <= CS_ID_NONE) {
+ return csId;
+ }
+
+ csEntry = CutsceneManager_GetCutsceneEntryImpl(sCutsceneMgr.csId);
+ if ((sCutsceneMgr.length > 0) && (csEntry->scriptIndex == CS_SCRIPT_ID_NONE)) {
+ return -2;
+ }
+ if ((csId != CS_ID_GLOBAL_END) && (csEntry->scriptIndex != CS_SCRIPT_ID_NONE)) {
+ return -3;
+ }
+
+ if (csId == CS_ID_GLOBAL_END) {
+ csId = sCutsceneMgr.csId;
+ }
+ if (csId == sCutsceneMgr.csId) {
+ sCutsceneMgr.endCsId = sCutsceneMgr.csId;
+ return sCutsceneMgr.endCsId;
+ }
+ return -1;
+}
+
+s16 CutsceneManager_GetCurrentCsId(void) {
+ return sCutsceneMgr.csId;
+}
+
+ActorCutscene* CutsceneManager_GetCutsceneEntry(s16 csId) {
+ return CutsceneManager_GetCutsceneEntryImpl(csId);
+}
+
+s16 CutsceneManager_GetAdditionalCsId(s16 csId) {
+ if (csId <= CS_ID_NONE) {
+ return CS_ID_NONE;
+ }
+ return CutsceneManager_GetCutsceneEntryImpl(csId)->additionalCsId;
+}
+
+s16 CutsceneManager_GetLength(s16 csId) {
+ if (csId <= CS_ID_NONE) {
+ return -1;
+ }
+ return CutsceneManager_GetCutsceneEntryImpl(csId)->length;
+}
+
+s16 CutsceneManager_GetCutsceneScriptIndex(s16 csId) {
+ if (csId <= CS_ID_NONE) {
+ return -1;
+ }
+ return CutsceneManager_GetCutsceneEntryImpl(csId)->scriptIndex;
+}
+
+s16 CutsceneManager_GetCutsceneCustomValue(s16 csId) {
+ if (csId <= CS_ID_NONE) {
+ return -1;
+ }
+ return CutsceneManager_GetCutsceneEntryImpl(csId)->customValue;
+}
+
+s16 CutsceneManager_GetCurrentSubCamId(s16 csId) {
+ return sCutsceneMgr.subCamId;
+}
+
+s16 CutsceneManager_FindEntranceCsId(void) {
+ PlayState* play;
+ s32 csId;
+
+ for (csId = 0; csId < sSceneCutsceneCount; csId++) {
+ //! FAKE:
+ if ((sSceneCutsceneList[csId].scriptIndex != CS_SCRIPT_ID_NONE) &&
+ (sSceneCutsceneList[csId].scriptIndex < (play = sCutsceneMgr.play)->csCtx.scriptListCount) &&
+ (sCutsceneMgr.play->curSpawn ==
+ sCutsceneMgr.play->csCtx.scriptList[sSceneCutsceneList[csId].scriptIndex].spawn)) {
+ return csId;
+ }
+ }
+
+ for (csId = 0; csId < sSceneCutsceneCount; csId++) {
+ if ((sSceneCutsceneList[csId].customValue >= 100) &&
+ (sSceneCutsceneList[csId].customValue == (sCutsceneMgr.play->curSpawn + 100))) {
+ return csId;
+ }
+ }
+
+ return -1;
+}
+
+s32 func_800F22C4(s16 csId, Actor* actor) {
+ f32 dist;
+ s16 screenPosX;
+ s16 screenPosY;
+
+ if ((sCutsceneMgr.csId == CS_ID_NONE) || (csId == CS_ID_NONE)) {
+ return 4;
+ }
+
+ Actor_GetScreenPos(sCutsceneMgr.play, actor, &screenPosX, &screenPosY);
+
+ dist = OLib_Vec3fDist(&actor->focus.pos, &Play_GetCamera(sCutsceneMgr.play, sCutsceneMgr.subCamId)->eye);
+
+ if ((screenPosX > 40) && (screenPosX < SCREEN_WIDTH - 40) && (screenPosY > 40) &&
+ (screenPosY < SCREEN_HEIGHT - 40) && (dist < 700.0f)) {
+ return 1;
+ }
+ if (sCutsceneMgr.length < 6) {
+ return 2;
+ }
+ if (csId == sCutsceneMgr.csId) {
+ return 0;
+ }
+ return 3;
+}
+
+void CutsceneManager_SetReturnCamera(s16 camId) {
+ sCutsceneMgr.retCamId = camId;
+}
diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c
index bc07df883..185373e06 100644
--- a/src/code/z_fbdemo_circle.c
+++ b/src/code/z_fbdemo_circle.c
@@ -2,7 +2,7 @@
typedef enum {
/* 0 */ TRANS_CIRCLE_DIR_IN,
- /* 1 */ TRANS_CIRCLE_DIR_OUT,
+ /* 1 */ TRANS_CIRCLE_DIR_OUT
} TransitionCircleDirection;
Gfx sTransCircleSetupDL[] = {
@@ -82,8 +82,8 @@ void TransitionCircle_SetType(void* thisx, s32 type) {
void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, s32 arg3, s32 masks, s32 maskt,
f32 arg6) {
Gfx* gfx = *gfxp;
- s32 xh = D_801FBBCC;
- s32 yh = D_801FBBCE;
+ s32 xh = gCfbWidth;
+ s32 yh = gCfbHeight;
s32 width = 1 << masks;
s32 height = 1 << maskt;
f32 s;
diff --git a/src/code/z_fbdemo_dlftbls.c b/src/code/z_fbdemo_dlftbls.c
index 9d3685a45..48d424813 100644
--- a/src/code/z_fbdemo_dlftbls.c
+++ b/src/code/z_fbdemo_dlftbls.c
@@ -1,30 +1,38 @@
#include "global.h"
-#include "initvars.h"
-#include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe4/z_fbdemo_wipe4.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.h"
-#define TRANSITION_OVERLAY(name, filename) \
- { \
- { 0, 0 }, SEGMENT_START(ovl_##filename), SEGMENT_END(ovl_##filename), SEGMENT_ROM_START(ovl_##filename), \
- SEGMENT_ROM_END(ovl_##filename), &name##_InitVars, sizeof(name) \
- }
+// InitVars and Linker symbol declarations (used in the table below)
+#define DEFINE_TRANSITION(_enumValue, structName, _instanceName, name) \
+ extern TransitionInit structName##_InitVars; \
+ DECLARE_OVERLAY_SEGMENT(name)
-#define TRANSITION_OVERLAY_INTERNAL(name) \
- { { 0, 0 }, NULL, NULL, 0, 0, &name##_InitVars, sizeof(name) }
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, _instanceName) extern TransitionInit structName##_InitVars;
-#define TRANSITION_OVERLAY_UNSET \
- { 0 }
+#include "tables/transition_table.h"
+
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
+#define DEFINE_TRANSITION(_enumValue, structName, _instanceName, name) \
+ { \
+ { 0, 0 }, \
+ SEGMENT_START(ovl_##name), \
+ SEGMENT_END(ovl_##name), \
+ SEGMENT_ROM_START(ovl_##name), \
+ SEGMENT_ROM_END(ovl_##name), \
+ &structName##_InitVars, \
+ sizeof(structName), \
+ },
+
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, _instanceName) \
+ { { 0, 0 }, NULL, NULL, 0, 0, &structName##_InitVars, sizeof(structName) },
TransitionOverlay gTransitionOverlayTable[] = {
- TRANSITION_OVERLAY_INTERNAL(TransitionFade), TRANSITION_OVERLAY(TransitionTriforce, fbdemo_triforce),
- TRANSITION_OVERLAY(TransitionWipe1, fbdemo_wipe1), TRANSITION_OVERLAY(TransitionWipe3, fbdemo_wipe3),
- TRANSITION_OVERLAY(TransitionWipe4, fbdemo_wipe4), TRANSITION_OVERLAY_INTERNAL(TransitionCircle),
- TRANSITION_OVERLAY(TransitionWipe5, fbdemo_wipe5),
+#include "tables/transition_table.h"
};
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
void Transition_Init(TransitionContext* transitionCtx) {
TransitionOverlay* overlayEntry;
ptrdiff_t relocOffset;
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index 114e62cc7..5565bc876 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -142,7 +142,8 @@ void FireObj_Draw(PlayState* play, FireObj* fire) {
Vec3s vec;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, (fire->timer * -20) % 512U, 32, 128));
diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c
index 1b82705f5..7336b01f6 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index 4e24eb72e..c3c6819be 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -49,8 +49,8 @@ void GameOver_Update(PlayState* play) {
}
}
- gSaveContext.unk_3DC0 = 2000;
- gSaveContext.save.playerData.tatlTimer = 0;
+ gSaveContext.nayrusLoveTimer = 2000;
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
gSaveContext.eventInf[0] = 0;
@@ -79,7 +79,7 @@ void GameOver_Update(PlayState* play) {
gSaveContext.respawnFlag = -6;
}
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- gSaveContext.save.playerData.health = 0x30;
+ gSaveContext.save.saveInfo.playerData.health = 0x30;
gameOverCtx->state++;
if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) {
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
diff --git a/src/code/z_horse.c b/src/code/z_horse.c
index 976ea2948..ac0142fae 100644
--- a/src/code/z_horse.c
+++ b/src/code/z_horse.c
@@ -1,21 +1,233 @@
#include "global.h"
+#include "z64horse.h"
+#include "overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3940.s")
+s32 Horse_GetJumpingFencePathIndex(PlayState* play) {
+ Actor* actor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F39B4.s")
+ for (actor = NULL;; actor = actor->next) {
+ actor = SubS_FindActor(play, actor, ACTORCAT_PROP, ACTOR_BG_UMAJUMP);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3A64.s")
+ if (actor == NULL) {
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B2C.s")
+ if (actor->params == BG_UMAJUMP_TYPE_2) {
+ return ((BgUmajump*)actor)->pathIndex;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B68.s")
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3C44.s")
+// unused
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4) {
+ Path* path = &play->setupPathList[pathIndex];
+ Vec3s* points;
+ s32 count = path->count;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3ED4.s")
+ dst->x = 0;
+ dst->y = 0;
+ dst->z = 0;
+ *arg4 = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F40A0.s")
+ if (count == 0) {
+ return false;
+ }
+ if (pointIndex >= count) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F415C.s")
+ points = Lib_SegmentedToVirtual(path->points);
+ points += pointIndex;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F41E4.s")
+ dst->x = points->x;
+ dst->y = points->y;
+ dst->z = points->z;
+ *arg4 = 0;
+
+ return true;
+}
+
+typedef struct HorseValidScene {
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ s16 sceneLayerMinusOne;
+} HorseValidScene; // size = 0x4
+
+HorseValidScene sHorseValidScenes[] = {
+ { SCENE_00KEIKOKU, 0 }, // Termina Field
+ { SCENE_24KEMONOMITI, 0 }, // Road to southern swap
+ { SCENE_F01, 0 }, // Romani ranch
+ { SCENE_KOEPONARACE, 0 }, // Gorman track
+ { SCENE_20SICHITAI, 0 }, // Southern swamp poisoned
+ { SCENE_20SICHITAI2, 0 }, // Souther swamp clear
+ { SCENE_30GYOSON, 0 }, // Great bay coast
+ { SCENE_31MISAKI, 0 }, // Zora cape
+ { SCENE_ROMANYMAE, 0 }, // Milk road
+ { SCENE_IKANAMAE, 0 }, // Road to Ikana
+ { SCENE_13HUBUKINOMITI, 0 }, // Path to Mountain Village
+};
+
+s32 Horse_IsValidSpawn(s16 sceneId) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidScenes); i++) {
+ if (sceneId == sHorseValidScenes[i].sceneId) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Horse_ResetHorseData(PlayState* play) {
+ gSaveContext.save.saveInfo.horseData.sceneId = SCENE_F01;
+ gSaveContext.save.saveInfo.horseData.pos.x = -1420;
+ gSaveContext.save.saveInfo.horseData.pos.y = 257;
+ gSaveContext.save.saveInfo.horseData.pos.z = -1285;
+ gSaveContext.save.saveInfo.horseData.yaw = 0x2AAA;
+}
+
+s32 gHorseIsMounted = false;
+s32 D_801BDAA0 = false;
+s32 gHorsePlayedEponasSong = false;
+
+HorseValidScene sHorseValidSceneLayers[] = {
+ { SCENE_00KEIKOKU, 5 - 1 }, // Termina Field - First Cycle
+ { SCENE_30GYOSON, 1 - 1 }, // Great Bay Coast - Post-Gyorg
+ { SCENE_31MISAKI, 1 - 1 }, // Zora Cape - Post-Gyorg
+ { SCENE_13HUBUKINOMITI, 1 - 1 }, // Path to Mountain Village - Post-Goht
+};
+
+s32 Horse_IsValidSceneLayer(PlayState* play, Player* player) {
+ s32 i;
+
+ if (gSaveContext.sceneLayer == 0) {
+ return true;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidSceneLayers); i++) {
+ if ((sHorseValidSceneLayers[i].sceneId == play->sceneId) &&
+ (gSaveContext.sceneLayer == sHorseValidSceneLayers[i].sceneLayerMinusOne + 1)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void Horse_SpawnOverworld(PlayState* play, Player* player) {
+ if (!Horse_IsValidSceneLayer(play, player)) {
+ return;
+ }
+
+ if (gHorseIsMounted && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ s32 pad;
+ Vec3f pos = player->actor.world.pos;
+ f32 yIntersect;
+ CollisionPoly* poly;
+ s32 pad2[3];
+
+ pos.y += 5.0f;
+ yIntersect = BgCheck_EntityRaycastFloor1(&play->colCtx, &poly, &pos);
+ if (yIntersect == BGCHECK_Y_MIN) {
+ yIntersect = player->actor.world.pos.y;
+ }
+
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, yIntersect,
+ player->actor.world.pos.z, player->actor.shape.rot.x, player->actor.shape.rot.y,
+ player->actor.shape.rot.z, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_11));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == gSaveContext.save.saveInfo.horseData.sceneId) && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ if (Horse_IsValidSpawn(gSaveContext.save.saveInfo.horseData.sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, gSaveContext.save.saveInfo.horseData.pos.x,
+ gSaveContext.save.saveInfo.horseData.pos.y, gSaveContext.save.saveInfo.horseData.pos.z, 0,
+ gSaveContext.save.saveInfo.horseData.yaw, 0, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else {
+ Horse_ResetHorseData(play);
+ }
+ } else if ((play->sceneId == SCENE_F01) && !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1420.0f, 257.0f, -1285.0f, 0, 0x2AAA, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && Horse_IsValidSpawn(play->sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, player->actor.world.pos.y,
+ player->actor.world.pos.z, 0, player->actor.shape.rot.y, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_2));
+ }
+}
+
+void Horse_SpawnMinigame(PlayState* play, Player* player) {
+ if ((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1262.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_13));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == SCENE_KOEPONARACE) &&
+ ((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2))) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1741.0f, -106.0f, -641.0f, 0, -0x4FA4, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if ((gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) && (Cutscene_GetSceneLayer(play) != 0) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1106.0f, 260.0f, -1185.0f, 0, 0x13, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_7));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ }
+}
+
+void Horse_Spawn(PlayState* play, Player* player) {
+ if (((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) ||
+ ((play->sceneId == SCENE_F01) && (((gSaveContext.sceneLayer == 1)) || (gSaveContext.sceneLayer == 5)) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) ||
+ ((play->sceneId == SCENE_KOEPONARACE) &&
+ (((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3)) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2)))) {
+ // Gorman Track and horse state is either STATE_START, STATE_2 or STATE_3
+ // or Romani Ranch, Player is Human and scene layer is either 1 or 5
+ Horse_SpawnMinigame(play, player);
+ } else {
+ Horse_SpawnOverworld(play, player);
+ }
+
+ D_801BDAA0 = false;
+}
+
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw) {
+ s16 yaw = Math_Vec3f_Yaw(&actor->world.pos, pos) - actor->world.rot.y;
+
+ if (yaw > turnYaw) {
+ actor->world.rot.y += turnYaw;
+ } else if (yaw < -turnYaw) {
+ actor->world.rot.y -= turnYaw;
+ } else {
+ actor->world.rot.y += yaw;
+ }
+
+ actor->shape.rot.y = actor->world.rot.y;
+}
+
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx) {
+ Actor* bgActor = actorCtx->actorLists[ACTORCAT_BG].first;
+
+ if (bgActor != NULL) {
+ while (true) {
+ if ((bgActor->update != NULL) && (bgActor->init == NULL)) {
+ if (Object_IsLoaded(&play->objectCtx, bgActor->objBankIndex)) {
+ if ((bgActor->id == ACTOR_EN_HORSE) && (((EnHorse*)bgActor)->action != ENHORSE_ACTION_INACTIVE)) {
+ return true;
+ }
+ }
+ }
+ bgActor = bgActor->next;
+ if (bgActor == NULL) {
+ break;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index 59fde2f2d..1d2046e57 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64shrink_window.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
@@ -40,13 +39,13 @@ void KaleidoScopeCall_Update(PlayState* play) {
if (ShrinkWindow_Letterbox_GetSize() == 0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
}
} else if (pauseCtx->state == PAUSE_STATE_GAMEOVER_0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
} else if ((pauseCtx->state == PAUSE_STATE_OPENING_1) || (pauseCtx->state == PAUSE_STATE_GAMEOVER_1) ||
(pauseCtx->state == PAUSE_STATE_OWLWARP_1)) {
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index dac0d8300..130fa88db 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -44,19 +44,19 @@ void func_800F4A10(PlayState* play) {
if (pauseCtx->state == PAUSE_STATE_OPENING_0) {
for (i = 0; i < REGION_MAX; i++) {
- if ((gSaveContext.save.regionsVisited >> i) & 1) {
+ if ((gSaveContext.save.saveInfo.regionsVisited >> i) & 1) {
pauseCtx->worldMapPoints[i] = true;
}
}
} else {
for (i = OWL_WARP_STONE_TOWER; i >= OWL_WARP_GREAT_BAY_COAST; i--) {
- if ((gSaveContext.save.playerData.owlActivationFlags >> i) & 1) {
+ if ((gSaveContext.save.saveInfo.playerData.owlActivationFlags >> i) & 1) {
pauseCtx->worldMapPoints[i] = true;
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = i;
}
}
- if ((gSaveContext.save.playerData.owlActivationFlags >> 4) & 1) {
+ if ((gSaveContext.save.saveInfo.playerData.owlActivationFlags >> 4) & 1) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 4;
}
}
@@ -92,7 +92,7 @@ void KaleidoSetup_Update(PlayState* play) {
if ((pauseCtx->state == PAUSE_STATE_OFF) && (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) &&
(play->gameOverCtx.state == GAMEOVER_INACTIVE)) {
if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
- if ((gSaveContext.save.cutscene < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) {
+ if ((gSaveContext.save.cutsceneIndex < 0xFFF0) && (gSaveContext.nextCutsceneIndex < 0xFFF0)) {
if (!Play_InCsMode(play) || ((msgCtx->msgMode != 0) && (msgCtx->currentTextId == 0xFF))) {
if ((play->unk_1887C < 2) && (gSaveContext.magicState != MAGIC_STATE_STEP_CAPACITY) &&
(gSaveContext.magicState != MAGIC_STATE_FILL)) {
@@ -145,7 +145,7 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
- pauseCtx->pageSwitchTimer = 0;
+ pauseCtx->pageSwitchInputTimer = 0;
pauseCtx->cursorItem[PAUSE_ITEM] = PAUSE_ITEM_NONE;
pauseCtx->cursorItem[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c
index d6d38f9d6..2191498a3 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -2,7 +2,7 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5090.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F50D4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Init.s")
diff --git a/src/code/z_lib.c b/src/code/z_lib.c
index 136918765..f3e67e5f3 100644
--- a/src/code/z_lib.c
+++ b/src/code/z_lib.c
@@ -348,9 +348,9 @@ void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) {
}
void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest) {
- dest->x = randPlusMinusPoint5Scaled(scale) + orig->x;
- dest->y = randPlusMinusPoint5Scaled(scale) + orig->y;
- dest->z = randPlusMinusPoint5Scaled(scale) + orig->z;
+ dest->x = Rand_CenteredFloat(scale) + orig->x;
+ dest->y = Rand_CenteredFloat(scale) + orig->y;
+ dest->z = Rand_CenteredFloat(scale) + orig->z;
}
void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) {
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index 06dd1a0c7..7226a6719 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -16,14 +16,14 @@ s16 sBeatingHeartsDDEnv[3];
s16 sHeartsDDPrim[2][3];
s16 sHeartsDDEnv[2][3];
-TexturePtr HeartTextures[] = {
+static TexturePtr sHeartTextures[] = {
gHeartFullTex, gHeartQuarterTex, gHeartQuarterTex, gHeartQuarterTex,
gHeartQuarterTex, gHeartQuarterTex, gHeartHalfTex, gHeartHalfTex,
gHeartHalfTex, gHeartHalfTex, gHeartHalfTex, gHeartThreeQuarterTex,
gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex,
};
-TexturePtr HeartDDTextures[] = {
+static TexturePtr sHeartDDTextures[] = {
gDefenseHeartFullTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex,
gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex,
gDefenseHeartHalfTex, gDefenseHeartHalfTex, gDefenseHeartHalfTex,
@@ -37,7 +37,7 @@ void LifeMeter_Init(PlayState* play) {
interfaceCtx->healthTimer = 320;
- interfaceCtx->health = gSaveContext.save.playerData.health;
+ interfaceCtx->health = gSaveContext.save.saveInfo.playerData.health;
interfaceCtx->lifeColorChange = 0;
interfaceCtx->lifeColorChangeDirection = 0;
@@ -170,7 +170,7 @@ void LifeMeter_UpdateColors(PlayState* play) {
s32 LifeMeter_SaveInterfaceHealth(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
- gSaveContext.save.playerData.health = interfaceCtx->health;
+ gSaveContext.save.saveInfo.playerData.health = interfaceCtx->health;
return 1;
}
@@ -181,8 +181,8 @@ s32 LifeMeter_IncreaseInterfaceHealth(PlayState* play) {
interfaceCtx->healthTimer = 320;
interfaceCtx->health += 0x10;
- if (play->interfaceCtx.health >= gSaveContext.save.playerData.health) {
- play->interfaceCtx.health = gSaveContext.save.playerData.health;
+ if (play->interfaceCtx.health >= gSaveContext.save.saveInfo.playerData.health) {
+ play->interfaceCtx.health = gSaveContext.save.saveInfo.playerData.health;
return true;
}
return false;
@@ -199,7 +199,7 @@ s32 LifeMeter_DecreaseInterfaceHealth(PlayState* play) {
interfaceCtx->health -= 0x10;
if (interfaceCtx->health <= 0) {
interfaceCtx->health = 0;
- play->damagePlayer(play, -(((void)0, gSaveContext.save.playerData.health) + 1));
+ play->damagePlayer(play, -(((void)0, gSaveContext.save.saveInfo.playerData.health) + 1));
return true;
}
}
@@ -220,18 +220,18 @@ void LifeMeter_Draw(PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx;
Vtx* beatingHeartVtx = interfaceCtx->beatingHeartVtx;
- s32 fractionHeartCount = gSaveContext.save.playerData.health % 0x10;
- s16 healthCapacity = gSaveContext.save.playerData.healthCapacity / 0x10;
- s16 fullHeartCount = gSaveContext.save.playerData.health / 0x10;
+ s32 fractionHeartCount = gSaveContext.save.saveInfo.playerData.health % 0x10;
+ s16 healthCapacity = gSaveContext.save.saveInfo.playerData.healthCapacity / 0x10;
+ s16 fullHeartCount = gSaveContext.save.saveInfo.playerData.health / 0x10;
s32 pad2;
f32 lifesize = interfaceCtx->lifeSizeChange * 0.1f;
u32 curCombineModeSet = 0;
TexturePtr temp = NULL;
- s32 ddCount = gSaveContext.save.inventory.defenseHearts - 1;
+ s32 ddCount = gSaveContext.save.saveInfo.inventory.defenseHearts - 1;
OPEN_DISPS(gfxCtx);
- if ((gSaveContext.save.playerData.health % 0x10) == 0) {
+ if ((gSaveContext.save.saveInfo.playerData.health % 0x10) == 0) {
fullHeartCount--;
}
@@ -283,7 +283,7 @@ void LifeMeter_Draw(PlayState* play) {
if (i < fullHeartCount) {
heartTex = gHeartFullTex;
} else if (i == fullHeartCount) {
- heartTex = HeartTextures[fractionHeartCount];
+ heartTex = sHeartTextures[fractionHeartCount];
} else {
heartTex = gHeartEmptyTex;
}
@@ -323,7 +323,7 @@ void LifeMeter_Draw(PlayState* play) {
if (i < fullHeartCount) {
heartTex = gDefenseHeartFullTex;
} else if (i == fullHeartCount) {
- heartTex = HeartDDTextures[fractionHeartCount];
+ heartTex = sHeartDDTextures[fractionHeartCount];
} else {
heartTex = gDefenseHeartEmptyTex;
}
@@ -340,13 +340,13 @@ void LifeMeter_Draw(PlayState* play) {
if ((ddCount < 0) || (i > ddCount)) {
if (curCombineModeSet != 1) {
curCombineModeSet = 1;
- func_8012C654(gfxCtx);
+ Gfx_SetupDL39_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
}
} else if (curCombineModeSet != 3) {
curCombineModeSet = 3;
- func_8012C654(gfxCtx);
+ Gfx_SetupDL39_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0,
ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
}
@@ -366,7 +366,7 @@ void LifeMeter_Draw(PlayState* play) {
if ((ddCount < 0) || (ddCount < i)) {
if (curCombineModeSet != 2) {
curCombineModeSet = 2;
- func_8012C8D4(gfxCtx);
+ Gfx_SetupDL42_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
@@ -374,7 +374,7 @@ void LifeMeter_Draw(PlayState* play) {
} else {
if (curCombineModeSet != 4) {
curCombineModeSet = 4;
- func_8012C8D4(gfxCtx);
+ Gfx_SetupDL42_Overlay(gfxCtx);
gDPSetCombineLERP(OVERLAY_DISP++, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
0, ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
@@ -422,17 +422,18 @@ void LifeMeter_UpdateSizeAndBeep(PlayState* play) {
u32 LifeMeter_IsCritical(void) {
s16 criticalThreshold;
- if (gSaveContext.save.playerData.healthCapacity <= 0x50) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity <= 0x50) {
criticalThreshold = 0x10;
- } else if (gSaveContext.save.playerData.healthCapacity <= 0xA0) {
+ } else if (gSaveContext.save.saveInfo.playerData.healthCapacity <= 0xA0) {
criticalThreshold = 0x18;
- } else if (gSaveContext.save.playerData.healthCapacity <= 0xF0) {
+ } else if (gSaveContext.save.saveInfo.playerData.healthCapacity <= 0xF0) {
criticalThreshold = 0x20;
} else {
criticalThreshold = 0x2C;
}
- if ((criticalThreshold >= gSaveContext.save.playerData.health) && (gSaveContext.save.playerData.health > 0)) {
+ if ((criticalThreshold >= gSaveContext.save.saveInfo.playerData.health) &&
+ (gSaveContext.save.saveInfo.playerData.health > 0)) {
return true;
}
return false;
diff --git a/src/code/z_lights.c b/src/code/z_lights.c
index 6a31c7e94..e82c3a9b2 100644
--- a/src/code/z_lights.c
+++ b/src/code/z_lights.c
@@ -190,12 +190,12 @@ void Lights_BindDirectional(Lights* lights, LightParams* params, void* unused) {
* available in the Lights group. This is at most 7 slots for a new group, but could be less.
*/
void Lights_BindAll(Lights* lights, LightNode* listHead, Vec3f* refPos, PlayState* play) {
- static LightsPosBindFunc posBindFuncs[] = {
+ static LightsPosBindFunc sPosBindFuncs[] = {
Lights_BindPoint,
(LightsPosBindFunc)Lights_BindDirectional,
Lights_BindPoint,
};
- static LightsBindFunc dirBindFuncs[] = {
+ static LightsBindFunc sDirBindFuncs[] = {
Lights_BindPointWithReference,
(LightsBindFunc)Lights_BindDirectional,
Lights_BindPointWithReference,
@@ -204,12 +204,12 @@ void Lights_BindAll(Lights* lights, LightNode* listHead, Vec3f* refPos, PlayStat
if (listHead != NULL) {
if ((refPos == NULL) && (lights->enablePosLights == 1)) {
do {
- posBindFuncs[listHead->info->type](lights, &listHead->info->params, play);
+ sPosBindFuncs[listHead->info->type](lights, &listHead->info->params, play);
listHead = listHead->next;
} while (listHead != NULL);
} else {
do {
- dirBindFuncs[listHead->info->type](lights, &listHead->info->params, refPos);
+ sDirBindFuncs[listHead->info->type](lights, &listHead->info->params, refPos);
listHead = listHead->next;
} while (listHead != NULL);
}
@@ -338,7 +338,7 @@ Lights* Lights_NewAndDraw(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8
lights->l.a.l.col[0] = lights->l.a.l.colc[0] = ambientR;
lights->l.a.l.col[1] = lights->l.a.l.colc[1] = ambientG;
lights->l.a.l.col[2] = lights->l.a.l.colc[2] = ambientB;
- lights->enablePosLights = 0;
+ lights->enablePosLights = false;
lights->numLights = numLights;
for (i = 0; i < numLights; i++) {
@@ -360,13 +360,10 @@ Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambient
lights = GRAPH_ALLOC(gfxCtx, sizeof(Lights));
- lights->l.a.l.col[0] = ambientR;
- lights->l.a.l.colc[0] = ambientR;
- lights->l.a.l.col[1] = ambientG;
- lights->l.a.l.colc[1] = ambientG;
- lights->l.a.l.col[2] = ambientB;
- lights->l.a.l.colc[2] = ambientB;
- lights->enablePosLights = 0;
+ lights->l.a.l.col[0] = lights->l.a.l.colc[0] = ambientR;
+ lights->l.a.l.col[1] = lights->l.a.l.colc[1] = ambientG;
+ lights->l.a.l.col[2] = lights->l.a.l.colc[2] = ambientB;
+ lights->enablePosLights = false;
lights->numLights = 0;
return lights;
@@ -394,7 +391,7 @@ void Lights_GlowCheck(PlayState* play) {
s32 screenPosX = PROJECTED_TO_SCREEN_X(projectedPos, invW);
s32 screenPosY = PROJECTED_TO_SCREEN_Y(projectedPos, invW);
s32 wZ = (s32)((projectedPos.z * invW) * 16352.0f) + 16352;
- s32 zBuf = func_80178A94(screenPosX, screenPosY);
+ s32 zBuf = SysCfb_GetZBufferInt(screenPosX, screenPosY);
if (wZ < zBuf) {
params->drawGlow = 1;
@@ -414,7 +411,7 @@ void Lights_DrawGlow(PlayState* play) {
if (light != NULL) {
OPEN_DISPS(play->state.gfxCtx);
- dl = func_8012C7FC(POLY_XLU_DISP);
+ dl = Gfx_SetupDL65_NoCD(POLY_XLU_DISP);
gDPSetDither(dl++, G_CD_NOISE);
diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c
index 381387c5e..912926cbb 100644
--- a/src/code/z_map_exp.c
+++ b/src/code/z_map_exp.c
@@ -156,7 +156,8 @@ void Map_InitRoomData(PlayState* play, s16 room) {
if (room >= 0) {
if (Map_IsInDungeonOrBossArea(play)) {
- gSaveContext.save.permanentSceneFlags[Play_GetOriginalSceneId(play->sceneId)].rooms |= gBitFlags[room];
+ gSaveContext.save.saveInfo.permanentSceneFlags[Play_GetOriginalSceneId(play->sceneId)].rooms |=
+ gBitFlags[room];
interfaceCtx->mapRoomNum = room;
interfaceCtx->dungeonOrBossAreaMapIndex = mapIndex;
}
@@ -243,7 +244,7 @@ void Map_Update(PlayState* play) {
if (Map_IsInDungeonArea(play)) {
floor = func_80109124(player->actor.world.pos.y);
if (floor != -1) {
- gSaveContext.save.permanentSceneFlags[Play_GetOriginalSceneId(play->sceneId)].unk_14 |=
+ gSaveContext.save.saveInfo.permanentSceneFlags[Play_GetOriginalSceneId(play->sceneId)].unk_14 |=
gBitFlags[FLOOR_INDEX_MAX - floor];
R_REVERSE_FLOOR_INDEX = FLOOR_INDEX_MAX - floor;
if (interfaceCtx->mapRoomNum != sLastRoomNum) {
diff --git a/src/code/z_message.c b/src/code/z_message.c
index 01e4a366d..38f44d9ec 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -5,6 +5,27 @@
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#if 0
+#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage,
+
+u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, _metMessage, metFlag) metFlag,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, _completedMessage, completedFlag) completedFlag,
+
+u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
s16 D_801D02D8[15] = {
ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect
@@ -20,8 +41,6 @@ s32 D_801D02F8[15] = { 0,1,2,3,4,0,1,0,0,0,0,0,1,1,0 };
#endif
-extern u16 D_801C6AB8[];
-extern u16 D_801C6B28[];
extern s16 D_801D02D8[];
extern s32 D_801D02F8[];
extern s16 D_801F6B0C;
@@ -106,7 +125,7 @@ void Message_CloseTextbox(PlayState* play) {
msgCtx->stateTimer = 2;
msgCtx->msgMode = 0x43;
msgCtx->unk12020 = 0;
- play_sound(NA_SE_PL_WALK_GROUND - SFX_FLAG);
+ play_sound(NA_SE_NONE);
}
}
@@ -365,19 +384,19 @@ void func_80151A68(PlayState* play, u16 textId) {
}
}
-void func_80151BB4(PlayState* play, u8 arg1) {
+void Message_BombersNotebookQueueEvent(PlayState* play, u8 event) {
MessageContext* msgCtx = &play->msgCtx;
- u8 temp = arg1;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) {
- msgCtx->unk120B2[msgCtx->unk120B1] = temp;
- msgCtx->unk120B1++;
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
+ msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
+ msgCtx->bombersNotebookEventQueueCount++;
}
- } else if (arg1 >= 20) {
- if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) {
- msgCtx->unk120B2[msgCtx->unk120B1] = temp;
- msgCtx->unk120B1++;
+ } else if (event >= BOMBERS_NOTEBOOK_PERSON_MAX) {
+ // Non MET events are processed even if the player does not have the notebook yet
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
+ msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
+ msgCtx->bombersNotebookEventQueueCount++;
}
}
}
@@ -386,16 +405,22 @@ u32 func_80151C9C(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
while (true) {
- if (msgCtx->unk120B1 == 0) {
+ if (msgCtx->bombersNotebookEventQueueCount == 0) {
return false;
}
- msgCtx->unk120B1--;
+ msgCtx->bombersNotebookEventQueueCount--;
- if (!CHECK_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]])) {
- SET_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]]);
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]])) {
+ SET_WEEKEVENTREG(gBombersNotebookWeekEventFlags
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
- if ((D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]] != 0) && CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- Message_ContinueTextbox(play, D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]]);
+ if ((sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]] != 0) &&
+ CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ Message_ContinueTextbox(
+ play, sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
play_sound(NA_SE_SY_SCHEDULE_WRITE);
return true;
}
@@ -476,7 +501,7 @@ u8 Message_GetState(MessageContext* msgCtx) {
if (msgCtx->msgMode == 0x40) {
return TEXT_STATE_13;
}
- if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->unk120B1 == 0)) {
+ if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->bombersNotebookEventQueueCount == 0)) {
return TEXT_STATE_CLOSING;
}
diff --git a/src/code/z_olib.c b/src/code/z_olib.c
index 2b6b8d139..848a48a72 100644
--- a/src/code/z_olib.c
+++ b/src/code/z_olib.c
@@ -100,16 +100,16 @@ Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph) {
}
/**
- * Takes the geographic point `sph` and converts it into a x,y,z position
+ * Takes the geographic point `geo` and converts it into a x,y,z position
*/
-Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph) {
- VecSph geo;
+Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo) {
+ VecSph sph;
- geo.r = sph->r;
- geo.pitch = 0x4000 - sph->pitch;
- geo.yaw = sph->yaw;
+ sph.r = geo->r;
+ sph.pitch = 0x4000 - geo->pitch;
+ sph.yaw = geo->yaw;
- return OLib_VecSphToVec3f(dest, &geo);
+ return OLib_VecSphToVec3f(dest, &sph);
}
/**
@@ -117,20 +117,20 @@ Vec3f* OLib_VecSphGeoToVec3f(Vec3f* dest, VecSph* sph) {
*/
VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) {
VecSph sph;
- f32 distSquared = SQ(vec->x) + SQ(vec->z);
- f32 dist = sqrtf(distSquared);
+ f32 distXZSq = SQ(vec->x) + SQ(vec->z);
+ f32 distXZ = sqrtf(distXZSq);
- if ((dist == 0.0f) && (vec->y == 0.0f)) {
+ if ((distXZ == 0.0f) && (vec->y == 0.0f)) {
sph.pitch = 0;
} else {
- sph.pitch = CAM_DEG_TO_BINANG(RADF_TO_DEGF(func_80086B30(dist, vec->y)));
+ sph.pitch = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(distXZ, vec->y)));
}
- sph.r = sqrtf(SQ(vec->y) + distSquared);
+ sph.r = sqrtf(SQ(vec->y) + distXZSq);
if ((vec->x == 0.0f) && (vec->z == 0.0f)) {
sph.yaw = 0;
} else {
- sph.yaw = CAM_DEG_TO_BINANG(RADF_TO_DEGF(func_80086B30(vec->x, vec->z)));
+ sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(vec->x, vec->z)));
}
*dest = sph;
@@ -141,7 +141,7 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) {
/**
* Takes the point `vec`, and converts it to a geographic coordinate
*/
-VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec) {
+VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec) {
VecSph sph;
OLib_Vec3fToVecSph(&sph, vec);
@@ -156,42 +156,42 @@ VecSph* OLib_Vec3fToVecSphGeo(VecSph* dest, Vec3f* vec) {
* Takes the differences of positions `a` and `b`, and converts them to spherical coordinates
*/
VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b) {
- Vec3f sph;
+ Vec3f diff;
- sph.x = b->x - a->x;
- sph.y = b->y - a->y;
- sph.z = b->z - a->z;
+ diff.x = b->x - a->x;
+ diff.y = b->y - a->y;
+ diff.z = b->z - a->z;
- return OLib_Vec3fToVecSph(dest, &sph);
+ return OLib_Vec3fToVecSph(dest, &diff);
}
/**
* Takes the difference of positions `a` and `b`, and converts them to geographic coordinates
*/
-VecSph* OLib_Vec3fDiffToVecSphGeo(VecSph* dest, Vec3f* a, Vec3f* b) {
- Vec3f sph;
+VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b) {
+ Vec3f diff;
- sph.x = b->x - a->x;
- sph.y = b->y - a->y;
- sph.z = b->z - a->z;
+ diff.x = b->x - a->x;
+ diff.y = b->y - a->y;
+ diff.z = b->z - a->z;
- return OLib_Vec3fToVecSphGeo(dest, &sph);
+ return OLib_Vec3fToVecGeo(dest, &diff);
}
/**
- * Takes the sum of positions `a` (x,y,z coordinates) and `sph` (geographic coordinates), result is in x,y,z position
+ * Takes the sum of positions `a` (x,y,z coordinates) and `geo` (geographic coordinates), result is in x,y,z position
* Identical to Quake_AddVec from OoT
*/
-Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph) {
- Vec3f vec;
+Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) {
+ Vec3f sum;
Vec3f b;
- OLib_VecSphGeoToVec3f(&b, sph);
- vec.x = a->x + b.x;
- vec.y = a->y + b.y;
- vec.z = a->z + b.z;
+ OLib_VecGeoToVec3f(&b, geo);
+ sum.x = a->x + b.x;
+ sum.y = a->y + b.y;
+ sum.z = a->z + b.z;
- *dest = vec;
+ *dest = sum;
return dest;
}
@@ -202,8 +202,8 @@ Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph) {
Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b) {
Vec3f anglesRad;
- anglesRad.x = func_80086B30(b->z - a->z, b->y - a->y);
- anglesRad.y = func_80086B30(b->x - a->x, b->z - a->z);
+ anglesRad.x = Math_FAtan2F(b->z - a->z, b->y - a->y);
+ anglesRad.y = Math_FAtan2F(b->x - a->x, b->z - a->z);
anglesRad.z = 0;
*dest = anglesRad;
@@ -220,8 +220,8 @@ Vec3f* OLib_Vec3fDiffDegF(Vec3f* dest, Vec3f* a, Vec3f* b) {
OLib_Vec3fDiffRad(&anglesRad, a, b);
- anglesDegrees.x = RADF_TO_DEGF(anglesRad.x);
- anglesDegrees.y = RADF_TO_DEGF(anglesRad.y);
+ anglesDegrees.x = RAD_TO_DEG(anglesRad.x);
+ anglesDegrees.y = RAD_TO_DEG(anglesRad.y);
anglesDegrees.z = 0.0f;
*dest = anglesDegrees;
@@ -238,8 +238,8 @@ Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b) {
OLib_Vec3fDiffRad(&anglesRad, a, b);
- anglesBinAng.x = CAM_DEG_TO_BINANG(RADF_TO_DEGF(anglesRad.x));
- anglesBinAng.y = CAM_DEG_TO_BINANG(RADF_TO_DEGF(anglesRad.y));
+ anglesBinAng.x = CAM_DEG_TO_BINANG(RAD_TO_DEG(anglesRad.x));
+ anglesBinAng.y = CAM_DEG_TO_BINANG(RAD_TO_DEG(anglesRad.y));
anglesBinAng.z = 0.0f;
*dest = anglesBinAng;
@@ -248,46 +248,50 @@ Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b) {
}
/**
- * Gets a x,y,z position diff depending on the dbCamera mode
+ * Gets a x,y,z position diff depending on the mode
*/
-void OLib_DbCameraVec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
- VecSph sph;
+void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
+ VecGeo geo;
switch (mode) {
- case 1:
- OLib_Vec3fDiffToVecSphGeo(&sph, &a->pos, b);
- sph.yaw -= a->rot.y;
- OLib_VecSphGeoToVec3f(dest, &sph);
+ case OLIB_DIFF_OFFSET:
+ OLib_Vec3fDiffToVecGeo(&geo, &a->pos, b);
+ geo.yaw -= a->rot.y;
+ OLib_VecGeoToVec3f(dest, &geo);
break;
- case 2:
+
+ case OLIB_DIFF:
dest->x = b->x - a->pos.x;
dest->y = b->y - a->pos.y;
dest->z = b->z - a->pos.z;
break;
- default:
+
+ default: // OLIB_DIFF_COPY
*dest = *b;
break;
}
}
/**
- * Gets a x,y,z position sum depending on the dbCamera mode
+ * Gets a x,y,z position sum depending on the mode
*/
-void OLib_DbCameraVec3fSum(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
- VecSph sph;
+void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) {
+ VecGeo geo;
switch (mode) {
- case 1:
- OLib_Vec3fToVecSphGeo(&sph, b);
- sph.yaw += a->rot.y;
- OLib_VecSphAddToVec3f(dest, &a->pos, &sph);
+ case OLIB_ADD_OFFSET:
+ OLib_Vec3fToVecGeo(&geo, b);
+ geo.yaw += a->rot.y;
+ OLib_AddVecGeoToVec3f(dest, &a->pos, &geo);
break;
- case 2:
+
+ case OLIB_ADD:
dest->x = a->pos.x + b->x;
dest->y = a->pos.y + b->y;
dest->z = a->pos.z + b->z;
break;
- default:
+
+ default: // OLIB_ADD_COPY
*dest = *b;
break;
}
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index be5cc01bc..e63c9d8e5 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -23,13 +23,13 @@ typedef enum {
#define DO_ACTION_TEX_SIZE ((DO_ACTION_TEX_WIDTH * DO_ACTION_TEX_HEIGHT) / 2) // (sizeof(gCheckDoActionENGTex))
typedef struct {
- /* 0x00 */ u8 scene;
- /* 0x01 */ u8 flags1;
- /* 0x02 */ u8 flags2;
- /* 0x03 */ u8 flags3;
-} RestrictionFlags;
+ /* 0x0 */ u8 scene;
+ /* 0x1 */ u8 flags1;
+ /* 0x2 */ u8 flags2;
+ /* 0x3 */ u8 flags3;
+} RestrictionFlags; // size = 0x4
-Input sPostmanTimerInput[4];
+Input sPostmanTimerInput[MAXCONTROLLERS];
#define RESTRICTIONS_TABLE_END 0xFF
@@ -73,125 +73,21 @@ Input sPostmanTimerInput[4];
#define RESTRICTIONS_MOON RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0)
#define RESTRICTIONS_NO_DOUBLE_TIME RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0)
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, restrictionFlags, _persistentCycleFlags) \
+ { enumValue, restrictionFlags },
+
+#define DEFINE_SCENE_UNSET(enumValue) { enumValue, RESTRICTIONS_NONE },
+
RestrictionFlags sRestrictionFlags[] = {
- { SCENE_20SICHITAI2, RESTRICTIONS_NONE },
- { SCENE_UNSET_1, RESTRICTIONS_NONE },
- { SCENE_UNSET_2, RESTRICTIONS_NONE },
- { SCENE_UNSET_3, RESTRICTIONS_NONE },
- { SCENE_UNSET_4, RESTRICTIONS_NONE },
- { SCENE_UNSET_5, RESTRICTIONS_NONE },
- { SCENE_UNSET_6, RESTRICTIONS_NONE },
- { SCENE_KAKUSIANA, RESTRICTIONS_NONE },
- { SCENE_SPOT00, RESTRICTIONS_NONE },
- { SCENE_UNSET_9, RESTRICTIONS_NONE },
- { SCENE_WITCH_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_LAST_BS, RESTRICTIONS_MOON },
- { SCENE_HAKASHITA, RESTRICTIONS_NONE },
- { SCENE_AYASHIISHOP, RESTRICTIONS_INDOORS },
- { SCENE_UNSET_E, RESTRICTIONS_NONE },
- { SCENE_UNSET_F, RESTRICTIONS_NONE },
- { SCENE_OMOYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0) },
- { SCENE_BOWLING, RESTRICTIONS_INDOORS },
- { SCENE_SONCHONOIE, RESTRICTIONS_INDOORS },
- { SCENE_IKANA, RESTRICTIONS_NONE },
- { SCENE_KAIZOKU, RESTRICTIONS_NONE },
- { SCENE_MILK_BAR, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_N, RESTRICTIONS_NONE },
- { SCENE_TAKARAYA, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_R, RESTRICTIONS_NONE },
- { SCENE_OKUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_OPENINGDAN, RESTRICTIONS_NONE },
- { SCENE_MITURIN, RESTRICTIONS_NONE },
- { SCENE_13HUBUKINOMITI, RESTRICTIONS_NONE },
- { SCENE_CASTLE, RESTRICTIONS_NONE },
- { SCENE_DEKUTES, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1) },
- { SCENE_MITURIN_BS, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MIZU, RESTRICTIONS_INDOORS },
- { SCENE_HAKUGIN, RESTRICTIONS_NONE },
- { SCENE_ROMANYMAE, RESTRICTIONS_NONE },
- { SCENE_PIRATE, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MORI, RESTRICTIONS_INDOORS },
- { SCENE_SINKAI, RESTRICTIONS_NONE },
- { SCENE_YOUSEI_IZUMI, RESTRICTIONS_NONE },
- { SCENE_KINSTA1, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_KINDAN2, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_TENMON_DAI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0) },
- { SCENE_LAST_DEKU, RESTRICTIONS_MOON },
- { SCENE_22DEKUCITY, RESTRICTIONS_NONE },
- { SCENE_KAJIYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_00KEIKOKU, RESTRICTIONS_NONE },
- { SCENE_POSTHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_LABO, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_DANPEI2TEST, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_UNSET_31, RESTRICTIONS_NONE },
- { SCENE_16GORON_HOUSE, RESTRICTIONS_NONE },
- { SCENE_33ZORACITY, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0) },
- { SCENE_8ITEMSHOP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_F01, RESTRICTIONS_NONE },
- { SCENE_INISIE_BS, RESTRICTIONS_NONE },
- { SCENE_30GYOSON, RESTRICTIONS_NONE },
- { SCENE_31MISAKI, RESTRICTIONS_NONE },
- { SCENE_TAKARAKUJI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_UNSET_3A, RESTRICTIONS_NONE },
- { SCENE_TORIDE, RESTRICTIONS_NONE },
- { SCENE_FISHERMAN, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_GORONSHOP, RESTRICTIONS_INDOORS },
- { SCENE_DEKU_KING, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_LAST_GORON, RESTRICTIONS_MOON },
- { SCENE_24KEMONOMITI, RESTRICTIONS_NONE },
- { SCENE_F01_B, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_F01C, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_BOTI, RESTRICTIONS_NONE },
- { SCENE_HAKUGIN_BS, RESTRICTIONS_NONE },
- { SCENE_20SICHITAI, RESTRICTIONS_NONE },
- { SCENE_21MITURINMAE, RESTRICTIONS_NONE },
- { SCENE_LAST_ZORA, RESTRICTIONS_MOON },
- { SCENE_11GORONNOSATO2, RESTRICTIONS_NONE },
- { SCENE_SEA, RESTRICTIONS_NONE },
- { SCENE_35TAKI, RESTRICTIONS_NONE },
- { SCENE_REDEAD, RESTRICTIONS_NONE },
- { SCENE_BANDROOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_11GORONNOSATO, RESTRICTIONS_NONE },
- { SCENE_GORON_HAKA, RESTRICTIONS_NONE },
- { SCENE_SECOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0) },
- { SCENE_10YUKIYAMANOMURA, RESTRICTIONS_NONE },
- { SCENE_TOUGITES, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_DANPEI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_IKANAMAE, RESTRICTIONS_NONE },
- { SCENE_DOUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_MUSICHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_IKNINSIDE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_MAP_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_F40, RESTRICTIONS_NONE },
- { SCENE_F41, RESTRICTIONS_NONE },
- { SCENE_10YUKIYAMANOMURA2, RESTRICTIONS_NONE },
- { SCENE_14YUKIDAMANOMITI, RESTRICTIONS_NONE },
- { SCENE_12HAKUGINMAE, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN2, RESTRICTIONS_NONE },
- { SCENE_SEA_BS, RESTRICTIONS_NONE },
- { SCENE_RANDOM, RESTRICTIONS_NONE },
- { SCENE_YADOYA, RESTRICTIONS_INDOORS },
- { SCENE_KONPEKI_ENT, RESTRICTIONS_NONE },
- { SCENE_INSIDETOWER, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_26SARUNOMORI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_LOST_WOODS, RESTRICTIONS_NONE },
- { SCENE_LAST_LINK, RESTRICTIONS_MOON },
- { SCENE_SOUGEN, RESTRICTIONS_MOON },
- { SCENE_BOMYA, RESTRICTIONS_INDOORS },
- { SCENE_KYOJINNOMA, RESTRICTIONS_NONE },
- { SCENE_KOEPONARACE, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_GORONRACE, RESTRICTIONS_NONE },
- { SCENE_TOWN, RESTRICTIONS_NONE },
- { SCENE_ICHIBA, RESTRICTIONS_NONE },
- { SCENE_BACKTOWN, RESTRICTIONS_NONE },
- { SCENE_CLOCKTOWER, RESTRICTIONS_NONE },
- { SCENE_ALLEY, RESTRICTIONS_NONE },
+#include "tables/scene_table.h"
// { RESTRICTIONS_TABLE_END, RESTRICTIONS_NONE }, // See note below
};
//! @note: in `Interface_SetSceneRestrictions`, `RESTRICTIONS_TABLE_END` act as a terminating value to
// stop looping through the array. If a scene is missing, then this will cause issues.
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
s16 sPictoState = PICTO_BOX_STATE_OFF;
s16 sPictoPhotoBeingTaken = false;
@@ -251,7 +147,7 @@ s16 D_801BF97C = 255;
f32 D_801BF980 = 1.0f;
s32 D_801BF984 = 0;
-Gfx sScreenFillSetupDL[] = {
+static Gfx sScreenFillSetupDL[] = {
gsDPPipeSync(),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN |
G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
@@ -887,10 +783,10 @@ void Interface_SetVertices(PlayState* play) {
s32 sPostmanTimerInputBtnAPressed = false;
-void Interface_PostmanTimerCallback(s32 arg0) {
+void Interface_PostmanTimerCallback(void* arg) {
s32 btnAPressed;
- func_80175E68(&sPostmanTimerInput[0], 0);
+ PadMgr_GetInputNoLock(sPostmanTimerInput, false);
btnAPressed = CHECK_BTN_ALL(sPostmanTimerInput[0].cur.button, BTN_A);
if ((btnAPressed != sPostmanTimerInputBtnAPressed) && btnAPressed) {
gSaveContext.postmanTimerStopOsTime = osGetTime();
@@ -1006,12 +902,12 @@ void Interface_NewDay(PlayState* play, s32 day) {
(u32)SEGMENT_ROM_START(week_static) + i * 0x510, 0x510);
// i is used to store sceneId
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.permanentSceneFlags); i++) {
- gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
- gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
- gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
- gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
- gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.permanentSceneFlags); i++) {
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
}
}
@@ -1880,7 +1776,7 @@ void Interface_UpdateButtonsPart2(PlayState* play) {
} else if (CHECK_EVENTINF(EVENTINF_34)) {
// Deku playground minigame
if (player->stateFlags3 & PLAYER_STATE3_1000000) {
- if (gSaveContext.save.inventory.items[SLOT_NUT] == ITEM_NUT) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_NUT] == ITEM_NUT) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NUT;
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
} else {
@@ -1908,7 +1804,7 @@ void Interface_UpdateButtonsPart2(PlayState* play) {
}
} else if (player->stateFlags3 & PLAYER_STATE3_1000000) {
// Nuts on B (from flying as Deku Link)
- if (gSaveContext.save.inventory.items[SLOT_NUT] == ITEM_NUT) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_NUT] == ITEM_NUT) {
if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NUT) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NUT;
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
@@ -1925,7 +1821,7 @@ void Interface_UpdateButtonsPart2(PlayState* play) {
gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
}
- } else if (!gSaveContext.save.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) &&
+ } else if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) &&
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NUT)) {
// Nuts on B (as Deku Link)
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_FD;
@@ -1990,7 +1886,7 @@ void Interface_UpdateButtonsPart2(PlayState* play) {
}
if ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
- if (ActorCutscene_GetCurrentIndex() == -1) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
}
}
@@ -2267,7 +2163,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
s32 pad;
s32 restoreHudVisibility = false;
- if (gSaveContext.save.cutscene < 0xFFF0) {
+ if (gSaveContext.save.cutsceneIndex < 0xFFF0) {
gSaveContext.hudVisibilityForceButtonAlphasByStatus = false;
if ((player->stateFlags1 & PLAYER_STATE1_800000) || CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) ||
(!(CHECK_EVENTINF(EVENTINF_41)) && (play->unk_1887C >= 2))) {
@@ -2324,7 +2220,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
if (play->unk_1887C >= 2) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
- } else if (gSaveContext.save.inventory.items[SLOT_BOW] == ITEM_NONE) {
+ } else if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_NONE) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE;
} else {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
@@ -2382,7 +2278,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
if (play->unk_1887C >= 2) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
- } else if (gSaveContext.save.inventory.items[SLOT_BOW] == ITEM_NONE) {
+ } else if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_NONE) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE;
} else {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
@@ -2421,7 +2317,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
// Related to pictograph
if (sPictoState == PICTO_BOX_STATE_LENS) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -2434,7 +2330,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
sPictoState = PICTO_BOX_STATE_OFF;
} else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) || (func_801A5100() == 1)) {
if (!(CHECK_EVENTINF(EVENTINF_41)) ||
- ((CHECK_EVENTINF(EVENTINF_41)) && (ActorCutscene_GetCurrentIndex() == -1))) {
+ ((CHECK_EVENTINF(EVENTINF_41)) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) {
play_sound(NA_SE_SY_CAMERA_SHUTTER);
SREG(89) = 1;
play->haltAllActors = true;
@@ -2460,7 +2356,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
sPictoState = PICTO_BOX_STATE_OFF;
if (sPictoPhotoBeingTaken) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
Snap_RecordPictographedActors(play);
@@ -2493,7 +2389,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
sPictoState = PICTO_BOX_STATE_LENS;
} else {
Play_DecompressI5ToI8((u8*)((void)0, gSaveContext.pictoPhotoI5),
- (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
play->haltAllActors = true;
sPictoState = PICTO_BOX_STATE_SETUP_PHOTO;
@@ -2627,14 +2523,14 @@ u8 Item_Give(PlayState* play, u8 item) {
INCREMENT_QUEST_HEART_PIECE_COUNT;
if (EQ_MAX_QUEST_HEART_PIECE_COUNT) {
RESET_HEART_PIECE_COUNT;
- gSaveContext.save.playerData.healthCapacity += 0x10;
- gSaveContext.save.playerData.health += 0x10;
+ gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10;
+ gSaveContext.save.saveInfo.playerData.health += 0x10;
}
return ITEM_NONE;
} else if (item == ITEM_HEART_CONTAINER) {
- gSaveContext.save.playerData.healthCapacity += 0x10;
- gSaveContext.save.playerData.health += 0x10;
+ gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10;
+ gSaveContext.save.saveInfo.playerData.health += 0x10;
return ITEM_NONE;
} else if ((item >= ITEM_SONG_SONATA) && (item <= ITEM_SONG_LULLABY_INTRO)) {
@@ -2646,7 +2542,7 @@ u8 Item_Give(PlayState* play, u8 item) {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = item;
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
if (item == ITEM_SWORD_RAZOR) {
- gSaveContext.save.playerData.swordHealth = 100;
+ gSaveContext.save.saveInfo.playerData.swordHealth = 100;
}
return ITEM_NONE;
@@ -2824,7 +2720,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE;
} else if ((item >= ITEM_BOMBS_5) && (item <= ITEM_BOMBS_30)) {
- if (gSaveContext.save.inventory.items[SLOT_BOMB] != ITEM_BOMB) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOMB] != ITEM_BOMB) {
INV_CONTENT(ITEM_BOMB) = ITEM_BOMB;
AMMO(ITEM_BOMB) += sAmmoRefillCounts[item - ITEM_BOMBS_5];
return ITEM_NONE;
@@ -2847,7 +2743,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE;
} else if ((item >= ITEM_BOMBCHUS_20) && (item <= ITEM_BOMBCHUS_5)) {
- if (gSaveContext.save.inventory.items[SLOT_BOMBCHU] != ITEM_BOMBCHU) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOMBCHU] != ITEM_BOMBCHU) {
INV_CONTENT(ITEM_BOMBCHU) = ITEM_BOMBCHU;
AMMO(ITEM_BOMBCHU) += sBombchuRefillCounts[item - ITEM_BOMBCHUS_20];
@@ -2917,8 +2813,8 @@ u8 Item_Give(PlayState* play, u8 item) {
slot = SLOT(item);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = ITEM_POTION_RED;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = ITEM_POTION_RED;
return ITEM_NONE;
}
}
@@ -2929,8 +2825,8 @@ u8 Item_Give(PlayState* play, u8 item) {
slot = SLOT(item);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = item;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = item;
return ITEM_NONE;
}
}
@@ -2940,8 +2836,8 @@ u8 Item_Give(PlayState* play, u8 item) {
slot = SLOT(item);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = item;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = item;
return ITEM_NONE;
}
}
@@ -2971,7 +2867,7 @@ u8 Item_Give(PlayState* play, u8 item) {
slot = SLOT(item);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_BOTTLE) {
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_BOTTLE) {
if (item == ITEM_HOT_SPRING_WATER) {
Interface_StartBottleTimer(60, i);
}
@@ -2990,14 +2886,14 @@ u8 Item_Give(PlayState* play, u8 item) {
gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
}
- gSaveContext.save.inventory.items[slot + i] = item;
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = item;
return ITEM_NONE;
}
}
} else {
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = item;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = item;
return ITEM_NONE;
}
}
@@ -3018,7 +2914,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE;
}
- temp = gSaveContext.save.inventory.items[slot];
+ temp = gSaveContext.save.saveInfo.inventory.items[slot];
INV_CONTENT(item) = item;
return temp;
}
@@ -3159,13 +3055,13 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
bottleSlot = SLOT(item);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[bottleSlot + i] == ITEM_BOTTLE) {
+ if (gSaveContext.save.saveInfo.inventory.items[bottleSlot + i] == ITEM_BOTTLE) {
return ITEM_NONE;
}
}
} else {
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[bottleSlot + i] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[bottleSlot + i] == ITEM_NONE) {
return ITEM_NONE;
}
}
@@ -3174,7 +3070,7 @@ u8 Item_CheckObtainabilityImpl(u8 item) {
return ITEM_NONE;
}
- return gSaveContext.save.inventory.items[slot];
+ return gSaveContext.save.saveInfo.inventory.items[slot];
}
u8 Item_CheckObtainability(u8 item) {
@@ -3184,7 +3080,7 @@ u8 Item_CheckObtainability(u8 item) {
void Inventory_DeleteItem(s16 item, s16 slot) {
s16 btn;
- gSaveContext.save.inventory.items[slot] = ITEM_NONE;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_NONE;
for (btn = EQUIP_SLOT_C_LEFT; btn <= EQUIP_SLOT_C_RIGHT; btn++) {
if (GET_CUR_FORM_BTN_ITEM(btn) == item) {
@@ -3209,8 +3105,8 @@ s32 Inventory_ReplaceItem(PlayState* play, u8 oldItem, u8 newItem) {
u8 i;
for (i = 0; i < 24; i++) {
- if (gSaveContext.save.inventory.items[i] == oldItem) {
- gSaveContext.save.inventory.items[i] = newItem;
+ if (gSaveContext.save.saveInfo.inventory.items[i] == oldItem) {
+ gSaveContext.save.saveInfo.inventory.items[i] = newItem;
for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
if (GET_CUR_FORM_BTN_ITEM(i) == oldItem) {
@@ -3259,7 +3155,7 @@ s32 Inventory_HasEmptyBottle(void) {
s32 slot;
for (slot = SLOT_BOTTLE_1; slot <= SLOT_BOTTLE_6; slot++) {
- if (gSaveContext.save.inventory.items[slot] == ITEM_BOTTLE) {
+ if (gSaveContext.save.saveInfo.inventory.items[slot] == ITEM_BOTTLE) {
return true;
}
}
@@ -3270,7 +3166,7 @@ s32 Inventory_HasItemInBottle(u8 item) {
s32 slot;
for (slot = SLOT_BOTTLE_1; slot <= SLOT_BOTTLE_6; slot++) {
- if (gSaveContext.save.inventory.items[slot] == item) {
+ if (gSaveContext.save.saveInfo.inventory.items[slot] == item) {
return true;
}
}
@@ -3278,7 +3174,7 @@ s32 Inventory_HasItemInBottle(u8 item) {
}
void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 btn) {
- gSaveContext.save.inventory.items[GET_CUR_FORM_BTN_SLOT(btn)] = item;
+ gSaveContext.save.saveInfo.inventory.items[GET_CUR_FORM_BTN_SLOT(btn)] = item;
SET_CUR_FORM_BTN_ITEM(btn, item);
Interface_LoadItemIconImpl(play, btn);
@@ -3297,7 +3193,7 @@ s32 Inventory_ConsumeFairy(PlayState* play) {
u8 i;
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[bottleSlot + i] == ITEM_FAIRY) {
+ if (gSaveContext.save.saveInfo.inventory.items[bottleSlot + i] == ITEM_FAIRY) {
for (btn = EQUIP_SLOT_C_LEFT; btn <= EQUIP_SLOT_C_RIGHT; btn++) {
if (GET_CUR_FORM_BTN_ITEM(btn) == ITEM_FAIRY) {
SET_CUR_FORM_BTN_ITEM(btn, ITEM_BOTTLE);
@@ -3307,7 +3203,7 @@ s32 Inventory_ConsumeFairy(PlayState* play) {
break;
}
}
- gSaveContext.save.inventory.items[bottleSlot + i] = ITEM_BOTTLE;
+ gSaveContext.save.saveInfo.inventory.items[bottleSlot + i] = ITEM_BOTTLE;
return true;
}
}
@@ -3321,7 +3217,7 @@ s32 Inventory_ConsumeFairy(PlayState* play) {
void Inventory_UpdateItem(PlayState* play, s16 slot, s16 item) {
s16 btn;
- gSaveContext.save.inventory.items[slot] = item;
+ gSaveContext.save.saveInfo.inventory.items[slot] = item;
for (btn = EQUIP_SLOT_C_LEFT; btn <= EQUIP_SLOT_C_RIGHT; btn++) {
if (GET_CUR_FORM_BTN_SLOT(btn) == slot) {
@@ -3355,18 +3251,19 @@ void func_80115428(InterfaceContext* interfaceCtx, u16 doAction, s16 loadOffset)
s32 Health_ChangeBy(PlayState* play, s16 healthChange) {
if (healthChange > 0) {
play_sound(NA_SE_SY_HP_RECOVER);
- } else if (gSaveContext.save.playerData.doubleDefense && (healthChange < 0)) {
+ } else if (gSaveContext.save.saveInfo.playerData.doubleDefense && (healthChange < 0)) {
healthChange >>= 1;
}
- gSaveContext.save.playerData.health += healthChange;
+ gSaveContext.save.saveInfo.playerData.health += healthChange;
- if (((void)0, gSaveContext.save.playerData.health) > ((void)0, gSaveContext.save.playerData.healthCapacity)) {
- gSaveContext.save.playerData.health = gSaveContext.save.playerData.healthCapacity;
+ if (((void)0, gSaveContext.save.saveInfo.playerData.health) >
+ ((void)0, gSaveContext.save.saveInfo.playerData.healthCapacity)) {
+ gSaveContext.save.saveInfo.playerData.health = gSaveContext.save.saveInfo.playerData.healthCapacity;
}
- if (gSaveContext.save.playerData.health <= 0) {
- gSaveContext.save.playerData.health = 0;
+ if (gSaveContext.save.saveInfo.playerData.health <= 0) {
+ gSaveContext.save.saveInfo.playerData.health = 0;
return false;
} else {
return true;
@@ -3374,7 +3271,7 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange) {
}
void Health_GiveHearts(s16 hearts) {
- gSaveContext.save.playerData.healthCapacity += hearts * 0x10;
+ gSaveContext.save.saveInfo.playerData.healthCapacity += hearts * 0x10;
}
void Rupees_ChangeBy(s16 rupeeChange) {
@@ -3441,7 +3338,7 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange) {
}
void Magic_Add(PlayState* play, s16 magicToAdd) {
- if (((void)0, gSaveContext.save.playerData.magic) < ((void)0, gSaveContext.magicCapacity)) {
+ if (((void)0, gSaveContext.save.saveInfo.playerData.magic) < ((void)0, gSaveContext.magicCapacity)) {
gSaveContext.magicToAdd += magicToAdd;
gSaveContext.isMagicRequested = true;
}
@@ -3465,12 +3362,12 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
// Magic is not acquired yet
- if (!gSaveContext.save.playerData.isMagicAcquired) {
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
return false;
}
// Not enough magic available to consume
- if ((gSaveContext.save.playerData.magic - magicToConsume) < 0) {
+ if ((gSaveContext.save.saveInfo.playerData.magic - magicToConsume) < 0) {
if (gSaveContext.magicCapacity != 0) {
play_sound(NA_SE_SY_ERROR);
}
@@ -3518,7 +3415,7 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
case MAGIC_CONSUME_LENS:
if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
- if (gSaveContext.save.playerData.magic != 0) {
+ if (gSaveContext.save.saveInfo.playerData.magic != 0) {
interfaceCtx->magicConsumptionTimer = 80;
gSaveContext.magicState = MAGIC_STATE_CONSUME_LENS;
return true;
@@ -3549,7 +3446,7 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
case MAGIC_CONSUME_GORON_ZORA:
// Goron spiked rolling or Zora electric barrier
- if (gSaveContext.save.playerData.magic != 0) {
+ if (gSaveContext.save.saveInfo.playerData.magic != 0) {
interfaceCtx->magicConsumptionTimer = 10;
gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA_SETUP;
return true;
@@ -3560,7 +3457,7 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
case MAGIC_CONSUME_GIANTS_MASK:
// Wearing Giant's Mask
if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
- if (gSaveContext.save.playerData.magic != 0) {
+ if (gSaveContext.save.saveInfo.playerData.magic != 0) {
interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
gSaveContext.magicState = MAGIC_STATE_CONSUME_GIANTS_MASK;
return true;
@@ -3584,7 +3481,7 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
magicToConsume = 0;
}
- gSaveContext.save.playerData.magic -= magicToConsume;
+ gSaveContext.save.saveInfo.playerData.magic -= magicToConsume;
return true;
} else {
play_sound(NA_SE_SY_ERROR);
@@ -3597,11 +3494,11 @@ s32 Magic_Consume(PlayState* play, s16 magicToConsume, s16 type) {
void Magic_UpdateAddRequest(void) {
if (gSaveContext.isMagicRequested) {
- gSaveContext.save.playerData.magic += 4;
+ gSaveContext.save.saveInfo.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;
+ if (((void)0, gSaveContext.save.saveInfo.playerData.magic) >= ((void)0, gSaveContext.magicCapacity)) {
+ gSaveContext.save.saveInfo.playerData.magic = gSaveContext.magicCapacity;
gSaveContext.magicToAdd = 0;
gSaveContext.isMagicRequested = false;
} else {
@@ -3677,7 +3574,7 @@ void Magic_Update(PlayState* play) {
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;
+ magicCapacityTarget = gSaveContext.save.saveInfo.playerData.magicLevel * MAGIC_NORMAL_METER;
if (gSaveContext.magicCapacity != magicCapacityTarget) {
if (gSaveContext.magicCapacity < magicCapacityTarget) {
gSaveContext.magicCapacity += 0x10;
@@ -3699,14 +3596,14 @@ void Magic_Update(PlayState* play) {
case MAGIC_STATE_FILL:
// Add magic until magicFillTarget is reached
- gSaveContext.save.playerData.magic += 0x10;
+ gSaveContext.save.saveInfo.playerData.magic += 0x10;
if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (gSaveContext.sceneLayer < 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;
+ if (((void)0, gSaveContext.save.saveInfo.playerData.magic) >= ((void)0, gSaveContext.magicFillTarget)) {
+ gSaveContext.save.saveInfo.playerData.magic = gSaveContext.magicFillTarget;
gSaveContext.magicState = MAGIC_STATE_IDLE;
}
break;
@@ -3720,10 +3617,10 @@ void Magic_Update(PlayState* play) {
case MAGIC_STATE_CONSUME:
// Consume magic until target is reached or no more magic is available
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
- 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.save.saveInfo.playerData.magic =
+ ((void)0, gSaveContext.save.saveInfo.playerData.magic) - ((void)0, gSaveContext.magicToConsume);
+ if (gSaveContext.save.saveInfo.playerData.magic <= 0) {
+ gSaveContext.save.saveInfo.playerData.magic = 0;
}
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
sMagicMeterOutlinePrimRed = sMagicMeterOutlinePrimGreen = sMagicMeterOutlinePrimBlue = 255;
@@ -3749,7 +3646,7 @@ void Magic_Update(PlayState* play) {
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) &&
!Play_InCsMode(play)) {
- if ((gSaveContext.save.playerData.magic == 0) ||
+ if ((gSaveContext.save.saveInfo.playerData.magic == 0) ||
((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
(Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) ||
((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) != ITEM_LENS) &&
@@ -3767,7 +3664,7 @@ void Magic_Update(PlayState* play) {
interfaceCtx->magicConsumptionTimer--;
if (interfaceCtx->magicConsumptionTimer == 0) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
- gSaveContext.save.playerData.magic--;
+ gSaveContext.save.saveInfo.playerData.magic--;
}
interfaceCtx->magicConsumptionTimer = 80;
}
@@ -3779,10 +3676,10 @@ void Magic_Update(PlayState* play) {
case MAGIC_STATE_CONSUME_GORON_ZORA_SETUP:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
- gSaveContext.save.playerData.magic -= 2;
+ gSaveContext.save.saveInfo.playerData.magic -= 2;
}
- if (gSaveContext.save.playerData.magic <= 0) {
- gSaveContext.save.playerData.magic = 0;
+ if (gSaveContext.save.saveInfo.playerData.magic <= 0) {
+ gSaveContext.save.saveInfo.playerData.magic = 0;
}
gSaveContext.magicState = MAGIC_STATE_CONSUME_GORON_ZORA;
// fallthrough
@@ -3794,10 +3691,10 @@ void Magic_Update(PlayState* play) {
interfaceCtx->magicConsumptionTimer--;
if (interfaceCtx->magicConsumptionTimer == 0) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
- gSaveContext.save.playerData.magic--;
+ gSaveContext.save.saveInfo.playerData.magic--;
}
- if (gSaveContext.save.playerData.magic <= 0) {
- gSaveContext.save.playerData.magic = 0;
+ if (gSaveContext.save.saveInfo.playerData.magic <= 0) {
+ gSaveContext.save.saveInfo.playerData.magic = 0;
}
interfaceCtx->magicConsumptionTimer = 10;
}
@@ -3816,10 +3713,10 @@ void Magic_Update(PlayState* play) {
interfaceCtx->magicConsumptionTimer--;
if (interfaceCtx->magicConsumptionTimer == 0) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) {
- gSaveContext.save.playerData.magic--;
+ gSaveContext.save.saveInfo.playerData.magic--;
}
- if (gSaveContext.save.playerData.magic <= 0) {
- gSaveContext.save.playerData.magic = 0;
+ if (gSaveContext.save.saveInfo.playerData.magic <= 0) {
+ gSaveContext.save.saveInfo.playerData.magic = 0;
}
interfaceCtx->magicConsumptionTimer = R_MAGIC_CONSUME_TIMER_GIANTS_MASK;
}
@@ -3842,14 +3739,14 @@ void Magic_DrawMeter(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- if (gSaveContext.save.playerData.magicLevel != 0) {
- if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ if (gSaveContext.save.saveInfo.playerData.magicLevel != 0) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) {
magicBarY = 42; // two rows of hearts
} else {
magicBarY = 34; // one row of hearts
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetEnvColor(OVERLAY_DISP++, 100, 50, 50, 255);
@@ -3876,8 +3773,8 @@ void Magic_DrawMeter(PlayState* play) {
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);
+ (((void)0, gSaveContext.save.saveInfo.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++);
@@ -3891,7 +3788,8 @@ void Magic_DrawMeter(PlayState* play) {
gSPTextureRectangle(
OVERLAY_DISP++, 104, (magicBarY + 3) << 2,
- ((((void)0, gSaveContext.save.playerData.magic) - ((void)0, gSaveContext.magicToConsume)) + 26) << 2,
+ ((((void)0, gSaveContext.save.saveInfo.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
@@ -3906,8 +3804,8 @@ void Magic_DrawMeter(PlayState* play) {
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);
+ (((void)0, gSaveContext.save.saveInfo.playerData.magic) + 26) << 2,
+ (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
}
@@ -3969,7 +3867,6 @@ void Interface_DrawItemButtons(PlayState* play) {
OVERLAY_DISP = Gfx_DrawTexRectIA8_DropShadow(OVERLAY_DISP, gButtonBackgroundTex, 0x20, 0x20, D_801BF9D4[0],
D_801BF9DC[0], D_801BFAF4[0], D_801BFAF4[0], D_801BF9E4[0] * 2,
D_801BF9E4[0] * 2, 100, 255, 120, interfaceCtx->bAlpha);
- if (1) {}
gDPPipeSync(OVERLAY_DISP++);
// C-Left Button Color & Texture
@@ -4001,7 +3898,7 @@ void Interface_DrawItemButtons(PlayState* play) {
}
if (interfaceCtx->tatlCalling && (play->pauseCtx.state == PAUSE_STATE_OFF) &&
- (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && (play->csCtx.state == 0) &&
+ (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE) && (play->csCtx.state == CS_STATE_IDLE) &&
(sPictoState == PICTO_BOX_STATE_OFF)) {
if (sCUpInvisible == 0) {
// C-Up Button Texture, Color & Label (Tatl Text)
@@ -4285,7 +4182,7 @@ void Interface_DrawAButton(PlayState* play) {
aAlpha = 100;
}
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
Interface_SetPerspectiveView(play, 25 + R_A_BTN_Y_OFFSET, 70 + R_A_BTN_Y_OFFSET, 192, 237);
@@ -4360,7 +4257,7 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
(pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_MASK))) {
// Inventory Equip Effects
gSPSegment(OVERLAY_DISP++, 0x08, pauseCtx->iconItemSegment);
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -4412,11 +4309,10 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
/**
* Draws either the analog three-day clock or the digital final-hours clock
*/
-#ifdef NON_MATCHING
void Interface_DrawClock(PlayState* play) {
static s16 sThreeDayClockAlpha = 255;
- static s16 D_801BFB30 = 0; // sClockAlphaTimer1
- static s16 D_801BFB34 = 0; // sClockAlphaTimer2
+ static s16 sClockAlphaTimer1 = 0;
+ static s16 sClockAlphaTimer2 = 0;
static u16 sThreeDayClockHours[] = {
CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
@@ -4432,31 +4328,30 @@ void Interface_DrawClock(PlayState* play) {
gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
};
- static s16 D_801BFBCC = 0; // sClockInvDiamondPrimRed
- static s16 D_801BFBD0 = 0; // sClockInvDiamondPrimGreen
- static s16 D_801BFBD4 = 255; // sClockInvDiamondPrimBlue
- static s16 D_801BFBD8 = 0; // sClockInvDiamondEnvRed
- static s16 D_801BFBDC = 0; // sClockInvDiamondEnvGreen
- static s16 D_801BFBE0 = 0; // sClockInvDiamondEnvBlue
- static s16 D_801BFBE4 = 15; // sClockInvDiamondTimer
- static s16 D_801BFBE8 = 0; // sClockInvDiamondTargetIndex
- static s16 D_801BFBEC[] = { 100, 0 }; // sClockInvDiamondPrimRedTargets
- static s16 D_801BFBF0[] = { 205, 155 }; // sClockInvDiamondPrimGreenTargets
- static s16 D_801BFBF4[] = { 255, 255 }; // sClockInvDiamondPrimBlueTargets
- static s16 D_801BFBF8[] = { 30, 0 }; // sClockInvDiamondEnvRedTargets
- static s16 D_801BFBFC[] = { 30, 0 }; // sClockInvDiamondEnvGreenTargets
- static s16 D_801BFC00[] = { 100, 0 }; // sClockInvDiamondEnvBlueTargets
- static s16 D_801BFC04[] = { 255, 0 }; // sFinalHoursClockDigitsRed
- static s16 D_801BFC08[] = { 100, 0 }; // sFinalHoursClockFrameEnvRedTargets
- static s16 D_801BFC0C[] = { 30, 0 }; // sFinalHoursClockFrameEnvGreenTargets
- static s16 D_801BFC10[] = { 100, 0 }; // sFinalHoursClockFrameEnvBlueTargets
+ static s16 sClockInvDiamondPrimRed = 0;
+ static s16 sClockInvDiamondPrimGreen = 155;
+ static s16 sClockInvDiamondPrimBlue = 255;
+ static s16 sClockInvDiamondEnvRed = 0;
+ static s16 sClockInvDiamondEnvGreen = 0;
+ static s16 sClockInvDiamondEnvBlue = 0;
+ static s16 sClockInvDiamondTimer = 15;
+ static s16 sClockInvDiamondTargetIndex = 0;
+ static s16 sClockInvDiamondPrimRedTargets[] = { 100, 0 };
+ static s16 sClockInvDiamondPrimGreenTargets[] = { 205, 155 };
+ static s16 sClockInvDiamondPrimBlueTargets[] = { 255, 255 };
+ static s16 sClockInvDiamondEnvRedTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvGreenTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvBlueTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockDigitsRedTargets[] = { 255, 0 };
+ static s16 sFinalHoursClockFrameEnvRedTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockFrameEnvGreenTargets[] = { 30, 0 };
+ static s16 sFinalHoursClockFrameEnvBlueTargets[] = { 100, 0 };
static TexturePtr sFinalHoursDigitTextures[] = {
gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
};
- // sFinalHoursDigitSlotPosXOffset
- static s16 D_801BFC40[] = {
+ static s16 sFinalHoursDigitSlotPosXOffset[] = {
127, 136, 144, 151, 160, 168, 175, 184,
};
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -4468,527 +4363,492 @@ void Interface_DrawClock(PlayState* play) {
f32 timeInMinutes;
f32 timeInSeconds;
f32 sp1CC;
- s32 new_var;
+ s32 pad1;
s16 sp1C6;
s16 currentHour;
u16 time;
- s16 temp;
+ s16 pad2;
s16 colorStep;
- s16 finalHoursClockSlots[8]; // sp1AC
+ s16 finalHoursClockSlots[8];
s16 index;
OPEN_DISPS(play->state.gfxCtx);
- if (R_TIME_SPEED != 0) {
- if ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
- (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
- (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) {
- if (!FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day < 4)) {
- /**
- * Changes Clock's transparancy depending if Player is moving or not and possibly other things
- */
- if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
- if (func_801234D4(play)) {
- sThreeDayClockAlpha = 80;
- D_801BFB30 = 5;
- D_801BFB34 = 20;
- } else if (D_801BFB34 != 0) {
- D_801BFB34--;
- } else if (D_801BFB30 != 0) {
- colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30;
- sThreeDayClockAlpha += colorStep;
+ if ((R_TIME_SPEED != 0) &&
+ ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
+ (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
+ (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) &&
+ !FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day <= 3)) {
+ /**
+ * Section: Changes Clock's transparancy depending if Player is moving or not and possibly other things
+ */
+ if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
+ if (func_801234D4(play)) {
+ sThreeDayClockAlpha = 80;
+ sClockAlphaTimer1 = 5;
+ sClockAlphaTimer2 = 20;
+ } else if (sClockAlphaTimer2 != 0) {
+ sClockAlphaTimer2--;
+ } else if (sClockAlphaTimer1 != 0) {
+ colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / sClockAlphaTimer1;
+ sThreeDayClockAlpha += colorStep;
- if (sThreeDayClockAlpha >= 255) {
- sThreeDayClockAlpha = 255;
- D_801BFB30 = 0;
- }
- } else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
- } else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
- }
- D_801BFB34 = 0;
- D_801BFB30 = 0;
- }
+ if (sThreeDayClockAlpha >= 255) {
+ sThreeDayClockAlpha = 255;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
} else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
+ } else {
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+
+ if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draw Clock's Hour Lines
+ */
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128, 35, 1,
+ 6, 0, 1 << 10, 1 << 10);
+
+ /**
+ * Section: Draw Clock's Border
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ //! @bug A texture height of 50 is given below. The texture is only 48 units height
+ //! resulting in this reading into the next texture. This results in a white
+ //! dot in the bottom center of the clock. For the three-day clock, this is
+ //! covered by the diamond. However, it can be seen by the final-hours clock.
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50, 1, 6,
+ 0, 1 << 10, 1 << 10);
+
+ if (((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ } else {
+ /**
+ * Section: Draw Three-Day Clock's Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // Time is slowed down to half speed with inverted song of time
+ if (gSaveContext.save.timeSpeedOffset == -2) {
+ // Clock diamond is blue and flashes white
+ colorStep =
+ ABS_ALT(sClockInvDiamondPrimRed - sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimRed >= sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimRed -= colorStep;
} else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ sClockInvDiamondPrimRed += colorStep;
}
- D_801BFB34 = 0;
- D_801BFB30 = 0;
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimGreen -
+ sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimGreen >= sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimGreen -= colorStep;
+ } else {
+ sClockInvDiamondPrimGreen += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimBlue -
+ sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimBlue >= sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimBlue -= colorStep;
+ } else {
+ sClockInvDiamondPrimBlue += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvRed - sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvRed >= sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvRed -= colorStep;
+ } else {
+ sClockInvDiamondEnvRed += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondEnvGreen -
+ sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvGreen >= sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvGreen -= colorStep;
+ } else {
+ sClockInvDiamondEnvGreen += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvBlue - sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvBlue >= sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvBlue -= colorStep;
+ } else {
+ sClockInvDiamondEnvBlue += colorStep;
+ }
+
+ sClockInvDiamondTimer--;
+
+ if (sClockInvDiamondTimer == 0) {
+ sClockInvDiamondPrimRed = sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimGreen = sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimBlue = sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvRed = sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvGreen = sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvBlue = sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondTimer = 15;
+ sClockInvDiamondTargetIndex ^= 1;
+ }
+
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
+ 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sClockInvDiamondPrimRed, sClockInvDiamondPrimGreen, 255,
+ sThreeDayClockAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, sClockInvDiamondEnvRed, sClockInvDiamondEnvGreen,
+ sClockInvDiamondEnvBlue, 0);
+ } else {
+ // Clock diamond is green for regular timeSpeedOffset
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
}
- if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40, 32,
+ 1 << 10, 1 << 10);
- func_8012C654(play->state.gfxCtx);
+ /**
+ * Section: Draw Three-Day Clock's Day-Number over Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- /**
- * Draw Clock's Hour Lines
- */
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27, 137, 192,
+ 48, 27, 1 << 10, 1 << 10);
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128,
- 35, 1, 6, 0, 1 << 10, 1 << 10);
+ /**
+ * Section: Draw Three-Day Clock's Star (for the Minute Tracker)
+ */
+ gDPPipeSync(OVERLAY_DISP++);
- /**
- * Draw Clock's Border
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ if (D_801BF974 != 0) {
+ D_801BF980 += 0.02f;
+ D_801BF97C += 11;
+ } else {
+ D_801BF980 -= 0.02f;
+ D_801BF97C -= 11;
+ }
- //! @bug A texture height of 50 is given below. The texture is only 48 units height
- //! resulting in this reading into the next texture. This results in a white
- //! dot in the bottom center of the clock. For the three-day clock, this is
- //! covered by the diamond. However, it can be seen by the final-hours clock.
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50,
- 1, 6, 0, 1 << 10, 1 << 10);
+ D_801BF978--;
+ if (D_801BF978 == 0) {
+ D_801BF978 = 10;
+ D_801BF974 ^= 1;
+ }
- if (((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
- func_8012C8D4(play->state.gfxCtx);
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
+ timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
+
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (sThreeDayClockAlpha != 255) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
+ }
+
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
+ Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ }
+
+ /**
+ * Section: Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
+
+ // determines the current hour
+ for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
+ if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
+ break;
+ }
+ }
+
+ /**
+ * Section: Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
+ */
+ time = gSaveContext.save.time;
+ sp1D8 = Math_SinS(time) * -40.0f;
+ temp_f14 = Math_CosS(time) * -34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
+
+ /**
+ * Section: Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
+ */
+ sp1D8 = Math_SinS(time) * 40.0f;
+ temp_f14 = Math_CosS(time) * 34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
+
+ /**
+ * Section: Cuts off Three-Day Clock's Hour Digits when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Sun
+ */
+ sp1CC = gSaveContext.save.time * 0.000096131f; // (2.0f * 3.15f / 0x10000)
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Sun
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Moon
+ */
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Moon
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
+
+ // Final Hours
+ if ((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
+ if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
+ // The Final Hours clock will flash red
+
+ colorStep = ABS_ALT(sFinalHoursClockDigitsRed -
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockDigitsRed >=
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockDigitsRed -= colorStep;
} else {
- /**
- * Draw Three-Day Clock's Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- // Time is slowed down to half speed with inverted song of time
- if (gSaveContext.save.timeSpeedOffset == -2) {
- // Clock diamond is blue and flashes white
- colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) {
- D_801BFBCC -= colorStep;
- } else {
- D_801BFBCC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) {
- D_801BFBD0 -= colorStep;
- } else {
- D_801BFBD0 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) {
- D_801BFBD4 -= colorStep;
- } else {
- D_801BFBD4 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) {
- D_801BFBD8 -= colorStep;
- } else {
- D_801BFBD8 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) {
- D_801BFBDC -= colorStep;
- } else {
- D_801BFBDC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) {
- D_801BFBE0 -= colorStep;
- } else {
- D_801BFBE0 += colorStep;
- }
-
- D_801BFBE4--;
-
- if (D_801BFBE4 == 0) {
- D_801BFBCC = D_801BFBEC[D_801BFBE8];
- D_801BFBD0 = D_801BFBF0[D_801BFBE8];
- D_801BFBD4 = D_801BFBF4[D_801BFBE8];
- D_801BFBD8 = D_801BFBF8[D_801BFBE8];
- D_801BFBDC = D_801BFBFC[D_801BFBE8];
- D_801BFBE0 = D_801BFC00[D_801BFBE8];
- D_801BFBE4 = 15;
- D_801BFBE8 ^= 1;
- }
-
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255, sThreeDayClockAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0);
- } else {
- // Clock diamond is green for regular timeSpeedOffset
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
- }
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40,
- 32, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Day-Number over Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27,
- 137, 192, 48, 27, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Star (for the Minute Tracker)
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- if (D_801BF974 != 0) {
- D_801BF980 += 0.02f;
- D_801BF97C += 11;
- } else {
- D_801BF980 -= 0.02f;
- D_801BF97C -= 11;
- }
-
- D_801BF978--;
- if (D_801BF978 == 0) {
- D_801BF978 = 10;
- D_801BF974 ^= 1;
- }
-
- timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
- timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
-
- func_8012C8D4(play->state.gfxCtx);
-
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- if (sThreeDayClockAlpha != 255) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
- } else {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
- }
-
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
-
- Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
- Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
- gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
- G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
- G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ sFinalHoursClockDigitsRed += colorStep;
}
- /**
- * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
-
- // determines the current hour
- for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
- if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
- break;
- }
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvRed -
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvRed >=
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvRed -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvRed += colorStep;
}
- /**
- * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
- */
- time = gSaveContext.save.time;
- sp1D8 = Math_SinS(time) * -40.0f;
- temp_f14 = Math_CosS(time) * -34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
-
- /**
- * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
- */
- sp1D8 = Math_SinS(time) * 40.0f;
- temp_f14 = Math_CosS(time) * 34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
-
- /**
- * Cuts off Three-Day Clock's Hour Digits when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Sun
- */
- sp1CC = gSaveContext.save.time * 0.000096131f;
-
- // Rotates Three-Day Clock's Hour Digit To Above the Sun
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Moon
- */
- // Rotates Three-Day Clock's Hour Digit To Above the Moon
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
-
- // Final Hours
- if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
- if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
- // The Final Hours clock will flash red
-
- colorStep =
- ABS_ALT(sFinalHoursClockDigitsRed - D_801BFC04[sFinalHoursClockColorTargetIndex]) /
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvGreen -
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) /
sFinalHoursClockColorTimer;
- if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockDigitsRed -= colorStep;
- } else {
- sFinalHoursClockDigitsRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvRed - D_801BFC08[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvRed -= colorStep;
- } else {
- sFinalHoursClockFrameEnvRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvGreen - D_801BFC0C[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvGreen -= colorStep;
- } else {
- sFinalHoursClockFrameEnvGreen += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvBlue - D_801BFC10[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvBlue -= colorStep;
- } else {
- sFinalHoursClockFrameEnvBlue += colorStep;
- }
-
- sFinalHoursClockColorTimer--;
-
- if (sFinalHoursClockColorTimer == 0) {
- sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockColorTimer = 6;
- sFinalHoursClockColorTargetIndex ^= 1;
- }
- }
-
- sp1E6 = sThreeDayClockAlpha;
- if (sp1E6 != 0) {
- sp1E6 = 255;
- }
-
- func_8012C654(play->state.gfxCtx);
-
- /**
- * Draws Final-Hours Clock's Frame
- */
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
- sFinalHoursClockFrameEnvBlue, 0);
-
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202,
- 80, 13, 0, 0, 0, 1 << 10, 1 << 10);
-
- finalHoursClockSlots[0] = 0;
-
- timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
-
- timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
-
- // digits for hours
- finalHoursClockSlots[1] = timeInMinutes / 60.0f;
- finalHoursClockSlots[2] = timeInMinutes / 60.0f;
-
- temp = (s32)timeInMinutes % 60;
-
- while (finalHoursClockSlots[1] >= 10) {
- finalHoursClockSlots[0]++;
- finalHoursClockSlots[1] -= 10;
- }
-
- // digits for minutes
- finalHoursClockSlots[3] = 0;
- finalHoursClockSlots[4] = temp;
-
- while (finalHoursClockSlots[4] >= 10) {
- finalHoursClockSlots[3]++;
- finalHoursClockSlots[4] -= 10;
- }
-
- // digits for seconds
- finalHoursClockSlots[6] = 0;
- finalHoursClockSlots[7] =
- timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
- (((void)0, temp) * ((f32)0x10000 / (24 * 60))));
-
- while (finalHoursClockSlots[7] >= 10) {
- finalHoursClockSlots[6]++;
- finalHoursClockSlots[7] -= 10;
- }
-
- // Colon separating hours from minutes and minutes from seconds
- finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
-
- /**
- * Draws Final-Hours Clock's Digits
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
-
- for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
- index = D_801BFC40[sp1C6];
-
- OVERLAY_DISP =
- Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]],
- 8, 8, index, 205, 8, 8, 1 << 10, 1 << 10);
- }
+ if (sFinalHoursClockFrameEnvGreen >=
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvGreen -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvGreen += colorStep;
}
+
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvBlue -
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvBlue >=
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvBlue -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvBlue += colorStep;
+ }
+
+ sFinalHoursClockColorTimer--;
+
+ if (sFinalHoursClockColorTimer == 0) {
+ sFinalHoursClockDigitsRed = sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvRed =
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvGreen =
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvBlue =
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockColorTimer = 6;
+ sFinalHoursClockColorTargetIndex ^= 1;
+ }
+ }
+
+ sp1E6 = sThreeDayClockAlpha;
+ if (sp1E6 != 0) {
+ sp1E6 = 255;
+ }
+
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draws Final-Hours Clock's Frame
+ */
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
+ sFinalHoursClockFrameEnvBlue, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202, 80, 13, 0,
+ 0, 0, 1 << 10, 1 << 10);
+
+ timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
+ timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
+
+ // digits for hours
+ finalHoursClockSlots[0] = 0;
+ finalHoursClockSlots[1] = timeInMinutes / 60.0f;
+ finalHoursClockSlots[2] = timeInMinutes / 60.0f;
+
+ while (finalHoursClockSlots[1] >= 10) {
+ finalHoursClockSlots[0]++;
+ finalHoursClockSlots[1] -= 10;
+ }
+
+ // digits for minutes
+ finalHoursClockSlots[3] = 0;
+ finalHoursClockSlots[4] = (s32)timeInMinutes % 60;
+ finalHoursClockSlots[5] = (s32)timeInMinutes % 60;
+
+ while (finalHoursClockSlots[4] >= 10) {
+ finalHoursClockSlots[3]++;
+ finalHoursClockSlots[4] -= 10;
+ }
+
+ // digits for seconds
+ finalHoursClockSlots[6] = 0;
+ finalHoursClockSlots[7] =
+ timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
+ (finalHoursClockSlots[5] * ((f32)0x10000 / (24 * 60))));
+
+ while (finalHoursClockSlots[7] >= 10) {
+ finalHoursClockSlots[6]++;
+ finalHoursClockSlots[7] -= 10;
+ }
+
+ // Colon separating hours from minutes and minutes from seconds
+ finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
+
+ /**
+ * Section: Draws Final-Hours Clock's Digits
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
+
+ for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
+ index = sFinalHoursDigitSlotPosXOffset[sp1C6];
+
+ OVERLAY_DISP =
+ Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]], 8, 8,
+ index, 205, 8, 8, 1 << 10, 1 << 10);
}
}
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-s16 sThreeDayClockAlpha = 255;
-s16 D_801BFB30 = 0;
-s16 D_801BFB34 = 0;
-u16 sThreeDayClockHours[] = {
- CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
- CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
- CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0),
- CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0),
- CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1,
-};
-TexturePtr sThreeDayClockHourTextures[] = {
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
-};
-s16 D_801BFBCC = 0; // color R
-s16 D_801BFBD0 = 155; // color G
-s16 D_801BFBD4 = 255;
-s16 D_801BFBD8 = 0;
-s16 D_801BFBDC = 0;
-s16 D_801BFBE0 = 0;
-s16 D_801BFBE4 = 0xF;
-u32 D_801BFBE8 = 0;
-s16 D_801BFBEC[] = { 100, 0 };
-s16 D_801BFBF0[] = { 205, 155 };
-s16 D_801BFBF4[] = { 255, 255 };
-s16 D_801BFBF8[] = { 30, 0 };
-s16 D_801BFBFC[] = { 30, 0 };
-s16 D_801BFC00[] = { 100, 0 };
-s16 D_801BFC04[] = { 255, 0 };
-s16 D_801BFC08[] = { 100, 0 };
-s16 D_801BFC0C[] = { 30, 0 };
-s16 D_801BFC10[] = { 100, 0 };
-TexturePtr sFinalHoursDigitTextures[] = {
- gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
- gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
- gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
-};
-s16 D_801BFC40[] = {
- 127, 136, 144, 151, 160, 168, 175, 184,
-};
-void Interface_DrawClock(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_DrawClock.s")
-#endif
void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -5497,7 +5357,7 @@ void Interface_DrawPerfectLetters(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
@@ -5652,7 +5512,7 @@ void Interface_DrawTimers(PlayState* play) {
}
gSaveContext.timerStates[TIMER_ID_POSTMAN] = TIMER_STATE_POSTMAN_COUNTING;
sPostmanTimerInputBtnAPressed = true;
- func_80174F7C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_SetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
break;
case TIMER_STATE_POSTMAN_STOP:
@@ -5661,7 +5521,7 @@ void Interface_DrawTimers(PlayState* play) {
postmanTimerStopOsTime - ((void)0, gSaveContext.timerStartOsTimes[TIMER_ID_POSTMAN]) -
((void)0, gSaveContext.timerPausedOsTimes[TIMER_ID_POSTMAN]));
gSaveContext.timerStates[TIMER_ID_POSTMAN] = TIMER_STATE_POSTMAN_END;
- func_80174F9C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_UnsetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
break;
case TIMER_STATE_POSTMAN_COUNTING:
@@ -5683,7 +5543,7 @@ void Interface_DrawTimers(PlayState* play) {
if (interfaceCtx->magicAlpha != 255) {
gSaveContext.timerY[sTimerId] = 22;
- } else if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ } else if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) {
gSaveContext.timerY[sTimerId] = 54;
} else {
gSaveContext.timerY[sTimerId] = 46;
@@ -5727,7 +5587,7 @@ void Interface_DrawTimers(PlayState* play) {
j = ((((void)0, gSaveContext.timerX[sTimerId]) - 26) / sTimerStateTimer);
gSaveContext.timerX[sTimerId] = ((void)0, gSaveContext.timerX[sTimerId]) - j;
- j = (gSaveContext.save.playerData.healthCapacity > 0xA0)
+ j = (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0)
? ((((void)0, gSaveContext.timerY[sTimerId]) - 54) / sTimerStateTimer)
: ((((void)0, gSaveContext.timerY[sTimerId]) - 46) / sTimerStateTimer);
gSaveContext.timerY[sTimerId] = ((void)0, gSaveContext.timerY[sTimerId]) - j;
@@ -5741,7 +5601,7 @@ void Interface_DrawTimers(PlayState* play) {
gSaveContext.timerY[sTimerId] = R_MOON_CRASH_TIMER_Y;
} else {
gSaveContext.timerX[sTimerId] = 26;
- if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) {
gSaveContext.timerY[sTimerId] = 54;
} else {
gSaveContext.timerY[sTimerId] = 46;
@@ -5781,7 +5641,8 @@ void Interface_DrawTimers(PlayState* play) {
break;
case TIMER_STATE_ENV_HAZARD_START:
- gSaveContext.timerCurTimes[sTimerId] = SECONDS_TO_TIMER(gSaveContext.save.playerData.health >> 1);
+ gSaveContext.timerCurTimes[sTimerId] =
+ SECONDS_TO_TIMER(gSaveContext.save.saveInfo.playerData.health >> 1);
gSaveContext.timerDirections[sTimerId] = TIMER_COUNT_DOWN;
gSaveContext.timerTimeLimits[sTimerId] = gSaveContext.timerCurTimes[sTimerId];
sTimerStateTimer = 20;
@@ -5889,8 +5750,8 @@ void Interface_DrawTimers(PlayState* play) {
gSaveContext.timerCurTimes[sTimerId] = SECONDS_TO_TIMER(0);
gSaveContext.timerStates[sTimerId] = TIMER_STATE_STOP;
if (sEnvTimerActive) {
- gSaveContext.save.playerData.health = 0;
- play->damagePlayer(play, -(((void)0, gSaveContext.save.playerData.health) + 2));
+ gSaveContext.save.saveInfo.playerData.health = 0;
+ play->damagePlayer(play, -(((void)0, gSaveContext.save.saveInfo.playerData.health) + 2));
}
sEnvTimerActive = false;
}
@@ -5958,7 +5819,8 @@ void Interface_DrawTimers(PlayState* play) {
}
} else if (CHECK_EVENTINF(EVENTINF_34) && (play->sceneId == SCENE_DEKUTES)) {
if ((((void)0, gSaveContext.timerCurTimes[sTimerId]) >
- (gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1] - SECONDS_TO_TIMER(9))) &&
+ (gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1] -
+ SECONDS_TO_TIMER(9))) &&
(sTimerBeepSfxSeconds != sTimerDigits[4])) {
play_sound(NA_SE_SY_WARNING_COUNT_E);
sTimerBeepSfxSeconds = sTimerDigits[4];
@@ -5996,10 +5858,10 @@ void Interface_DrawTimers(PlayState* play) {
}
} else if (CHECK_EVENTINF(EVENTINF_34) && (play->sceneId == SCENE_DEKUTES)) {
if (((void)0, gSaveContext.timerCurTimes[sTimerId]) >=
- gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255);
} else if (((void)0, gSaveContext.timerCurTimes[sTimerId]) >=
- (gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1] -
+ (gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1] -
SECONDS_TO_TIMER(9))) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 0, 255);
} else {
@@ -6107,7 +5969,7 @@ void Interface_UpdateBottleTimers(PlayState* play) {
// Time has passed, and the time limit has been exceeded.
gSaveContext.bottleTimerCurTimes[i] = SECONDS_TO_TIMER(0);
- if (gSaveContext.save.inventory.items[i + SLOT_BOTTLE_1] == ITEM_HOT_SPRING_WATER) {
+ if (gSaveContext.save.saveInfo.inventory.items[i + SLOT_BOTTLE_1] == ITEM_HOT_SPRING_WATER) {
Inventory_UpdateItem(play, i + SLOT_BOTTLE_1, ITEM_SPRING_WATER);
Message_StartTextbox(play, 0xFA, NULL);
}
@@ -6132,7 +5994,7 @@ void Interface_DrawMinigameIcons(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
// Carrots rendering if the action corresponds to riding a horse
@@ -6166,7 +6028,7 @@ void Interface_DrawMinigameIcons(PlayState* play) {
width = 24;
height = 16;
rectX = 20;
- if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) {
rectY = 75; // two rows of hearts
} else {
rectY = 67; // one row of hearts
@@ -6210,7 +6072,7 @@ void Interface_DrawMinigameIcons(PlayState* play) {
if (play->sceneId == SCENE_30GYOSON) {
rectX += 20;
- if (gSaveContext.save.playerData.healthCapacity > 0xA0) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity > 0xA0) {
rectY = 87; // two rows of hearts
} else {
rectY = 79; // one row of hearts
@@ -6307,7 +6169,7 @@ void Interface_Draw(PlayState* play) {
// Draw Grandma's Story
if (interfaceCtx->storyDmaStatus == STORY_DMA_DONE) {
gSPSegment(OVERLAY_DISP++, 0x07, interfaceCtx->storySegment);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -6332,7 +6194,7 @@ void Interface_Draw(PlayState* play) {
LifeMeter_Draw(play);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
// Draw Rupee Icon
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sRupeeCounterIconPrimColors[CUR_UPG_VALUE(UPG_WALLET)].r,
@@ -6465,7 +6327,7 @@ void Interface_Draw(PlayState* play) {
PRIMITIVE, 0);
counterDigits[0] = counterDigits[1] = 0;
- counterDigits[2] = gSaveContext.save.playerData.rupees;
+ counterDigits[2] = gSaveContext.save.saveInfo.playerData.rupees;
if ((counterDigits[2] > 9999) || (counterDigits[2] < 0)) {
counterDigits[2] &= 0xDDD;
@@ -6498,9 +6360,9 @@ void Interface_Draw(PlayState* play) {
gDPPipeSync(OVERLAY_DISP++);
- if (gSaveContext.save.playerData.rupees == CUR_CAPACITY(UPG_WALLET)) {
+ if (gSaveContext.save.saveInfo.playerData.rupees == CUR_CAPACITY(UPG_WALLET)) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha);
- } else if (gSaveContext.save.playerData.rupees != 0) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees != 0) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha);
} else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, interfaceCtx->magicAlpha);
@@ -6517,7 +6379,7 @@ void Interface_Draw(PlayState* play) {
Actor_DrawZTarget(&play->actorCtx.targetContext, play);
}
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
Interface_DrawItemButtons(play);
@@ -6549,7 +6411,7 @@ void Interface_Draw(PlayState* play) {
interfaceCtx->actionVtx[40 + 2].v.tc[1] = interfaceCtx->actionVtx[40 + 3].v.tc[1] = 32 << 5;
- func_8012C8D4(play->state.gfxCtx);
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
@@ -6584,7 +6446,7 @@ void Interface_Draw(PlayState* play) {
// Draw pictograph focus icons
if (sPictoState == PICTO_BOX_STATE_LENS) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
@@ -6627,7 +6489,7 @@ void Interface_Draw(PlayState* play) {
// Draw pictograph photo
if (sPictoState >= PICTO_BOX_STATE_SETUP_PHOTO) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)gSaveContext.pictoPhotoI5, PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -6652,7 +6514,7 @@ void Interface_Draw(PlayState* play) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 200, 200, 250);
gDPFillRectangle(OVERLAY_DISP++, 70, 22, 251, 151);
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM);
@@ -6663,7 +6525,7 @@ void Interface_Draw(PlayState* play) {
for (sp2CC = 0; sp2CC < (PICTO_PHOTO_HEIGHT / 8); sp2CC++, pictoRectTop += 8) {
pictoRectLeft = PICTO_PHOTO_TOPLEFT_X;
gDPLoadTextureBlock(OVERLAY_DISP++,
- (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90) +
+ (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer) +
(0x500 * sp2CC),
G_IM_FMT_I, G_IM_SIZ_8b, PICTO_PHOTO_WIDTH, 8, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
@@ -6851,14 +6713,15 @@ void Interface_Update(PlayState* play) {
// Update health
if (gSaveContext.healthAccumulator != 0) {
gSaveContext.healthAccumulator -= 4;
- gSaveContext.save.playerData.health += 4;
+ gSaveContext.save.saveInfo.playerData.health += 4;
- if ((gSaveContext.save.playerData.health & 0xF) < 4) {
+ if ((gSaveContext.save.saveInfo.playerData.health & 0xF) < 4) {
play_sound(NA_SE_SY_HP_RECOVER);
}
- if (((void)0, gSaveContext.save.playerData.health) >= ((void)0, gSaveContext.save.playerData.healthCapacity)) {
- gSaveContext.save.playerData.health = gSaveContext.save.playerData.healthCapacity;
+ if (((void)0, gSaveContext.save.saveInfo.playerData.health) >=
+ ((void)0, gSaveContext.save.saveInfo.playerData.healthCapacity)) {
+ gSaveContext.save.saveInfo.playerData.health = gSaveContext.save.saveInfo.playerData.healthCapacity;
gSaveContext.healthAccumulator = 0;
}
}
@@ -6883,26 +6746,26 @@ void Interface_Update(PlayState* play) {
// Update rupees
if (gSaveContext.rupeeAccumulator != 0) {
if (gSaveContext.rupeeAccumulator > 0) {
- if (gSaveContext.save.playerData.rupees < CUR_CAPACITY(UPG_WALLET)) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < CUR_CAPACITY(UPG_WALLET)) {
gSaveContext.rupeeAccumulator--;
- gSaveContext.save.playerData.rupees++;
+ gSaveContext.save.saveInfo.playerData.rupees++;
play_sound(NA_SE_SY_RUPY_COUNT);
} else {
// Max rupees
- gSaveContext.save.playerData.rupees = CUR_CAPACITY(UPG_WALLET);
+ gSaveContext.save.saveInfo.playerData.rupees = CUR_CAPACITY(UPG_WALLET);
gSaveContext.rupeeAccumulator = 0;
}
- } else if (gSaveContext.save.playerData.rupees != 0) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees != 0) {
if (gSaveContext.rupeeAccumulator <= -50) {
gSaveContext.rupeeAccumulator += 10;
- gSaveContext.save.playerData.rupees -= 10;
- if (gSaveContext.save.playerData.rupees < 0) {
- gSaveContext.save.playerData.rupees = 0;
+ gSaveContext.save.saveInfo.playerData.rupees -= 10;
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0) {
+ gSaveContext.save.saveInfo.playerData.rupees = 0;
}
play_sound(NA_SE_SY_RUPY_COUNT);
} else {
gSaveContext.rupeeAccumulator++;
- gSaveContext.save.playerData.rupees--;
+ gSaveContext.save.saveInfo.playerData.rupees--;
play_sound(NA_SE_SY_RUPY_COUNT);
}
} else {
@@ -7035,29 +6898,31 @@ void Interface_Update(PlayState* play) {
if (!(player->stateFlags1 & PLAYER_STATE1_200)) {
if (R_MAGIC_DBG_SET_UPGRADE == MAGIC_DBG_SET_UPGRADE_DOUBLE_METER) {
// Upgrade to double magic
- if (!gSaveContext.save.playerData.isMagicAcquired) {
- gSaveContext.save.playerData.isMagicAcquired = true;
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ gSaveContext.save.saveInfo.playerData.isMagicAcquired = true;
}
- gSaveContext.save.playerData.isDoubleMagicAcquired = true;
- gSaveContext.save.playerData.magic = MAGIC_DOUBLE_METER;
- gSaveContext.save.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired = true;
+ gSaveContext.save.saveInfo.playerData.magic = MAGIC_DOUBLE_METER;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
R_MAGIC_DBG_SET_UPGRADE = MAGIC_DBG_SET_UPGRADE_NO_ACTION;
} else if (R_MAGIC_DBG_SET_UPGRADE == MAGIC_DBG_SET_UPGRADE_NORMAL_METER) {
// Upgrade to normal magic
- if (!gSaveContext.save.playerData.isMagicAcquired) {
- gSaveContext.save.playerData.isMagicAcquired = true;
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
+ gSaveContext.save.saveInfo.playerData.isMagicAcquired = true;
}
- gSaveContext.save.playerData.isDoubleMagicAcquired = false;
- gSaveContext.save.playerData.magic = MAGIC_NORMAL_METER;
- gSaveContext.save.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired = false;
+ gSaveContext.save.saveInfo.playerData.magic = MAGIC_NORMAL_METER;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
R_MAGIC_DBG_SET_UPGRADE = MAGIC_DBG_SET_UPGRADE_NO_ACTION;
}
- if ((gSaveContext.save.playerData.isMagicAcquired) && (gSaveContext.save.playerData.magicLevel == 0)) {
+ if ((gSaveContext.save.saveInfo.playerData.isMagicAcquired) &&
+ (gSaveContext.save.saveInfo.playerData.magicLevel == 0)) {
// Prepare to step `magicCapacity` to full capacity
- gSaveContext.save.playerData.magicLevel = gSaveContext.save.playerData.isDoubleMagicAcquired + 1;
- gSaveContext.magicFillTarget = gSaveContext.save.playerData.magic;
- gSaveContext.save.playerData.magic = 0;
+ gSaveContext.save.saveInfo.playerData.magicLevel =
+ gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired + 1;
+ gSaveContext.magicFillTarget = gSaveContext.save.saveInfo.playerData.magic;
+ gSaveContext.save.saveInfo.playerData.magic = 0;
gSaveContext.magicState = MAGIC_STATE_STEP_CAPACITY;
BUTTON_ITEM_EQUIP(PLAYER_FORM_DEKU, EQUIP_SLOT_B) = ITEM_NUT;
}
@@ -7071,7 +6936,7 @@ void Interface_Update(PlayState* play) {
if ((sEnvHazard == PLAYER_ENV_HAZARD_HOTROOM) || (sEnvHazard == PLAYER_ENV_HAZARD_UNDERWATER_FREE)) {
if (CUR_FORM != PLAYER_FORM_ZORA) {
if (play->gameOverCtx.state == GAMEOVER_INACTIVE) {
- if ((gSaveContext.save.playerData.health >> 1) != 0) {
+ if ((gSaveContext.save.saveInfo.playerData.health >> 1) != 0) {
gSaveContext.timerStates[TIMER_ID_ENV_HAZARD] = TIMER_STATE_ENV_HAZARD_START;
gSaveContext.timerX[TIMER_ID_ENV_HAZARD] = 115;
gSaveContext.timerY[TIMER_ID_ENV_HAZARD] = 80;
@@ -7204,7 +7069,7 @@ void Interface_Update(PlayState* play) {
void Interface_Destroy(PlayState* play) {
Map_Destroy(play);
- func_80174F9C(Interface_PostmanTimerCallback, NULL);
+ PadMgr_UnsetInputRetraceCallback(Interface_PostmanTimerCallback, NULL);
}
void Interface_Init(PlayState* play) {
diff --git a/src/code/z_path.c b/src/code/z_path.c
index 3c446d49a..76d7ce144 100644
--- a/src/code/z_path.c
+++ b/src/code/z_path.c
@@ -1,9 +1,9 @@
#include "global.h"
-Path* Path_GetByIndex(PlayState* play, s16 index, s16 max) {
+Path* Path_GetByIndex(PlayState* play, s16 index, s16 indexNone) {
Path* path;
- if (index != max) {
+ if (index != indexNone) {
path = &play->setupPathList[index];
} else {
path = NULL;
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 08309b32f..6ef734aee 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "buffers.h"
+#include "z64bombers_notebook.h"
#include "z64debug_display.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -7,7 +8,7 @@
#include "z64view.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
s32 gDbgCamEnabled = false;
@@ -358,10 +359,10 @@ void Play_Destroy(GameState* thisx) {
if (sBombersNotebookOpen) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gfxCtx->zbuffer = SysCfb_GetZBuffer();
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -505,41 +506,41 @@ void Play_UpdateWaterCamera(PlayState* this, Camera* camera) {
sIsCameraUnderwater = camera->stateFlags & CAM_STATE_UNDERWATER;
if (Play_GetWaterSurface(this, &camera->eye, &lightIndex) != BGCHECK_Y_MIN) {
if (!sIsCameraUnderwater) {
- Camera_SetFlags(camera, CAM_STATE_UNDERWATER);
+ Camera_SetStateFlag(camera, CAM_STATE_UNDERWATER);
sQuakeIndex = -1;
- Distortion_SetType(DISTORTION_TYPE_UNDERWATER_ENTRY);
- Distortion_SetCountdown(80);
+ Distortion_Request(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_SetDuration(80);
}
func_801A3EC0(0x20);
func_800F6834(this, lightIndex);
- if ((sQuakeIndex == -1) || (Quake_GetCountdown(sQuakeIndex) == 10)) {
- s16 quakeIndex = Quake_Add(camera, QUAKE_TYPE_5);
+ if ((sQuakeIndex == -1) || (Quake_GetTimeLeft(sQuakeIndex) == 10)) {
+ s16 quakeIndex = Quake_Request(camera, QUAKE_TYPE_5);
sQuakeIndex = quakeIndex;
if (quakeIndex != 0) {
Quake_SetSpeed(sQuakeIndex, 550);
- Quake_SetQuakeValues(sQuakeIndex, 1, 1, 180, 0);
- Quake_SetCountdown(sQuakeIndex, 1000);
+ Quake_SetPerturbations(sQuakeIndex, 1, 1, 180, 0);
+ Quake_SetDuration(sQuakeIndex, 1000);
}
}
if (player->stateFlags3 & PLAYER_STATE3_8000) {
- Distortion_SetType(DISTORTION_TYPE_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_Request(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_NON_ZORA_SWIMMING);
} else {
- Distortion_SetType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_Request(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
}
} else {
if (sIsCameraUnderwater) {
- Camera_ClearFlags(camera, CAM_STATE_UNDERWATER);
+ Camera_UnsetStateFlag(camera, CAM_STATE_UNDERWATER);
}
- Distortion_ClearType(DISTORTION_TYPE_NON_ZORA_SWIMMING);
- Distortion_ClearType(DISTORTION_TYPE_UNDERWATER_ENTRY);
- Distortion_ClearType(DISTORTION_TYPE_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_NON_ZORA_SWIMMING);
+ Distortion_RemoveRequest(DISTORTION_TYPE_UNDERWATER_ENTRY);
+ Distortion_RemoveRequest(DISTORTION_TYPE_ZORA_SWIMMING);
if (sQuakeIndex != 0) {
- Quake_Remove(sQuakeIndex);
+ Quake_RemoveRequest(sQuakeIndex);
}
func_800F694C(this);
func_801A3EC0(0);
@@ -566,11 +567,13 @@ void Play_UpdateTransition(PlayState* this) {
if ((!(Entrance_GetTransitionFlags(this->nextEntrance + sceneLayer) & 0x8000) ||
((this->nextEntrance == ENTRANCE(PATH_TO_MOUNTAIN_VILLAGE, 1)) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) ||
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) ||
((this->nextEntrance == ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1)) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) ||
- ((this->nextEntrance == ENTRANCE(TERMINA_FIELD, 2)) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) ||
- ((this->nextEntrance == ENTRANCE(ROAD_TO_IKANA, 1)) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20))) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) ||
+ ((this->nextEntrance == ENTRANCE(TERMINA_FIELD, 2)) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) ||
+ ((this->nextEntrance == ENTRANCE(ROAD_TO_IKANA, 1)) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE))) &&
(!func_800FE590(this) || (Entrance_GetSceneId(this->nextEntrance + sceneLayer) < 0) ||
(AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_FINAL_HOURS))) {
func_801A4058(20);
@@ -982,8 +985,8 @@ void Play_UpdateMain(PlayState* this) {
if (!this->haltAllActors) {
Actor_UpdateAll(this, &this->actorCtx);
}
- Cutscene_Update1(this, &this->csCtx);
- Cutscene_Update2(this, &this->csCtx);
+ Cutscene_UpdateManual(this, &this->csCtx);
+ Cutscene_UpdateScripted(this, &this->csCtx);
Effect_UpdateAll(this);
EffectSS_UpdateAllParticles(this);
EffFootmark_Update(this);
@@ -1034,9 +1037,9 @@ void Play_UpdateMain(PlayState* this) {
if (this->sramCtx.status != 0) {
if (gSaveContext.save.isOwlSave) {
- func_80147198(&this->sramCtx);
+ Sram_UpdateWriteToFlashOwlSave(&this->sramCtx);
} else {
- func_80147068(&this->sramCtx);
+ Sram_UpdateWriteToFlashDefault(&this->sramCtx);
}
}
}
@@ -1049,14 +1052,14 @@ void Play_Update(PlayState* this) {
if (!sBombersNotebookOpen) {
if (this->pauseCtx.bombersNotebookOpen) {
sBombersNotebookOpen = true;
- sBombersNotebook.unk_00 = 0;
+ sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE;
}
} else if (CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_L) ||
CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_B) ||
CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_START) || (gIrqMgrResetStatus != 0)) {
sBombersNotebookOpen = false;
this->pauseCtx.bombersNotebookOpen = false;
- sBombersNotebook.unk_00 = 0;
+ sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE;
this->msgCtx.msgLength = 0;
this->msgCtx.msgMode = 0;
this->msgCtx.currentTextId = 0;
@@ -1240,7 +1243,7 @@ void Play_DrawMain(PlayState* this) {
goto PostWorldDraw;
}
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_PROCESS) {
MsgEvent_SendNullTask();
@@ -1265,13 +1268,13 @@ void Play_DrawMain(PlayState* this) {
goto PostWorldDraw;
}
- if (this->unk_18844 == 0) {
+ if (!this->unk_18844) {
if (1) {
if ((this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) {
if ((this->skyboxId == SKYBOX_NORMAL_SKY) || (this->skyboxId == SKYBOX_3)) {
Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx);
- Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.unk_13, this->view.eye.x,
- this->view.eye.y, this->view.eye.z);
+ Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.skyboxBlend,
+ this->view.eye.x, this->view.eye.y, this->view.eye.z);
} else if (!this->skyboxCtx.skyboxShouldDraw) {
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
this->view.eye.z);
@@ -1440,24 +1443,24 @@ void Play_Draw(PlayState* this) {
GraphicsContext* gfxCtx2 = this->state.gfxCtx;
if (sBombersNotebookOpen) {
- if (D_801FBBD4 != 1) {
+ if (gSysCfbHiResEnabled != 1) {
MsgEvent_SendNullTask();
- func_80178818();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetHiResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
gfxCtx2->updateViMode = true;
}
} else {
- if (D_801FBBD4 != 0) {
+ if (gSysCfbHiResEnabled != 0) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
@@ -1501,12 +1504,12 @@ void Play_Main(GameState* thisx) {
*CONTROLLER1(&this->state) = input;
}
- ActorCutscene_Update();
- ActorCutscene_ClearWaiting();
+ CutsceneManager_Update();
+ CutsceneManager_ClearWaiting();
}
s32 Play_InCsMode(PlayState* this) {
- return (this->csCtx.state != 0) || Player_InCsMode(this);
+ return (this->csCtx.state != CS_STATE_IDLE) || Player_InCsMode(this);
}
f32 Play_GetFloorSurfaceImpl(PlayState* this, MtxF* mtx, CollisionPoly** poly, s32* bgId, Vec3f* pos) {
@@ -1679,11 +1682,11 @@ s32 Play_SetCameraAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
camera->dist = Math3D_Distance(at, eye);
if (camera->focalActor != NULL) {
- camera->atActorOffset.x = at->x - camera->focalActor->world.pos.x;
- camera->atActorOffset.y = at->y - camera->focalActor->world.pos.y;
- camera->atActorOffset.z = at->z - camera->focalActor->world.pos.z;
+ camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
+ camera->focalActorAtOffset.y = at->y - camera->focalActor->world.pos.y;
+ camera->focalActorAtOffset.z = at->z - camera->focalActor->world.pos.z;
} else {
- camera->atActorOffset.x = camera->atActorOffset.y = camera->atActorOffset.z = 0.0f;
+ camera->focalActorAtOffset.x = camera->focalActorAtOffset.y = camera->focalActorAtOffset.z = 0.0f;
}
camera->atLerpStepScale = 0.01f;
@@ -1708,11 +1711,11 @@ s32 Play_SetCameraAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
camera->dist = Math3D_Distance(at, eye);
if (camera->focalActor != NULL) {
- camera->atActorOffset.x = at->x - camera->focalActor->world.pos.x;
- camera->atActorOffset.y = at->y - camera->focalActor->world.pos.y;
- camera->atActorOffset.z = at->z - camera->focalActor->world.pos.z;
+ camera->focalActorAtOffset.x = at->x - camera->focalActor->world.pos.x;
+ camera->focalActorAtOffset.y = at->y - camera->focalActor->world.pos.y;
+ camera->focalActorAtOffset.z = at->z - camera->focalActor->world.pos.z;
} else {
- camera->atActorOffset.x = camera->atActorOffset.y = camera->atActorOffset.z = 0.0f;
+ camera->focalActorAtOffset.x = camera->focalActorAtOffset.y = camera->focalActorAtOffset.z = 0.0f;
}
camera->atLerpStepScale = 0.01f;
@@ -1746,13 +1749,13 @@ void Play_CopyCamera(PlayState* this, s16 destCamId, s16 srcCamId) {
Camera_Copy(this->cameraPtrs[destCamId1], this->cameraPtrs[srcCamId2]);
}
-// Same as Play_ChangeCameraSetting but also calls Camera_InitPlayerSettings
+// Same as Play_ChangeCameraSetting but also calls Camera_InitFocalActorSettings
s32 func_80169A50(PlayState* this, s16 camId, Player* player, s16 setting) {
Camera* camera;
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
camera = this->cameraPtrs[camIdx];
- Camera_InitPlayerSettings(camera, player);
+ Camera_InitFocalActorSettings(camera, &player->actor);
return Camera_ChangeSetting(camera, setting);
}
@@ -2015,37 +2018,47 @@ s32 Play_IsDebugCamEnabled(void) {
return gDbgCamEnabled;
}
-// A mapping from playerActorCsIds to sGlobalCamDataSettings indices.
-s16 D_801D0D64[] = { -3, -2, -4, -5, -7, -11, -8, -9, -6, -16 };
+// A mapping from playerCsIds to sGlobalCamDataSettings indices.
+s16 sPlayerCsIdToCsCamId[] = {
+ CS_CAM_ID_GLOBAL_ITEM_OCARINA, // PLAYER_CS_ID_ITEM_OCARINA
+ CS_CAM_ID_GLOBAL_ITEM_GET, // PLAYER_CS_ID_ITEM_GET
+ CS_CAM_ID_GLOBAL_ITEM_BOTTLE, // PLAYER_CS_ID_ITEM_BOTTLE
+ CS_CAM_ID_GLOBAL_ITEM_SHOW, // PLAYER_CS_ID_ITEM_SHOW
+ CS_CAM_ID_GLOBAL_WARP_PAD_MOON, // PLAYER_CS_ID_WARP_PAD_MOON
+ CS_CAM_ID_GLOBAL_MASK_TRANSFORMATION, // PLAYER_CS_ID_MASK_TRANSFORMATION
+ CS_CAM_ID_GLOBAL_DEATH, // PLAYER_CS_ID_DEATH
+ CS_CAM_ID_GLOBAL_REVIVE, // PLAYER_CS_ID_REVIVE
+ CS_CAM_ID_GLOBAL_SONG_WARP, // PLAYER_CS_ID_SONG_WARP
+ CS_CAM_ID_GLOBAL_WARP_PAD_ENTRANCE, // PLAYER_CS_ID_WARP_PAD_ENTRANCE
+};
// Used by Player
/**
- * Extract the common actor cutscene ids used by Player from the scene and set the actor cutscene ids in
- * this->playerActorCsIds. If a playerActorCsId is not present in the scene, then that particular id is set
- * to -1. Otherwise, if there is an ActorCutscene where csCamSceneDataId matches the appropriate element of D_801D0D64,
- * set the corresponding playerActorCsId (and possibly change its priority for the zeroth one)
+ * Extract the common cutscene ids used by Player from the scene and set the cutscene ids in this->playerCsIds.
+ * If a playerCsId is not present in the scene, then that particular id is set to CS_ID_NONE.
+ * Otherwise, if there is an ActorCutscene where csCamId matches the appropriate element of sPlayerCsIdToCsCamId,
+ * set the corresponding playerActorCsId (and possibly change its priority for the zeroth one).
*/
-void Play_AssignPlayerActorCsIdsFromScene(GameState* thisx, s32 startActorCsId) {
+void Play_AssignPlayerCsIdsFromScene(GameState* thisx, s32 spawnCsId) {
PlayState* this = (PlayState*)thisx;
s32 i;
- s16* curPlayerActorCsId = this->playerActorCsIds;
- s16* phi_s1 = D_801D0D64;
+ s16* curPlayerCsId = this->playerCsIds;
+ s16* csCamId = sPlayerCsIdToCsCamId;
- for (i = 0; i < ARRAY_COUNT(this->playerActorCsIds); i++, curPlayerActorCsId++, phi_s1++) {
- ActorCutscene* actorCutscene;
- s32 curActorCsId;
+ for (i = 0; i < ARRAY_COUNT(this->playerCsIds); i++, curPlayerCsId++, csCamId++) {
+ ActorCutscene* csEntry;
+ s32 curCsId;
- *curPlayerActorCsId = -1;
+ *curPlayerCsId = CS_ID_NONE;
- for (curActorCsId = startActorCsId; curActorCsId != -1; curActorCsId = actorCutscene->additionalCutscene) {
- actorCutscene = ActorCutscene_GetCutscene(curActorCsId);
+ for (curCsId = spawnCsId; curCsId != CS_ID_NONE; curCsId = csEntry->additionalCsId) {
+ csEntry = CutsceneManager_GetCutsceneEntry(curCsId);
- if (actorCutscene->csCamSceneDataId == *phi_s1) {
- if ((actorCutscene->csCamSceneDataId == -3) &&
- (actorCutscene->priority == 700)) { // override ocarina cs priority
- actorCutscene->priority = 550;
+ if (csEntry->csCamId == *csCamId) {
+ if ((csEntry->csCamId == CS_CAM_ID_GLOBAL_ITEM_OCARINA) && (csEntry->priority == 700)) {
+ csEntry->priority = 550;
}
- *curPlayerActorCsId = curActorCsId;
+ *curPlayerCsId = curCsId;
break;
}
}
@@ -2100,7 +2113,7 @@ void Play_Init(GameState* thisx) {
scene = ((void)0, gSaveContext.save.entrance) >> 9;
spawn = (((void)0, gSaveContext.save.entrance) >> 4) & 0x1F;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
if (scene == ENTR_SCENE_MOUNTAIN_VILLAGE_WINTER) {
scene = ENTR_SCENE_MOUNTAIN_VILLAGE_SPRING;
} else if (scene == ENTR_SCENE_GORON_VILLAGE_WINTER) {
@@ -2114,7 +2127,7 @@ void Play_Init(GameState* thisx) {
}
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
if (scene == ENTR_SCENE_SOUTHERN_SWAMP_POISONED) {
scene = ENTR_SCENE_SOUTHERN_SWAMP_CLEARED;
} else if (scene == ENTR_SCENE_WOODFALL) {
@@ -2122,11 +2135,11 @@ void Play_Init(GameState* thisx) {
}
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) && (scene == ENTR_SCENE_IKANA_CANYON)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) && (scene == ENTR_SCENE_IKANA_CANYON)) {
gSaveContext.nextCutsceneIndex = 0xFFF2;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80) &&
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE) &&
((scene == ENTR_SCENE_GREAT_BAY_COAST) || (scene == ENTR_SCENE_ZORA_CAPE))) {
gSaveContext.nextCutsceneIndex = 0xFFF0;
}
@@ -2167,7 +2180,8 @@ void Play_Init(GameState* thisx) {
this->cameraPtrs[CAM_ID_MAIN]->uid = CAM_ID_MAIN;
this->activeCamId = CAM_ID_MAIN;
- func_800DFF18(&this->mainCamera, 0x7F);
+ Camera_OverwriteStateFlags(&this->mainCamera, CAM_STATE_0 | CAM_STATE_CHECK_WATER | CAM_STATE_2 | CAM_STATE_3 |
+ CAM_STATE_4 | CAM_STATE_DISABLE_MODE_CHANGE | CAM_STATE_6);
Sram_Alloc(&this->state, &this->sramCtx);
Regs_InitData(this);
Message_Init(this);
@@ -2178,15 +2192,15 @@ void Play_Init(GameState* thisx) {
EffectSS_Init(this, 100);
CollisionCheck_InitContext(this, &this->colChkCtx);
AnimationContext_Reset(&this->animationCtx);
- Cutscene_Init(this, &this->csCtx);
+ Cutscene_InitContext(this, &this->csCtx);
if (gSaveContext.nextCutsceneIndex != 0xFFEF) {
- gSaveContext.save.cutscene = gSaveContext.nextCutsceneIndex;
+ gSaveContext.save.cutsceneIndex = gSaveContext.nextCutsceneIndex;
gSaveContext.nextCutsceneIndex = 0xFFEF;
}
- if (gSaveContext.save.cutscene == 0xFFFD) {
- gSaveContext.save.cutscene = 0;
+ if (gSaveContext.save.cutsceneIndex == 0xFFFD) {
+ gSaveContext.save.cutsceneIndex = 0;
}
if (gSaveContext.nextDayTime != 0xFFFF) {
@@ -2203,13 +2217,13 @@ void Play_Init(GameState* thisx) {
func_800EDDB0(this);
if (((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN)) ||
- (gSaveContext.save.cutscene >= 0xFFF0)) {
- gSaveContext.unk_3DC0 = 0;
+ (gSaveContext.save.cutsceneIndex >= 0xFFF0)) {
+ gSaveContext.nayrusLoveTimer = 0;
Magic_Reset(this);
- gSaveContext.sceneLayer = (gSaveContext.save.cutscene & 0xF) + 1;
+ gSaveContext.sceneLayer = (gSaveContext.save.cutsceneIndex & 0xF) + 1;
// Set saved cutscene to 0 so it doesn't immediately play, but instead let the `CutsceneManager` handle it.
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
} else {
gSaveContext.sceneLayer = 0;
}
@@ -2239,10 +2253,10 @@ void Play_Init(GameState* thisx) {
R_PICTO_PHOTO_STATE = PICTO_PHOTO_STATE_OFF;
PreRender_Init(&this->pauseBgPreRender);
- PreRender_SetValuesSave(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL, NULL);
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL);
+ PreRender_SetValuesSave(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL, NULL);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL);
- this->unk_18E64 = D_801FBB90;
+ this->unk_18E64 = gWorkBuffer;
this->pictoPhotoI8 = gPictoPhotoI8;
this->unk_18E68 = D_80784600;
this->unk_18E58 = D_80784600;
@@ -2295,7 +2309,7 @@ void Play_Init(GameState* thisx) {
D_801F6D4C->envColor.g = 0;
D_801F6D4C->envColor.b = 0;
D_801F6D4C->envColor.a = 0;
- EnvFlags_UnsetAll(this);
+ CutsceneFlags_UnsetAll(this);
THA_GetRemaining(&this->state.heap);
zAllocSize = THA_GetRemaining(&this->state.heap);
zAlloc = (uintptr_t)THA_AllocTailAlign16(&this->state.heap, zAllocSize);
@@ -2311,24 +2325,21 @@ void Play_Init(GameState* thisx) {
player = GET_PLAYER(this);
- Camera_InitPlayerSettings(&this->mainCamera, player);
+ Camera_InitFocalActorSettings(&this->mainCamera, &player->actor);
gDbgCamEnabled = false;
- if ((player->actor.params & 0xFF) != 0xFF) {
- Camera_ChangeDataIdx(&this->mainCamera, player->actor.params & 0xFF);
+ if (PLAYER_GET_BG_CAM_INDEX(&player->actor) != 0xFF) {
+ Camera_ChangeActorCsCamIndex(&this->mainCamera, PLAYER_GET_BG_CAM_INDEX(&player->actor));
}
- func_800F15D8(&this->mainCamera);
+ CutsceneManager_StoreCamera(&this->mainCamera);
Interface_SetSceneRestrictions(this);
func_800FB758(this);
gSaveContext.seqId = this->sequenceCtx.seqId;
gSaveContext.ambienceId = this->sequenceCtx.ambienceId;
AnimationContext_Update(this, &this->animationCtx);
- func_800EDBE0(this);
+ Cutscene_HandleEntranceTriggers(this);
gSaveContext.respawnFlag = 0;
sBombersNotebookOpen = false;
BombersNotebook_Init(&sBombersNotebook);
}
-
-//! TODO: fake symbol, remove when BombersNotebook_Update is matching
-u16 D_801D0D78[] = { 0, 0, 0, 0 };
diff --git a/src/code/z_play_hireso.c b/src/code/z_play_hireso.c
index 829fe71f2..b995028ca 100644
--- a/src/code/z_play_hireso.c
+++ b/src/code/z_play_hireso.c
@@ -1,27 +1,1363 @@
#include "global.h"
+#include "z64bombers_notebook.h"
+#include "interface/schedule_static/schedule_static.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AC10.s")
+// TODO: Needs YAZ0
+// Segment 0x07 schedule_dma_static_test
+extern TexturePtr D_07000000;
+extern TexturePtr D_07000800;
+extern TexturePtr D_07001000;
+extern TexturePtr D_07001800;
+extern TexturePtr D_07002000;
+extern TexturePtr D_07002800;
+extern TexturePtr D_07003000;
+extern TexturePtr D_07003800;
+extern TexturePtr D_07004000;
+extern TexturePtr D_07004800;
+extern TexturePtr D_07005000;
+extern TexturePtr D_07005800;
+extern TexturePtr D_07006000;
+extern TexturePtr D_07006800;
+extern TexturePtr D_07007000;
+extern TexturePtr D_07007800;
+extern TexturePtr D_07008000;
+extern TexturePtr D_07008800;
+extern TexturePtr D_07009000;
+extern TexturePtr D_07009800;
+extern TexturePtr D_0700AC00;
+extern TexturePtr D_0700AEA0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AE1C.s")
+#define BOMBERS_NOTEBOOK_ENTRY_SIZE 3
+#define BOMBERS_NOTEBOOK_ENTRY_MAX 10
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B278.s")
+#define BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, entry) (((&sBombersNotebookEntries[row][entry])[0] & 0xF00) >> 8)
+#define BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, entry) ((&sBombersNotebookEntries[row][entry])[0] & 0xFF)
+#define BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[1])
+#define BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[2])
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B4B0.s")
+#define BOMBERS_NOTEBOOK_ENTRY(pos, day, event, startTime, endTime) \
+ ((pos)&0xF000) | (((day)&0xF) << 8) | ((event)&0xFF), (startTime), (endTime)
+#define BOMBERS_NOTEBOOK_ENTRY_END 0x9999
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016C344.s")
+#define BOMBERS_NOTEBOOK_ENTRY_POS_CENTER 0x0000
+#define BOMBERS_NOTEBOOK_ENTRY_POS_BELOW 0x4000
+#define BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE 0x8000
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016CD4C.s")
+typedef enum {
+ /* 0 */ BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT,
+ /* 1 */ BOMBERS_NOTEBOOK_EVENT_ICON_MASK,
+ /* 2 */ BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON
+} BombersNotebookEventIcon;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016E40C.s")
+#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE 0xFFF0
+#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI 0xFFF1
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016EA90.s")
+u16 sBombersNotebookEntries[BOMBERS_NOTEBOOK_PERSON_MAX][BOMBERS_NOTEBOOK_ENTRY_MAX * BOMBERS_NOTEBOOK_ENTRY_SIZE] = {
+ {
+ /* Bombers */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Anju */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY,
+ CLOCK_TIME(13, 45), CLOCK_TIME(16, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING,
+ CLOCK_TIME(14, 30), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI,
+ CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI,
+ CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(17, 0),
+ CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3,
+ BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(6, 0),
+ CLOCK_TIME(12, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
+ CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Kafei */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, CLOCK_TIME(16, 30),
+ CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT,
+ CLOCK_TIME(18, 0), CLOCK_TIME(19, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
+ CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Curiosity Shop Man */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK,
+ CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL,
+ CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK,
+ CLOCK_TIME(22, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Old Lady from Bomb Shop */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK,
+ CLOCK_TIME(0, 30), CLOCK_TIME(1, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Romani */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM,
+ CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE,
+ CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Cremia */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Mayor Dotour */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Madame Aroma */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Toto */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Gorman */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Postman */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
+ CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
+ CLOCK_TIME(6, 0), CLOCK_TIME(12, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
+ CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Rosa Sisters */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* ??? */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Anju's Grandmother */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Kamaro */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Grog */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Gorman Brothers */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Shiro */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Guru-Guru */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s")
+s16 sBombersNotebookDayRectRectLeft[] = { 120, 120, 270, 420 };
+TexturePtr sBombersNotebookDayTextures[] = {
+ gBombersNotebookDay1stTex,
+ gBombersNotebookDay2ndTex,
+ gBombersNotebookDayFinalTex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016F4EC.s")
+#define DEFINE_EVENT(_enum, icon, _colorFlag, _description, _completedMessage, _completedFlag) icon,
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s")
+s32 sBombersNotebookEventIcons[] = {
+#include "tables/bombers_notebook/event_table.h"
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s")
+#undef DEFINE_EVENT
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s")
+s32 sBombersNotebookEventIconWidths[] = { 16, 24, 32 };
+s32 sBombersNotebookEventIconHeights[] = { 16, 28, 28 };
+
+#define DEFINE_EVENT(_enum, _icon, colorFlag, _description, _completedMessage, _completedFlag) colorFlag,
+
+u16 sBombersNotebookEventColorWeekEventFlags[] = {
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_EVENT
+
+void BombersNotebook_DrawScisTexRect(Gfx** gfxP, s32 rxl, s32 ryl, s32 rxh, s32 ryh, s32 tile, s32 s, s32 t, s32 dsdx,
+ s32 dtdy) {
+ s32 xl = rxl - (gCfbLeftAdjust * 4);
+ s32 yl = ryl - (gCfbUpperAdjust * 4);
+ s32 xh = rxh - (gCfbLeftAdjust * 4);
+ s32 yh = ryh - (gCfbUpperAdjust * 4);
+ Gfx* gfx = *gfxP;
+
+ gSPScisTextureRectangle(gfx++, xl, yl, xh, yh, tile, s, t, dsdx, dtdy);
+
+ *gfxP = gfx;
+}
+
+s16 sBombersNotebookHeaderColors[][3] = {
+ { 116, 134, 146 }, // Column 1
+ { 158, 156, 131 }, // Column 2
+ { 174, 141, 151 }, // Column 3
+};
+
+void BombersNotebook_DrawHeaders(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s32 i;
+ s32 rectLeft;
+
+ gDPLoadTextureBlock(gfx++, gBombersNotebookHeaderBoxTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ for (i = 0, rectLeft = 120; i < ARRAY_COUNT(sBombersNotebookHeaderColors); i++, rectLeft += 150) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookHeaderColors[i][0], sBombersNotebookHeaderColors[i][1],
+ sBombersNotebookHeaderColors[i][2], 192);
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 74 * 4, (rectLeft + 143) * 4, 98 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ for (i = 0, rectLeft = 124; i < ARRAY_COUNT(sBombersNotebookDayTextures); i++, rectLeft += 150) {
+ gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 48, 22, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 77 * 4, (rectLeft + 48) * 4, 99 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ }
+
+ rectLeft = 172;
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebook1800Tex, G_IM_FMT_IA, 48, 11, 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);
+ for (i = 0; i < 3; i++) {
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 86 * 4, (rectLeft + 48) * 4, 97 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ rectLeft += 150;
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+// Each column/day gets subdivided into 4 sub columns, the first 2 sub columns use 1 color, the last 2 another
+s16 sBombersNotebookColumnColors[][2][3] = {
+ { { 165, 183, 195 }, { 140, 158, 170 } }, // Column 1
+ { { 197, 195, 172 }, { 172, 170, 147 } }, // Column 2
+ { { 223, 190, 200 }, { 190, 165, 175 } }, // Column 3
+};
+
+void BombersNotebook_DrawColumns(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s16* color;
+ s32 i;
+ s32 j;
+ s32 k;
+ s32 columnRectLeft;
+ s32 subColumnRectLeft;
+ s32 pad;
+
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookSubColumnBoxTex, G_IM_FMT_I, 48, 1, 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);
+
+ color = &sBombersNotebookColumnColors[0][0][0];
+ for (i = 0, columnRectLeft = 120; i < ARRAY_COUNT(sBombersNotebookColumnColors); i++, columnRectLeft += 150) {
+ subColumnRectLeft = columnRectLeft;
+ for (j = 0; j < 2; j++) {
+ gDPSetPrimColor(gfx++, 0, 0, color[0], color[1], color[2], 192);
+ for (k = 0; k < 2; k++) {
+ BombersNotebook_DrawScisTexRect(&gfx, subColumnRectLeft * 4, 104 * 4, (subColumnRectLeft + 48) * 4,
+ 480 * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ subColumnRectLeft += 36;
+ }
+ color += 3;
+ }
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+TexturePtr sBombersNotebookEventIconTextures[] = {
+ gBombersNotebookEntryIconExclamationPointTex,
+ &D_0700AC00,
+ &D_0700AEA0,
+};
+s16 sBombersNotebookEntryIconColors[][3] = {
+ { 255, 255, 0 },
+ { 141, 255, 182 },
+ { 255, 100, 60 },
+};
+
+void BombersNotebook_DrawEntries(Gfx** gfxP, s32 row, u32 rectTop) {
+ Gfx* gfx = *gfxP;
+ s32 entryRectLeft;
+ u32 eventIcon;
+ u32 unfinishedEvent = false;
+ u16 startTime;
+ u16 endTime;
+ s32 j = 0;
+ u32 iconRectLeft;
+ s32 entryRectRight;
+ u32 yOffset;
+ s32 entryWidth;
+
+ while (true) {
+ if (sBombersNotebookEntries[row][j] == BOMBERS_NOTEBOOK_ENTRY_END) {
+ if (!unfinishedEvent) {
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookStampTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 48, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, 567 * 4, (rectTop + 1) * 4, 599 * 4, (rectTop + 49) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPSetEnvColor(gfx++, 255, 0, 0, 255);
+ BombersNotebook_DrawScisTexRect(&gfx, 565 * 4, (rectTop + -1) * 4, 597 * 4, (rectTop + 47) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ }
+ break;
+ }
+
+ if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset = 8;
+ } else if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
+ yOffset = 24;
+ } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset = 16;
+ }
+
+ startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, j) - CLOCK_TIME(6, 0);
+ endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, j) - CLOCK_TIME(6, 0);
+ entryRectLeft =
+ sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (startTime / CLOCK_TIME(0, 10));
+ entryRectRight =
+ sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (endTime / CLOCK_TIME(0, 10));
+ entryWidth = entryRectRight - entryRectLeft - 8;
+ if ((entryRectRight - entryRectLeft) < 8) {
+ entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
+ entryRectRight = entryRectLeft + 8;
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectLeft + 6) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -2) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectRight + 2) * 4, (rectTop + yOffset + 18) * 4, 0, 0x80, 0, 1 << 10,
+ 1 << 10);
+ if (entryWidth > 0) {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 6) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectLeft + 6 + entryWidth) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ //! FAKE: the ^ 0
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft * 4) ^ 0, (rectTop + yOffset) * 4, (entryRectLeft + 4) * 4,
+ (rectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ //! FAKE: the ^ 0
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -4) * 4, (rectTop + yOffset) * 4,
+ (entryRectRight * 4) ^ 0, (rectTop + yOffset + 16) * 4, 0, 0x80, 0, 1 << 10,
+ 1 << 10);
+ if (entryWidth > 0) {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 4) * 4, (rectTop + yOffset) * 4,
+ (entryRectLeft + 4 + entryWidth) * 4, (rectTop + yOffset + 16) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ }
+
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j)])) {
+ eventIcon =
+ sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - BOMBERS_NOTEBOOK_PERSON_MAX];
+ if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[eventIcon]) {
+ iconRectLeft =
+ (((entryRectLeft - sBombersNotebookEventIconWidths[eventIcon]) + entryRectRight) - entryRectLeft) +
+ 3;
+ } else {
+ iconRectLeft = (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[eventIcon]) / 2) +
+ entryRectLeft;
+ }
+
+ if ((eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
+ if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset -= 12;
+ } else if (!(sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
+ // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset -= 6;
+ }
+ }
+ gDPLoadTextureBlock(gfx++, sBombersNotebookEventIconTextures[eventIcon], G_IM_FMT_IA, G_IM_SIZ_8b,
+ sBombersNotebookEventIconWidths[eventIcon], sBombersNotebookEventIconHeights[eventIcon],
+ 0, G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (iconRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
+ (iconRectLeft + 2 + sBombersNotebookEventIconWidths[eventIcon]) * 4,
+ (rectTop + yOffset + 2 + sBombersNotebookEventIconHeights[eventIcon]) * 4,
+ 0, 0, 0, 1 << 10, 1 << 10);
+ if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX] ==
+ BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX] ==
+ BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN)) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
+ }
+ } else {
+ if (CHECK_WEEKEVENTREG(
+ sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX])) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
+ }
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, iconRectLeft * 4, (rectTop + yOffset) * 4,
+ (iconRectLeft + sBombersNotebookEventIconWidths[eventIcon]) * 4,
+ (rectTop + yOffset + sBombersNotebookEventIconHeights[eventIcon]) * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ } else {
+ unfinishedEvent = true;
+ }
+ j += BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ }
+
+ *gfxP = gfx;
+}
+
+#define DEFINE_PERSON(_enum, photo, _description, _metEnum, _metMessage, _metFlag) &photo,
+
+TexturePtr sBombersNotebookPhotoTextures[] = {
+#include "tables/bombers_notebook/person_table.h"
+};
+
+#undef DEFINE_PERSON
+
+void BombersNotebook_DrawRows(BombersNotebook* this, Gfx** gfxP) {
+ static s16 sBarColorR = 0;
+ static s16 sBarColorG = 0;
+ static s16 sBarColorB = 0;
+ static s16 sBarColorTimer = 10;
+ static s16 sBarColorIndex = 0;
+ static s16 sBarColorTargetsR[] = { 100, 0 };
+ static s16 sBarColorTargetsG[] = { 80, 0 };
+ static s16 sBarColorTargetsB[] = { 255, 0 };
+ Gfx* gfx = *gfxP;
+ s32 photoWidth;
+ s32 rowEnd;
+ s32 cursorPage;
+ u32 barRectLeft;
+ f32 photoRectDs;
+ u32 photoOffset;
+ s32 i;
+ u32 rectTop;
+ s16 colorStep;
+
+ colorStep = ABS_ALT(sBarColorR - sBarColorTargetsR[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorR >= sBarColorTargetsR[sBarColorIndex]) {
+ sBarColorR -= colorStep;
+ } else {
+ sBarColorR += colorStep;
+ }
+
+ colorStep = ABS_ALT(sBarColorG - sBarColorTargetsG[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorG >= sBarColorTargetsG[sBarColorIndex]) {
+ sBarColorG -= colorStep;
+ } else {
+ sBarColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sBarColorB - sBarColorTargetsB[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorB >= sBarColorTargetsB[sBarColorIndex]) {
+ sBarColorB -= colorStep;
+ } else {
+ sBarColorB += colorStep;
+ }
+
+ sBarColorTimer--;
+ if (sBarColorTimer == 0) {
+ sBarColorTimer = 10;
+ sBarColorR = sBarColorTargetsR[sBarColorIndex];
+ sBarColorG = sBarColorTargetsG[sBarColorIndex];
+ sBarColorB = sBarColorTargetsB[sBarColorIndex];
+ sBarColorIndex ^= 1;
+ }
+
+ rectTop = this->scrollOffset + 107;
+ if (this->cursorPage >= (BOMBERS_NOTEBOOK_PERSON_MAX - 8)) {
+ rowEnd = BOMBERS_NOTEBOOK_PERSON_MAX;
+ i = this->cursorPage;
+ } else {
+ rowEnd = this->cursorPage + 8;
+ i = rowEnd - 8;
+ }
+ cursorPage = i;
+ for (; i < rowEnd; i++, rectTop += 52) {
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
+ gDPLoadTextureBlock(gfx++, sBombersNotebookPhotoTextures[i], G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+ } else {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEmptyPhotoTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+ }
+ if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
+ barRectLeft = 56;
+ photoOffset = 8;
+ photoRectDs = 200.0f;
+ photoWidth = 64;
+ } else {
+ barRectLeft = 48;
+ photoOffset = 0;
+ photoRectDs = 150.0f;
+ photoWidth = 48;
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, (57 - photoOffset) * 4, (rectTop - photoOffset) * 4,
+ (57 - photoOffset + photoWidth) * 4, (rectTop - photoOffset + photoWidth) * 4,
+ 0, 0, 0, 1024.0f / (photoRectDs / 100.0f), 1024.0f / (photoRectDs / 100.0f));
+
+ if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
+ gDPSetPrimColor(gfx++, 0, 0, sBarColorR, sBarColorG, sBarColorB, 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 60);
+ }
+ gDPLoadTextureBlock(gfx++, gBombersNotebookBarTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 4, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft + 57) * 4, (rectTop + 22) * 4,
+ (barRectLeft - photoOffset + 527) * 4, (rectTop + 26) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, 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);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft - photoOffset + 527) * 4, (rectTop + 16) * 4,
+ (barRectLeft - photoOffset + 543) * 4, (rectTop + 32) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+
+ BombersNotebook_DrawEntries(&gfx, i, rectTop);
+
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ }
+ }
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+TexturePtr sBombersNotebookDigitTextures[] = {
+ gBombersNotebookDigit0Tex, gBombersNotebookDigit1Tex, gBombersNotebookDigit2Tex, gBombersNotebookDigit3Tex,
+ gBombersNotebookDigit4Tex, gBombersNotebookDigit5Tex, gBombersNotebookDigit6Tex, gBombersNotebookDigit7Tex,
+ gBombersNotebookDigit8Tex, gBombersNotebookDigit9Tex,
+};
+u8 sBombersNotebookDigitRectLeftOffsets[] = { 13, 8, 12, 13, 14, 13, 12, 12, 13, 12 };
+s16 sBombersNotebookDayTexRectLeftOffsets[] = { 16, 12, 9 };
+
+#define CURRENT_DAY_CLAMP_MIN_1 ((CURRENT_DAY == 0) ? 1 : CURRENT_DAY)
+void BombersNotebook_DrawTimeOfDay(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ u32 timeOfDayRectLeft;
+ u32 timeBoxRectLeft;
+ u32 connectorRectLeft;
+ u32 lineRectLeft;
+ u32 digitsRectLeft;
+ u16 time;
+ s32 onesDigit;
+ s32 tensDigit;
+ s32 hours;
+
+ time = (((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0));
+ if (CURRENT_DAY == 0) {
+ time = 0;
+ }
+ timeOfDayRectLeft = sBombersNotebookDayRectRectLeft[CURRENT_DAY] + (time / CLOCK_TIME(0, 10));
+ if ((CURRENT_DAY_CLAMP_MIN_1 == 1) ||
+ ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (((void)0, gSaveContext.save.time) < CLOCK_TIME(12, 0)))) {
+ timeOfDayRectLeft -= 32;
+ lineRectLeft = timeOfDayRectLeft + 32;
+ } else if ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time >= (CLOCK_TIME(17, 0) - CLOCK_TIME(6, 0))) &&
+ (time <= (CLOCK_TIME(19, 0) - CLOCK_TIME(6, 0)))) {
+ timeOfDayRectLeft -= 64;
+ lineRectLeft = timeOfDayRectLeft + 64;
+ } else {
+ timeOfDayRectLeft -= 96;
+ lineRectLeft = timeOfDayRectLeft + 96;
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNoteoobkTimeOfDayBoxTex, G_IM_FMT_IA, 64, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, timeOfDayRectLeft * 4, 42 * 4, (timeOfDayRectLeft + 128) * 4, 70 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeOfDayTex, G_IM_FMT_I, 96, 20, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (timeOfDayRectLeft + 16) * 4, 47 * 4, (timeOfDayRectLeft + 112) * 4, 67 * 4,
+ 0, 0, 0, 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ if (((CURRENT_DAY_CLAMP_MIN_1 >= 3) ||
+ ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time > (CLOCK_TIME(18, 0) - CLOCK_TIME(6, 0)))))) {
+ timeBoxRectLeft = timeOfDayRectLeft - 159;
+ connectorRectLeft = timeOfDayRectLeft - 17;
+ } else {
+ timeBoxRectLeft = timeOfDayRectLeft + 130;
+ connectorRectLeft = timeOfDayRectLeft + 113;
+ }
+
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxLeftTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, timeBoxRectLeft * 4, 42 * 4, (timeBoxRectLeft + 16) * 4, 70 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxMiddleTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 16) * 4, 42 * 4, (timeBoxRectLeft + 141) * 4, 70 * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxRightTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 141) * 4, 42 * 4, (timeBoxRectLeft + 157) * 4, 70 * 4, 0,
+ 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[CURRENT_DAY_CLAMP_MIN_1 - 1], G_IM_FMT_IA, G_IM_SIZ_8b, 48,
+ 22, 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);
+ BombersNotebook_DrawScisTexRect(
+ &gfx, (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1]) * 4, 46 * 4,
+ (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1] + 48) * 4, 68 * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 56) * 4, 48 * 4, (timeBoxRectLeft + 72) * 4, 0x100, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+
+ tensDigit = 0;
+ onesDigit = ((void)0, gSaveContext.save.time) / CLOCK_TIME_HOUR;
+ if (CURRENT_DAY == 0) {
+ onesDigit = 6;
+ }
+ hours = onesDigit;
+ do {
+ if (onesDigit >= 10) {
+ tensDigit++;
+ onesDigit -= 10;
+ }
+ } while (onesDigit >= 10);
+
+ digitsRectLeft = timeBoxRectLeft + 75;
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[onesDigit];
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookColonTex, G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += 7;
+ tensDigit = 0;
+ if (CURRENT_DAY == 0) {
+ onesDigit = TIME_TO_MINUTES_ALT_F((CLOCK_TIME_F(6, 0) - (hours * CLOCK_TIME_HOUR_F)));
+ } else {
+ onesDigit = TIME_TO_MINUTES_ALT_F(((void)0, gSaveContext.save.time) - (hours * CLOCK_TIME_HOUR_F));
+ }
+ do {
+ if (onesDigit >= 10) {
+ tensDigit++;
+ onesDigit -= 10;
+ }
+ } while (onesDigit >= 10);
+
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 14, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, connectorRectLeft * 4, 49 * 4, (connectorRectLeft + 32) * 4, 63 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPSetPrimColor(gfx++, 0, 0, 242, 0, 14, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookLineTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 1, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, lineRectLeft * 4, 74 * 4, (lineRectLeft + 32) * 4, 490 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPSetEnvColor(gfx++, 200, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (lineRectLeft + -11) * 4, 70 * 4, (lineRectLeft + 13) * 4, 86 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_DrawCursor(BombersNotebook* this, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s32 cursorRow;
+ s32 cursorEntry;
+ s32 entryRectRight;
+ s32 entryRectLeft;
+ s32 entryIcon;
+ u32 cursorRectLeft;
+ u32 cursorRectTop;
+ u32 yOffset;
+ u16 startTime;
+ u16 endTime;
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 205, 55, 255);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_MIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD);
+
+ if (this->cursorEntry == 0) {
+ BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 97) * 4, 63 * 4,
+ (this->cursorPageRow * 52 + 113) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 97) * 4, 114 * 4,
+ (this->cursorPageRow * 52 + 113) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 147) * 4, 63 * 4,
+ (this->cursorPageRow * 52 + 163) * 4, 0, 0, 0x200, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 147) * 4, 114 * 4,
+ (this->cursorPageRow * 52 + 163) * 4, 0, 0x200, 0x200, 1 << 10, 1 << 10);
+ } else {
+ cursorRow = this->cursorPageRow + this->cursorPage;
+ cursorRectTop = (this->cursorPageRow * 52) + 107;
+ cursorEntry = this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE; // Offset from photo entry
+ if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset = 8;
+ } else if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
+ yOffset = 24;
+ } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset = 16;
+ }
+
+ startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
+ endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
+ entryRectLeft = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
+ (startTime / CLOCK_TIME(0, 10));
+ entryRectRight = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
+ (endTime / CLOCK_TIME(0, 10));
+ if ((entryRectRight - entryRectLeft) < 8) {
+ entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
+ entryRectRight = entryRectLeft + 8;
+ }
+ entryIcon = sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(cursorRow, cursorEntry) -
+ BOMBERS_NOTEBOOK_PERSON_MAX];
+ if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[entryIcon]) {
+ cursorRectLeft =
+ (((entryRectLeft - sBombersNotebookEventIconWidths[entryIcon]) + entryRectRight) - entryRectLeft) + 3;
+ } else {
+ cursorRectLeft =
+ (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[entryIcon]) / 2) + entryRectLeft;
+ }
+ if (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT) {
+ cursorRectLeft -= 8;
+ cursorRectTop -= 8;
+ } else {
+ cursorRectLeft -= 9;
+ cursorRectTop -= 8;
+ }
+ if ((entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
+ if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset -= 12;
+ } else if (!(sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
+ // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset -= 6;
+ }
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, cursorRectLeft * 4, (cursorRectTop + yOffset) * 4,
+ (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
+ (cursorRectTop + yOffset) * 4,
+ (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
+ (cursorRectTop + yOffset + 16) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(
+ &gfx, cursorRectLeft * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
+ (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) * 4,
+ 0, 0, 0x200, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
+ (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
+ (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
+ (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) *
+ 4,
+ 0, 0x200, 0x200, 1 << 10, 1 << 10);
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_DrawArrows(BombersNotebook* this, Gfx** gfxP) {
+ static s16 sUpperArrowColorR = 0;
+ static s16 sUpperArrowColorG = 100;
+ static s16 sUpperArrowColorB = 255;
+ static s16 sLowerArrowColorR = 0;
+ static s16 sLowerArrowColorG = 100;
+ static s16 sLowerArrowColorB = 255;
+ static s16 sUpperArrowColorIndex = 0;
+ static s16 sLowerArrowColorIndex = 0;
+ static s16 sUpperArrowColorTimer = 6;
+ static s16 sLowerArrowColorTimer = 6;
+ static s16 sUpperArrowOffsetY = 0;
+ static s16 sLowerArrowOffsetY = 0;
+ static s16 sArrowColorTargetsG[] = { 175, 100 };
+ static s16 sArrowColorTargetsB[] = { 205, 255 };
+ Gfx* gfx = *gfxP;
+ u32 rectTop;
+ s16 colorStep;
+
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, 4, G_TX_NOLOD, G_TX_NOLOD);
+
+ colorStep = ABS_ALT(sUpperArrowColorG - sArrowColorTargetsG[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
+ if (sUpperArrowColorG >= sArrowColorTargetsG[sUpperArrowColorIndex]) {
+ sUpperArrowColorG -= colorStep;
+ } else {
+ sUpperArrowColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sUpperArrowColorB - sArrowColorTargetsB[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
+ if (sUpperArrowColorB >= sArrowColorTargetsB[sUpperArrowColorIndex]) {
+ sUpperArrowColorB -= colorStep;
+ } else {
+ sUpperArrowColorB += colorStep;
+ }
+
+ sUpperArrowColorTimer--;
+ if (sUpperArrowColorTimer == 0) {
+ sUpperArrowOffsetY ^= 6;
+ sUpperArrowColorTimer = 6;
+ sUpperArrowColorG = sArrowColorTargetsG[sUpperArrowColorIndex];
+ sUpperArrowColorB = sArrowColorTargetsB[sUpperArrowColorIndex];
+ sUpperArrowColorIndex ^= 1;
+ }
+
+ colorStep = ABS_ALT(sLowerArrowColorG - sArrowColorTargetsG[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
+ if (sLowerArrowColorG >= sArrowColorTargetsG[sLowerArrowColorIndex]) {
+ sLowerArrowColorG -= colorStep;
+ } else {
+ sLowerArrowColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sLowerArrowColorB - sArrowColorTargetsB[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
+ if (sLowerArrowColorB >= sArrowColorTargetsB[sLowerArrowColorIndex]) {
+ sLowerArrowColorB -= colorStep;
+ } else {
+ sLowerArrowColorB += colorStep;
+ }
+
+ sLowerArrowColorTimer--;
+ if (sLowerArrowColorTimer == 0) {
+ sLowerArrowOffsetY ^= 6;
+ sLowerArrowColorTimer = 6;
+ sLowerArrowColorG = sArrowColorTargetsG[sLowerArrowColorIndex];
+ sLowerArrowColorB = sArrowColorTargetsB[sLowerArrowColorIndex];
+ sLowerArrowColorIndex ^= 1;
+ }
+
+ if (this->cursorPage != 0) {
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
+ gDPSetEnvColor(gfx++, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
+ rectTop = (-sUpperArrowOffsetY + 83) * 4;
+ BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, rectTop, 70 * 4, rectTop + (16 * 4), 0, 0, 0x200, 1 << 10,
+ 1 << 10);
+ }
+
+ if (this->cursorPage < 16) {
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
+ gDPSetEnvColor(gfx++, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
+ BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, (sLowerArrowOffsetY + 319) * 4, 70 * 4,
+ (sLowerArrowOffsetY + 335) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ }
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx) {
+ Gfx* gfx;
+ s32 pad[2];
+
+ func_8012CF0C(gfxCtx, this->loadState != BOMBERS_NOTEBOOK_LOAD_STATE_DONE, false, 0, 0, 0);
+
+ OPEN_DISPS(gfxCtx);
+
+ gfx = POLY_OPA_DISP;
+
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
+ gSPSegment(gfx++, 0x07, this->scheduleDmaSegment);
+ gSPSegment(gfx++, 0x08, this->scheduleSegment);
+ gfx = Gfx_SetupDL39(gfx);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 215, 255);
+ gDPSetEnvColor(gfx++, 100, 100, 100, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookBackgroundTex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, 0 * 4, 0 * 4, SCREEN_WIDTH_HIRES * 4, SCREEN_HEIGHT_HIRES * 4, 0, 0, 0,
+ 0x200, 0x200);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ BombersNotebook_DrawHeaders(&gfx);
+ BombersNotebook_DrawColumns(&gfx);
+
+ gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 86, 600, 450);
+ BombersNotebook_DrawRows(this, &gfx);
+
+ gDPPipeSync(gfx++);
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+
+ BombersNotebook_DrawTimeOfDay(&gfx);
+
+ if (this->scrollAmount == 0) {
+ BombersNotebook_DrawCursor(this, &gfx);
+ }
+ BombersNotebook_DrawArrows(this, &gfx);
+ }
+ POLY_OPA_DISP = gfx;
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void BombersNotebook_LoadFiles(BombersNotebook* this, s32 flag) {
+ switch (this->loadState) {
+ case BOMBERS_NOTEBOOK_LOAD_STATE_NONE:
+ if (this->scheduleDmaSegment == NULL) {
+ break;
+ }
+ CmpDma_LoadAllFiles(this->scheduleDmaSegmentStart, this->scheduleDmaSegment, this->scheduleDmaSegmentSize);
+ osCreateMesgQueue(&this->loadQueue, this->loadMsg, ARRAY_COUNT(this->loadMsg));
+ DmaMgr_SendRequestImpl(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart,
+ this->scheduleSegmentSize, 0, &this->loadQueue, NULL);
+ this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_STARTED;
+ // fallthrough
+ case BOMBERS_NOTEBOOK_LOAD_STATE_STARTED:
+ if (osRecvMesg(&this->loadQueue, NULL, flag) == 0) {
+ this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_DONE;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+#define DEFINE_PERSON(_enum, _photo, description, _metEnum, _metMessage, _metFlag) description,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, description, _completedMessage, _completedFlag) description,
+
+u16 sBombersNotebookTextIds[] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input) {
+ static s16 sStickXRepeatTimer = 0;
+ static s16 sStickYRepeatTimer = 0;
+ static s16 sStickXRepeatState = 0;
+ static s16 sStickYRepeatState = 0;
+ s32 stickAdjX = input->rel.stick_x;
+ s32 stickAdjY = input->rel.stick_y;
+ s32 cursorEntryScan;
+
+ this->scheduleDmaSegmentStart = SEGMENT_ROM_START(schedule_dma_static_test);
+ this->scheduleDmaSegmentSize = SEGMENT_ROM_SIZE(schedule_dma_static_old);
+ this->scheduleSegmentStart = SEGMENT_ROM_START(schedule_static);
+ this->scheduleSegmentSize = SEGMENT_ROM_SIZE(schedule_static);
+
+ if (this->scheduleDmaSegment == NULL) {
+ this->scheduleDmaSegment = ZeldaArena_Malloc(this->scheduleDmaSegmentSize);
+ }
+
+ if (this->scheduleSegment == NULL) {
+ this->scheduleSegment = ZeldaArena_Malloc(this->scheduleSegmentSize);
+ }
+
+ BombersNotebook_LoadFiles(this, OS_MESG_NOBLOCK);
+
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
+ if (stickAdjX < -30) {
+ if (sStickXRepeatState == -1) {
+ sStickXRepeatTimer--;
+ if (sStickXRepeatTimer < 0) {
+ sStickXRepeatTimer = 2;
+ } else {
+ stickAdjX = 0;
+ }
+ } else {
+ sStickXRepeatTimer = 10;
+ sStickXRepeatState = -1;
+ }
+ } else if (stickAdjX > 30) {
+ if (sStickXRepeatState == 1) {
+ sStickXRepeatTimer--;
+ if (sStickXRepeatTimer < 0) {
+ sStickXRepeatTimer = 2;
+ } else {
+ stickAdjX = 0;
+ }
+ } else {
+ sStickXRepeatTimer = 10;
+ sStickXRepeatState = 1;
+ }
+ } else {
+ sStickXRepeatState = 0;
+ }
+
+ if (stickAdjY < -30) {
+ if (sStickYRepeatState == -1) {
+ sStickYRepeatTimer--;
+ if (sStickYRepeatTimer < 0) {
+ sStickYRepeatTimer = 2;
+ } else {
+ stickAdjY = 0;
+ }
+ } else {
+ sStickYRepeatTimer = 10;
+ sStickYRepeatState = -1;
+ }
+ } else if (stickAdjY > 30) {
+ if (sStickYRepeatState == 1) {
+ sStickYRepeatTimer--;
+ if (sStickYRepeatTimer < 0) {
+ sStickYRepeatTimer = 2;
+ } else {
+ stickAdjY = 0;
+ }
+ } else {
+ sStickYRepeatTimer = 10;
+ sStickYRepeatState = 1;
+ }
+ } else {
+ sStickYRepeatState = 0;
+ }
+
+ if (this->scrollAmount == 0) {
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[this->cursorPageRow + this->cursorPage])) {
+ cursorEntryScan = this->cursorEntry;
+ if (stickAdjX > 30) {
+ while (true) {
+ cursorEntryScan += BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (sBombersNotebookEntries[this->cursorPageRow + this->cursorPage]
+ [cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE] ==
+ BOMBERS_NOTEBOOK_ENTRY_END) {
+ while (true) {
+ cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (cursorEntryScan == 0) {
+ play_sound(NA_SE_SY_ERROR);
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_ERROR);
+ break;
+ }
+ }
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_CURSOR);
+ break;
+ }
+ }
+ this->cursorEntry = cursorEntryScan;
+ } else if (stickAdjX < -30) {
+ if (cursorEntryScan != 0) {
+ do {
+ cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_CURSOR);
+ break;
+ }
+ } while (cursorEntryScan != 0);
+ this->cursorEntry = cursorEntryScan;
+ }
+ }
+ if (this->cursorEntry != 0) {
+ if (play->msgCtx.currentTextId !=
+ sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage, this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]) {
+ Message_ContinueTextbox(play, sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]);
+ }
+ } else {
+ if (play->msgCtx.currentTextId != sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]) {
+ Message_ContinueTextbox(play, sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]);
+ }
+ }
+ } else {
+ Message_CloseTextbox(play);
+ }
+
+ if (stickAdjY < -30) {
+ if (this->cursorPageRow < 3) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorEntry = 0;
+ this->cursorPageRow++;
+ } else if (this->cursorPage < (BOMBERS_NOTEBOOK_PERSON_MAX - 4)) {
+ if (sStickYRepeatState == -1) {
+ this->scrollAmount = -24;
+ } else {
+ this->scrollAmount = -12;
+ }
+ this->scrollOffset = 0;
+ this->cursorEntry = 0;
+ }
+ } else if (stickAdjY > 30) {
+ if (this->cursorPageRow > 0) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorEntry = 0;
+ this->cursorPageRow--;
+ } else if (this->cursorPage != 0) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorPage--;
+ if (sStickYRepeatState == 1) {
+ this->scrollAmount = 24;
+ } else {
+ this->scrollAmount = 12;
+ }
+ this->scrollOffset = -48;
+ this->cursorEntry = 0;
+ }
+ }
+ } else if (this->scrollAmount < 0) {
+ this->scrollOffset += this->scrollAmount;
+ if (ABS_ALT(this->scrollOffset) >= 48) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->scrollOffset = 0;
+ this->scrollAmount = 0;
+ this->cursorPage++;
+ }
+ } else {
+ this->scrollOffset += this->scrollAmount;
+ if (this->scrollOffset == 0) {
+ this->scrollOffset = 0;
+ this->scrollAmount = 0;
+ }
+ }
+ }
+}
+
+void BombersNotebook_Init(BombersNotebook* this) {
+ bzero(this, sizeof(BombersNotebook));
+}
+
+void BombersNotebook_Destroy(BombersNotebook* this) {
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_STARTED) {
+ BombersNotebook_LoadFiles(this, OS_MESG_BLOCK);
+ }
+ if (this->scheduleDmaSegment != NULL) {
+ ZeldaArena_Free(this->scheduleDmaSegment);
+ this->scheduleDmaSegment = NULL;
+ }
+ //! @bug: Does not free malloc'd memory for schedule segment
+}
diff --git a/src/code/z_player_call.c b/src/code/z_player_call.c
index bdc124708..6aee18baf 100644
--- a/src/code/z_player_call.c
+++ b/src/code/z_player_call.c
@@ -1,9 +1,8 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define FLAGS \
(ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | ACTOR_FLAG_2000000 | \
- ACTOR_FLAG_4000000 | ACTOR_FLAG_80000000)
+ ACTOR_FLAG_CAN_PRESS_SWITCH | ACTOR_FLAG_80000000)
ActorFunc sPlayerCallInitFunc;
ActorFunc sPlayerCallDestroyFunc;
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index a7004ad3c..2e2d2222d 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -1,15 +1,21 @@
-#include "prevent_bss_reordering.h"
+/**
+ * File: z_player_lib.c
+ * Description: Set of library functions to interact with the Player system
+ */
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+// Assets for each player form
#include "objects/object_link_boy/object_link_boy.h"
#include "objects/object_link_goron/object_link_goron.h"
#include "objects/object_link_zora/object_link_zora.h"
#include "objects/object_link_nuts/object_link_nuts.h"
#include "objects/object_link_child/object_link_child.h"
+// Assets for each mask
#include "objects/object_mask_truth/object_mask_truth.h"
#include "objects/object_mask_kerfay/object_mask_kerfay.h"
#include "objects/object_mask_yofukasi/object_mask_yofukasi.h"
@@ -35,6 +41,9 @@
#include "objects/object_mask_zora/object_mask_zora.h"
#include "objects/object_mask_nuts/object_mask_nuts.h"
+// Assets for other actors
+#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
+
void PlayerCall_Init(Actor* thisx, PlayState* play);
void PlayerCall_Destroy(Actor* thisx, PlayState* play);
void PlayerCall_Update(Actor* thisx, PlayState* play);
@@ -49,30 +58,29 @@ typedef struct {
struct_801F58B0 D_801F58B0[3][3];
-Vec3f D_801F59B0[2];
+#define D_801F59B0_LEN 2
-s32 D_801F59C8[2];
+Vec3f D_801F59B0[D_801F59B0_LEN];
-typedef struct {
- /* 0x0 */ s16 unk_0;
- /* 0x2 */ s16 unk_2;
- /* 0x4 */ s16 unk_4;
- /* 0x6 */ s16 unk_6;
- /* 0x8 */ s16 unk_8;
-} struct_801F59D0; // size = 0xA
+s32 D_801F59C8[D_801F59B0_LEN];
-struct_801F59D0 D_801F59D0;
+typedef struct BunnyEarKinematics {
+ /* 0x0 */ Vec3s rot;
+ /* 0x6 */ Vec3s angVel;
+} BunnyEarKinematics; // size = 0xC
-Vec3f* D_801F59DC;
+BunnyEarKinematics sBunnyEarKinematics;
+
+Vec3f* sPlayerCurBodyPartPos;
s32 D_801F59E0;
-s32 D_801F59E4;
+s32 sPlayerLod;
-Vec3f D_801F59E8;
+Vec3f sPlayerGetItemRefPos;
-s32 D_801F59F4;
-s32 D_801F59F8;
+PlayerModelType sPlayerLeftHandType;
+PlayerModelType sPlayerRightHandType;
void func_80127B64(struct_801F58B0 arg0[], s32 count, Vec3f* arg2);
@@ -149,15 +157,35 @@ void func_801229A0(PlayState* play, Player* player) {
CLOSE_DISPS(play->state.gfxCtx);
}
+// Update function
void func_801229EC(Actor* thisx, PlayState* play) {
}
s16 sMaskObjectIds[PLAYER_MASK_MAX - 1] = {
- OBJECT_MASK_TRUTH, OBJECT_MASK_KERFAY, OBJECT_MASK_YOFUKASI, OBJECT_MASK_RABIT, OBJECT_MASK_KI_TAN,
- OBJECT_MASK_JSON, OBJECT_MASK_ROMERNY, OBJECT_MASK_ZACHO, OBJECT_MASK_POSTHAT, OBJECT_MASK_MEOTO,
- OBJECT_MASK_BIGELF, OBJECT_MASK_GIBUDO, OBJECT_MASK_GERO, OBJECT_MASK_DANCER, OBJECT_MASK_SKJ,
- OBJECT_MASK_STONE, OBJECT_MASK_BREE, OBJECT_MASK_BAKURETU, OBJECT_MASK_BU_SAN, OBJECT_MASK_KYOJIN,
- OBJECT_MASK_BOY, OBJECT_MASK_GORON, OBJECT_MASK_ZORA, OBJECT_MASK_NUTS,
+ OBJECT_MASK_TRUTH, // PLAYER_MASK_TRUTH
+ OBJECT_MASK_KERFAY, // PLAYER_MASK_KAFEIS_MASK
+ OBJECT_MASK_YOFUKASI, // PLAYER_MASK_ALL_NIGHT
+ OBJECT_MASK_RABIT, // PLAYER_MASK_BUNNY
+ OBJECT_MASK_KI_TAN, // PLAYER_MASK_KEATON
+ OBJECT_MASK_JSON, // PLAYER_MASK_GARO
+ OBJECT_MASK_ROMERNY, // PLAYER_MASK_ROMANI
+ OBJECT_MASK_ZACHO, // PLAYER_MASK_CIRCUS_LEADER
+ OBJECT_MASK_POSTHAT, // PLAYER_MASK_POSTMAN
+ OBJECT_MASK_MEOTO, // PLAYER_MASK_COUPLE
+ OBJECT_MASK_BIGELF, // PLAYER_MASK_GREAT_FAIRY
+ OBJECT_MASK_GIBUDO, // PLAYER_MASK_GIBDO
+ OBJECT_MASK_GERO, // PLAYER_MASK_DON_GERO
+ OBJECT_MASK_DANCER, // PLAYER_MASK_KAMARO
+ OBJECT_MASK_SKJ, // PLAYER_MASK_CAPTAIN
+ OBJECT_MASK_STONE, // PLAYER_MASK_STONE
+ OBJECT_MASK_BREE, // PLAYER_MASK_BREMEN
+ OBJECT_MASK_BAKURETU, // PLAYER_MASK_BLAST
+ OBJECT_MASK_BU_SAN, // PLAYER_MASK_SCENTS
+ OBJECT_MASK_KYOJIN, // PLAYER_MASK_GIANT
+ OBJECT_MASK_BOY, // PLAYER_MASK_FIERCE_DEITY
+ OBJECT_MASK_GORON, // PLAYER_MASK_GORON
+ OBJECT_MASK_ZORA, // PLAYER_MASK_ZORA
+ OBJECT_MASK_NUTS, // PLAYER_MASK_DEKU
};
// Load mask object?
@@ -197,7 +225,7 @@ void func_801229FC(Player* player) {
} else if (player->currentMask == PLAYER_MASK_CIRCUS_LEADER) {
s32 i;
- for (i = 0; i < ARRAY_COUNT(D_801F59C8); i++) {
+ for (i = 0; i < D_801F59B0_LEN; i++) {
D_801F59C8[i] += Rand_S16Offset(4, 23) + (s32)(fabsf(player->linearVelocity) * 50.0f);
}
}
@@ -229,7 +257,7 @@ void func_80122C20(PlayState* play, struct_80122D44_arg1* arg1) {
for (i = 0; i < ARRAY_COUNT(arg1->unk_04); i++, temp_v1++) {
// Can't be `temp_v1->alpha != 0`
if (temp_v1->alpha) {
- phi_a1 = temp_v1->unk_00 == 3 ? (255 / 3) : (255 / 5);
+ phi_a1 = (temp_v1->unk_00 == 3) ? (255 / 3) : (255 / 5);
if (phi_a1 >= temp_v1->alpha) {
temp_v1->alpha = 0;
} else {
@@ -242,7 +270,7 @@ void func_80122C20(PlayState* play, struct_80122D44_arg1* arg1) {
typedef struct {
/* 0x0 */ Color_RGB8 color;
/* 0x4 */ Gfx* dList;
-} struct_801BFDD0; // size = 0x08
+} struct_801BFDD0; // size = 0x8
struct_801BFDD0 D_801BFDD0[] = {
{ { 180, 200, 255 }, gLinkGoronCurledDL },
@@ -331,9 +359,9 @@ void func_80122F28(Player* player) {
PLAYER_STATE1_20000000))) &&
(!(player->stateFlags2 & PLAYER_STATE2_1))) {
if (player->doorType <= PLAYER_DOORTYPE_TALKING) {
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
} else {
- ActorCutscene_SetIntentToPlay(0x7D);
+ CutsceneManager_Queue(CS_ID_GLOBAL_DOOR);
}
}
}
@@ -341,13 +369,13 @@ void func_80122F28(Player* player) {
s32 func_80122F9C(PlayState* play) {
Player* player = GET_PLAYER(play);
- return (player->stateFlags2 & PLAYER_STATE2_80000) && player->unk_AE7 == 2;
+ return (player->stateFlags2 & PLAYER_STATE2_80000) && (player->unk_AE7 == 2);
}
s32 func_80122FCC(PlayState* play) {
Player* player = GET_PLAYER(play);
- return (player->stateFlags2 & PLAYER_STATE2_80000) && (player->unk_AE7 == 1 || player->unk_AE7 == 3);
+ return (player->stateFlags2 & PLAYER_STATE2_80000) && ((player->unk_AE7 == 1) || (player->unk_AE7 == 3));
}
void func_8012300C(PlayState* play, s32 arg1) {
@@ -356,6 +384,7 @@ void func_8012300C(PlayState* play, s32 arg1) {
player->unk_B2B = arg1;
}
+// Update function
void func_8012301C(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
Player* this = (Player*)thisx;
@@ -386,21 +415,29 @@ FlexSkeletonHeader* gPlayerSkeletons[PLAYER_FORM_MAX] = {
&gLinkFierceDeitySkel, &gLinkGoronSkel, &gLinkZoraSkel, &gLinkDekuSkel, &gLinkHumanSkel,
};
-s16 D_801BFE14[][18] = {
+s16 D_801BFE14[PLAYER_BOOTS_MAX][18] = {
+ // PLAYER_BOOTS_FIERCE_DEITY
{ 200, 666, 200, 700, 366, 200, 600, 175, 60, 800, 1000, -100, 600, 590, 800, 125, 300, 65 },
+ // PLAYER_BOOTS_HYLIAN
{ 200, 1000, 300, 800, 500, 400, 800, 400, 120, 800, 550, -100, 600, 540, 750, 125, 400, 200 },
+ // PLAYER_BOOTS_GIANT
{ 100, 1000, 300, 800, 250, 200, 800, 200, 90, 800, 350, -80, 600, 540, 750, 60, 200, 200 },
+ // PLAYER_BOOTS_DEKU
{ 200, 1000, 300, 700, 550, 270, 600, 1000, 120, 800, 600, -100, 600, 590, 750, 125, 200, 130 },
+ // PLAYER_BOOTS_ZORA_LAND
{ 200, 1000, 300, 700, 550, 270, 700, 300, 120, 800, 600, -100, 600, 590, 750, 125, 200, 130 },
+ // PLAYER_BOOTS_ZORA_UNDERWATER
{ 200, 1000, 300, 700, 550, 270, 700, 300, 120, 800, 600, -100, 600, 590, 750, 125, 200, 130 },
+ // PLAYER_BOOTS_GORON
{ 200, 1000, 300, 700, 550, 270, 700, 200, 120, 800, 600, -140, 600, 590, 750, 125, 200, 130 },
+ // PLAYER_BOOTS_7
{ 80, 800, 150, 700, 480, 270, 600, 50, 120, 800, 300, -40, 400, 540, 270, 25, 0, 80 },
};
// OoT's Player_SetBootData
void func_80123140(PlayState* play, Player* player) {
s16* bootRegs;
- s32 currentBoots;
+ PlayerBoots currentBoots;
f32 scale;
if ((player->actor.id == ACTOR_PLAYER) && (player->transformation == PLAYER_FORM_FIERCE_DEITY)) {
@@ -435,7 +472,7 @@ void func_80123140(PlayState* play, Player* player) {
REG(39) = bootRegs[8];
REG(43) = bootRegs[9];
R_RUN_SPEED_LIMIT = bootRegs[10];
- REG(68) = bootRegs[11];
+ REG(68) = bootRegs[11]; // gravity
REG(69) = bootRegs[12];
IREG(66) = bootRegs[13];
IREG(67) = bootRegs[14];
@@ -466,7 +503,7 @@ s32 Player_InBlockingCsMode(PlayState* play, Player* player) {
s32 Player_InCsMode(PlayState* play) {
Player* player = GET_PLAYER(play);
- return Player_InBlockingCsMode(play, player) || player->unk_AA5 == 5;
+ return Player_InBlockingCsMode(play, player) || (player->unk_AA5 == PLAYER_UNKAA5_5);
}
s32 func_80123420(Player* player) {
@@ -519,8 +556,8 @@ s32 func_801235DC(PlayState* play, f32 arg1, s16 arg2) {
Player* player = GET_PLAYER(play);
if (player->stateFlags3 & PLAYER_STATE3_1000) {
- player->unk_B08[0] = arg1;
- player->unk_B08[1] += arg1 * 0.05f;
+ player->unk_B08 = arg1;
+ player->unk_B0C += arg1 * 0.05f;
player->currentYaw = arg2;
player->actor.home.rot.y = arg2;
player->actor.shape.rot.y = arg2;
@@ -622,7 +659,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_KOKIRI
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_RAZOR
PLAYER_MODELGROUP_ONE_HAND_SWORD, // PLAYER_IA_SWORD_GILDED
- PLAYER_MODELGROUP_TWO_HAND_SWORD, // PLAYER_IA_SWORD_GREAT_FAIRY
+ PLAYER_MODELGROUP_TWO_HAND_SWORD, // PLAYER_IA_SWORD_TWO_HANDED
PLAYER_MODELGROUP_STICK, // PLAYER_IA_STICK
PLAYER_MODELGROUP_ZORA_FINS, // PLAYER_IA_ZORA_FINS
PLAYER_MODELGROUP_BOW, // PLAYER_IA_BOW
@@ -637,7 +674,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NUT
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PICTO_BOX
PLAYER_MODELGROUP_INSTRUMENT, // PLAYER_IA_OCARINA
- PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE
+ PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_EMPTY
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FISH
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_SPRING_WATER
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
@@ -751,10 +788,10 @@ PlayerModelIndices gPlayerModelTypes[PLAYER_MODELGROUP_MAX] = {
{ PLAYER_ANIMTYPE_1, PLAYER_MODELTYPE_LH_ONE_HAND_SWORD, PLAYER_MODELTYPE_RH_SHIELD, PLAYER_MODELTYPE_SHEATH_13,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_DEFAULT */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_4 */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_TWO_HAND_SWORD */
{ PLAYER_ANIMTYPE_3, PLAYER_MODELTYPE_LH_TWO_HAND_SWORD, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_14,
@@ -766,7 +803,7 @@ PlayerModelIndices gPlayerModelTypes[PLAYER_MODELGROUP_MAX] = {
{ PLAYER_ANIMTYPE_5, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_8 */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_4, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_4, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_HOOKSHOT */
{ PLAYER_ANIMTYPE_4, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_HOOKSHOT, PLAYER_MODELTYPE_SHEATH_14,
@@ -775,16 +812,16 @@ PlayerModelIndices gPlayerModelTypes[PLAYER_MODELGROUP_MAX] = {
{ PLAYER_ANIMTYPE_3, PLAYER_MODELTYPE_LH_CLOSED, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_INSTRUMENT */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_INSTRUMENT, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_INSTRUMENT, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_BOTTLE */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_BOTTLE, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_BOTTLE, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_13 */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_ONE_HAND_SWORD, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_15,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_ONE_HAND_SWORD, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_15,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_ZORA_FINS */
- { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_CLOSED, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_14,
+ { PLAYER_ANIMTYPE_DEFAULT, PLAYER_MODELTYPE_LH_CLOSED, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_14,
PLAYER_MODELTYPE_WAIST },
};
@@ -796,9 +833,11 @@ Gfx* gPlayerWaistDLs[2 * PLAYER_FORM_MAX] = {
gLinkZoraWaistDL, gLinkDekuWaistDL, gLinkDekuWaistDL, gLinkHumanWaistDL, gLinkHumanWaistDL,
};
-Gfx* gPlayerHandHoldingShields[PLAYER_SHIELD_MAX - 1][2] = {
- { gLinkHumanRightHandHoldingHylianShieldDL, gLinkHumanRightHandHoldingHylianShieldDL },
- { gLinkHumanRightHandHoldingMirrorShieldDL, gLinkHumanRightHandHoldingMirrorShieldDL },
+Gfx* gPlayerHandHoldingShields[2 * (PLAYER_SHIELD_MAX - 1)] = {
+ gLinkHumanRightHandHoldingHerosShieldDL,
+ gLinkHumanRightHandHoldingHerosShieldDL,
+ gLinkHumanRightHandHoldingMirrorShieldDL,
+ gLinkHumanRightHandHoldingMirrorShieldDL,
};
Gfx* gPlayerSheath12DLs[2 * PLAYER_FORM_MAX] = {
@@ -840,21 +879,21 @@ Gfx* gPlayerSheath14DLs[2 * PLAYER_FORM_MAX] = {
gLinkHumanSheathEmptyDL,
};
-Gfx* gPlayerShields[][2] = {
- { gLinkHumanHylianShieldWithMtxDL, gLinkHumanHylianShieldWithMtxDL },
- { gLinkHumanMirrorShieldWithMtxDL, gLinkHumanMirrorShieldWithMtxDL },
+Gfx* gPlayerShields[] = {
+ gLinkHumanHerosShieldWithMtxDL,
+ gLinkHumanHerosShieldWithMtxDL,
+ gLinkHumanMirrorShieldWithMtxDL,
+ gLinkHumanMirrorShieldWithMtxDL,
};
-Gfx* gPlayerSheathedSwords[][2] = {
- { gLinkHumanSheathedKokiriSwordDL, gLinkHumanSheathedKokiriSwordDL },
- { gLinkHumanSheathedRazorSwordDL, gLinkHumanSheathedRazorSwordDL },
- { gLinkHumanSheathedGildedSwordDL, gLinkHumanSheathedGildedSwordDL },
+Gfx* gPlayerSheathedSwords[] = {
+ gLinkHumanSheathedKokiriSwordDL, gLinkHumanSheathedKokiriSwordDL, gLinkHumanSheathedRazorSwordDL,
+ gLinkHumanSheathedRazorSwordDL, gLinkHumanSheathedGildedSwordDL, gLinkHumanSheathedGildedSwordDL,
};
-Gfx* gPlayerSwordSheaths[][2] = {
- { gLinkHumanKokiriSwordSheathDL, gLinkHumanKokiriSwordSheathDL },
- { gLinkHumanRazorSwordSheathDL, gLinkHumanRazorSwordSheathDL },
- { gLinkHumanGildedSwordSheathDL, gLinkHumanGildedSwordSheathDL },
+Gfx* gPlayerSwordSheaths[] = {
+ gLinkHumanKokiriSwordSheathDL, gLinkHumanKokiriSwordSheathDL, gLinkHumanRazorSwordSheathDL,
+ gLinkHumanRazorSwordSheathDL, gLinkHumanGildedSwordSheathDL, gLinkHumanGildedSwordSheathDL,
};
Gfx* gPlayerLeftHandTwoHandSwordDLs[2 * PLAYER_FORM_MAX] = {
@@ -895,10 +934,16 @@ Gfx* gPlayerLeftHandOneHandSwordDLs[2 * PLAYER_FORM_MAX] = {
gLinkHumanLeftHandHoldingKokiriSwordDL,
};
-Gfx* D_801C018C[][2] = {
- { gLinkHumanLeftHandHoldingKokiriSwordDL, gLinkHumanLeftHandHoldingKokiriSwordDL },
- { gLinkHumanLeftHandHoldingRazorSwordDL, gLinkHumanLeftHandHoldingRazorSwordDL },
- { gLinkHumanLeftHandHoldingGildedSwordDL, gLinkHumanLeftHandHoldingGildedSwordDL },
+Gfx* D_801C018C[] = {
+ // EQUIP_VALUE_SWORD_KOKIRI
+ gLinkHumanLeftHandHoldingKokiriSwordDL,
+ gLinkHumanLeftHandHoldingKokiriSwordDL,
+ // EQUIP_VALUE_SWORD_RAZOR
+ gLinkHumanLeftHandHoldingRazorSwordDL,
+ gLinkHumanLeftHandHoldingRazorSwordDL,
+ // EQUIP_VALUE_SWORD_GILDED
+ gLinkHumanLeftHandHoldingGildedSwordDL,
+ gLinkHumanLeftHandHoldingGildedSwordDL,
};
Gfx* gPlayerRightHandOpenDLs[2 * PLAYER_FORM_MAX] = {
@@ -967,22 +1012,22 @@ Gfx* gPlayerLeftHandBottleDLs[2 * PLAYER_FORM_MAX] = {
/* DLists groups end */
-Gfx* D_801C0294[PLAYER_FORM_MAX] = {
+Gfx* sPlayerFirstPersonLeftForearmDLs[PLAYER_FORM_MAX] = {
gLinkFierceDeityLeftForearmDL, gLinkGoronLeftForearmDL, gLinkZoraLeftForearmDL,
gLinkDekuLeftForearmDL, gLinkHumanLeftForearmDL,
};
-Gfx* D_801C02A8[PLAYER_FORM_MAX] = {
+Gfx* sPlayerFirstPersonLeftHandDLs[PLAYER_FORM_MAX] = {
gLinkFierceDeityLeftHandDL, gLinkGoronLeftHandOpenDL, gLinkZoraLeftHandClosedDL,
gLinkDekuLeftHandDL, gLinkHumanLeftHandClosedDL,
};
-Gfx* D_801C02BC[PLAYER_FORM_MAX] = {
+Gfx* sPlayerFirstPersonRightShoulderDLs[PLAYER_FORM_MAX] = {
gLinkFierceDeityRightShoulderDL, gLinkGoronRightShoulderDL, gLinkZoraRightShoulderDL,
gLinkDekuRightShoulderDL, gLinkHumanRightShoulderDL,
};
-Gfx* D_801C02D0[PLAYER_FORM_MAX] = {
+Gfx* sPlayerFirstPersonRightHandDLs[PLAYER_FORM_MAX] = {
gLinkFierceDeityRightHandDL,
//! @bug This is in the middle of a texture in the link_goron object. It has the same offset as a link_nuts dlist
0x060038C0,
@@ -991,7 +1036,7 @@ Gfx* D_801C02D0[PLAYER_FORM_MAX] = {
object_link_child_DL_018490,
};
-Gfx* D_801C02E4[PLAYER_FORM_MAX] = {
+Gfx* sPlayerFirstPersonRightHandHookshotDLs[PLAYER_FORM_MAX] = {
gLinkFierceDeityRightHandDL,
//! @bug This is in the middle of a texture in the link_goron object. It has the same offset as a link_nuts dlist
0x060038C0,
@@ -1224,7 +1269,7 @@ void Player_SetModelGroup(Player* player, PlayerModelGroup modelGroup) {
player->modelGroup = modelGroup;
if (modelGroup == PLAYER_MODELGROUP_1) {
- player->modelAnimType = PLAYER_ANIMTYPE_0;
+ player->modelAnimType = PLAYER_ANIMTYPE_DEFAULT;
} else {
player->modelAnimType = gPlayerModelTypes[modelGroup].modelAnimType;
}
@@ -1232,7 +1277,7 @@ void Player_SetModelGroup(Player* player, PlayerModelGroup modelGroup) {
if (player->modelAnimType < PLAYER_ANIMTYPE_3) {
if (((player->transformation != PLAYER_FORM_FIERCE_DEITY) && (player->transformation != PLAYER_FORM_HUMAN)) ||
(player->currentShield == PLAYER_SHIELD_NONE)) {
- player->modelAnimType = PLAYER_ANIMTYPE_0;
+ player->modelAnimType = PLAYER_ANIMTYPE_DEFAULT;
}
}
@@ -1271,6 +1316,7 @@ void Player_UpdateBottleHeld(PlayState* play, Player* player, ItemId itemId, Pla
player->itemAction = itemAction;
}
+// Player_Untarget / Player_StopTargeting?
void func_80123DA4(Player* player) {
player->targetedActor = NULL;
player->stateFlags2 &= ~PLAYER_STATE2_2000;
@@ -1317,12 +1363,12 @@ s32 func_80123F2C(PlayState* play, s32 ammo) {
}
s32 Player_IsBurningStickInRange(PlayState* play, Vec3f* pos, f32 xzRange, f32 yRange) {
- Player* this = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
Vec3f diff;
s32 pad;
- if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B28 != 0)) {
- Math_Vec3f_Diff(&this->meleeWeaponInfo[0].tip, pos, &diff);
+ if ((player->heldItemAction == PLAYER_IA_STICK) && (player->unk_B28 != 0)) {
+ Math_Vec3f_Diff(&player->meleeWeaponInfo[0].tip, pos, &diff);
return (SQXZ(diff) <= SQ(xzRange)) && (0.0f <= diff.y) && (diff.y <= yRange);
}
@@ -1367,86 +1413,85 @@ s32 func_801240DC(Player* player) {
return Player_IsHoldingHookshot(player) && (player->heldActor == NULL);
}
-s32 func_80124110(Player* player, PlayerItemAction itemAction) {
- s32 temp_v0 = itemAction - PLAYER_IA_FISHING_ROD;
+PlayerBButtonSword Player_BButtonSwordFromIA(Player* player, PlayerItemAction itemAction) {
+ PlayerBButtonSword bButtonSword = GET_B_SWORD_FROM_IA(itemAction);
if (player->transformation != PLAYER_FORM_GORON) {
- if (((itemAction - PLAYER_IA_FISHING_ROD) > (PLAYER_IA_FISHING_ROD - PLAYER_IA_FISHING_ROD)) &&
- ((itemAction - PLAYER_IA_FISHING_ROD) < (PLAYER_IA_SWORD_GREAT_FAIRY - PLAYER_IA_FISHING_ROD))) {
- return temp_v0;
+ if ((GET_B_SWORD_FROM_IA(itemAction) > PLAYER_B_SWORD_NONE) &&
+ (GET_B_SWORD_FROM_IA(itemAction) < PLAYER_B_SWORD_MAX)) {
+ return bButtonSword;
}
}
- return 0;
+ return PLAYER_B_SWORD_NONE;
}
-s32 func_80124148(Player* player) {
- return func_80124110(player, player->heldItemAction);
+PlayerBButtonSword Player_GetHeldBButtonSword(Player* player) {
+ return Player_BButtonSwordFromIA(player, player->heldItemAction);
}
-s32 Player_ActionToMeleeWeapon(PlayerItemAction itemAction) {
- s32 weapon = itemAction - (PLAYER_IA_SWORD_KOKIRI - 1);
+PlayerMeleeWeapon Player_MeleeWeaponFromIA(PlayerItemAction itemAction) {
+ PlayerMeleeWeapon weapon = GET_MELEE_WEAPON_FROM_IA(itemAction);
- if ((weapon > 0) && (weapon <= (PLAYER_IA_ZORA_FINS - (PLAYER_IA_SWORD_KOKIRI - 1)))) {
+ if ((weapon > PLAYER_MELEEWEAPON_NONE) && (weapon < PLAYER_MELEEWEAPON_MAX)) {
return weapon;
}
- return 0;
+
+ return PLAYER_MELEEWEAPON_NONE;
}
-s32 Player_GetMeleeWeaponHeld(Player* player) {
- return Player_ActionToMeleeWeapon(player->heldItemAction);
+PlayerMeleeWeapon Player_GetMeleeWeaponHeld(Player* player) {
+ return Player_MeleeWeaponFromIA(player->heldItemAction);
}
s32 Player_IsHoldingTwoHandedWeapon(Player* player) {
// Relies on the itemActions for two-handed weapons being contiguous.
- if ((player->heldItemAction >= PLAYER_IA_SWORD_GREAT_FAIRY) && (player->heldItemAction <= PLAYER_IA_STICK)) {
+ if ((player->heldItemAction >= PLAYER_IA_SWORD_TWO_HANDED) && (player->heldItemAction <= PLAYER_IA_STICK)) {
return true;
}
return false;
}
-s32 Player_ActionToBottle(Player* player, PlayerItemAction itemAction) {
- s32 bottle = itemAction - PLAYER_IA_BOTTLE;
+PlayerBottle Player_BottleFromIA(Player* player, PlayerItemAction itemAction) {
+ PlayerBottle bottle = GET_BOTTLE_FROM_IA(itemAction);
- // Relies on bottle-related item actions to be contiguous
- if ((bottle >= (PLAYER_IA_BOTTLE - PLAYER_IA_BOTTLE)) && (bottle <= (PLAYER_IA_BOTTLE_FAIRY - PLAYER_IA_BOTTLE))) {
+ if ((bottle > PLAYER_BOTTLE_NONE) && (bottle < PLAYER_BOTTLE_MAX)) {
return bottle;
}
- return -1;
+ return PLAYER_BOTTLE_NONE;
}
-s32 Player_GetBottleHeld(Player* Player) {
- return Player_ActionToBottle(Player, Player->heldItemAction);
+PlayerBottle Player_GetBottleHeld(Player* Player) {
+ return Player_BottleFromIA(Player, Player->heldItemAction);
}
-s32 Player_ActionToExplosive(Player* player, PlayerItemAction itemAction) {
- s32 explosive = itemAction - PLAYER_IA_BOMB;
+PlayerExplosive Player_ExplosiveFromIA(Player* player, PlayerItemAction itemAction) {
+ PlayerExplosive explosive = GET_EXPLOSIVE_FROM_IA(itemAction);
- // Relies on explosive-related item actions to be contiguous
- if ((explosive >= (PLAYER_IA_BOMB - PLAYER_IA_BOMB)) && (explosive <= (PLAYER_IA_BOMBCHU - PLAYER_IA_BOMB))) {
+ if ((explosive > PLAYER_EXPLOSIVE_NONE) && (explosive < PLAYER_EXPLOSIVE_MAX)) {
return explosive;
}
- return -1;
+ return PLAYER_EXPLOSIVE_NONE;
}
-s32 Player_GetExplosiveHeld(Player* player) {
- return Player_ActionToExplosive(player, player->heldItemAction);
+PlayerExplosive Player_GetExplosiveHeld(Player* player) {
+ return Player_ExplosiveFromIA(player, player->heldItemAction);
}
-s32 Player_ActionToSword(Actor* actor, PlayerItemAction itemAction) {
- s32 sword = 0;
+// Note this function maps PLAYER_IA_LAST_USED to PLAYER_SWORD_KOKIRI
+PlayerSword Player_SwordFromIA(Player* player, PlayerItemAction itemAction) {
+ PlayerSword sword = PLAYER_SWORD_KOKIRI;
//! FAKE:
if ((itemAction == PLAYER_IA_LAST_USED) ||
- ((sword = itemAction - PLAYER_IA_SWORD_KOKIRI, (sword >= PLAYER_IA_SWORD_KOKIRI - PLAYER_IA_SWORD_KOKIRI)) &&
- (sword <= PLAYER_IA_SWORD_GREAT_FAIRY - PLAYER_IA_SWORD_KOKIRI))) {
+ ((sword = GET_SWORD_FROM_IA(itemAction), (sword > PLAYER_SWORD_NONE)) && (sword < PLAYER_SWORD_MAX))) {
return sword;
}
- return -1;
+ return PLAYER_SWORD_NONE;
}
s32 func_801242B4(Player* player) {
@@ -1485,8 +1530,43 @@ s32 Player_GetEnvironmentalHazard(PlayState* play) {
return envHazard + 1;
}
-void func_80124420(Player* player);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80124420.s")
+void Player_UpdateBunnyEars(Player* player) {
+ Vec3s force;
+ s16 angle;
+
+ sBunnyEarKinematics.angVel.x -= sBunnyEarKinematics.angVel.x >> 3;
+ sBunnyEarKinematics.angVel.y -= sBunnyEarKinematics.angVel.y >> 3;
+ sBunnyEarKinematics.angVel.x += -sBunnyEarKinematics.rot.x >> 2;
+ sBunnyEarKinematics.angVel.y += -sBunnyEarKinematics.rot.y >> 2;
+
+ angle = player->actor.world.rot.y - player->actor.shape.rot.y;
+ force.x = (s32)(player->actor.speed * -200.0f * Math_CosS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF;
+ force.y = (s32)(player->actor.speed * 100.0f * Math_SinS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF;
+
+ sBunnyEarKinematics.angVel.x += force.x >> 2;
+ sBunnyEarKinematics.angVel.y += force.y >> 2;
+
+ if (sBunnyEarKinematics.angVel.x > 0x1770) {
+ sBunnyEarKinematics.angVel.x = 0x1770;
+ } else if (sBunnyEarKinematics.angVel.x < -0x1770) {
+ sBunnyEarKinematics.angVel.x = -0x1770;
+ }
+
+ if (sBunnyEarKinematics.angVel.y > 0x1770) {
+ sBunnyEarKinematics.angVel.y = 0x1770;
+ } else if (sBunnyEarKinematics.angVel.y < -0x1770) {
+ sBunnyEarKinematics.angVel.y = -0x1770;
+ }
+
+ sBunnyEarKinematics.rot.x += sBunnyEarKinematics.angVel.x;
+ sBunnyEarKinematics.rot.y += sBunnyEarKinematics.angVel.y;
+
+ if (sBunnyEarKinematics.rot.x < 0) {
+ sBunnyEarKinematics.rot.z = sBunnyEarKinematics.rot.x >> 1;
+ } else {
+ sBunnyEarKinematics.rot.z = 0;
+ }
+}
void func_80124618(struct_80124618 arg0[], f32 curFrame, Vec3f* arg2) {
s32 currentFrame = curFrame;
@@ -1542,22 +1622,28 @@ Gfx gCullFrontDList[] = {
gsSPEndDisplayList(),
};
-TexturePtr sPlayerEyesTextures[] = {
- gLinkHumanEyesOpenTex, gLinkHumanEyesHalfTex, gLinkHumanEyesClosedTex, gLinkHumanEyesRollRightTex,
- gLinkHumanEyesRollLeftTex, gLinkHumanEyesRollUpTex, gLinkHumanEyesRollDownTex, object_link_child_Tex_003800,
+TexturePtr sPlayerEyesTextures[PLAYER_EYES_MAX] = {
+ gLinkHumanEyesOpenTex, // PLAYER_EYES_OPEN
+ gLinkHumanEyesHalfTex, // PLAYER_EYES_HALF
+ gLinkHumanEyesClosedTex, // PLAYER_EYES_CLOSED
+ gLinkHumanEyesRollRightTex, // PLAYER_EYES_ROLL_RIGHT
+ gLinkHumanEyesRollLeftTex, // PLAYER_EYES_ROLL_LEFT
+ gLinkHumanEyesRollUpTex, // PLAYER_EYES_ROLL_UP
+ gLinkHumanEyesRollDownTex, // PLAYER_EYES_ROLL_DOWN
+ object_link_child_Tex_003800, // PLAYER_EYES_7
};
-TexturePtr sPlayerMouthTextures[] = {
- gLinkHumanMouthClosedTex,
- gLinkHumanMouthTeethTex,
- gLinkHumanMouthAngryTex,
- gLinkHumanMouthHappyTex,
+TexturePtr sPlayerMouthTextures[PLAYER_MOUTH_MAX] = {
+ gLinkHumanMouthClosedTex, // PLAYER_MOUTH_CLOSED
+ gLinkHumanMouthTeethTex, // PLAYER_MOUTH_TEETH
+ gLinkHumanMouthAngryTex, // PLAYER_MOUTH_ANGRY
+ gLinkHumanMouthHappyTex, // PLAYER_MOUTH_HAPPY
};
typedef struct PlayerFaceIndices {
- /* 0x00 */ u8 eyeIndex;
- /* 0x01 */ u8 mouthIndex;
-} PlayerFaceIndices; // size = 0x02
+ /* 0x0 */ u8 eyeIndex;
+ /* 0x1 */ u8 mouthIndex;
+} PlayerFaceIndices; // size = 0x2
PlayerFaceIndices sPlayerFaces[] = {
{ PLAYER_EYES_OPEN, PLAYER_MOUTH_CLOSED }, // PLAYER_FACE_0
@@ -1583,8 +1669,8 @@ PlayerFaceIndices sPlayerFaces[] = {
void Player_DrawImpl(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, s32 lod,
PlayerTransformation playerForm, s32 boots, s32 face, OverrideLimbDrawFlex overrideLimbDraw,
PostLimbDrawFlex postLimbDraw, Actor* actor) {
- s32 eyeIndex = (jointTable[22].x & 0xF) - 1;
- s32 mouthIndex = ((jointTable[22].x >> 4) & 0xF) - 1;
+ s32 eyeIndex = GET_EYE_INDEX_FROM_JOINT_TABLE(jointTable);
+ s32 mouthIndex = GET_MOUTH_INDEX_FROM_JOINT_TABLE(jointTable);
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
@@ -1614,68 +1700,172 @@ void Player_DrawImpl(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dL
POLY_OPA_DISP = &gfx[2];
D_801F59E0 = playerForm * 2;
- D_801F59E4 = lod;
+ sPlayerLod = lod;
SkelAnime_DrawFlexLod(play, skeleton, jointTable, dListCount, overrideLimbDraw, postLimbDraw, actor, lod);
CLOSE_DISPS(play->state.gfxCtx);
}
Vec3f D_801C08C0[PLAYER_FORM_MAX] = {
- { 1304.0f, 0.0f, 0.0f }, { 1156.0f, 0.0f, 0.0f }, { 1406.0f, 0.0f, 0.0f },
- { 408.0f, 0.0f, 0.0f }, { 695.0f, 0.0f, 0.0f },
+ { 1304.0f, 0.0f, 0.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { 1156.0f, 0.0f, 0.0f }, // PLAYER_FORM_GORON
+ { 1406.0f, 0.0f, 0.0f }, // PLAYER_FORM_ZORA
+ { 408.0f, 0.0f, 0.0f }, // PLAYER_FORM_DEKU
+ { 695.0f, 0.0f, 0.0f }, // PLAYER_FORM_HUMAN
};
f32 D_801C08FC[PLAYER_FORM_MAX] = {
- 1265.0f, 1056.0f, 1506.0f, 359.0f, 826.0f,
+ 1265.0f, // PLAYER_FORM_FIERCE_DEITY
+ 1056.0f, // PLAYER_FORM_GORON
+ 1506.0f, // PLAYER_FORM_ZORA
+ 359.0f, // PLAYER_FORM_DEKU
+ 826.0f, // PLAYER_FORM_HUMAN
};
f32 D_801C0910[PLAYER_FORM_MAX] = {
- 170.0416f, 133.63359f, 197.68358f, 16.646399f, 48.302498f,
+ 170.0416f, // PLAYER_FORM_FIERCE_DEITY
+ 133.63359f, // PLAYER_FORM_GORON
+ 197.68358f, // PLAYER_FORM_ZORA
+ 16.646399f, // PLAYER_FORM_DEKU
+ 48.302498f, // PLAYER_FORM_HUMAN
};
f32 D_801C0924[PLAYER_FORM_MAX] = {
- 10.019104f, 22.120003f, -29.12001f, 3.7582989f, -19.925102f,
+ 10.019104f, // PLAYER_FORM_FIERCE_DEITY
+ 22.120003f, // PLAYER_FORM_GORON
+ -29.12001f, // PLAYER_FORM_ZORA
+ 3.7582989f, // PLAYER_FORM_DEKU
+ -19.925102f, // PLAYER_FORM_HUMAN
};
f32 D_801C0938[PLAYER_FORM_MAX] = {
- 5.0f, 4.0f, 1.0f, 1.0f, 3.0f,
+ 5.0f, // PLAYER_FORM_FIERCE_DEITY
+ 4.0f, // PLAYER_FORM_GORON
+ 1.0f, // PLAYER_FORM_ZORA
+ 1.0f, // PLAYER_FORM_DEKU
+ 3.0f, // PLAYER_FORM_HUMAN
};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80124870.s")
+/**
+ * Adjusts player's legs to slopes and spawns flames when running on lava
+ */
+void Player_AdjustSingleLeg(PlayState* play, Player* player, SkelAnime* skelAnime, Vec3f* pos, Vec3s* rot,
+ s32 thighLimbIndex, s32 shinLimbIndex, s32 footLimbIndex) {
+ CollisionPoly* poly;
+ s32 bgId;
+ f32 yIntersect;
+ Vec3f sp90;
+ Vec3f sp84;
+ Vec3f footprintPos;
+ f32 sp74;
+ f32 sp70;
+ f32 sp7C;
-void func_80124CC4(PlayState* play, Player* player, f32 arg2) {
+ if ((player->stateFlags3 & PLAYER_STATE3_1) || !(player->actor.scale.y >= 0.0f) ||
+ (player->stateFlags1 & PLAYER_STATE1_80) || play->unk_18844) {
+ return;
+ }
+
+ sp74 = D_801C0910[player->transformation];
+ sp70 = D_801C0924[player->transformation];
+ sp7C = D_801C0938[player->transformation] - player->unk_AB8;
+ Matrix_Push();
+ Matrix_TranslateRotateZYX(pos, rot);
+ Matrix_MultZero(&sp90);
+ Matrix_TranslateRotateZYX(&D_801C08C0[player->transformation], &skelAnime->jointTable[shinLimbIndex]);
+ Matrix_Translate(D_801C08FC[player->transformation], 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_MultZero(&sp84);
+ Matrix_MultVecY(-300.0f, &footprintPos);
+ Matrix_Pop();
+
+ footprintPos.y += 15.0f;
+ yIntersect = BgCheck_EntityRaycastFloor3(&play->colCtx, &poly, &bgId, &footprintPos) + sp7C +
+ (player->unk_ABC * player->actor.scale.y);
+ if (sp84.y < yIntersect) {
+ f32 diffX = sp84.x - sp90.x;
+ f32 diffY = sp84.y - sp90.y;
+ f32 diffZ = sp84.z - sp90.z;
+ f32 distance;
+ f32 sp58;
+ f32 sp54;
+ f32 temp_f20;
+ f32 sp4C;
+ f32 sp48;
+ s16 temp_f8;
+ s32 temp_v0_4;
+ s16 phi_t1;
+
+ distance = sqrtf(SQ(diffX) + SQ(diffY) + SQ(diffZ));
+
+ sp58 = (SQ(distance) + sp70) / (2.0f * distance);
+
+ temp_f20 = sp74 - SQ(sp58);
+ temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20);
+
+ sp4C = Math_FAtan2F(temp_f20, sp58);
+ distance = sqrtf(SQ(diffX) + SQ(yIntersect - sp90.y) + SQ(diffZ));
+ sp58 = (SQ(distance) + sp70) / (2.0f * distance);
+ sp54 = distance - sp58;
+
+ temp_f20 = sp74 - SQ(sp58);
+ temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20);
+
+ sp48 = Math_FAtan2F(temp_f20, sp58);
+ phi_t1 = (M_PI - (Math_FAtan2F(sp54, temp_f20) + ((M_PI / 2.0f) - sp48))) * (0x8000 / M_PI);
+ phi_t1 = -skelAnime->jointTable[shinLimbIndex].z + phi_t1;
+ temp_f8 = (sp48 - sp4C) * (0x8000 / M_PI);
+
+ if ((s16)(ABS_ALT(skelAnime->jointTable[shinLimbIndex].x) + ABS_ALT(skelAnime->jointTable[shinLimbIndex].y)) <
+ 0) {
+ phi_t1 = BINANG_ROT180(phi_t1);
+ }
+
+ rot->z -= temp_f8;
+
+ skelAnime->jointTable[thighLimbIndex].z -= temp_f8;
+ skelAnime->jointTable[shinLimbIndex].z += phi_t1;
+ skelAnime->jointTable[footLimbIndex].z = (skelAnime->jointTable[footLimbIndex].z + temp_f8) - phi_t1;
+
+ temp_v0_4 = SurfaceType_GetFloorType(&play->colCtx, poly, bgId);
+ if ((temp_v0_4 >= 2) && (temp_v0_4 < 4) && !SurfaceType_IsWallDamage(&play->colCtx, poly, bgId)) {
+ footprintPos.y = yIntersect;
+ EffectSsGFire_Spawn(play, &footprintPos);
+ }
+ }
+}
+
+void Player_DrawHookshotReticle(PlayState* play, Player* player, f32 hookshotDistance) {
static Vec3f D_801C094C = { -500.0f, -100.0f, 0.0f };
CollisionPoly* poly;
s32 bgId;
Vec3f sp7C;
Vec3f sp70;
Vec3f pos;
- Vec3f sp58;
- f32 sp54;
- f32 scale;
D_801C094C.z = 0.0f;
Matrix_MultVec3f(&D_801C094C, &sp7C);
- D_801C094C.z = arg2;
+ D_801C094C.z = hookshotDistance;
Matrix_MultVec3f(&D_801C094C, &sp70);
if (BgCheck_AnyLineTest3(&play->colCtx, &sp7C, &sp70, &pos, &poly, true, true, true, true, &bgId)) {
if (!func_800B90AC(play, &player->actor, poly, bgId, &pos) ||
BgCheck_ProjectileLineTest(&play->colCtx, &sp7C, &sp70, &pos, &poly, true, true, true, true, &bgId)) {
+ Vec3f sp58;
+ f32 sp54;
+ f32 scale;
+
OPEN_DISPS(play->state.gfxCtx);
- OVERLAY_DISP = Gfx_CallSetupDL(OVERLAY_DISP, 7);
+ OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_7);
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &pos, &sp58, &sp54);
- if (sp54 < 200.0f) {
- scale = 0.08f;
- } else {
- scale = (sp54 / 200.0f) * 0.08f;
- }
+
+ scale = (sp54 < 200.0f) ? 0.08f : (sp54 / 200.0f) * 0.08f;
+
Matrix_Translate(pos.x, pos.y, pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.status[player->actor.objBankIndex].segment);
- gSPDisplayList(OVERLAY_DISP++, gameplay_keep_DL_04F250);
+ gSPDisplayList(OVERLAY_DISP++, gHookshotReticleDL);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1694,8 +1884,6 @@ Gfx** D_801C0964[] = {
};
void func_80124F18(s16* arg0, f32* arg1, s16 arg2, f32 arg3, f32 arg4) {
- f32 phi_f12;
-
if (*arg0 < arg2) {
*arg1 += arg3;
} else {
@@ -1742,7 +1930,26 @@ void func_80124FF0(f32 arg0, s16 arg1, Vec3f* arg2, s16 arg3, Vec3f* arg4, Vec3f
func_80124F18(arg6, arg7, temp_v0, 20.0f, 2000.0f);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_801251C4.s")
+void func_801251C4(Player* player, Vec3f* arg1) {
+ Vec3f sp4C;
+ Vec3f sp40;
+
+ sp4C.x = player->actor.world.pos.x;
+ sp4C.y = player->actor.world.pos.y + 60.0f;
+ sp4C.z = player->actor.world.pos.z;
+ func_80124FF0(-20.0f, player->unk_B8C, &sp4C, player->actor.shape.rot.y,
+ &player->bodyPartsPos[PLAYER_BODYPART_WAIST], arg1, &player->unk_B90, &player->unk_B10[0], 0.0f,
+ 0x1F40, &player->unk_B92, &player->unk_B10[1], 0);
+
+ sp40.x =
+ (player->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].x + player->bodyPartsPos[PLAYER_BODYPART_RIGHT_FOOT].x) / 2.0f;
+ sp40.y =
+ (player->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].y + player->bodyPartsPos[PLAYER_BODYPART_RIGHT_FOOT].y) / 2.0f;
+ sp40.z =
+ (player->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].z + player->bodyPartsPos[PLAYER_BODYPART_RIGHT_FOOT].z) / 2.0f;
+ func_80124FF0(-20.0f, player->unk_B90, arg1, (player->actor.shape.rot.y + player->unk_B92), &sp40, arg1,
+ &player->unk_B94, &player->unk_B10[2], -1.9f, 0x1F40, &player->unk_B96, &player->unk_B10[3], 0);
+}
void func_80125318(Vec3f* arg0, Vec3s* arg1) {
arg0->x = 0.0f;
@@ -1769,11 +1976,9 @@ void Player_DrawZoraShield(PlayState* play, Player* player) {
u8* phi_a0;
Vtx* vtx;
Gfx* dList;
- f32 scale;
+ f32 scale = player->unk_B62 * (10.0f / 51.0f);
s32 i;
- scale = player->unk_B62 * (10.0f / 51.0f);
-
OPEN_DISPS(play->state.gfxCtx);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(&object_link_zora_Matanimheader_012A80));
@@ -1801,49 +2006,399 @@ void Player_DrawZoraShield(PlayState* play, Player* player) {
CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80125500.s")
+void func_80125500(PlayState* play, Player* player, s32 limbIndex, Vec3f* pos, Vec3s* rot) {
+ if (limbIndex == PLAYER_LIMB_LEFT_THIGH) {
+ Player_AdjustSingleLeg(play, player, &player->skelAnime, pos, rot, PLAYER_LIMB_LEFT_THIGH,
+ PLAYER_LIMB_LEFT_SHIN, PLAYER_LIMB_LEFT_FOOT);
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_THIGH) {
+ Player_AdjustSingleLeg(play, player, &player->skelAnime, pos, rot, PLAYER_LIMB_RIGHT_THIGH,
+ PLAYER_LIMB_RIGHT_SHIN, PLAYER_LIMB_RIGHT_FOOT);
+ }
+}
-s32 func_80125580(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80125580.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80125CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80125D4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_801262C8.s")
-
-// unused
-s32 func_801263FC(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
+s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ s32 pad;
Player* player = (Player*)thisx;
- if (!func_80125580(play, limbIndex, dList, pos, rot, thisx)) {
+ if (limbIndex == PLAYER_LIMB_ROOT) {
+ sPlayerLeftHandType = player->leftHandType;
+ sPlayerRightHandType = player->rightHandType;
+
+ // `sPlayerCurBodyPartPos` is incremented before each usage, so it starts at index -1.
+ // What determines if a limb corresponds to a body part is whether or not it has a non-NULL `dList`.
+ // Note: The increment would not be done for the root limb, even if it had a non-NULL `dList`.
+ // So if the root limb had a non-NULL `dList` (which is not the case in vanilla),
+ // an out-of-bounds write to `bodyPartsPos` would occur.
+ sPlayerCurBodyPartPos = &player->bodyPartsPos[-1];
+
+ if (player->transformation != PLAYER_FORM_FIERCE_DEITY) {
+ if (!(player->skelAnime.moveFlags & ANIM_FLAG_4) || (player->skelAnime.moveFlags & ANIM_FLAG_1)) {
+ pos->x *= player->ageProperties->unk_08;
+ pos->z *= player->ageProperties->unk_08;
+ }
+ if (!(player->skelAnime.moveFlags & ANIM_FLAG_4) || (player->skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y)) {
+ pos->y *= player->ageProperties->unk_08;
+ }
+ }
+
+ pos->y -= player->unk_AB8;
+ if ((player->transformation == PLAYER_FORM_ZORA) && (player->stateFlags3 & PLAYER_STATE3_8000)) {
+ Matrix_Translate(pos->x, ((Math_CosS(player->unk_AAA) - 1.0f) * 200.0f) + pos->y, pos->z, MTXMODE_APPLY);
+ Matrix_RotateXS(player->unk_AAA, MTXMODE_APPLY);
+
+ if (player->unk_B62 != 0) {
+ Matrix_Push();
+ Matrix_RotateZS(player->unk_B8E, MTXMODE_APPLY);
+ Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY);
+ Matrix_RotateXS(-0x8000, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -4000.0f, MTXMODE_APPLY);
+ Player_DrawZoraShield(play, player);
+ Matrix_Pop();
+ }
+
+ Matrix_RotateZS(player->unk_B86[1], MTXMODE_APPLY);
+ Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY);
+ func_80125318(pos, rot);
+ } else if (player->stateFlags3 & PLAYER_STATE3_2000) {
+ Vec3f sp54;
+
+ func_801251C4(player, &sp54);
+ sp54.x -= player->actor.world.pos.x;
+ sp54.y -= player->actor.world.pos.y;
+ sp54.z -= player->actor.world.pos.z;
+ Matrix_Translate(pos->x + sp54.x, pos->y + sp54.y, pos->z + sp54.z, MTXMODE_APPLY);
+ Matrix_RotateXS(player->unk_B94, MTXMODE_APPLY);
+ Matrix_RotateZS(player->unk_B8E, MTXMODE_APPLY);
+ player->upperLimbRot.x = player->unk_B90 - player->unk_B94;
+ Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY);
+ func_80125318(pos, rot);
+ } else if (player->unk_AAA != 0) {
+ Matrix_Translate(pos->x, ((Math_CosS(player->unk_AAA) - 1.0f) * 200.0f) + pos->y, pos->z, MTXMODE_APPLY);
+ Matrix_RotateXS(player->unk_AAA, MTXMODE_APPLY);
+ Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY);
+ func_80125318(pos, rot);
+ }
+ } else {
+ if (*dList != NULL) {
+ sPlayerCurBodyPartPos++;
+ }
+
+ if (limbIndex == PLAYER_LIMB_HEAD) {
+ rot->x += player->headLimbRot.z;
+ rot->y -= player->headLimbRot.y;
+ rot->z += player->headLimbRot.x;
+
+ if (player->transformation == PLAYER_FORM_DEKU) {
+ EnArrow* bubble = NULL;
+
+ if (((player->skelAnime.animation == &gPlayerAnim_pn_drinkend)) ||
+ (player->unk_284.animation == &gPlayerAnim_pn_tamahaki) ||
+ ((player->stateFlags3 & PLAYER_STATE3_40) && ((bubble = (EnArrow*)player->heldActor) != NULL))) {
+ Matrix_TranslateRotateZYX(pos, rot);
+ func_80125340();
+ func_80125318(pos, rot);
+
+ if (bubble != NULL) {
+ s32 requiredScopeTemp[2];
+
+ player->unk_AF0[0].x = 1.0f - (bubble->bubble.unk_144 * 0.03f);
+ player->unk_AF0[0].y = 1.0f - (bubble->bubble.unk_144 * 0.01f);
+ player->unk_AF0[0].z = 1.0f - (bubble->bubble.unk_144 * 0.04f);
+ rot->z = bubble->bubble.unk_144 * 320.0f;
+ } else if (player->skelAnime.animation == &gPlayerAnim_pn_drinkend) {
+ func_80124618(D_801C03E0, player->skelAnime.curFrame, player->unk_AF0);
+ } else {
+ func_80124618(D_801C03C0, player->unk_284.curFrame, player->unk_AF0);
+ }
+
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, MTXMODE_APPLY);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_TORSO) {
+ if ((player->skelAnime.animation == &gPlayerAnim_pg_gakkistart) ||
+ (player->skelAnime.animation == &gPlayerAnim_pg_wait) ||
+ (player->skelAnime.animation == &gPlayerAnim_pg_punchC) ||
+ (player->transformation == PLAYER_FORM_ZORA)) {
+ Matrix_TranslateRotateZYX(pos, rot);
+ if (player->transformation == PLAYER_FORM_GORON) {
+ func_80125340();
+ }
+
+ func_80125318(pos, rot);
+ if ((player->transformation != PLAYER_FORM_ZORA) ||
+ (player->skelAnime.animation == &gPlayerAnim_pz_wait)) {
+ struct_80124618* phi_a0 =
+ (player->skelAnime.animation == &gPlayerAnim_pz_wait)
+ ? D_801C0608
+ : ((player->skelAnime.animation == &gPlayerAnim_pg_wait)
+ ? D_801C0628
+ : ((player->skelAnime.animation == &gPlayerAnim_pg_punchC) ? D_801C07C0
+ : D_801C0460));
+
+ func_80124618(phi_a0, player->skelAnime.curFrame, player->unk_AF0);
+ } else {
+ player->unk_AF0[0].y = 1.0f;
+ }
+
+ if (player->transformation == PLAYER_FORM_ZORA) {
+ player->unk_AF0[0].y *= 1.0f + (0.29999995f * player->unk_B10[0]);
+ player->unk_AF0[0].x = 1.0f;
+ player->unk_AF0[0].z = 1.0f;
+ }
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, MTXMODE_APPLY);
+ }
+ } else if (limbIndex == PLAYER_LIMB_UPPER_ROOT) {
+ s16 rotX;
+ s16 rotZ = 0x44C;
+
+ if (player->unk_AA8 != 0) {
+ Matrix_RotateZS(rotZ, MTXMODE_APPLY);
+ Matrix_RotateYS(player->unk_AA8, MTXMODE_APPLY);
+ }
+
+ if (player->upperLimbRot.y != 0) {
+ Matrix_RotateYS(player->upperLimbRot.y, MTXMODE_APPLY);
+ }
+
+ rotX = player->upperLimbRot.x;
+ if ((player->transformation == PLAYER_FORM_DEKU) && (player->stateFlags3 & PLAYER_STATE3_40)) {
+ if (player->heldActor != NULL) {
+ rotX += (s16)(((EnArrow*)(player->heldActor))->bubble.unk_144 * -470.0f);
+ }
+ }
+
+ Matrix_RotateXS(rotX, MTXMODE_APPLY);
+ if (player->upperLimbRot.z != 0) {
+ Matrix_RotateZS(player->upperLimbRot.z, MTXMODE_APPLY);
+ }
+ } else {
+ func_80125500(play, player, limbIndex, pos, rot);
+ }
+ }
+
+ return false;
+}
+
+void func_80125CE0(Player* player, struct_80124618* arg1, Vec3f* pos, Vec3s* rot) {
+ Matrix_TranslateRotateZYX(pos, rot);
+ func_80125318(pos, rot);
+ func_80124618(arg1, player->skelAnime.curFrame, player->unk_AF0);
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, MTXMODE_APPLY);
+}
+
+s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* actor) {
+ Player* player = (Player*)actor;
+
+ if (!Player_OverrideLimbDrawGameplayCommon(play, limbIndex, dList, pos, rot, &player->actor)) {
+ if (limbIndex == PLAYER_LIMB_LEFT_HAND) {
+ Gfx** leftHandDLists = player->leftHandDLists;
+ EquipValueSword swordEquipValue;
+
+ if (player->stateFlags3 & PLAYER_STATE3_2000) {
+ rot->z -= player->unk_B8C;
+ } else if ((sPlayerLeftHandType == PLAYER_MODELTYPE_LH_4) &&
+ (player->stateFlags1 & PLAYER_STATE1_2000000)) {
+ leftHandDLists = &gPlayerLeftHandOpenDLs[D_801F59E0];
+ sPlayerLeftHandType = PLAYER_MODELTYPE_LH_OPEN;
+ } else if ((player->leftHandType == PLAYER_MODELTYPE_LH_OPEN) && (player->actor.speed > 2.0f) &&
+ !(player->stateFlags1 & PLAYER_STATE1_8000000)) {
+ leftHandDLists = &gPlayerLeftHandClosedDLs[D_801F59E0];
+ sPlayerLeftHandType = PLAYER_MODELTYPE_LH_CLOSED;
+ } else if ((player->leftHandType == PLAYER_MODELTYPE_LH_ONE_HAND_SWORD) &&
+ (player->transformation == PLAYER_FORM_HUMAN) &&
+ ((swordEquipValue = GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD),
+ swordEquipValue != EQUIP_VALUE_SWORD_NONE))) {
+ leftHandDLists = &D_801C018C[2 * ((swordEquipValue - 1) ^ 0)];
+ } else {
+ s32 handIndex = GET_LEFT_HAND_INDEX_FROM_JOINT_TABLE(player->skelAnime.jointTable);
+
+ if (handIndex != 0) {
+ handIndex = (handIndex >> 12) - 1;
+ if (handIndex >= 2) {
+ handIndex = 0;
+ }
+ leftHandDLists = &D_801C095C[handIndex][D_801F59E0];
+ }
+ }
+
+ *dList = leftHandDLists[sPlayerLod];
+
+ if (player->transformation == PLAYER_FORM_GORON) {
+ if (player->skelAnime.animation == &gPlayerAnim_pg_punchA) {
+ func_80125CE0(player, D_801C0750, pos, rot);
+ }
+ } else if (player->transformation == PLAYER_FORM_ZORA) {
+ if ((player->stateFlags1 & PLAYER_STATE1_2) || (player->stateFlags1 & PLAYER_STATE1_400) ||
+ func_801242B4(player)) {
+ *dList = gLinkZoraLeftHandOpenDL;
+ } else {
+ s32 phi_a1 = (player->skelAnime.animation == &gPlayerAnim_pz_gakkistart) &&
+ (player->skelAnime.curFrame >= 6.0f);
+
+ if (phi_a1 || (player->skelAnime.animation == &gPlayerAnim_pz_gakkiplay)) {
+ *dList = object_link_zora_DL_00E2A0;
+ func_80125CE0(player, phi_a1 ? D_801C0538 : D_801C0560, pos, rot);
+ }
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_HAND) {
+ if ((player->transformation == PLAYER_FORM_ZORA) &&
+ (((player->stateFlags1 & PLAYER_STATE1_2)) || (player->stateFlags1 & PLAYER_STATE1_400) ||
+ func_801242B4(player))) {
+ *dList = gLinkZoraRightHandOpenDL;
+ } else {
+ Gfx** rightHandDLists = player->rightHandDLists;
+
+ if (player->stateFlags3 & PLAYER_STATE3_2000) {
+ rot->z -= player->unk_B8C;
+ }
+
+ if (sPlayerRightHandType == PLAYER_MODELTYPE_RH_SHIELD) {
+ if (player->transformation == PLAYER_FORM_HUMAN) {
+ if (player->currentShield != PLAYER_SHIELD_NONE) {
+ //! FAKE
+ rightHandDLists = &gPlayerHandHoldingShields[2 * ((player->currentShield - 1) ^ 0)];
+ }
+ }
+ } else if ((player->rightHandType == PLAYER_MODELTYPE_RH_OPEN) && (player->actor.speed > 2.0f) &&
+ (!(player->stateFlags1 & PLAYER_STATE1_8000000))) {
+ rightHandDLists = &gPlayerRightHandClosedDLs[D_801F59E0];
+ sPlayerRightHandType = PLAYER_MODELTYPE_RH_CLOSED;
+ } else {
+ s32 handIndex = GET_RIGHT_HAND_INDEX_FROM_JOINT_TABLE(player->skelAnime.jointTable);
+
+ if (handIndex != 0) {
+ handIndex = (handIndex >> 8) - 1;
+ rightHandDLists = &D_801C0964[handIndex][D_801F59E0];
+ }
+ }
+
+ *dList = rightHandDLists[sPlayerLod];
+ if (player->skelAnime.animation == &gPlayerAnim_pg_punchB) {
+ func_80125CE0(player, D_801C0784, pos, rot);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_SHEATH) {
+ Gfx** sheathDLists = player->sheathDLists;
+
+ if (player->transformation == PLAYER_FORM_HUMAN) {
+ EquipValueSword swordEquipValue = GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD);
+
+ if (swordEquipValue != EQUIP_VALUE_SWORD_NONE) {
+ if ((player->sheathType == PLAYER_MODELTYPE_SHEATH_14) ||
+ (player->sheathType == PLAYER_MODELTYPE_SHEATH_12)) {
+ sheathDLists = &gPlayerSheathedSwords[2 * ((swordEquipValue - 1) ^ 0)];
+ } else {
+ sheathDLists = &gPlayerSwordSheaths[2 * ((swordEquipValue - 1) ^ 0)];
+ }
+ }
+ }
+
+ *dList = sheathDLists[sPlayerLod];
+ } else if (limbIndex == PLAYER_LIMB_WAIST) {
+ *dList = player->waistDLists[sPlayerLod];
+ } else if (limbIndex == PLAYER_LIMB_HAT) {
+ if (player->transformation == PLAYER_FORM_ZORA) {
+ Matrix_Scale((player->unk_B10[0] * 1) + 1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 Player_OverrideLimbDrawGameplayFirstPerson(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* actor) {
+ Player* player = (Player*)actor;
+
+ if (!Player_OverrideLimbDrawGameplayCommon(play, limbIndex, dList, pos, rot, actor)) {
+ if (player->unk_AA5 != 3) {
+ *dList = NULL;
+ } else if (limbIndex == PLAYER_LIMB_LEFT_FOREARM) {
+ *dList = sPlayerFirstPersonLeftForearmDLs[player->transformation];
+ } else if (limbIndex == PLAYER_LIMB_LEFT_HAND) {
+ *dList = sPlayerFirstPersonLeftHandDLs[player->transformation];
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_SHOULDER) {
+ *dList = sPlayerFirstPersonRightShoulderDLs[player->transformation];
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_HAND) {
+ if (Player_IsHoldingHookshot(player)) {
+ *dList = sPlayerFirstPersonRightHandHookshotDLs[player->transformation];
+ } else {
+ *dList = sPlayerFirstPersonRightHandDLs[player->transformation];
+ }
+ } else {
+ *dList = NULL;
+ }
+ }
+
+ return false;
+}
+
+// Unused remnant of OoT
+s32 Player_OverrideLimbDrawGameplayCrawling(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ Player* player = (Player*)thisx;
+
+ if (!Player_OverrideLimbDrawGameplayCommon(play, limbIndex, dList, pos, rot, thisx)) {
*dList = NULL;
}
return false;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80126440.s")
+s32 func_80126440(PlayState* play, ColliderQuad* collider, WeaponInfo* weaponInfo, Vec3f* newTip, Vec3f* newBase) {
+ if (!weaponInfo->active) {
+ if (collider != NULL) {
+ Collider_ResetQuadAT(play, &collider->base);
+ }
+ Math_Vec3f_Copy(&weaponInfo->tip, newTip);
+ Math_Vec3f_Copy(&weaponInfo->base, newBase);
+ weaponInfo->active = true;
-u8 D_801C096C[PLAYER_SHIELD_MAX] = {
- COLTYPE_METAL,
- COLTYPE_METAL,
- COLTYPE_METAL,
+ return true;
+ }
+
+ if ((weaponInfo->tip.x == newTip->x) && (weaponInfo->tip.y == newTip->y) && (weaponInfo->tip.z == newTip->z)) {
+ if ((weaponInfo->base.x == newBase->x) && (weaponInfo->base.y == newBase->y) &&
+ (weaponInfo->base.z == newBase->z)) {
+ if (collider != NULL) {
+ Collider_ResetQuadAT(play, &collider->base);
+ }
+
+ return false;
+ }
+ }
+
+ if (collider != NULL) {
+ Collider_SetQuadVertices(collider, newBase, newTip, &weaponInfo->base, &weaponInfo->tip);
+ CollisionCheck_SetAT(play, &play->colChkCtx, &collider->base);
+ }
+
+ Math_Vec3f_Copy(&weaponInfo->base, newBase);
+ Math_Vec3f_Copy(&weaponInfo->tip, newTip);
+ weaponInfo->active = true;
+
+ return true;
+}
+
+u8 sPlayerShieldCollisionTypes[PLAYER_SHIELD_MAX] = {
+ COLTYPE_METAL, // PLAYER_SHIELD_NONE
+ COLTYPE_METAL, // PLAYER_SHIELD_HEROS_SHIELD
+ COLTYPE_METAL, // PLAYER_SHIELD_MIRROR_SHIELD
};
-void func_801265C8(PlayState* play, Player* player, ColliderQuad* collider, Vec3f arg3[4]) {
+void Player_UpdateShieldCollider(PlayState* play, Player* player, ColliderQuad* collider, Vec3f quadSrc[4]) {
if (player->stateFlags1 & PLAYER_STATE1_400000) {
- Vec3f sp4C;
- Vec3f sp40;
- Vec3f sp34;
- Vec3f sp28;
+ Vec3f quadDest[4];
- player->shieldQuad.base.colType = D_801C096C[player->currentShield];
- Matrix_MultVec3f(&arg3[0], &sp28);
- Matrix_MultVec3f(&arg3[1], &sp34);
- Matrix_MultVec3f(&arg3[2], &sp40);
- Matrix_MultVec3f(&arg3[3], &sp4C);
- Collider_SetQuadVertices(collider, &sp28, &sp34, &sp40, &sp4C);
+ player->shieldQuad.base.colType = sPlayerShieldCollisionTypes[player->currentShield];
+ Matrix_MultVec3f(&quadSrc[0], &quadDest[0]);
+ Matrix_MultVec3f(&quadSrc[1], &quadDest[1]);
+ Matrix_MultVec3f(&quadSrc[2], &quadDest[2]);
+ Matrix_MultVec3f(&quadSrc[3], &quadDest[3]);
+ Collider_SetQuadVertices(collider, &quadDest[0], &quadDest[1], &quadDest[2], &quadDest[3]);
CollisionCheck_SetAC(play, &play->colChkCtx, &collider->base);
CollisionCheck_SetAT(play, &play->colChkCtx, &collider->base);
}
@@ -1949,47 +2504,75 @@ Gfx* D_801C0B14[] = {
};
u8 D_801C0B1C[] = {
- 0x0C,
- 0x0F,
+ PLAYER_BODYPART_LEFT_HAND,
+ PLAYER_BODYPART_RIGHT_HAND,
};
Gfx* D_801C0B20[] = {
- object_mask_truth_DL_0001A0,
- object_mask_kerfay_DL_000D40,
- object_mask_yofukasi_DL_000490,
- object_mask_rabit_DL_000610,
- object_mask_ki_tan_DL_0004A0,
- object_mask_json_DL_0004C0,
- object_mask_romerny_DL_0007A0,
- object_mask_zacho_DL_000700,
- object_mask_posthat_DL_000290,
- object_mask_meoto_DL_0005A0,
- object_mask_bigelf_DL_0016F0,
- object_mask_gibudo_DL_000250,
- gDonGeroMaskDL,
- object_mask_dancer_DL_000EF0,
- object_mask_skj_DL_0009F0,
- object_mask_stone_DL_000820,
- object_mask_bree_DL_0003C0,
- object_mask_bakuretu_DL_0005C0,
- object_mask_bu_san_DL_000710,
- object_mask_kyojin_DL_000380,
- gameplay_keep_DL_00B260,
- gameplay_keep_DL_005A10,
- gameplay_keep_DL_005360,
- gDekuMaskDL,
+ object_mask_truth_DL_0001A0, // PLAYER_MASK_TRUTH
+ object_mask_kerfay_DL_000D40, // PLAYER_MASK_KAFEIS_MASK
+ object_mask_yofukasi_DL_000490, // PLAYER_MASK_ALL_NIGHT
+ object_mask_rabit_DL_000610, // PLAYER_MASK_BUNNY
+ object_mask_ki_tan_DL_0004A0, // PLAYER_MASK_KEATON
+ object_mask_json_DL_0004C0, // PLAYER_MASK_GARO
+ object_mask_romerny_DL_0007A0, // PLAYER_MASK_ROMANI
+ object_mask_zacho_DL_000700, // PLAYER_MASK_CIRCUS_LEADER
+ object_mask_posthat_DL_000290, // PLAYER_MASK_POSTMAN
+ object_mask_meoto_DL_0005A0, // PLAYER_MASK_COUPLE
+ object_mask_bigelf_DL_0016F0, // PLAYER_MASK_GREAT_FAIRY
+ object_mask_gibudo_DL_000250, // PLAYER_MASK_GIBDO
+ gDonGeroMaskDL, // PLAYER_MASK_DON_GERO
+ object_mask_dancer_DL_000EF0, // PLAYER_MASK_KAMARO
+ object_mask_skj_DL_0009F0, // PLAYER_MASK_CAPTAIN
+ object_mask_stone_DL_000820, // PLAYER_MASK_STONE
+ object_mask_bree_DL_0003C0, // PLAYER_MASK_BREMEN
+ object_mask_bakuretu_DL_0005C0, // PLAYER_MASK_BLAST
+ object_mask_bu_san_DL_000710, // PLAYER_MASK_SCENTS
+ object_mask_kyojin_DL_000380, // PLAYER_MASK_GIANT
+ gameplay_keep_DL_00B260, // PLAYER_MASK_FIERCE_DEITY
+ gameplay_keep_DL_005A10, // PLAYER_MASK_GORON
+ gameplay_keep_DL_005360, // PLAYER_MASK_ZORA
+ gDekuMaskDL, // PLAYER_MASK_DEKU
object_mask_boy_DL_000900,
object_mask_goron_DL_0014A0,
object_mask_zora_DL_000DB0,
object_mask_nuts_DL_001D90,
};
-Vec3f D_801C0B90[] = {
+Vec3f D_801C0B90[D_801F59B0_LEN] = {
{ 950.0f, -800.0f, 300.0f },
{ 950.0f, -800.0f, -300.0f },
};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_8012669C.s")
+void func_8012669C(PlayState* play, Player* player, Vec3f* arg2, Vec3f* arg3) {
+ Vec3f sp3C;
+ Vec3f sp30;
+
+ Matrix_MultVec3f(arg2, &sp3C);
+ Matrix_MultVec3f(arg3, &sp30);
+
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
+ if (func_80126440(play, NULL, &player->meleeWeaponInfo[0], &sp3C, &sp30) &&
+ (player->transformation != PLAYER_FORM_GORON) && (!(player->stateFlags1 & PLAYER_STATE1_400000))) {
+ EffectBlure_AddVertex(Effect_GetByIndex(player->meleeWeaponEffectIndex[0]), &player->meleeWeaponInfo[0].tip,
+ &player->meleeWeaponInfo[0].base);
+ }
+
+ if ((player->meleeWeaponState >= PLAYER_MELEE_WEAPON_STATE_1) &&
+ ((player->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) ||
+ (player->stateFlags2 & PLAYER_STATE2_20000))) {
+ Matrix_MultVec3f(&arg2[1], &sp3C);
+ Matrix_MultVec3f(&arg3[1], &sp30);
+ func_80126440(play, &player->meleeWeaponQuads[0], &player->meleeWeaponInfo[1], &sp3C, &sp30);
+ Matrix_MultVec3f(&arg2[2], &sp3C);
+ Matrix_MultVec3f(&arg3[2], &sp30);
+ func_80126440(play, &player->meleeWeaponQuads[1], &player->meleeWeaponInfo[2], &sp3C, &sp30);
+ }
+ } else {
+ Math_Vec3f_Copy(&player->meleeWeaponInfo[0].tip, &sp3C);
+ Math_Vec3f_Copy(&player->meleeWeaponInfo[0].base, &sp30);
+ }
+}
void Player_DrawGetItemImpl(PlayState* play, Player* player, Vec3f* refPos, s32 drawIdPlusOne) {
f32 sp34;
@@ -2038,21 +2621,203 @@ void Player_DrawGetItem(PlayState* play, Player* player) {
refPos.y = player->actor.world.pos.y + 28.0f;
}
} else {
- Math_Vec3f_Copy(&refPos, &D_801F59E8);
+ Math_Vec3f_Copy(&refPos, &sPlayerGetItemRefPos);
}
- drawIdPlusOne = ABS_ALT(player->getItemDrawId);
+ drawIdPlusOne = ABS_ALT(player->getItemDrawIdPlusOne);
Player_DrawGetItemImpl(play, player, &refPos, drawIdPlusOne);
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80126AB4.s")
+void func_80126AB4(Player* player, Vec3f** arg1) {
+ if ((player->transformation == PLAYER_FORM_GORON) || (player->actor.id == ACTOR_EN_TEST3)) {
+ Math_Vec3f_Copy(&player->unk_AF0[1], &player->meleeWeaponInfo[0].base);
+ *arg1 = D_801C09B8;
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80126B8C.s")
+ D_801C0994[1].x = D_801C0994[0].x;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80126BD0.s")
+ if (player->unk_ADD >= 3) {
+ player->unk_ADD++;
+ D_801C0994[1].x *= 1.0f + ((9 - player->unk_ADD) * 0.1f);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_801271B0.s")
+ D_801C0994[1].x += 1200.0f;
+ D_801C0994[2].x = D_801C0994[1].x;
+ *arg1 = D_801C0994;
+}
+
+void func_80126B8C(PlayState* play, Player* player) {
+ Vec3f* sp1C;
+
+ func_80126AB4(player, &sp1C);
+ func_8012669C(play, player, sp1C, D_801C0970);
+}
+
+// Zora boomerangs (?)
+void func_80126BD0(PlayState* play, Player* player, s32 arg2) {
+ if ((player->transformation != PLAYER_FORM_ZORA) || (player->rightHandType == PLAYER_MODELTYPE_RH_HOOKSHOT)) {
+ return;
+ }
+
+ if ((arg2 != 0) && (player->stateFlags1 & PLAYER_STATE1_400000)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, object_link_zora_DL_0110A8);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else {
+ Actor* boomerangActor = player->boomerangActor;
+ Vec3f sp58;
+ Vec3f sp4C;
+
+ if (player->stateFlags1 & PLAYER_STATE1_2000000) {
+ if (player->boomerangActor == NULL) {
+ return;
+ }
+ if ((player->boomerangActor->params == arg2) ||
+ (((boomerangActor->child != NULL)) && (boomerangActor->child->params == arg2))) {
+ return;
+ }
+ }
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if ((player->skelAnime.animation != &gPlayerAnim_pz_gakkiplay) &&
+ (player->skelAnime.animation != &gPlayerAnim_pz_fishswim)) {
+ if (player->skelAnime.animation == &gPlayerAnim_pz_gakkistart) {
+ func_80124618(D_801C0580, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_waterroll) {
+ func_80124618(D_801C05A8, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_swimtowait) {
+ func_80124618(D_801C05D8, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_bladeon) {
+ func_80124618(D_801C07F0, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_jumpAT) {
+ func_80124618(D_801C0820, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_jumpATend) {
+ func_80124618(D_801C0838, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->heldItemAction == PLAYER_IA_ZORA_FINS) {
+ player->unk_AF0[0].x = 1.0f;
+ player->unk_AF0[0].y = 1.0f;
+ player->unk_AF0[0].z = 1.0f;
+ } else {
+ player->unk_AF0[0].x = 0.4f;
+ player->unk_AF0[0].y = 0.6f;
+ player->unk_AF0[0].z = 0.7f;
+ }
+ Matrix_Push();
+
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, 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_801C0AB4[arg2]);
+
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
+ if ((((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_LEFT)) && (arg2 == 0)) ||
+ ((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_COMBO) && (arg2 != 0))) {
+ func_8012669C(play, player, D_801C0A00, D_801C09DC);
+ }
+ }
+
+ Matrix_Pop();
+ }
+
+ if (player->skelAnime.animation == &gPlayerAnim_pz_waterroll) {
+ func_80124618(D_801C05C8, player->skelAnime.curFrame, player->unk_AF0);
+ D_801C05F0[0].unk_2.x = 50;
+ D_801C05F0[0].unk_2.y = 50;
+ D_801C05F0[0].unk_2.z = 50;
+ D_801C05F0[1].unk_2 = D_801C05F0[0].unk_2;
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_swimtowait) {
+ func_80124618(D_801C05F0, player->skelAnime.curFrame, player->unk_AF0);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pz_fishswim) {
+ player->unk_AF0[0].x = (ABS_ALT(player->unk_B8A) * 0.00003f) + 0.5f;
+ player->unk_AF0[0].y = player->unk_AF0[0].x;
+ player->unk_AF0[0].z = player->unk_AF0[0].x;
+
+ D_801C05F0[0].unk_2.x = (player->unk_AF0[0].x * 100.0f);
+
+ D_801C05F0[0].unk_2.y = D_801C05F0[0].unk_2.x;
+ D_801C05F0[0].unk_2.z = D_801C05F0[0].unk_2.x;
+
+ D_801C05F0[1].unk_2 = D_801C05F0[0].unk_2;
+ } else {
+ //! @bug Skips CLOSE_DISPS
+ return;
+ }
+
+ Matrix_Push();
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, 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_801C0ABC[arg2]);
+
+ Matrix_MultVec3f(&D_801C0AC4[arg2], &sp58);
+ Matrix_MultVec3f(&D_801C0ADC[arg2], &sp4C);
+
+ if (func_80126440(play, NULL, &player->meleeWeaponInfo[arg2], &sp58, &sp4C) &&
+ (player->stateFlags1 & PLAYER_STATE1_8000000)) {
+ EffectBlure_AddVertex(Effect_GetByIndex(player->meleeWeaponEffectIndex[arg2]),
+ &player->meleeWeaponInfo[arg2].tip, &player->meleeWeaponInfo[arg2].base);
+ }
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+}
+
+s32 func_801271B0(PlayState* play, Player* player, s32 arg2) {
+ if (player->transformation == PLAYER_FORM_DEKU) {
+ if (((player->skelAnime.animation == &gPlayerAnim_pn_kakku)) ||
+ (player->skelAnime.animation == &gPlayerAnim_pn_kakkufinish) ||
+ (player->skelAnime.animation == &gPlayerAnim_pn_rakkafinish) ||
+ (player->skelAnime.animation == &gPlayerAnim_pn_batabata)) {
+ struct_80124618** sp3C = D_801C0AF4;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (player->skelAnime.animation == &gPlayerAnim_pn_kakkufinish) {
+ sp3C = D_801C0AFC;
+ } else if (player->skelAnime.animation == &gPlayerAnim_pn_batabata) {
+ sp3C = D_801C0B0C;
+ } else if (player->skelAnime.animation == &gPlayerAnim_pn_rakkafinish) {
+ sp3C = D_801C0B04;
+ }
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 150.0f, 0.0f, MTXMODE_APPLY);
+ func_80124618(sp3C[0], player->skelAnime.curFrame, &player->unk_AF0[1]);
+ Matrix_Scale(player->unk_AF0[1].x, player->unk_AF0[1].y, player->unk_AF0[1].z, 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_801C0B14[arg2]);
+
+ Matrix_Translate(2150.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_RotateXS(player->unk_B8A, MTXMODE_APPLY);
+ func_80124618(sp3C[1], player->skelAnime.curFrame, &player->unk_AF0[1]);
+ Matrix_Scale(player->unk_AF0[1].x, player->unk_AF0[1].y, player->unk_AF0[1].z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Close flower / Open flower
+ gSPDisplayList(POLY_OPA_DISP++,
+ player->actor.velocity.y < -6.0f ? gLinkDekuClosedFlowerDL : gLinkDekuOpenFlowerDL);
+
+ Matrix_MultZero(&player->bodyPartsPos[D_801C0B1C[arg2]]);
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+
+ return true;
+ }
+ }
+
+ return false;
+}
// Player_SetMaskSegment?
s32 func_80127438(PlayState* play, Player* player, s32 currentMask) {
@@ -2086,7 +2851,7 @@ void Player_DrawCouplesMask(PlayState* play, Player* player) {
AnimatedMat_DrawOpa(play, Lib_SegmentedToVirtual(&object_mask_meoto_Matanimheader_001CD8));
}
-void Player_DrawCircusLeadersMask(PlayState* play, Actor* actor) {
+void Player_DrawCircusLeadersMask(PlayState* play, Player* player) {
static Vec3f bubbleVelocity = { 0.0f, 0.0f, 0.0f };
static Vec3f bubbleAccel = { 0.0f, 0.0f, 0.0f };
Gfx* gfx;
@@ -2096,7 +2861,7 @@ void Player_DrawCircusLeadersMask(PlayState* play, Actor* actor) {
gfx = POLY_XLU_DISP;
- for (i = 0; i < ARRAY_COUNT(D_801C0B90); i++) {
+ for (i = 0; i < D_801F59B0_LEN; i++) {
f32 scaleY = (D_801F59C8[i] / 400.0f) * 0.1f;
Matrix_MultVec3f(&D_801C0B90[i], &D_801F59B0[i]);
@@ -2106,7 +2871,7 @@ void Player_DrawCircusLeadersMask(PlayState* play, Actor* actor) {
D_801F59B0[i].y += -10.0f * scaleY;
- if (D_801F59C8[i] < 0x190) {
+ if (D_801F59C8[i] < 400) {
f32 scaleXZ = CLAMP_MAX(scaleY, 0.05f);
Matrix_Push();
@@ -2124,12 +2889,11 @@ void Player_DrawCircusLeadersMask(PlayState* play, Actor* actor) {
gfx = &gfx[6];
} else {
- Player* player = (Player*)actor;
- f32 temp_f0 = sqrtf(SQ(player->actor.velocity.x) + SQ(player->actor.velocity.z));
- s16 phi_s0 = temp_f0 * 2000.0f;
+ f32 speedXZ = sqrtf(SQ(player->actor.velocity.x) + SQ(player->actor.velocity.z));
+ s16 phi_s0 = speedXZ * 2000.0f;
f32 temp_f20;
- bubbleVelocity.y = temp_f0 * 0.4f;
+ bubbleVelocity.y = speedXZ * 0.4f;
bubbleAccel.y = -0.3f;
if (phi_s0 > 0x3E80) {
@@ -2137,17 +2901,14 @@ void Player_DrawCircusLeadersMask(PlayState* play, Actor* actor) {
}
phi_s0 = player->actor.focus.rot.y + ((i != 0) ? phi_s0 : -phi_s0);
- temp_f20 = temp_f0 * 0.2f;
-
- if (temp_f20 > 4.0f) {
- temp_f20 = 4.0f;
- }
+ temp_f20 = speedXZ * 0.2f;
+ temp_f20 = CLAMP_MAX(temp_f20, 4.0f);
bubbleVelocity.x = -Math_SinS(phi_s0) * temp_f20;
bubbleVelocity.z = -Math_CosS(phi_s0) * temp_f20;
EffectSsDtBubble_SpawnColorProfile(play, &D_801F59B0[i], &bubbleVelocity, &bubbleAccel, 20, 20, 3, 0);
- D_801F59C8[i] -= 0x190;
+ D_801F59C8[i] -= 400;
}
}
@@ -2214,7 +2975,7 @@ Vec3f D_801C0C30[] = {
{ 301.0f, -729.0f, 699.0f },
};
-typedef struct {
+typedef struct struct_80128388_arg1 {
/* 0x00 */ f32 unk_00;
/* 0x04 */ s16 unk_04;
/* 0x06 */ s16 unk_06;
@@ -2230,91 +2991,237 @@ struct_80128388_arg1 D_801C0C54[] = {
{ 30.0f, 0x0000, 0x0000, { 0.0f, 0.0f, 0.0f }, 20.0f, 0x1F40, 0x2EE0 },
};
-Color_RGB8 D_801C0CA8[] = {
- { 255, 255, 255 }, { 80, 80, 255 }, { 136, 192, 255 }, { 136, 192, 255 }, { 184, 232, 232 }, { 248, 200, 0 },
- { 255, 180, 0 }, { 0, 128, 0 }, { 252, 238, 0 }, { 131, 0, 174 }, { 64, 64, 32 }, { 0, 0, 255 },
- { 255, 0, 255 }, { 255, 0, 255 }, { 255, 0, 0 }, { 0, 0, 255 }, { 0, 200, 0 }, { 255, 255, 255 },
- { 255, 255, 255 }, { 255, 255, 255 }, { 80, 80, 255 },
+Color_RGB8 sPlayerBottleColors[PLAYER_BOTTLE_MAX] = {
+ { 255, 255, 255 }, // PLAYER_BOTTLE_EMPTY
+ { 80, 80, 255 }, // PLAYER_BOTTLE_FISH
+ { 136, 192, 255 }, // PLAYER_BOTTLE_SPRING_WATER
+ { 136, 192, 255 }, // PLAYER_BOTTLE_HOT_SPRING_WATER
+ { 184, 232, 232 }, // PLAYER_BOTTLE_ZORA_EGG
+ { 248, 200, 0 }, // PLAYER_BOTTLE_DEKU_PRINCESS
+ { 255, 180, 0 }, // PLAYER_BOTTLE_GOLD_DUST
+ { 0, 128, 0 }, // PLAYER_BOTTLE_1C
+ { 252, 238, 0 }, // PLAYER_BOTTLE_SEAHORSE
+ { 131, 0, 174 }, // PLAYER_BOTTLE_MUSHROOM
+ { 64, 64, 32 }, // PLAYER_BOTTLE_HYLIAN_LOACH
+ { 0, 0, 255 }, // PLAYER_BOTTLE_BUG
+ { 255, 0, 255 }, // PLAYER_BOTTLE_POE
+ { 255, 0, 255 }, // PLAYER_BOTTLE_BIG_POE
+ { 255, 0, 0 }, // PLAYER_BOTTLE_POTION_RED
+ { 0, 0, 255 }, // PLAYER_BOTTLE_POTION_BLUE
+ { 0, 200, 0 }, // PLAYER_BOTTLE_POTION_GREEN
+ { 255, 255, 255 }, // PLAYER_BOTTLE_MILK
+ { 255, 255, 255 }, // PLAYER_BOTTLE_MILK_HALF
+ { 255, 255, 255 }, // PLAYER_BOTTLE_CHATEAU
+ { 80, 80, 255 }, // PLAYER_BOTTLE_FAIRY
};
Vec3f D_801C0CE8[PLAYER_FORM_MAX] = {
- { 0.0f, 0.0f, 0.0f }, { 300.0f, 300.0f, -230.0f }, { 0.0f, 90.0f, -50.0f },
- { 0.0f, 20.0f, -60.0f }, { 0.0f, 0.0f, 0.0f },
-};
-Vec3f D_801C0D24[PLAYER_FORM_MAX] = {
- { 200.0f, 300.0f, 0.0f }, { 200.0f, 200.0f, 0.0f }, { 200.0f, 300.0f, 0.0f },
- { 200.0f, 150.0f, 0.0f }, { 200.0f, 200.0f, 0.0f },
-};
-Vec3f D_801C0D60 = { 398.0f, 1419.0f, 244.0f };
-Vec3f D_801C0D6C = { 420.0f, 1210.0f, 380.0f };
-
-f32 D_801C0D78[] = {
- 0.0f, // Player is not holding a melee weapon
- 3000.0f, // PLAYER_IA_SWORD_KOKIRI
- 3000.0f, // PLAYER_IA_SWORD_RAZOR
- 4000.0f, // PLAYER_IA_SWORD_GILDED
- 5500.0f, // PLAYER_IA_SWORD_GREAT_FAIRY
- -1.0f, // PLAYER_IA_STICK
- 2500.0f, // PLAYER_IA_ZORA_FINS
+ { 0.0f, 0.0f, 0.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { 300.0f, 300.0f, -230.0f }, // PLAYER_FORM_GORON
+ { 0.0f, 90.0f, -50.0f }, // PLAYER_FORM_ZORA
+ { 0.0f, 20.0f, -60.0f }, // PLAYER_FORM_DEKU
+ { 0.0f, 0.0f, 0.0f }, // PLAYER_FORM_HUMAN
};
-Gfx* D_801C0D94 = object_link_child_DL_017818;
+void Player_DrawBunnyHood(PlayState* play) {
+ Mtx* mtx = GRAPH_ALLOC(play->state.gfxCtx, 2 * sizeof(Mtx));
+ Vec3s earRot;
-f32 D_801C0D98 = -35.0f;
+ OPEN_DISPS(play->state.gfxCtx);
-f32 D_801C0D9C = -395.0f;
-f32 D_801C0DA0 = 0.0f;
+ gSPSegment(POLY_OPA_DISP++, 0x0B, mtx);
-f32 D_801C0DA4 = 0.0f;
+ Matrix_Push();
-Vec3f D_801C0DA8[4] = {
- { -4500.0f, -3000.0f, -600.0f },
- { 1500.0f, -3000.0f, -600.0f },
- { -4500.0f, 3000.0f, -600.0f },
- { 1500.0f, 3000.0f, -600.0f },
-};
+ earRot.x = sBunnyEarKinematics.rot.y + 0x3E2;
+ earRot.y = sBunnyEarKinematics.rot.z + 0xDBE;
+ earRot.z = sBunnyEarKinematics.rot.x - 0x348A;
+ Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f, -240.0f, &earRot);
-Vec3f D_801C0DD8 = { 50.0f, 800.0f, 0.0f };
-Vec3f D_801C0DE4 = { 50.0f, 850.0f, 0.0f };
-Gfx* D_801C0DF0[] = {
- object_link_goron_DL_010590, object_link_goron_DL_010368, object_link_goron_DL_010140,
- object_link_goron_DL_00FF18, object_link_goron_DL_00FCF0,
-};
+ Matrix_ToMtx(mtx++);
-Vec2f D_801C0E04[PLAYER_FORM_MAX] = {
- { 140.0f, -130.0f }, { 0.0f, -200.0f }, { -160.0f, 0.0f }, { 220.0f, -200.0f }, { 0.0f, 0.0f },
-};
+ earRot.x = sBunnyEarKinematics.rot.y - 0x3E2;
+ earRot.y = -sBunnyEarKinematics.rot.z - 0xDBE;
+ earRot.z = sBunnyEarKinematics.rot.x - 0x348A;
+ Matrix_SetTranslateRotateYXZ(97.0f, -1203.0f, 240.0f, &earRot);
-Gfx* D_801C0E2C[] = {
- object_link_nuts_DL_007A28, object_link_nuts_DL_0077D0, object_link_nuts_DL_007548,
- object_link_nuts_DL_007900, object_link_nuts_DL_0076A0,
-};
-Vec3f D_801C0E40[PLAYER_FORM_MAX] = {
- { 0.0f, 0.0f, 0.0f }, { -578.3f, -1100.9f, 0.0f }, { -189.5f, -594.87f, 0.0f },
- { -570.0f, -812.0f, 0.0f }, { -230.0f, -520.0f, 0.0f },
-};
-Vec3f D_801C0E7C = { 1100.0f, -700.0f, 0.0f };
+ Matrix_ToMtx(mtx);
-// unused
-Vec3f D_801C0E88 = { 1600.0f, -1700.0f, -70.0f };
+ Matrix_Pop();
-Vec3f D_801C0E94 = { 1800.0f, -300.0f, 0.0f };
-Vec3f D_801C0EA0 = { 1300.0f, -400.0f, 0.0f };
-Vec3f D_801C0EAC = { 630.0f, 100.0f, -30.0f };
-Vec3s D_801C0EB8 = { 0, 0, 0x7FFF };
+ CLOSE_DISPS(play->state.gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/Player_DrawBunnyHood.s")
+void func_80127B64(struct_801F58B0 arg0[], s32 count, Vec3f* arg2) {
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80127B64.s")
+ for (i = 0; i < count; i++, arg0++) {
+ Math_Vec3f_Copy(&arg0->unk_00, arg2);
+ Math_Vec3f_Copy(&arg0->unk_0C, &gZeroVec3f);
+ arg0->unk_18 = 0;
+ arg0->unk_1A = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80127BE8.s")
+// Draws the Great Fairy's Mask particles when a stray fairy is in the room
+void Player_DrawStrayFairyParticles(PlayState* play, Vec3f* arg1) {
+ Vec3f sp2C;
+ f32 sp28;
+
+ D_801C0BE0.y = Rand_ZeroFloat(0.07f) + -0.1f;
+ D_801C0BEC.y = Rand_ZeroFloat(0.1f) + 0.04f;
+ if (Rand_ZeroOne() < 0.5f) {
+ sp28 = -1.0f;
+ } else {
+ sp28 = 1.0f;
+ }
+
+ D_801C0BE0.x = (Rand_ZeroFloat(0.2f) + 0.1f) * sp28;
+ D_801C0BEC.x = 0.1f * sp28;
+ if (Rand_ZeroOne() < 0.5f) {
+ sp28 = -1.0f;
+ } else {
+ sp28 = 1.0f;
+ }
+
+ D_801C0BE0.z = (Rand_ZeroFloat(0.2f) + 0.1f) * sp28;
+ D_801C0BEC.z = 0.1f * sp28;
+ sp2C.x = arg1->x;
+ sp2C.y = Rand_ZeroFloat(15.0f) + arg1->y;
+ sp2C.z = arg1->z;
+ EffectSsKirakira_SpawnDispersed(play, &sp2C, &D_801C0BE0, &D_801C0BEC, &D_801C0BF8, &D_801C0BFC, -50, 11);
+}
void func_80127DA4(PlayState* play, struct_801F58B0 arg1[], struct_80128388_arg1 arg2[], s32 arg3, Vec3f* arg4,
- Vec3f* arg5, u32* arg6);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80127DA4.s")
+ Vec3f* arg5, u32* arg6) {
+ struct_801F58B0* phi_s1 = &arg1[1];
+ Vec3f spB0;
+ Vec3f spA4;
+ f32 f22;
+ f32 f28;
+ f32 f24;
+ f32 f20;
+ f32 f0;
+ f32 sp8C = -1.0f;
+ s32 i;
+ s16 s0;
+ s16 s2;
-void func_80128388(struct_801F58B0 arg0[], struct_80128388_arg1 arg1[], s32 arg2, Mtx** arg3);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80128388.s")
+ Math_Vec3f_Copy(&arg1->unk_00, arg4);
+ Math_Vec3f_Diff(arg5, arg4, &spB0);
+ arg1->unk_18 = Math_Atan2S_XY(spB0.z, spB0.x);
+ arg1->unk_1A = Math_Atan2S_XY(sqrtf(SQXZ(spB0)), spB0.y);
+ i = 1;
+ arg2++;
+
+ while (i < arg3) {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_3) {
+ if (*arg6 & 0x20) {
+ sp8C = -0.2f;
+ } else {
+ sp8C = 0.2f;
+ }
+
+ *arg6 += 0x16;
+ if (!(*arg6 & 1)) {
+ Player_DrawStrayFairyParticles(play, &phi_s1->unk_00);
+ }
+ }
+ Math_Vec3f_Sum(&phi_s1->unk_00, &phi_s1->unk_0C, &phi_s1->unk_00);
+
+ f0 = Math_Vec3f_DistXYZAndStoreDiff(&arg1->unk_00, &phi_s1->unk_00, &spB0);
+ f28 = f0 - arg2->unk_00;
+ if (f0 == 0.0f) {
+ spB0.x = 0.0f;
+ spB0.y = arg2->unk_00;
+ spB0.z = 0.0f;
+ }
+ f20 = sqrtf(SQXZ(spB0));
+
+ if (f20 > 4.0f) {
+ phi_s1->unk_18 = Math_Atan2S_XY(spB0.z, spB0.x);
+ s2 = phi_s1->unk_18 - arg1->unk_18;
+
+ if (ABS_ALT(s2) > 0x4000) {
+ phi_s1->unk_18 = (s16)(phi_s1->unk_18 + 0x8000);
+ f20 = -f20;
+ }
+ }
+
+ phi_s1->unk_1A = Math_Atan2S_XY(f20, spB0.y);
+
+ s2 = phi_s1->unk_18 - arg1->unk_18;
+ s2 = CLAMP(s2, -arg2->unk_18, arg2->unk_18);
+ phi_s1->unk_18 = arg1->unk_18 + s2;
+
+ s0 = phi_s1->unk_1A - arg1->unk_1A;
+ s0 = CLAMP(s0, -arg2->unk_1A, arg2->unk_1A);
+ phi_s1->unk_1A = arg1->unk_1A + s0;
+
+ f20 = Math_CosS(phi_s1->unk_1A) * arg2->unk_00;
+ spA4.x = Math_SinS(phi_s1->unk_18) * f20;
+ spA4.z = Math_CosS(phi_s1->unk_18) * f20;
+ spA4.y = Math_SinS(phi_s1->unk_1A) * arg2->unk_00;
+ Math_Vec3f_Sum(&arg1->unk_00, &spA4, &phi_s1->unk_00);
+ phi_s1->unk_0C.x *= 0.9f;
+ phi_s1->unk_0C.z *= 0.9f;
+
+ f22 = Math_CosS(s0) * f28;
+ f24 = Math_SinS(s0) * f28;
+ phi_s1->unk_0C.y += sp8C;
+
+ if (play->actorCtx.flags & ACTORCTX_FLAG_3) {
+ phi_s1->unk_0C.y = CLAMP(phi_s1->unk_0C.y, -0.8f, 0.8f);
+ } else {
+ phi_s1->unk_0C.y = phi_s1->unk_0C.y;
+ f20 = Math_SinS(arg1->unk_1A);
+ phi_s1->unk_0C.y += (((f22 * Math_CosS(arg1->unk_1A)) + (f24 * f20)) * 0.2f);
+ phi_s1->unk_0C.y = CLAMP(phi_s1->unk_0C.y, -2.0f, 4.0f);
+ }
+
+ f20 = (f24 * Math_CosS(arg1->unk_1A)) - (Math_SinS(arg1->unk_1A) * f22);
+ f22 = Math_CosS(s2) * f20;
+ f24 = Math_SinS(s2) * f20;
+
+ f20 = Math_SinS(arg1->unk_18);
+
+ phi_s1->unk_0C.x += (((f24 * Math_CosS(arg1->unk_18)) - (f22 * f20)) * 0.1f);
+ phi_s1->unk_0C.x = CLAMP(phi_s1->unk_0C.x, -4.0f, 4.0f);
+
+ f20 = Math_SinS(arg1->unk_18);
+
+ phi_s1->unk_0C.z += (((f22 * Math_CosS(arg1->unk_18)) + (f24 * f20)) * -0.1f);
+ phi_s1->unk_0C.z = CLAMP(phi_s1->unk_0C.z, -4.0f, 4.0f);
+
+ arg1++;
+ phi_s1++;
+ i++;
+ arg2++;
+ }
+}
+
+void func_80128388(struct_801F58B0 arg0[], struct_80128388_arg1 arg1[], s32 arg2, Mtx** arg3) {
+ struct_801F58B0* phi_s1 = &arg0[1];
+ Vec3f sp58;
+ Vec3s sp50;
+ s32 i;
+
+ sp58.y = 0.0f;
+ sp58.z = 0.0f;
+ sp50.x = 0;
+
+ for (i = 1; i < arg2; i++) {
+ sp58.x = arg1->unk_00 * 100.0f;
+ sp50.z = arg1->unk_06 + (s16)(phi_s1->unk_1A - arg0->unk_1A);
+ sp50.y = arg1->unk_04 + (s16)(phi_s1->unk_18 - arg0->unk_18);
+ Matrix_TranslateRotateZYX(&sp58, &sp50);
+ Matrix_ToMtx(*arg3);
+ (*arg3)++;
+ arg0++;
+ phi_s1++;
+ arg1++;
+ }
+}
void Player_DrawGreatFairysMask(PlayState* play, Player* player) {
s32 pad;
@@ -2331,7 +3238,8 @@ void Player_DrawGreatFairysMask(PlayState* play, Player* player) {
gSPSegment(POLY_OPA_DISP++, 0x0B, mtx);
Matrix_MultVec3f(&D_801C0C00, &D_801C0C54[1].unk_08);
- Math_Vec3f_Lerp(&player->bodyPartsPos[7], &player->bodyPartsPos[0], 0.2f, &D_801C0C54[2].unk_08);
+ Math_Vec3f_Lerp(&player->bodyPartsPos[PLAYER_BODYPART_HEAD], &player->bodyPartsPos[PLAYER_BODYPART_WAIST], 0.2f,
+ &D_801C0C54[2].unk_08);
for (i = 0; i < ARRAY_COUNT(D_801C0C0C); i++) {
Matrix_MultVec3f(iter, &sp84);
@@ -2351,8 +3259,599 @@ void Player_DrawGreatFairysMask(PlayState* play, Player* player) {
CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80128640.s")
+s32 func_80128640(PlayState* play, Player* player, Gfx* dlist) {
+ s32 temp_v1 = player->skelAnime.animation == &gPlayerAnim_cl_maskoff;
+ f32 temp_f0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80128B74.s")
+ if (temp_v1 ||
+ ((player->currentMask != PLAYER_MASK_NONE) && (player->skelAnime.animation == &gPlayerAnim_cl_setmask) &&
+ (temp_f0 = player->skelAnime.curFrame - 8.0f, (temp_f0 >= 0.0f)) && (temp_f0 < 4.0f)) ||
+ (player->stateFlags2 & PLAYER_STATE2_1000000)) {
+ s32 mask;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_player_lib/func_80128BD0.s")
+ if (temp_v1) {
+ mask = player->prevMask;
+ } else {
+ mask = player->currentMask;
+ }
+
+ if (func_80127438(play, player, mask)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_Translate(-323.67f, 412.15f, -969.96f, MTXMODE_APPLY);
+ Matrix_RotateZYX(-0x32BE, -0x50DE, -0x7717, 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_801C0B20[mask - 1]);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ } else if (player->itemAction == PLAYER_IA_STICK) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_Translate(-428.26f, 267.2f, -33.82f, MTXMODE_APPLY);
+ Matrix_RotateZYX(-0x8000, 0, 0x4000, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, player->unk_B0C, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gDekuStickDL);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else if (player->leftHandType == PLAYER_MODELTYPE_LH_BOTTLE) {
+ PlayerBottle bottle = Player_BottleFromIA(player, player->itemAction);
+ Vec3f* temp_v1_2 = &D_801C0CE8[player->transformation];
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_Translate(temp_v1_2->x, temp_v1_2->y, temp_v1_2->z, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Note this does not check for PLAYER_BOTTLE_NONE, which would produce an OoB access on sPlayerBottleColors.
+ // Under normal circunstances it should not be a problem because of the previous
+ // `player->leftHandType == PLAYER_MODELTYPE_LH_BOTTLE` check
+ if (bottle != PLAYER_BOTTLE_EMPTY) {
+ Color_RGB8* bottleColor = &sPlayerBottleColors[bottle];
+
+ gDPSetEnvColor(POLY_XLU_DISP++, bottleColor->r, bottleColor->g, bottleColor->b, 0);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_000320);
+ }
+
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0003E0);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else if (dlist == object_link_zora_DL_00E2A0) { // zora guitar
+ s16 sp26 = Math_SinS(player->unk_B86[0]) * (ABS_ALT(player->upperLimbRot.x) * ((f32)(IREG(52) + 20)) / 100.0f);
+ s16 sp24 = Math_SinS(player->unk_B86[1]) * (ABS_ALT(player->upperLimbRot.y) * ((f32)(IREG(53) + 15)) / 100.0f);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_RotateXS(sp26, MTXMODE_APPLY);
+ Matrix_RotateYS(sp24, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, object_link_zora_DL_00E088); // hand
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+Vec3f sPlayerFootPos[PLAYER_FORM_MAX] = {
+ { 200.0f, 300.0f, 0.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { 200.0f, 200.0f, 0.0f }, // PLAYER_FORM_GORON
+ { 200.0f, 300.0f, 0.0f }, // PLAYER_FORM_ZORA
+ { 200.0f, 150.0f, 0.0f }, // PLAYER_FORM_DEKU
+ { 200.0f, 200.0f, 0.0f }, // PLAYER_FORM_HUMAN
+};
+
+void Player_SetFeetPos(PlayState* play, Player* player, s32 limbIndex) {
+ Vec3f* footPos = &sPlayerFootPos[player->transformation];
+
+ Actor_SetFeetPos(&player->actor, limbIndex, PLAYER_LIMB_LEFT_FOOT, footPos, PLAYER_LIMB_RIGHT_FOOT, footPos);
+}
+
+void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dList2, Vec3s* rot, Actor* actor) {
+ Player* player = (Player*)actor;
+
+ if (*dList2 != NULL) {
+ Matrix_MultZero(sPlayerCurBodyPartPos);
+ }
+
+ if (limbIndex == PLAYER_LIMB_LEFT_HAND) {
+ Math_Vec3f_Copy(&player->leftHandWorld.pos, sPlayerCurBodyPartPos);
+
+ if ((*dList1 != NULL) && !func_801271B0(play, player, 0) && !func_80128640(play, player, *dList1) &&
+ (player->skelAnime.animation == &gPlayerAnim_pg_punchA)) {
+ func_80127488(play, player, D_801C0778[(s32)player->skelAnime.curFrame]);
+ }
+
+ if (player->actor.scale.y >= 0.0f) {
+ Actor* heldActor;
+ MtxF sp230;
+
+ if (!Player_IsHoldingHookshot(player) && ((heldActor = player->heldActor) != NULL)) {
+ if ((player->stateFlags3 & PLAYER_STATE3_40) && (player->transformation != PLAYER_FORM_DEKU)) {
+ static Vec3f D_801C0D60 = { 398.0f, 1419.0f, 244.0f };
+ static Vec3f D_801C0D6C = { 420.0f, 1210.0f, 380.0f };
+ Vec3s* temp_s1;
+ Vec3f* var_a0 = &D_801C0D60;
+
+ if (player->transformation == PLAYER_FORM_HUMAN) {
+ var_a0 = &D_801C0D6C;
+ }
+
+ Matrix_MultVec3f(var_a0, &heldActor->world.pos);
+ Matrix_RotateZYX(0x69E8, -0x5708, 0x458E, MTXMODE_APPLY);
+
+ Matrix_Get(&sp230);
+ temp_s1 = &heldActor->world.rot;
+ Matrix_MtxFToYXZRot(&sp230, temp_s1, false);
+ heldActor->shape.rot = *temp_s1;
+ } else if (player->stateFlags1 & PLAYER_STATE1_800) {
+ heldActor->world.rot.y = heldActor->shape.rot.y =
+ player->actor.shape.rot.y + player->leftHandWorld.rot.y;
+ }
+ } else {
+ static f32 sMeleeWeaponLengths[PLAYER_MELEEWEAPON_MAX] = {
+ 0.0f, // PLAYER_MELEEWEAPON_NONE
+ 3000.0f, // PLAYER_MELEEWEAPON_SWORD_KOKIRI
+ 3000.0f, // PLAYER_MELEEWEAPON_SWORD_RAZOR
+ 4000.0f, // PLAYER_MELEEWEAPON_SWORD_GILDED
+ 5500.0f, // PLAYER_MELEEWEAPON_SWORD_TWO_HANDED
+ -1.0f, // PLAYER_MELEEWEAPON_STICK
+ 2500.0f, // PLAYER_MELEEWEAPON_ZORA_FINS
+ };
+
+ if ((player->transformation == PLAYER_FORM_FIERCE_DEITY) ||
+ ((player->transformation != PLAYER_FORM_ZORA) &&
+ ((player->itemAction == PLAYER_IA_STICK) ||
+ ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (player->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_RIGHT) &&
+ (player->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_BUTT))))) {
+ if (player->itemAction == PLAYER_IA_STICK) {
+ D_801C0994->x = player->unk_B0C * 5000.0f;
+ } else {
+ D_801C0994->x = sMeleeWeaponLengths[Player_GetMeleeWeaponHeld(player)];
+ }
+ func_80126B8C(play, player);
+ }
+
+ Matrix_Get(&player->leftHandMf);
+ Matrix_MtxFToYXZRot(&player->leftHandMf, &player->leftHandWorld.rot, false);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_HAND) {
+ Actor* heldActor = player->heldActor;
+ s32 pad;
+
+ if (*dList1 != NULL) {
+ if (player->rightHandType == PLAYER_MODELTYPE_RH_BOW) {
+ static Gfx* D_801C0D94 = object_link_child_DL_017818;
+ static Vec3f D_801C0D98 = { -35.0f, -395.0f, 0.0f };
+ // Unused
+ static s32 D_801C0DA4 = 0;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ Matrix_Translate(D_801C0D98.x, D_801C0D98.y, D_801C0D98.z, MTXMODE_APPLY);
+ if ((player->stateFlags3 & PLAYER_STATE3_40) && (player->unk_B28 >= 0) && (player->unk_ACC < 0xB)) {
+ Vec3f sp20C;
+ f32 temp_fv0;
+ s32 pad2;
+
+ Matrix_MultZero(&sp20C);
+ temp_fv0 = Math_Vec3f_DistXYZ(sPlayerCurBodyPartPos, &sp20C);
+ player->unk_B08 = temp_fv0 - 3.0f;
+ if (temp_fv0 < 3.0f) {
+ player->unk_B08 = 0.0f;
+ } else {
+ player->unk_B08 *= 1.6f;
+ if (player->unk_B08 > 1.0f) {
+ player->unk_B08 = 1.0f;
+ }
+ }
+ player->unk_B0C = -0.5f;
+ }
+ Matrix_Scale(1.0f, player->unk_B08, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_801C0D94);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else if (player->skelAnime.animation == &gPlayerAnim_pg_punchB) {
+ func_80127488(play, player, D_801C07AC[(s32)player->skelAnime.curFrame]);
+ } else {
+ func_801271B0(play, player, 1);
+ }
+ }
+
+ if (player->actor.scale.y >= 0.0f) {
+ if (player->rightHandType == PLAYER_MODELTYPE_RH_FF) {
+ Matrix_Get(&player->shieldMf);
+ } else if (player->rightHandType == PLAYER_MODELTYPE_RH_SHIELD) {
+ // Coordinates of the shield quad collider vertices, in the right hand limb's own model space.
+ static Vec3f sRightHandLimbModelShieldQuadVertices[4] = {
+ { -4500.0f, -3000.0f, -600.0f },
+ { 1500.0f, -3000.0f, -600.0f },
+ { -4500.0f, 3000.0f, -600.0f },
+ { 1500.0f, 3000.0f, -600.0f },
+ };
+
+ Matrix_Get(&player->shieldMf);
+ Player_UpdateShieldCollider(play, player, &player->shieldQuad, sRightHandLimbModelShieldQuadVertices);
+ } else if (player->rightHandType == PLAYER_MODELTYPE_RH_HOOKSHOT) {
+ static Vec3f D_801C0DD8 = { 50.0f, 800.0f, 0.0f };
+
+ Matrix_MultVec3f(&D_801C0DD8, &player->rightHandWorld.pos);
+
+ if (heldActor != NULL) {
+ static Vec3f D_801C0DE4 = { 50.0f, 850.0f, 0.0f };
+ MtxF sp1BC;
+
+ Matrix_MultVec3f(&D_801C0DE4, &heldActor->world.pos);
+ Matrix_RotateZYX(0, -0x4000, -0x4000, MTXMODE_APPLY);
+ Matrix_Get(&sp1BC);
+ Matrix_MtxFToYXZRot(&sp1BC, &heldActor->world.rot, false);
+ heldActor->shape.rot = heldActor->world.rot;
+ if (func_800B7128(player)) {
+ Matrix_Translate(500.0f, 300.0f, 0.0f, MTXMODE_APPLY);
+ Player_DrawHookshotReticle(play, player, 77600.0f);
+ }
+ }
+ } else if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
+ if (player->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_RIGHT) {
+ func_80126B8C(play, player);
+ }
+ }
+ if ((player->getItemDrawIdPlusOne != (GID_NONE + 1)) ||
+ ((func_800B7118(player) == 0) && (heldActor != NULL))) {
+ if (!(player->stateFlags1 & PLAYER_STATE1_400) && (player->getItemDrawIdPlusOne != (GID_NONE + 1)) &&
+ (player->exchangeItemId != PLAYER_IA_NONE)) {
+ Math_Vec3f_Copy(&sPlayerGetItemRefPos, &player->leftHandWorld.pos);
+ } else {
+ sPlayerGetItemRefPos.x =
+ (player->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].x + player->leftHandWorld.pos.x) * 0.5f;
+ sPlayerGetItemRefPos.y =
+ (player->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].y + player->leftHandWorld.pos.y) * 0.5f;
+ sPlayerGetItemRefPos.z =
+ (player->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].z + player->leftHandWorld.pos.z) * 0.5f;
+ }
+
+ if (player->getItemDrawIdPlusOne == (GID_NONE + 1)) {
+ Math_Vec3f_Copy(&heldActor->world.pos, &sPlayerGetItemRefPos);
+ }
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_LEFT_FOREARM) {
+ func_80126BD0(play, player, 0);
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_FOREARM) {
+ func_80126BD0(play, player, 1);
+ } else if (limbIndex == PLAYER_LIMB_TORSO) {
+ if (player->transformation == PLAYER_FORM_GORON) {
+ s32 temp_a0 = player->skelAnime.animation == &gPlayerAnim_pg_gakkistart;
+ s32 temp_v1_3 = player->skelAnime.animation == &gPlayerAnim_pg_gakkiwait;
+
+ if ((temp_a0 || temp_v1_3 || (player->skelAnime.animation == &gPlayerAnim_pg_gakkiplay))) {
+ static Gfx* D_801C0DF0[] = {
+ object_link_goron_DL_010590, object_link_goron_DL_010368, object_link_goron_DL_010140,
+ object_link_goron_DL_00FF18, object_link_goron_DL_00FCF0,
+ };
+ Vec3f sp178[ARRAY_COUNT(D_801C0DF0)];
+ s32 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (temp_v1_3) {
+ f32* var_v0 = player->unk_B10;
+
+ for (i = 0; i < ARRAY_COUNT(sp178); i++, var_v0++) {
+ func_80124618(D_801C0510, *var_v0, &sp178[i]);
+ }
+ } else {
+ if (temp_a0 != 0) {
+ func_8012536C();
+ func_80124618(D_801C0428, player->skelAnime.curFrame, &player->unk_AF0[1]);
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sp178); i++) {
+ Math_Vec3f_Copy(&sp178[i], &player->unk_AF0[1]);
+ }
+ }
+ Matrix_Push();
+ Matrix_Scale(player->unk_AF0[1].x, player->unk_AF0[1].y, player->unk_AF0[1].z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPDisplayList(POLY_OPA_DISP++, object_link_goron_DL_00FC18);
+
+ Matrix_Pop();
+
+ for (i = 0; i < ARRAY_COUNT(sp178); i++) {
+ Matrix_Push();
+ Matrix_Scale(sp178[i].x, sp178[i].y, sp178[i].z, 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_801C0DF0[i]);
+ Matrix_Pop();
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_HEAD) {
+ //! FAKE
+ if (((*dList1 != NULL) && ((((void)0, player->currentMask)) != (((void)0, PLAYER_MASK_NONE)))) &&
+ (((player->transformation == PLAYER_FORM_HUMAN) &&
+ ((player->skelAnime.animation != &gPlayerAnim_cl_setmask) || (player->skelAnime.curFrame >= 12.0f))) ||
+ ((((player->transformation != PLAYER_FORM_HUMAN) && (player->currentMask >= PLAYER_MASK_FIERCE_DEITY)) &&
+ ((player->transformation + PLAYER_MASK_FIERCE_DEITY) != player->currentMask)) &&
+ (player->skelAnime.curFrame >= 10.0f)))) {
+ if (func_80127438(play, player, player->currentMask)) {
+ s32 maskMinusOne = ((void)0, player->currentMask) - 1;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (((void)0, player->currentMask) == PLAYER_MASK_COUPLE) {
+ Player_DrawCouplesMask(play, player);
+ } else if (((void)0, player->currentMask) == PLAYER_MASK_CIRCUS_LEADER) {
+ Player_DrawCircusLeadersMask(play, player);
+ } else if (((void)0, player->currentMask) == PLAYER_MASK_BLAST) {
+ Player_DrawBlastMask(play, player);
+ } else if (((void)0, player->currentMask) == PLAYER_MASK_BUNNY) {
+ Player_DrawBunnyHood(play);
+ } else if (((void)0, player->currentMask) == PLAYER_MASK_GREAT_FAIRY) {
+ Player_DrawGreatFairysMask(play, player);
+ } else if (((void)0, player->currentMask) >= PLAYER_MASK_FIERCE_DEITY) {
+ static Vec2f D_801C0E04[PLAYER_FORM_MAX] = {
+ { 140.0f, -130.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { 0.0f, -200.0f }, // PLAYER_FORM_GORON
+ { -160.0f, 0.0f }, // PLAYER_FORM_ZORA
+ { 220.0f, -200.0f }, // PLAYER_FORM_DEKU
+ { 0.0f, 0.0f }, // PLAYER_FORM_HUMAN
+ };
+ Vec2f* temp_s0_4 = &D_801C0E04[player->transformation];
+
+ Matrix_Push();
+ Matrix_Translate(temp_s0_4->x, temp_s0_4->z, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 1.0f - player->unk_B10[3], 1.0f - player->unk_B10[2], MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ Matrix_Pop();
+
+ if (((player->skelAnime.animation == &gPlayerAnim_cl_setmask) &&
+ (player->skelAnime.curFrame >= 51.0f)) ||
+ (player->skelAnime.animation == &gPlayerAnim_cl_setmaskend)) {
+ maskMinusOne += 4;
+ }
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, D_801C0B20[maskMinusOne]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ } else if (player->transformation == PLAYER_FORM_DEKU) {
+ if (player->skelAnime.animation == &gPlayerAnim_pn_gurd) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ func_80124618(D_801C0410, player->skelAnime.curFrame, player->unk_AF0);
+ Matrix_Push();
+
+ Matrix_Scale(player->unk_AF0[0].x, player->unk_AF0[0].y, player->unk_AF0[0].z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, object_link_nuts_DL_00A348);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ } else {
+ s32 temp_v1_5 = player->skelAnime.animation == &gPlayerAnim_pn_gakkistart;
+
+ if (temp_v1_5 || (player->skelAnime.animation == &gPlayerAnim_pn_gakkiplay) ||
+ (player->skelAnime.animation == &gPlayerAnim_dl_kokeru)) {
+ static Gfx* D_801C0E2C[] = {
+ object_link_nuts_DL_007A28, object_link_nuts_DL_0077D0, object_link_nuts_DL_007548,
+ object_link_nuts_DL_007900, object_link_nuts_DL_0076A0,
+ };
+ Vec3f spF0[ARRAY_COUNT(D_801C0E2C)];
+ s32 i;
+ f32* temp;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (temp_v1_5) {
+ Vec3f spD4;
+
+ func_80124618(D_801C0340, player->skelAnime.curFrame, &spD4);
+ player->arr_AF0[0] = spD4.x;
+ func_80124618(D_801C0368, player->skelAnime.curFrame, spF0);
+
+ for (i = 0; i < ARRAY_COUNT(spF0) - 1; i++) {
+ Math_Vec3f_Copy(&spF0[i + 1], spF0);
+ }
+
+ temp = &player->arr_AF0[1];
+ for (i = 0; i < ARRAY_COUNT(spF0); i++) {
+ *temp = spF0[0].x;
+ temp++;
+ }
+ } else {
+ temp = &player->arr_AF0[1];
+ for (i = 0; i < ARRAY_COUNT(spF0); i++) {
+ spF0[i].x = *temp;
+ spF0[i].y = *temp;
+ spF0[i].z = *temp;
+ temp++;
+ }
+ }
+
+ Matrix_Push();
+ Matrix_Scale(player->arr_AF0[0], player->arr_AF0[0], player->arr_AF0[0], MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, object_link_nuts_DL_007390);
+
+ Matrix_Pop();
+
+ for (i = 0; i < ARRAY_COUNT(spF0); i++) {
+ Matrix_Push();
+
+ Matrix_Scale(spF0[i].x, spF0[i].y, spF0[i].z, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ //! FAKE (yes, all of them are required)
+ // https://decomp.me/scratch/AdU3G
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ if (1) {}
+ gSPDisplayList(POLY_OPA_DISP++, D_801C0E2C[i]);
+
+ Matrix_Pop();
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ }
+ }
+
+ if ((player->stateFlags1 & (PLAYER_STATE1_2 | PLAYER_STATE1_100)) && (player->unk_AE8 != 0)) {
+ static Vec3f D_801C0E40[PLAYER_FORM_MAX] = {
+ { 0.0f, 0.0f, 0.0f }, // PLAYER_FORM_FIERCE_DEITY
+ { -578.3f, -1100.9f, 0.0f }, // PLAYER_FORM_GORON
+ { -189.5f, -594.87f, 0.0f }, // PLAYER_FORM_ZORA
+ { -570.0f, -812.0f, 0.0f }, // PLAYER_FORM_DEKU
+ { -230.0f, -520.0f, 0.0f }, // PLAYER_FORM_HUMAN
+ };
+ Vec3f* temp_s0_7 = &D_801C0E40[player->transformation];
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(gameplay_keep_Matanimheader_054F18));
+ Matrix_Translate(temp_s0_7->x, temp_s0_7->y, 0.0f, MTXMODE_APPLY);
+ if (player->transformation == PLAYER_FORM_ZORA) {
+ Matrix_Scale(0.7f, 0.7f, 0.7f, MTXMODE_APPLY);
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, (u8)player->unk_AE8);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_054C90);
+
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+ if (player->actor.scale.y >= 0.0f) {
+ static Vec3f sPlayerFocusHeadLimbModelPos = { 1100.0f, -700.0f, 0.0f };
+ static Vec3f D_801C0E88 = { 1600.0f, -1700.0f, -70.0f }; // unused
+ Actor* spA8 = NULL;
+
+ if (player->transformation != PLAYER_FORM_DEKU) {
+ Matrix_MultVec3f(&sPlayerFocusHeadLimbModelPos, &player->actor.focus.pos);
+ } else {
+ static Vec3f D_801C0E94 = { 1800.0f, -300.0f, 0.0f };
+
+ Matrix_MultVec3f(&sPlayerFocusHeadLimbModelPos, &player->actor.focus.pos);
+ Matrix_MultVec3f(&D_801C0E94, sPlayerCurBodyPartPos);
+ if ((player->skelAnime.animation == &gPlayerAnim_pn_drinkend) ||
+ (player->unk_284.animation == &gPlayerAnim_pn_tamahaki) ||
+ ((player->stateFlags3 & PLAYER_STATE3_40) && ((spA8 = player->heldActor) != NULL))) {
+ if (spA8 != NULL) {
+ static Vec3f D_801C0EA0 = { 1300.0f, -400.0f, 0.0f };
+ MtxF sp68;
+
+ Matrix_Push();
+ Matrix_MultVec3f(&D_801C0EA0, &spA8->world.pos);
+ Matrix_RotateZYX(0, 0x4000, 0, MTXMODE_APPLY);
+ Matrix_Get(&sp68);
+ Matrix_MtxFToYXZRot(&sp68, &spA8->world.rot, false);
+ spA8->shape.rot = spA8->world.rot;
+ Matrix_Pop();
+ }
+ }
+ }
+ }
+ } else if ((limbIndex == PLAYER_LIMB_HAT) && (player->stateFlags3 & PLAYER_STATE3_100000)) {
+ Vec3f sp5C;
+ Vec3f sp50;
+
+ Matrix_MultVecX(3000.0f, &sp5C);
+ Matrix_MultVecX(2300.0f, &sp50);
+ if (func_80126440(play, NULL, player->meleeWeaponInfo, &sp5C, &sp50)) {
+ EffectBlure_AddVertex(Effect_GetByIndex(player->meleeWeaponEffectIndex[0]), &player->meleeWeaponInfo[0].tip,
+ &player->meleeWeaponInfo[0].base);
+ }
+ } else if (limbIndex == PLAYER_LIMB_RIGHT_SHIN) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
+ if ((player->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_ZORA_JUMPKICK_START) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_ZORA_JUMPKICK_FINISH)) {
+ func_8012669C(play, player, D_801C0A48, D_801C0A24);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_WAIST) {
+ if (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) {
+ if (player->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_BUTT) {
+ Math_Vec3f_Copy(&player->unk_AF0[1], &player->meleeWeaponInfo[0].base);
+ func_8012669C(play, player, D_801C0A90, D_801C0A6C);
+ }
+ }
+ } else if (limbIndex == PLAYER_LIMB_SHEATH) {
+ if ((*dList1 != NULL) && (player->transformation == PLAYER_FORM_HUMAN) &&
+ (player->currentShield != PLAYER_SHIELD_NONE) &&
+ ((player->sheathType == PLAYER_MODELTYPE_SHEATH_14) ||
+ (player->sheathType == PLAYER_MODELTYPE_SHEATH_15))) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gPlayerShields[2 * ((player->currentShield - 1) ^ 0)]);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (player->actor.scale.y >= 0.0f) {
+ if ((player->rightHandType != PLAYER_MODELTYPE_RH_SHIELD) &&
+ (player->rightHandType != PLAYER_MODELTYPE_RH_FF)) {
+ static Vec3f sSheathLimbModelShieldOnBackPos = { 630.0f, 100.0f, -30.0f };
+ static Vec3s sSheathLimbModelShieldOnBackZyxRot = { 0, 0, 0x7FFF };
+
+ Matrix_TranslateRotateZYX(&sSheathLimbModelShieldOnBackPos, &sSheathLimbModelShieldOnBackZyxRot);
+ Matrix_Get(&player->shieldMf);
+ }
+ }
+ } else if (player->actor.scale.y >= 0.0f) {
+ Player_SetFeetPos(play, player, limbIndex);
+ }
+
+ func_8012536C();
+}
diff --git a/src/code/z_prenmi.c b/src/code/z_prenmi.c
index e0381153a..097d4d946 100644
--- a/src/code/z_prenmi.c
+++ b/src/code/z_prenmi.c
@@ -1,3 +1,4 @@
+#include "global.h"
#include "z_prenmi.h"
void PreNMI_Stop(PreNMIState* this) {
@@ -9,10 +10,9 @@ void PreNMI_Update(PreNMIState* this) {
if (this->timer == 0) {
ViConfig_UpdateVi(1);
PreNMI_Stop(this);
- return;
+ } else {
+ this->timer--;
}
-
- this->timer--;
}
void PreNMI_Draw(PreNMIState* this) {
@@ -22,7 +22,7 @@ void PreNMI_Draw(PreNMIState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C470(gfxCtx);
+ Gfx_SetupDL36_Opa(gfxCtx);
gDPSetFillColor(POLY_OPA_DISP++, (GPACK_RGBA5551(255, 255, 255, 1) << 16) | GPACK_RGBA5551(255, 255, 255, 1));
gDPFillRectangle(POLY_OPA_DISP++, 0, this->timer + 100, SCREEN_WIDTH - 1, this->timer + 100);
@@ -48,7 +48,7 @@ void PreNMI_Init(GameState* thisx) {
this->state.main = PreNMI_Main;
this->state.destroy = PreNMI_Destroy;
this->timer = 30;
- this->unkA8 = 10;
+ this->unk_A8 = 10;
Game_SetFramerateDivisor(&this->state, 1);
}
diff --git a/src/code/z_quake.c b/src/code/z_quake.c
index 8a6b9d73a..8225c6347 100644
--- a/src/code/z_quake.c
+++ b/src/code/z_quake.c
@@ -1,37 +1,31 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64quake.h"
#include "z64view.h"
typedef struct {
- /* 0x00 */ s16 randIndex;
- /* 0x02 */ s16 countdownMax;
+ /* 0x00 */ s16 index;
+ /* 0x02 */ s16 duration;
/* 0x04 */ Camera* camera;
/* 0x08 */ u32 type;
- /* 0x0C */ s16 verticalMag;
- /* 0x0E */ s16 horizontalMag;
- /* 0x10 */ s16 zoom;
- /* 0x12 */ s16 rollOffset;
- /* 0x14 */ Vec3s shakePlaneOffset; // angle deviations from shaking in the perpendicular plane
+ /* 0x0C */ s16 y;
+ /* 0x0E */ s16 x;
+ /* 0x10 */ s16 fov;
+ /* 0x12 */ s16 upRollOffset;
+ /* 0x14 */ Vec3s orientation; // alters the orientation of the xy perturbation. Only x (pitch) and y (yaw) are used
/* 0x1A */ s16 speed;
- /* 0x1C */ s16 isShakePerpendicular;
- /* 0x1E */ s16 countdown;
+ /* 0x1C */ s16 isRelativeToScreen; // is the quake relative to the screen or on world coordinates
+ /* 0x1E */ s16 timer;
/* 0x20 */ s16 camId;
} QuakeRequest; // size = 0x24
typedef struct {
/* 0x0 */ PlayState* play;
/* 0x4 */ s32 type; // bitfield, highest set bit determines type
- /* 0x8 */ s16 countdown;
+ /* 0x8 */ s16 timer;
/* 0xA */ s16 state;
} DistortionRequest; // size = 0xC
-typedef struct {
- /* 0x00 */ Vec3f atOffset;
- /* 0x0C */ Vec3f eyeOffset;
- /* 0x18 */ s16 rollOffset;
- /* 0x1A */ s16 zoom;
-} ShakeInfo; // size = 0x1C
-
typedef s16 (*QuakeCallbackFunc)(QuakeRequest*, ShakeInfo*);
typedef enum {
@@ -40,230 +34,257 @@ typedef enum {
/* 2 */ DISTORTION_SETUP
} DistortionState;
-QuakeRequest sQuakeRequest[4];
+QuakeRequest sQuakeRequests[4];
DistortionRequest sDistortionRequest;
-static s16 sIsQuakeInitialized = true;
+static s16 sQuakeUnused = 1;
static s16 sQuakeRequestCount = 0;
f32 Quake_Random(void) {
return 2.0f * (Rand_ZeroOne() - 0.5f);
}
-void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 verticalPertubation, f32 horizontalPertubation) {
+void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 xOffset) {
Vec3f* at = &req->camera->at;
Vec3f* eye = &req->camera->eye;
Vec3f atEyeOffset;
- VecSph atEyeOffsetSph2;
- VecSph eyeAtAngle;
+ VecSph geo;
+ VecSph eyeToAtGeo;
- // isShakePerpendicular is always set to 1 before reaching this conditional
- // alternative is an unused fixed vertical shake
- if (req->isShakePerpendicular) {
+ if (req->isRelativeToScreen) {
atEyeOffset.x = 0;
atEyeOffset.y = 0;
atEyeOffset.z = 0;
- OLib_Vec3fDiffToVecSphGeo(&eyeAtAngle, eye, at);
+ OLib_Vec3fDiffToVecGeo(&eyeToAtGeo, eye, at);
- atEyeOffsetSph2.r = req->verticalMag * verticalPertubation;
- atEyeOffsetSph2.pitch = eyeAtAngle.pitch + req->shakePlaneOffset.x + 0x4000;
- atEyeOffsetSph2.yaw = eyeAtAngle.yaw + req->shakePlaneOffset.y;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ // y shake
+ geo.r = req->y * yOffset;
+ // point unit vector up, then add on `req->orientation`
+ geo.pitch = eyeToAtGeo.pitch + req->orientation.x + 0x4000;
+ geo.yaw = eyeToAtGeo.yaw + req->orientation.y;
+ // apply y shake
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
- atEyeOffsetSph2.r = req->horizontalMag * horizontalPertubation;
- atEyeOffsetSph2.pitch = eyeAtAngle.pitch + req->shakePlaneOffset.x;
- atEyeOffsetSph2.yaw = eyeAtAngle.yaw + req->shakePlaneOffset.y + 0x4000;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ // x shake
+ geo.r = req->x * xOffset;
+ // point unit vector left, then add on `req->orientation`
+ geo.pitch = eyeToAtGeo.pitch + req->orientation.x;
+ geo.yaw = eyeToAtGeo.yaw + req->orientation.y + 0x4000;
+ // apply x shake
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
} else {
atEyeOffset.x = 0;
- atEyeOffset.y = req->verticalMag * verticalPertubation;
+ atEyeOffset.y = req->y * yOffset;
atEyeOffset.z = 0;
- atEyeOffsetSph2.r = req->horizontalMag * horizontalPertubation;
- atEyeOffsetSph2.pitch = req->shakePlaneOffset.x;
- atEyeOffsetSph2.yaw = req->shakePlaneOffset.y;
+ geo.r = req->x * xOffset;
+ geo.pitch = req->orientation.x;
+ geo.yaw = req->orientation.y;
- OLib_VecSphAddToVec3f(&atEyeOffset, &atEyeOffset, &atEyeOffsetSph2);
+ OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo);
}
shake->atOffset = shake->eyeOffset = atEyeOffset;
- shake->rollOffset = req->rollOffset * verticalPertubation;
- shake->zoom = req->zoom * verticalPertubation;
+ shake->upRollOffset = req->upRollOffset * yOffset;
+ shake->fovOffset = req->fov * yOffset;
}
s16 Quake_CallbackType1(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Math_SinS(req->speed * req->countdown);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType5(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Math_SinS(req->speed * req->countdown);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType6(QuakeRequest* req, ShakeInfo* shake) {
- f32 perpendicularPertubation;
+ f32 xyOffset;
- req->countdown--;
- perpendicularPertubation = Math_SinS(req->speed * ((req->countdown & 0xF) + 500));
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
+ req->timer--;
+ xyOffset = Math_SinS(req->speed * ((req->timer & 0xF) + 500));
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+
+ // Not returning the timer ensures quake type 6 continues indefinitely until manually removed
return 1;
}
s16 Quake_CallbackType3(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation =
- Math_SinS(req->speed * req->countdown) * ((f32)req->countdown / (f32)req->countdownMax);
+ if (req->timer > 0) {
+ f32 xyOffset = Math_SinS(req->speed * req->timer) * ((f32)req->timer / req->duration);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType2(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Quake_Random();
+ if (req->timer > 0) {
+ f32 xyOffset = Quake_Random();
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_CallbackType4(QuakeRequest* req, ShakeInfo* shake) {
- if (req->countdown > 0) {
- f32 perpendicularPertubation = Quake_Random() * ((f32)req->countdown / (f32)req->countdownMax);
+ if (req->timer > 0) {
+ f32 xyOffset = Quake_Random() * ((f32)req->timer / req->duration);
- Quake_UpdateShakeInfo(req, shake, perpendicularPertubation, Rand_ZeroOne() * perpendicularPertubation);
- req->countdown--;
+ Quake_UpdateShakeInfo(req, shake, xyOffset, Rand_ZeroOne() * xyOffset);
+ req->timer--;
}
- return req->countdown;
+ return req->timer;
}
s16 Quake_GetFreeIndex(void) {
s32 i;
- s32 ret = 0;
- s32 min = 0x10000;
+ s32 index = 0;
+ s32 timerMin = UINT16_MAX + 1; // timer is a short, so start with a value beyond its range
- for (i = 0; i < ARRAY_COUNT(sQuakeRequest); i++) {
- if (sQuakeRequest[i].type == 0) {
- ret = i;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ if (sQuakeRequests[i].type == QUAKE_TYPE_NONE) {
+ index = i;
break;
}
- if (sQuakeRequest[i].countdown < min) {
- min = sQuakeRequest[i].countdown;
- ret = i;
+ if (timerMin > sQuakeRequests[i].timer) {
+ timerMin = sQuakeRequests[i].timer;
+ index = i;
}
}
- return ret;
+ return index;
}
-QuakeRequest* Quake_AddImpl(Camera* camera, u32 type) {
+QuakeRequest* Quake_RequestImpl(Camera* camera, u32 type) {
s16 index = Quake_GetFreeIndex();
- QuakeRequest* req = &sQuakeRequest[index];
+ QuakeRequest* req = &sQuakeRequests[index];
__osMemset(req, 0, sizeof(QuakeRequest));
+
req->camera = camera;
req->camId = camera->camId;
req->type = type;
- req->isShakePerpendicular = true;
- req->randIndex = ((s16)(Rand_ZeroOne() * 0x10000) & ~3) + index;
+ req->isRelativeToScreen = true;
+
+ // Add a unique random identifier to the upper bits of the index
+ // The `~3` assumes there are only 4 requests
+ req->index = index + ((s16)(Rand_ZeroOne() * 0x10000) & ~3);
+
sQuakeRequestCount++;
return req;
}
-void Quake_RemoveRequest(QuakeRequest* req) {
- req->type = 0;
- req->countdown = -1;
+void Quake_Remove(QuakeRequest* req) {
+ req->type = QUAKE_TYPE_NONE;
+ req->timer = -1;
sQuakeRequestCount--;
}
-QuakeRequest* Quake_GetRequest(s16 quakeIndex) {
- QuakeRequest* req = &sQuakeRequest[quakeIndex & 3];
+QuakeRequest* Quake_GetRequest(s16 index) {
+ QuakeRequest* req = &sQuakeRequests[index & 3];
- if (req->type == 0) {
+ if (req->type == QUAKE_TYPE_NONE) {
return NULL;
}
- if (quakeIndex != req->randIndex) {
+ if (index != req->index) {
return NULL;
}
return req;
}
-u32 Quake_SetValue(s16 quakeIndex, s16 valueType, s16 value) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+// valueType for Quake_SetValue()
+#define QUAKE_SPEED (1 << 0)
+#define QUAKE_Y_OFFSET (1 << 1)
+#define QUAKE_X_OFFSET (1 << 2)
+#define QUAKE_FOV (1 << 3)
+#define QUAKE_ROLL (1 << 4)
+#define QUAKE_ORIENTATION_PITCH (1 << 5)
+#define QUAKE_ORIENTATION_YAW (1 << 6)
+#define QUAKE_ORIENTATION_ROLL (1 << 7)
+#define QUAKE_DURATION (1 << 8)
+#define QUAKE_IS_RELATIVE_TO_SCREEN (1 << 9)
+
+u32 Quake_SetValue(s16 index, s16 valueType, s16 value) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req == NULL) {
return false;
- } else {
- switch (valueType) {
- case QUAKE_SPEED:
- req->speed = value;
- break;
-
- case QUAKE_VERTICAL_MAG:
- req->verticalMag = value;
- break;
-
- case QUAKE_HORIZONTAL_MAG:
- req->horizontalMag = value;
- break;
-
- case QUAKE_ZOOM:
- req->zoom = value;
- break;
-
- case QUAKE_ROLL_OFFSET:
- req->rollOffset = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_X:
- req->shakePlaneOffset.x = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_Y:
- req->shakePlaneOffset.y = value;
- break;
-
- case QUAKE_SHAKE_PLANE_OFFSET_Z:
- req->shakePlaneOffset.z = value;
- break;
-
- case QUAKE_COUNTDOWN:
- req->countdown = value;
- req->countdownMax = req->countdown;
- break;
-
- case QUAKE_IS_SHAKE_PERPENDICULAR:
- req->isShakePerpendicular = value;
- break;
-
- default:
- break;
- }
-
- return true;
}
+
+ switch (valueType) {
+ case QUAKE_SPEED:
+ req->speed = value;
+ break;
+
+ case QUAKE_Y_OFFSET:
+ req->y = value;
+ break;
+
+ case QUAKE_X_OFFSET:
+ req->x = value;
+ break;
+
+ case QUAKE_FOV:
+ req->fov = value;
+ break;
+
+ case QUAKE_ROLL:
+ req->upRollOffset = value;
+ break;
+
+ case QUAKE_ORIENTATION_PITCH:
+ req->orientation.x = value;
+ break;
+
+ case QUAKE_ORIENTATION_YAW:
+ req->orientation.y = value;
+ break;
+
+ case QUAKE_ORIENTATION_ROLL:
+ req->orientation.z = value;
+ break;
+
+ case QUAKE_DURATION:
+ req->timer = value;
+ req->duration = req->timer;
+ break;
+
+ case QUAKE_IS_RELATIVE_TO_SCREEN:
+ req->isRelativeToScreen = value;
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
}
-u32 Quake_SetSpeed(s16 quakeIndex, s16 speed) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index
+ * @param speed for periodic types only, the angular frequency of the sine wave (binang / frame)
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetSpeed(s16 index, s16 speed) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
req->speed = speed;
@@ -272,45 +293,67 @@ u32 Quake_SetSpeed(s16 quakeIndex, s16 speed) {
return false;
}
-u32 Quake_SetCountdown(s16 quakeIndex, s16 countdown) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param duration number of frames to apply the quake
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetDuration(s16 index, s16 duration) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->countdown = countdown;
- req->countdownMax = req->countdown;
+ req->duration = req->timer = duration;
return true;
}
return false;
}
-s16 Quake_GetCountdown(s16 quakeIndex) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to get
+ * @return number of frames until the quake is finished
+ */
+s16 Quake_GetTimeLeft(s16 index) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- return req->countdown;
+ return req->timer;
}
return 0;
}
-u32 Quake_SetQuakeValues(s16 quakeIndex, s16 verticalMag, s16 horizontalMag, s16 zoom, s16 rollOffset) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param y apply up/down shake
+ * @param x apply left/right shake
+ * @param fov apply zooming in/out shake (binang)
+ * @param roll apply rolling shake (binang)
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetPerturbations(s16 index, s16 y, s16 x, s16 fov, s16 roll) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->verticalMag = verticalMag;
- req->horizontalMag = horizontalMag;
- req->zoom = zoom;
- req->rollOffset = rollOffset;
+ req->y = y;
+ req->x = x;
+ req->fov = fov;
+ req->upRollOffset = roll;
return true;
}
return false;
}
-u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakePlaneOffset) {
- QuakeRequest* req = Quake_GetRequest(quakeIndex);
+/**
+ * @param index quake request index to apply
+ * @param isRelativeToScreen is the quake applied relative to the screen or in absolute world coordinates
+ * @param orientation orient the x/y shake to a different direction
+ * @return true if successfully applied, false if the request does not exist
+ */
+u32 Quake_SetOrientation(s16 index, s16 isRelativeToScreen, Vec3s orientation) {
+ QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- req->isShakePerpendicular = isShakePerpendicular;
- req->shakePlaneOffset = shakePlaneOffset;
+ req->isRelativeToScreen = isRelativeToScreen;
+ req->orientation = orientation;
return true;
}
return false;
@@ -319,156 +362,167 @@ u32 Quake_SetQuakeValues2(s16 quakeIndex, s16 isShakePerpendicular, Vec3s shakeP
void Quake_Init(void) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(sQuakeRequest); i++) {
- sQuakeRequest[i].type = 0;
- sQuakeRequest[i].countdown = 0;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ sQuakeRequests[i].type = QUAKE_TYPE_NONE;
+ sQuakeRequests[i].timer = 0;
}
- sIsQuakeInitialized = true;
+ sQuakeUnused = 1;
sQuakeRequestCount = 0;
}
-s16 Quake_Add(Camera* camera, u32 type) {
- return Quake_AddImpl(camera, type)->randIndex;
+s16 Quake_Request(Camera* camera, u32 type) {
+ return Quake_RequestImpl(camera, type)->index;
}
-u32 Quake_Remove(s16 index) {
+u32 Quake_RemoveRequest(s16 index) {
QuakeRequest* req = Quake_GetRequest(index);
if (req != NULL) {
- Quake_RemoveRequest(req);
+ Quake_Remove(req);
return true;
}
return false;
}
static QuakeCallbackFunc sQuakeCallbacks[] = {
- NULL,
- Quake_CallbackType1,
- Quake_CallbackType2,
- Quake_CallbackType3,
- Quake_CallbackType4,
- Quake_CallbackType5,
- Quake_CallbackType6,
+ NULL, // QUAKE_TYPE_NONE
+ Quake_CallbackType1, // QUAKE_TYPE_1
+ Quake_CallbackType2, // QUAKE_TYPE_2
+ Quake_CallbackType3, // QUAKE_TYPE_3
+ Quake_CallbackType4, // QUAKE_TYPE_4
+ Quake_CallbackType5, // QUAKE_TYPE_5
+ Quake_CallbackType6, // QUAKE_TYPE_6
};
-s16 Quake_Calc(Camera* camera, QuakeCamCalc* camData) {
- s32 pad;
- QuakeRequest* req;
- ShakeInfo shake;
+s16 Quake_Update(Camera* camera, ShakeInfo* camShake) {
f32 absSpeedDiv;
+ ShakeInfo shake;
+ QuakeRequest* req;
f32 maxCurr;
f32 maxNext;
s32 index;
- s32 ret;
- u32 eq;
- Vec3f originVec;
+ s32 numQuakesApplied;
+ u32 isDifferentCamId;
+ Vec3f zeroVec;
PlayState* play = camera->play;
- originVec.x = 0.0f;
- originVec.y = 0.0f;
- originVec.z = 0.0f;
- camData->atOffset.x = 0.0f;
- camData->atOffset.y = 0.0f;
- camData->atOffset.z = 0.0f;
- camData->eyeOffset.x = 0.0f;
- camData->eyeOffset.y = 0.0f;
- camData->eyeOffset.z = 0.0f;
- camData->rollOffset = 0;
- camData->zoom = 0;
- camData->max = 0.0f;
+ zeroVec.x = 0.0f;
+ zeroVec.y = 0.0f;
+ zeroVec.z = 0.0f;
+
+ camShake->atOffset.x = 0.0f;
+ camShake->atOffset.y = 0.0f;
+ camShake->atOffset.z = 0.0f;
+
+ camShake->eyeOffset.x = 0.0f;
+ camShake->eyeOffset.y = 0.0f;
+ camShake->eyeOffset.z = 0.0f;
+
+ camShake->upRollOffset = 0;
+ camShake->fovOffset = 0;
+ camShake->maxOffset = 0.0f;
if (sQuakeRequestCount == 0) {
return 0;
}
- ret = 0;
- for (index = 0; index < ARRAY_COUNT(sQuakeRequest); index++) {
- req = &sQuakeRequest[index];
- if (req->type != 0) {
- if (play->cameraPtrs[req->camId] == NULL) {
- Quake_RemoveRequest(req);
- } else {
- eq = (camera->camId != req->camera->camId);
- absSpeedDiv = ABS(req->speed) / (f32)0x8000;
- if (sQuakeCallbacks[req->type](req, &shake) == 0) {
- Quake_RemoveRequest(req);
- } else if (eq == 0) {
- if (fabsf(camData->atOffset.x) < fabsf(shake.atOffset.x)) {
- camData->atOffset.x = shake.atOffset.x;
- }
- if (fabsf(camData->atOffset.y) < fabsf(shake.atOffset.y)) {
- camData->atOffset.y = shake.atOffset.y;
- }
- if (fabsf(camData->atOffset.z) < fabsf(shake.atOffset.z)) {
- camData->atOffset.z = shake.atOffset.z;
- }
- if (fabsf(camData->eyeOffset.x) < fabsf(shake.eyeOffset.x)) {
- camData->eyeOffset.x = shake.eyeOffset.x;
- }
- if (fabsf(camData->eyeOffset.y) < fabsf(shake.eyeOffset.y)) {
- camData->eyeOffset.y = shake.eyeOffset.y;
- }
- if (fabsf(camData->eyeOffset.z) < fabsf(shake.eyeOffset.z)) {
- camData->eyeOffset.z = shake.eyeOffset.z;
- }
- if (camData->rollOffset < shake.rollOffset) {
- camData->rollOffset = shake.rollOffset;
- }
- if (camData->zoom < shake.zoom) {
- camData->zoom = shake.zoom;
- }
-
- maxCurr = OLib_Vec3fDist(&shake.atOffset, &originVec) * absSpeedDiv;
-
- maxNext = OLib_Vec3fDist(&shake.eyeOffset, &originVec) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- maxNext = (camData->rollOffset * (7.0f / 2500.0f)) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- maxNext = (camData->zoom * (7.0f / 2500.0f)) * absSpeedDiv;
- maxCurr = CLAMP_MIN(maxCurr, maxNext);
-
- if (camData->max < maxCurr) {
- camData->max = maxCurr;
- }
-
- ret++;
- }
- }
+ numQuakesApplied = 0;
+ for (index = 0; index < ARRAY_COUNT(sQuakeRequests); index++) {
+ req = &sQuakeRequests[index];
+ if (req->type == QUAKE_TYPE_NONE) {
+ continue;
}
+
+ if (play->cameraPtrs[req->camId] == NULL) {
+ Quake_Remove(req);
+ continue;
+ }
+
+ isDifferentCamId = (camera->camId != req->camera->camId);
+ absSpeedDiv = (f32)ABS(req->speed) / 0x8000;
+ if (sQuakeCallbacks[req->type](req, &shake) == 0) {
+ // Quake has reached the end of its timer.
+ Quake_Remove(req);
+ continue;
+ }
+
+ if (isDifferentCamId) {
+ // Quake is attached to a different camId
+ continue;
+ }
+
+ if (fabsf(camShake->atOffset.x) < fabsf(shake.atOffset.x)) {
+ camShake->atOffset.x = shake.atOffset.x;
+ }
+ if (fabsf(camShake->atOffset.y) < fabsf(shake.atOffset.y)) {
+ camShake->atOffset.y = shake.atOffset.y;
+ }
+ if (fabsf(camShake->atOffset.z) < fabsf(shake.atOffset.z)) {
+ camShake->atOffset.z = shake.atOffset.z;
+ }
+ if (fabsf(camShake->eyeOffset.x) < fabsf(shake.eyeOffset.x)) {
+ camShake->eyeOffset.x = shake.eyeOffset.x;
+ }
+ if (fabsf(camShake->eyeOffset.y) < fabsf(shake.eyeOffset.y)) {
+ camShake->eyeOffset.y = shake.eyeOffset.y;
+ }
+ if (fabsf(camShake->eyeOffset.z) < fabsf(shake.eyeOffset.z)) {
+ camShake->eyeOffset.z = shake.eyeOffset.z;
+ }
+ if (camShake->upRollOffset < shake.upRollOffset) {
+ camShake->upRollOffset = shake.upRollOffset;
+ }
+ if (camShake->fovOffset < shake.fovOffset) {
+ camShake->fovOffset = shake.fovOffset;
+ }
+
+ maxCurr = OLib_Vec3fDist(&shake.atOffset, &zeroVec) * absSpeedDiv;
+ maxNext = OLib_Vec3fDist(&shake.eyeOffset, &zeroVec) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ maxNext = (camShake->upRollOffset * (7.0f / 2500.0f)) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ maxNext = (camShake->fovOffset * (7.0f / 2500.0f)) * absSpeedDiv;
+ maxCurr = CLAMP_MIN(maxCurr, maxNext);
+
+ if (camShake->maxOffset < maxCurr) {
+ camShake->maxOffset = maxCurr;
+ }
+
+ numQuakesApplied++;
}
- return ret;
+ return numQuakesApplied;
}
void Distortion_Init(PlayState* play) {
sDistortionRequest.play = play;
View_ClearDistortion(&play->view);
sDistortionRequest.type = 0;
- sDistortionRequest.countdown = 0;
+ sDistortionRequest.timer = 0;
sDistortionRequest.state = DISTORTION_INACTIVE;
}
-void Distortion_SetCountdown(s16 countdown) {
- sDistortionRequest.countdown = countdown;
+void Distortion_SetDuration(s16 duration) {
+ sDistortionRequest.timer = duration;
sDistortionRequest.state = DISTORTION_SETUP;
}
-s16 Distortion_GetCountdown(void) {
- return sDistortionRequest.countdown;
+s16 Distortion_GetTimeLeft(void) {
+ return sDistortionRequest.timer;
}
s16 Distortion_GetType(void) {
return sDistortionRequest.type;
}
-void Distortion_SetType(s32 type) {
+void Distortion_Request(s32 type) {
if (sDistortionRequest.type < type) {
sDistortionRequest.type = type;
}
}
-void Distortion_ClearType(s32 type) {
+void Distortion_RemoveRequest(s32 type) {
if (sDistortionRequest.type == type) {
sDistortionRequest.type = 0;
}
@@ -477,19 +531,19 @@ void Distortion_ClearType(s32 type) {
/**
* Checks that the bg surface is an underwater conveyor type and if so, returns the conveyor speed
*/
-s32 Distortion_GetUnderwaterCurrentSpeed(Player* player) {
+ConveyorSpeed Distortion_GetUnderwaterCurrentSpeed(Player* player) {
if (!SurfaceType_IsFloorConveyor(&sDistortionRequest.play->colCtx, player->actor.floorPoly,
player->actor.floorBgId)) {
return SurfaceType_GetConveyorSpeed(&sDistortionRequest.play->colCtx, player->actor.floorPoly,
player->actor.floorBgId);
}
- return 0;
+ return CONVEYOR_SPEED_DISABLED;
}
void Distortion_Update(void) {
static s16 depthPhase = 0x3F0;
static s16 screenPlanePhase = 0x156;
- static s16 countdownMax = 1;
+ static s16 duration = 1;
f32 xyScaleFactor;
f32 zScaleFactor;
f32 speedScaleFactor;
@@ -511,8 +565,8 @@ void Distortion_Update(void) {
f32 speedRatio = CLAMP_MAX(camera->speedRatio, 1.0f);
if (sDistortionRequest.type != 0) {
- if (sDistortionRequest.type & DISTORTION_TYPE_B) {
- sDistortionRequest.countdown = 2;
+ if (sDistortionRequest.type & DISTORTION_TYPE_MASK_TRANSFORM_2) {
+ sDistortionRequest.timer = 2;
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
@@ -528,17 +582,17 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.6f;
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / 60.0f;
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / 60.0f;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_A) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_BOSS_WARP) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
}
depthPhaseStep = 0.0f;
- screenPlanePhaseStep = 50.0f / countdownMax;
+ screenPlanePhaseStep = 50.0f / duration;
rotX = 0.0f;
rotY = 0.0f;
@@ -549,11 +603,11 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.4f;
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
speedScaleFactor = 0.5f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_9) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_MASK_TRANSFORM_1) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x1FC;
screenPlanePhase = 0x156;
}
@@ -570,11 +624,11 @@ void Distortion_Update(void) {
zScale = 0.0f;
speed = 0.1f;
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_8) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_GORON_BUTT) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x2710;
screenPlanePhase = 0x3E8;
}
@@ -591,15 +645,15 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.5f;
- if (sDistortionRequest.countdown < 5) {
- xyScaleFactor = zScaleFactor = ((f32)countdownMax - sDistortionRequest.countdown) / (f32)countdownMax;
+ if (sDistortionRequest.timer < 5) {
+ xyScaleFactor = zScaleFactor = ((f32)duration - sDistortionRequest.timer) / (f32)duration;
} else {
xyScaleFactor = zScaleFactor = 0.0f;
}
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_7) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_UNK_ATTACK) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x4B0;
screenPlanePhase = 0x7D0;
}
@@ -616,11 +670,11 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.5f;
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / (f32)countdownMax;
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / (f32)duration;
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_6) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_ZORA_KICK) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x9C4;
screenPlanePhase = 0xBB8;
}
@@ -637,14 +691,14 @@ void Distortion_Update(void) {
zScale = 0.01f;
speed = 1.3f;
- if (sDistortionRequest.countdown < 4) {
- xyScaleFactor = zScaleFactor = sDistortionRequest.countdown / (f32)countdownMax;
+ if (sDistortionRequest.timer < 4) {
+ xyScaleFactor = zScaleFactor = sDistortionRequest.timer / (f32)duration;
} else {
xyScaleFactor = zScaleFactor = 0.0f;
}
speedScaleFactor = 1.0f;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_5) {
- sDistortionRequest.countdown = 2;
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_SONG_OF_TIME) {
+ sDistortionRequest.timer = 2;
if (sDistortionRequest.state == DISTORTION_SETUP) {
depthPhase = 0x9C4;
screenPlanePhase = 0xBB8;
@@ -670,7 +724,7 @@ void Distortion_Update(void) {
speedScaleFactor = 1.0f;
} else if (sDistortionRequest.type & DISTORTION_TYPE_UNDERWATER_ENTRY) {
if (sDistortionRequest.state == DISTORTION_SETUP) {
- countdownMax = sDistortionRequest.countdown;
+ duration = sDistortionRequest.timer;
depthPhase = 0x760;
screenPlanePhase = 0x1BC;
}
@@ -687,14 +741,14 @@ void Distortion_Update(void) {
zScale = 0.2f;
speed = 0.25f;
- countdownRatio = sDistortionRequest.countdown / (f32)countdownMax;
+ countdownRatio = sDistortionRequest.timer / (f32)duration;
zScaleFactor = xyScaleFactor = countdownRatio;
speedScaleFactor = 1.0f;
} else if (sDistortionRequest.type & DISTORTION_TYPE_ZORA_SWIMMING) {
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
player = GET_PLAYER(play);
if (player != NULL) {
@@ -709,21 +763,21 @@ void Distortion_Update(void) {
rotZ = 0.3f;
switch (Distortion_GetUnderwaterCurrentSpeed(player)) {
- case 3:
+ case CONVEYOR_SPEED_FAST:
xScale = -0.06f;
yScale = 0.1f;
zScale = 0.03f;
speed = 0.33f;
break;
- case 2:
+ case CONVEYOR_SPEED_MEDIUM:
xScale = -0.06f;
yScale = 0.1f;
zScale = 0.03f;
speed = 0.33f;
break;
- case 1:
+ case CONVEYOR_SPEED_SLOW:
xScale = -0.06f;
yScale = 0.1f;
zScale = 0.03f;
@@ -749,7 +803,7 @@ void Distortion_Update(void) {
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
player = GET_PLAYER(play);
depthPhaseStep = 359.2f;
@@ -759,21 +813,21 @@ void Distortion_Update(void) {
rotY = 0.0f;
rotZ = 0.0f;
switch (Distortion_GetUnderwaterCurrentSpeed(player)) {
- case 3:
+ case CONVEYOR_SPEED_FAST:
xScale = 0.12f;
yScale = 0.12f;
zScale = 0.08f;
speed = 0.18f;
break;
- case 2:
+ case CONVEYOR_SPEED_MEDIUM:
xScale = 0.12f;
yScale = 0.12f;
zScale = 0.08f;
speed = 0.12f;
break;
- case 1:
+ case CONVEYOR_SPEED_SLOW:
xScale = 0.12f;
yScale = 0.12f;
zScale = 0.08f;
@@ -796,12 +850,12 @@ void Distortion_Update(void) {
xyScaleFactor = speedScaleFactor = (waterYScaleFactor * 0.15f) + 0.35f + (speedRatio * 0.4f);
zScaleFactor = 0.9f - xyScaleFactor;
- } else if (sDistortionRequest.type & DISTORTION_TYPE_0) {
+ } else if (sDistortionRequest.type & DISTORTION_TYPE_HOT_ROOM) {
// Gives a small mirage-like appearance
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
depthPhaseStep = 0.0f;
screenPlanePhaseStep = 150.0f;
@@ -825,9 +879,9 @@ void Distortion_Update(void) {
screenPlanePhase += CAM_DEG_TO_BINANG(screenPlanePhaseStep);
View_SetDistortionOrientation(&sDistortionRequest.play->view,
- Math_CosS(depthPhase) * (DEGF_TO_RADF(rotX) * xyScaleFactor),
- Math_SinS(depthPhase) * (DEGF_TO_RADF(rotY) * xyScaleFactor),
- Math_SinS(screenPlanePhase) * (DEGF_TO_RADF(rotZ) * zScaleFactor));
+ Math_CosS(depthPhase) * (DEG_TO_RAD(rotX) * xyScaleFactor),
+ Math_SinS(depthPhase) * (DEG_TO_RAD(rotY) * xyScaleFactor),
+ Math_SinS(screenPlanePhase) * (DEG_TO_RAD(rotZ) * zScaleFactor));
View_SetDistortionScale(&sDistortionRequest.play->view,
(Math_SinS(screenPlanePhase) * (xScale * xyScaleFactor)) + 1.0f,
(Math_CosS(screenPlanePhase) * (yScale * xyScaleFactor)) + 1.0f,
@@ -840,32 +894,25 @@ void Distortion_Update(void) {
View_ClearDistortion(&play->view);
sDistortionRequest.state = DISTORTION_INACTIVE;
- sDistortionRequest.countdown = 0;
+ sDistortionRequest.timer = 0;
}
- if (sDistortionRequest.countdown != 0) {
- sDistortionRequest.countdown--;
- if (sDistortionRequest.countdown == 0) {
+ if (sDistortionRequest.timer != 0) {
+ sDistortionRequest.timer--;
+ if (sDistortionRequest.timer == 0) {
sDistortionRequest.type = 0;
}
}
}
-s32 Quake_NumActiveQuakes(void) {
- QuakeRequest* req = sQuakeRequest;
+s32 Quake_GetNumActiveQuakes(void) {
s32 numActiveQuakes = 0;
+ s32 i;
- if (req[0].type != 0) {
- numActiveQuakes++;
- }
- if (req[1].type != 0) {
- numActiveQuakes++;
- }
- if (req[2].type != 0) {
- numActiveQuakes++;
- }
- if (req[3].type != 0) {
- numActiveQuakes++;
+ for (i = 0; i < ARRAY_COUNT(sQuakeRequests); i++) {
+ if (sQuakeRequests[i].type != QUAKE_TYPE_NONE) {
+ numActiveQuakes++;
+ }
}
return numActiveQuakes;
diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c
index b4bb6ea7d..4b5787129 100644
--- a/src/code/z_rcp.c
+++ b/src/code/z_rcp.c
@@ -1,758 +1,834 @@
#include "global.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
-Gfx sSetupDL[438] = {
- /* 0x00 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, COMBINED, 0, 0, 0,
- COMBINED),
- gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x01 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x02 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x03 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x04 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x05 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x06 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_TEX_EDGE2),
- gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x07 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x08 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x09 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x0F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x10 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x11 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x12 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x13 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | AA_EN | Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x14 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x15 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x16 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x17 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x18 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x19 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_AA_TEX_EDGE | G_RM_AA_TEX_EDGE2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, NOISE, 0, COMBINED, 0, 0, 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_LINE | G_RM_AA_ZB_XLU_LINE2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x1F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x20 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
- G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x21 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
- ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
- G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x22 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x23 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_DECAL | G_RM_AA_ZB_XLU_DECAL2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x24 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x25 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x26 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x27 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x28 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0, 0, 0, COMBINED, 0,
- 0, 0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_FRONT | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x29 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_OVL_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x2F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x30 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x31 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x32 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x33 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x34 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x35 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x36 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x37 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE, ENVIRONMENT,
- COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_CULL_BACK),
- gsSPEndDisplayList(),
-
- /* 0x38 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x39 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3A */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3B */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
- ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_OPA_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3C */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
- TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3D */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
- TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
- gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3E */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x3F */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_UPD | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
- GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x40 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
- gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x41 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
- gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x42 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x43 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x44 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x45 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
- GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x46 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
- ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x47 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
-
- /* 0x48 */
- gsDPPipeSync(),
- gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
- gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
- gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
- gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
- gsSPEndDisplayList(),
+Gfx gSetupDLs[SETUPDL_MAX][6] = {
+ {
+ /* SETUPDL_0 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, COMBINED, 0,
+ 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_1 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_2 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_3 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_4 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_5 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_6 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_7 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_8 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_9 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_10 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_11 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_12 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_OPA_SURF | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_13 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_14 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_15 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_16 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_17 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_TEX_EDGE | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_18 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_19 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | AA_EN | Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_20 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_21 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_22 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_23 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_24 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_25 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_26 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_27 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_28 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_AA_TEX_EDGE | G_RM_AA_TEX_EDGE2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_29 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, NOISE, 0, COMBINED, 0, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_30 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_LINE | G_RM_AA_ZB_XLU_LINE2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_31 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_32 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_HILITERGBA, G_CC_HILITERGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_33 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
+ ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_34 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGB, G_CC_DECALRGB),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_35 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_DECAL | G_RM_AA_ZB_XLU_DECAL2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_36 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_37 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_38 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_XLU_SURF | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_39 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_40 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0, 0, 0,
+ COMBINED, 0, 0, 0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_FRONT | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_41 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_42 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_43 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_RGBA16 | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_44 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_OVL_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_45 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_46 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_47 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEI_PRIM, G_CC_MODULATEI_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_XLU_SURF | G_RM_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_48 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_49 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE, PRIMITIVE, 0, SHADE, 0, 0, 0, 0, PRIMITIVE),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_AA_XLU_SURF | G_RM_AA_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_50 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_51 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_52 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_53 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_OPA_SURF | G_RM_OPA_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_54 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_55 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL1, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_CULL_BACK),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_56 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_XLU_SURF | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_57 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_58 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineLERP(PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE, 0, PRIMITIVE, 0, SHADE,
+ 0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_59 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, SHADE, 1, 0, TEXEL0, SHADE, ENVIRONMENT, COMBINED, TEXEL0, COMBINED,
+ ENVIRONMENT, COMBINED, TEXEL0, COMBINED),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_PASS | G_RM_AA_OPA_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR |
+ G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_60 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
+ TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_61 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, ENVIRONMENT,
+ TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0),
+ gsDPSetOtherMode(G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_ZB_CLD_SURF | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_62 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_63 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_UPD | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_64 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_PASS2),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_PASS | G_RM_XLU_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_65 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPLoadGeometryMode(G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_66 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_67 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_68 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_69 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_70 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PIXEL | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA |
+ ALPHA_CVG_SEL | G_RM_PASS | GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_71 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_AA_ZB_XLU_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
+ {
+ /* SETUPDL_72 */
+ gsDPPipeSync(),
+ gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
+ gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIA_PRIM2),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_BAYER | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_PERSP | G_CYC_2CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_FOG_SHADE_A | G_RM_ZB_CLD_SURF2),
+ gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
+ gsSPEndDisplayList(),
+ },
};
Gfx sFillSetupDL[] = {
@@ -814,297 +890,470 @@ Gfx* Gfx_SetFog2(Gfx* gfx, s32 r, s32 g, s32 b, s32 a, s32 n, s32 f) {
return Gfx_SetFog(gfx, r, g, b, a, n, f);
}
-Gfx* Gfx_CallSetupDLImpl(Gfx* gfx, u32 i) {
- gSPDisplayList(gfx++, &sSetupDL[6 * i]);
+Gfx* Gfx_SetupDLImpl(Gfx* gfx, u32 i) {
+ s32 dListIndex = i * ARRAY_COUNT(gSetupDLs[i]);
+
+ // Equivalent to gSPDisplayList(gfx++, gSetupDLs[i])
+ gSPDisplayList(gfx++, &((Gfx*)gSetupDLs)[dListIndex]);
return gfx;
}
-Gfx* Gfx_CallSetupDL(Gfx* gfx, u32 i) {
- return Gfx_CallSetupDLImpl(gfx, i);
+Gfx* Gfx_SetupDL(Gfx* gfx, u32 i) {
+ return Gfx_SetupDLImpl(gfx, i);
}
-void Gfx_CallSetupDLAtPtr(Gfx** gfxp, u32 i) {
- *gfxp = Gfx_CallSetupDL(*gfxp, i);
+void Gfx_SetupDLAtPtr(Gfx** gfxp, u32 i) {
+ *gfxp = Gfx_SetupDL(*gfxp, i);
}
-Gfx* func_8012BFC4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x39]);
+Gfx* Gfx_SetupDL57(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_57]);
return gfx;
}
-Gfx* func_8012BFEC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x39]);
+Gfx* Gfx_SetupDL57_b(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_57]);
return gfx;
}
-Gfx* func_8012C014(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x34]);
+Gfx* Gfx_SetupDL52_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_52]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-void func_8012C058(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x3A]);
+void Gfx_SetupDL58_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_58]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C080(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x39]);
+void Gfx_SetupDL57_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_57]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0A8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x32]);
+void Gfx_SetupDL50_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_50]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0D0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x33]);
+void Gfx_SetupDL51_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_51]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C0F8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x34]);
+void Gfx_SetupDL52_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_52]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C120(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x35]);
+void Gfx_SetupDL53_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_53]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C148(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x36]);
+void Gfx_SetupDL54_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_54]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C170(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x37]);
+void Gfx_SetupDL55_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_55]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C198(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x1A]);
+Gfx* Gfx_SetupDL26(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_26]);
return gfx;
}
-void func_8012C1C0(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C198(gfxCtx->polyOpa.p);
+void Gfx_SetupDL26_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL26(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C1EC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x17]);
+Gfx* Gfx_SetupDL23(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_23]);
return gfx;
}
-void func_8012C214(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C1EC(gfxCtx->polyOpa.p);
+void Gfx_SetupDL23_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL23(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C240(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Xlu2(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C268(PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+void func_8012C268(GameState* gameState) {
+ Gfx_SetupDL25_Opa(gameState->gfxCtx);
}
-void func_8012C28C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C2B4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x47]);
+Gfx* Gfx_SetupDL71(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_71]);
return gfx;
}
-void func_8012C2DC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x19]);
+void Gfx_SetupDL25_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C304(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x48]);
+Gfx* Gfx_SetupDL72(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_72]);
return gfx;
}
-void func_8012C32C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x1F]);
+void Gfx_SetupDL31_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_31]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C354(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x20]);
+void Gfx_SetupDL32_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_32]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C37C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x21]);
+void Gfx_SetupDL33_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_33]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C3A4(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x40]);
+Gfx* Gfx_SetupDL64(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_64]);
return gfx;
}
-Gfx* func_8012C3CC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x22]);
+Gfx* Gfx_SetupDL34(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_34]);
return gfx;
}
-void func_8012C3F4(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C3CC(gfxCtx->polyOpa.p);
+void Gfx_SetupDL34_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL34(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C420(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x23]);
+void Gfx_SetupDL35_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_35]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C448(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x2C]);
+void Gfx_SetupDL44_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_44]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C470(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x24]);
+void Gfx_SetupDL36_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_36]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C498(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x1C]);
+Gfx* Gfx_SetupDL28(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_28]);
return gfx;
}
-void func_8012C4C0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x1C]);
+void Gfx_SetupDL28_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_28]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C4E8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2B]);
+void Gfx_SetupDL43_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_43]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C510(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2D]);
+void Gfx_SetupDL45_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_45]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C538(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->overlay.p++, &sSetupDL[6 * 0x2E]);
+void Gfx_SetupDL46_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(OVERLAY_DISP++, gSetupDLs[SETUPDL_46]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C560(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x26]);
+void Gfx_SetupDL38_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_38]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C588(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x4]);
+void Gfx_SetupDL4_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_4]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C5B0(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x25]);
+void Gfx_SetupDL37_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_37]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C5D8(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2]);
+void Gfx_SetupDL2_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_2]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C600(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x27]);
+Gfx* Gfx_SetupDL39(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_39]);
return gfx;
}
-void func_8012C628(GraphicsContext* gfxCtx) {
- gfxCtx->polyOpa.p = func_8012C600(gfxCtx->polyOpa.p);
+void Gfx_SetupDL39_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_OPA_DISP = Gfx_SetupDL39(POLY_OPA_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C654(GraphicsContext* gfxCtx) {
- gfxCtx->overlay.p = func_8012C600(gfxCtx->overlay.p);
+void Gfx_SetupDL39_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ OVERLAY_DISP = Gfx_SetupDL39(OVERLAY_DISP);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C680(Gfx** gfxp) {
+void Gfx_SetupDL39_Ptr(Gfx** gfxp) {
Gfx* gfx = *gfxp;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x27]);
+
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_39]);
*gfxp = gfx;
}
-void func_8012C6AC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x28]);
+void Gfx_SetupDL40_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_40]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C6D4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x29]);
+void Gfx_SetupDL41_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_41]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C6FC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x2F]);
+void Gfx_SetupDL47_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_47]);
+
+ CLOSE_DISPS(gfxCtx);
}
-Gfx* func_8012C724(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x42]);
+Gfx* Gfx_SetupDL66(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_66]);
return gfx;
}
-Gfx* func_8012C74C(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x43]);
+Gfx* Gfx_SetupDL67(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_67]);
return gfx;
}
-Gfx* func_8012C774(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x44]);
+Gfx* Gfx_SetupDL68_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_68]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C7B8(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x45]);
+Gfx* Gfx_SetupDL69_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_69]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C7FC(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x41]);
+Gfx* Gfx_SetupDL65_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_65]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-Gfx* func_8012C840(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x46]);
+Gfx* Gfx_SetupDL70(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_70]);
return gfx;
}
-Gfx* func_8012C868(Gfx* gfx) {
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x14]);
+Gfx* Gfx_SetupDL20_NoCD(Gfx* gfx) {
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_20]);
gDPSetColorDither(gfx++, G_CD_DISABLE);
return gfx;
}
-void func_8012C8AC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x2A]);
+void Gfx_SetupDL42_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_42]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C8D4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->overlay.p++, &sSetupDL[6 * 0x2A]);
+void Gfx_SetupDL42_Overlay(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(OVERLAY_DISP++, gSetupDLs[SETUPDL_42]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C8FC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x30]);
+void Gfx_SetupDL48_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_48]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C924(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x31]);
+void Gfx_SetupDL49_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_49]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C94C(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x1B]);
+void Gfx_SetupDL27_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_27]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C974(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x3C]);
- gDPSetColorDither(gfxCtx->polyXlu.p++, G_CD_DISABLE);
+void Gfx_SetupDL60_XluNoCD(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_60]);
+ gDPSetColorDither(POLY_XLU_DISP++, G_CD_DISABLE);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C9BC(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyXlu.p++, &sSetupDL[6 * 0x3D]);
+void Gfx_SetupDL61_Xlu(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_61]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012C9E4(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x38]);
+void Gfx_SetupDL56_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_56]);
+
+ CLOSE_DISPS(gfxCtx);
}
-void func_8012CA0C(Gfx** gfxp) {
+void Gfx_SetupDL56_Ptr(Gfx** gfxp) {
Gfx* gfx = *gfxp;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x38]);
+
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_56]);
*gfxp = gfx;
}
-void func_8012CA38(GraphicsContext* gfxCtx) {
- gSPDisplayList(gfxCtx->polyOpa.p++, &sSetupDL[6 * 0x3B]);
+void Gfx_SetupDL59_Opa(GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_59]);
+
+ CLOSE_DISPS(gfxCtx);
}
Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height) {
@@ -1210,7 +1459,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(&masterGfx[0], D_0E000000.syncSegments);
gSPDisplayList(&masterGfx[1], sFillSetupDL);
- gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
if (zbuffer != NULL) {
gDPSetDepthImage(&masterGfx[3], zbuffer);
} else {
@@ -1222,7 +1471,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->setScissor;
- gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, gCfbWidth, gCfbHeight);
gSPEndDisplayList(&masterGfx[1]);
// Clear Z-Buffer
@@ -1232,13 +1481,13 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
if (zbuffer == NULL) {
gSPEndDisplayList(&masterGfx[0]);
} else {
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, zbuffer);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, zbuffer);
gDPPipeSync(&masterGfx[1]);
gDPSetCycleType(&masterGfx[2], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[3], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[4], (GPACK_RGBA5551(255, 255, 240, 0) << 16) | GPACK_RGBA5551(255, 255, 240, 0));
gSPDisplayList(&masterGfx[5], D_0E000000.clearFillRect);
- gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gSPEndDisplayList(&masterGfx[7]);
}
@@ -1246,7 +1495,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFrameBuffer;
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetCycleType(&masterGfx[1], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[2], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[3], (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
@@ -1256,7 +1505,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC - 1, D_801FBBCE - 1);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth - 1, gCfbHeight - 1);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
@@ -1264,7 +1513,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->fillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth, gCfbHeight);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 369b2b0e5..78eb5f98e 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -18,14 +18,14 @@ void Room_DrawNormal(PlayState* play, Room* room, u32 flags) {
if (flags & ROOM_DRAW_OPA) {
func_800BCBF4(&sZeroVec, play);
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
- func_8012C268(play);
+ func_8012C268(&play->state);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
if (flags & ROOM_DRAW_XLU) {
func_800BCC68(&sZeroVec, play);
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
@@ -53,51 +53,39 @@ typedef enum {
} RoomCullableDebugMode;
typedef struct RoomShapeCullableEntryLinked {
- /* 0x00 */ RoomShapeCullableEntry* entry;
- /* 0x04 */ f32 boundsNearZ;
- /* 0x08 */ struct RoomShapeCullableEntryLinked* prev;
- /* 0x0C */ struct RoomShapeCullableEntryLinked* next;
+ /* 0x0 */ RoomShapeCullableEntry* entry;
+ /* 0x4 */ f32 boundsNearZ;
+ /* 0x8 */ struct RoomShapeCullableEntryLinked* prev;
+ /* 0xC */ struct RoomShapeCullableEntryLinked* next;
} RoomShapeCullableEntryLinked; // size = 0x10
-// TODO: 127 is an arbitrarily chosen number to make the stack sorta work
-#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 127
+#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 128
-#ifdef NON_MATCHING
-// Small regalloc, likely related to temp usage and scoping
void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
RoomShapeCullable* roomShape;
RoomShapeCullableEntry* roomShapeCullableEntry;
- RoomShapeCullableEntry* roomShapeCullableEntries;
- RoomShapeCullableEntry* roomShapeCullableEntryIter;
- Gfx* displayList;
- f32 entryBoundsNearZ;
RoomShapeCullableEntryLinked linkedEntriesBuffer[ROOM_SHAPE_CULLABLE_MAX_ENTRIES];
RoomShapeCullableEntryLinked* head = NULL;
RoomShapeCullableEntryLinked* tail = NULL;
- s32 var_a1;
RoomShapeCullableEntryLinked* iter;
+ Gfx* displayList;
RoomShapeCullableEntryLinked* insert;
- f32 var_fv1;
+ f32 entryBoundsNearZ;
s32 i;
Vec3f pos;
Vec3f projectedPos;
- s32 pad2;
+ RoomShapeCullableEntry* roomShapeCullableEntries;
OPEN_DISPS(play->state.gfxCtx);
if (flags & ROOM_DRAW_OPA) {
func_800BCBF4(&sZeroVec, play);
- //! TODO: Fake
- if (1) {}
- if (1) {}
- if (1) {}
-
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (play->roomCtx.unk74 != NULL) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->roomCtx.unk74);
}
- func_8012C268(play);
+ func_8012C268(&play->state);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
@@ -107,11 +95,11 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
if (play->roomCtx.unk74 != NULL) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->roomCtx.unk74);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
- if ((room->enablePosLights != 0) || (MREG(93) != 0)) {
+ if (room->enablePosLights || (MREG(93) != 0)) {
gSPSetGeometryMode(POLY_OPA_DISP++, G_LIGHTING_POSITIONAL);
gSPSetGeometryMode(POLY_XLU_DISP++, G_LIGHTING_POSITIONAL);
}
@@ -159,8 +147,9 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
}
}
} else {
- f32 var_fa1 = 1.0f / play->projectionMtxFDiagonal.z; // sp54
- s32 pad5;
+ f32 var_fa1 = 1.0f / play->projectionMtxFDiagonal.z;
+ f32 var_fv1;
+ s32 var_a1;
// Pick and sort entries by depth
for (i = 0; i < roomShape->numEntries; i++, roomShapeCullableEntry++) {
@@ -237,8 +226,7 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
if (flags & ROOM_DRAW_OPA) {
for (; head != NULL; head = head->next, i++) {
- s32 pad3;
- RoomShapeCullableEntry* roomShapeCullableEntry;
+ s32 pad;
roomShapeCullableEntry = head->entry;
@@ -265,17 +253,17 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
}
if (flags & ROOM_DRAW_XLU) {
- for (; head != NULL; head = head->prev) {
+ for (; tail != NULL; tail = tail->prev) {
f32 temp_fv0;
f32 temp_fv1;
- roomShapeCullableEntry = head->entry;
+ roomShapeCullableEntry = tail->entry;
displayList = roomShapeCullableEntry->xlu;
if (displayList != NULL) {
if (roomShapeCullableEntry->boundsSphereRadius & 1) {
- temp_fv0 = head->boundsNearZ - (f32)(iREG(93) + 0xBB8);
+ temp_fv0 = tail->boundsNearZ - (f32)(iREG(93) + 0xBB8);
temp_fv1 = iREG(94) + 0x7D0;
if (temp_fv0 < temp_fv1) {
@@ -299,10 +287,6 @@ void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void Room_DrawCullable(PlayState* play, Room* room, u32 flags);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_room/Room_DrawCullable.s")
-#endif
#define ROOM_IMAGE_NODRAW_BACKGROUND (1 << 0)
#define ROOM_IMAGE_NODRAW_OPA (1 << 1)
@@ -333,7 +317,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (drawOpa) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, entry->opa);
}
@@ -363,7 +347,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
if (drawXlu) {
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
}
@@ -373,7 +357,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
RoomShapeImageMultiBgEntry* Room_GetImageMultiBgEntry(RoomShapeImageMulti* roomShapeImageMulti, PlayState* play) {
Camera* activeCam = GET_ACTIVE_CAM(play);
- s32 bgCamIndex = activeCam->bgCamDataId;
+ s32 bgCamIndex = activeCam->bgCamIndex;
s16 overrideBgCamIndex;
Player* player;
RoomShapeImageMultiBgEntry* bgEntry;
@@ -432,7 +416,7 @@ void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (drawOpa) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dListsEntry->opa);
}
@@ -461,7 +445,7 @@ void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
if (drawXlu) {
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, dListsEntry->xlu);
}
diff --git a/src/code/z_rumble.c b/src/code/z_rumble.c
index ce5cc16b4..3cca1d432 100644
--- a/src/code/z_rumble.c
+++ b/src/code/z_rumble.c
@@ -68,11 +68,11 @@ void Rumble_Request(f32 distSq, u8 sourceIntensity, u8 decayTimer, u8 decayStep)
void Rumble_Init(void) {
RumbleManager_Init(&gRumbleMgr);
- func_80174F24(Rumble_Update, NULL);
+ PadMgr_SetRumbleRetraceCallback(Rumble_Update, NULL);
}
void Rumble_Destroy(void) {
- func_80174F44(Rumble_Update, NULL);
+ PadMgr_UnsetRumbleRetraceCallback(Rumble_Update, NULL);
RumbleManager_Destroy(&gRumbleMgr);
}
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 1fa3ed54a..368b4509e 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -89,7 +89,7 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) {
s32 i;
for (i = 0; i < objectCtx->num; i++) {
- if ((objectCtx->status[i].id < 0 ? -objectCtx->status[i].id : objectCtx->status[i].id) == objectId) {
+ if (ABS_ALT(objectCtx->status[i].id) == objectId) {
return i;
}
}
@@ -365,8 +365,8 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) {
// SceneTableEntry Header Command 0x11: Skybox Settings
void Scene_CommandSkyboxSettings(PlayState* play, SceneCmd* cmd) {
play->skyboxId = cmd->skyboxSettings.skyboxId & 3;
- play->envCtx.unk_17 = play->envCtx.unk_18 = cmd->skyboxSettings.unk5;
- play->envCtx.unk_1E = cmd->skyboxSettings.unk6;
+ play->envCtx.skyboxConfig = play->envCtx.changeSkyboxNextConfig = cmd->skyboxSettings.skyboxConfig;
+ play->envCtx.lightMode = cmd->skyboxSettings.envLightMode;
Scene_LoadAreaTextures(play, cmd->skyboxSettings.data1);
}
@@ -390,7 +390,7 @@ void Scene_CommandTimeSettings(PlayState* play, SceneCmd* cmd) {
}
// Increase time speed during first cycle
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (play->envCtx.sceneTimeSpeed != 0)) {
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) && (play->envCtx.sceneTimeSpeed != 0)) {
play->envCtx.sceneTimeSpeed = 5;
}
@@ -402,7 +402,7 @@ void Scene_CommandTimeSettings(PlayState* play, SceneCmd* cmd) {
play->envCtx.sunPos.y = (Math_CosS(((void)0, gSaveContext.save.time) - CLOCK_TIME(12, 0)) * 120.0f) * 25.0f;
play->envCtx.sunPos.z = (Math_CosS(((void)0, gSaveContext.save.time) - CLOCK_TIME(12, 0)) * 20.0f) * 25.0f;
- if ((play->envCtx.sceneTimeSpeed == 0) && (gSaveContext.save.cutscene < 0xFFF0)) {
+ if ((play->envCtx.sceneTimeSpeed == 0) && (gSaveContext.save.cutsceneIndex < 0xFFF0)) {
gSaveContext.skyboxTime = gSaveContext.save.time;
if ((gSaveContext.skyboxTime >= CLOCK_TIME(4, 0)) && (gSaveContext.skyboxTime < CLOCK_TIME(6, 30))) {
@@ -470,15 +470,15 @@ void Scene_CommandAltHeaderList(PlayState* play, SceneCmd* cmd) {
}
}
-// SceneTableEntry Header Command 0x17: Cutscene List
-void Scene_CommandCutsceneList(PlayState* play, SceneCmd* cmd) {
- play->csCtx.sceneCsCount = cmd->cutsceneList.sceneCsCount;
- play->csCtx.sceneCsList = Lib_SegmentedToVirtual(cmd->cutsceneList.segment);
+// SceneTableEntry Header Command 0x17: Cutscene Script List
+void Scene_CommandCutsceneScriptList(PlayState* play, SceneCmd* cmd) {
+ play->csCtx.scriptListCount = cmd->scriptList.scriptListCount;
+ play->csCtx.scriptList = Lib_SegmentedToVirtual(cmd->scriptList.segment);
}
-// SceneTableEntry Header Command 0x1B: Actor Cutscene List
-void Scene_CommandActorCutsceneList(PlayState* play, SceneCmd* cmd) {
- ActorCutscene_Init(play, Lib_SegmentedToVirtual(cmd->cutsceneActorList.segment), cmd->cutsceneActorList.num);
+// SceneTableEntry Header Command 0x1B: Cutscene List
+void Scene_CommandCutsceneList(PlayState* play, SceneCmd* cmd) {
+ CutsceneManager_Init(play, Lib_SegmentedToVirtual(cmd->cutsceneList.segment), cmd->cutsceneList.num);
}
// SceneTableEntry Header Command 0x1C: Mini Maps
@@ -519,8 +519,8 @@ void Scene_CommandSetRegionVisitedFlag(PlayState* play, SceneCmd* cmd) {
}
if (i < REGION_MAX) {
- gSaveContext.save.regionsVisited =
- (gBitFlags[i] | gSaveContext.save.regionsVisited) | gSaveContext.save.regionsVisited;
+ gSaveContext.save.saveInfo.regionsVisited =
+ (gBitFlags[i] | gSaveContext.save.saveInfo.regionsVisited) | gSaveContext.save.saveInfo.regionsVisited;
}
}
@@ -560,11 +560,11 @@ void (*sSceneCmdHandlers[])(PlayState*, SceneCmd*) = {
NULL,
Scene_CommandSoundSettings,
Scene_CommandEchoSetting,
- Scene_CommandCutsceneList,
+ Scene_CommandCutsceneScriptList,
Scene_CommandAltHeaderList,
Scene_CommandSetRegionVisitedFlag,
Scene_CommandAnimatedMaterials,
- Scene_CommandActorCutsceneList,
+ Scene_CommandCutsceneList,
Scene_CommandMiniMap,
Scene_Command1D,
Scene_CommandMiniMapCompassInfo,
@@ -601,7 +601,7 @@ u16 Entrance_Create(s32 scene, s32 spawn, s32 layer) {
}
/**
- * Creates an layer 0 entranace from the current entrance and the given spawn.
+ * Creates an layer 0 entrance from the current entrance and the given spawn.
*/
u16 Entrance_CreateFromSpawn(s32 spawn) {
return Entrance_Create((u32)gSaveContext.save.entrance >> 9, spawn, 0);
diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c
index 6ec3f2b80..b4597a5c2 100644
--- a/src/code/z_scene_proc.c
+++ b/src/code/z_scene_proc.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
s32 sMatAnimStep;
@@ -401,7 +400,7 @@ void AnimatedMat_DrawMain(PlayState* play, AnimatedMaterial* matAnim, f32 alphaR
if ((matAnim != NULL) && (matAnim->segment != 0)) {
do {
segment = matAnim->segment;
- segmentAbs = ((segment < 0) ? -segment : segment) + 7;
+ segmentAbs = ABS_ALT(segment) + 7;
matAnimDrawHandlers[matAnim->type](play, segmentAbs, Lib_SegmentedToVirtual(matAnim->params));
matAnim++;
} while (segment >= 0);
diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c
index f80ad551d..e31e4b185 100644
--- a/src/code/z_scene_table.c
+++ b/src/code/z_scene_table.c
@@ -1,127 +1,27 @@
#include "global.h"
-#define SCENE_ENTRY(name, textId, config) \
- { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, config, 0, 0 }
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ DECLARE_ROM_SEGMENT(name)
-#define SCENE_ENTRY_NONE() \
- { { 0, 0 }, 0, 0, 0, 0, 0 }
+#define DEFINE_SCENE_UNSET(_enumValue)
-SceneTableEntry gSceneTable[] = {
- /* 0x00 */ SCENE_ENTRY(Z2_20SICHITAI2, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x01 */ SCENE_ENTRY_NONE(),
- /* 0x02 */ SCENE_ENTRY_NONE(),
- /* 0x03 */ SCENE_ENTRY_NONE(),
- /* 0x04 */ SCENE_ENTRY_NONE(),
- /* 0x05 */ SCENE_ENTRY_NONE(),
- /* 0x06 */ SCENE_ENTRY_NONE(),
- /* 0x07 */ SCENE_ENTRY(KAKUSIANA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x08 */ SCENE_ENTRY(SPOT00, 0x0000, SCENE_DRAW_CFG_NOTHING),
- /* 0x09 */ SCENE_ENTRY_NONE(),
- /* 0x0A */ SCENE_ENTRY(Z2_WITCH_SHOP, 0x011A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0B */ SCENE_ENTRY(Z2_LAST_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0C */ SCENE_ENTRY(Z2_HAKASHITA, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0D */ SCENE_ENTRY(Z2_AYASHIISHOP, 0x010E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0E */ SCENE_ENTRY_NONE(),
- /* 0x0F */ SCENE_ENTRY_NONE(),
- /* 0x10 */ SCENE_ENTRY(Z2_OMOYA, 0x0132, SCENE_DRAW_CFG_DEFAULT),
- /* 0x11 */ SCENE_ENTRY(Z2_BOWLING, 0x0108, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x12 */ SCENE_ENTRY(Z2_SONCHONOIE, 0x010B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x13 */ SCENE_ENTRY(Z2_IKANA, 0x0141, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x14 */ SCENE_ENTRY(Z2_KAIZOKU, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x15 */ SCENE_ENTRY(Z2_MILK_BAR, 0x010C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x16 */ SCENE_ENTRY(Z2_INISIE_N, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x17 */ SCENE_ENTRY(Z2_TAKARAYA, 0x0109, SCENE_DRAW_CFG_DEFAULT),
- /* 0x18 */ SCENE_ENTRY(Z2_INISIE_R, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x19 */ SCENE_ENTRY(Z2_OKUJOU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1A */ SCENE_ENTRY(Z2_OPENINGDAN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1B */ SCENE_ENTRY(Z2_MITURIN, 0x011F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1C */ SCENE_ENTRY(Z2_13HUBUKINOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1D */ SCENE_ENTRY(Z2_CASTLE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1E */ SCENE_ENTRY(Z2_DEKUTES, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1F */ SCENE_ENTRY(Z2_MITURIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x20 */ SCENE_ENTRY(Z2_SYATEKI_MIZU, 0x0107, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x21 */ SCENE_ENTRY(Z2_HAKUGIN, 0x012B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x22 */ SCENE_ENTRY(Z2_ROMANYMAE, 0x0149, SCENE_DRAW_CFG_DEFAULT),
- /* 0x23 */ SCENE_ENTRY(Z2_PIRATE, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x24 */ SCENE_ENTRY(Z2_SYATEKI_MORI, 0x011B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x25 */ SCENE_ENTRY(Z2_SINKAI, 0x0135, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x26 */ SCENE_ENTRY(Z2_YOUSEI_IZUMI, 0x013E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x27 */ SCENE_ENTRY(Z2_KINSTA1, 0x011E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x28 */ SCENE_ENTRY(Z2_KINDAN2, 0x013F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x29 */ SCENE_ENTRY(Z2_TENMON_DAI, 0x0114, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2A */ SCENE_ENTRY(Z2_LAST_DEKU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2B */ SCENE_ENTRY(Z2_22DEKUCITY, 0x0118, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2C */ SCENE_ENTRY(Z2_KAJIYA, 0x0127, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2D */ SCENE_ENTRY(Z2_00KEIKOKU, 0x0100, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2E */ SCENE_ENTRY(Z2_POSTHOUSE, 0x0111, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2F */ SCENE_ENTRY(Z2_LABO, 0x013A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x30 */ SCENE_ENTRY(Z2_DANPEI2TEST, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x31 */ SCENE_ENTRY_NONE(),
- /* 0x32 */ SCENE_ENTRY(Z2_16GORON_HOUSE, 0x0124, SCENE_DRAW_CFG_DEFAULT),
- /* 0x33 */ SCENE_ENTRY(Z2_33ZORACITY, 0x0136, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x34 */ SCENE_ENTRY(Z2_8ITEMSHOP, 0x010F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x35 */ SCENE_ENTRY(Z2_F01, 0x012E, SCENE_DRAW_CFG_DEFAULT),
- /* 0x36 */ SCENE_ENTRY(Z2_INISIE_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x37 */ SCENE_ENTRY(Z2_30GYOSON, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x38 */ SCENE_ENTRY(Z2_31MISAKI, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x39 */ SCENE_ENTRY(Z2_TAKARAKUJI, 0x0112, SCENE_DRAW_CFG_DEFAULT),
- /* 0x3A */ SCENE_ENTRY_NONE(),
- /* 0x3B */ SCENE_ENTRY(Z2_TORIDE, 0x0138, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3C */ SCENE_ENTRY(Z2_FISHERMAN, 0x013B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3D */ SCENE_ENTRY(Z2_GORONSHOP, 0x0129, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3E */ SCENE_ENTRY(Z2_DEKU_KING, 0x011C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3F */ SCENE_ENTRY(Z2_LAST_GORON, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x40 */ SCENE_ENTRY(Z2_24KEMONOMITI, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x41 */ SCENE_ENTRY(Z2_F01_B, 0x0130, SCENE_DRAW_CFG_DEFAULT),
- /* 0x42 */ SCENE_ENTRY(Z2_F01C, 0x012F, SCENE_DRAW_CFG_DEFAULT),
- /* 0x43 */ SCENE_ENTRY(Z2_BOTI, 0x0106, SCENE_DRAW_CFG_DEFAULT),
- /* 0x44 */ SCENE_ENTRY(Z2_HAKUGIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x45 */ SCENE_ENTRY(Z2_20SICHITAI, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x46 */ SCENE_ENTRY(Z2_21MITURINMAE, 0x0117, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x47 */ SCENE_ENTRY(Z2_LAST_ZORA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x48 */ SCENE_ENTRY(Z2_11GORONNOSATO2, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x49 */ SCENE_ENTRY(Z2_SEA, 0x013D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE),
- /* 0x4A */ SCENE_ENTRY(Z2_35TAKI, 0x0137, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4B */ SCENE_ENTRY(Z2_REDEAD, 0x0145, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4C */ SCENE_ENTRY(Z2_BANDROOM, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4D */ SCENE_ENTRY(Z2_11GORONNOSATO, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4E */ SCENE_ENTRY(Z2_GORON_HAKA, 0x012A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4F */ SCENE_ENTRY(Z2_SECOM, 0x0143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x50 */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x51 */ SCENE_ENTRY(Z2_TOUGITES, 0x0146, SCENE_DRAW_CFG_DEFAULT),
- /* 0x52 */ SCENE_ENTRY(Z2_DANPEI, 0x0120, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x53 */ SCENE_ENTRY(Z2_IKANAMAE, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x54 */ SCENE_ENTRY(Z2_DOUJOU, 0x0110, SCENE_DRAW_CFG_DEFAULT),
- /* 0x55 */ SCENE_ENTRY(Z2_MUSICHOUSE, 0x0147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x56 */ SCENE_ENTRY(Z2_IKNINSIDE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x57 */ SCENE_ENTRY(Z2_MAP_SHOP, 0x0119, SCENE_DRAW_CFG_DEFAULT),
- /* 0x58 */ SCENE_ENTRY(Z2_F40, 0x0140, SCENE_DRAW_CFG_DEFAULT),
- /* 0x59 */ SCENE_ENTRY(Z2_F41, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5A */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA2, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5B */ SCENE_ENTRY(Z2_14YUKIDAMANOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5C */ SCENE_ENTRY(Z2_12HAKUGINMAE, 0x0125, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5D */ SCENE_ENTRY(Z2_17SETUGEN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5E */ SCENE_ENTRY(Z2_17SETUGEN2, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5F */ SCENE_ENTRY(Z2_SEA_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x60 */ SCENE_ENTRY(Z2_RANDOM, 0x012C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x61 */ SCENE_ENTRY(Z2_YADOYA, 0x010A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x62 */ SCENE_ENTRY(Z2_KONPEKI_ENT, 0x0139, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x63 */ SCENE_ENTRY(Z2_INSIDETOWER, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x64 */ SCENE_ENTRY(Z2_26SARUNOMORI, 0x011D, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x65 */ SCENE_ENTRY(Z2_LOST_WOODS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x66 */ SCENE_ENTRY(Z2_LAST_LINK, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x67 */ SCENE_ENTRY(Z2_SOUGEN, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x68 */ SCENE_ENTRY(Z2_BOMYA, 0x010D, SCENE_DRAW_CFG_DEFAULT),
- /* 0x69 */ SCENE_ENTRY(Z2_KYOJINNOMA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6A */ SCENE_ENTRY(Z2_KOEPONARACE, 0x0131, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6B */ SCENE_ENTRY(Z2_GORONRACE, 0x0126, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6C */ SCENE_ENTRY(Z2_TOWN, 0x0101, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6D */ SCENE_ENTRY(Z2_ICHIBA, 0x0102, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6E */ SCENE_ENTRY(Z2_BACKTOWN, 0x0103, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6F */ SCENE_ENTRY(Z2_CLOCKTOWER, 0x0104, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x70 */ SCENE_ENTRY(Z2_ALLEY, 0x0105, SCENE_DRAW_CFG_MAT_ANIM),
+#include "tables/scene_table.h"
+
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, drawConfig, 0, 0 },
+
+#define DEFINE_SCENE_UNSET(_enumValue) { 0 },
+
+SceneTableEntry gSceneTable[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
static EntranceTableEntry sMayorsResidenceEntrance0[] = {
{ SCENE_SONCHONOIE, 0, 0x4102 },
};
diff --git a/src/code/z_shrink_window.c b/src/code/z_shrink_window.c
index 21d8bde40..c4084a18c 100644
--- a/src/code/z_shrink_window.c
+++ b/src/code/z_shrink_window.c
@@ -3,6 +3,7 @@
* Description: Draws black top/bottom/side borders on the viewing window (e.g. Z-targeting, talking to NPC)
*/
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64shrink_window.h"
diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c
index 9890f4741..79af1b73f 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -1,19 +1,25 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define ANIM_INTERP 1
-s32 LinkAnimation_Loop(PlayState* play, SkelAnime* skelAnime);
-s32 LinkAnimation_Once(PlayState* play, SkelAnime* skelAnime);
+s32 PlayerAnimation_Loop(PlayState* play, SkelAnime* skelAnime);
+s32 PlayerAnimation_Once(PlayState* play, SkelAnime* skelAnime);
s32 SkelAnime_LoopFull(SkelAnime* skelAnime);
s32 SkelAnime_LoopPartial(SkelAnime* skelAnime);
s32 SkelAnime_Once(SkelAnime* skelAnime);
void Animation_PlayLoop(SkelAnime* skelAnime, AnimationHeader* animation);
void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle);
-void LinkAnimation_Change(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed,
- f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
+void PlayerAnimation_Change(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed,
+ f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
void SkelAnime_CopyFrameTable(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src);
+void AnimationContext_LoadFrame(struct PlayState* play, AnimationEntryData* data);
+void AnimationContext_CopyAll(struct PlayState* play, AnimationEntryData* data);
+void AnimationContext_Interp(struct PlayState* play, AnimationEntryData* data);
+void AnimationContext_CopyTrue(struct PlayState* play, AnimationEntryData* data);
+void AnimationContext_CopyFalse(struct PlayState* play, AnimationEntryData* data);
+void AnimationContext_MoveActor(struct PlayState* play, AnimationEntryData* data);
+
static AnimationEntryCallback sAnimationLoadDone[] = {
AnimationContext_LoadFrame, AnimationContext_CopyAll, AnimationContext_Interp,
AnimationContext_CopyTrue, AnimationContext_CopyFalse, AnimationContext_MoveActor,
@@ -44,7 +50,7 @@ void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3
pos.z = limb->jointPos.z;
dList = limb->dLists[lod];
- if ((overrideLimbDraw == NULL) || (overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, actor) == 0)) {
+ if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, actor)) {
Matrix_TranslateRotateZYX(&pos, &rot);
if (dList != NULL) {
Gfx* polyTemp = POLY_OPA_DISP;
@@ -876,7 +882,7 @@ Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32
s16 SkelAnime_GetFrameDataLegacy(LegacyAnimationHeader* animation, s32 frame, Vec3s* frameTable) {
LegacyAnimationHeader* animHeader = Lib_SegmentedToVirtual(animation);
s16 limbCount = animHeader->limbCount;
- JointKey* key = Lib_SegmentedToVirtual(animHeader->jointKey);
+ LegacyJointKey* key = Lib_SegmentedToVirtual(animHeader->jointKey);
s16* frameData = Lib_SegmentedToVirtual(animHeader->frameData);
s16* staticData = &frameData[0];
s16* dynamicData = &frameData[frame];
@@ -901,7 +907,7 @@ s16 SkelAnime_GetFrameDataLegacy(LegacyAnimationHeader* animation, s32 frame, Ve
/**
* Used by legacy animation format
*/
-s16 Animation_GetLimbCount2(LegacyAnimationHeader* animation) {
+s16 Animation_GetLimbCountLegacy(LegacyAnimationHeader* animation) {
LegacyAnimationHeader* animHeader = Lib_SegmentedToVirtual(animation);
return animHeader->limbCount;
@@ -910,7 +916,7 @@ s16 Animation_GetLimbCount2(LegacyAnimationHeader* animation) {
/**
* Used by legacy animation format
*/
-s16 Animation_GetLength2(LegacyAnimationHeader* animation) {
+s16 Animation_GetLengthLegacy(LegacyAnimationHeader* animation) {
LegacyAnimationHeader* animHeader = Lib_SegmentedToVirtual(animation);
return animHeader->frameCount;
@@ -919,7 +925,7 @@ s16 Animation_GetLength2(LegacyAnimationHeader* animation) {
/**
* Used by legacy animation format
*/
-s16 Animation_GetLastFrame2(LegacyAnimationHeader* animation) {
+s16 Animation_GetLastFrameLegacy(LegacyAnimationHeader* animation) {
AnimationHeaderCommon* animHeader = Lib_SegmentedToVirtual(animation);
return animHeader->frameCount - 1;
@@ -979,7 +985,7 @@ AnimationEntry* AnimationContext_AddEntry(AnimationContext* animationCtx, Animat
AnimationEntry* entry;
s16 index = animationCtx->animationCount;
- if (index >= ANIMATION_ENTRY_MAX) {
+ if (index >= ARRAY_COUNT(animationCtx->entries)) {
return NULL;
}
@@ -989,21 +995,25 @@ AnimationEntry* AnimationContext_AddEntry(AnimationContext* animationCtx, Animat
return entry;
}
+#define LINK_ANIMETION_OFFSET(addr, offset) \
+ (SEGMENT_ROM_START(link_animetion) + ((uintptr_t)addr & 0xFFFFFF) + ((u32)offset))
+
/**
- * Requests loading frame data from the Link animation into frameTable
+ * Requests loading frame data from the Player animation into frameTable
*/
-void AnimationContext_SetLoadFrame(PlayState* play, LinkAnimationHeader* animation, s32 frame, s32 limbCount,
+void AnimationContext_SetLoadFrame(PlayState* play, PlayerAnimationHeader* animation, s32 frame, s32 limbCount,
Vec3s* frameTable) {
AnimationEntry* entry = AnimationContext_AddEntry(&play->animationCtx, ANIMATION_LINKANIMETION);
if (entry != NULL) {
- LinkAnimationHeader* linkAnimHeader = Lib_SegmentedToVirtual(animation);
- uintptr_t ram = frameTable;
+ PlayerAnimationHeader* playerAnimHeader = Lib_SegmentedToVirtual(animation);
+ void* ram = (void*)frameTable;
- osCreateMesgQueue(&entry->data.load.msgQueue, &entry->data.load.msg, 1);
- DmaMgr_SendRequestImpl(&entry->data.load.req, ram,
- LINK_ANIMETION_OFFSET(linkAnimHeader->segment, (sizeof(Vec3s) * limbCount + 2) * frame),
- sizeof(Vec3s) * limbCount + 2, 0, &entry->data.load.msgQueue, NULL);
+ osCreateMesgQueue(&entry->data.load.msgQueue, entry->data.load.msg, ARRAY_COUNT(entry->data.load.msg));
+ DmaMgr_SendRequestImpl(
+ &entry->data.load.req, ram,
+ LINK_ANIMETION_OFFSET(playerAnimHeader->linkAnimSegment, (sizeof(Vec3s) * limbCount + sizeof(s16)) * frame),
+ sizeof(Vec3s) * limbCount + sizeof(s16), 0, &entry->data.load.msgQueue, NULL);
}
}
@@ -1080,7 +1090,7 @@ void AnimationContext_SetMoveActor(PlayState* play, Actor* actor, SkelAnime* ske
}
/**
- * Receives the request for Link's animation frame data
+ * Receives the request for Player's animation frame data
*/
void AnimationContext_LoadFrame(PlayState* play, AnimationEntryData* data) {
AnimEntryLoadFrame* entry = &data->load;
@@ -1185,12 +1195,12 @@ void AnimationContext_Update(PlayState* play, AnimationContext* animationCtx) {
}
/**
- * Initializes a skeleton to be used with Link animations to a looping animation, dynamically allocating the frame
+ * Initializes a skeleton to be used with Player animations to a looping animation, dynamically allocating the frame
* tables if not given.
*/
-void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg,
- LinkAnimationHeader* animation, s32 flags, void* jointTableBuffer, void* morphTableBuffer,
- s32 limbBufCount) {
+void SkelAnime_InitPlayer(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg,
+ PlayerAnimationHeader* animation, s32 flags, void* jointTableBuffer, void* morphTableBuffer,
+ s32 limbBufCount) {
FlexSkeletonHeader* skeletonHeader;
s32 headerJointCount;
s32 limbCount;
@@ -1215,7 +1225,7 @@ void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeade
allocSize = sizeof(Vec3s) * limbCount;
if (flags & 8) {
- allocSize += 2;
+ allocSize += sizeof(u16);
}
if (jointTableBuffer == NULL) {
@@ -1226,52 +1236,52 @@ void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeade
skelAnime->morphTable = (void*)ALIGN16((uintptr_t)morphTableBuffer);
}
- LinkAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f);
+ PlayerAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f);
}
/**
- * Sets the update function of a SkelAnime that uses Link animations based on its mode
+ * Sets the update function of a SkelAnime that uses Player animations based on its mode
*/
-void LinkAnimation_SetUpdateFunction(SkelAnime* skelAnime) {
+void PlayerAnimation_SetUpdateFunction(SkelAnime* skelAnime) {
if (skelAnime->mode <= ANIMMODE_LOOP_INTERP) {
- skelAnime->update.link = LinkAnimation_Loop;
+ skelAnime->update.player = PlayerAnimation_Loop;
} else {
- skelAnime->update.link = LinkAnimation_Once;
+ skelAnime->update.player = PlayerAnimation_Once;
}
skelAnime->morphWeight = 0.0f;
}
/**
- * Advances the current Link animation and updates all frame tables. If the animation plays once, returns true when it
+ * Advances the current Player animation and updates all frame tables. If the animation plays once, returns true when it
* finishes.
*/
-s32 LinkAnimation_Update(PlayState* play, SkelAnime* skelAnime) {
- return skelAnime->update.link(play, skelAnime);
+s32 PlayerAnimation_Update(PlayState* play, SkelAnime* skelAnime) {
+ return skelAnime->update.player(play, skelAnime);
}
/**
* Requests an interpolation between the pose in jointTable to the one in morphTable, advancing the morph but not the
* animation frame
*/
-s32 LinkAnimation_Morph(PlayState* play, SkelAnime* skelAnime) {
+s32 PlayerAnimation_Morph(PlayState* play, SkelAnime* skelAnime) {
f32 prevMorphWeight = skelAnime->morphWeight;
f32 updateRate = (s32)play->state.framerateDivisor * 0.5f;
skelAnime->morphWeight -= skelAnime->morphRate * updateRate;
if (skelAnime->morphWeight <= 0.0f) {
- LinkAnimation_SetUpdateFunction(skelAnime);
+ PlayerAnimation_SetUpdateFunction(skelAnime);
}
AnimationContext_SetInterp(play, skelAnime->limbCount, skelAnime->jointTable, skelAnime->morphTable,
1.0f - (skelAnime->morphWeight / prevMorphWeight));
- return 0;
+ return false;
}
/**
- * Requests a load of the next frame of a Link animation, advances the morph, and requests an interpolation between
+ * Requests a load of the next frame of a Player animation, advances the morph, and requests an interpolation between
* jointTable and morphTable
*/
-void LinkAnimation_AnimateFrame(PlayState* play, SkelAnime* skelAnime) {
+void PlayerAnimation_AnimateFrame(PlayState* play, SkelAnime* skelAnime) {
AnimationContext_SetLoadFrame(play, skelAnime->animation, skelAnime->curFrame, skelAnime->limbCount,
skelAnime->jointTable);
if (skelAnime->morphWeight != 0) {
@@ -1287,9 +1297,9 @@ void LinkAnimation_AnimateFrame(PlayState* play, SkelAnime* skelAnime) {
}
/**
- * Advances a Link animation that loops over its full length
+ * Advances a Player animation that loops over its full length
*/
-s32 LinkAnimation_Loop(PlayState* play, SkelAnime* skelAnime) {
+s32 PlayerAnimation_Loop(PlayState* play, SkelAnime* skelAnime) {
f32 updateRate = (s32)play->state.framerateDivisor * 0.5f;
skelAnime->curFrame += skelAnime->playSpeed * updateRate;
@@ -1298,19 +1308,19 @@ s32 LinkAnimation_Loop(PlayState* play, SkelAnime* skelAnime) {
} else if (skelAnime->animLength <= skelAnime->curFrame) {
skelAnime->curFrame -= skelAnime->animLength;
}
- LinkAnimation_AnimateFrame(play, skelAnime);
- return 0;
+ PlayerAnimation_AnimateFrame(play, skelAnime);
+ return false;
}
/**
- * Advances a Link animation that stops at endFrame and returns true when it is reached.
+ * Advances a Player animation that stops at endFrame and returns true when it is reached.
*/
-s32 LinkAnimation_Once(PlayState* play, SkelAnime* skelAnime) {
+s32 PlayerAnimation_Once(PlayState* play, SkelAnime* skelAnime) {
f32 updateRate = (s32)play->state.framerateDivisor * 0.5f;
if (skelAnime->curFrame == skelAnime->endFrame) {
- LinkAnimation_AnimateFrame(play, skelAnime);
- return 1;
+ PlayerAnimation_AnimateFrame(play, skelAnime);
+ return true;
}
skelAnime->curFrame += skelAnime->playSpeed * updateRate;
@@ -1324,8 +1334,8 @@ s32 LinkAnimation_Once(PlayState* play, SkelAnime* skelAnime) {
skelAnime->curFrame -= skelAnime->animLength;
}
}
- LinkAnimation_AnimateFrame(play, skelAnime);
- return 0;
+ PlayerAnimation_AnimateFrame(play, skelAnime);
+ return false;
}
/**
@@ -1337,28 +1347,28 @@ void Animation_SetMorph(PlayState* play, SkelAnime* skelAnime, f32 morphFrames)
}
/**
- * General way to set a new Link animation, allowing choice of playback speed, start frame, end frame, play mode, and
+ * General way to set a new Player animation, allowing choice of playback speed, start frame, end frame, play mode, and
* number of transition frames. Positive morph frames morph from the current pose to the start pose of the new
* animation, then start the new animation. Negative morph frames start the new animation immediately, modified by the
* pose immediately before the animation change.
*/
-void LinkAnimation_Change(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed,
- f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames) {
+void PlayerAnimation_Change(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 playSpeed,
+ f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames) {
skelAnime->mode = mode;
if ((morphFrames != 0.0f) && ((animation != skelAnime->animation) || (startFrame != skelAnime->curFrame))) {
if (morphFrames < 0) {
- LinkAnimation_SetUpdateFunction(skelAnime);
+ PlayerAnimation_SetUpdateFunction(skelAnime);
SkelAnime_CopyFrameTable(skelAnime, skelAnime->morphTable, skelAnime->jointTable);
morphFrames = -morphFrames;
} else {
- skelAnime->update.link = LinkAnimation_Morph;
+ skelAnime->update.player = PlayerAnimation_Morph;
AnimationContext_SetLoadFrame(play, animation, (s32)startFrame, skelAnime->limbCount,
skelAnime->morphTable);
}
skelAnime->morphWeight = 1.0f;
skelAnime->morphRate = 1.0f / morphFrames;
} else {
- LinkAnimation_SetUpdateFunction(skelAnime);
+ PlayerAnimation_SetUpdateFunction(skelAnime);
AnimationContext_SetLoadFrame(play, animation, (s32)startFrame, skelAnime->limbCount, skelAnime->jointTable);
skelAnime->morphWeight = 0.0f;
}
@@ -1373,79 +1383,80 @@ void LinkAnimation_Change(PlayState* play, SkelAnime* skelAnime, LinkAnimationHe
}
/**
- * Immediately changes to a Link animation that plays once at the default speed.
+ * Immediately changes to a Player animation that plays once at the default speed.
*/
-void LinkAnimation_PlayOnce(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation) {
- LinkAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(&animation->common),
- ANIMMODE_ONCE, 0.0f);
+void PlayerAnimation_PlayOnce(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation) {
+ PlayerAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(&animation->common),
+ ANIMMODE_ONCE, 0.0f);
}
/**
- * Immediately changes to a Link animation that plays once at the specified speed.
+ * Immediately changes to a Player animation that plays once at the specified speed.
*/
-void LinkAnimation_PlayOnceSetSpeed(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation,
- f32 playSpeed) {
- LinkAnimation_Change(play, skelAnime, animation, playSpeed, 0.0f, Animation_GetLastFrame(&animation->common),
- ANIMMODE_ONCE, 0.0f);
+void PlayerAnimation_PlayOnceSetSpeed(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation,
+ f32 playSpeed) {
+ PlayerAnimation_Change(play, skelAnime, animation, playSpeed, 0.0f, Animation_GetLastFrame(&animation->common),
+ ANIMMODE_ONCE, 0.0f);
}
/**
- * Immediately changes to a Link animation that loops at the default speed.
+ * Immediately changes to a Player animation that loops at the default speed.
*/
-void LinkAnimation_PlayLoop(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation) {
- LinkAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(&animation->common),
- ANIMMODE_LOOP, 0.0f);
+void PlayerAnimation_PlayLoop(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation) {
+ PlayerAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(&animation->common),
+ ANIMMODE_LOOP, 0.0f);
}
/**
- * Immediately changes to a Link animation that loops at the specified speed.
+ * Immediately changes to a Player animation that loops at the specified speed.
*/
-void LinkAnimation_PlayLoopSetSpeed(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation,
- f32 playSpeed) {
- LinkAnimation_Change(play, skelAnime, animation, playSpeed, 0.0f, Animation_GetLastFrame(&animation->common),
- ANIMMODE_LOOP, 0.0f);
+void PlayerAnimation_PlayLoopSetSpeed(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation,
+ f32 playSpeed) {
+ PlayerAnimation_Change(play, skelAnime, animation, playSpeed, 0.0f, Animation_GetLastFrame(&animation->common),
+ ANIMMODE_LOOP, 0.0f);
}
/**
* Requests copying jointTable to morphTable
*/
-void LinkAnimation_CopyJointToMorph(PlayState* play, SkelAnime* skelAnime) {
+void PlayerAnimation_CopyJointToMorph(PlayState* play, SkelAnime* skelAnime) {
AnimationContext_SetCopyAll(play, skelAnime->limbCount, skelAnime->morphTable, skelAnime->jointTable);
}
/**
* Requests copying morphTable to jointTable
*/
-void LinkAnimation_CopyMorphToJoint(PlayState* play, SkelAnime* skelAnime) {
+void PlayerAnimation_CopyMorphToJoint(PlayState* play, SkelAnime* skelAnime) {
AnimationContext_SetCopyAll(play, skelAnime->limbCount, skelAnime->jointTable, skelAnime->morphTable);
}
/**
- * Requests loading frame data from the Link animation into morphTable
+ * Requests loading frame data from the Player animation into morphTable
*/
-void LinkAnimation_LoadToMorph(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 frame) {
+void PlayerAnimation_LoadToMorph(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 frame) {
AnimationContext_SetLoadFrame(play, animation, (s32)frame, skelAnime->limbCount, skelAnime->morphTable);
}
/**
- * Requests loading frame data from the Link animation into jointTable
+ * Requests loading frame data from the Player animation into jointTable
*/
-void LinkAnimation_LoadToJoint(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 frame) {
+void PlayerAnimation_LoadToJoint(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation, f32 frame) {
AnimationContext_SetLoadFrame(play, animation, (s32)frame, skelAnime->limbCount, skelAnime->jointTable);
}
/**
* Requests interpolating between jointTable and morphTable, placing the result in jointTable
*/
-void LinkAnimation_InterpJointMorph(PlayState* play, SkelAnime* skelAnime, f32 weight) {
+void PlayerAnimation_InterpJointMorph(PlayState* play, SkelAnime* skelAnime, f32 weight) {
AnimationContext_SetInterp(play, skelAnime->limbCount, skelAnime->jointTable, skelAnime->morphTable, weight);
}
/**
- * Requests loading frame data from the Link animations and blending them, placing the result in jointTable
+ * Requests loading frame data from the Player animations and blending them, placing the result in jointTable
*/
-void LinkAnimation_BlendToJoint(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation1, f32 frame1,
- LinkAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer) {
+void PlayerAnimation_BlendToJoint(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation1, f32 frame1,
+ PlayerAnimationHeader* animation2, f32 frame2, f32 blendWeight,
+ void* blendTableBuffer) {
void* alignedBlendTable;
AnimationContext_SetLoadFrame(play, animation1, (s32)frame1, skelAnime->limbCount, skelAnime->jointTable);
@@ -1457,10 +1468,11 @@ void LinkAnimation_BlendToJoint(PlayState* play, SkelAnime* skelAnime, LinkAnima
}
/**
- * Requests loading frame data from the Link animations and blending them, placing the result in morphTable
+ * Requests loading frame data from the Player animations and blending them, placing the result in morphTable
*/
-void LinkAnimation_BlendToMorph(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation1, f32 frame1,
- LinkAnimationHeader* animation2, f32 frame2, f32 blendWeight, void* blendTableBuffer) {
+void PlayerAnimation_BlendToMorph(PlayState* play, SkelAnime* skelAnime, PlayerAnimationHeader* animation1, f32 frame1,
+ PlayerAnimationHeader* animation2, f32 frame2, f32 blendWeight,
+ void* blendTableBuffer) {
void* alignedBlendTable;
AnimationContext_SetLoadFrame(play, animation1, (s32)frame1, skelAnime->limbCount, skelAnime->morphTable);
@@ -1474,9 +1486,9 @@ void LinkAnimation_BlendToMorph(PlayState* play, SkelAnime* skelAnime, LinkAnima
/**
* Changes a looping animation to one that stops at the end.
*/
-void LinkAnimation_EndLoop(SkelAnime* skelAnime) {
+void PlayerAnimation_EndLoop(SkelAnime* skelAnime) {
skelAnime->mode = ANIMMODE_ONCE;
- LinkAnimation_SetUpdateFunction(skelAnime);
+ PlayerAnimation_SetUpdateFunction(skelAnime);
}
/**
@@ -1507,9 +1519,9 @@ s32 Animation_OnFrameImpl(SkelAnime* skelAnime, f32 frame, f32 updateRate) {
}
/**
- * Checks if the current Link animation has reached the specified frame
+ * Checks if the current Player animation has reached the specified frame
*/
-s32 LinkAnimation_OnFrame(SkelAnime* skelAnime, f32 frame) {
+s32 PlayerAnimation_OnFrame(SkelAnime* skelAnime, f32 frame) {
f32 updateRate = gFramerateDivisorHalf;
return Animation_OnFrameImpl(skelAnime, frame, updateRate);
@@ -1620,7 +1632,7 @@ s32 SkelAnime_Morph(SkelAnime* skelAnime) {
}
SkelAnime_InterpFrameTable(skelAnime->limbCount, skelAnime->jointTable, skelAnime->jointTable,
skelAnime->morphTable, 1.0f - (skelAnime->morphWeight / prevMorphWeight));
- return 0;
+ return false;
}
/**
@@ -1654,7 +1666,7 @@ s32 SkelAnime_MorphTaper(SkelAnime* skelAnime) {
}
SkelAnime_InterpFrameTable(skelAnime->limbCount, skelAnime->jointTable, skelAnime->jointTable,
skelAnime->morphTable, 1.0f - curWeight);
- return 0;
+ return false;
}
/**
@@ -1701,7 +1713,7 @@ s32 SkelAnime_LoopFull(SkelAnime* skelAnime) {
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1718,7 +1730,7 @@ s32 SkelAnime_LoopPartial(SkelAnime* skelAnime) {
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1730,7 +1742,7 @@ s32 SkelAnime_Once(SkelAnime* skelAnime) {
if (skelAnime->curFrame == skelAnime->endFrame) {
SkelAnime_GetFrameData(skelAnime->animation, skelAnime->curFrame, skelAnime->limbCount, skelAnime->jointTable);
SkelAnime_AnimateFrame(skelAnime);
- return 1;
+ return true;
}
skelAnime->curFrame += skelAnime->playSpeed * updateRate;
@@ -1746,7 +1758,7 @@ s32 SkelAnime_Once(SkelAnime* skelAnime) {
}
}
SkelAnime_AnimateFrame(skelAnime);
- return 0;
+ return false;
}
/**
@@ -1931,7 +1943,7 @@ void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle) {
skelAnime->jointTable->x = skelAnime->baseTransl.x;
skelAnime->prevTransl.z = skelAnime->jointTable->z;
skelAnime->jointTable->z = skelAnime->baseTransl.z;
- if (skelAnime->moveFlags & ANIM_FLAG_UPDATEY) {
+ if (skelAnime->moveFlags & ANIM_FLAG_UPDATE_Y) {
if (skelAnime->moveFlags & ANIM_FLAG_NOMOVE) {
diff->y = 0.0f;
} else {
diff --git a/src/code/z_skin.c b/src/code/z_skin.c
index 9bfd8d566..0d3e0bf85 100644
--- a/src/code/z_skin.c
+++ b/src/code/z_skin.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64skin.h"
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index e9663b02f..3524fe3ab 100644
--- a/src/code/z_snap.c
+++ b/src/code/z_snap.c
@@ -18,8 +18,8 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
s32 seen;
s32 validCount = 0;
- gSaveContext.save.pictoFlags0 = 0;
- gSaveContext.save.pictoFlags1 = 0;
+ gSaveContext.save.saveInfo.pictoFlags0 = 0;
+ gSaveContext.save.saveInfo.pictoFlags1 = 0;
if (play->sceneId == SCENE_20SICHITAI) {
Snap_SetFlag(PICTO_VALID_IN_SWAMP);
@@ -42,9 +42,6 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
break;
}
- //! FAKE:
- if (1) {}
-
// Actors which may be pictographed anywhere
switch (actor->id) {
case ACTOR_EN_KAKASI:
@@ -71,15 +68,20 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
case ACTOR_EN_GE2:
seen |= PICTO_SEEN_ANYWHERE;
break;
+
+ default:
+ break;
+ }
+
+ if (!seen) {
+ continue;
}
// If actor is recordable, run its validity function and record if valid
- if (seen) {
- pictoActor = (PictoActor*)actor;
- if (pictoActor->validationFunc != NULL) {
- if ((pictoActor->validationFunc)(play, actor) == 0) {
- validCount++;
- }
+ pictoActor = (PictoActor*)actor;
+ if (pictoActor->validationFunc != NULL) {
+ if (pictoActor->validationFunc(play, actor) == 0) {
+ validCount++;
}
}
}
@@ -91,20 +93,20 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
// Only used in this file
void Snap_SetFlag(s32 flag) {
if (flag < 0x20) {
- gSaveContext.save.pictoFlags0 |= (1 << flag);
+ gSaveContext.save.saveInfo.pictoFlags0 |= (1 << flag);
} else {
flag &= 0x1F;
- gSaveContext.save.pictoFlags1 |= (1 << flag);
+ gSaveContext.save.saveInfo.pictoFlags1 |= (1 << flag);
}
}
// Unused
void Snap_UnsetFlag(s32 flag) {
if (flag < 0x20) {
- gSaveContext.save.pictoFlags0 &= ~(1 << flag);
+ gSaveContext.save.saveInfo.pictoFlags0 &= ~(1 << flag);
} else {
flag &= 0x1F;
- gSaveContext.save.pictoFlags1 &= ~(1 << flag);
+ gSaveContext.save.saveInfo.pictoFlags1 &= ~(1 << flag);
}
}
@@ -112,10 +114,10 @@ u32 Snap_CheckFlag(s32 flag) {
SaveContext* saveCtx = &gSaveContext;
if (flag < 0x20) {
- return saveCtx->save.pictoFlags0 & (1 << flag);
+ return saveCtx->save.saveInfo.pictoFlags0 & (1 << flag);
} else {
flag &= 0x1F;
- return saveCtx->save.pictoFlags1 & (1 << flag);
+ return saveCtx->save.saveInfo.pictoFlags1 & (1 << flag);
}
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index c32a76d76..21bfaf7ef 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -1,8 +1,9 @@
#include "prevent_bss_reordering.h"
#include "global.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "z64horse.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
-void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages);
+void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages);
void func_80147314(SramContext* sramCtx, s32 fileNum);
void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
@@ -10,131 +11,33 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \
(newf)[5] != '3')
-// default scene flags (?)
-// indices of subarray:
-// - 0: switch0
-// - 1: switch1
-// - 2: chest
-// - 3: collectible
-u32 D_801C5FC0[SCENE_MAX][4] = {
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI2
- { 0, 0, 0, 0 }, // SCENE_UNSET_1
- { 0, 0, 0, 0 }, // SCENE_UNSET_2
- { 0, 0, 0, 0 }, // SCENE_UNSET_3
- { 0, 0, 0, 0 }, // SCENE_UNSET_4
- { 0, 0, 0, 0 }, // SCENE_UNSET_5
- { 0, 0, 0, 0 }, // SCENE_UNSET_6
- { 0, 0, 0, 0xC04 }, // SCENE_KAKUSIANA
- { 0, 0, 0, 0 }, // SCENE_SPOT00
- { 0, 0, 0, 0 }, // SCENE_UNSET_9
- { 0, 0, 0, 0 }, // SCENE_WITCH_SHOP
- { 0, 0, 0, 0x80000000 }, // SCENE_LAST_BS
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKASHITA
- { 0, 0, 0, 0 }, // SCENE_AYASHIISHOP
- { 0, 0, 0, 0 }, // SCENE_UNSET_E
- { 0, 0, 0, 0 }, // SCENE_UNSET_F
- { 0, 0, 0, 0 }, // SCENE_OMOYA
- { 0, 0, 0, 0 }, // SCENE_BOWLING
- { 0, 0, 0, 0 }, // SCENE_SONCHONOIE
- { 0x100000, 0, 0, 0x40000002 }, // SCENE_IKANA
- { 0, 0, 0, 0 }, // SCENE_KAIZOKU
- { 0, 0, 0, 0 }, // SCENE_MILK_BAR
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_N
- { 2, 0, 0, 0 }, // SCENE_TAKARAYA
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_R
- { 0, 0, 0, 0 }, // SCENE_OKUJOU
- { 0xF, 0, 0, 0 }, // SCENE_OPENINGDAN
- { 0x70B000, 0, 0, 0 }, // SCENE_MITURIN
- { 0, 0, 0, 0 }, // SCENE_13HUBUKINOMITI
- { 0, 0x80000000, 0, 0x400 }, // SCENE_CASTLE
- { 0, 0, 0, 0 }, // SCENE_DEKUTES
- { 0, 0, 0, 0x80000000 }, // SCENE_MITURIN_BS
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MIZU
- { 0x1A00020, 0, 0, 0 }, // SCENE_HAKUGIN
- { 0x400, 0, 0, 0 }, // SCENE_ROMANYMAE
- { 0, 0, 0, 0x1000 }, // SCENE_PIRATE
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MORI
- { 0, 0, 0, 2 }, // SCENE_SINKAI
- { 0x400, 0, 0, 0 }, // SCENE_YOUSEI_IZUMI
- { 0, 0, 0, 0 }, // SCENE_KINSTA1
- { 0, 0, 0, 0x80000000 }, // SCENE_KINDAN2
- { 0, 0, 0, 0 }, // SCENE_TENMON_DAI
- { 0, 0, 0, 2 }, // SCENE_LAST_DEKU
- { 0, 0, 0, 0x40000000 }, // SCENE_22DEKUCITY
- { 0, 0, 0, 0 }, // SCENE_KAJIYA
- { 0x10, 0, 0, 0 }, // SCENE_00KEIKOKU
- { 3, 0, 0, 0 }, // SCENE_POSTHOUSE
- { 0, 0, 0, 0 }, // SCENE_LABO
- { 0, 0, 0, 0x80000000 }, // SCENE_DANPEI2TEST
- { 0, 0, 0, 0 }, // SCENE_UNSET_31
- { 0, 0, 0, 0 }, // SCENE_16GORON_HOUSE
- { 0, 0, 0, 0 }, // SCENE_33ZORACITY
- { 0, 0, 0, 0 }, // SCENE_8ITEMSHOP
- { 0, 0, 0, 0 }, // SCENE_F01
- { 0, 0, 0, 0x80000000 }, // SCENE_INISIE_BS
- { 0x100400, 0, 0, 0x22 }, // SCENE_30GYOSON
- { 0x400, 0, 0, 0x80 }, // SCENE_31MISAKI
- { 0, 0, 0, 0 }, // SCENE_TAKARAKUJI
- { 0, 0, 0, 0 }, // SCENE_UNSET_3A
- { 0x400, 0, 0, 0 }, // SCENE_TORIDE
- { 0, 0, 0, 0 }, // SCENE_FISHERMAN
- { 0, 0, 0, 0 }, // SCENE_GORONSHOP
- { 0, 0, 0, 0 }, // SCENE_DEKU_KING
- { 0, 0, 0, 2 }, // SCENE_LAST_GORON
- { 0, 0, 0, 0x80000002 }, // SCENE_24KEMONOMITI
- { 0, 0, 0, 0 }, // SCENE_F01_B
- { 0, 0, 0, 0 }, // SCENE_F01C
- { 0, 0, 0, 0 }, // SCENE_BOTI
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKUGIN_BS
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI
- { 0x102, 0, 0, 0x400 }, // SCENE_21MITURINMAE
- { 0, 0, 0, 2 }, // SCENE_LAST_ZORA
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO2
- { 0x70, 0, 0, 0 }, // SCENE_SEA
- { 0, 0, 0, 0 }, // SCENE_35TAKI
- { 0, 0, 0, 0 }, // SCENE_REDEAD
- { 0, 0, 0, 0x40000000 }, // SCENE_BANDROOM
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO
- { 0, 0, 0, 0 }, // SCENE_GORON_HAKA
- { 0, 0, 0, 0 }, // SCENE_SECOM
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA
- { 0, 0, 0, 0 }, // SCENE_TOUGITES
- { 0, 0, 0, 0 }, // SCENE_DANPEI
- { 0, 0, 0, 0 }, // SCENE_IKANAMAE
- { 0, 0, 0, 0 }, // SCENE_DOUJOU
- { 0, 0, 0, 0 }, // SCENE_MUSICHOUSE
- { 0, 0, 0, 0 }, // SCENE_IKNINSIDE
- { 0, 0, 0, 0 }, // SCENE_MAP_SHOP
- { 0x400, 0, 0, 0 }, // SCENE_F40
- { 0x400, 0, 0, 0 }, // SCENE_F41
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA2
- { 0, 0, 0, 0x100 }, // SCENE_14YUKIDAMANOMITI
- { 0x400, 0, 0, 0 }, // SCENE_12HAKUGINMAE
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN2
- { 0, 0, 0, 0x80000000 }, // SCENE_SEA_BS
- { 0, 0, 0, 0x400 }, // SCENE_RANDOM
- { 0, 0, 0, 0 }, // SCENE_YADOYA
- { 0, 0, 0, 0 }, // SCENE_KONPEKI_ENT
- { 1, 0, 0, 0 }, // SCENE_INSIDETOWER
- { 0, 0, 0, 0 }, // SCENE_26SARUNOMORI
- { 0, 0, 0, 0 }, // SCENE_LOST_WOODS
- { 0, 0, 0, 2 }, // SCENE_LAST_LINK
- { 0, 0, 0, 0 }, // SCENE_SOUGEN
- { 0, 0, 0, 0 }, // SCENE_BOMYA
- { 0, 0, 0, 0 }, // SCENE_KYOJINNOMA
- { 0, 0, 0, 0 }, // SCENE_KOEPONARACE
- { 0, 0, 0, 0 }, // SCENE_GORONRACE
- { 1, 0, 0, 0 }, // SCENE_TOWN
- { 0, 0, 0, 0 }, // SCENE_ICHIBA
- { 0, 0, 0, 0x400 }, // SCENE_BACKTOWN
- { 0x100000, 0, 0, 0x400 }, // SCENE_CLOCKTOWER
- { 0, 0, 1, 0 }, // SCENE_ALLEY
+typedef struct PersistentCycleFlags {
+ /* 0x0 */ u32 switch0;
+ /* 0x4 */ u32 switch1;
+ /* 0x8 */ u32 chest;
+ /* 0xC */ u32 collectible;
+} PersistentCycleFlags; // size = 0x10
+
+#define PERSISTENT_CYCLE_FLAGS_SET(switch0, switch1, chest, collectible) { switch0, switch1, chest, collectible },
+#define PERSISTENT_CYCLE_FLAGS_NONE PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 0)
+
+#define DEFINE_SCENE(_name, _enumValue, _textId, _drawConfig, _restrictionFlags, persistentCycleFlags) \
+ persistentCycleFlags
+#define DEFINE_SCENE_UNSET(_enumValue) PERSISTENT_CYCLE_FLAGS_NONE
+
+/**
+ * Array of bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ */
+PersistentCycleFlags sPersistentCycleFlags[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
// TODO: figure out a way to use the WEEKEVENTREG defines here
// weekEventReg flags which will be not be cleared on a cycle reset
-u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.weekEventReg)] = {
+u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = {
/* 0 */ 0xFFFC,
/* 1 */ 0xFFFF,
/* 2 */ 0xFFFF,
@@ -237,9 +140,21 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.weekEventReg)] = {
/* 99 */ 0,
};
+// Unused remnant values from OoT. Not the correct sizes in MM.
+#define OOT_SAVECONTEXT_SIZE 0x1428
+#define OOT_SLOT_SIZE (OOT_SAVECONTEXT_SIZE + 0x28)
+#define OOT_SRAM_HEADER_SIZE 0x10
+#define OOT_SLOT_OFFSET(index) (OOT_SRAM_HEADER_SIZE + 0x10 + (index * OOT_SLOT_SIZE))
+
// used in other files
-s32 D_801C6798[] = {
- 0x00000020, 0x00001470, 0x000028C0, 0x00003D10, 0x00005160, 0x000065B0,
+u32 gSramSlotOffsets[] = {
+ OOT_SLOT_OFFSET(0),
+ OOT_SLOT_OFFSET(1),
+ OOT_SLOT_OFFSET(2),
+ // the latter three saves are backup saves for the former saves (in OoT)
+ OOT_SLOT_OFFSET(3),
+ OOT_SLOT_OFFSET(4),
+ OOT_SLOT_OFFSET(5),
};
u8 gAmmoItems[] = {
@@ -269,51 +184,112 @@ u8 gAmmoItems[] = {
ITEM_NONE, // SLOT_BOTTLE_6
};
-s32 D_801C67C8[] = { 0, 0x40, 0x80, 0xC0, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380 };
-
-s32 D_801C67F0[] = { 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 1, 1 };
-
-s32 D_801C6818[] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 1, 1 };
-
-s32 D_801C6840[] = { 0x100, 0x180, 0x200, 0x280 };
-
-s32 D_801C6850[] = { 0x80, 0x80, 0x80, 0x80, 0x300, 0x380, 1, 1 };
-
-s32 D_801C6870[] = {
- sizeof(Save),
- sizeof(Save),
- sizeof(Save),
- sizeof(Save),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
+// Stores flash start page number
+s32 gFlashSaveStartPages[] = {
+ 0, // File 1 New Cycle Save
+ 0x40, // File 1 New Cycle Save Backup
+ 0x80, // File 2 New Cycle Save
+ 0xC0, // File 2 New Cycle Save Backup
+ 0x100, // File 1 Owl Save
+ 0x180, // File 1 Owl Save Backup
+ 0x200, // File 2 Owl Save
+ 0x280, // File 2 Owl Save Backup
+ 0x300, // Sram Header (SaveOptions)
+ 0x380, // Sram Header Backup (SaveOptions)
};
-u8 D_801C6890[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
+// Flash rom number of pages
+s32 gFlashSaveNumPages[] = {
+ 0x40, // File 1 New Cycle Save
+ 0x40, // File 1 New Cycle Save Backup
+ 0x40, // File 2 New Cycle Save
+ 0x40, // File 2 New Cycle Save Backup
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Flash rom number of pages on very first time Player enters South Clock Town from the Clock Tower
+s32 gFlashSpecialSaveNumPages[] = {
+ 0x80, // File 1 New Cycle Save
+ 0x80, // File 1 New Cycle Save Backup
+ 0x80, // File 2 New Cycle Save
+ 0x80, // File 2 New Cycle Save Backup
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Owl Save flash rom start page number
+s32 gFlashOwlSaveStartPages[] = {
+ 0x100, // File 1 Owl Save
+ 0x180, // File 1 Owl Save Backup
+ 0x200, // File 2 Owl Save
+ 0x280, // File 2 Owl Save Backup
+};
+
+// Owl Save flash rom number of pages
+s32 gFlashOwlSaveNumPages[] = {
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+};
+
+// Save Options Sram Header flash rom start page number
+s32 gFlashOptionsSaveStartPages[] = {
+ 0x300, // Sram Header (SaveOptions)
+ 0x380, // Sram Header Backup (SaveOptions)
+};
+
+// Save Options Sram Header flash rom number of pages
+s32 gFlashOptionsSaveNumPages[] = {
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Flash rom actual size needed
+s32 gFlashSaveSizes[] = {
+ sizeof(Save), // size = 0x100C - File 1 New Cycle Save
+ sizeof(Save), // size = 0x100C - File 1 New Cycle Save Backup
+ sizeof(Save), // size = 0x100C - File 2 New Cycle Save
+ sizeof(Save), // size = 0x100C - File 2 New Cycle Save Backup
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save Backup
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save Backup
+};
+
+u8 D_801C6890[8] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
u16 D_801F6AF0;
u8 D_801F6AF2;
void Sram_ActivateOwl(u8 owlId) {
- gSaveContext.save.playerData.owlActivationFlags =
- ((void)0, gSaveContext.save.playerData.owlActivationFlags) | (u16)gBitFlags[owlId];
+ gSaveContext.save.saveInfo.playerData.owlActivationFlags =
+ ((void)0, gSaveContext.save.saveInfo.playerData.owlActivationFlags) | (u16)gBitFlags[owlId];
- if (gSaveContext.save.playerData.unk_20 == 0xFF) {
- gSaveContext.save.playerData.unk_20 = owlId;
+ if (gSaveContext.save.saveInfo.playerData.unk_20 == 0xFF) {
+ gSaveContext.save.saveInfo.playerData.unk_20 = owlId;
}
}
void Sram_ClearHighscores(void) {
- gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF) | 0x130000;
- gSaveContext.save.unk_EE8 = (gSaveContext.save.unk_EE8 & 0xFFFF0000) | 0xA;
- gSaveContext.save.horseBackBalloonHighScore = SECONDS_TO_TIMER(60);
+ gSaveContext.save.saveInfo.unk_EC4 = (gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF) | 0x130000;
+ gSaveContext.save.saveInfo.unk_EC4 = (gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF0000) | 0xA;
+ gSaveContext.save.saveInfo.horseBackBalloonHighScore = SECONDS_TO_TIMER(60);
SET_TOWN_SHOOTING_GALLERY_HIGH_SCORE(39);
SET_SWAMP_SHOOTING_GALLERY_HIGH_SCORE(10);
- gSaveContext.save.dekuPlaygroundHighScores[0] = SECONDS_TO_TIMER(75);
- gSaveContext.save.dekuPlaygroundHighScores[1] = SECONDS_TO_TIMER(75);
- gSaveContext.save.dekuPlaygroundHighScores[2] = SECONDS_TO_TIMER(76);
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[0] = SECONDS_TO_TIMER(75);
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[1] = SECONDS_TO_TIMER(75);
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[2] = SECONDS_TO_TIMER(76);
}
/**
@@ -342,29 +318,32 @@ void Sram_SaveEndOfCycle(PlayState* play) {
gSaveContext.save.day = 0;
gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
- gSaveContext.save.playerData.deaths++;
- if (gSaveContext.save.playerData.deaths > 999) {
- gSaveContext.save.playerData.deaths = 999;
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount++;
+ if (gSaveContext.save.saveInfo.playerData.threeDayResetCount > 999) {
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount = 999;
}
sceneId = Play_GetOriginalSceneId(play->sceneId);
Play_SaveCycleSceneFlags(&play->state);
- play->actorCtx.sceneFlags.chest &= D_801C5FC0[sceneId][2];
- play->actorCtx.sceneFlags.switches[0] &= D_801C5FC0[sceneId][0];
- play->actorCtx.sceneFlags.switches[1] &= D_801C5FC0[sceneId][1];
- play->actorCtx.sceneFlags.collectible[0] &= D_801C5FC0[sceneId][3];
+ play->actorCtx.sceneFlags.chest &= sPersistentCycleFlags[sceneId].chest;
+ play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleFlags[sceneId].switch0;
+ play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleFlags[sceneId].switch1;
+ play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleFlags[sceneId].collectible;
play->actorCtx.sceneFlags.clearedRoom = 0;
for (i = 0; i < SCENE_MAX; i++) {
- gSaveContext.cycleSceneFlags[i].switch0 = ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & D_801C5FC0[i][0];
- gSaveContext.cycleSceneFlags[i].switch1 = ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & D_801C5FC0[i][1];
- gSaveContext.cycleSceneFlags[i].chest = ((void)0, gSaveContext.cycleSceneFlags[i].chest) & D_801C5FC0[i][2];
+ gSaveContext.cycleSceneFlags[i].switch0 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].chest =
+ ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleFlags[i].chest;
gSaveContext.cycleSceneFlags[i].collectible =
- ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & D_801C5FC0[i][3];
+ ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleFlags[i].collectible;
gSaveContext.cycleSceneFlags[i].clearedRoom = 0;
- gSaveContext.save.permanentSceneFlags[i].unk_14 = 0;
- gSaveContext.save.permanentSceneFlags[i].rooms = 0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].unk_14 = 0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].rooms = 0;
}
for (; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
@@ -388,8 +367,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
for (j = 0; j < ARRAY_COUNT(D_801C6890); j++) {
if ((phi_v1_3 & 3) == 0) {
- gSaveContext.save.weekEventReg[i] =
- ((void)0, gSaveContext.save.weekEventReg[i]) & (0xFF ^ D_801C6890[j]);
+ gSaveContext.save.saveInfo.weekEventReg[i] =
+ ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ D_801C6890[j]);
}
phi_v1_3 >>= 2;
}
@@ -405,7 +384,7 @@ void Sram_SaveEndOfCycle(PlayState* play) {
CLEAR_EVENTINF(EVENTINF_73);
CLEAR_EVENTINF(EVENTINF_74);
- if (gSaveContext.save.playerData.rupees != 0) {
+ if (gSaveContext.save.saveInfo.playerData.rupees != 0) {
SET_EVENTINF(EVENTINF_70);
}
@@ -436,8 +415,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
for (i = 0; i < ARRAY_COUNT(gAmmoItems); i++) {
if (gAmmoItems[i] != ITEM_NONE) {
- if ((gSaveContext.save.inventory.items[i] != ITEM_NONE) && (i != SLOT_PICTO_BOX)) {
- item = gSaveContext.save.inventory.items[i];
+ if ((gSaveContext.save.saveInfo.inventory.items[i] != ITEM_NONE) && (i != SLOT_PICTO_BOX)) {
+ item = gSaveContext.save.saveInfo.inventory.items[i];
AMMO(item) = 0;
}
}
@@ -445,23 +424,23 @@ void Sram_SaveEndOfCycle(PlayState* play) {
for (i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_6; i++) {
// Check for all bottled items
- if (gSaveContext.save.inventory.items[i] >= ITEM_POTION_RED) {
- if (gSaveContext.save.inventory.items[i] <= ITEM_OBABA_DRINK) {
+ if (gSaveContext.save.saveInfo.inventory.items[i] >= ITEM_POTION_RED) {
+ if (gSaveContext.save.saveInfo.inventory.items[i] <= ITEM_OBABA_DRINK) {
for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++) {
- if (GET_CUR_FORM_BTN_ITEM(j) == gSaveContext.save.inventory.items[i]) {
+ if (GET_CUR_FORM_BTN_ITEM(j) == gSaveContext.save.saveInfo.inventory.items[i]) {
SET_CUR_FORM_BTN_ITEM(j, ITEM_BOTTLE);
Interface_LoadItemIconImpl(play, j);
}
}
- gSaveContext.save.inventory.items[i] = ITEM_BOTTLE;
+ gSaveContext.save.saveInfo.inventory.items[i] = ITEM_BOTTLE;
}
}
}
REMOVE_QUEST_ITEM(QUEST_PICTOGRAPH);
- if (gSaveContext.save.playerData.health < 0x30) {
- gSaveContext.save.playerData.health = 0x30;
+ if (gSaveContext.save.saveInfo.playerData.health < 0x30) {
+ gSaveContext.save.saveInfo.playerData.health = 0x30;
}
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) <= EQUIP_VALUE_SWORD_RAZOR) {
@@ -491,8 +470,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
if (STOLEN_ITEM_1 == ITEM_BOTTLE) {
slot = SLOT(ITEM_BOTTLE);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = ITEM_BOTTLE;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = ITEM_BOTTLE;
break;
}
}
@@ -501,8 +480,8 @@ void Sram_SaveEndOfCycle(PlayState* play) {
if (STOLEN_ITEM_2 == ITEM_BOTTLE) {
slot = SLOT(ITEM_BOTTLE);
for (i = BOTTLE_FIRST; i < BOTTLE_MAX; i++) {
- if (gSaveContext.save.inventory.items[slot + i] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot + i] = ITEM_BOTTLE;
+ if (gSaveContext.save.saveInfo.inventory.items[slot + i] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot + i] = ITEM_BOTTLE;
break;
}
}
@@ -522,34 +501,34 @@ void Sram_SaveEndOfCycle(PlayState* play) {
}
}
- gSaveContext.save.skullTokenCount &= ~0xFFFF0000;
- gSaveContext.save.skullTokenCount &= ~0x0000FFFF;
- gSaveContext.save.unk_EC4 = 0;
+ gSaveContext.save.saveInfo.skullTokenCount &= ~0xFFFF0000;
+ gSaveContext.save.saveInfo.skullTokenCount &= ~0x0000FFFF;
+ gSaveContext.save.saveInfo.unk_EA0 = 0;
- gSaveContext.save.unk_E88[0] = 0;
- gSaveContext.save.unk_E88[1] = 0;
- gSaveContext.save.unk_E88[2] = 0;
- gSaveContext.save.unk_E88[3] = 0;
- gSaveContext.save.unk_E88[4] = 0;
- gSaveContext.save.unk_E88[5] = 0;
- gSaveContext.save.unk_E88[6] = 0;
+ gSaveContext.save.saveInfo.unk_E64[0] = 0;
+ gSaveContext.save.saveInfo.unk_E64[1] = 0;
+ gSaveContext.save.saveInfo.unk_E64[2] = 0;
+ gSaveContext.save.saveInfo.unk_E64[3] = 0;
+ gSaveContext.save.saveInfo.unk_E64[4] = 0;
+ gSaveContext.save.saveInfo.unk_E64[5] = 0;
+ gSaveContext.save.saveInfo.unk_E64[6] = 0;
Sram_ClearHighscores();
for (i = 0; i < 8; i++) {
- gSaveContext.save.inventory.dungeonItems[i] &= (u8)~1; // remove boss key
+ gSaveContext.save.saveInfo.inventory.dungeonItems[i] &= (u8)~1; // remove boss key
DUNGEON_KEY_COUNT(i) = 0;
- gSaveContext.save.inventory.strayFairies[i] = 0;
+ gSaveContext.save.saveInfo.inventory.strayFairies[i] = 0;
}
- gSaveContext.save.playerData.rupees = 0;
- gSaveContext.save.unk_F65 = 0;
+ gSaveContext.save.saveInfo.playerData.rupees = 0;
+ gSaveContext.save.saveInfo.unk_F41 = 0;
gSaveContext.powderKegTimer = 0;
gSaveContext.unk_1014 = 0;
gSaveContext.jinxTimer = 0;
gSaveContext.rupeeAccumulator = 0;
- func_800F3B2C(play);
+ Horse_ResetHorseData(play);
}
void Sram_IncrementDay(void) {
@@ -558,12 +537,12 @@ void Sram_IncrementDay(void) {
gSaveContext.save.daysElapsed++;
}
- gSaveContext.save.bombersCaughtNum = 0;
- gSaveContext.save.bombersCaughtOrder[0] = 0;
- gSaveContext.save.bombersCaughtOrder[1] = 0;
- gSaveContext.save.bombersCaughtOrder[2] = 0;
- gSaveContext.save.bombersCaughtOrder[3] = 0;
- gSaveContext.save.bombersCaughtOrder[4] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtNum = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[0] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[1] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[2] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[3] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[4] = 0;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_73_10);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_85_02);
@@ -593,9 +572,7 @@ void Sram_ResetSave(void) {
gSaveContext.save.hasTatl = false;
gSaveContext.save.isOwlSave = false;
- // Instead of bloating all save context accesses with an extra sub-struct, the size of the would-be sub-struct
- // is calculated manually
- bzero(&gSaveContext.save.playerData, sizeof(Save) - offsetof(Save, playerData));
+ bzero(&gSaveContext.save.saveInfo, sizeof(SaveInfo));
}
/**
@@ -615,15 +592,15 @@ void Sram_GenerateRandomSaveFields(void) {
Sram_ClearHighscores();
- gSaveContext.save.lotteryCodes[0][0] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[0][1] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[0][2] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[1][0] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[1][1] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[1][2] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[2][0] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[2][1] = Rand_S16Offset(0, 10);
- gSaveContext.save.lotteryCodes[2][2] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[0][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[0][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[0][2] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[1][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[1][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[1][2] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[2][0] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[2][1] = Rand_S16Offset(0, 10);
+ gSaveContext.save.saveInfo.lotteryCodes[2][2] = Rand_S16Offset(0, 10);
// Needed to match...
for (i = 0; i < 3; i++) {
@@ -636,7 +613,7 @@ void Sram_GenerateRandomSaveFields(void) {
while (i != k) {
randSpiderHouse = Rand_S16Offset(0, 16) & 3;
if (sp2A != randSpiderHouse) {
- gSaveContext.save.spiderHouseMaskOrder[i] = randSpiderHouse;
+ gSaveContext.save.saveInfo.spiderHouseMaskOrder[i] = randSpiderHouse;
i++;
sp2A = randSpiderHouse;
}
@@ -644,9 +621,9 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
- gSaveContext.save.bomberCode[0] = randBombers;
+ gSaveContext.save.saveInfo.bomberCode[0] = randBombers;
i = 1;
while (i != 5) {
@@ -654,18 +631,18 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
sp2A = 0;
do {
- if (randBombers == gSaveContext.save.bomberCode[sp2A]) {
+ if (randBombers == gSaveContext.save.saveInfo.bomberCode[sp2A]) {
k = true;
}
sp2A++;
} while (sp2A < i);
if (k == false) {
- gSaveContext.save.bomberCode[i] = randBombers;
+ gSaveContext.save.saveInfo.bomberCode[i] = randBombers;
i++;
}
}
@@ -673,7 +650,7 @@ void Sram_GenerateRandomSaveFields(void) {
SavePlayerData sSaveDefaultPlayerData = {
{ '\0', '\0', '\0', '\0', '\0', '\0' }, // newf
- 0, // deaths
+ 0, // threeDayResetCount
{ 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName " "
0x30, // healthCapacity
0x30, // health
@@ -755,25 +732,26 @@ void Sram_InitNewSave(void) {
gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
Sram_ResetSave();
- Lib_MemCpy(&gSaveContext.save.playerData, &sSaveDefaultPlayerData, sizeof(SavePlayerData));
- Lib_MemCpy(&gSaveContext.save.equips, &sSaveDefaultItemEquips, sizeof(ItemEquips));
- Lib_MemCpy(&gSaveContext.save.inventory, &sSaveDefaultInventory, sizeof(Inventory));
- Lib_MemCpy(&gSaveContext.save.checksum, &sSaveDefaultChecksum, sizeof(gSaveContext.save.checksum));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.playerData, &sSaveDefaultPlayerData, sizeof(SavePlayerData));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.equips, &sSaveDefaultItemEquips, sizeof(ItemEquips));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.inventory, &sSaveDefaultInventory, sizeof(Inventory));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.checksum, &sSaveDefaultChecksum,
+ sizeof(gSaveContext.save.saveInfo.checksum));
- gSaveContext.save.horseData.sceneId = SCENE_F01;
- gSaveContext.save.horseData.pos.x = -1420;
- gSaveContext.save.horseData.pos.y = 257;
- gSaveContext.save.horseData.pos.z = -1285;
- gSaveContext.save.horseData.yaw = -0x7554;
+ gSaveContext.save.saveInfo.horseData.sceneId = SCENE_F01;
+ gSaveContext.save.saveInfo.horseData.pos.x = -1420;
+ gSaveContext.save.saveInfo.horseData.pos.y = 257;
+ gSaveContext.save.saveInfo.horseData.pos.z = -1285;
+ gSaveContext.save.saveInfo.horseData.yaw = -0x7554;
gSaveContext.nextCutsceneIndex = 0;
- gSaveContext.save.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
Sram_GenerateRandomSaveFields();
}
SavePlayerData sSaveDebugPlayerData = {
{ 'Z', 'E', 'L', 'D', 'A', '3' }, // newf
- 0x0000, // deaths
+ 0, // threeDayResetCount
{ 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName "LINK "
0x80, // healthCapacity
0x80, // health
@@ -870,7 +848,18 @@ Inventory sSaveDebugInventory = {
(1 << QUEST_SONG_SOARING) | (1 << QUEST_SONG_STORMS) | (1 << QUEST_BOMBERS_NOTEBOOK) |
(1 << QUEST_SONG_LULLABY_INTRO),
// dungeonItems
- { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ {
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ },
// dungeonKeys
{ 8, 8, 8, 8, 8, 8, 8, 8, 8 },
// defenseHearts
@@ -908,10 +897,10 @@ u8 D_801C6A50[] = {
void Sram_InitDebugSave(void) {
Sram_ResetSave();
- Lib_MemCpy(&gSaveContext.save.playerData, &sSaveDebugPlayerData, sizeof(SavePlayerData));
- Lib_MemCpy(&gSaveContext.save.equips, &sSaveDebugItemEquips, sizeof(ItemEquips));
- Lib_MemCpy(&gSaveContext.save.inventory, &sSaveDebugInventory, sizeof(Inventory));
- Lib_MemCpy(&gSaveContext.save.checksum, &sSaveDebugChecksum, sizeof(gSaveContext.save.checksum));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.playerData, &sSaveDebugPlayerData, sizeof(SavePlayerData));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.equips, &sSaveDebugItemEquips, sizeof(ItemEquips));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.inventory, &sSaveDebugInventory, sizeof(Inventory));
+ Lib_MemCpy(&gSaveContext.save.saveInfo.checksum, &sSaveDebugChecksum, sizeof(gSaveContext.save.saveInfo.checksum));
if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) {
BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = D_801C6A48[GET_PLAYER_FORM];
@@ -920,11 +909,11 @@ void Sram_InitDebugSave(void) {
gSaveContext.save.hasTatl = true;
- gSaveContext.save.horseData.sceneId = SCENE_F01;
- gSaveContext.save.horseData.pos.x = -1420;
- gSaveContext.save.horseData.pos.y = 257;
- gSaveContext.save.horseData.pos.z = -1285;
- gSaveContext.save.horseData.yaw = -0x7554;
+ gSaveContext.save.saveInfo.horseData.sceneId = SCENE_F01;
+ gSaveContext.save.saveInfo.horseData.pos.x = -1420;
+ gSaveContext.save.saveInfo.horseData.pos.y = 257;
+ gSaveContext.save.saveInfo.horseData.pos.z = -1285;
+ gSaveContext.save.saveInfo.horseData.yaw = -0x7554;
gSaveContext.save.entrance = ENTRANCE(CUTSCENE, 0);
gSaveContext.save.isFirstCycle = true;
@@ -934,42 +923,41 @@ void Sram_InitDebugSave(void) {
SET_WEEKEVENTREG(WEEKEVENTREG_31_04);
gSaveContext.cycleSceneFlags[SCENE_INSIDETOWER].switch0 = 1;
- gSaveContext.save.permanentSceneFlags[SCENE_INSIDETOWER].switch0 = 1;
- gSaveContext.save.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[SCENE_INSIDETOWER].switch0 = 1;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
Sram_GenerateRandomSaveFields();
}
-// Unused
-void func_80144A94(SramContext* sramCtx) {
+void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) {
s32 i;
- s32 cutscene = gSaveContext.save.cutscene;
+ s32 cutsceneIndex = gSaveContext.save.cutsceneIndex;
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]) !=
- 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]);
}
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- if (CHECK_NEWF(gSaveContext.save.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
}
- gSaveContext.save.cutscene = cutscene;
+ gSaveContext.save.cutsceneIndex = cutsceneIndex;
for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
gSaveContext.eventInf[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
- gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
- gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
- gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
- gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.saveInfo.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible;
}
for (i = 0; i < TIMER_ID_MAX; i++) {
@@ -981,8 +969,8 @@ void func_80144A94(SramContext* sramCtx) {
gSaveContext.timerPausedOsTimes[i] = 0;
}
- D_801BDAA0 = 1;
- D_801BDA9C = 0;
+ D_801BDAA0 = true;
+ gHorseIsMounted = false;
gSaveContext.powderKegTimer = 0;
gSaveContext.unk_1014 = 0;
gSaveContext.jinxTimer = 0;
@@ -1003,36 +991,38 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 pad1;
s32 fileNum;
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
if (gSaveContext.fileNum == 0xFF) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
- } else if (fileSelect->unk_2446A[gSaveContext.fileNum] != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[0], gFlashSaveNumPages[0]);
+ } else if (fileSelect->isOwlSave[gSaveContext.fileNum + 2]) {
phi_t1 = gSaveContext.fileNum + 2;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1],
+ gFlashSaveNumPages[phi_t1 + 1]);
}
} else {
phi_t1 = gSaveContext.fileNum;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1],
+ gFlashSaveNumPages[phi_t1 + 1]);
}
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]);
- if (CHECK_NEWF(gSaveContext.save.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1], gFlashSaveNumPages[phi_t1 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]);
}
}
- gSaveContext.save.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
if (!gSaveContext.save.isOwlSave) {
for (i = 0; i < ARRAY_COUNT(gSaveContext.eventInf); i++) {
@@ -1040,11 +1030,11 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
- gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
- gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
- gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
- gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.saveInfo.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible;
}
for (i = 0; i < TIMER_ID_MAX; i++) {
@@ -1059,7 +1049,7 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
if (gSaveContext.save.isFirstCycle) {
gSaveContext.save.entrance = ENTRANCE(SOUTH_CLOCK_TOWN, 0);
gSaveContext.save.day = 0;
- gSaveContext.save.time = 0x3FFF;
+ gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
} else {
gSaveContext.save.entrance = ENTRANCE(CUTSCENE, 0);
gSaveContext.nextCutsceneIndex = 0;
@@ -1068,26 +1058,26 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
} else {
gSaveContext.save.entrance = D_801C6A58[(void)0, gSaveContext.save.owlSaveLocation];
if ((gSaveContext.save.entrance == ENTRANCE(SOUTHERN_SWAMP_POISONED, 10)) &&
- CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
gSaveContext.save.entrance = ENTRANCE(SOUTHERN_SWAMP_CLEARED, 10);
} else if ((gSaveContext.save.entrance == ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 8)) &&
- CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
gSaveContext.save.entrance = ENTRANCE(MOUNTAIN_VILLAGE_SPRING, 8);
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.permanentSceneFlags[i].chest;
- gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.permanentSceneFlags[i].switch0;
- gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.permanentSceneFlags[i].switch1;
- gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.permanentSceneFlags[i].clearedRoom;
- gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.permanentSceneFlags[i].collectible;
+ gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.saveInfo.permanentSceneFlags[i].chest;
+ gSaveContext.cycleSceneFlags[i].switch0 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 = gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].clearedRoom = gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom;
+ gSaveContext.cycleSceneFlags[i].collectible = gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible;
}
- if (gSaveContext.save.unk_F65) {
- Lib_MemCpy(gScarecrowSpawnSongPtr, gSaveContext.save.scarecrowSpawnSong,
- sizeof(gSaveContext.save.scarecrowSpawnSong));
+ if (gSaveContext.save.saveInfo.unk_F41) {
+ Lib_MemCpy(gScarecrowSpawnSongPtr, gSaveContext.save.saveInfo.scarecrowSpawnSong,
+ sizeof(gSaveContext.save.saveInfo.scarecrowSpawnSong));
- for (i = 0; i != ARRAY_COUNT(gSaveContext.save.scarecrowSpawnSong); i++) {}
+ for (i = 0; i != ARRAY_COUNT(gSaveContext.save.saveInfo.scarecrowSpawnSong); i++) {}
}
fileNum = gSaveContext.fileNum;
@@ -1101,30 +1091,30 @@ void func_8014546C(SramContext* sramCtx) {
if (gSaveContext.save.isOwlSave) {
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
- gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
- gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
- gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
- gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
}
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
+ gSaveContext.save.saveInfo.checksum = 0;
+ gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum));
} else {
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
- gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
- gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
- gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
- gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
}
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+ gSaveContext.save.saveInfo.checksum = 0;
+ gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
}
@@ -1138,16 +1128,16 @@ void func_80145698(SramContext* sramCtx) {
s32 i;
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
- gSaveContext.save.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
- gSaveContext.save.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
- gSaveContext.save.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
- gSaveContext.save.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
- gSaveContext.save.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].chest = gSaveContext.cycleSceneFlags[i].chest;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch0 = gSaveContext.cycleSceneFlags[i].switch0;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].switch1 = gSaveContext.cycleSceneFlags[i].switch1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].clearedRoom = gSaveContext.cycleSceneFlags[i].clearedRoom;
+ gSaveContext.save.saveInfo.permanentSceneFlags[i].collectible = gSaveContext.cycleSceneFlags[i].collectible;
}
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
- if (gSaveContext.unk_3F3F) {
+ gSaveContext.save.saveInfo.checksum = 0;
+ gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+ if (gSaveContext.flashSaveAvailable) {
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
}
@@ -1155,31 +1145,21 @@ void func_80145698(SramContext* sramCtx) {
// Verifies save and use backup if corrupted?
#ifdef NON_EQUIVALENT
-void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
- FileSelectState* fileSelect = fileSelect2;
+void func_801457CC(GameState* gameState, SramContext* sramCtx) {
+ FileSelectState* fileSelect = (FileSelectState*)gameState;
u16 sp7A;
- // u16 sp78;
+ u16 oldCheckSum; // s2
u16 sp76;
- // u16 sp74;
- u16 sp6E; //!
- // s32 sp68;
- // u16 sp66;
- u16 phi_s2; //!
- u16 sp64;
- // s32 sp60;
- // s32 sp5C;
- // s32 sp58;
- // u32 new_var;
- u16 phi_s2_3;
- // s16 fakevar;
+ u16 sp64; // sp74?
+ u16 phi_s2;
+ u16 phi_s7;
+ u16 sp6E;
+ u16 newCheckSum; // v0
+ u16 phi_a0; // maskCount
- u16 temp_s2;
- u16 temp_v0_2;
- u16 phi_a0; // maskCount
-
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
D_801F6AF0 = gSaveContext.save.time;
- D_801F6AF2 = gSaveContext.unk_3F3F;
+ D_801F6AF2 = gSaveContext.flashSaveAvailable;
sp64 = 0;
for (sp76 = 0; sp76 < 5; sp76++, sp64 += 2) {
@@ -1187,40 +1167,65 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
phi_s2 = false;
sp6E = 0;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) {
+ // read main save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]) != 0) {
+ // main save didn't work
sp6E = 1;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ // backup save didn't work
phi_s2 = true;
}
}
if (sp76 < 2) {
- fileSelect->unk_24468[sp76] = 0;
+ // Non-owl save
+ // sp76 = 0: main save
+ // sp76 = 1: backup save
+
+ fileSelect->isOwlSave[sp76] = 0;
if (phi_s2) {
+ // both main save and backup save failed
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
} else {
- // Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.checksum;
- gSaveContext.save.checksum = 0;
- temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
- gSaveContext.save.checksum = temp_s2;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
- if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ // test checksum of main save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ gSaveContext.save.saveInfo.checksum = 0;
+ newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
+ gSaveContext.save.saveInfo.checksum = oldCheckSum;
+
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) {
+ // checksum didnt match, try backup save
sp6E = 1;
- if (CHECK_NEWF2(gSaveContext.save.playerData.newf)) {}
- phi_s2 = false;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') &&
+ (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) {
+ phi_s2 = false;
+ }
+
+ // phi_s2 = false;
+
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ // backup save didn't work
phi_s2 = true;
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.checksum;
- gSaveContext.save.checksum = 0;
- if (phi_s2 || CHECK_NEWF(gSaveContext.save.playerData.newf) ||
- (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+
+ // test checksum of backup save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ gSaveContext.save.saveInfo.checksum = 0;
+
+ //! FAKE: (s32)sp64
+ if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) ||
+ (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[(s32)sp64]))) {
+ // backup save didn't work
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
sp6E = 999;
@@ -1228,169 +1233,193 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
}
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum =
- Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+ gSaveContext.save.saveInfo.checksum = 0;
+ // FAKE: Needed?
+ gSaveContext.save.saveInfo.checksum =
+ Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]);
- for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
- fileSelect->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) {
+ fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A];
}
if (!CHECK_NEWF(fileSelect->newf[sp76])) {
- fileSelect->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+ fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
- for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
- fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) {
+ fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
}
- fileSelect->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
- fileSelect->health[sp76] = gSaveContext.save.playerData.health;
- fileSelect->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
- fileSelect->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
- fileSelect->unk_24458[sp76] = gSaveContext.save.time;
- fileSelect->unk_24460[sp76] = gSaveContext.save.day;
- fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[sp76] = gSaveContext.save.playerData.rupees;
- fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[sp76] = gSaveContext.save.time;
+ fileSelect->day[sp76] = gSaveContext.save.day;
+ fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
- if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
+ if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) {
phi_a0++;
}
}
fileSelect->maskCount[sp76] = phi_a0;
- fileSelect->heartPieceCount[sp76] = ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
+ fileSelect->heartPieceCount[sp76] =
+ ((gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C);
}
if (sp6E == 1) {
+ // backup save
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
- } else if (sp6E == 0) { // TODO: == 0?
- temp_s2 = gSaveContext.save.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
- phi_s2_3 = 1;
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]);
+ } else if (!sp6E) {
+ // main save
+ phi_s7 = gSaveContext.save.saveInfo.checksum;
+
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ oldCheckSum = 1;
} else {
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- phi_s2_3 = gSaveContext.save.checksum;
- gSaveContext.save.checksum = 0;
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ gSaveContext.save.saveInfo.checksum = 0;
sp7A = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
}
- if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (phi_s2_3 != sp7A) || (phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) ||
+ (oldCheckSum != phi_s7)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]);
}
}
} else if (sp76 < 4) {
- fileSelect->unk_24468[sp76] = 0;
+ // Owl Save:
+ // sp76 = 3: main owl save
+ // sp76 = 4: backup owl save
+ fileSelect->isOwlSave[sp76] = 0;
- if (!CHECK_NEWF(fileSelect->newf2[(s32)sp76])) { // TODO: Needed?
+ if (!CHECK_NEWF(fileSelect->newf[sp76 - 2])) {
if (phi_s2) {
+ // both main save and backup save failed
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf,
- D_801C6870[sp64]); // TODO: Needed?
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
} else {
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
- gSaveContext.save.checksum = 0;
- temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
- gSaveContext.save.checksum = temp_s2;
- if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ // test checksum of main save
+ gSaveContext.save.saveInfo.checksum = 0;
+ newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
+ gSaveContext.save.saveInfo.checksum = oldCheckSum;
+
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) {
+ // checksum didnt match, try backup save
sp6E = 1;
- if ((gSaveContext.save.playerData.newf[0] == 'Z') &&
- (gSaveContext.save.playerData.newf[1] == 'E')) {
+ if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') &&
+ (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) {
phi_s2 = false;
}
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1])) {
+ // backup save didn't work
phi_s2 = true;
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.checksum;
- gSaveContext.save.checksum = 0;
- if (phi_s2 || CHECK_NEWF(gSaveContext.save.playerData.newf) ||
- (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+
+ // test checksum of backup save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ gSaveContext.save.saveInfo.checksum = 0;
+
+ if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) ||
+ (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]))) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
sp6E = 999;
}
}
}
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum =
- Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+ gSaveContext.save.saveInfo.checksum = 0;
+ // FAKE: Needed?
+ gSaveContext.save.saveInfo.checksum =
+ Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]);
- for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.newf); sp7A++) {
- fileSelect->newf[sp76][sp7A] = gSaveContext.save.playerData.newf[sp7A];
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) {
+ fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A];
}
if (!CHECK_NEWF(fileSelect->newf[sp76])) {
- fileSelect->unk_2440C[sp76] = gSaveContext.save.playerData.deaths;
+ fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
- for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.playerData.playerName); sp7A++) {
- phi_s2 += 0; // TODO: Needed?
- fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.playerData.playerName[sp7A];
+ for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) {
+ fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
}
- fileSelect->healthCapacity[sp76] = gSaveContext.save.playerData.healthCapacity;
- fileSelect->health[sp76] = gSaveContext.save.playerData.health;
- fileSelect->unk_24454[sp76] = gSaveContext.save.inventory.defenseHearts;
- fileSelect->unk_24444[sp76] = gSaveContext.save.inventory.questItems;
- fileSelect->unk_24458[sp76] = gSaveContext.save.time;
- fileSelect->unk_24460[sp76] = gSaveContext.save.day;
- fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[sp76] = gSaveContext.save.playerData.rupees;
- fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[sp76] = gSaveContext.save.time;
+ fileSelect->day[sp76] = gSaveContext.save.day;
+ fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
- if (gSaveContext.save.inventory.items[sp7A + 24] != 0xFF) {
+ if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) {
phi_a0++;
}
}
fileSelect->maskCount[sp76] = phi_a0;
fileSelect->heartPieceCount[sp76] =
- ((gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C);
+ ((gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C);
}
if (sp6E == 1) {
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
- } else if (!sp6E) { // TODO: == 0?
- temp_s2 = gSaveContext.save.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
- phi_s2_3 = 1;
+ // backup save
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]);
+ } else if (!sp6E) {
+ // main save
+ phi_s7 = gSaveContext.save.saveInfo.checksum;
+
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1])) {
+ oldCheckSum = 1;
} else {
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- phi_s2_3 = gSaveContext.save.checksum;
- gSaveContext.save.checksum = 0;
- // phi_s2_3 = gSaveContext.save.checksum;
- sp7A = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ gSaveContext.save.saveInfo.checksum = 0;
+ sp7A = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
}
- if (CHECK_NEWF(gSaveContext.save.playerData.newf) || (phi_s2_3 != sp7A) ||
- (phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) ||
+ (oldCheckSum != phi_s7)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64],
+ gFlashSaveNumPages[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]);
}
}
} else {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]);
}
} else {
if (phi_s2) {
gSaveContext.options.optionId = 0xA51D;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
} else {
@@ -1398,7 +1427,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
if (gSaveContext.options.optionId != 0xA51D) {
gSaveContext.options.optionId = 0xA51D;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
}
@@ -1408,7 +1437,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
gSaveContext.options.language = 1;
@@ -1417,108 +1446,111 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s")
#endif
-void func_80146580(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) {
+void Sram_EraseSave(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) {
FileSelectState* fileSelect = fileSelect2;
s32 pad;
- if (gSaveContext.unk_3F3F) {
- if (fileSelect->unk_2446A[fileNum]) {
+ if (gSaveContext.flashSaveAvailable) {
+ if (fileSelect->isOwlSave[fileNum + 2]) {
func_80147314(sramCtx, fileNum);
- fileSelect->unk_2446A[fileNum] = 0;
+ fileSelect->isOwlSave[fileNum + 2] = false;
}
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
#ifdef NON_MATCHING
// v0/v1
-void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
+void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) {
FileSelectState* fileSelect = fileSelect2;
u16 i;
s16 maskCount;
- if (gSaveContext.unk_3F3F) {
- if (fileSelect->unk_2446A[fileSelect->unk_2448E]) {
- func_80147414(sramCtx, fileSelect->unk_2448E, fileSelect->fileNum);
- fileSelect->unk_24410[fileSelect->fileNum] = gSaveContext.save.playerData.deaths;
+ if (gSaveContext.flashSaveAvailable) {
+ if (fileSelect->isOwlSave[fileSelect->selectedFileIndex + 2]) {
+ func_80147414(sramCtx, fileSelect->selectedFileIndex, fileSelect->copyDestFileIndex);
+ fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileSelect->unk_24424[fileSelect->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
+ fileSelect->fileNames[fileSelect->copyDestFileIndex + 2][i] =
+ gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->unk_24438[fileSelect->fileNum] = gSaveContext.save.playerData.healthCapacity;
- fileSelect->unk_24440[fileSelect->fileNum] = gSaveContext.save.playerData.health;
- fileSelect->unk_24456[fileSelect->fileNum] = gSaveContext.save.inventory.defenseHearts;
- fileSelect->unk_2444C[fileSelect->fileNum] = gSaveContext.save.inventory.questItems;
- fileSelect->unk_2445C[fileSelect->fileNum] = gSaveContext.save.time;
- fileSelect->unk_24464[fileSelect->fileNum] = gSaveContext.save.day;
- fileSelect->unk_2446A[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
- fileSelect->unk_24470[fileSelect->fileNum] = gSaveContext.save.playerData.rupees;
- // = CUR_UPG_VALUE(UPG_WALLET);
- fileSelect->unk_24476[fileSelect->fileNum] =
- (gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+ fileSelect->healthCapacity[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->copyDestFileIndex + 2] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
- if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
maskCount++;
}
}
- fileSelect->unk_2447A[fileSelect->fileNum] = maskCount;
- fileSelect->unk_2447E[fileSelect->fileNum] = (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->copyDestFileIndex + 2] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->copyDestFileIndex + 2] = GET_QUEST_HEART_PIECE_COUNT;
}
// clear buffer
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// read to buffer
- func_80185968(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2], D_801C67F0[fileSelect->unk_2448E * 2]);
-
+ SysFlashrom_ReadData(&sramCtx->saveBuf[0], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2],
+ gFlashSaveNumPages[fileSelect->selectedFileIndex * 2]);
if (1) {}
- func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1],
- D_801C67F0[fileSelect->unk_2448E * 2 + 1]);
+
+ SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2 + 1],
+ gFlashSaveNumPages[fileSelect->selectedFileIndex * 2 + 1]);
if (1) {}
// copy buffer to save context
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- fileSelect->unk_2440C[fileSelect->fileNum] = gSaveContext.save.playerData.deaths;
+ fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileSelect->unk_24414[fileSelect->fileNum][i] = gSaveContext.save.playerData.playerName[i];
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
+ fileSelect->fileNames[fileSelect->copyDestFileIndex][i] =
+ gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->healthCapacity[fileSelect->fileNum] = gSaveContext.save.playerData.healthCapacity;
- fileSelect->health[fileSelect->fileNum] = gSaveContext.save.playerData.health;
- fileSelect->unk_24454[fileSelect->fileNum] = gSaveContext.save.inventory.defenseHearts;
- fileSelect->unk_24444[fileSelect->fileNum] = gSaveContext.save.inventory.questItems;
- fileSelect->unk_24458[fileSelect->fileNum] = gSaveContext.save.time;
- fileSelect->unk_24460[fileSelect->fileNum] = gSaveContext.save.day;
- fileSelect->unk_24468[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[fileSelect->fileNum] = gSaveContext.save.playerData.rupees;
- // = CUR_UPG_VALUE(UPG_WALLET);
- fileSelect->unk_24474[fileSelect->fileNum] =
- (gSaveContext.save.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+ fileSelect->healthCapacity[fileSelect->copyDestFileIndex] =
+ gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->copyDestFileIndex] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->copyDestFileIndex] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->copyDestFileIndex] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->copyDestFileIndex] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
- if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
maskCount++;
}
}
- fileSelect->maskCount[fileSelect->fileNum] = maskCount;
- fileSelect->heartPieceCount[fileSelect->fileNum] =
- (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->copyDestFileIndex] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->copyDestFileIndex] = GET_QUEST_HEART_PIECE_COUNT;
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146628.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_CopySave.s")
#endif
void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
@@ -1527,65 +1559,69 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
FileSelectState* fileSelect = fileSelect2;
s16 maskCount;
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
Sram_InitNewSave();
- if (fileSelect->unk_24480 == 0) {
- gSaveContext.save.cutscene = 0xFFF0;
+ if (fileSelect->buttonIndex == 0) {
+ gSaveContext.save.cutsceneIndex = 0xFFF0;
}
- for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.playerData.playerName); phi_v0++) {
- gSaveContext.save.playerData.playerName[phi_v0] = fileSelect->unk_24414[fileSelect->unk_24480][phi_v0];
+ for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); phi_v0++) {
+ gSaveContext.save.saveInfo.playerData.playerName[phi_v0] =
+ fileSelect->fileNames[fileSelect->buttonIndex][phi_v0];
}
- gSaveContext.save.playerData.newf[0] = 'Z';
- gSaveContext.save.playerData.newf[1] = 'E';
- gSaveContext.save.playerData.newf[2] = 'L';
- gSaveContext.save.playerData.newf[3] = 'D';
- gSaveContext.save.playerData.newf[4] = 'A';
- gSaveContext.save.playerData.newf[5] = '3';
+ gSaveContext.save.saveInfo.playerData.newf[0] = 'Z';
+ gSaveContext.save.saveInfo.playerData.newf[1] = 'E';
+ gSaveContext.save.saveInfo.playerData.newf[2] = 'L';
+ gSaveContext.save.saveInfo.playerData.newf[3] = 'D';
+ gSaveContext.save.saveInfo.playerData.newf[4] = 'A';
+ gSaveContext.save.saveInfo.playerData.newf[5] = '3';
- gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
+ gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.save, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.newf); i++) {
- fileSelect->newf[fileSelect->unk_24480][i] = gSaveContext.save.playerData.newf[i];
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); i++) {
+ fileSelect->newf[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
}
- fileSelect->unk_2440C[fileSelect->unk_24480] = gSaveContext.save.playerData.deaths;
+ fileSelect->threeDayResetCount[fileSelect->buttonIndex] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.playerData.playerName); i++) {
- fileSelect->unk_24414[fileSelect->unk_24480][i] = gSaveContext.save.playerData.playerName[i];
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
+ fileSelect->fileNames[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->healthCapacity[fileSelect->unk_24480] = gSaveContext.save.playerData.healthCapacity;
- fileSelect->health[fileSelect->unk_24480] = gSaveContext.save.playerData.health;
- fileSelect->unk_24454[fileSelect->unk_24480] = gSaveContext.save.inventory.defenseHearts;
- fileSelect->unk_24444[fileSelect->unk_24480] = gSaveContext.save.inventory.questItems;
- fileSelect->unk_24458[fileSelect->unk_24480] = gSaveContext.save.time;
- fileSelect->unk_24460[fileSelect->unk_24480] = gSaveContext.save.day;
- fileSelect->unk_24468[fileSelect->unk_24480] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[fileSelect->unk_24480] = gSaveContext.save.playerData.rupees;
- fileSelect->unk_24474[fileSelect->unk_24480] = CUR_UPG_VALUE(UPG_WALLET);
+ fileSelect->healthCapacity[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->buttonIndex] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->buttonIndex] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->buttonIndex] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->buttonIndex] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
- if (gSaveContext.save.inventory.items[i + 24] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
maskCount++;
}
}
- fileSelect->maskCount[fileSelect->unk_24480] = maskCount;
- fileSelect->heartPieceCount[fileSelect->unk_24480] =
- (gSaveContext.save.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->buttonIndex] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->buttonIndex] = GET_QUEST_HEART_PIECE_COUNT;
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
-void func_80146DF8(SramContext* sramCtx) {
- if (gSaveContext.unk_3F3F) {
+/**
+ * Write the SaveOptions of SaveContext to the save buffer
+ */
+void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx) {
+ if (gSaveContext.flashSaveAvailable) {
// TODO: macros for languages
gSaveContext.options.language = 1;
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions));
@@ -1599,7 +1635,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
}
void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->heap, SAVE_BUFFER_SIZE);
sramCtx->status = 0;
}
@@ -1608,10 +1644,10 @@ void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
/**
* Synchronous flash write
*/
-void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages) {
+void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
- func_80185F64(sramCtx->saveBuf, curPage, numPages);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, curPage, numPages);
}
/**
@@ -1624,14 +1660,15 @@ void Sram_SaveSpecialEnterClockTown(PlayState* play) {
gSaveContext.save.isFirstCycle = true;
gSaveContext.save.isOwlSave = false;
func_80145698(sramCtx);
- func_80185F64(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C6818[gSaveContext.fileNum * 2]);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]);
}
/**
* Saves when beating the game, after showing the "Dawn of the New Day" message
*/
void Sram_SaveSpecialNewDay(PlayState* play) {
- s32 cutscene = gSaveContext.save.cutscene;
+ s32 cutsceneIndex = gSaveContext.save.cutsceneIndex;
s32 day;
u16 time = gSaveContext.save.time;
@@ -1644,28 +1681,29 @@ void Sram_SaveSpecialNewDay(PlayState* play) {
gSaveContext.save.day = day;
gSaveContext.save.time = time;
- gSaveContext.save.cutscene = cutscene;
- func_80185F64(play->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]);
+ gSaveContext.save.cutsceneIndex = cutsceneIndex;
+ SysFlashrom_WriteDataSync(play->sramCtx.saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2]);
}
-void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) {
+void Sram_SetFlashPagesDefault(SramContext* sramCtx, u32 curPage, u32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
sramCtx->status = 1;
}
-void func_80147020(SramContext* sramCtx) {
+void Sram_StartWriteToFlashDefault(SramContext* sramCtx) {
// async flash write
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
- sramCtx->unk_18 = osGetTime();
+ sramCtx->startWriteOsTime = osGetTime();
sramCtx->status = 2;
}
-void func_80147068(SramContext* sramCtx) {
+void Sram_UpdateWriteToFlashDefault(SramContext* sramCtx) {
if (sramCtx->status == 2) {
- if (func_80185EC4() != 0) { // if task running
- if (func_80185F04() == 0) { // wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // if task running
+ if (SysFlashrom_AwaitResult() == 0) { // wait for task done
// task success
sramCtx->status = 4;
} else {
@@ -1673,50 +1711,52 @@ void func_80147068(SramContext* sramCtx) {
sramCtx->status = 4;
}
}
- } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) {
+ } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) {
+ // Finished status is hardcoded to 2 seconds instead of when the task finishes
sramCtx->status = 0;
}
}
-void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages) {
+void Sram_SetFlashPagesOwlSave(SramContext* sramCtx, s32 curPage, s32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
sramCtx->status = 6;
}
-void func_80147150(SramContext* sramCtx) {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+void Sram_StartWriteToFlashOwlSave(SramContext* sramCtx) {
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
- sramCtx->unk_18 = osGetTime();
+ sramCtx->startWriteOsTime = osGetTime();
sramCtx->status = 7;
}
-void func_80147198(SramContext* sramCtx) {
+void Sram_UpdateWriteToFlashOwlSave(SramContext* sramCtx) {
if (sramCtx->status == 7) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
} else {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
}
}
} else if (sramCtx->status == 8) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
sramCtx->status = 4;
} else {
sramCtx->status = 4;
}
}
- } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) {
+ } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) {
+ // Finished status is hardcoded to 2 seconds instead of when the task finishes
sramCtx->status = 0;
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
gSaveContext.save.isOwlSave = false;
- gSaveContext.save.checksum = 0;
+ gSaveContext.save.saveInfo.checksum = 0;
// flash read to buffer then copy to save context
- func_80185968(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_ReadData(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
}
}
@@ -1726,30 +1766,32 @@ void func_80147314(SramContext* sramCtx, s32 fileNum) {
gSaveContext.save.isOwlSave = false;
- gSaveContext.save.playerData.newf[0] = '\0';
- gSaveContext.save.playerData.newf[1] = '\0';
- gSaveContext.save.playerData.newf[2] = '\0';
- gSaveContext.save.playerData.newf[3] = '\0';
- gSaveContext.save.playerData.newf[4] = '\0';
- gSaveContext.save.playerData.newf[5] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[0] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[1] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[2] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[3] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[4] = '\0';
+ gSaveContext.save.saveInfo.playerData.newf[5] = '\0';
- gSaveContext.save.checksum = 0;
- gSaveContext.save.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
+ gSaveContext.save.saveInfo.checksum = 0;
+ gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum));
- func_80146EBC(sramCtx, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]);
- func_80146EBC(sramCtx, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2], gFlashOwlSaveNumPages[fileNum * 2]);
+ //! Note: should be `gFlashOwlSaveNumPages[fileNum * 2 + 1]`?
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2 + 1], gFlashOwlSaveNumPages[fileNum * 2]);
gSaveContext.save.isOwlSave = true;
- gSaveContext.save.playerData.newf[0] = 'Z';
- gSaveContext.save.playerData.newf[1] = 'E';
- gSaveContext.save.playerData.newf[2] = 'L';
- gSaveContext.save.playerData.newf[3] = 'D';
- gSaveContext.save.playerData.newf[4] = 'A';
- gSaveContext.save.playerData.newf[5] = '3';
+ gSaveContext.save.saveInfo.playerData.newf[0] = 'Z';
+ gSaveContext.save.saveInfo.playerData.newf[1] = 'E';
+ gSaveContext.save.saveInfo.playerData.newf[2] = 'L';
+ gSaveContext.save.saveInfo.playerData.newf[3] = 'D';
+ gSaveContext.save.saveInfo.playerData.newf[4] = 'A';
+ gSaveContext.save.saveInfo.playerData.newf[5] = '3';
}
+// Used by `Sram_CopySave` with `isOwlSave` set
void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
s32 pad;
@@ -1757,16 +1799,18 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// Read save file
- if (func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2],
+ gFlashOwlSaveNumPages[fileNum * 2]) != 0) {
// If failed, read backup save file
- func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2 + 1],
+ gFlashOwlSaveNumPages[fileNum * 2 + 1]);
}
// Copy buffer to save context
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
- func_80146EBC(sramCtx, D_801C6840[arg2 * 2], D_801C6850[arg2 * 2]);
- func_80146EBC(sramCtx, D_801C6840[arg2 * 2 + 1], D_801C6850[arg2 * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2], gFlashOwlSaveNumPages[arg2 * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2 + 1], gFlashOwlSaveNumPages[arg2 * 2]);
}
void Sram_nop8014750C(UNK_TYPE4 arg0) {
diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c
index 6650f41a7..90d09a4b1 100644
--- a/src/code/z_sub_s.c
+++ b/src/code/z_sub_s.c
@@ -15,7 +15,7 @@ Vec3f gOneVec3f = { 1.0f, 1.0f, 1.0f };
s32 D_801C5DBC[] = { 0, 1 }; // Unused
/**
- * Finds the first EnDoor instance with unk_1A4 == 5 and the specified switchFlag.
+ * Finds the first EnDoor instance with doorType == ENDOOR_TYPE_5 and the specified switchFlag.
*/
EnDoor* SubS_FindDoor(PlayState* play, s32 switchFlag) {
Actor* actor = NULL;
@@ -29,7 +29,7 @@ EnDoor* SubS_FindDoor(PlayState* play, s32 switchFlag) {
break;
}
- if ((door->unk_1A4 == 5) && (door->switchFlag == (u8)switchFlag)) {
+ if ((door->doorType == ENDOOR_TYPE_5) && (door->switchFlag == (u8)switchFlag)) {
break;
}
@@ -128,7 +128,7 @@ Gfx* SubS_DrawTransformFlex(PlayState* play, void** skeleton, Vec3s* jointTable,
newDlist = rootLimb->dList;
limbDList = rootLimb->dList;
- if (overrideLimbDraw == NULL || !overrideLimbDraw(play, 1, &newDlist, &pos, &rot, actor, &gfx)) {
+ if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &newDlist, &pos, &rot, actor, &gfx)) {
Matrix_TranslateRotateZYX(&pos, &rot);
Matrix_Push();
@@ -489,9 +489,9 @@ Path* SubS_GetAdditionalPath(PlayState* play, u8 pathIndex, s32 limit) {
if (i >= limit) {
break;
}
- pathIndex = path->unk1;
+ pathIndex = path->additionalPathIndex;
i++;
- } while (pathIndex != 0xFF);
+ } while (pathIndex != ADDITIONAL_PATH_INDEX_NONE);
return path;
}
@@ -577,7 +577,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) {
diffZ = points[index + 1].z - points[index - 1].z;
}
- func_8017B7F8(&point, RADF_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((px * actor->world.pos.x) + (pz * actor->world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -585,7 +585,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) {
return reached;
}
-Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 max, s32* startPointIndex) {
+Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 pathIndexNone, s32* startPointIndex) {
Path* path = NULL;
s32 found = false;
s32 time = (((s16)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60) +
@@ -593,17 +593,17 @@ Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 max, s32* start
30;
s32 day = CURRENT_DAY;
- if (pathIndex == max) {
+ if (pathIndex == pathIndexNone) {
return NULL;
}
- while (pathIndex != 0xFF) {
+ while (pathIndex != ADDITIONAL_PATH_INDEX_NONE) {
path = &play->setupPathList[pathIndex];
- if (sPathDayFlags[day] & path->unk2) {
+ if (path->customValue & sPathDayFlags[day]) {
found = true;
break;
}
- pathIndex = path->unk1;
+ pathIndex = path->additionalPathIndex;
}
if (found == true) {
@@ -994,7 +994,7 @@ void SubS_DrawShadowTex(Actor* actor, GameState* gameState, u8* tex) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, 100);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
Matrix_Translate(actor->world.pos.x, 0.0f, actor->world.pos.z, MTXMODE_NEW);
@@ -1023,13 +1023,13 @@ s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f3
f32 step;
f32 prevRotStep;
- step = (f32)(target - *rot) * (360.0f / (f32)0x10000);
+ step = BINANG_TO_DEG(target - *rot);
step *= gFramerateDivisorHalf;
prevRotStep = step;
if (step >= 0.0f) {
step /= slowness;
step = CLAMP(step, stepMin, stepMax);
- *rot += (s16)((step * (f32)0x10000) / 360.0f);
+ *rot += DEG_TO_BINANG_ALT2(step);
if (prevRotStep < stepMin) {
*rot = target;
}
@@ -1039,7 +1039,7 @@ s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f3
} else {
step = (step / slowness) * -1.0f;
step = CLAMP(step, stepMin, stepMax);
- *rot -= (s16)((step * (f32)0x10000) / 360.0f);
+ *rot -= DEG_TO_BINANG_ALT2(step);
if (-stepMin < prevRotStep) {
*rot = target;
}
@@ -1098,8 +1098,8 @@ s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB) {
return (ABS_ALT(BINANG_SUB(angleB, angleA)) <= threshold) ? true : false;
}
-Path* SubS_GetPathByIndex(PlayState* play, s16 pathIndex, s16 max) {
- return (pathIndex != max) ? &play->setupPathList[pathIndex] : NULL;
+Path* SubS_GetPathByIndex(PlayState* play, s16 pathIndex, s16 pathIndexNone) {
+ return (pathIndex != pathIndexNone) ? &play->setupPathList[pathIndex] : NULL;
}
s32 SubS_CopyPointFromPath(Path* path, s32 pointIndex, Vec3f* dst) {
@@ -1179,7 +1179,7 @@ Actor* SubS_FindActor(PlayState* play, Actor* actorListStart, u8 actorCategory,
actor = play->actorCtx.actorLists[actorCategory].first;
}
- while (actor != NULL && actorId != actor->id) {
+ while ((actor != NULL) && (actorId != actor->id)) {
actor = actor->next;
}
@@ -1386,48 +1386,53 @@ void SubS_ChangeAnimationBySpeedInfo(SkelAnime* skelAnime, AnimationSpeedInfo* a
*curAnimIndex = nextAnimIndex;
}
-s32 SubS_StartActorCutscene(Actor* actor, s16 nextCutscene, s16 curCutscene, s32 type) {
+s32 SubS_StartCutscene(Actor* actor, s16 nextCsId, s16 curCsId, s32 type) {
s32 isStarted = false;
- if ((curCutscene != -1) && (ActorCutscene_GetCurrentIndex() == curCutscene)) {
- ActorCutscene_Stop(curCutscene);
- ActorCutscene_SetIntentToPlay(nextCutscene);
- } else if (ActorCutscene_GetCanPlayNext(nextCutscene)) {
+ if ((curCsId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == curCsId)) {
+ CutsceneManager_Stop(curCsId);
+ CutsceneManager_Queue(nextCsId);
+ } else if (CutsceneManager_IsNext(nextCsId)) {
switch (type) {
- case SUBS_CUTSCENE_SET_UNK_LINK_FIELDS:
- ActorCutscene_StartAndSetUnkLinkFields(nextCutscene, actor);
+ case SUBS_CUTSCENE_WITH_PLAYER:
+ CutsceneManager_StartWithPlayerCs(nextCsId, actor);
break;
+
case SUBS_CUTSCENE_NORMAL:
- ActorCutscene_Start(nextCutscene, actor);
+ CutsceneManager_Start(nextCsId, actor);
break;
- case SUBS_CUTSCENE_SET_FLAG:
- ActorCutscene_StartAndSetFlag(nextCutscene, actor);
+
+ case SUBS_CUTSCENE_WITH_PLAYER_SET_FLAG:
+ CutsceneManager_StartWithPlayerCsAndSetFlag(nextCsId, actor);
+ break;
+
+ default:
break;
}
isStarted = true;
} else {
- ActorCutscene_SetIntentToPlay(nextCutscene);
+ CutsceneManager_Queue(nextCsId);
}
return isStarted;
}
-s32 SubS_FillCutscenesList(Actor* actor, s16 cutscenes[], s16 numCutscenes) {
- s16 cs;
+s32 SubS_FillCutscenesList(Actor* actor, s16 csIdList[], s16 numCutscenes) {
+ s16 csId;
s32 i;
for (i = 0; i < numCutscenes; i++) {
- cutscenes[i] = -1;
+ csIdList[i] = CS_ID_NONE;
}
- cs = actor->cutscene;
+ csId = actor->csId;
i = 0;
- while (cs != -1) {
- // Note: Infinite loop if numCutscenes is less than possible additional cutscenes
+ while (csId != CS_ID_NONE) {
+ // Note: Infinite loop if numCutscenes is less than possible additional csIdList
if (i < numCutscenes) {
- cutscenes[i] = cs;
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ csIdList[i] = csId;
+ csId = CutsceneManager_GetAdditionalCsId(csId);
i++;
}
}
@@ -1498,10 +1503,10 @@ Actor* SubS_FindActorCustom(PlayState* play, Actor* actor, Actor* actorListStart
actorIter = play->actorCtx.actorLists[actorCategory].first;
}
- while (actorIter != NULL &&
- (actorId != actorIter->id ||
- (actorId == actorIter->id &&
- (verifyActor == NULL || (verifyActor != NULL && !verifyActor(play, actor, actorIter, verifyData)))))) {
+ while ((actorIter != NULL) &&
+ ((actorId != actorIter->id) ||
+ ((actorId == actorIter->id) &&
+ ((verifyActor == NULL) || ((verifyActor != NULL) && !verifyActor(play, actor, actorIter, verifyData)))))) {
actorIter = actorIter->next;
}
diff --git a/src/code/z_view.c b/src/code/z_view.c
index 105e6643a..4adc00b8d 100644
--- a/src/code/z_view.c
+++ b/src/code/z_view.c
@@ -18,8 +18,8 @@ void View_ViewportToVp(Vp* dest, Viewport* src) {
dest->vp.vtrans[2] = 0x01FF;
dest->vp.vtrans[3] = 0;
- if ((src->leftX == 0) && (src->rightX == SCREEN_WIDTH_HIGH_RES) && (src->topY == 0) &&
- (src->bottomY == SCREEN_HEIGHT_HIGH_RES)) {}
+ if ((src->leftX == 0) && (src->rightX == HIRES_BUFFER_WIDTH) && (src->topY == 0) &&
+ (src->bottomY == HIRES_BUFFER_HEIGHT)) {}
}
void View_Init(View* view, GraphicsContext* gfxCtx) {
diff --git a/src/code/z_vimode.c b/src/code/z_vimode.c
index b7d2dea64..2ddd27775 100644
--- a/src/code/z_vimode.c
+++ b/src/code/z_vimode.c
@@ -1,17 +1,377 @@
#include "global.h"
+#include "ultra64/viint.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140260.s")
+typedef struct {
+ /* 0x00 */ u32 burst;
+ /* 0x04 */ u32 vSync;
+ /* 0x08 */ u32 hSync;
+ /* 0x0C */ u32 leap;
+ /* 0x10 */ u32 hStart;
+ /* 0x14 */ u32 vStart;
+ /* 0x18 */ u32 vBurst;
+} ViModeStruct; // size = 0x1C
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014026C.s")
+void ViMode_LogPrint(OSViMode* osViMode) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140730.s")
+/**
+ * Configures the custom OSViMode for this ViMode
+ *
+ * @param viMode ViMode to configure the custom OSViMode for
+ * @param type Identifying type for the OSViMode
+ * @param tvType TV Type: NTSC, PAL, MPAL or FPAL
+ * @param loRes Boolean: true = low resolution, false = high resolution.
+ * Corresponds to "L" or "H" in libultra VI mode names
+ * @param antialiasOff Boolean: true = point-sampling, false = anti-aliasing.
+ * Corresponds to "P" or "A" in libultra VI mode names
+ * @param modeN Boolean: controls interlacing mode, different based on resolution.
+ * Corresponds to "N" or "F" in libultra VI mode names
+ * @param fb16Bit Bolean: true = 16-bit framebuffer, false = 32-bit framebuffer.
+ * Corresponds to "1" or "2" in libultra VI mode names
+ * @param width Screen width
+ * @param height Screen height
+ * @param leftAdjust Left edge adjustment
+ * @param rightAdjust Right edge adjustment
+ * @param upperAdjust Upper edge adjustment
+ * @param lowerAdjust Lower edge adjustment
+ */
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust) {
+ s32 hiRes;
+ s32 antialiasOn;
+ s32 modeF;
+ s32 fb32Bit;
+ s32 hiResDeflicker; // deflickered interlacing
+ s32 hiResInterlaced;
+ s32 loResDeinterlaced;
+ s32 loResInterlaced;
+ s32 modeLAN1; // L=(lo res) A=(antialias) N=(deinterlace) 1=(16-bit)
+ s32 modeLPN2; // L=(lo res) P=(point-sampled) N=(deinterlace) 2=(32-bit)
+ s32 modeHPN2; // H=(hi res) P=(point-sampled) N=(normal interlacing) 2=(32-bit)
+ s32 yScaleLo;
+ s32 yScaleHiEvenField;
+ s32 yScaleHiOddField;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140810.s")
+ hiRes = !loRes;
+ antialiasOn = !antialiasOff;
+ modeF = !modeN;
+ fb32Bit = !fb16Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140898.s")
+ hiResDeflicker = hiRes && modeF;
+ hiResInterlaced = hiRes && modeN;
+ loResDeinterlaced = loRes && modeN;
+ loResInterlaced = loRes && modeF;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140900.s")
+ modeLAN1 = loRes && antialiasOn && modeN && fb16Bit;
+ modeLPN2 = loRes && antialiasOff && modeN && fb32Bit;
+ modeHPN2 = hiRes && antialiasOff && modeN && fb32Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014090C.s")
+ upperAdjust &= ~1;
+ lowerAdjust &= ~1;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140970.s")
+ yScaleLo = (hiResDeflicker ? 2 : 1) * (((SCREEN_HEIGHT << 11) / SCREEN_HEIGHT) / (loRes ? 1 : 2));
+
+ yScaleHiEvenField = modeF ? (loResInterlaced ? 0x1000000 : 0x2000000) : 0;
+ yScaleHiOddField = modeF ? (loResInterlaced ? 0x3000000 : 0x2000000) : 0;
+
+ viMode->type = type;
+ viMode->comRegs.ctrl = OS_VI_UNK2000 | OS_VI_UNK1000 | OS_VI_GAMMA | OS_VI_GAMMA_DITHER |
+ (!loResDeinterlaced ? OS_VI_UNK40 : 0) | (antialiasOn ? OS_VI_DIVOT : 0) |
+ (fb32Bit ? OS_VI_UNK2 | OS_VI_UNK1 : OS_VI_UNK2);
+
+ if (modeLAN1) {
+ // Anti-aliased, fetch extra lines as-needed
+ viMode->comRegs.ctrl |= 0x100;
+ } else if (modeLPN2 | modeHPN2) {
+ // Point-sampled, resampling disabled
+ viMode->comRegs.ctrl |= 0x300;
+ } else {
+ if (antialiasOff) {
+ // Point-sampled, resampling enabled
+ viMode->comRegs.ctrl |= 0x200;
+ } else {
+ // Anti-aliased, always fetch extra lines
+ viMode->comRegs.ctrl |= 0;
+ }
+ }
+
+ viMode->comRegs.width = width * (hiResInterlaced ? 2 : 1);
+
+ if (tvType < 3) {
+ static const ViModeStruct D_801DF0C0[] = {
+ {
+ // OS_TV_PAL
+ BURST(58, 35, 4, 64),
+ VSYNC(624),
+ HSYNC(3177, 21),
+ LEAP(3183, 3182),
+ HSTART(128, 768),
+ START(95, 569),
+ BURST(107, 2, 9, 0),
+ },
+ {
+ // OS_TV_NTSC
+ BURST(57, 34, 5, 62),
+ VSYNC(524),
+ HSYNC(3093, 0),
+ LEAP(3093, 3093),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ {
+ // OS_TV_MPAL
+ BURST(57, 30, 5, 70),
+ VSYNC(524),
+ HSYNC(3088, 0),
+ LEAP(3100, 3100),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ };
+ const ViModeStruct* ptr = &D_801DF0C0[tvType];
+
+ viMode->comRegs.burst = ptr->burst;
+ viMode->comRegs.vSync = ptr->vSync;
+ viMode->comRegs.hSync = ptr->hSync;
+ viMode->comRegs.leap = ptr->leap;
+ viMode->comRegs.hStart = ptr->hStart;
+ viMode->fldRegs[0].vStart = ptr->vStart;
+ viMode->fldRegs[1].vStart = ptr->vStart;
+ viMode->fldRegs[0].vBurst = ptr->vBurst;
+ viMode->fldRegs[1].vBurst = ptr->vBurst;
+ } else {
+ __assert("../z_vimode.c", 216);
+ }
+
+ viMode->comRegs.hStart += (leftAdjust << 16) + (s16)rightAdjust;
+ viMode->fldRegs[0].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+ viMode->fldRegs[1].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+
+ if (loResDeinterlaced) {
+ viMode->comRegs.vSync++;
+ if (tvType == OS_TV_MPAL) {
+ viMode->comRegs.hSync += HSYNC(1, 4);
+ viMode->comRegs.leap += LEAP((u16)-4, (u16)-2);
+ }
+ } else {
+ viMode->fldRegs[0].vStart += START((u16)-3, (u16)-2);
+ if (tvType == OS_TV_MPAL) {
+ viMode->fldRegs[0].vBurst += BURST((u8)-2, (u8)-1, 12, -1);
+ } else if (tvType == OS_TV_PAL) {
+ viMode->fldRegs[1].vBurst += BURST((u8)-2, (u8)-1, 2, 0);
+ }
+ }
+
+ viMode->comRegs.xScale = (SCREEN_WIDTH << 10) / SCREEN_WIDTH;
+ viMode->comRegs.vCurrent = 0;
+
+ viMode->fldRegs[0].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2));
+ viMode->fldRegs[1].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2) * (loRes ? 1 : 2));
+
+ viMode->fldRegs[0].yScale = yScaleLo | yScaleHiEvenField;
+ viMode->fldRegs[1].yScale = yScaleLo | yScaleHiOddField;
+
+ viMode->fldRegs[0].vIntr = 2;
+ viMode->fldRegs[1].vIntr = 2;
+}
+
+void ViMode_Save(ViMode* viMode) {
+ R_VI_MODE_EDIT_STATE = viMode->editState;
+ R_VI_MODE_EDIT_WIDTH = viMode->viWidth;
+ R_VI_MODE_EDIT_HEIGHT = viMode->viHeight;
+ R_VI_MODE_EDIT_ULY_ADJ = viMode->upperAdjust;
+ R_VI_MODE_EDIT_LRY_ADJ = viMode->lowerAdjust;
+ R_VI_MODE_EDIT_ULX_ADJ = viMode->leftAdjust;
+ R_VI_MODE_EDIT_LRX_ADJ = viMode->rightAdjust;
+
+ if (SREG(58) == 1) {
+ SREG(58) = 0;
+ switch (SREG(59)) {
+ case 1:
+ ViMode_LogPrint(&osViModePalLan1);
+ break;
+
+ case 2:
+ ViMode_LogPrint(&osViModeFpalLan1);
+ break;
+
+ default:
+ ViMode_LogPrint(&viMode->customViMode);
+ break;
+ }
+ }
+}
+
+void ViMode_Load(ViMode* viMode) {
+ //! @bug This condition always fails as the lowest bit is masked out to 0
+ if ((R_VI_MODE_EDIT_WIDTH & ~3) == 1) {
+ R_VI_MODE_EDIT_WIDTH += 4;
+ }
+
+ viMode->editState = R_VI_MODE_EDIT_STATE;
+ viMode->viWidth = R_VI_MODE_EDIT_WIDTH & ~3;
+ viMode->viHeight = R_VI_MODE_EDIT_HEIGHT;
+ viMode->upperAdjust = R_VI_MODE_EDIT_ULY_ADJ;
+ viMode->lowerAdjust = R_VI_MODE_EDIT_LRY_ADJ;
+ viMode->leftAdjust = R_VI_MODE_EDIT_ULX_ADJ;
+ viMode->rightAdjust = R_VI_MODE_EDIT_LRX_ADJ;
+}
+
+void ViMode_Init(ViMode* viMode) {
+ viMode->editState = VI_MODE_EDIT_STATE_INACTIVE;
+ viMode->viWidth = SCREEN_WIDTH;
+ viMode->viHeight = SCREEN_HEIGHT;
+ viMode->leftAdjust = 0;
+ viMode->rightAdjust = 0;
+ viMode->upperAdjust = 0;
+ viMode->lowerAdjust = 0;
+ viMode->viFeatures = OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF;
+ viMode->tvType = osTvType;
+ viMode->fb16Bit = true;
+ viMode->modeN = true;
+ viMode->antialiasOff = false;
+ viMode->loRes = true;
+
+ ViMode_Save(viMode);
+}
+
+void ViMode_Destroy(ViMode* viMode) {
+}
+
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures) {
+ u32 ctrl = viMode->customViMode.comRegs.ctrl;
+
+ if (viFeatures & OS_VI_GAMMA_ON) {
+ ctrl |= OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_OFF) {
+ ctrl &= ~OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_ON) {
+ ctrl |= OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_OFF) {
+ ctrl &= ~OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_DIVOT_ON) {
+ ctrl |= OS_VI_DIVOT;
+ }
+ if (viFeatures & OS_VI_DIVOT_OFF) {
+ ctrl &= ~OS_VI_DIVOT;
+ }
+ viMode->customViMode.comRegs.ctrl = ctrl;
+}
+
+/**
+ * Updates the custom VI mode with controller input and any edits made with the REG editor
+ * (through R_VI_MODE_EDIT_* entries)
+ */
+void ViMode_Update(ViMode* viMode, Input* input) {
+ ViMode_Load(viMode);
+
+ if ((viMode->editState == VI_MODE_EDIT_STATE_ACTIVE) || (viMode->editState == VI_MODE_EDIT_STATE_2) ||
+ (viMode->editState == VI_MODE_EDIT_STATE_3)) {
+ gScreenWidth = viMode->viWidth;
+ gScreenHeight = viMode->viHeight;
+
+ // Controls to reset the ViMode to defaults
+ if (CHECK_BTN_ALL(input->cur.button, BTN_START | BTN_CUP | BTN_CRIGHT)) {
+ ViMode_Init(viMode);
+ }
+
+ // Controls to adjust the screen dimensions (upper-left)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CUP)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->upperAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->upperAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->leftAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->leftAdjust++;
+ }
+ }
+
+ // Controls to adjust the screen dimensions (lower-right)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->lowerAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->lowerAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->rightAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->rightAdjust++;
+ }
+ }
+
+ // Controls to adjust key features
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CDOWN)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) {
+ viMode->loRes = !viMode->loRes;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
+ viMode->antialiasOff = !viMode->antialiasOff;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) {
+ viMode->modeN = !viMode->modeN;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) {
+ viMode->fb16Bit = !viMode->fb16Bit;
+ }
+ }
+
+ // Clamp adjustments
+ if (viMode->editState >= VI_MODE_EDIT_STATE_2) {
+ // Allow parts of the framebuffer to possibly be offscreen by a small margin
+ if (viMode->leftAdjust < -16) {
+ viMode->leftAdjust = -16;
+ }
+ if (viMode->upperAdjust < -50) {
+ viMode->upperAdjust = -50;
+ }
+ if (viMode->rightAdjust > 16) {
+ viMode->rightAdjust = 16;
+ }
+ if (viMode->lowerAdjust > 50) {
+ viMode->lowerAdjust = 50;
+ }
+ } else {
+ // Do not allow parts of the framebuffer to end up offscreen
+ if (viMode->leftAdjust < 0) {
+ viMode->leftAdjust = 0;
+ }
+ if (viMode->upperAdjust < 0) {
+ viMode->upperAdjust = 0;
+ }
+ if (viMode->rightAdjust > 0) {
+ viMode->rightAdjust = 0;
+ }
+ if (viMode->lowerAdjust > 0) {
+ viMode->lowerAdjust = 0;
+ }
+ }
+
+ ViMode_Configure(&viMode->customViMode, OS_VI_UNK28, osTvType, viMode->loRes, viMode->antialiasOff,
+ viMode->modeN, viMode->fb16Bit, viMode->viWidth, viMode->viHeight, viMode->leftAdjust,
+ viMode->rightAdjust, viMode->upperAdjust, viMode->lowerAdjust);
+ ViMode_ConfigureFeatures(viMode, viMode->viFeatures);
+
+ if (viMode->editState == VI_MODE_EDIT_STATE_3) {
+ // Log comparison between the NTSC LAN1 mode and the custom mode
+ ViMode_LogPrint(&osViModeNtscLan1);
+ ViMode_LogPrint(&viMode->customViMode);
+ viMode->editState = VI_MODE_EDIT_STATE_2;
+ }
+ }
+
+ ViMode_Save(viMode);
+}
diff --git a/src/code/z_viscvg.c b/src/code/z_viscvg.c
new file mode 100644
index 000000000..888fa19b3
--- /dev/null
+++ b/src/code/z_viscvg.c
@@ -0,0 +1,90 @@
+#include "global.h"
+
+Gfx D_801C5DD0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_VISCVG | G_RM_VISCVG2),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DE0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DF0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5E00[] = {
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPDisplayList(D_0E000000.fillRect),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+void VisCvg_Init(struct_801F8010* this) {
+ this->type = 0;
+ this->setScissor = false;
+ this->color.r = 255;
+ this->color.g = 255;
+ this->color.b = 255;
+ this->color.a = 255;
+}
+
+void VisCvg_Destroy(struct_801F8010* this) {
+}
+
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp) {
+ Gfx* gfx = *gfxp;
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimDepth(gfx++, -1, -1);
+
+ if (this->setScissor == true) {
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+ }
+
+ switch (this->type) {
+ case 1:
+ gSPDisplayList(gfx++, D_801C5DF0);
+ break;
+
+ case 2:
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5E00);
+ break;
+
+ case 3:
+ gDPSetColor(gfx++, G_SETBLENDCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DD0);
+ break;
+
+ case 4:
+ gDPSetColor(gfx++, G_SETFOGCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DE0);
+ break;
+
+ default:
+ break;
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxp = gfx;
+}
diff --git a/src/code/z_viszbuf.c b/src/code/z_viszbuf.c
new file mode 100644
index 000000000..cf603f324
--- /dev/null
+++ b/src/code/z_viszbuf.c
@@ -0,0 +1,56 @@
+#include "global.h"
+
+#define VISZBUF_ZBUFFRAG_HEIGHT (TMEM_SIZE / (gCfbWidth * G_IM_SIZ_16b_BYTES))
+
+void VisZbuf_Init(VisZbuf* this) {
+ this->useRgba = false;
+ this->setScissor = false;
+ this->primColor.r = 255;
+ this->primColor.g = 255;
+ this->primColor.b = 255;
+ this->primColor.a = 255;
+ this->envColor.r = 0;
+ this->envColor.g = 0;
+ this->envColor.b = 0;
+ this->envColor.a = 255;
+}
+
+void VisZbuf_Destroy(VisZbuf* this) {
+}
+
+void VisZbuf_Draw(VisZbuf* this, Gfx** gfxP, void* zbuffer) {
+ Gfx* gfx = *gfxP;
+ s32 height = VISZBUF_ZBUFFRAG_HEIGHT;
+ s32 y;
+ s32 fmt = !this->useRgba ? G_IM_FMT_IA : G_IM_FMT_RGBA;
+
+ if (zbuffer == NULL) {
+ return;
+ }
+
+ gDPPipeSync(gfx++);
+ if (this->setScissor == true) {
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+ }
+
+ gDPSetOtherMode(gfx++,
+ G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_OPA_SURF | G_RM_OPA_SURF2);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT);
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, this->primColor.rgba);
+ gDPSetColor(gfx++, G_SETENVCOLOR, this->envColor.rgba);
+
+ for (y = 0; y < (gCfbHeight - height) + 1; y += height) {
+ gDPLoadTextureTile(gfx++, zbuffer, fmt, G_IM_SIZ_16b, gCfbWidth, 0, 0, y, gCfbWidth - 1, (y + height) - 1, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+
+ gSPTextureRectangle(gfx++, 0, y << 2, gCfbWidth << 2, (y + height) << 2, G_TX_RENDERTILE, 0, y << 5, 1 << 10,
+ 1 << 10);
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
diff --git a/src/code/z_vr_box.c b/src/code/z_vr_box.c
index 911e3e757..dd0785d94 100644
--- a/src/code/z_vr_box.c
+++ b/src/code/z_vr_box.c
@@ -239,7 +239,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
case SKYBOX_NORMAL_SKY:
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
- if (play->envCtx.unk_10 == 0) {
+ if (play->envCtx.skybox1Index == 0) {
// Send a DMA request for the clear sky texture
size = SEGMENT_ROM_SIZE(d2_fine_static);
@@ -256,7 +256,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
- if (play->envCtx.unk_11 == 0) {
+ if (play->envCtx.skybox2Index == 0) {
// Send a DMA request for the clear sky texture
size = SEGMENT_ROM_SIZE(d2_fine_static);
diff --git a/src/code/z_vr_box_draw.c b/src/code/z_vr_box_draw.c
index 489f596e5..656f6cad3 100644
--- a/src/code/z_vr_box_draw.c
+++ b/src/code/z_vr_box_draw.c
@@ -23,7 +23,7 @@ void Skybox_SetColors(SkyboxContext* skyboxCtx, u8 primR, u8 primG, u8 primB, u8
void Skybox_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId, s16 blend, f32 x, f32 y, f32 z) {
OPEN_DISPS(gfxCtx);
- func_8012C6AC(gfxCtx);
+ Gfx_SetupDL40_Opa(gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0B, skyboxCtx->paletteStaticSegment);
gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON);
diff --git a/src/libultra/flash/osFlash.c b/src/libultra/flash/osFlash.c
index 3ed33f45d..f8649f4fd 100644
--- a/src/libultra/flash/osFlash.c
+++ b/src/libultra/flash/osFlash.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "ultra64.h"
#include "global.h"
@@ -11,8 +10,8 @@ s32 __osFlashVersion;
UNK_TYPE1 D_801FD0FC[0x14];
typedef enum {
- FLASH_OLD,
- FLASH_NEW,
+ /* 0 */ FLASH_OLD,
+ /* 1 */ FLASH_NEW
} FlashVersion;
u32 osFlashGetAddr(u32 pageNum) {
diff --git a/src/libultra/gu/position.c b/src/libultra/gu/position.c
index 95bd65fe3..9ba9d3570 100644
--- a/src/libultra/gu/position.c
+++ b/src/libultra/gu/position.c
@@ -5,9 +5,13 @@
* Creates a rotation/parallel translation modelling matrix (floating point)
*/
void guPositionF(f32 mf[4][4], f32 rot, f32 pitch, f32 yaw, f32 scale, f32 x, f32 y, f32 z) {
- static f32 D_80134D00 = M_PI / 180.0;
- f32 sinr, sinp, sinh;
- f32 cosr, cosp, cosh;
+ static f32 D_80134D00 = M_PI / 180.0f;
+ f32 sinr;
+ f32 sinp;
+ f32 sinh;
+ f32 cosr;
+ f32 cosp;
+ f32 cosh;
rot *= D_80134D00;
pitch *= D_80134D00;
diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c
index fd4c4e459..e9431a741 100644
--- a/src/libultra/io/contpfs.c
+++ b/src/libultra/io/contpfs.c
@@ -66,7 +66,8 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
u8 buf[BLOCKSIZE];
u8 comp[BLOCKSIZE];
u8 mask = 0;
- s32 i, j = 0;
+ s32 i = 0;
+ s32 j = 0;
u16 index[4];
newid->repaired = 0xFFFFFFFF;
diff --git a/src/libultra/io/motor.c b/src/libultra/io/motor.c
index 649a8b368..9e0eb127e 100644
--- a/src/libultra/io/motor.c
+++ b/src/libultra/io/motor.c
@@ -6,40 +6,40 @@
#define BANK_ADDR 0x400
#define MOTOR_ID 0x80
-OSPifRam osPifBuffers[MAXCONTROLLERS];
+OSPifRam __MotorDataBuf[MAXCONTROLLERS];
s32 __osPfsSelectBank(OSPfs* pfs, u8 bank);
-s32 __osMotorAccess(OSPfs* pfs, u32 vibrate) {
+s32 __osMotorAccess(OSPfs* pfs, s32 flag) {
s32 i;
s32 ret;
- u8* buf = (u8*)&osPifBuffers[pfs->channel];
+ u8* ptr = (u8*)&__MotorDataBuf[pfs->channel];
- if (!(pfs->status & 8)) {
- return 5;
+ if (!(pfs->status & PFS_MOTOR_INITIALIZED)) {
+ return PFS_ERR_INVALID;
}
__osSiGetAccess();
- osPifBuffers[pfs->channel].status = 1;
- buf += pfs->channel;
+ __MotorDataBuf[pfs->channel].status = CONT_CMD_EXE;
+ ptr += pfs->channel;
for (i = 0; i < BLOCKSIZE; i++) {
- ((__OSContRamReadFormat*)buf)->data[i] = vibrate;
+ READFORMAT(ptr)->data[i] = flag;
}
__osContLastPoll = CONT_CMD_END;
- __osSiRawStartDma(OS_WRITE, &osPifBuffers[pfs->channel]);
+ __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
- __osSiRawStartDma(OS_READ, &osPifBuffers[pfs->channel]);
+ __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]);
osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK);
- ret = ((__OSContRamReadFormat*)buf)->rxsize & 0xC0;
+ ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK;
if (!ret) {
- if (!vibrate) {
- if (((__OSContRamReadFormat*)buf)->datacrc != 0) {
+ if (!flag) {
+ if (READFORMAT(ptr)->datacrc != 0) {
ret = PFS_ERR_CONTRFAIL;
}
} else {
- if (((__OSContRamReadFormat*)buf)->datacrc != 0xEB) {
+ if (READFORMAT(ptr)->datacrc != 0xEB) {
ret = PFS_ERR_CONTRFAIL;
}
}
@@ -50,76 +50,75 @@ s32 __osMotorAccess(OSPfs* pfs, u32 vibrate) {
return ret;
}
-void _MakeMotorData(s32 channel, OSPifRam* buf) {
- u8* bufptr = (u8*)buf;
- __OSContRamReadFormat mempakwr;
+void _MakeMotorData(s32 channel, OSPifRam* mdata) {
+ u8* ptr = (u8*)mdata->ramarray;
+ __OSContRamReadFormat ramreadformat;
s32 i;
- mempakwr.dummy = 0xFF;
- mempakwr.txsize = 0x23;
- mempakwr.rxsize = 1;
- mempakwr.cmd = 3; // write mempak
- mempakwr.hi = 0x600 >> 3;
- mempakwr.lo = (u8)(__osContAddressCrc(0x600) | (0x600 << 5));
+ ramreadformat.dummy = CONT_CMD_NOP;
+ ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX;
+ ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX;
+ ramreadformat.cmd = CONT_CMD_WRITE_PAK;
+ ramreadformat.hi = CONT_BLOCK_RUMBLE >> 3;
+ ramreadformat.lo = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5));
if (channel != 0) {
for (i = 0; i < channel; i++) {
- *bufptr++ = 0;
+ *ptr++ = 0;
}
}
- *(__OSContRamReadFormat*)bufptr = mempakwr;
- bufptr += sizeof(mempakwr);
- *bufptr = 0xFE;
+ *READFORMAT(ptr) = ramreadformat;
+ ptr += sizeof(ramreadformat);
+ *ptr = CONT_CMD_END;
}
-s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel) {
+s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, s32 channel) {
s32 ret;
- u8 sp24[BLOCKSIZE];
+ u8 temp[BLOCKSIZE];
- pfs->queue = ctrlrqueue;
+ pfs->queue = mq;
pfs->channel = channel;
pfs->activebank = 0xFF;
pfs->status = 0;
ret = __osPfsSelectBank(pfs, 0xFE);
- if (ret == 2) {
+ if (ret == PFS_ERR_NEW_PACK) {
ret = __osPfsSelectBank(pfs, MOTOR_ID);
}
if (ret != 0) {
return ret;
}
- ret = __osContRamRead(ctrlrqueue, channel, 0x400, sp24);
- if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp);
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- if (sp24[BLOCKSIZE - 1] == 0xFE) {
- return 0xB;
+ if (temp[BLOCKSIZE - 1] == 0xFE) {
+ return PFS_ERR_DEVICE;
}
ret = __osPfsSelectBank(pfs, MOTOR_ID);
if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- ret = __osContRamRead(ctrlrqueue, channel, BANK_ADDR, sp24);
- if (ret == 2) {
- ret = 4; // "Controller pack communication error"
+ ret = __osContRamRead(mq, channel, BANK_ADDR, temp);
+ if (ret == PFS_ERR_NEW_PACK) {
+ ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
- if (sp24[BLOCKSIZE - 1] != MOTOR_ID) {
- return 0xB;
+ if (temp[BLOCKSIZE - 1] != MOTOR_ID) {
+ return PFS_ERR_DEVICE;
}
if (!(pfs->status & PFS_MOTOR_INITIALIZED)) {
- _MakeMotorData(channel, &osPifBuffers[channel]);
+ _MakeMotorData(channel, &__MotorDataBuf[channel]);
}
pfs->status = PFS_MOTOR_INITIALIZED;
-
- return 0; // "Recognized rumble pak"
+ return 0;
}
diff --git a/src/libultra/io/osViModeMpalLan1.c b/src/libultra/io/osViModeMpalLan1.c
index c7c09f659..ccccf68ae 100644
--- a/src/libultra/io/osViModeMpalLan1.c
+++ b/src/libultra/io/osViModeMpalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeMpalLan1 = {
OS_VI_MPAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4651E39, // burst
- 0x20D, // vSync
- 0x40C11, // hSync
- 0xC190C1A, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 30, 5, 70), // burst
+ VSYNC(525), // vSync
+ HSYNC(3089, 4), // hSync
+ LEAP(3097, 3098), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscHpf1.c b/src/libultra/io/osViModeNtscHpf1.c
index ac0a1fa2b..5f88f4e94 100644
--- a/src/libultra/io/osViModeNtscHpf1.c
+++ b/src/libultra/io/osViModeNtscHpf1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscHpf1 = {
OS_VI_NTSC_HPF1, // type
{
// comRegs
- 0x324E, // ctrl
- 640, // width
- 0x3E52239, // burst
- 0x20C, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x400, // xScale
- 0, // vCurrent
+ 0x324E, // ctrl
+ WIDTH(640), // width
+ BURST(57, 34, 5, 62), // 0x3E52239, // burst
+ VSYNC(524), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // 0x6C02EC, // hStart
+ SCALE(1, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x500, // origin
- 0x2000800, // yScale
- 0x2301FD, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(1280), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(35, 509), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0xA00, // origin
- 0x2000800, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2 // vIntr
+ ORIGIN(2560), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2) // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscLan1.c b/src/libultra/io/osViModeNtscLan1.c
index 632d763f4..86eb473b7 100644
--- a/src/libultra/io/osViModeNtscLan1.c
+++ b/src/libultra/io/osViModeNtscLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscLan1 = {
OS_VI_NTSC_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x3E52239, // burst
- 0x20D, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 34, 5, 62), // burst
+ VSYNC(525), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModePalLan1.c b/src/libultra/io/osViModePalLan1.c
index 174cbf142..f875bb731 100644
--- a/src/libultra/io/osViModePalLan1.c
+++ b/src/libultra/io/osViModePalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModePalLan1 = {
OS_VI_PAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4541E3A, // burst
- 0x271, // vSync
- 0x170C69, // hSync
- 0xC6F0C6D, // leap
- 0x800300, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(58, 30, 4, 69), // burst
+ VSYNC(625), // vSync
+ HSYNC(3177, 23), // hSync
+ LEAP(3183, 3181), // leap
+ HSTART(128, 768), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2 // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/pfschecker.c b/src/libultra/io/pfschecker.c
index bf885a1a4..d3a635768 100644
--- a/src/libultra/io/pfschecker.c
+++ b/src/libultra/io/pfschecker.c
@@ -18,8 +18,10 @@ s32 osPfsChecker(OSPfs* pfs) {
__OSInodeUnit nextNodeInFile[16];
__OSInodeCache cache;
s32 fixed = 0;
- u8 bank, prevBank = 254;
- s32 cc, cl;
+ u8 bank = 254;
+ u8 prevBank = 254;
+ s32 cc;
+ s32 cl;
s32 offset;
ret = __osCheckId(pfs);
diff --git a/src/libultra/io/pfsfilestate.c b/src/libultra/io/pfsfilestate.c
index a555199fc..f06c8d937 100644
--- a/src/libultra/io/pfsfilestate.c
+++ b/src/libultra/io/pfsfilestate.c
@@ -34,7 +34,7 @@ s32 osPfsFileState(OSPfs* pfs, s32 fileNo, OSPfsState* state) {
return ret;
}
- if (dir.company_code == 0 || dir.game_code == 0) {
+ if ((dir.company_code == 0) || (dir.game_code == 0)) {
return PFS_ERR_INVALID;
}
diff --git a/src/libultra/io/pimgr.c b/src/libultra/io/pimgr.c
index fefffd653..63cc7ba66 100644
--- a/src/libultra/io/pimgr.c
+++ b/src/libultra/io/pimgr.c
@@ -19,7 +19,7 @@ void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgC
if (!__osPiAccessQueueEnabled) {
__osPiCreateAccessQueue();
}
- osSetEventMesg(8, &D_8009E3D0, (OSMesg)0x22222222);
+ osSetEventMesg(OS_EVENT_PI, &D_8009E3D0, (OSMesg)0x22222222);
oldPri = -1;
myPri = osGetThreadPri(NULL);
if (myPri < pri) {
diff --git a/src/libultra/libc/ldiv.c b/src/libultra/libc/ldiv.c
index 21fe84e80..9f9d75031 100644
--- a/src/libultra/libc/ldiv.c
+++ b/src/libultra/libc/ldiv.c
@@ -5,7 +5,7 @@ ldiv_t ldiv(long numer, long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
@@ -18,7 +18,7 @@ lldiv_t lldiv(long long numer, long long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c
index 399d2caf4..0fd42d1ed 100644
--- a/src/libultra/libc/ll.c
+++ b/src/libultra/libc/ll.c
@@ -36,7 +36,7 @@ void __ull_divremi(unsigned long long* quotient, unsigned long long* remainder,
long long __ll_mod(long long left, long long right) {
long long rem = left % right;
- if ((rem < 0 && right > 0) || (rem > 0 && right < 0)) {
+ if (((rem < 0) && (right > 0)) || ((rem > 0) && (right < 0))) {
rem += right;
}
return rem;
diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c
index 776191227..4fabb4c4d 100644
--- a/src/libultra/os/initialize.c
+++ b/src/libultra/os/initialize.c
@@ -3,11 +3,11 @@
#define COLD_RESET 0
typedef struct {
- /* 0x0 */ u32 ins_00; // lui k0, 0x8000
- /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
- /* 0x8 */ u32 ins_08; // jr k0 ; __osException
- /* 0xC */ u32 ins_0C; // nop
-} struct_exceptionPreamble;
+ /* 0x0 */ u32 ins_00; // lui k0, 0x8000
+ /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
+ /* 0x8 */ u32 ins_08; // jr k0 ; __osException
+ /* 0xC */ u32 ins_0C; // nop
+} struct_exceptionPreamble; // size = 0x10
u64 osClockRate = OS_CLOCK_RATE;
s32 osViClock = VI_NTSC_CLOCK;
diff --git a/src/libultra/os/seteventmesg.c b/src/libultra/os/seteventmesg.c
index 8be2ff9e2..26e837fcf 100644
--- a/src/libultra/os/seteventmesg.c
+++ b/src/libultra/os/seteventmesg.c
@@ -16,7 +16,7 @@ void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m) {
es->message = m;
if (e == 14) {
- if (__osShutdown != 0 && D_80097F10 == 0) {
+ if ((__osShutdown != 0) && (D_80097F10 == 0)) {
osSendMesg(mq, m, OS_MESG_NOBLOCK);
}
D_80097F10 = 1;
diff --git a/src/libultra/rmon/xldtob.c b/src/libultra/rmon/xldtob.c
index 460d0951c..66c058396 100644
--- a/src/libultra/rmon/xldtob.c
+++ b/src/libultra/rmon/xldtob.c
@@ -61,7 +61,7 @@ void _Ldtob(_Pft* args, u8 type) {
if (args->prec < 0) {
args->prec = 6;
- } else if (args->prec == 0 && (type == 'g' || type == 'G')) {
+ } else if ((args->prec == 0) && ((type == 'g') || (type == 'G'))) {
args->prec = 1;
}
err = _Ldunscale(&exp, (_Pft*)args);
@@ -101,13 +101,13 @@ void _Ldtob(_Pft* args, u8 type) {
gen = 0x13;
}
*ptr++ = '0';
- while (gen > 0 && 0 < val) {
+ while ((gen > 0) && (0 < val)) {
lo = val;
if ((gen -= 8) > 0) {
val = (val - lo) * 1.0e8;
}
ptr = ptr + 8;
- for (j = 8; lo > 0 && --j >= 0;) {
+ for (j = 8; (lo > 0) && (--j >= 0);) {
qr = ldiv(lo, 10);
*--ptr = qr.rem + '0';
lo = qr.quot;
@@ -124,12 +124,12 @@ void _Ldtob(_Pft* args, u8 type) {
--gen, --exp;
}
- nsig = ((type == 'f') ? exp + 1 : ((type == 'e' || type == 'E') ? 1 : 0)) + args->prec;
+ nsig = ((type == 'f') ? exp + 1 : (((type == 'e') || (type == 'E')) ? 1 : 0)) + args->prec;
if (gen < nsig) {
nsig = gen;
}
if (nsig > 0) {
- if (nsig < gen && ptr[nsig] > '4') {
+ if ((nsig < gen) && (ptr[nsig] > '4')) {
drop = '9';
} else {
drop = '0';
@@ -178,7 +178,7 @@ void _Genld(_Pft* px, u8 code, u8* p, s16 nsig, s16 xexp) {
p = (u8*)"0";
}
- if (code == 'f' || ((code == 'g' || code == 'G') && (-4 <= xexp) && (xexp < px->prec))) { /* 'f' format */
+ if ((code == 'f') || (((code == 'g') || (code == 'G')) && (-4 <= xexp) && (xexp < px->prec))) { /* 'f' format */
++xexp; /* change to leading digit count */
if (code != 'f') { /* fixup for 'g' */
if (!(px->flags & FLAGS_HASH) && nsig < px->prec) {
@@ -225,8 +225,8 @@ void _Genld(_Pft* px, u8 code, u8* p, s16 nsig, s16 xexp) {
px->n1 += nsig;
px->nz1 = px->prec - nsig;
}
- } else { /* 'e' format */
- if (code == 'g' || code == 'G') { /* fixup for 'g' */
+ } else { /* 'e' format */
+ if ((code == 'g') || (code == 'G')) { /* fixup for 'g' */
if (nsig < px->prec) {
px->prec = nsig;
}
diff --git a/src/libultra/rmon/xlitob.c b/src/libultra/rmon/xlitob.c
index f200e01a4..6c53ee094 100644
--- a/src/libultra/rmon/xlitob.c
+++ b/src/libultra/rmon/xlitob.c
@@ -27,13 +27,13 @@ void _Litob(_Pft* args, u8 type) {
num = -num;
}
- if (num != 0 || args->prec != 0) {
+ if ((num != 0) || (args->prec != 0)) {
buff[--idx] = numMap[num % base];
}
args->v.ll = num / base;
- while (args->v.ll > 0 && idx > 0) {
+ while ((args->v.ll > 0) && (idx > 0)) {
quotrem = lldiv(args->v.ll, base);
args->v.ll = quotrem.quot;
buff[--idx] = numMap[quotrem.rem];
@@ -47,7 +47,7 @@ void _Litob(_Pft* args, u8 type) {
args->nz0 = args->prec - args->n1;
}
- if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
+ if ((args->prec < 0) && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
idx = args->width - args->n0 - args->nz0 - args->n1;
if (idx > 0) {
args->nz0 += idx;
diff --git a/src/libultra/rmon/xprintf.c b/src/libultra/rmon/xprintf.c
index ddb83652d..6caac436f 100644
--- a/src/libultra/rmon/xprintf.c
+++ b/src/libultra/rmon/xprintf.c
@@ -42,7 +42,7 @@ int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
unsigned char ac[0x20];
s = fmt;
- while ((c = *s) != 0 && c != '%') {
+ while (((c = *s) != 0) && (c != '%')) {
s++;
}
_PROUT((char*)fmt, s - fmt);
@@ -206,7 +206,7 @@ void _Putfld(_Pft* px, va_list* pap, unsigned char code, unsigned char* ac) {
case 's':
px->s = va_arg(*pap, char*);
px->n1 = strlen(px->s);
- if (px->prec >= 0 && px->n1 > px->prec) {
+ if ((px->prec >= 0) && (px->n1 > px->prec)) {
px->n1 = px->prec;
}
break;
diff --git a/src/libultra/voice/voicegetstatus.c b/src/libultra/voice/voicegetstatus.c
index a3608277f..3840ec62b 100644
--- a/src/libultra/voice/voicegetstatus.c
+++ b/src/libultra/voice/voicegetstatus.c
@@ -37,7 +37,7 @@ s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) {
*status = header.status;
if (ret == 0) {
- if (header.typeh == 0 && header.typel == 1) {
+ if ((header.typeh == 0) && (header.typel == 1)) {
if (header.status & 4) {
ret = CONT_ERR_CONTRFAIL;
}
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
index e271449b5..c7bff97f2 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
@@ -129,7 +129,7 @@ void ArmsHook_AttachHookToActor(ArmsHook* this, Actor* actor) {
void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((this->actor.parent == NULL) || (!Player_IsHoldingHookshot(player))) {
+ if ((this->actor.parent == NULL) || !Player_IsHoldingHookshot(player)) {
ArmsHook_DetachHookFromActor(this);
Actor_Kill(&this->actor);
return;
@@ -138,9 +138,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
func_800B8F98(&player->actor, NA_SE_IT_HOOKSHOT_CHAIN - SFX_FLAG);
ArmsHook_CheckForCancel(this);
- if (this->timer != 0 && (this->collider.base.atFlags & AT_HIT) &&
+ if ((this->timer != 0) && (this->collider.base.atFlags & AT_HIT) &&
(this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) {
Actor* touchedActor = this->collider.base.at;
+
if ((touchedActor->update != NULL) && (touchedActor->flags & (ACTOR_FLAG_200 | ACTOR_FLAG_400))) {
if (this->collider.info.atHitInfo->bumperFlags & BUMP_HOOKABLE) {
ArmsHook_AttachHookToActor(this, touchedActor);
@@ -190,12 +191,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
} else {
if (this->actor.child != NULL) {
velocity = 30.0f;
+ } else if (grabbed != NULL) {
+ velocity = 50.0f;
} else {
- if (grabbed != NULL) {
- velocity = 50.0f;
- } else {
- velocity = 200.0f;
- }
+ velocity = 200.0f;
}
phi_f16 = bodyDistDiff - velocity;
if (bodyDistDiff <= velocity) {
@@ -244,7 +243,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
sp60.z = this->unk1EC.z - (this->unk1E0.z - this->unk1EC.z);
if (BgCheck_EntityLineTest1(&play->colCtx, &sp60, &this->unk1E0, &posResult, &poly, true, true, true, true,
&bgId) &&
- (func_800B90AC(play, &this->actor, poly, bgId, &posResult) == 0 ||
+ (!func_800B90AC(play, &this->actor, poly, bgId, &posResult) ||
BgCheck_ProjectileLineTest(&play->colCtx, &sp60, &this->unk1E0, &posResult, &poly, true, true, true, true,
&bgId))) {
f32 nx = COLPOLY_GET_NORMAL(poly->normal.x);
@@ -314,7 +313,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) {
Matrix_MultVec3f(&D_808C1C4C, &sp50);
}
func_80126440(play, &this->collider, &this->weaponInfo, &sp5C, &sp50);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_80122868(play, player);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
index 31b675f41..bde007da1 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h
@@ -15,7 +15,7 @@ typedef struct ArmsHook {
/* 0x1EC */ Vec3f unk1EC;
/* 0x1F8 */ Actor* grabbed;
/* 0x1FC */ Vec3f unk1FC;
- /* 0x208 */ UNK_TYPE1 unk208[0x2];
+ /* 0x208 */ s8 unk_208;
/* 0x20A */ s16 timer;
/* 0x20C */ ArmsHookActionFunc actionFunc;
} ArmsHook; // size = 0x210
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 971b778be..efa7f04c4 100644
--- a/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
+++ b/src/overlays/actors/ovl_Arrow_Fire/z_arrow_fire.c
@@ -19,7 +19,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play);
void FireArrow_ChargeAndWait(ArrowFire* this, PlayState* play);
void FireArrow_Fly(ArrowFire* this, PlayState* play);
-#include "overlays/ovl_Arrow_fire/ovl_Arrow_Fire.c"
+#include "overlays/ovl_Arrow_Fire/ovl_Arrow_Fire.c"
ActorInit Arrow_Fire_InitVars = {
ACTOR_ARROW_FIRE,
@@ -249,6 +249,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
Actor* transform = (arrow->unk_261 & 2) ? &this->actor : &arrow->actor;
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Translate(transform->world.pos.x, transform->world.pos.y, transform->world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(transform->shape.rot.y, MTXMODE_APPLY);
Matrix_RotateXS(transform->shape.rot.x, MTXMODE_APPLY);
@@ -256,7 +257,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
if (this->screenFillIntensity > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(this->screenFillIntensity * 40.0f) & 0xFF, 0, 0,
(s32)(150.0f * this->screenFillIntensity) & 0xFF);
@@ -266,7 +267,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, D_0E000000.fillRect);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128);
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 62c97ccde..83c37fa6c 100644
--- a/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
+++ b/src/overlays/actors/ovl_Arrow_Ice/z_arrow_ice.c
@@ -204,7 +204,7 @@ void ArrowIce_Draw(Actor* thisx, PlayState* play) {
// Draw blue effect over the screen when arrow hits
if (this->blueingEffectMagnitude > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(this->blueingEffectMagnitude * 10.0f) & 0xFF,
(s32)(50.0f * this->blueingEffectMagnitude) & 0xFF,
(s32)(150.0f * this->blueingEffectMagnitude) & 0xFF);
@@ -214,7 +214,7 @@ void ArrowIce_Draw(Actor* thisx, PlayState* play) {
}
// Draw ice on the arrow
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 170, 255, 255, (s32)(this->alpha * 0.5f) & 0xFF);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 128);
Matrix_RotateZYX(0x4000, 0, 0, MTXMODE_APPLY);
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 360afa4ac..b650533da 100644
--- a/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
+++ b/src/overlays/actors/ovl_Arrow_Light/z_arrow_light.c
@@ -196,7 +196,7 @@ void ArrowLight_Draw(Actor* thisx, PlayState* play) {
Matrix_RotateZS(transform->shape.rot.z, MTXMODE_APPLY);
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
if (this->screenFillIntensity > 0.0f) {
- POLY_XLU_DISP = func_8012BFC4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL57(POLY_XLU_DISP);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(this->screenFillIntensity * 30.0f) & 0xFF,
(s32)(40.0f * this->screenFillIntensity) & 0xFF, 0,
(s32)(150.0f * this->screenFillIntensity) & 0xFF);
@@ -205,7 +205,7 @@ void ArrowLight_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, D_0E000000.fillRect);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 128);
diff --git a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
index 647fabf73..0391925ae 100644
--- a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.c
@@ -100,7 +100,7 @@ void BgAstrBombwall_Init(Actor* thisx, PlayState* play) {
BgAstrBombwall* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_astr_obj_Colheader_002498);
Collider_InitTris(play, &this->collider);
if (Flags_GetSwitch(play, BGASTRBOMBWALL_GET_SWITCHFLAG(thisx))) {
@@ -113,7 +113,7 @@ void BgAstrBombwall_Init(Actor* thisx, PlayState* play) {
return;
}
BgAstrBombwall_InitCollider(&sTrisInit, &this->dyna.actor.world.pos, &this->dyna.actor.shape.rot, &this->collider);
- SubS_FillCutscenesList(&this->dyna.actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->dyna.actor, this->csIdList, ARRAY_COUNT(this->csIdList));
func_80C0A378(this);
}
@@ -175,13 +175,13 @@ void func_80C0A400(BgAstrBombwall* this, PlayState* play) {
}
void func_80C0A418(BgAstrBombwall* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->dyna.actor, this->cutscenes[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->dyna.actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
func_80C0A458(this, play);
}
}
void func_80C0A458(BgAstrBombwall* this, PlayState* play) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
func_80C0A120(this, play);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
@@ -202,24 +202,28 @@ void BgAstrBombwall_Draw(Actor* thixs, PlayState* play) {
Gfx* opa;
OPEN_DISPS(play->state.gfxCtx);
+
opa = POLY_OPA_DISP;
- gSPDisplayList(&opa[0], &sSetupDL[25 * 6]);
+ gSPDisplayList(&opa[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&opa[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSetGeometryMode(&opa[2], G_LIGHTING_POSITIONAL);
gSPDisplayList(&opa[3], object_astr_obj_DL_002380);
POLY_OPA_DISP = &opa[4];
+
CLOSE_DISPS(play->state.gfxCtx);
}
{
Gfx* xlu;
OPEN_DISPS(play->state.gfxCtx);
+
xlu = POLY_XLU_DISP;
- gSPDisplayList(&xlu[0], &sSetupDL[25 * 6]);
+ gSPDisplayList(&xlu[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&xlu[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSetGeometryMode(&xlu[2], G_LIGHTING_POSITIONAL);
gSPDisplayList(&xlu[3], object_astr_obj_DL_0022E0);
POLY_XLU_DISP = &xlu[4];
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.h b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.h
index 4f42a8b3c..224d94d7a 100644
--- a/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.h
+++ b/src/overlays/actors/ovl_Bg_Astr_Bombwall/z_bg_astr_bombwall.h
@@ -13,6 +13,6 @@ typedef struct BgAstrBombwall {
/* 0x15C */ BgAstrBombwallActionFunc actionFunc;
/* 0x160 */ ColliderTris collider;
/* 0x180 */ ColliderTrisElement colliderElements[2];
- /* 0x238 */ s16 cutscenes[1];
+ /* 0x238 */ s16 csIdList[1];
} BgAstrBombwall;
#endif // Z_BG_ASTR_BOMBWALL_H
diff --git a/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c b/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
index a5168eb24..f1394a32e 100644
--- a/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
+++ b/src/overlays/actors/ovl_Bg_Botihasira/z_bg_botihasira.c
@@ -95,7 +95,7 @@ void BgBotihasira_Update(Actor* thisx, PlayState* play2) {
void BgBotihasira_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_botihasira_DL_000638);
diff --git a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
index 4c73987ec..efe92eebc 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
@@ -60,7 +60,7 @@ typedef struct {
/* 0x14 */ BgBreakwallUnkFunc unk_14;
/* 0x18 */ BgBreakwallUnkFunc2 unk_18;
/* 0x1C */ ActorFunc unk_1C;
-} BgBreakwallStruct;
+} BgBreakwallStruct; // size = 0x20
BgBreakwallStruct D_808B8140[] = {
{ OBJECT_OMOYA_OBJ, object_omoya_obj_DL_0001A0, NULL, NULL, NULL, func_808B7380, func_808B77D0, NULL },
@@ -84,8 +84,7 @@ BgBreakwallStruct D_808B8140[] = {
func_808B77D0, NULL },
{ OBJECT_IKNINSIDE_OBJ, NULL, object_ikninside_obj_DL_00AEC0, object_ikninside_obj_Matanimheader_00BCB8, NULL,
func_808B751C, func_808B7A10, func_808B7D34 },
- { OBJECT_SPOT11_OBJ, object_spot11_obj_DL_0013F0, NULL, NULL, &object_spot11_obj_Colheader_001EB8, func_808B736C,
- func_808B77D0, NULL },
+ { OBJECT_SPOT11_OBJ, gWoodStepDL, NULL, NULL, &gWoodStepCol, func_808B736C, func_808B77D0, NULL },
};
static InitChainEntry sInitChain[] = {
@@ -146,14 +145,14 @@ s32 func_808B736C(BgBreakwall* this, PlayState* play) {
}
s32 func_808B7380(BgBreakwall* this, PlayState* play) {
- if ((gSaveContext.save.day >= 2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((gSaveContext.save.day >= 2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
return true;
}
s32 func_808B73C4(BgBreakwall* this, PlayState* play) {
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_21_01);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE) || CHECK_WEEKEVENTREG(WEEKEVENTREG_21_01);
}
s32 func_808B73FC(BgBreakwall* this, PlayState* play) {
@@ -176,7 +175,7 @@ s32 func_808B7460(BgBreakwall* this, PlayState* play) {
}
s32 func_808B74A8(BgBreakwall* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
return false;
}
return true;
@@ -285,7 +284,7 @@ void func_808B782C(BgBreakwall* this, PlayState* play) {
}
void func_808B78A4(BgBreakwall* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->dyna.actor);
}
}
@@ -355,7 +354,7 @@ void func_808B7B54(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -423,14 +422,14 @@ void BgBreakwall_Draw(Actor* thisx, PlayState* play) {
}
if (temp_s2->unk_04 != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, temp_s2->unk_04);
}
if (temp_s2->unk_08 != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, temp_s2->unk_08);
diff --git a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
index bcdda2327..c332fe82c 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
@@ -12,11 +12,11 @@ typedef void (*BgBreakwallUnkFunc2)(struct BgBreakwall*, PlayState*);
#define BGBREAKWALL_GET_F(thisx) ((thisx)-> params & 0xF)
#define BGBREAKWALL_SWITCHFLAG(thisx) (((thisx)-> params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 7 */ BGBREAKWALL_F_7 = 7,
/* 9 */ BGBREAKWALL_F_9 = 9,
- /* 11 */ BGBREAKWALL_F_11 = 11,
-};
+ /* 11 */ BGBREAKWALL_F_11 = 11
+} BgBreakwallParam;
typedef struct BgBreakwall {
/* 0x000 */ DynaPolyActor dyna;
diff --git a/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c b/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c
index ef2ca5273..2a1a7dce8 100644
--- a/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.c
@@ -75,7 +75,7 @@ void BgCraceMovebg_Init(Actor* thisx, PlayState* play) {
sHasInitializedIsLoaded = true;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gDekuShrineSlidingDoorCol);
this->index = BG_CRACE_MOVEBG_GET_INDEX(&this->dyna.actor);
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
index 533ce6292..d8c39a098 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
+++ b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.c
@@ -127,12 +127,12 @@ void BgCtowerGear_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
}
if (type == BGCTOWERGEAR_WATER_WHEEL) {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &gClockTowerWaterWheelCol);
} else if (type == BGCTOWERGEAR_ORGAN) {
DynaPolyActor_Init(&this->dyna, 0);
DynaPolyActor_LoadMesh(play, &this->dyna, &gClockTowerOrganCol);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
@@ -163,19 +163,24 @@ void BgCtowerGear_Update(Actor* thisx, PlayState* play) {
void BgCtowerGear_UpdateOrgan(Actor* thisx, PlayState* play) {
BgCtowerGear* this = THIS;
- if (Cutscene_CheckActorAction(play, 104)) {
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 104)]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_104)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_104)]->id) {
case 1:
this->dyna.actor.draw = NULL;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
break;
+
case 2:
this->dyna.actor.draw = BgCtowerGear_DrawOrgan;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
break;
+
case 3:
Actor_Kill(&this->dyna.actor);
break;
+
+ default:
+ break;
}
}
}
@@ -186,11 +191,13 @@ void BgCtowerGear_Draw(Actor* thisx, PlayState* play) {
void BgCtowerGear_DrawOrgan(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gClockTowerOrganDL);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, gClockTowerOrganPipesDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
index afea1bf0d..d59bfd3ea 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
+++ b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
@@ -9,10 +9,10 @@ struct BgCtowerGear;
#define BGCTOWERGEAR_GET_TYPE(thisx) ((thisx)->params & 3)
typedef enum {
- /* 0x0 */ BGCTOWERGEAR_CEILING_COG,
- /* 0x1 */ BGCTOWERGEAR_CENTER_COG,
- /* 0x2 */ BGCTOWERGEAR_WATER_WHEEL,
- /* 0x3 */ BGCTOWERGEAR_ORGAN
+ /* 0 */ BGCTOWERGEAR_CEILING_COG,
+ /* 1 */ BGCTOWERGEAR_CENTER_COG,
+ /* 2 */ BGCTOWERGEAR_WATER_WHEEL,
+ /* 3 */ BGCTOWERGEAR_ORGAN
} BgCtowerGearType;
typedef struct BgCtowerGear {
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c
index 5cc9d4b8d..571523fcb 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c
+++ b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c
@@ -46,7 +46,7 @@ void BgCtowerRot_Init(Actor* thisx, PlayState* play) {
Vec3f offset;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if (this->dyna.actor.params == BGCTOWERROT_CORRIDOR) {
DynaPolyActor_LoadMesh(play, &this->dyna, &gClockTowerCorridorCol);
this->actionFunc = BgCtowerRot_CorridorRotate;
@@ -88,7 +88,7 @@ void BgCtowerRot_CorridorRotate(BgCtowerRot* this, PlayState* play) {
Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_DUNGEON0);
this->dyna.actor.shape.rot.z = rotZ * 16.384f;
- if (play->csCtx.frames == 132) {
+ if (play->csCtx.curFrame == 132) {
play_sound(NA_SE_SY_SPIRAL_DASH);
}
}
@@ -100,7 +100,7 @@ void BgCtowerRot_DoorClose(BgCtowerRot* this, PlayState* play) {
if (!Math_SmoothStepToF(&this->timer, 0.0f, 0.1f, 15.0f, 0.1f)) {
if (this->dyna.actor.params == BGCTOWERROT_STONE_DOOR_MAIN) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_STOP);
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
this->actionFunc = BgCtowerRot_DoorDoNothing;
} else if (this->dyna.actor.params == BGCTOWERROT_STONE_DOOR_MAIN) {
@@ -119,19 +119,19 @@ void BgCtowerRot_DoorIdle(BgCtowerRot* this, PlayState* play) {
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
if (offset.z > 30.0f) {
this->unk160 = 0.0f;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = BgCtowerRot_SetupDoorClose;
}
}
void BgCtowerRot_SetupDoorClose(BgCtowerRot* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
if (this->dyna.actor.params == BGCTOWERROT_STONE_DOOR_MAIN) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
}
this->actionFunc = BgCtowerRot_DoorClose;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
index 52a905ed5..a06934669 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
+++ b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
@@ -11,7 +11,7 @@ typedef enum {
/* 0 */ BGCTOWERROT_CORRIDOR,
/* 1 */ BGCTOWERROT_STONE_DOOR_MAIN, // Main door controls cutscene flow (updating Link fields and playing sounds).
// It is the one on the left when entering from the Lost Woods
- /* 2 */ BGCTOWERROT_STONE_DOOR,
+ /* 2 */ BGCTOWERROT_STONE_DOOR
} BgCtowerRotType;
typedef struct BgCtowerRot {
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
index 064b14f7b..79ed63188 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.c
@@ -317,7 +317,7 @@ void BgDblueBalance_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.update = sTypeInfo[sp2C].update;
this->dyna.actor.draw = sTypeInfo[sp2C].draw;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, sTypeInfo[sp2C].colHeader);
if (sp2C == 3) {
@@ -412,17 +412,17 @@ void func_80B82DE0(BgDblueBalance* this, PlayState* play) {
phi_a1 = 1;
this->unk_17D = 20;
if (balance1 != NULL) {
- if (balance1->unk_181 != 0) {
+ if (balance1->isHeavySwitchPressed) {
phi_a0 = 4;
- } else if (balance1->unk_180 != 0) {
+ } else if (balance1->isSwitchPressed) {
phi_a0 = 2;
}
}
if (balance2 != NULL) {
- if (balance2->unk_181 != 0) {
+ if (balance2->isHeavySwitchPressed) {
phi_a1 = 5;
- } else if (balance2->unk_180 != 0) {
+ } else if (balance2->isSwitchPressed) {
phi_a1 = 3;
}
}
@@ -546,8 +546,8 @@ void BgDblueBalance_Update(Actor* thisx, PlayState* play) {
void func_80B8330C(Actor* thisx, PlayState* play) {
BgDblueBalance* this = THIS;
- this->unk_180 = DynaPolyActor_IsInSwitchPressedState(&this->dyna);
- this->unk_181 = DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna);
+ this->isSwitchPressed = DynaPolyActor_IsSwitchPressed(&this->dyna);
+ this->isHeavySwitchPressed = DynaPolyActor_IsHeavySwitchPressed(&this->dyna);
}
void func_80B83344(BgDblueBalance* this) {
@@ -627,16 +627,16 @@ void func_80B83518(Actor* thisx, PlayState* play) {
if (this->unk_17F == 2) {
this->unk_17E--;
if (this->unk_17E <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->unk_17F = 0;
}
} else if ((this->unk_17F != 0) && (this->unk_17F == 1)) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->unk_17F = 2;
this->unk_17E = 0x50;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
this->unk_16C = this->unk_170;
@@ -663,7 +663,7 @@ void BgDblueBalance_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(gfx++, 0, 0, 0, this->unk_183);
gSPDisplayList(gfx++, gGreatBayTempleObjectSeesawSplashDL);
@@ -705,7 +705,7 @@ void func_80B83758(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0, ptr = &this->unk_188[0]; i < ARRAY_COUNT(this->unk_188); i++, ptr++) {
if (ptr->unk_0E != 0) {
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.h b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.h
index f2200e96f..5d72ea3db 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.h
+++ b/src/overlays/actors/ovl_Bg_Dblue_Balance/z_bg_dblue_balance.h
@@ -33,8 +33,8 @@ typedef struct BgDblueBalance {
/* 0x17D */ s8 unk_17D;
/* 0x17E */ s8 unk_17E;
/* 0x17F */ s8 unk_17F;
- /* 0x180 */ s8 unk_180;
- /* 0x181 */ s8 unk_181;
+ /* 0x180 */ s8 isSwitchPressed;
+ /* 0x181 */ s8 isHeavySwitchPressed;
/* 0x182 */ s8 unk_182;
/* 0x183 */ u8 unk_183;
/* 0x184 */ s16 unk_184;
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
index 63c61e82f..6d13f4ac3 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.c
@@ -34,9 +34,9 @@ void func_80A2B308(Actor* thisx, PlayState* play);
BgDblueMovebg* D_80A2BBF0;
typedef struct {
- u8 unk_00;
- u8 unk_01;
-} BgDblueMovebgUnkStruct;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
+} BgDblueMovebgUnkStruct; // size = 0x2
BgDblueMovebgUnkStruct D_80A2BBF4;
@@ -97,7 +97,7 @@ static AnimatedMaterial* sTexAnims[] = {
s16 D_80A2B96C[] = { 0, 0x16C, -0x16C, 0 };
-s16 D_80A2B974[] = { -1, -1 };
+static s16 sCsIdList[] = { CS_ID_NONE, CS_ID_NONE };
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 1500, ICHAIN_CONTINUE),
@@ -163,7 +163,7 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
this->unk_160 = BGDBLUEMOVEBG_GET_F(thisx);
this->unk_1BC = BGDBLUEMOVEBG_GET_F000(thisx);
this->unk_1C0 = BGDBLUEMOVEBG_GET_FF0(thisx);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if ((this->unk_160 == 9) || (this->unk_160 == 8)) {
if (D_80A2BBF4.unk_00 != 0) {
@@ -197,7 +197,7 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
this->xluDList = sXluDLists[this->unk_160];
this->texAnim = sTexAnims[this->unk_160];
- SubS_FillCutscenesList(&this->dyna.actor, this->unk_1B6, ARRAY_COUNT(this->unk_1B6));
+ SubS_FillCutscenesList(&this->dyna.actor, this->csIdList, ARRAY_COUNT(this->csIdList));
switch (this->unk_160) {
case 1:
@@ -254,8 +254,8 @@ void BgDblueMovebg_Init(Actor* thisx, PlayState* play) {
this->unk_2F8[1] = NULL;
this->unk_2F8[0] = NULL;
label:
- for (i = 0; i < ARRAY_COUNT(D_80A2B974); i++) {
- D_80A2B974[i] = this->unk_1B6[i];
+ for (i = 0; i < ARRAY_COUNT(sCsIdList); i++) {
+ sCsIdList[i] = this->csIdList[i];
}
this->unk_178 = func_80A29A80(play, this->unk_1C0, this->unk_1BC);
this->unk_1CC = D_80A2B96C[this->unk_178];
@@ -385,8 +385,8 @@ void func_80A2A32C(BgDblueMovebg* this, PlayState* play) {
}
if (phi_v1) {
- this->unk_180 = func_800F2178(this->unk_1B6[0]);
- this->unk_1D2 = this->unk_1B6[0];
+ this->unk_180 = CutsceneManager_GetCutsceneCustomValue(this->csIdList[0]);
+ this->csId = this->csIdList[0];
this->unk_172 |= 8;
this->actionFunc = func_80A2A444;
} else {
@@ -408,7 +408,7 @@ void func_80A2A444(BgDblueMovebg* this, PlayState* play) {
sp20 = Math_StepToS(&this->unk_18A, 900, this->unk_188);
temp_v0 = this->unk_18A * this->unk_17E;
this->dyna.actor.shape.rot.y =
- (s32)((this->unk_18C + temp_v0) * 0.1f * (0x10000 / 360.0f)) + this->dyna.actor.home.rot.y;
+ (s32)DEG_TO_BINANG_ALT3((this->unk_18C + temp_v0) * 0.1f) + this->dyna.actor.home.rot.y;
if ((player->stateFlags2 & PLAYER_STATE2_10) && (this->unk_184 > 0.0f)) {
player->actor.world.pos.x =
@@ -447,7 +447,7 @@ void func_80A2A670(BgDblueMovebg* this, PlayState* play) {
void func_80A2A688(BgDblueMovebg* this, PlayState* play) {
this->unk_180--;
if (this->unk_180 <= 0) {
- ActorCutscene_Stop(this->unk_1B6[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
}
if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y - 60.0f, 2.0f) &&
@@ -477,8 +477,8 @@ void func_80A2A714(BgDblueMovebg* this, PlayState* play) {
}
this->unk_17E = phi_v0 * phi_f0;
- this->unk_180 = func_800F2178(this->unk_1B6[0]);
- this->unk_1D2 = this->unk_1B6[0];
+ this->unk_180 = CutsceneManager_GetCutsceneCustomValue(this->csIdList[0]);
+ this->csId = this->csIdList[0];
this->unk_172 |= 8;
this->actionFunc = func_80A2A7F8;
}
@@ -495,8 +495,7 @@ void func_80A2A7F8(BgDblueMovebg* this, PlayState* play) {
sp28 = Math_StepToS(&this->unk_18A, 900, this->unk_188);
sp26 = this->unk_18A * this->unk_17E;
- this->dyna.actor.shape.rot.y =
- (s32)((this->unk_18C + sp26) * 0.1f * (0x10000 / 360.0f)) + this->dyna.actor.home.rot.y;
+ this->dyna.actor.shape.rot.y = (s32)DEG_TO_BINANG_ALT3((this->unk_18C + sp26) * 0.1f) + this->dyna.actor.home.rot.y;
if ((player->stateFlags2 & PLAYER_STATE2_10) && (this->unk_184 > 0.0f)) {
player->actor.world.pos.x =
@@ -550,12 +549,12 @@ void func_80A2AAB8(BgDblueMovebg* this, PlayState* play) {
s32 sp18;
if (this->unk_180-- <= 0) {
- ActorCutscene_Stop(this->unk_1B6[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
}
sp18 = false;
- if ((this->unk_1D0 > 0) && ((D_80A2B974[0] >= 0) || (D_80A2B974[1] >= 0))) {
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if ((this->unk_1D0 > 0) && ((sCsIdList[0] >= 0) || (sCsIdList[1] >= 0))) {
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
sp18 = true;
}
}
@@ -643,13 +642,13 @@ void func_80A2AED0(BgDblueMovebg* this, PlayState* play) {
switch (temp_v0_3) {
case 1:
case 2:
- this->unk_1D2 = this->unk_1B6[0];
+ this->csId = this->csIdList[0];
this->unk_17E = 40;
break;
case 0:
case 3:
- this->unk_1D2 = this->unk_1B6[1];
+ this->csId = this->csIdList[1];
this->unk_17E = 15;
break;
}
@@ -722,7 +721,7 @@ void BgDblueMovebg_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_172 & 8) {
- if (SubS_StartActorCutscene(&this->dyna.actor, this->unk_1D2, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->dyna.actor, this->csId, CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
this->unk_172 &= ~8;
}
}
@@ -753,7 +752,7 @@ void func_80A2B308(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
@@ -779,7 +778,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
}
if ((this->opaDList != NULL) || (this->unk_160 == 6)) {
- gfx2 = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ gfx2 = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&gfx2[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -798,7 +797,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
}
if (this->xluDList != NULL) {
- gfx = func_8012C2B4(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&gfx[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[1], this->xluDList);
@@ -821,7 +820,7 @@ void BgDblueMovebg_Draw(Actor* thisx, PlayState* play2) {
Matrix_RotateYS(this->dyna.actor.shape.rot.y, MTXMODE_APPLY);
Matrix_RotateXS(this->dyna.actor.shape.rot.x, MTXMODE_APPLY);
Matrix_RotateZS(this->dyna.actor.shape.rot.z, MTXMODE_APPLY);
- gfx = func_8012C2B4(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL71(POLY_XLU_DISP);
for (i = 0; i < ARRAY_COUNT(this->unk_1D8[0]); i++) {
for (j = 0; j < ARRAY_COUNT(this->unk_1D8); j++) {
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
index 8fc016585..6e81c24c1 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
+++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h
@@ -37,7 +37,7 @@ typedef struct BgDblueMovebg {
/* 0x19C */ Vec3f unk_19C;
/* 0x1A8 */ Vec3f unk_1A8;
/* 0x1B4 */ UNK_TYPE1 unk1B4[2];
- /* 0x1B6 */ s16 unk_1B6[2];
+ /* 0x1B6 */ s16 csIdList[2];
/* 0x1BC */ s32 unk_1BC;
/* 0x1C0 */ s32 unk_1C0;
/* 0x1C4 */ s32 unk_1C4;
@@ -45,7 +45,7 @@ typedef struct BgDblueMovebg {
/* 0x1CC */ s16 unk_1CC;
/* 0x1CE */ s16 unk_1CE;
/* 0x1D0 */ s16 unk_1D0;
- /* 0x1D2 */ s16 unk_1D2;
+ /* 0x1D2 */ s16 csId;
/* 0x1D4 */ f32 unk_1D4;
/* 0x1D8 */ s16 unk_1D8[2][8];
/* 0x1F8 */ f32 unk_1F8[2][8];
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
index 3ba003ee5..d0d0f0c3c 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
+++ b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.c
@@ -321,8 +321,8 @@ void func_80B84610(BgDblueWaterfall* this, PlayState* play) {
player->actor.world.pos.x += sp34.x;
player->actor.world.pos.z += sp34.z;
if (this && this && this) {}
- player->unk_B80 = 8.0f;
- player->unk_B84 = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = 8.0f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
}
static InitChainEntry sInitChain[] = {
@@ -423,13 +423,13 @@ void func_80B84928(BgDblueWaterfall* this, PlayState* play) {
if (sp30 != 0) {
func_80B83EA4(this, play);
if (this->collider.info.acHitInfo->toucher.dmgFlags & 0x800) {
- this->unk_1A4 = this->actor.cutscene;
+ this->csId = this->actor.csId;
func_80B84AD4(this, play);
}
} else {
func_80B841A0(this, play);
if (this->collider.info.acHitInfo->toucher.dmgFlags & 0x1000) {
- this->unk_1A4 = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
func_80B84AD4(this, play);
}
}
@@ -448,9 +448,9 @@ void func_80B84AEC(BgDblueWaterfall* this, PlayState* play) {
s32 pad;
s32 sp20;
- if (ActorCutscene_GetCanPlayNext(this->unk_1A4)) {
+ if (CutsceneManager_IsNext(this->csId)) {
sp20 = func_80B83D04(this, play);
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_1A4, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_1A3 = true;
if (sp20) {
func_80B83D94(this, play);
@@ -460,7 +460,7 @@ void func_80B84AEC(BgDblueWaterfall* this, PlayState* play) {
func_80B84B9C(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->unk_1A4);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -533,7 +533,7 @@ void func_80B84BCC(BgDblueWaterfall* this, PlayState* play) {
func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
} else {
if (this->unk_1A3) {
- ActorCutscene_Stop(this->unk_1A4);
+ CutsceneManager_Stop(this->csId);
}
func_80B8484C(this, play);
}
@@ -572,7 +572,7 @@ void func_80B84F20(BgDblueWaterfall* this, PlayState* play) {
func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
} else {
if (this->unk_1A3) {
- ActorCutscene_Stop(this->unk_1A4);
+ CutsceneManager_Stop(this->csId);
}
func_80B8484C(this, play);
}
@@ -590,7 +590,7 @@ void BgDblueWaterfall_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -609,7 +609,7 @@ void BgDblueWaterfall_Draw(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x9B, 255, 255, 255, this->unk_19F);
gSPDisplayList(POLY_XLU_DISP++, gGreatBayTempleObjectIceStalactiteDL);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x9B, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.h b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.h
index 5ab64495e..fae5cca6a 100644
--- a/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.h
+++ b/src/overlays/actors/ovl_Bg_Dblue_Waterfall/z_bg_dblue_waterfall.h
@@ -22,7 +22,7 @@ typedef struct BgDblueWaterfall {
/* 0x1A0 */ u8 unk_1A0;
/* 0x1A1 */ UNK_TYPE1 unk1A1[2];
/* 0x1A3 */ s8 unk_1A3;
- /* 0x1A4 */ s16 unk_1A4;
+ /* 0x1A4 */ s16 csId;
/* 0x1A6 */ UNK_TYPE1 unk1A6[1];
/* 0x1A7 */ s8 unk_1A7;
/* 0x1A8 */ f32 unk_1A8;
diff --git a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
index 124469557..70bc5931f 100644
--- a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
+++ b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c
@@ -146,7 +146,7 @@ void BgDkjailIvy_WaitForCut(BgDkjailIvy* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
this->dyna.actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
BgDkjailIvy_SetupCutscene(this);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -158,16 +158,16 @@ void BgDkjailIvy_SetupCutscene(BgDkjailIvy* this) {
}
void BgDkjailIvy_BeginCutscene(BgDkjailIvy* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->fadeOutTimer = 50;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
Flags_SetSwitch(play, BG_DKJAIL_GET_SWITCH(&this->dyna.actor));
BgDkjailIvy_IvyCutEffects(this, play);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_GRASS_WALL_BROKEN);
BgDkjailIvy_SetupFadeOut(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -200,7 +200,7 @@ void BgDkjailIvy_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->alpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
index e6b18c220..97ccc907a 100644
--- a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
+++ b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
@@ -56,8 +56,8 @@ s32 func_80BC3980(BgF40Block* this, PlayState* play) {
this->unk_160 = 0;
this->unk_164 = 0;
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
@@ -78,8 +78,8 @@ s32 func_80BC3A2C(BgF40Block* this, PlayState* play) {
this->unk_160 = this->path->count - 1;
this->unk_164 = this->path->count - 1;
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
points += this->unk_164;
@@ -157,16 +157,16 @@ s32 func_80BC3B00(BgF40Block* this) {
}
s32 func_80BC3CA4(BgF40Block* this) {
- if (this->dyna.actor.cutscene == -1) {
+ if (this->dyna.actor.csId == CS_ID_NONE) {
return true;
}
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
return true;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
return false;
}
@@ -228,11 +228,11 @@ void BgF40Block_Init(Actor* thisx, PlayState* play) {
BgF40Block* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004640);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerBlockCol);
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
} else {
this->path = NULL;
}
@@ -277,13 +277,13 @@ void func_80BC4228(BgF40Block* this, PlayState* play) {
this->unk_164 = this->unk_160 + 1;
} else {
this->actionFunc = func_80BC4530;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_C);
}
}
if (func_80BC3D08(this, play, 0)) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->actionFunc = func_80BC41AC;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
return;
@@ -337,13 +337,13 @@ void func_80BC4448(BgF40Block* this, PlayState* play) {
this->unk_164 = this->unk_160 - 1;
} else {
this->actionFunc = func_80BC4380;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_C);
}
}
if (func_80BC3D08(this, play, 0)) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->actionFunc = func_80BC43CC;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_STOP_F);
}
@@ -373,5 +373,5 @@ void BgF40Block_Update(Actor* thisx, PlayState* play) {
}
void BgF40Block_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_0043D0);
+ Gfx_DrawDListOpa(play, gStoneTowerBlockDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
index 37a5c360e..228fb6bfd 100644
--- a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
+++ b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
@@ -7,9 +7,11 @@ struct BgF40Block;
typedef void (*BgF40BlockActionFunc)(struct BgF40Block*, PlayState*);
-#define BGF40BLOCK_GET_PATH(thisx) (((thisx)->params & 0x1FC) >> 2)
+#define BGF40BLOCK_GET_PATH_INDEX(thisx) (((thisx)->params & 0x1FC) >> 2)
#define BGF40BLOCK_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define BGF40BLOCK_PATH_INDEX_NONE 0x3F
+
typedef struct BgF40Block {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ Path* path;
diff --git a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
index 4ae6a8ed7..f47bf4394 100644
--- a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
@@ -41,8 +41,8 @@ void BgF40Flift_Init(Actor* thisx, PlayState* play) {
BgF40Flift* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004240);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerTempleSquareElevatorCol);
this->dyna.actor.params = 1;
this->actionFunc = func_808D75F0;
}
@@ -54,8 +54,8 @@ void BgF40Flift_Destroy(Actor* thisx, PlayState* play) {
}
void func_808D75F0(BgF40Flift* this, PlayState* play) {
- if (((this->dyna.actor.params == 1) && (DynaPolyActor_IsInRidingMovingState(&this->dyna))) ||
- ((this->dyna.actor.params == -1) && (!DynaPolyActor_IsInRidingMovingState(&this->dyna)))) {
+ if (((this->dyna.actor.params == 1) && DynaPolyActor_IsPlayerOnTop(&this->dyna)) ||
+ ((this->dyna.actor.params == -1) && !DynaPolyActor_IsPlayerOnTop(&this->dyna))) {
this->timer = 96;
this->actionFunc = func_808D7714;
} else {
@@ -64,10 +64,11 @@ void func_808D75F0(BgF40Flift* this, PlayState* play) {
}
this->timer--;
if (this->dyna.actor.params == 1) {
- this->dyna.actor.world.pos.y = (sin_rad(this->timer * (M_PI / 24.0f)) * 5.0f) + this->dyna.actor.home.pos.y;
+ this->dyna.actor.world.pos.y =
+ (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f) + this->dyna.actor.home.pos.y;
} else {
this->dyna.actor.world.pos.y =
- (sin_rad(this->timer * (M_PI / 24.0f)) * 5.0f) + (926.8f + this->dyna.actor.home.pos.y);
+ (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f) + (926.8f + this->dyna.actor.home.pos.y);
}
}
}
@@ -76,7 +77,7 @@ void func_808D7714(BgF40Flift* this, PlayState* play) {
if (this->timer != 0) {
this->timer--;
this->dyna.actor.world.pos.y =
- (((cos_rad(this->timer * (M_PI / 96.0f)) * this->dyna.actor.params) + 1.0f) * 463.4f) +
+ (((Math_CosF(this->timer * (M_PI / 96.0f)) * this->dyna.actor.params) + 1.0f) * 463.4f) +
this->dyna.actor.home.pos.y;
} else {
this->dyna.actor.params = -this->dyna.actor.params;
@@ -91,5 +92,5 @@ void BgF40Flift_Update(Actor* thisx, PlayState* play) {
}
void BgF40Flift_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_004038);
+ Gfx_DrawDListOpa(play, gStoneTowerTempleSquareElevatorDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
index 558c77064..be3c9cb47 100644
--- a/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
+++ b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
@@ -53,21 +53,20 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
u32 inCsMode = Player_InCsMode(play);
for (actor = play->actorCtx.actorLists[ACTORCAT_SWITCH].first; actor != NULL; actor = actor->next) {
- if (actor->id == ACTOR_BG_F40_SWITCH && actor->room == this->dyna.actor.room && actor->update != NULL) {
+ if ((actor->id == ACTOR_BG_F40_SWITCH) && (actor->room == this->dyna.actor.room) &&
+ (actor->update != NULL)) {
actorAsSwitch = (BgF40Switch*)actor;
actorAsSwitch->wasPressed = actorAsSwitch->isPressed;
- isPressed = DynaPolyActor_IsInSwitchPressedState(&actorAsSwitch->dyna);
- if (actorAsSwitch->isPressed && actorAsSwitch->actionFunc == BgF40Switch_IdlePressed) {
+ isPressed = DynaPolyActor_IsSwitchPressed(&actorAsSwitch->dyna);
+ if (actorAsSwitch->isPressed && (actorAsSwitch->actionFunc == BgF40Switch_IdlePressed)) {
// Switch is fully pressed - if there's nothing keeping it pressed, wait a short time before
// reverting to unpressed state.
if (isPressed || inCsMode) {
actorAsSwitch->switchReleaseDelay = 6;
+ } else if (actorAsSwitch->switchReleaseDelay > 0) {
+ actorAsSwitch->switchReleaseDelay--;
} else {
- if (actorAsSwitch->switchReleaseDelay > 0) {
- actorAsSwitch->switchReleaseDelay--;
- } else {
- actorAsSwitch->isPressed = isPressed;
- }
+ actorAsSwitch->isPressed = isPressed;
}
} else {
// No delay when pressing switch, or releasing from a not-fully-pressed state.
@@ -75,9 +74,9 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
}
if (actorAsSwitch->isPressed) {
switchFlag = BGF40SWITCH_GET_SWITCHFLAG(&actorAsSwitch->dyna.actor);
- if (switchFlag >= 0 && switchFlag < 0x80) {
+ if ((switchFlag >= 0) && (switchFlag < 0x80)) {
pressedSwitchFlags[(switchFlag & ~0x1F) >> 5] |= 1 << (switchFlag & 0x1F);
- if (!actorAsSwitch->wasPressed && actorAsSwitch->actionFunc == BgF40Switch_IdleUnpressed &&
+ if (!actorAsSwitch->wasPressed && (actorAsSwitch->actionFunc == BgF40Switch_IdleUnpressed) &&
!Flags_GetSwitch(play, switchFlag)) {
actorAsSwitch->isInitiator = true;
}
@@ -86,9 +85,10 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
}
}
for (actor = play->actorCtx.actorLists[ACTORCAT_SWITCH].first; actor != NULL; actor = actor->next) {
- if (actor->id == ACTOR_BG_F40_SWITCH && actor->room == this->dyna.actor.room && actor->update != 0) {
+ if ((actor->id == ACTOR_BG_F40_SWITCH) && (actor->room == this->dyna.actor.room) &&
+ (actor->update != NULL)) {
switchFlag = BGF40SWITCH_GET_SWITCHFLAG(actor);
- if (switchFlag >= 0 && switchFlag < 0x80 && Flags_GetSwitch(play, switchFlag) &&
+ if ((switchFlag >= 0) && (switchFlag < 0x80) && Flags_GetSwitch(play, switchFlag) &&
!(pressedSwitchFlags[(switchFlag & ~0x1F) >> 5] & (1 << (switchFlag & 0x1F)))) {
Flags_UnsetSwitch(play, switchFlag);
}
@@ -112,7 +112,7 @@ void BgF40Switch_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.scale.y = 0.165f;
this->actionFunc = BgF40Switch_IdleUnpressed;
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 1.0f;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_switch_Colheader_000118);
if (!sBgF40SwitchGlobalsInitialized) {
sBgF40SwitchLastUpdateFrame = play->gameplayFrames;
@@ -147,7 +147,7 @@ void BgF40Switch_Press(BgF40Switch* this, PlayState* play) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_IKANA_BLOCK_SWITCH);
Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
if (this->isInitiator) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->isInitiator = false;
}
this->actionFunc = BgF40Switch_IdlePressed;
@@ -157,19 +157,19 @@ void BgF40Switch_Press(BgF40Switch* this, PlayState* play) {
}
void BgF40Switch_WaitToPress(BgF40Switch* this, PlayState* play) {
- if (!this->isInitiator || this->dyna.actor.cutscene == -1) {
+ if (!this->isInitiator || (this->dyna.actor.csId == CS_ID_NONE)) {
this->actionFunc = BgF40Switch_Press;
if (this->isInitiator) {
Flags_SetSwitch(play, BGF40SWITCH_GET_SWITCHFLAG(&this->dyna.actor));
}
- } else if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ } else if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->actionFunc = BgF40Switch_Press;
if (this->isInitiator) {
Flags_SetSwitch(play, BGF40SWITCH_GET_SWITCHFLAG(&this->dyna.actor));
}
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
index 97fd3f068..039d20f3c 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
@@ -5,6 +5,7 @@
*/
#include "z_bg_f40_swlift.h"
+#include "objects/object_f40_obj/object_f40_obj.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -12,11 +13,13 @@
void BgF40Swlift_Init(Actor* thisx, PlayState* play);
void BgF40Swlift_Destroy(Actor* thisx, PlayState* play);
-void BgF40Swlift_Update(Actor* thisx, PlayState* play);
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2);
void BgF40Swlift_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Bg_F40_Swlift_InitVars = {
+static s32 sSwitchFlags[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+static s32 sHeights[4];
+
+const ActorInit Bg_F40_Swlift_InitVars = {
ACTOR_BG_F40_SWLIFT,
ACTORCAT_BG,
FLAGS,
@@ -28,24 +31,86 @@ ActorInit Bg_F40_Swlift_InitVars = {
(ActorFunc)BgF40Swlift_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_8096F540[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 550, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 5000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-#endif
+void BgF40Swlift_Init(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+ s32 index;
+ s32 pad;
-extern InitChainEntry D_8096F540[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ index = BG_F40_SWLIFT_GET_INDEX(thisx);
+ if ((index < 0) || (index >= 5)) { //! @bug An index greater than 3 will cause an out of bounds array access.
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-extern UNK_TYPE D_06003B08;
-extern UNK_TYPE D_06003E80;
+ sHeights[index] = this->dyna.actor.world.pos.y;
+ sSwitchFlags[index] = BG_F40_SWLIFT_GET_SWITCHFLAG(thisx);
+ if (index != 0) {
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Init.s")
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerVerticallyOscillatingPlatformCol);
+ this->dyna.actor.params = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Destroy.s")
+void BgF40Swlift_Destroy(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Update.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Draw.s")
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ BgF40Swlift* this = THIS;
+ s32 i;
+
+ for (i = 1; i < ARRAY_COUNT(sSwitchFlags); i++) {
+ if ((sSwitchFlags[i] == 0xFF) || !Flags_GetSwitch(play, sSwitchFlags[i])) {
+ break;
+ }
+ }
+
+ i--;
+ if (i != this->dyna.actor.params) {
+ f32 heightOffset;
+
+ this->dyna.actor.params = -1;
+ heightOffset = (sHeights[i] - this->dyna.actor.world.pos.y) * 0.1f;
+ if (heightOffset > 0.0f) {
+ heightOffset = CLAMP(heightOffset, 0.5f, 15.0f);
+ } else {
+ heightOffset = CLAMP(heightOffset, -15.0f, -0.5f);
+ }
+
+ if (Math_StepToF(&this->dyna.actor.speed, heightOffset, 1.0f) && (fabsf(heightOffset) <= 0.5f)) {
+ if (Math_StepToF(&this->dyna.actor.world.pos.y, sHeights[i], fabsf(this->dyna.actor.speed))) {
+ this->dyna.actor.params = i;
+ this->timer = 48;
+ this->dyna.actor.speed = 0.0f;
+ }
+ } else {
+ this->dyna.actor.world.pos.y += this->dyna.actor.speed;
+ }
+ } else {
+ if (this->timer == 0) {
+ this->timer = 48;
+ }
+ this->timer--;
+ this->dyna.actor.world.pos.y =
+ sHeights[this->dyna.actor.params] + (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f);
+ }
+}
+
+void BgF40Swlift_Draw(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+
+ Gfx_DrawDListOpa(play, gStoneTowerVerticallyOscillatingPlatformDL);
+}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
index a687fc642..e377b73e0 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
@@ -1,13 +1,16 @@
#ifndef Z_BG_F40_SWLIFT_H
#define Z_BG_F40_SWLIFT_H
+#define BG_F40_SWLIFT_GET_SWITCHFLAG(thisx) ((thisx)->params & 0xFF)
+#define BG_F40_SWLIFT_GET_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+
#include "global.h"
struct BgF40Swlift;
typedef struct BgF40Swlift {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x1C];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ s32 timer;
} BgF40Swlift; // size = 0x160
#endif // Z_BG_F40_SWLIFT_H
diff --git a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
index 40b8c78a7..e15c87f42 100644
--- a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
+++ b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.c
@@ -205,7 +205,7 @@ void BgFireWall_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sFlameTextures[this->texIndex]));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x01, 255, 255, 0, 150);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 255);
diff --git a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
index af5a29923..bf5300758 100644
--- a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
+++ b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
@@ -8,9 +8,9 @@ struct BgFireWall;
typedef void (*BgFireWallActionFunc)(struct BgFireWall*, PlayState*);
typedef enum {
- /* 0 */ BGFIREWALL_PARAMS_0,
- /* 1 */ BGFIREWALL_PARAMS_1,
-} BgFireWallParams;
+ /* 0 */ BGFIREWALL_PARAM_0,
+ /* 1 */ BGFIREWALL_PARAM_1
+} BgFireWallParam;
typedef struct BgFireWall {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c b/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
index 40a981a6e..7b63081c0 100644
--- a/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
+++ b/src/overlays/actors/ovl_Bg_Fu_Kaiten/z_bg_fu_kaiten.c
@@ -34,7 +34,7 @@ void BgFuKaiten_Init(Actor* thisx, PlayState* play) {
CollisionHeader* header = NULL;
Actor_SetScale(thisx, 1.0);
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
CollisionHeader_GetVirtual(&object_fu_kaiten_Colheader_002D30, &header);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, header);
@@ -77,7 +77,7 @@ void BgFuKaiten_Update(Actor* thisx, PlayState* play) {
void BgFuKaiten_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_fu_kaiten_DL_0005D0);
diff --git a/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c b/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
index 5cb337238..9da3cc5f6 100644
--- a/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
+++ b/src/overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.c
@@ -34,7 +34,7 @@ void BgFuMizu_Init(Actor* thisx, PlayState* play) {
CollisionHeader* colHeader = NULL;
Actor_SetScale(&this->dyna.actor, 1.0f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_fu_kaiten_Colheader_0037F8, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
this->unk_160 = 0;
@@ -87,7 +87,7 @@ void BgFuMizu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(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++, object_fu_kaiten_DL_002FC0);
diff --git a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
index c9020349c..fd46e16e5 100644
--- a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
+++ b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.c
@@ -42,7 +42,7 @@ void func_80B40080(BgGoronOyu* this) {
void func_80B4009C(BgGoronOyu* this) {
this->unk_17E = 0;
- this->initialActorCutscene = this->dyna.actor.cutscene;
+ this->initCsId = this->dyna.actor.csId;
this->actionFunc = func_80B40100;
this->unk_164 = 20.0f;
}
@@ -53,11 +53,11 @@ void func_80B400C8(BgGoronOyu* this, PlayState* play) {
}
void func_80B40100(BgGoronOyu* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->initialActorCutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->initialActorCutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->initCsId)) {
+ CutsceneManager_StartWithPlayerCs(this->initCsId, &this->dyna.actor);
this->actionFunc = func_80B40160;
} else {
- ActorCutscene_SetIntentToPlay(this->initialActorCutscene);
+ CutsceneManager_Queue(this->initCsId);
}
}
@@ -69,7 +69,7 @@ void func_80B40160(BgGoronOyu* this, PlayState* play) {
BgGoronOyu_UpdateWaterBoxInfo(this, play);
if (this->unk_164 <= 0.0f) {
- ActorCutscene_Stop(this->initialActorCutscene);
+ CutsceneManager_Stop(this->initCsId);
this->unk_164 = 0.0f;
func_80B40080(this);
}
@@ -152,7 +152,7 @@ void BgGoronOyu_Init(Actor* thisx, PlayState* play) {
CollisionHeader* colHeader = NULL;
Actor_SetScale(&this->dyna.actor, 0.1f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_oyu_Colheader_000988, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
@@ -183,10 +183,12 @@ void BgGoronOyu_Update(Actor* thisx, PlayState* play) {
void BgGoronOyu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_oyu_Matanimheader_000968));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, &object_oyu_DL_000158);
gSPDisplayList(POLY_XLU_DISP++, &object_oyu_DL_000080);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.h b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.h
index d17ff87b3..57459364b 100644
--- a/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.h
+++ b/src/overlays/actors/ovl_Bg_Goron_Oyu/z_bg_goron_oyu.h
@@ -15,7 +15,7 @@ typedef struct BgGoronOyu {
/* 0x168 */ Vec3f waterBoxPos;
/* 0x174 */ f32 waterBoxXLength;
/* 0x178 */ f32 waterBoxZLength;
- /* 0x17C */ s16 initialActorCutscene;
+ /* 0x17C */ s16 initCsId;
/* 0x17E */ u16 unk_17E;
} BgGoronOyu; // size = 0x180
diff --git a/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.c b/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.c
index 331a6dfe5..fc209773b 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Bombwall/z_bg_haka_bombwall.c
@@ -191,21 +191,21 @@ void func_80BD6274(BgHakaBombwall* this, PlayState* play) {
void BgHakaBombwall_SetupPlayCutscene(BgHakaBombwall* this) {
this->dyna.actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = BgHakaBombwall_PlayCutscene;
}
void BgHakaBombwall_PlayCutscene(BgHakaBombwall* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
func_80BD5E6C(this, play);
this->dyna.actor.draw = NULL;
Flags_SetSwitch(play, BGHAKABOMBWALL_GET_7F(&this->dyna.actor));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 0x3C, NA_SE_EV_WALL_BROKEN);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
BgHakaBombwall_SetupEndCutscene(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -217,7 +217,7 @@ void BgHakaBombwall_SetupEndCutscene(BgHakaBombwall* this) {
void BgHakaBombwall_EndCutscene(BgHakaBombwall* this, PlayState* play) {
this->csTimer--;
if (this->csTimer <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Haka_Curtain/z_bg_haka_curtain.c b/src/overlays/actors/ovl_Bg_Haka_Curtain/z_bg_haka_curtain.c
index 412ea3a39..dfc176eff 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Curtain/z_bg_haka_curtain.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Curtain/z_bg_haka_curtain.c
@@ -49,7 +49,7 @@ void BgHakaCurtain_Init(Actor* thisx, PlayState* play) {
BgHakaCurtain* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_haka_obj_Colheader_001588);
if (Flags_GetClear(play, this->dyna.actor.room)) {
func_80B6DE80(this);
@@ -79,12 +79,12 @@ void func_80B6DCEC(BgHakaCurtain* this) {
}
void func_80B6DD00(BgHakaCurtain* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
func_80B6DD5C(this);
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
void func_80B6DD5C(BgHakaCurtain* this) {
@@ -123,11 +123,11 @@ void func_80B6DEA8(BgHakaCurtain* this, PlayState* play) {
void BgHakaCurtain_Update(Actor* thisx, PlayState* play) {
BgHakaCurtain* this = THIS;
- CsCmdActorAction* actorAction;
+ CsCmdActorCue* cue;
- if (Cutscene_CheckActorAction(play, 469)) {
- actorAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 469)];
- if (actorAction->startFrame == play->csCtx.frames && actorAction->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_469)) {
+ cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_469)];
+ if ((cue->startFrame == play->csCtx.curFrame) && (cue->id == 2)) {
func_80B6DD80(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
index a8d63c309..c226c89f3 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
@@ -45,9 +45,9 @@ void BgHakaTomb_Init(Actor* thisx, PlayState* play) {
BgHakaTomb* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_haka_obj_Colheader_000EE8);
- SubS_FillCutscenesList(&this->dyna.actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->dyna.actor, this->csIdList, ARRAY_COUNT(this->csIdList));
func_80BD6624(this);
}
@@ -61,15 +61,15 @@ void func_80BD6624(BgHakaTomb* this) {
this->actionFunc = func_80BD66AC;
}
-s32 func_80BD6638(s16* arg0, s16* arg1, s32 arg2) {
+s32 func_80BD6638(s16* csId, s16* csIdList, s32 numCutscenes) {
s32 pad;
s32 retVal = false;
s32 i;
- *arg0 = ActorCutscene_GetCurrentIndex();
- if (*arg0 >= 0) {
- for (i = 0; i < arg2; i++) {
- if (*arg0 == arg1[i]) {
+ *csId = CutsceneManager_GetCurrentCsId();
+ if (*csId >= 0) {
+ for (i = 0; i < numCutscenes; i++) {
+ if (*csId == csIdList[i]) {
retVal = true;
break;
}
@@ -80,12 +80,13 @@ s32 func_80BD6638(s16* arg0, s16* arg1, s32 arg2) {
}
void func_80BD66AC(BgHakaTomb* this, PlayState* play) {
- s16 temp;
+ s16 csId;
if (Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
}
- if (!func_80BD6638(&temp, this->cutscenes, 1) && (temp < 0) && Flags_GetClear(play, this->dyna.actor.room)) {
+ if (!func_80BD6638(&csId, this->csIdList, ARRAY_COUNT(this->csIdList)) && (csId <= CS_ID_NONE) &&
+ Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= ACTOR_FLAG_1;
if (this->dyna.actor.isTargeted) {
func_80BD6754(this);
@@ -100,7 +101,7 @@ void func_80BD6754(BgHakaTomb* this) {
}
void func_80BD6768(BgHakaTomb* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->dyna.actor, this->cutscenes[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->dyna.actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
BgHakaTomb_SetupDoNothing(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.h b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.h
index 3c607e0e2..fa06a8695 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.h
+++ b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.h
@@ -10,7 +10,7 @@ typedef void (*BgHakaTombActionFunc)(struct BgHakaTomb*, PlayState*);
typedef struct BgHakaTomb {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgHakaTombActionFunc actionFunc;
- /* 0x160 */ s16 cutscenes[1];
+ /* 0x160 */ s16 csIdList[1];
} BgHakaTomb; // size = 0x164
#endif // Z_BG_HAKA_TOMB_H
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.c b/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.c
index bde3c8540..99a5a759c 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Bombwall/z_bg_hakugin_bombwall.c
@@ -369,7 +369,7 @@ s32 func_80ABCC00(BgHakuginBombwall* this, PlayState* play) {
return true;
}
}
- } else if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ } else if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 50, NA_SE_EV_WALL_BROKEN);
return true;
}
@@ -382,7 +382,7 @@ void func_80ABCCE4(BgHakuginBombwall* this, PlayState* play) {
if (ptr->unk_20(this, play)) {
this->dyna.actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = func_80ABCD98;
} else {
this->collider.base.acFlags &= ~AC_HIT;
@@ -393,18 +393,18 @@ void func_80ABCCE4(BgHakuginBombwall* this, PlayState* play) {
void func_80ABCD98(BgHakuginBombwall* this, PlayState* play) {
s32 pad;
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
BgHakuginBombwallStruct* ptr = &D_80ABCFC0[BGHAKUGIN_BOMBWALL_100(&this->dyna.actor)];
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ptr->unk_24(this, play);
this->dyna.actor.draw = NULL;
this->unk_1AC = 20;
Flags_SetSwitch(play, BGHAKUGIN_BOMBWALL_SWITCHFLAG(&this->dyna.actor));
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = func_80ABCE60;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -413,7 +413,7 @@ void func_80ABCE60(BgHakuginBombwall* this, PlayState* play) {
this->unk_1AC--;
if (this->unk_1AC <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
} else if (this->unk_1AC == ptr->unk_2C) {
ptr->unk_28(this, play);
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
index 42a7c4e05..10f045617 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Elvpole/z_bg_hakugin_elvpole.c
@@ -104,15 +104,15 @@ void func_80ABD92C(BgHakuginElvpole* this, PlayState* play) {
this->unk_15C = 0;
}
if (this->unk_160) {
- if (this->dyna.actor.cutscene == -1) {
+ if (this->dyna.actor.csId == CS_ID_NONE) {
this->unk_160 = false;
return;
- } else if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ } else if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->unk_160 = false;
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -126,7 +126,7 @@ void BgHakuginElvpole_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_hakugin_obj_DL_00ACB8);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
index d4d7e1724..66666b82b 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.c
@@ -28,9 +28,9 @@ void func_80A9CE00(BgHakuginPost* this);
void func_80A9CE1C(BgHakuginPost* this, PlayState* play);
void func_80A9D0A0(BgHakuginPost* this);
void func_80A9D0B4(BgHakuginPost* this, PlayState* play);
-void func_80A9D1E0(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 arg3, s16 arg4);
+void func_80A9D1E0(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 csLength, s16 csId);
void func_80A9D260(BgHakuginPost* this, PlayState* play);
-void func_80A9D2C4(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 arg3, s16 arg4);
+void func_80A9D2C4(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 csId, s16 additionalCsId);
void func_80A9D360(BgHakuginPost* this, PlayState* play);
void func_80A9D3E4(BgHakuginPost* this);
void func_80A9D434(BgHakuginPost* this, PlayState* play);
@@ -52,9 +52,9 @@ ActorInit Bg_Hakugin_Post_InitVars = {
};
typedef struct {
- f32 unk_00;
- u8 unk_04;
-} BgHakuginPostUnkStruct3;
+ /* 0x0 */ f32 unk_00;
+ /* 0x4 */ u8 unk_04;
+} BgHakuginPostUnkStruct3; // size = 0x8
static BgHakuginPostUnkStruct3 D_80A9D880[] = {
{ 1200.0f, false }, { 600.0f, false }, { 900.0f, false }, { 870.0f, false },
@@ -162,12 +162,12 @@ void func_80A9AFB4(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
} else {
unkStruct->unk_0000[i].unk_34 = 1;
}
- unkStruct->unk_0000[i].unk_2A = this->dyna.actor.cutscene;
- unkStruct->unk_0000[i].unk_2C = ActorCutscene_GetAdditionalCutscene(unkStruct->unk_0000[i].unk_2A);
+ unkStruct->unk_0000[i].csId = this->dyna.actor.csId;
+ unkStruct->unk_0000[i].additionalCsId = CutsceneManager_GetAdditionalCsId(unkStruct->unk_0000[i].csId);
} else {
unkStruct->unk_0000[i].unk_34 = 1;
- unkStruct->unk_0000[i].unk_2A = -1;
- unkStruct->unk_0000[i].unk_2C = -1;
+ unkStruct->unk_0000[i].csId = CS_ID_NONE;
+ unkStruct->unk_0000[i].additionalCsId = CS_ID_NONE;
}
unkStruct->unk_0000[i].unk_2F = 1;
@@ -522,10 +522,10 @@ void func_80A9C058(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
sp44.z = this->dyna.actor.home.pos.z + unkStruct1->unk_14.z;
Rumble_Request(Math3D_Vec3fDistSq(&sp44, &GET_PLAYER(play)->actor.world.pos), 255, 20, 150);
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
if (this->unk_179 <= 0) {
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
@@ -537,7 +537,7 @@ void func_80A9C058(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct*
}
}
-void func_80A9C18C(BgHakuginPost* this, PlayState* play) {
+void BgHakuginPost_RequestQuakeAndRumble(BgHakuginPost* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
Camera* activeCam = GET_ACTIVE_CAM(play);
@@ -547,10 +547,10 @@ void func_80A9C18C(BgHakuginPost* this, PlayState* play) {
this->dyna.actor.home.pos.x, this->dyna.actor.home.pos.z),
255, 20, 150);
- quakeIndex = Quake_Add(activeCam, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(activeCam, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 6, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 6, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
}
void func_80A9C228(BgHakuginPost* this, PlayState* play, BgHakuginPostUnkStruct* unkStruct) {
@@ -703,7 +703,7 @@ void BgHakuginPost_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.z = 0;
this->dyna.actor.shape.rot.x = 0;
this->dyna.actor.shape.rot.z = 0;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_hakugin_obj_Colheader_00D3B0);
func_80A9B3BC(this, play);
func_80A9CA94(this);
@@ -783,7 +783,7 @@ void func_80A9CC84(BgHakuginPost* this) {
void func_80A9CCA0(BgHakuginPost* this, PlayState* play) {
if (this->unk_174 != 0) {
func_80A9D1E0(this, func_80A9CD00, (this->unk_164 - this->dyna.actor.home.pos.y) + 100.0f, 60,
- this->dyna.actor.cutscene);
+ this->dyna.actor.csId);
}
}
@@ -798,7 +798,7 @@ void func_80A9CD14(BgHakuginPost* this, PlayState* play) {
temp_f12 = CLAMP_MAX(temp_f12, 40.0f);
this->unk_16C += temp_f12;
if (this->unk_168 <= this->unk_16C) {
- func_80A9C18C(this, play);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
func_80A9CE00(this);
} else {
@@ -823,7 +823,7 @@ void func_80A9CE1C(BgHakuginPost* this, PlayState* play) {
if (this->unk_170 != 0) {
func_80A9D1E0(this, func_80A9D0A0, (this->unk_164 - this->dyna.actor.home.pos.y) + 100.0f, 0x3C,
- ActorCutscene_GetAdditionalCutscene(this->dyna.actor.cutscene));
+ CutsceneManager_GetAdditionalCsId(this->dyna.actor.csId));
return;
}
@@ -843,8 +843,8 @@ void func_80A9CE1C(BgHakuginPost* this, PlayState* play) {
func_8019F128(NA_SE_EV_SLIDE_DOOR_OPEN);
Flags_SetSwitch(play, D_80A9E028.unk_0000[i].unk_2E);
this->unk_178 = 20;
- func_80A9D2C4(this, func_80A9CE00, D_80A9E028.unk_0000[i].unk_14.y + 50.0f,
- D_80A9E028.unk_0000[i].unk_2A, D_80A9E028.unk_0000[i].unk_2C);
+ func_80A9D2C4(this, func_80A9CE00, D_80A9E028.unk_0000[i].unk_14.y + 50.0f, D_80A9E028.unk_0000[i].csId,
+ D_80A9E028.unk_0000[i].additionalCsId);
break;
}
}
@@ -876,7 +876,7 @@ void func_80A9D0B4(BgHakuginPost* this, PlayState* play) {
func_80A9C634(this, play);
func_80A9B160(&D_80A9E028, play);
this->unk_16C = this->unk_164;
- func_80A9C18C(this, play);
+ BgHakuginPost_RequestQuakeAndRumble(this, play);
func_8019F128(NA_SE_EV_STONEDOOR_STOP);
func_80A9CC84(this);
} else {
@@ -884,12 +884,12 @@ void func_80A9D0B4(BgHakuginPost* this, PlayState* play) {
}
}
-void func_80A9D1E0(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 arg3, s16 arg4) {
+void func_80A9D1E0(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 csLength, s16 csId) {
this->unkFunc = unkFunc;
- this->unk_184 = arg4;
- this->unk_180 = ActorCutscene_GetLength(arg4);
- if (this->unk_180 < 0) {
- this->unk_180 = arg3;
+ this->csId = csId;
+ this->csLength = CutsceneManager_GetLength(csId);
+ if (this->csLength < 0) {
+ this->csLength = csLength;
}
this->dyna.actor.focus.pos.x = this->dyna.actor.home.pos.x;
this->dyna.actor.focus.pos.y = this->unk_16C + arg2;
@@ -898,22 +898,22 @@ void func_80A9D1E0(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16
}
void func_80A9D260(BgHakuginPost* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_184)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_184, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->dyna.actor);
this->unkFunc(this);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_184);
+ CutsceneManager_Queue(this->csId);
}
}
-void func_80A9D2C4(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 arg3, s16 arg4) {
+void func_80A9D2C4(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16 csId, s16 additionalCsId) {
this->unkFunc = unkFunc;
- this->unk_184 = arg3;
- this->unk_186 = arg4;
- this->unk_180 = -1;
- this->unk_180 = ActorCutscene_GetLength(arg3);
- if (this->unk_180 < 0) {
- this->unk_180 = 15;
+ this->csId = csId;
+ this->additionalCsId = additionalCsId;
+ this->csLength = -1;
+ this->csLength = CutsceneManager_GetLength(csId);
+ if (this->csLength < 0) {
+ this->csLength = 15;
}
this->dyna.actor.focus.pos.x = this->dyna.actor.home.pos.x;
this->dyna.actor.focus.pos.y = this->unk_16C + arg2;
@@ -922,32 +922,32 @@ void func_80A9D2C4(BgHakuginPost* this, BgHakuginPostFunc unkFunc, f32 arg2, s16
}
void func_80A9D360(BgHakuginPost* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_184)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_184, &this->dyna.actor);
- if (this->unk_186 >= 0) {
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->dyna.actor);
+ if (this->additionalCsId >= 0) {
func_80A9D3E4(this);
} else {
this->unkFunc(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->unk_184);
+ CutsceneManager_Queue(this->csId);
}
}
void func_80A9D3E4(BgHakuginPost* this) {
- this->unk_182 = ActorCutscene_GetLength(this->unk_186);
- if (this->unk_182 < 0) {
- this->unk_182 = 30;
+ this->additionalCsLength = CutsceneManager_GetLength(this->additionalCsId);
+ if (this->additionalCsLength < 0) {
+ this->additionalCsLength = 30;
}
this->actionFunc = func_80A9D434;
}
void func_80A9D434(BgHakuginPost* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_186) != 0) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_186, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->additionalCsId)) {
+ CutsceneManager_StartWithPlayerCs(this->additionalCsId, &this->dyna.actor);
this->unkFunc(this);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_186);
+ CutsceneManager_Queue(this->additionalCsId);
}
}
@@ -956,17 +956,17 @@ void BgHakuginPost_Update(Actor* thisx, PlayState* play) {
f32 temp;
func_80A9B46C(this, play);
- if ((this->unk_180 >= 0) && ((this->actionFunc != func_80A9D260) || (this->actionFunc != func_80A9D360))) {
- this->unk_180--;
- if (this->unk_180 < 0) {
- ActorCutscene_Stop(this->unk_184);
+ if ((this->csLength >= 0) && ((this->actionFunc != func_80A9D260) || (this->actionFunc != func_80A9D360))) {
+ this->csLength--;
+ if (this->csLength < 0) {
+ CutsceneManager_Stop(this->csId);
}
}
- if ((this->unk_182 >= 0) && (this->actionFunc != func_80A9D434)) {
- this->unk_182--;
- if (this->unk_182 < 0) {
- ActorCutscene_Stop(this->unk_186);
+ if ((this->additionalCsLength >= 0) && (this->actionFunc != func_80A9D434)) {
+ this->additionalCsLength--;
+ if (this->additionalCsLength < 0) {
+ CutsceneManager_Stop(this->additionalCsId);
}
}
@@ -1012,14 +1012,14 @@ void func_80A9D61C(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
for (i = 0; i < D_80A9E028.count; i++) {
unkStruct1 = &D_80A9E028.unk_0000[i];
- if (unkStruct1->unk_34 != 5 && unkStruct1->unk_34 != 4) {
+ if ((unkStruct1->unk_34 != 5) && (unkStruct1->unk_34 != 4)) {
sp68.x = unkStruct1->unk_14.x + this->dyna.actor.home.pos.x;
sp68.y = unkStruct1->unk_14.y + this->unk_16C;
sp68.z = unkStruct1->unk_14.z + this->dyna.actor.home.pos.z;
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.h b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.h
index 5a23fa070..4797a684a 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.h
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Post/z_bg_hakugin_post.h
@@ -19,8 +19,8 @@ typedef struct {
/* 0x20 */ f32 unk_20;
/* 0x24 */ f32 unk_24;
/* 0x28 */ s16 unk_28;
- /* 0x2A */ s16 unk_2A;
- /* 0x2C */ s16 unk_2C;
+ /* 0x2A */ s16 csId;
+ /* 0x2C */ s16 additionalCsId;
/* 0x2E */ u8 unk_2E;
/* 0x2F */ u8 unk_2F;
/* 0x30 */ s8 unk_30;
@@ -64,10 +64,10 @@ typedef struct BgHakuginPost {
/* 0x178 */ s8 unk_178;
/* 0x179 */ s8 unk_179;
/* 0x17C */ BgHakuginPostFunc unkFunc;
- /* 0x180 */ s16 unk_180;
- /* 0x182 */ s16 unk_182;
- /* 0x184 */ s16 unk_184;
- /* 0x186 */ s16 unk_186;
+ /* 0x180 */ s16 csLength;
+ /* 0x182 */ s16 additionalCsLength;
+ /* 0x184 */ s16 csId;
+ /* 0x186 */ s16 additionalCsId;
} BgHakuginPost; // size = 0x188
#endif // Z_BG_HAKUGIN_POST_H
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
index 3f7379d34..2d8fc2683 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
@@ -4,6 +4,7 @@
* Description: Goron Link Switch
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_hakugin_switch.h"
#include "z64rumble.h"
#include "objects/object_goronswitch/object_goronswitch.h"
@@ -77,7 +78,7 @@ typedef struct {
/* 0x0C */ f32 unk_C;
/* 0x10 */ Gfx* unk_10;
/* 0x14 */ u8 unk_14;
-} BgHakuginSwitchStruct;
+} BgHakuginSwitchStruct; // size = 0x18
BgHakuginSwitchStruct D_80B1688C[] = {
{ -156.0f, -178.0f, 6.0f, 10.0f, object_goronswitch_DL_000268, 0xB4 },
@@ -126,7 +127,7 @@ void BgHakuginSwitch_Init(Actor* thisx, PlayState* play) {
sp30 = false;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_goronswitch_Colheader_0005C8);
Collider_InitCylinder(play, &this->collider);
@@ -143,12 +144,12 @@ void BgHakuginSwitch_Init(Actor* thisx, PlayState* play) {
this->collider.dim.yShift = 0x1D;
this->unk_1A8 = object_goronswitch_DL_000268;
- this->unk_1B8 = this->dyna.actor.cutscene;
+ this->csId = this->dyna.actor.csId;
if (sp34 == 0) {
- this->unk_1BA = -1;
+ this->additionalCsId = CS_ID_NONE;
} else {
- this->unk_1BA = ActorCutscene_GetAdditionalCutscene(this->unk_1B8);
+ this->additionalCsId = CutsceneManager_GetAdditionalCsId(this->csId);
}
if (sp30) {
@@ -166,8 +167,8 @@ void BgHakuginSwitch_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain2);
this->unk_1A8 = D_80B1688C[sp34].unk_10;
- this->unk_1B8 = this->dyna.actor.cutscene;
- this->unk_1BA = ActorCutscene_GetAdditionalCutscene(this->unk_1B8);
+ this->csId = this->dyna.actor.csId;
+ this->additionalCsId = CutsceneManager_GetAdditionalCsId(this->csId);
if (sp30 == sp28) {
func_80B15F3C(this, play);
@@ -186,9 +187,9 @@ void BgHakuginSwitch_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
-void func_80B15A4C(BgHakuginSwitch* this, BgHakuginSwitchUnkFunc func, s32 arg2) {
+void func_80B15A4C(BgHakuginSwitch* this, BgHakuginSwitchUnkFunc func, s32 csId) {
this->unk_1B4 = func;
- this->unk_1BC = arg2;
+ this->curCsId = csId;
this->actionFunc = func_80B15A68;
}
@@ -197,14 +198,14 @@ void func_80B15A68(BgHakuginSwitch* this, PlayState* play) {
BgHakuginSwitchStruct* s = &D_80B1688C[BGHAKUGINSWITCH_GET_7(&this->dyna.actor)];
s32 sp18 = !(s->unk_14 & 0x40);
- if (ActorCutscene_GetCanPlayNext(this->unk_1BC)) {
+ if (CutsceneManager_IsNext(this->curCsId)) {
if (sp18) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_1BC, &this->dyna.actor);
+ CutsceneManager_StartWithPlayerCs(this->curCsId, &this->dyna.actor);
this->unk_1BF = 40;
}
this->unk_1B4(this, play);
} else if (sp18) {
- ActorCutscene_SetIntentToPlay(this->unk_1BC);
+ CutsceneManager_Queue(this->curCsId);
}
}
@@ -244,7 +245,7 @@ void func_80B15B74(BgHakuginSwitch* this, PlayState* play) {
if (sp34) {
this->collider.base.acFlags &= ~AC_HIT;
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
sp24 = true;
sp20 = sp28;
}
@@ -281,7 +282,7 @@ void func_80B15B74(BgHakuginSwitch* this, PlayState* play) {
D_80B16AF0 = play->gameplayFrames;
if (sp38->unk_14 & 0x10) {
- func_80B15A4C(this, func_80B15E0C, this->unk_1B8);
+ func_80B15A4C(this, func_80B15E0C, this->csId);
} else {
func_80B15E0C(this, play);
}
@@ -306,7 +307,7 @@ void func_80B15E78(BgHakuginSwitch* this, PlayState* play) {
BgHakuginSwitchStruct* sp20 = &D_80B1688C[BGHAKUGINSWITCH_GET_7(&this->dyna.actor)];
if (Math_StepToF(&this->dyna.actor.world.pos.y, sp20->unk_4 + this->dyna.actor.home.pos.y, sp20->unk_C)) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
}
func_80B15F3C(this, play);
@@ -343,7 +344,7 @@ void func_80B15F88(BgHakuginSwitch* this, PlayState* play) {
if (phi_a0 != phi_v1) {
if ((sp18->unk_14 & 0xFF) & 0x20) {
if (D_80B16AF0 < play->gameplayFrames) {
- func_80B15A4C(this, func_80B1606C, this->unk_1BA);
+ func_80B15A4C(this, func_80B1606C, this->additionalCsId);
}
} else {
func_80B1606C(this, play);
@@ -372,16 +373,16 @@ void func_80B160DC(BgHakuginSwitch* this, PlayState* play) {
}
}
-void func_80B16180(BgHakuginSwitch* this, BgHakuginSwitchUnkFunc func, s32 arg2, s32 arg3) {
+void func_80B16180(BgHakuginSwitch* this, BgHakuginSwitchUnkFunc func, s32 arg2, s32 csId) {
this->unk_1B4 = func;
this->unk_1BE = arg2;
- this->unk_1BC = arg3;
+ this->curCsId = csId;
this->actionFunc = func_80B161A0;
}
void func_80B161A0(BgHakuginSwitch* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_1BC)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_1BC, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->curCsId)) {
+ CutsceneManager_StartWithPlayerCs(this->curCsId, &this->dyna.actor);
if (this->unk_1BE != 0) {
Flags_SetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor));
} else {
@@ -390,7 +391,7 @@ void func_80B161A0(BgHakuginSwitch* this, PlayState* play) {
this->unk_1BF = 50;
this->unk_1B4(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_1BC);
+ CutsceneManager_Queue(this->curCsId);
}
}
@@ -413,7 +414,7 @@ void func_80B162AC(BgHakuginSwitch* this, PlayState* play) {
if (sp34) {
this->collider.base.acFlags &= ~AC_HIT;
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
sp24 = true;
sp28 = true;
}
@@ -427,7 +428,7 @@ void func_80B162AC(BgHakuginSwitch* this, PlayState* play) {
if (sp24) {
if (sp28) {
- func_80B16180(this, func_80B163C4, 1, this->unk_1B8);
+ func_80B16180(this, func_80B163C4, 1, this->csId);
} else {
func_80B163C4(this, play);
}
@@ -446,7 +447,7 @@ void func_80B163C4(BgHakuginSwitch* this, PlayState* play) {
void func_80B16400(BgHakuginSwitch* this, PlayState* play) {
if (Math_StepToF(&this->dyna.actor.world.pos.y,
(this->dyna.actor.home.pos.y + 2.0f) - (1800.0f * this->dyna.actor.scale.y), 10.0f)) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
}
func_80B16494(this, play);
@@ -466,7 +467,7 @@ void func_80B16494(BgHakuginSwitch* this, PlayState* play) {
void func_80B16520(BgHakuginSwitch* this, PlayState* play) {
if (!Flags_GetSwitch(play, BGHAKUGINSWITCH_GET_SWITCHFLAG(&this->dyna.actor))) {
if (BGHAKUGINSWITCH_GET_7(&this->dyna.actor) == BGHAKUGINSWITCH_GET_7_1) {
- func_80B16180(this, func_80B165A0, 0, this->unk_1BA);
+ func_80B16180(this, func_80B165A0, 0, this->additionalCsId);
} else {
func_80B165A0(this, play);
}
@@ -498,7 +499,7 @@ void BgHakuginSwitch_Update(Actor* thisx, PlayState* play) {
if ((this->actionFunc != func_80B15A68) && (this->actionFunc != func_80B161A0)) {
this->unk_1BF--;
if (this->unk_1BF == 0) {
- ActorCutscene_Stop(this->unk_1BC);
+ CutsceneManager_Stop(this->curCsId);
}
}
}
@@ -510,8 +511,8 @@ void BgHakuginSwitch_Update(Actor* thisx, PlayState* play) {
if (this->unk_1C0 != 0) {
f32 phi_f0;
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
- if (DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
+ if (DynaPolyActor_IsHeavySwitchPressed(&this->dyna)) {
phi_f0 = (sp24 - -10.0f) * -0.21f;
} else {
phi_f0 = (sp24 - -3.0f) * -0.08f;
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.h b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.h
index 164220b29..caf3c2f65 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.h
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.h
@@ -22,9 +22,9 @@ typedef struct BgHakuginSwitch {
/* 0x1B0 */ s16 unk_1B0;
/* 0x1B2 */ s8 unk_1B2;
/* 0x1B4 */ BgHakuginSwitchUnkFunc unk_1B4;
- /* 0x1B8 */ s16 unk_1B8;
- /* 0x1BA */ s16 unk_1BA;
- /* 0x1BC */ s16 unk_1BC;
+ /* 0x1B8 */ s16 csId;
+ /* 0x1BA */ s16 additionalCsId;
+ /* 0x1BC */ s16 curCsId;
/* 0x1BE */ s8 unk_1BE;
/* 0x1BF */ s8 unk_1BF;
/* 0x1C0 */ s8 unk_1C0;
diff --git a/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c b/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
index 27e5d2fee..50e99c1aa 100644
--- a/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
+++ b/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
@@ -96,8 +96,8 @@ void BgIcefloe_Grow(BgIcefloe* this, PlayState* play) {
Vec3f velocity;
Vec3f position;
- velocity.x = randPlusMinusPoint5Scaled(6.0f);
- velocity.z = randPlusMinusPoint5Scaled(6.0f);
+ velocity.x = Rand_CenteredFloat(6.0f);
+ velocity.z = Rand_CenteredFloat(6.0f);
velocity.y = Rand_ZeroFloat(4.0f) + 4.0f;
this->dyna.actor.scale.x += (0.65f * 0.01f);
this->dyna.actor.scale.z += (0.65f * 0.01f);
@@ -121,13 +121,13 @@ void func_80AC4C34(BgIcefloe* this, PlayState* play) {
WaterBox* water;
this->timer--;
- if (this->timer == 0 ||
+ if ((this->timer == 0) ||
!WaterBox_GetSurface1_2(play, &play->colCtx, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.z,
&this->dyna.actor.home.pos.y, &water)) {
func_80AC4CF0(this);
} else {
this->dyna.actor.world.pos.y =
- (sin_rad(this->timer * (M_PI / 30.0f)) * 3.0f) + (this->dyna.actor.home.pos.y + 10.0f);
+ (Math_SinF(this->timer * (M_PI / 30.0f)) * 3.0f) + (this->dyna.actor.home.pos.y + 10.0f);
}
}
@@ -144,8 +144,8 @@ void func_80AC4D2C(BgIcefloe* this, PlayState* play) {
Vec3f position;
velocity.y = (this->timer - 38) * (1 / 12.0f);
- velocity.x = randPlusMinusPoint5Scaled(1.5f) * velocity.y;
- velocity.z = randPlusMinusPoint5Scaled(1.5f) * velocity.y;
+ velocity.x = Rand_CenteredFloat(1.5f) * velocity.y;
+ velocity.z = Rand_CenteredFloat(1.5f) * velocity.y;
velocity.y += 0.8f;
position.x = this->dyna.actor.world.pos.x + (2.0f * velocity.x);
position.z = this->dyna.actor.world.pos.z + (2.0f * velocity.z);
diff --git a/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c b/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
index 5a16e6845..a8eea2641 100644
--- a/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
+++ b/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
@@ -109,12 +109,12 @@ void BgIcicle_Break(BgIcicle* this, PlayState* play, f32 arg2) {
for (i = 0; i < 2; i++) {
for (j = 0; j < 10; j++) {
- pos.x = this->dyna.actor.world.pos.x + randPlusMinusPoint5Scaled(8.0f);
+ pos.x = this->dyna.actor.world.pos.x + Rand_CenteredFloat(8.0f);
pos.y = this->dyna.actor.world.pos.y + (Rand_ZeroOne() * arg2) + (i * arg2);
- pos.z = this->dyna.actor.world.pos.z + randPlusMinusPoint5Scaled(8.0f);
+ pos.z = this->dyna.actor.world.pos.z + Rand_CenteredFloat(8.0f);
- velocity.x = randPlusMinusPoint5Scaled(7.0f);
- velocity.z = randPlusMinusPoint5Scaled(7.0f);
+ velocity.x = Rand_CenteredFloat(7.0f);
+ velocity.z = Rand_CenteredFloat(7.0f);
velocity.y = (Rand_ZeroOne() * 4.0f) + 8.0f;
EffectSsEnIce_Spawn(play, &pos, (Rand_ZeroOne() * 0.2f) + 0.1f, &velocity, &accel, &primColor, &envColor,
@@ -150,7 +150,7 @@ void BgIcicle_Shiver(BgIcicle* this, PlayState* play) {
this->dyna.actor.world.pos.z = this->dyna.actor.home.pos.z;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = BgIcicle_Fall;
} else {
rand = Rand_ZeroOne();
@@ -175,7 +175,7 @@ void BgIcicle_Fall(BgIcicle* this, PlayState* play) {
if (this->dyna.actor.params == ICICLE_STALACTITE_REGROW) {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 120.0f;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = BgIcicle_Regrow;
} else {
Actor_Kill(&this->dyna.actor);
@@ -183,7 +183,7 @@ void BgIcicle_Fall(BgIcicle* this, PlayState* play) {
} else {
Actor_MoveWithGravity(&this->dyna.actor);
this->dyna.actor.world.pos.y += 40.0f;
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->dyna.actor.world.pos.y -= 40.0f;
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
@@ -216,7 +216,7 @@ void BgIcicle_UpdateAttacked(BgIcicle* this, PlayState* play) {
if (this->dyna.actor.params == ICICLE_STALACTITE_REGROW) {
BgIcicle_Break(this, play, 40.0f);
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 120.0f;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = BgIcicle_Regrow;
return;
}
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c b/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
index b6206ecb7..93d605320 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Block/z_bg_ikana_block.c
@@ -184,9 +184,9 @@ void BgIkanaBlock_Init(Actor* thisx, PlayState* play) {
BgIkanaBlock* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gameplay_dangeon_keep_Colheader_007498);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->unk_15C = Lib_SegmentedToVirtual(gameplay_dangeon_keep_Matanimheader_01B370);
this->unk_174 = this->dyna.actor.shape.rot;
func_80B7ED54(this);
@@ -211,7 +211,7 @@ void func_80B7F034(BgIkanaBlock* this, PlayState* play) {
}
if (func_80B7EEB4(this, play)) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = func_80B7F564;
func_80B7F0A4(this);
}
@@ -336,8 +336,8 @@ void func_80B7F398(BgIkanaBlock* this, PlayState* play) {
if (func_80B7EE70(this, play)) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
Actor_PlaySfx(&this->dyna.actor,
- SurfaceType_GetSfx(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) +
- SFX_FLAG);
+ NA_SE_PL_WALK_GROUND + SurfaceType_GetSfxOffset(&play->colCtx, this->dyna.actor.floorPoly,
+ this->dyna.actor.floorBgId));
func_80B7F0A4(this);
}
}
@@ -358,13 +358,13 @@ void BgIkanaBlock_Update(Actor* thisx, PlayState* play) {
if (this->unk_17E != 0) {
if (this->unk_17F > 0) {
this->unk_17F--;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->unk_17E = 0;
- } else if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ } else if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->unk_17F = 30;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
}
@@ -375,7 +375,7 @@ void func_80B7F564(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, this->unk_15C, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.c b/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.c
index 04f7f514b..edcda4b37 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Bombwall/z_bg_ikana_bombwall.c
@@ -319,13 +319,13 @@ void func_80BD4F9C(BgIkanaBombwall* this, PlayState* play) {
void func_80BD4FF8(BgIkanaBombwall* this) {
this->dyna.actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = func_80BD503C;
}
void func_80BD503C(BgIkanaBombwall* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
if (!BGIKANABOMBWALL_GET_100(&this->dyna.actor)) {
func_80BD4720(this, play);
} else {
@@ -335,11 +335,11 @@ void func_80BD503C(BgIkanaBombwall* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 60, NA_SE_EV_WALL_BROKEN);
Flags_SetSwitch(play, BGIKANABOMBWALL_GET_SWITCHFLAG(&this->dyna.actor));
if (!BGIKANABOMBWALL_GET_100(&this->dyna.actor)) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
func_80BD5118(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -352,11 +352,11 @@ void func_80BD5134(BgIkanaBombwall* this, PlayState* play) {
if (!BGIKANABOMBWALL_GET_100(&this->dyna.actor)) {
this->unk_1AC--;
if (this->unk_1AC <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
}
- } else if (this->dyna.actor.cutscene >= 0) {
- if (ActorCutscene_GetCurrentIndex() != this->dyna.actor.cutscene) {
+ } else if (this->dyna.actor.csId >= 0) {
+ if (CutsceneManager_GetCurrentCsId() != this->dyna.actor.csId) {
Actor_Kill(&this->dyna.actor);
}
} else {
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
index 9fa7077f8..4646b8d45 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c
@@ -115,7 +115,7 @@ void BgIkanaDharma_Init(Actor* thisx, PlayState* play2) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_BG_IKANA_DHARMA, this->dyna.actor.world.pos.x,
segmentY, this->dyna.actor.world.pos.z, this->dyna.actor.shape.rot.x,
this->dyna.actor.shape.rot.y, this->dyna.actor.shape.rot.z,
- BGIKANADHARMA_PARAMS(0, true, 0), this->dyna.actor.cutscene,
+ BGIKANADHARMA_PARAMS(0, true, 0), this->dyna.actor.csId,
this->dyna.actor.halfDaysBits, NULL);
}
@@ -151,7 +151,7 @@ void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_HIT;
}
- if (wasHit && sFirstHitBgIkanaDharma == NULL) {
+ if (wasHit && (sFirstHitBgIkanaDharma == NULL)) {
sFirstHitBgIkanaDharma = this2;
Flags_SetSwitch(play, BGIKANADHARMA_GET_SWITCHFLAG(&this->dyna.actor));
tempAngle1 = BINANG_ADD(this->dyna.actor.yawTowardsPlayer, 0x8000);
@@ -160,8 +160,8 @@ void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
this->dyna.actor.speed = 20.0f;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DARUMA_VANISH);
BgIkanaDharma_SetupStartCutscene(this);
- } else if ((this->dyna.actor.flags & ACTOR_FLAG_40) == ACTOR_FLAG_40 && sFirstHitBgIkanaDharma == NULL &&
- this->dyna.actor.xzDistToPlayer < 420.0f) {
+ } else if (CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_40) && (sFirstHitBgIkanaDharma == NULL) &&
+ (this->dyna.actor.xzDistToPlayer < 420.0f)) {
tempAngle1 = BINANG_SUB(this->dyna.actor.yawTowardsPlayer, player->actor.shape.rot.y);
tempAngle1 = ABS_ALT(tempAngle1);
@@ -173,16 +173,16 @@ void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
}
void BgIkanaDharma_SetupStartCutscene(BgIkanaDharma* this) {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = BgIkanaDharma_StartCutscene;
}
void BgIkanaDharma_StartCutscene(BgIkanaDharma* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
BgIkanaDharma_SetupWaitForCutsceneToEnd(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -200,7 +200,7 @@ void BgIkanaDharma_WaitForCutsceneToEnd(BgIkanaDharma* this, PlayState* play) {
sFirstHitBgIkanaDharma = NULL;
}
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
@@ -226,13 +226,13 @@ void BgIkanaDharma_Update(Actor* thisx, PlayState* play) {
actorBelow = DynaPoly_GetActor(&play->colCtx, this->dyna.actor.floorBgId);
if (actorBelow == NULL) {
Actor_MoveWithGravity(&this->dyna.actor);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 21536);
- Quake_SetQuakeValues(quakeIndex, 4, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 4, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
}
@@ -250,7 +250,8 @@ void BgIkanaDharma_Update(Actor* thisx, PlayState* play) {
wallCheckRadius = CLAMP_MIN(wallCheckRadius, 2.0f);
Actor_MoveWithGravity(&this->dyna.actor);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 20.0f, wallCheckRadius, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 20.0f, wallCheckRadius, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
Actor_SetFocus(&this->dyna.actor, 40.0f);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c b/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
index 5fc28c5a5..02ba3b1f4 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Mirror/z_bg_ikana_mirror.c
@@ -380,8 +380,9 @@ void BgIkanaMirror_Draw(Actor* thisx, PlayState* play) {
BgIkanaMirror* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gStoneTowerTempleMirrorDL);
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
index 27ca91c95..ad2d9fbdd 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c
@@ -116,9 +116,9 @@ Vec3f D_80B8216C = { 225.0f, -280.0f, -210.0f };
Vec3f D_80B82178 = { -255.0f, -280.0f, 210.0f };
typedef struct {
- /* 0x00 */ s8 unk_00;
- /* 0x01 */ s8 unk_01;
- /* 0x04 */ Vec3f unk_04;
+ /* 0x0 */ s8 unk_00;
+ /* 0x1 */ s8 unk_01;
+ /* 0x4 */ Vec3f unk_04;
} BgIkanaRotaryroomStruct4; // size = 0x10
BgIkanaRotaryroomStruct4 D_80B82184[2][2] = {
@@ -179,7 +179,7 @@ void func_80B80440(BgIkanaRotaryroom* this, PlayState* play) {
this->unk_204.unk_00 = Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, ACTOR_BG_IKANA_BLOCK, sp50.x, sp50.y, sp50.z, this->dyna.actor.shape.rot.x,
this->dyna.actor.shape.rot.y, this->dyna.actor.shape.rot.z, -1,
- ActorCutscene_GetAdditionalCutscene(this->dyna.actor.cutscene), this->dyna.actor.halfDaysBits, NULL);
+ CutsceneManager_GetAdditionalCsId(this->dyna.actor.csId), this->dyna.actor.halfDaysBits, NULL);
Matrix_Pop();
}
@@ -515,7 +515,7 @@ void func_80B81010(BgIkanaRotaryroom* this, PlayState* play) {
CollisionPoly* sp7C;
s32 sp78;
- if (ActorCutscene_GetCurrentIndex() == this->dyna.actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() == this->dyna.actor.csId) {
phi_s7 = true;
for (i = 0; i < ARRAY_COUNT(this->unk_3E0); i++) {
@@ -582,7 +582,7 @@ void func_80B81234(BgIkanaRotaryroom* this, PlayState* play) {
CollisionPoly* sp40;
s32 sp3C;
- if (ActorCutscene_GetCurrentIndex() == this->dyna.actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() == this->dyna.actor.csId) {
if (player == NULL) {
return;
}
@@ -646,7 +646,7 @@ void func_80B81234(BgIkanaRotaryroom* this, PlayState* play) {
void func_80B814B8(BgIkanaRotaryroom* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCurrentIndex() == this->dyna.actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() == this->dyna.actor.csId) {
if (player->actor.bgCheckFlags & BGCHECKFLAG_CRUSHED) {
Player_PlaySfx(player, NA_SE_VO_LI_DAMAGE_S + player->ageProperties->voiceSfxIdOffset);
func_80169EFC(&play->state);
@@ -714,7 +714,7 @@ void BgIkanaRotaryroom_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.x = 0;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, D_80B82218[sp34]);
Collider_InitJntSph(play, &this->collider);
@@ -791,14 +791,14 @@ void func_80B819DC(BgIkanaRotaryroom* this) {
void func_80B819F0(Actor* thisx, PlayState* play) {
BgIkanaRotaryroom* this = THIS;
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
- if (this->dyna.actor.cutscene >= 0) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
+ if (this->dyna.actor.csId >= 0) {
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
}
func_80B81A64(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -832,11 +832,11 @@ void func_80B81A80(Actor* thisx, PlayState* play) {
func_80B81B84(this);
} else if (this->unk_584 == 15) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, 6, 0, 100, 0);
- Quake_SetCountdown(quakeIndex, 22);
+ Quake_SetPerturbations(quakeIndex, 6, 0, 100, 0);
+ Quake_SetDuration(quakeIndex, 22);
}
}
@@ -859,11 +859,11 @@ void func_80B81BA0(Actor* thisx, PlayState* play) {
thisx->shape.rot.x += 0x1F4;
if (!(this->unk_584 & 7)) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, (s32)(Rand_ZeroOne() * 2.5f) + 3, 0, 10, 0);
- Quake_SetCountdown(quakeIndex, 15);
+ Quake_SetPerturbations(quakeIndex, (s32)(Rand_ZeroOne() * 2.5f) + 3, 0, 10, 0);
+ Quake_SetDuration(quakeIndex, 15);
}
if (Flags_GetSwitch(play, BGIKANAROTARYROOM_GET_FE(&this->dyna.actor))) {
@@ -926,14 +926,14 @@ void func_80B81DC8(Actor* thisx, PlayState* play) {
this->unk_584--;
if (this->unk_584 <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
func_80B818B4(this);
} else if (this->unk_584 == 19) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 5, 0, 40, 60);
- Quake_SetCountdown(quakeIndex, 17);
+ Quake_SetPerturbations(quakeIndex, 5, 0, 40, 60);
+ Quake_SetDuration(quakeIndex, 17);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
index a7ba89cdc..4a0abb472 100644
--- a/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
+++ b/src/overlays/actors/ovl_Bg_Ikana_Shutter/z_bg_ikana_shutter.c
@@ -106,12 +106,12 @@ void func_80BD5878(BgIkanaShutter* this) {
}
void func_80BD5894(BgIkanaShutter* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
func_80BD58F0(this);
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
void func_80BD58F0(BgIkanaShutter* this) {
@@ -151,10 +151,10 @@ void func_80BD5A18(BgIkanaShutter* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.978f;
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 21536);
- Quake_SetQuakeValues(quakeIndex, 4, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 12);
+ Quake_SetPerturbations(quakeIndex, 4, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 12);
func_80BD5828(this);
}
@@ -177,13 +177,13 @@ void func_80BD5B44(BgIkanaShutter* this) {
}
void func_80BD5B60(BgIkanaShutter* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
Flags_SetClear(play, this->dyna.actor.room);
func_80BD5BC4(this);
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
void func_80BD5BC4(BgIkanaShutter* this) {
diff --git a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
index a9070cb8b..6ce5f7d81 100644
--- a/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
+++ b/src/overlays/actors/ovl_Bg_Iknin_Susceil/z_bg_iknin_susceil.c
@@ -62,26 +62,27 @@ s32 func_80C0A740(BgIkninSusceil* this, PlayState* play) {
}
void func_80C0A804(BgIkninSusceil* this, PlayState* play) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
void func_80C0A838(BgIkninSusceil* this, PlayState* play) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
-void func_80C0A86C(BgIkninSusceil* this, PlayState* play, s16 verticalMag, s16 countdown, s32 arg4) {
+void BgIkninSusceil_RequestQuakeAndRumble(BgIkninSusceil* this, PlayState* play, s16 quakeY, s16 quakeDuration,
+ s32 rumbleType) {
s32 pad;
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 31536);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetPerturbations(quakeIndex, quakeY, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, quakeDuration);
- if (arg4 == 1) {
+ if (rumbleType == 1) {
Rumble_Request(SQ(100.0f), 255, 20, 150);
- } else if (arg4 == 2) {
+ } else if (rumbleType == 2) {
Rumble_Request(SQ(100.0f), 180, 20, 100);
- } else if (arg4 == 3) {
+ } else if (rumbleType == 3) {
Rumble_Request(SQ(100.0f), 120, 20, 10);
}
}
@@ -92,7 +93,10 @@ s32 func_80C0A95C(BgIkninSusceil* this, PlayState* play) {
f32 new_var;
Player* player = GET_PLAYER(play);
Vec3f offset;
- f32 temp1, temp2, temp3, temp4;
+ f32 temp1;
+ f32 temp2;
+ f32 temp3;
+ f32 temp4;
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
for (i = 0; i < 7; i++) {
@@ -115,7 +119,7 @@ void BgIkninSusceil_Init(Actor* thisx, PlayState* play) {
BgIkninSusceil* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_ikninside_obj_Colheader_00CBAC);
this->animatedTexture = Lib_SegmentedToVirtual(object_ikninside_obj_Matanimheader_00C670);
func_80C0AC74(this);
@@ -154,7 +158,7 @@ void func_80C0ABA8(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.93f;
this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
if (this->dyna.actor.world.pos.y <= this->dyna.actor.home.pos.y) {
- func_80C0A86C(this, play, 4, 14, 1);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 4, 14, 1);
Flags_UnsetSwitch(play, SUSCEIL_GET_SWITCHFLAG(&this->dyna.actor));
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
func_80C0AC74(this);
@@ -179,11 +183,11 @@ void func_80C0ACD4(BgIkninSusceil* this) {
}
void func_80C0ACE8(BgIkninSusceil* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
func_80C0AD44(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -197,8 +201,8 @@ void func_80C0AD64(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y *= 0.98f;
if (Math_SmoothStepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 365.0f, 0.5f,
this->dyna.actor.velocity.y, 1.0f) < 0.1f) {
- func_80C0A86C(this, play, 1, 14, 3);
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 1, 14, 3);
+ CutsceneManager_Stop(this->dyna.actor.csId);
func_80C0AB14(this);
} else {
func_800B9010(&this->dyna.actor, NA_SE_EV_ICE_PILLAR_RISING - SFX_FLAG);
@@ -216,7 +220,7 @@ void func_80C0AE5C(BgIkninSusceil* this, PlayState* play) {
this->dyna.actor.velocity.y = CLAMP_MIN(this->dyna.actor.velocity.y, 1.0f);
this->dyna.actor.world.pos.y = this->dyna.actor.world.pos.y + this->dyna.actor.velocity.y;
if ((this->dyna.actor.home.pos.y + 365.0f) < this->dyna.actor.world.pos.y) {
- func_80C0A86C(this, play, 3, 14, 2);
+ BgIkninSusceil_RequestQuakeAndRumble(this, play, 3, 14, 2);
func_80C0AB14(this);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
index 6016b2e44..07968e801 100644
--- a/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
+++ b/src/overlays/actors/ovl_Bg_Ikninside/z_bg_ikninside.c
@@ -80,16 +80,16 @@ void func_80C07220(BgIkninside* this, PlayState* play) {
}
void func_80C07230(BgIkninside* this, PlayState* play) {
- if (this->dyna.actor.cutscene == -1) {
+ if (this->dyna.actor.csId == CS_ID_NONE) {
this->actionFunc = func_80C07220;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->dyna.actor.csId);
+ } else if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->actionFunc = func_80C07220;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -121,7 +121,7 @@ void func_80C072D0(BgIkninside* this, PlayState* play) {
Flags_SetSwitch(play, DMIKNINSIDE_GET_SWITCH(&this->dyna.actor));
this->actionFunc = func_80C07230;
this->dyna.actor.draw = NULL;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
this->timer = 20;
}
@@ -150,7 +150,7 @@ void BgIkninside_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_ikninside_obj_DL_00CC78);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
index 9cbfaec61..84bdc4169 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
@@ -51,9 +51,9 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
switch (BGIKNVDOUKUTU_GET_F(&this->dyna.actor)) {
case BGIKNVDOUKUTU_F_0:
this->actionFunc = func_80BD71BC;
- this->csAction = 0x204;
+ this->cueType = CS_CMD_ACTOR_CUE_516;
this->unk_160 = 1.0f;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
this->dyna.actor.draw = func_80BD7768;
this->actionFunc = func_80BD73D0;
play->envCtx.lightSettingOverride = 25;
@@ -65,7 +65,7 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
case BGIKNVDOUKUTU_F_1:
Actor_SetScale(&this->dyna.actor, 1.0f);
this->dyna.actor.draw = func_80BD7820;
- this->csAction = 0x204;
+ this->cueType = CS_CMD_ACTOR_CUE_516;
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_012788, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
@@ -75,7 +75,7 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
break;
case BGIKNVDOUKUTU_F_2:
- this->csAction = 0x204;
+ this->cueType = CS_CMD_ACTOR_CUE_516;
this->dyna.actor.draw = func_80BD78C4;
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_0117C8, &colHeader);
@@ -116,8 +116,8 @@ void func_80BD716C(BgIknvDoukutu* this, PlayState* play) {
void func_80BD71BC(BgIknvDoukutu* this, PlayState* play) {
play->envCtx.lightSettingOverride = 24;
- if (Cutscene_CheckActorAction(play, this->csAction) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 2)) {
this->actionFunc = func_80BD716C;
this->dyna.actor.draw = func_80BD7538;
}
@@ -135,8 +135,8 @@ void func_80BD7250(BgIknvDoukutu* this, PlayState* play) {
}
void func_80BD72BC(BgIknvDoukutu* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, this->csAction) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 3)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 3)) {
this->actionFunc = func_80BD7250;
}
@@ -146,8 +146,8 @@ void func_80BD72BC(BgIknvDoukutu* this, PlayState* play) {
}
void func_80BD7360(BgIknvDoukutu* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, this->csAction) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 2)) {
this->actionFunc = func_80BD72BC;
}
}
@@ -172,8 +172,8 @@ void BgIknvDoukutu_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_00DDD8);
@@ -205,9 +205,9 @@ void func_80BD7538(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(255.0f * sp54));
gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_00DDD8);
@@ -226,7 +226,7 @@ void func_80BD7768(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_010D98);
@@ -243,7 +243,7 @@ void func_80BD7820(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_012700);
@@ -261,7 +261,7 @@ void func_80BD78C4(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, (s32)(140.0f * sp30));
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
index f36393869..643be076c 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
+++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
@@ -9,16 +9,16 @@ typedef void (*BgIknvDoukutuActionFunc)(struct BgIknvDoukutu*, PlayState*);
#define BGIKNVDOUKUTU_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
- BGIKNVDOUKUTU_F_0,
- BGIKNVDOUKUTU_F_1,
- BGIKNVDOUKUTU_F_2,
-};
+typedef enum {
+ /* 0 */ BGIKNVDOUKUTU_F_0,
+ /* 1 */ BGIKNVDOUKUTU_F_1,
+ /* 2 */ BGIKNVDOUKUTU_F_2
+} BgIknvDoukutuParam;
typedef struct BgIknvDoukutu {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ s16 unk_15C; // set and not used
- /* 0x15E */ u16 csAction;
+ /* 0x15E */ u16 cueType;
/* 0x160 */ f32 unk_160;
/* 0x164 */ BgIknvDoukutuActionFunc actionFunc;
} BgIknvDoukutu;// size = 0x168
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
index 2651c52bc..de6be9266 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
@@ -107,20 +107,20 @@ void BgIknvObj_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80BD7CEC(BgIknvObj* this) {
- if (this->dyna.actor.cutscene == -1) {
+ if (this->dyna.actor.csId == CS_ID_NONE) {
return true;
}
- if (ActorCutscene_GetCurrentIndex() == this->dyna.actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() == this->dyna.actor.csId) {
return true;
}
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
return true;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
return false;
}
@@ -131,8 +131,8 @@ void BgIknvObj_UpdateWaterwheel(BgIknvObj* this, PlayState* play) {
func_800B9010(&this->dyna.actor, NA_SE_EV_WOOD_WATER_WHEEL - SFX_FLAG);
}
- if ((play->csCtx.state != 0) && (gSaveContext.sceneLayer == 1) && (play->csCtx.currentCsIndex == 4) &&
- (play->csCtx.frames == 1495)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (gSaveContext.sceneLayer == 1) && (play->csCtx.scriptIndex == 4) &&
+ (play->csCtx.curFrame == 1495)) {
func_8019F128(NA_SE_EV_DOOR_UNLOCK);
}
}
@@ -166,7 +166,7 @@ void func_80BD7F4C(BgIknvObj* this, PlayState* play) {
this->actionFunc = func_80BD7ED8;
}
if ((this->dyna.actor.home.rot.x == 1) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_58_80)) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->dyna.actor.home.rot.x = 0;
}
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -211,8 +211,10 @@ void BgIknvObj_Draw(Actor* thisx, PlayState* play) {
BgIknvObj* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->displayListPtr);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
index a5c01165d..266ec81f2 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
+++ b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
@@ -19,7 +19,7 @@ typedef struct BgIknvObj {
typedef enum {
/* 0 */ IKNV_OBJ_WATERWHEEL,
/* 1 */ IKNV_OBJ_RAISED_DOOR, // defunct door covering entrance to Stone Tower
- /* 2 */ IKNV_OBJ_SAKON_DOOR, // door to Sakon's Hideout
+ /* 2 */ IKNV_OBJ_SAKON_DOOR // door to Sakon's Hideout
} BgIknvObjType;
#endif // Z_BG_IKNV_OBJ_H
diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
index c1cc4daa6..2796aed7e 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
@@ -126,7 +126,7 @@ s32 func_80953DA8(BgIngate* this, PlayState* play) {
Camera* mainCam = Play_GetCamera(play, CAM_ID_MAIN);
if (CHECK_EVENTINF(EVENTINF_35)) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
} else {
SET_EVENTINF(EVENTINF_41);
}
@@ -169,7 +169,7 @@ void func_80953F14(BgIngate* this, PlayState* play) {
if (this->timePath != NULL) {
func_80953B40(this);
}
- this->unk16E = -1;
+ this->csId = CS_ID_NONE;
this->actionFunc = func_80953F9C;
}
@@ -190,9 +190,9 @@ void func_80953F9C(BgIngate* this, PlayState* play) {
if (this->unk160 & 2) {
- if (this->timePath->unk1 != 0xFF) {
+ if (this->timePath->additionalPathIndex != ADDITIONAL_PATH_INDEX_NONE) {
func_80953E38(play);
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
this->dyna.actor.textId = 0x9E4;
Message_StartTextbox(play, this->dyna.actor.textId, NULL);
this->unk16C += 1;
@@ -206,13 +206,13 @@ void func_80953F9C(BgIngate* this, PlayState* play) {
}
this->actionFunc = func_809542A0;
}
- } else if ((ActorCutscene_GetCurrentIndex() == -1) && (this->timePath != NULL)) {
+ } else if ((CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (this->timePath != NULL)) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_CRUISER - SFX_FLAG);
func_80953BEC(this);
}
}
- if (ActorCutscene_GetCurrentIndex() != this->unk16E) {
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != this->csId) {
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
Camera_ChangeSetting(mainCam, CAM_SET_NORMAL0);
player->stateFlags1 |= PLAYER_STATE1_20;
play->actorCtx.flags &= ~ACTORCTX_FLAG_PICTO_BOX_ON;
@@ -221,7 +221,7 @@ void func_80953F9C(BgIngate* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
}
}
- this->unk16E = ActorCutscene_GetCurrentIndex();
+ this->csId = CutsceneManager_GetCurrentCsId();
}
void func_809541B8(BgIngate* this, PlayState* play) {
@@ -231,13 +231,13 @@ void func_809541B8(BgIngate* this, PlayState* play) {
if ((player->transformation == PLAYER_FORM_HUMAN) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(this->dyna.actor.xzDistToPlayer < 40.0f)) {
if (this->dyna.actor.playerHeightRel > 15.0f) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
this->dyna.actor.textId = 0x9E6;
Message_StartTextbox(play, this->dyna.actor.textId, NULL);
this->actionFunc = func_809543D4;
}
}
- } else if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ } else if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->unk160 |= 4;
}
}
@@ -259,10 +259,10 @@ void func_809542A0(BgIngate* this, PlayState* play) {
}
void func_80954340(BgIngate* this, PlayState* play) {
- if (!DECR(this->unk16A)) {
+ if (DECR(this->unk16A) == 0) {
if (this->timePath != NULL) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
- this->timePath = &play->setupPathList[this->timePath->unk1];
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
+ this->timePath = &play->setupPathList[this->timePath->additionalPathIndex];
func_80953F14(this, play);
Environment_StopTime();
}
@@ -280,14 +280,14 @@ void func_809543D4(BgIngate* this, PlayState* play) {
break;
case 0x9E5:
if (play->msgCtx.choiceIndex == 0) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
this->unk160 &= ~0x4;
this->actionFunc = func_809541B8;
Environment_StartTime();
func_8019F208();
} else {
if (this->timePath != NULL) {
- this->timePath = &play->setupPathList[this->timePath->unk1];
+ this->timePath = &play->setupPathList[this->timePath->additionalPathIndex];
}
func_80953F14(this, play);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
@@ -301,7 +301,7 @@ void func_809543D4(BgIngate* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
func_8019F208();
} else {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
this->unk160 &= ~0x4;
this->actionFunc = func_809541B8;
Environment_StartTime();
@@ -322,15 +322,15 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
Vec3f sp20;
if (BgIngate_FindActor(this, play, ACTORCAT_BG, ACTOR_BG_INGATE) == NULL) {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &gSichitaiBoatCol);
this->unk160 = 0;
this->unk160 |= 0x8;
this->unk160 |= 0x10;
Actor_SetScale(&this->dyna.actor, 1.0f);
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), 0);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), 0);
this->dyna.actor.room = -1;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
}
if (!CHECK_EVENTINF(EVENTINF_35) && CHECK_WEEKEVENTREG(WEEKEVENTREG_90_40)) {
@@ -350,7 +350,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
this->actionFunc = func_80953F8C;
}
}
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), phi_a2);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), phi_a2);
if (this->timePath != NULL) {
sp38 = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp2C, &sp38[0]);
@@ -361,7 +361,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
this->dyna.actor.world.pos.y = -15.0f;
this->dyna.actor.world.pos.z = sp2C.z;
}
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), 0);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), 0);
} else {
Actor_Kill(&this->dyna.actor);
}
@@ -384,7 +384,7 @@ void BgIngate_Update(Actor* thisx, PlayState* play) {
void BgIngate_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSichitaiBoat);
diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
index cc0befd19..bf272f342 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
@@ -7,7 +7,7 @@ struct BgIngate;
typedef void (*BgIngateActionFunc)(struct BgIngate*, PlayState*);
-#define BGINGATE_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define BGINGATE_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct BgIngate {
/* 0x000 */ DynaPolyActor dyna;
@@ -17,7 +17,7 @@ typedef struct BgIngate {
/* 0x168 */ s16 timePathTimeSpeed;
/* 0x16A */ s16 unk16A;
/* 0x16C */ s16 unk16C;
- /* 0x16E */ s16 unk16E;
+ /* 0x16E */ s16 csId;
/* 0x170 */ Vec3f timePathTargetPos;
/* 0x17C */ f32 timePathProgress;
/* 0x180 */ s32 timePathTotalTime;
diff --git a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
index 1b1deb6c2..2eac2ed07 100644
--- a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
@@ -39,7 +39,7 @@ void BgInibsMovebg_Init(Actor* thisx, PlayState* play) {
BgInibsMovebg* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
this->opaDList = sOpaDLists[BG_INIBS_MOVEBG_GET_MODE(thisx)];
this->xluDList = sXluDLists[BG_INIBS_MOVEBG_GET_MODE(thisx)];
diff --git a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
index 282a43925..ff0227f70 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Saku/z_bg_keikoku_saku.c
@@ -94,7 +94,7 @@ void BgKeikokuSaku_Update(Actor* thisx, PlayState* play) {
void BgKeikokuSaku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, object_keikoku_obj_DL_001640);
diff --git a/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
index 8246a0298..ac9d089a4 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_bg_keikoku_spr.c
+ * Overlay: ovl_Bg_Keikoku_Spr
+ * Description: Termina Field Fountain Water
+ */
+
#include "z_bg_keikoku_spr.h"
#include "objects/object_keikoku_obj/object_keikoku_obj.h"
@@ -10,7 +16,6 @@ void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Update(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play);
-/*
const ActorInit Bg_Keikoku_Spr_InitVars = {
ACTOR_BG_KEIKOKU_SPR,
ACTORCAT_PROP,
@@ -20,14 +25,42 @@ const ActorInit Bg_Keikoku_Spr_InitVars = {
(ActorFunc)BgKeikokuSpr_Init,
(ActorFunc)BgKeikokuSpr_Destroy,
(ActorFunc)BgKeikokuSpr_Update,
- (ActorFunc)BgKeikokuSpr_Draw
+ (ActorFunc)BgKeikokuSpr_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Init.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_CONTINUE),
+ ICHAIN_VEC3F_DIV1000(scale, 20, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Destroy.s")
+void BgKeikokuSpr_Init(Actor* thisx, PlayState* play) {
+ BgKeikokuSpr* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Update.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Draw.s")
+void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Update(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0001F8));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000100);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0003F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000300);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0005F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000500);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
index 2da4ddcee..a868b355c 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Bombwall/z_bg_kin2_bombwall.c
@@ -171,7 +171,7 @@ void BgKin2Bombwall_SetupWait(BgKin2Bombwall* this) {
void BgKin2Bombwall_Wait(BgKin2Bombwall* this, PlayState* play) {
if (BgKin2Bombwall_IsHitFromNearby(this, play)) {
this->collider.base.acFlags &= ~AC_HIT;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
BgKin2Bombwall_SetupPlayCutscene(this);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -183,17 +183,17 @@ void BgKin2Bombwall_SetupPlayCutscene(BgKin2Bombwall* this) {
}
void BgKin2Bombwall_PlayCutscene(BgKin2Bombwall* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
Flags_SetSwitch(play, BG_KIN2_BOMBWALL_SWITCH_FLAG(&this->dyna.actor));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 60, NA_SE_EV_WALL_BROKEN);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
BgKin2Bombwall_SpawnEffects(this, play);
BgKin2Bombwall_SetupEndCutscene(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -205,7 +205,7 @@ void BgKin2Bombwall_SetupEndCutscene(BgKin2Bombwall* this) {
void BgKin2Bombwall_EndCutscene(BgKin2Bombwall* this, PlayState* play) {
this->timer--;
if (this->timer <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
}
}
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
index dfb22deee..66ac02634 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
@@ -187,7 +187,7 @@ void BgKin2Fence_HandleMaskCode(BgKin2Fence* this, PlayState* play) {
if (this->collider.base.acFlags & AC_HIT) {
hitMask = BgKin2Fence_CheckHitMask(this);
if (hitMask >= 0) {
- nextMask = (s8)gSaveContext.save.spiderHouseMaskOrder[this->masksHit];
+ nextMask = (s8)gSaveContext.save.saveInfo.spiderHouseMaskOrder[this->masksHit];
if (hitMask == nextMask) {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
this->masksHit += 1;
@@ -217,13 +217,13 @@ void BgKin2Fence_SetupPlayOpenCutscene(BgKin2Fence* this) {
}
void BgKin2Fence_PlayOpenCutscene(BgKin2Fence* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
Flags_SetSwitch(play, this->dyna.actor.params & 0x7F);
BgKin2Fence_SetupWaitBeforeOpen(this);
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
void BgKin2Fence_SetupWaitBeforeOpen(BgKin2Fence* this) {
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Picture/z_bg_kin2_picture.c b/src/overlays/actors/ovl_Bg_Kin2_Picture/z_bg_kin2_picture.c
index 7bc3e8544..7da9237bc 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Picture/z_bg_kin2_picture.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Picture/z_bg_kin2_picture.c
@@ -162,7 +162,7 @@ void BgKin2Picture_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
DynaPolyActor_LoadMesh(play, &this->dyna, &gOceanSpiderHouseSkullkidPaintingCol);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
Collider_InitTris(play, &this->colliderTris);
Collider_SetTris(play, &this->colliderTris, &this->dyna.actor, &sTrisInit, this->colliderElement);
Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
@@ -202,7 +202,7 @@ void BgKin2Picture_Wait(BgKin2Picture* this, PlayState* play) {
// hit by projectile
if (this->colliderTris.base.acFlags & AC_HIT) {
this->colliderTris.base.acFlags &= ~AC_HIT;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
BgKin2Picture_SetupPlayCutscene(this);
} else { // Gold Skulltula can be heard behind Skullkid's painting.
if (this->skulltulaNoiseTimer >= 0) {
@@ -227,12 +227,12 @@ void BgKin2Picture_SetupPlayCutscene(BgKin2Picture* this) {
}
void BgKin2Picture_PlayCutscene(BgKin2Picture* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->cutsceneStarted = true;
BgKin2Picture_SetupShiver(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -281,7 +281,7 @@ void BgKin2Picture_Fall(BgKin2Picture* this, PlayState* play) {
}
Actor_MoveWithGravity(&this->dyna.actor);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Math_StepToS(&this->step, 0x7D0, 0x78);
@@ -314,10 +314,10 @@ void BgKin2Picture_Fall(BgKin2Picture* this, PlayState* play) {
this->dyna.actor.shape.yOffset = 40.0f;
if (this->cutsceneStarted) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODPLATE_BROKEN);
BgKin2Picture_SetupDoNothing(this);
} else {
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Shelf/z_bg_kin2_shelf.c b/src/overlays/actors/ovl_Bg_Kin2_Shelf/z_bg_kin2_shelf.c
index 6c30347ef..f36944db6 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Shelf/z_bg_kin2_shelf.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Shelf/z_bg_kin2_shelf.c
@@ -207,7 +207,7 @@ void BgKin2Shelf_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.flags |= ACTOR_FLAG_10000000;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, D_80B70780[sp24]);
func_80B700A8(this);
}
diff --git a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
index 144351614..63e7b5974 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.c
@@ -75,7 +75,7 @@ void BgLadder_Init(Actor* thisx, PlayState* play) {
} else {
// Otherwise, the ladder doesn't draw; wait for the flag to be set
this->alpha = 5;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
this->action = BgLadder_Wait;
}
@@ -90,20 +90,20 @@ void BgLadder_Destroy(Actor* thisx, PlayState* play) {
void BgLadder_Wait(BgLadder* this, PlayState* play) {
// Wait for the flag to be set, then trigger the cutscene
if (Flags_GetSwitch(play, this->switchFlag)) {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->action = BgLadder_StartCutscene;
}
}
void BgLadder_StartCutscene(BgLadder* this, PlayState* play) {
// Trigger the cutscene, then make the ladder fade in
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->dyna.actor.draw = BgLadder_Draw;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SECRET_LADDER_APPEAR);
this->action = BgLadder_FadeIn;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -112,8 +112,8 @@ void BgLadder_FadeIn(BgLadder* this, PlayState* play) {
this->alpha += 5;
if (this->alpha >= 255) {
this->alpha = 255;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ CutsceneManager_Stop(this->dyna.actor.csId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.flags &= ~ACTOR_FLAG_10; // always update = off
this->action = BgLadder_DoNothing;
}
@@ -143,7 +143,7 @@ void BgLadder_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
}
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPMatrix(&gfx[2], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&gfx[3], sLadderDLists[this->dyna.actor.params]);
diff --git a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
index e4cd15c15..f920c18eb 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
@@ -21,7 +21,7 @@ typedef enum {
/* 0 */ LADDER_SIZE_12RUNG,
/* 1 */ LADDER_SIZE_16RUNG,
/* 2 */ LADDER_SIZE_20RUNG,
- /* 3 */ LADDER_SIZE_24RUNG,
+ /* 3 */ LADDER_SIZE_24RUNG
} BgLadderSize;
#endif // Z_BG_LADDER_H
diff --git a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.c b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.c
index 521e14d63..6085a93a2 100644
--- a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.c
+++ b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.c
@@ -149,7 +149,7 @@ void BgLastBwall_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, D_80C18AC8);
this->type = BGLASTBWALL_GET_TYPE(&this->dyna.actor);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, D_80C18A48[this->type].colHeader);
Collider_InitTris(play, &this->colliderTris);
if (Flags_GetSwitch(play, BGLASTBWALL_GET_SWITCHFLAGS(&this->dyna.actor))) {
@@ -164,7 +164,7 @@ void BgLastBwall_Init(Actor* thisx, PlayState* play) {
BgLastBwall_InitCollider(&sTrisInit, &this->dyna.actor.world.pos, &this->dyna.actor.shape.rot, &this->colliderTris,
D_80C18AC0[this->type]);
- SubS_FillCutscenesList(&this->dyna.actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->dyna.actor, this->csIdList, ARRAY_COUNT(this->csIdList));
func_80C187E4(this);
}
@@ -239,13 +239,13 @@ void func_80C1886C(BgLastBwall* this, PlayState* play) {
}
void func_80C18884(BgLastBwall* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->dyna.actor, this->cutscenes[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->dyna.actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
func_80C188C4(this, play);
}
}
void func_80C188C4(BgLastBwall* this, PlayState* play) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
func_80C184EC(this, play);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WALL_BROKEN);
diff --git a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
index 3fafc71ea..cae36be27 100644
--- a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
+++ b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
@@ -12,8 +12,8 @@ typedef void (*BgLastBwallActionFunc)(struct BgLastBwall*, PlayState*);
#define BGLASTBWALL_GET_TYPE(thisx) (((thisx)->params >> 0xC) & 0xF)
typedef enum {
- BGLASTBWALL_TYPE_0 = 0,
- BGLASTBWALL_TYPE_1 = 1,
+ /* 0 */ BGLASTBWALL_TYPE_0,
+ /* 1 */ BGLASTBWALL_TYPE_1
} BgLastBwallType;
typedef struct BgLastBwall {
@@ -22,7 +22,7 @@ typedef struct BgLastBwall {
/* 0x160 */ ColliderTris colliderTris;
/* 0x180 */ ColliderTrisElement colliderTrisElement[2];
/* 0x238 */ u8 type;
- /* 0x23A */ s16 cutscenes[1];
+ /* 0x23A */ s16 csIdList[1];
} BgLastBwall; // size = 0x23C
#endif // Z_BG_LAST_BWALL_H
diff --git a/src/overlays/actors/ovl_Bg_Lbfshot/z_bg_lbfshot.c b/src/overlays/actors/ovl_Bg_Lbfshot/z_bg_lbfshot.c
index 75e7b9e32..24c7ec1b3 100644
--- a/src/overlays/actors/ovl_Bg_Lbfshot/z_bg_lbfshot.c
+++ b/src/overlays/actors/ovl_Bg_Lbfshot/z_bg_lbfshot.c
@@ -36,7 +36,7 @@ void BgLbfshot_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->dyna.actor.uncullZoneForward = 4000.0f;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_lbfshot_Colheader_0014D8);
}
void BgLbfshot_Destroy(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c
index f4f6a6c00..2e924efd3 100644
--- a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c
+++ b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c
@@ -144,7 +144,7 @@ void BgNumaHana_Init(Actor* thisx, PlayState* play) {
type = BG_NUMA_HANA_GET_TYPE(&this->dyna.actor);
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
if (type == BG_NUMA_HANA_TYPE_OPEN_FLOWER_COLLISION) {
DynaPolyActor_LoadMesh(play, &this->dyna, &gWoodenFlowerOpenedFlowerCol);
@@ -162,7 +162,7 @@ void BgNumaHana_Init(Actor* thisx, PlayState* play) {
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_12_01)) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->petalZRotation = 0x2000;
this->innerPetalZRotation = 0x2000;
@@ -180,7 +180,7 @@ void BgNumaHana_Init(Actor* thisx, PlayState* play) {
BgNumaHana_SetupOpenedIdle(this);
} else {
child = (DynaPolyActor*)this->dyna.actor.child;
- func_800C62BC(play, &play->colCtx.dyna, child->bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, child->bgId);
Flags_UnsetSwitch(play, BG_NUMA_HANA_SWITCH_FLAG(&this->dyna.actor));
BgNumaHana_SetupClosedIdle(this);
}
@@ -217,13 +217,13 @@ void BgNumaHana_SetupClosedIdle(BgNumaHana* this) {
void BgNumaHana_ClosedIdle(BgNumaHana* this, PlayState* play) {
if (this->fire.state != FIRE_STATE_NOT_LIT) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FLAME_IGNITION);
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
SET_WEEKEVENTREG(WEEKEVENTREG_12_01);
Flags_SetSwitch(play, BG_NUMA_HANA_SWITCH_FLAG(&this->dyna.actor));
BgNumaHana_SetupUnfoldInnerPetals(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
}
@@ -314,8 +314,8 @@ void BgNumaHana_RaiseFlower(BgNumaHana* this, PlayState* play) {
child = (DynaPolyActor*)this->dyna.actor.child;
// Swaps out the "closed" flower collision for the "opened" collision.
- func_800C6314(play, &play->colCtx.dyna, child->bgId);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, child->bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->petalZRotation = 0x2000;
this->innerPetalZRotation = 0x2000;
@@ -327,7 +327,7 @@ void BgNumaHana_RaiseFlower(BgNumaHana* this, PlayState* play) {
this->flowerRotationalVelocity = 0x147;
this->settleScale = 0.0f;
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
BgNumaHana_SetupOpenedIdle(this);
}
@@ -383,7 +383,7 @@ void BgNumaHana_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gWoodenFlowerStalkDL);
diff --git a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
index 0e377f539..d9f4a1ece 100644
--- a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
+++ b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
@@ -9,7 +9,7 @@
typedef enum {
/* 0 */ BG_NUMA_HANA_TYPE_NORMAL,
- /* 1 */ BG_NUMA_HANA_TYPE_OPEN_FLOWER_COLLISION,
+ /* 1 */ BG_NUMA_HANA_TYPE_OPEN_FLOWER_COLLISION
} BgNumaHanaType;
struct BgNumaHana;
diff --git a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
index 3f7e45f67..e23504231 100644
--- a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
+++ b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c
@@ -23,8 +23,8 @@ void func_80ACAE5C(BgOpenShutter* this, PlayState* play);
void func_80ACAEF0(BgOpenShutter* this, PlayState* play);
typedef enum {
- /* 0x1 */ BGOPENSHUTTER_DOOR_OPEN = 1,
- /* 0x2 */ BGOPENSHUTTER_DOOR_CLOSED,
+ /* 1 */ BGOPENSHUTTER_DOOR_OPEN = 1,
+ /* 2 */ BGOPENSHUTTER_DOOR_CLOSED
} BGOpenShutterDoorState;
ActorInit Bg_Open_Shutter_InitVars = {
@@ -68,10 +68,10 @@ s8 func_80ACABA8(BgOpenShutter* this, PlayState* play) {
f32 temp_fv0;
s16 temp_v0;
- if (!Player_InCsMode(play) && (this->dyna.actor.xzDistToPlayer < 100.0f)) {
- temp_fv0 = func_80ACAB10(play, &this->dyna.actor, 0.0f, 65.0f, 15.0f);
+ if (!Player_InCsMode(play) && (this->slidingDoor.dyna.actor.xzDistToPlayer < 100.0f)) {
+ temp_fv0 = func_80ACAB10(play, &this->slidingDoor.dyna.actor, 0.0f, 65.0f, 15.0f);
if (fabsf(temp_fv0) < 50.0f) {
- temp_v0 = player->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ temp_v0 = player->actor.shape.rot.y - this->slidingDoor.dyna.actor.shape.rot.y;
if (temp_fv0 > 0.0f) {
temp_v0 = (0x8000 - temp_v0);
}
@@ -91,31 +91,32 @@ s8 func_80ACABA8(BgOpenShutter* this, PlayState* play) {
void BgOpenShutter_Init(Actor* thisx, PlayState* play) {
BgOpenShutter* this = THIS;
- Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_open_obj_Colheader_001640);
+ Actor_ProcessInitChain(&this->slidingDoor.dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->slidingDoor.dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->slidingDoor.dyna, &object_open_obj_Colheader_001640);
this->actionFunc = func_80ACAD88;
}
void BgOpenShutter_Destroy(Actor* thisx, PlayState* play) {
BgOpenShutter* this = THIS;
- s32 params = BGOPENSHUTTER_GET_A(thisx);
+ s32 transition = DOOR_GET_TRANSITION_ID(thisx);
- play->doorCtx.transitionActorList[params].id = -play->doorCtx.transitionActorList[params].id;
- DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+ play->doorCtx.transitionActorList[transition].id = -play->doorCtx.transitionActorList[transition].id;
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->slidingDoor.dyna.bgId);
}
void func_80ACAD88(BgOpenShutter* this, PlayState* play) {
s32 doorDirection;
- if (this->unk_15C != 0) {
+ if (this->slidingDoor.unk_15C != 0) {
Player* player = GET_PLAYER(play);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
- Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->dyna.actor, player->unk_3BA, 0.0f, 12, 15, 10);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->slidingDoor.dyna.actor, player->doorBgCamIndex, 0.0f,
+ 12, 15, 10);
this->unk_164 = 0;
this->actionFunc = func_80ACAE5C;
- this->dyna.actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
} else {
Player* player = GET_PLAYER(play);
@@ -123,20 +124,20 @@ void func_80ACAD88(BgOpenShutter* this, PlayState* play) {
if (doorDirection > 0) {
player->doorType = PLAYER_DOORTYPE_SLIDING;
player->doorDirection = doorDirection;
- player->doorActor = &this->dyna.actor;
+ player->doorActor = &this->slidingDoor.dyna.actor;
func_80122F28(player);
}
}
}
void func_80ACAE5C(BgOpenShutter* this, PlayState* play) {
- Math_StepToF(&this->dyna.actor.velocity.y, 15.0f, 3.0f);
- if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 120.0f,
- this->dyna.actor.velocity.y)) {
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 15.0f, 3.0f);
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y + 120.0f,
+ this->slidingDoor.dyna.actor.velocity.y)) {
this->unk_164++;
}
if (this->unk_164 >= 10) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
this->actionFunc = func_80ACAEF0;
}
}
@@ -145,20 +146,22 @@ void func_80ACAEF0(BgOpenShutter* this, PlayState* play) {
s32 pad;
s16 quakeIndex;
- Math_StepToF(&this->dyna.actor.velocity.y, 20.0f, 8.0f);
- if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, this->dyna.actor.velocity.y)) {
- this->dyna.actor.floorHeight = this->dyna.actor.home.pos.y;
- Actor_SpawnFloorDustRing(play, &this->dyna.actor, &this->dyna.actor.world.pos, 60.0f, 10, 8.0f, 500, 10, true);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIGWALL_BOUND);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 20.0f, 8.0f);
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y,
+ this->slidingDoor.dyna.actor.velocity.y)) {
+ this->slidingDoor.dyna.actor.floorHeight = this->slidingDoor.dyna.actor.home.pos.y;
+ Actor_SpawnFloorDustRing(play, &this->slidingDoor.dyna.actor, &this->slidingDoor.dyna.actor.world.pos, 60.0f,
+ 10, 8.0f, 500, 10, true);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_BIGWALL_BOUND);
- quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, -32536);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
- Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
+ Rumble_Request(this->slidingDoor.dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
- this->unk_15C = 0;
+ this->slidingDoor.unk_15C = 0;
this->actionFunc = func_80ACAD88;
}
}
@@ -166,20 +169,20 @@ void func_80ACAEF0(BgOpenShutter* this, PlayState* play) {
void BgOpenShutter_Update(Actor* thisx, PlayState* play2) {
BgOpenShutter* this = THIS;
PlayState* play = play2;
- s32 index;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 0x7C)) {
- index = Cutscene_GetActorActionIndex(play, 0x7C);
- if (play->csCtx.actorActions[index]->action == BGOPENSHUTTER_DOOR_OPEN) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_124)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_124);
+ if (play->csCtx.actorCues[cueChannel]->id == BGOPENSHUTTER_DOOR_OPEN) {
if (this->actionFunc == func_80ACAD88) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
this->actionFunc = func_80ACAE5C;
- this->dyna.actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
}
this->unk_164 = 0;
- } else if (play->csCtx.actorActions[index]->action == BGOPENSHUTTER_DOOR_CLOSED) {
+ } else if (play->csCtx.actorCues[cueChannel]->id == BGOPENSHUTTER_DOOR_CLOSED) {
if (this->actionFunc == func_80ACAE5C) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
this->actionFunc = func_80ACAEF0;
}
}
diff --git a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
index f6c6067d4..c035606b1 100644
--- a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
+++ b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.h
@@ -2,16 +2,14 @@
#define Z_BG_OPEN_SHUTTER_H
#include "global.h"
-
-#define BGOPENSHUTTER_GET_A(thisx) ((u16)((thisx)->params) >> 0xA)
+#include "z64door.h"
struct BgOpenShutter;
typedef void (*BgOpenShutterActionFunc)(struct BgOpenShutter*, PlayState*);
typedef struct BgOpenShutter {
- /* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ s16 unk_15C;
+ /* 0x000 */ SlidingDoorActor slidingDoor;
/* 0x160 */ BgOpenShutterActionFunc actionFunc;
/* 0x164 */ s32 unk_164;
} BgOpenShutter; // size = 0x168
diff --git a/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c b/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
index dbe935b3f..b5eb3130a 100644
--- a/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
+++ b/src/overlays/actors/ovl_Bg_Open_Spot/z_bg_open_spot.c
@@ -47,13 +47,13 @@ void BgOpenSpot_Destroy(Actor* thisx, PlayState* play) {
void BgOpenSpot_Update(Actor* thisx, PlayState* play) {
BgOpenSpot* this = THIS;
- u32 action;
+ u32 cueId;
- if (Cutscene_CheckActorAction(play, 0x7D)) {
- action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x7D)]->action;
- if (action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_125)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_125)]->id;
+ if (cueId == 1) {
this->actor.draw = NULL;
- } else if (action == 2) {
+ } else if (cueId == 2) {
this->actor.draw = BgOpenSpot_Draw;
}
}
@@ -64,9 +64,10 @@ void BgOpenSpot_Draw(Actor* thisx, PlayState* play) {
BgOpenSpot* this = (BgOpenSpot*)thisx;
AnimatedMat_Draw(play, this->texScrolls);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_BAYER);
gSPDisplayList(POLY_XLU_DISP++, gSpotlightLeftDL);
diff --git a/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c b/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c
index 41ecaa19e..1b9e93009 100644
--- a/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c
+++ b/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.c
@@ -45,7 +45,7 @@ void BgSinkaiKabe_Init(Actor* thisx, PlayState* play) {
Vec3f pos;
s32 pad2;
s32 shouldSpawnSeahorse;
- s32 cs;
+ s32 csId;
s32 i;
DynaPolyActor_Init(&this->dyna, 0);
@@ -54,11 +54,11 @@ void BgSinkaiKabe_Init(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&pos, &this->dyna.actor.world.pos);
pos.x += Math_SinS(this->dyna.actor.world.rot.y + 0x8000) * 3000.0f;
pos.z += Math_CosS(this->dyna.actor.world.rot.y + 0x8000) * 3000.0f;
- cs = this->dyna.actor.cutscene;
+ csId = this->dyna.actor.csId;
i = 0;
// clang-format off
- while (cs != -1) { this->cutscenes[i] = cs; cs = ActorCutscene_GetAdditionalCutscene(cs); i++; }
+ while (csId != CS_ID_NONE) { this->csIdList[i] = csId; csId = CutsceneManager_GetAdditionalCsId(csId); i++; }
// clang-format on
this->dyna.actor.scale.x = 0.1f;
@@ -74,9 +74,9 @@ void BgSinkaiKabe_Init(Actor* thisx, PlayState* play) {
if (this->deepPython != NULL) {
EnDragon* dragon = (EnDragon*)this->deepPython;
- dragon->grabCutsceneIndex = this->cutscenes[0];
- dragon->deathCutsceneIndex = this->cutscenes[1];
- dragon->actor.cutscene = this->dyna.actor.cutscene;
+ dragon->grabCsId = this->csIdList[0];
+ dragon->deathCsId = this->csIdList[1];
+ dragon->actor.csId = this->dyna.actor.csId;
Math_Vec3f_Copy(&dragon->burrowEntrancePos, &this->dyna.actor.world.pos);
dragon->pythonIndex = this->pythonIndex;
}
@@ -99,7 +99,7 @@ void BgSinkaiKabe_Init(Actor* thisx, PlayState* play) {
pos.z += (Math_CosS(this->dyna.actor.world.rot.y + 0x8000) * 500.0f);
if (shouldSpawnSeahorse) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_OT, pos.x, pos.y, pos.z, 0,
- this->dyna.actor.shape.rot.y, 0, 0x4000, this->dyna.actor.cutscene,
+ this->dyna.actor.shape.rot.y, 0, 0x4000, this->dyna.actor.csId,
this->dyna.actor.halfDaysBits, NULL);
}
diff --git a/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.h b/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.h
index abb341797..96c771c62 100644
--- a/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.h
+++ b/src/overlays/actors/ovl_Bg_Sinkai_Kabe/z_bg_sinkai_kabe.h
@@ -12,7 +12,7 @@ typedef struct BgSinkaiKabe {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgSinkaiKabeActionFunc actionFunc;
/* 0x160 */ Actor* deepPython;
- /* 0x164 */ s16 cutscenes[2];
+ /* 0x164 */ s16 csIdList[2];
/* 0x168 */ UNK_TYPE1 unk_168[0x4];
/* 0x16C */ s32 pythonIndex;
} BgSinkaiKabe; // size = 0x170
diff --git a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
index a1bd0d65d..c11df8af1 100644
--- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
+++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
@@ -150,7 +150,7 @@ void BgSpdweb_Init(Actor* thisx, PlayState* play) {
this->unk_161 = 0;
this->switchFlag = BGSPDWEB_GET_SWITCHFLAG(&this->dyna.actor);
thisx->params &= 0xFF;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if (this->dyna.actor.params == BGSPDWEB_FF_0) {
Collider_InitAndSetTris(play, &this->collider, &this->dyna.actor, &sTrisInit1, this->colliderElements);
@@ -229,7 +229,7 @@ void func_809CE234(BgSpdweb* this, PlayState* play) {
}
if (this->unk_162 == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
return;
}
@@ -240,7 +240,7 @@ void func_809CE234(BgSpdweb* this, PlayState* play) {
spA8.y = this->dyna.actor.world.pos.y;
for (i = 0; i < 6; i++) {
- temp_s0 = (s32)randPlusMinusPoint5Scaled(10240.0f) + phi_s2;
+ temp_s0 = (s32)Rand_CenteredFloat(0x2800) + phi_s2;
temp_f24 = Math_SinS(temp_s0);
temp_f22 = Math_CosS(temp_s0);
@@ -297,7 +297,7 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
return;
}
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
sp3A = 300;
break;
}
@@ -305,7 +305,7 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
}
}
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
temp_f12 = 2.0f * sqrtf(CLAMP_MIN(sp3A, 0));
if ((this->unk_164 < temp_f12) && (temp_f12 > 2.0f)) {
this->unk_164 = temp_f12;
@@ -323,12 +323,12 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
this->unk_162--;
}
- this->dyna.actor.world.pos.y = (sin_rad(this->unk_162 * (M_PI / 6)) * this->unk_164) + this->dyna.actor.home.pos.y;
+ this->dyna.actor.world.pos.y =
+ (Math_SinF(this->unk_162 * (M_PI / 6)) * this->unk_164) + this->dyna.actor.home.pos.y;
Math_ApproachZeroF(&this->unk_164, 1.0f, 0.8f);
if (this->unk_162 == 4) {
- if ((this->unk_161 != 0) ||
- ((DynaPolyActor_IsInRidingMovingState(&this->dyna) != 0) && (this->unk_164 > 2.0f))) {
+ if ((this->unk_161 != 0) || (DynaPolyActor_IsPlayerOnTop(&this->dyna) && (this->unk_164 > 2.0f))) {
player->actor.velocity.y = this->unk_164 * 0.7f;
player->fallStartHeight = (SQ(this->unk_164) * 0.15f) + this->dyna.actor.world.pos.y;
this->unk_161 = 0;
@@ -370,8 +370,8 @@ void func_809CE830(BgSpdweb* this, PlayState* play) {
}
if (this->unk_162 == 0) {
- if (ActorCutscene_GetLength(this->dyna.actor.cutscene) == -1) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ if (CutsceneManager_GetLength(this->dyna.actor.csId) == -1) {
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
Actor_Kill(&this->dyna.actor);
return;
@@ -389,7 +389,7 @@ void func_809CE830(BgSpdweb* this, PlayState* play) {
spC4.z = this->dyna.actor.world.pos.z + 90.0f * sinQ * cosF1;
for (i = 0; i < 6; i++) {
- temp_s0 = (s32)randPlusMinusPoint5Scaled(0x2800) + temp_s3;
+ temp_s0 = (s32)Rand_CenteredFloat(0x2800) + temp_s3;
sinF2 = Math_SinS(temp_s0);
cosF2 = Math_CosS(temp_s0);
@@ -471,16 +471,16 @@ void func_809CEBC0(BgSpdweb* this, PlayState* play) {
}
void func_809CEE74(BgSpdweb* this) {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = func_809CEEAC;
}
void func_809CEEAC(BgSpdweb* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
func_809CE1D0(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -497,7 +497,7 @@ void BgSpdweb_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
if (thisx->params == BGSPDWEB_FF_1) {
gSPMatrix(&gfx[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c b/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
index fdf56d87c..9349b8188 100644
--- a/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
+++ b/src/overlays/actors/ovl_Bg_Spout_Fire/z_bg_spout_fire.c
@@ -189,7 +189,7 @@ void BgSpoutFire_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- gfx = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ gfx = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
POLY_XLU_DISP = gfx;
gSPSegment(&gfx[0], 0x08, sFlameTextures[this->flameTexIndex]);
gDPSetPrimColor(&gfx[1], 0, 1, 255, 255, 0, 150);
diff --git a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
index 17722bda2..5302c6a90 100644
--- a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
+++ b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.c
@@ -16,7 +16,6 @@ void BgTobira01_Destroy(Actor* thisx, PlayState* play);
void BgTobira01_Update(Actor* thisx, PlayState* play);
void BgTobira01_Draw(Actor* thisx, PlayState* play);
-/*
const ActorInit Bg_Tobira01_InitVars = {
ACTOR_BG_TOBIRA01,
ACTORCAT_PROP,
@@ -28,14 +27,80 @@ const ActorInit Bg_Tobira01_InitVars = {
(ActorFunc)BgTobira01_Update,
(ActorFunc)BgTobira01_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/func_80B12430.s")
+void BgTobira01_Action(BgTobira01* this, PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ s16 csId = this->dyna.actor.csId;
+ s16 prevPosYTick;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Init.s")
+ if (this->cutsceneRequested) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
+ this->cutsceneRequested = false;
+ } else {
+ CutsceneManager_Queue(csId);
+ }
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) && (this->posYTick == 0) &&
+ (play->actorCtx.playerImpact.timer != 0) &&
+ (play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND) &&
+ (SurfaceType_GetSceneExitIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId) == 6)) {
+ this->cutsceneRequested = true;
+ this->unk16C = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Destroy.s")
+ prevPosYTick = this->posYTick;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE)) {
+ this->posYTick++;
+ } else {
+ this->posYTick--;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Update.s")
+ this->posYTick = CLAMP(this->posYTick, 0, 60);
+ if (prevPosYTick != this->posYTick) {
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_STONEDOOR_OPEN_S - SFX_FLAG);
+ this->dyna.actor.world.pos.y = this->posY = (this->posYTick * (5.0f / 3.0f)) + this->dyna.actor.home.pos.y;
+ this->timer = 180;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Tobira01/BgTobira01_Draw.s")
+ if (!(player->stateFlags1 & PLAYER_STATE1_40) && CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) &&
+ (DECR(this->timer) == 0)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
+ }
+}
+
+void BgTobira01_Init(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gGoronDoorCol);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
+ Actor_SetScale(&this->dyna.actor, 1.0f);
+ this->timer = gSaveContext.save.isNight;
+ this->posYTick = 0;
+ this->actionFunc = BgTobira01_Action;
+}
+
+void BgTobira01_Destroy(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
+
+void BgTobira01_Update(Actor* thisx, PlayState* play) {
+ BgTobira01* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void BgTobira01_Draw(Actor* thisx, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDoorDL);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
index 9ddd0233d..b53c2302e 100644
--- a/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
+++ b/src/overlays/actors/ovl_Bg_Tobira01/z_bg_tobira01.h
@@ -5,9 +5,16 @@
struct BgTobira01;
+typedef void (*BgTobira01ActionFunc)(struct BgTobira01*, PlayState*);
+
typedef struct BgTobira01 {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x2C];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ BgTobira01ActionFunc actionFunc;
+ /* 0x160 */ s16 posYTick;
+ /* 0x162 */ s16 timer;
+ /* 0x164 */ f32 posY;
+ /* 0x168 */ s32 cutsceneRequested;
+ /* 0x16C */ s32 unk16C;
} BgTobira01; // size = 0x170
#endif // Z_BG_TOBIRA01_H
diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
index bef32aedd..132f8f13f 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
@@ -47,24 +47,24 @@ void func_80919F30(BgUmajump* this, PlayState* play) {
}
void BgUmajump_StopCutscene(BgUmajump* this, PlayState* play) {
- if ((play->csCtx.frames >= 6) && !this->hasSoundPlayed) {
+ if ((play->csCtx.curFrame >= 6) && !this->hasSoundPlayed) {
this->hasSoundPlayed = true;
play_sound(NA_SE_EV_KID_HORSE_NEIGH);
}
- if (play->csCtx.state == CS_STATE_0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->dyna.actor.update = Actor_Noop;
}
}
void BgUmajump_PlayCutscene(BgUmajump* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
SET_WEEKEVENTREG(WEEKEVENTREG_89_20);
this->actionFunc = BgUmajump_StopCutscene;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -89,13 +89,12 @@ void BgUmajump_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- this->objectIndex = BG_UMAJUMP_GET_OBJECT_INDEX(thisx);
- thisx->params = BG_UMAJUMP_GET_FF(thisx);
+ this->pathIndex = BG_UMAJUMP_GET_PATH_INDEX(thisx);
+ thisx->params = BG_UMAJUMP_GET_TYPE(thisx);
- if ((thisx->params == BG_UMAJUMP_TYPE_2)) {
- if ((((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20)) &&
- !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) &&
- (thisx->cutscene != -1)) {
+ if (thisx->params == BG_UMAJUMP_TYPE_2) {
+ if ((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20) &&
+ !CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && (thisx->csId != CS_ID_NONE)) {
this->actionFunc = BgUmajump_CheckDistance;
thisx->update = func_8091A5A0;
thisx->flags |= ACTOR_FLAG_10;
@@ -134,11 +133,11 @@ void BgUmajump_Update(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->dyna.actor);
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if (this->dyna.actor.params == BG_UMAJUMP_TYPE_6) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_4) || (this->dyna.actor.params == BG_UMAJUMP_TYPE_3)) {
@@ -155,20 +154,20 @@ void BgUmajump_Update(Actor* thisx, PlayState* play) {
this->dyna.actor.update = func_8091A5A0;
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_5) || (this->dyna.actor.params == BG_UMAJUMP_TYPE_6)) {
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_6) && (this->dyna.bgId == BGACTOR_NEG_ONE) &&
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) ||
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) ||
((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == true) &&
((gSaveContext.save.time >= CLOCK_TIME(5, 30)) &&
(gSaveContext.save.time <= CLOCK_TIME(6, 0)))))) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
- func_800C641C(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableFloorCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.update = func_8091A5A0;
} else if (this->dyna.actor.params == BG_UMAJUMP_TYPE_4) {
- func_800C641C(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableFloorCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.update = Actor_Noop;
} else {
this->dyna.actor.update = Actor_Noop;
@@ -191,18 +190,18 @@ void func_8091A5A0(Actor* thisx, PlayState* play) {
}
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
- } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
} else if (this->dyna.actor.params == BG_UMAJUMP_TYPE_6) {
if ((this->dyna.bgId == BGACTOR_NEG_ONE) &&
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) ||
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) ||
((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == true) &&
(gSaveContext.save.time >= CLOCK_TIME(5, 30)) && (gSaveContext.save.time <= CLOCK_TIME(6, 0))))) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
- } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) &&
+ } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) &&
((gSaveContext.save.day != 2) || (gSaveContext.save.isNight != true) ||
(gSaveContext.save.time < CLOCK_TIME(5, 30)) || (gSaveContext.save.time > CLOCK_TIME(6, 0)))) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
index 62aaf6cb7..ae35ac98c 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
@@ -3,16 +3,16 @@
#include "global.h"
-#define BG_UMAJUMP_GET_OBJECT_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
-#define BG_UMAJUMP_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define BG_UMAJUMP_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+#define BG_UMAJUMP_GET_TYPE(thisx) ((thisx)->params & 0xFF)
typedef enum {
- BG_UMAJUMP_TYPE_1 = 1,
- BG_UMAJUMP_TYPE_2,
- BG_UMAJUMP_TYPE_3,
- BG_UMAJUMP_TYPE_4,
- BG_UMAJUMP_TYPE_5,
- BG_UMAJUMP_TYPE_6,
+ /* 1 */ BG_UMAJUMP_TYPE_1 = 1,
+ /* 2 */ BG_UMAJUMP_TYPE_2,
+ /* 3 */ BG_UMAJUMP_TYPE_3,
+ /* 4 */ BG_UMAJUMP_TYPE_4,
+ /* 5 */ BG_UMAJUMP_TYPE_5,
+ /* 6 */ BG_UMAJUMP_TYPE_6
} BgUmaJumpType;
struct BgUmajump;
@@ -24,7 +24,8 @@ typedef struct BgUmajump {
/* 0x15C */ BgUmajumpActionFunc actionFunc;
/* 0x160 */ union {
s32 objectIndex;
- s32 rotationTimer; // y rotation
+ s32 rotationTimer; // y rotation
+ s32 pathIndex;
};
/* 0x164 */ s32 hasSoundPlayed;
/* 0x168 */ Actor* horse;
diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
index 003ba32e9..5b19594fb 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -485,9 +485,9 @@ void Boss02_SpawnEffectSand(TwinmoldEffect* effects, Vec3f* pos, f32 scale) {
if (effects->type == TWINMOLD_EFFECT_NONE) {
effects->type = TWINMOLD_EFFECT_SAND;
effects->pos = *pos;
- effects->velocity.x = randPlusMinusPoint5Scaled(30.0f);
+ effects->velocity.x = Rand_CenteredFloat(30.0f);
effects->velocity.y = Rand_ZeroFloat(7.0f) + 7.0f;
- effects->velocity.z = randPlusMinusPoint5Scaled(30.0f);
+ effects->velocity.z = Rand_CenteredFloat(30.0f);
effects->accel.y = -0.3f;
effects->scale = scale;
effects->alpha = 255;
@@ -507,9 +507,9 @@ void Boss02_SpawnEffectFragment(TwinmoldEffect* effects, Vec3f* pos) {
effects->type = TWINMOLD_EFFECT_FRAGMENT;
effects->pos = *pos;
effects->timer = Rand_ZeroFloat(20.0f);
- effects->velocity.x = randPlusMinusPoint5Scaled(50.0f);
- effects->velocity.y = randPlusMinusPoint5Scaled(50.0f);
- effects->velocity.z = randPlusMinusPoint5Scaled(50.0f);
+ effects->velocity.x = Rand_CenteredFloat(50.0f);
+ effects->velocity.y = Rand_CenteredFloat(50.0f);
+ effects->velocity.z = Rand_CenteredFloat(50.0f);
effects->accel.z = 0.0f;
effects->accel.x = 0.0f;
effects->accel.y = -1.5f;
@@ -550,10 +550,10 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
s32 i;
s32 pad[2];
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) && (this->actor.params == TWINMOLD_RED)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) && (this->actor.params == TWINMOLD_RED)) {
sBlueWarp = (DoorWarp1*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, 60.0f,
0.0f, 0, 0, 0, 1);
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, BHEART_PARAM_NORMAL);
}
this->actor.targetMode = 10;
@@ -774,8 +774,8 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->actor.world.pos.z = player->actor.world.pos.z;
this->actor.world.pos.y = player->actor.world.pos.y - (600.0f * D_809DF5B0);
} else {
- this->actor.world.pos.x = randPlusMinusPoint5Scaled(5000.0f * D_809DF5B0);
- this->actor.world.pos.z = randPlusMinusPoint5Scaled(5000.0f * D_809DF5B0);
+ this->actor.world.pos.x = Rand_CenteredFloat(5000.0f * D_809DF5B0);
+ this->actor.world.pos.z = Rand_CenteredFloat(5000.0f * D_809DF5B0);
this->actor.world.pos.y = -500.0f * D_809DF5B0;
if (sIsInGiantMode) {
this->actor.world.pos.y += 3150.0f;
@@ -802,8 +802,8 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0146[0] = 150;
} else {
this->unk_0144 = 2;
- this->unk_01B0.x = randPlusMinusPoint5Scaled(3000.0f * D_809DF5B0);
- this->unk_01B0.z = randPlusMinusPoint5Scaled(3000.0f * D_809DF5B0);
+ this->unk_01B0.x = Rand_CenteredFloat(3000.0f * D_809DF5B0);
+ this->unk_01B0.z = Rand_CenteredFloat(3000.0f * D_809DF5B0);
if ((fabsf(this->unk_01B0.x) < (500.0f * D_809DF5B0)) &&
(fabsf(this->unk_01B0.z) < (500.0f * D_809DF5B0))) {
this->unk_01B0.x = 500.0f;
@@ -847,12 +847,12 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_01B0.z = player->actor.world.pos.z;
if (this->unk_0146[0] == 0) {
this->unk_0144 = 3;
- this->unk_01B0.x = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + this->actor.world.pos.x;
+ this->unk_01B0.x = Rand_CenteredFloat(500.0f * D_809DF5B0) + this->actor.world.pos.x;
this->unk_01B0.y = -3000.0f * D_809DF5B0;
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
- this->unk_01B0.z = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + this->actor.world.pos.z;
+ this->unk_01B0.z = Rand_CenteredFloat(500.0f * D_809DF5B0) + this->actor.world.pos.z;
this->unk_0146[0] = 150;
this->unk_0164 = 0.0f;
}
@@ -917,7 +917,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
Matrix_MultVecZ(1500.0f * D_809DF5B0, &spA4);
this->unk_0146[0] = 50;
this->unk_01B0.x = player->actor.world.pos.x + spA4.x;
- this->unk_01B0.y = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + (600.0f * D_809DF5B0);
+ this->unk_01B0.y = Rand_CenteredFloat(500.0f * D_809DF5B0) + (600.0f * D_809DF5B0);
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -963,7 +963,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->actor.gravity = -1.0f * D_809DF5B0;
this->actor.velocity.y = 0.0f;
this->actor.terminalVelocity = -1000.0f * D_809DF5B0;
- this->unk_0164 = randPlusMinusPoint5Scaled(0.05f);
+ this->unk_0164 = Rand_CenteredFloat(0.05f);
spCC = player->actor.world.pos.x - this->actor.world.pos.x;
spC4 = player->actor.world.pos.z - this->actor.world.pos.z;
@@ -993,7 +993,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0B1C[i].y += this->unk_0164;
Math_ApproachF(&this->unk_0B1C[i].x, -(M_PI / 2), 0.1f, 0.07f);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, UPDBGCHECKINFO_FLAG_4);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_0144 = 23;
@@ -1205,16 +1205,16 @@ void Boss02_Twinmold_Update(Actor* thisx, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_SAND_OLD - SFX_FLAG);
if (this->unk_0144 > 20) {
- sp3C.x = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.x;
- sp3C.y = randPlusMinusPoint5Scaled(50.0f * D_809DF5B0) + this->unk_0170.y;
- sp3C.z = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.z;
+ sp3C.x = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * D_809DF5B0) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.z;
Boss02_SpawnEffectSand(play->specialEffects, &sp3C, Rand_ZeroFloat(3.0f) + 6.0f);
}
if ((this->unk_014C % 2) == 0) {
- sp3C.x = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.x;
- sp3C.y = randPlusMinusPoint5Scaled(50.0f * D_809DF5B0) + this->unk_0170.y;
- sp3C.z = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.z;
+ sp3C.x = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * D_809DF5B0) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.z;
Boss02_SpawnEffectSand(play->specialEffects, &sp3C, Rand_ZeroFloat(3.0f) + 6.0f);
}
}
@@ -1349,7 +1349,7 @@ void Boss02_Twinmold_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actor.params == 0) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gTwinmoldRedSkinTex));
@@ -1521,8 +1521,8 @@ void Boss02_DrawEffects(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(sEffects); i++, effect++) {
if (effect->type == TWINMOLD_EFFECT_SAND) {
@@ -1631,7 +1631,7 @@ void func_809DD934(Boss02* this, PlayState* play) {
switch (this->unk_1D18) {
case 0:
if (player->stateFlags1 & PLAYER_STATE1_100) {
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -1751,7 +1751,7 @@ void func_809DD934(Boss02* this, PlayState* play) {
this->unk_1D18 = 0;
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
this->actor.flags |= ACTOR_FLAG_1;
player->stateFlags1 &= ~PLAYER_STATE1_100;
this->unk_1D70 = 0.01f;
@@ -1971,7 +1971,7 @@ void func_809DD934(Boss02* this, PlayState* play) {
temp_a0_5->scale.z *= phi_f0_2;
if (temp_a0_5->id == ACTOR_ITEM_B_HEART) {
- ((ItemBHeart*)temp_a0_5)->unk_168 *= phi_f0_2;
+ ((ItemBHeart*)temp_a0_5)->baseScale *= phi_f0_2;
}
}
temp_a0_5 = temp_a0_5->next;
@@ -2050,10 +2050,11 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
break;
case 1:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) || ((u32)(KREG(13) + 15) >= this->unk_1D1C)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) ||
+ ((u32)(KREG(13) + 15) >= this->unk_1D1C)) {
break;
}
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -2138,8 +2139,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
if (this->unk_1D1C == (u32)(BREG(27) + 335)) {
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->actor.flags |= ACTOR_FLAG_1;
this->unk_1D20 = 0;
sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3;
@@ -2149,8 +2150,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
break;
case 100:
- if (ActorCutscene_GetCurrentIndex() == -1) {
- Cutscene_Start(play, &play->csCtx);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ Cutscene_StartManual(play, &play->csCtx);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -2199,8 +2200,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
if (this->unk_1D1C == 30) {
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->unk_1D20 = 0;
this->actor.flags |= ACTOR_FLAG_1;
sp68->unk_0144 = 10;
@@ -2209,10 +2210,12 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
this->unk_1D7E = 0;
if (!sIsInGiantMode) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 30.0f, -150.0f, 0, 1, 0,
+ BHEART_PARAM_NORMAL);
phi_f0 = 60.0f;
} else {
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 3153.0f, -15.0f, 0, 1, 0, 35);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, 3153.0f, -15.0f, 0, 1, 0,
+ BHEART_PARAM_SMALL);
phi_f0 = 3155.0f;
}
sBlueWarp = (DoorWarp1*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1,
diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.h b/src/overlays/actors/ovl_Boss_02/z_boss_02.h
index e7efc1199..4fbd8b471 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.h
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.h
@@ -27,15 +27,15 @@ typedef enum {
/* 1 */ TWINMOLD_EFFECT_SAND, // The sand kicked up when Twinmold touches the ground
/* 2 */ TWINMOLD_EFFECT_BLACK_DUST, // Unused
/* 3 */ TWINMOLD_EFFECT_FRAGMENT, // The fragments that fly off when the parts of Twinmold explode
- /* 4 */ TWINMOLD_EFFECT_FLASH, // The flashes of light that appear when the parts of Twinmold explode
+ /* 4 */ TWINMOLD_EFFECT_FLASH // The flashes of light that appear when the parts of Twinmold explode
} TwinmoldEffectType;
typedef enum {
/* 0 */ TWINMOLD_RED,
/* 35 */ TWINMOLD_BLUE = 35,
/* 100 */ TWINMOLD_TAIL = 100,
- /* 200 */ TWINMOLD_STATIC = 200,
-} TwinmoldParams;
+ /* 200 */ TWINMOLD_STATIC = 200
+} TwinmoldParam;
typedef struct Boss02 {
/* 0x0000 */ Actor actor;
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 4dd27f211..d44c961e9 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c
@@ -51,6 +51,7 @@
#include "z_boss_03.h"
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
#include "overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h"
+#include "overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_water_effect/object_water_effect.h"
@@ -161,8 +162,8 @@ void Boss03_SpawnEffectDroplet(PlayState* play, Vec3f* pos) {
eff->unk_34.y = 0.0f;
eff->unk_34.z = Rand_ZeroFloat(2 * M_PI);
eff->unk_02 = Rand_ZeroFloat(100.0f);
- eff->velocity.x = randPlusMinusPoint5Scaled(25.0f);
- eff->velocity.z = randPlusMinusPoint5Scaled(25.0f);
+ eff->velocity.x = Rand_CenteredFloat(25.0f);
+ eff->velocity.z = Rand_CenteredFloat(25.0f);
return;
}
@@ -424,17 +425,17 @@ void Boss03_SpawnDust(Boss03* this, PlayState* play) {
Vec3f accel;
for (i = 0; i < 5; i++) {
- velocity.x = randPlusMinusPoint5Scaled(10.0f);
+ velocity.x = Rand_CenteredFloat(10.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 2.0f;
- velocity.z = randPlusMinusPoint5Scaled(10.0f);
+ velocity.z = Rand_CenteredFloat(10.0f);
accel.y = -0.075f;
accel.z = 0.0f;
accel.x = 0.0f;
pos.y = Rand_ZeroFloat(20.0f) + 5.0f;
- pos.z = randPlusMinusPoint5Scaled(150.0f) + this->insideJawPos.z;
- pos.x = randPlusMinusPoint5Scaled(150.0f) + this->insideJawPos.x;
+ pos.z = Rand_CenteredFloat(150.0f) + this->insideJawPos.z;
+ pos.x = Rand_CenteredFloat(150.0f) + this->insideJawPos.x;
func_800B0EB0(play, &pos, &velocity, &accel, &sGyorgDustPrimColor, &sGyorgDustEnvColor,
Rand_ZeroFloat(200.0f) + 400.0f, 10, Rand_ZeroFloat(10.0f) + 25.0f);
@@ -448,10 +449,11 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
Vec3f sp70;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, PLATFORM_HEIGHT, 200.0f, 0, 0,
0, ENDOORWARP1_FF_1);
- Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, PLATFORM_HEIGHT, 0.0f, 0, 0, 0, 0);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 0.0f, PLATFORM_HEIGHT, 0.0f, 0, 0, 0,
+ BHEART_PARAM_NORMAL);
Actor_Kill(&this->actor);
return;
}
@@ -595,9 +597,9 @@ void func_809E34B8(Boss03* this, PlayState* play) {
if (this->workTimer[WORK_TIMER_UNK2_A] == 0) {
if ((sqrtf(SQ(xDiff) + SQ(zDiff)) < 100.0f) || (this->workTimer[WORK_TIMER_UNK0_A] == 0)) {
for (i = 0; i < 200; i++) {
- this->unk_268.x = randPlusMinusPoint5Scaled(2500.0f);
+ this->unk_268.x = Rand_CenteredFloat(2500.0f);
this->unk_268.y = Rand_ZeroFloat(100.0f) + 150.0f;
- this->unk_268.z = randPlusMinusPoint5Scaled(2500.0f);
+ this->unk_268.z = Rand_CenteredFloat(2500.0f);
xDiff = this->unk_268.x - this->actor.world.pos.x;
zDiff = this->unk_268.z - this->actor.world.pos.z;
@@ -1050,7 +1052,7 @@ void Boss03_Charge(Boss03* this, PlayState* play) {
// Attack platform
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 20, 15);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 20, 15);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WATER_EFFECT, 0.0f, this->waterHeight, 0.0f, 0, 0, 0x96,
ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE);
@@ -1098,9 +1100,9 @@ void Boss03_JumpOverPlatform(Boss03* this, PlayState* play) {
Vec3f sp30;
for (i = 0; i < 3; i++) {
- sp30.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(150.0f);
+ sp30.x = this->actor.world.pos.x + Rand_CenteredFloat(150.0f);
sp30.y = this->actor.world.pos.y;
- sp30.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(150.0f);
+ sp30.z = this->actor.world.pos.z + Rand_CenteredFloat(150.0f);
Boss03_SpawnEffectDroplet(play, &sp30);
}
}
@@ -1145,8 +1147,8 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
switch (this->csState) {
case 0:
if (player->actor.world.pos.y < 1350.0f) {
- Cutscene_Start(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ Cutscene_StartManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -1335,9 +1337,9 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
if (1) {}
for (i = 0; i < 3; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(150.0f) + this->actor.world.pos.x;
+ effectPos.x = Rand_CenteredFloat(150.0f) + this->actor.world.pos.x;
effectPos.y = this->actor.world.pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(150.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(150.0f) + this->actor.world.pos.z;
Boss03_SpawnEffectDroplet(play, &effectPos);
}
@@ -1367,8 +1369,8 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamId, 0);
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->subCamId = SUB_CAM_ID_DONE;
func_809E344C(this, play);
@@ -1397,9 +1399,9 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->subCamEye = this->actor.world.pos;
for (i = 0; i < bubblesToSpawnNum; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.x;
- effectPos.y = (randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.y) - 150.0f;
- effectPos.z = randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.z;
+ effectPos.x = Rand_CenteredFloat(100.0f) + this->subCamAt.x;
+ effectPos.y = (Rand_CenteredFloat(100.0f) + this->subCamAt.y) - 150.0f;
+ effectPos.z = Rand_CenteredFloat(100.0f) + this->subCamAt.z;
Boss03_SpawnEffectBubble(play, &effectPos);
}
@@ -1444,8 +1446,8 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
switch (this->csState) {
case 0:
- if (ActorCutscene_GetCurrentIndex() == -1) {
- Cutscene_Start(play, &play->csCtx);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, PLAYER_CSMODE_1);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -1571,17 +1573,15 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
this->actor.speed = ((Rand_ZeroFloat(5.0f) + 2.5f) * sp64) + 2.5f;
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetX =
- ((s16)randPlusMinusPoint5Scaled(500.0f) + this->shapeRotTargetX) + 0x8000;
+ this->shapeRotTargetX = ((s16)(s32)Rand_CenteredFloat(0x1F4) + this->shapeRotTargetX) + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetZ =
- ((s16)randPlusMinusPoint5Scaled(500.0f) + this->shapeRotTargetZ) + 0x8000;
+ this->shapeRotTargetZ = ((s16)(s32)Rand_CenteredFloat(0x1F4) + this->shapeRotTargetZ) + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetY = Rand_ZeroFloat(65536.0f);
+ this->shapeRotTargetY = Rand_ZeroFloat(0x10000);
}
this->actor.world.rot.y = Math_Atan2S_XY(-this->actor.world.pos.z, -this->actor.world.pos.x);
@@ -1598,9 +1598,9 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
sp4C = 150.0f * sp64;
for (i = 0; i < 1; i++) {
- sp78.x = randPlusMinusPoint5Scaled(sp4C) + this->actor.world.pos.x;
+ sp78.x = Rand_CenteredFloat(sp4C) + this->actor.world.pos.x;
sp78.y = this->actor.world.pos.y;
- sp78.z = randPlusMinusPoint5Scaled(sp4C) + this->actor.world.pos.z;
+ sp78.z = Rand_CenteredFloat(sp4C) + this->actor.world.pos.z;
Boss03_SpawnEffectDroplet(play, &sp78);
}
@@ -1610,7 +1610,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, 0.0f, PLATFORM_HEIGHT, 200.0f,
0, 0, 0, ENDOORWARP1_FF_1);
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, this->actor.focus.pos.x, PLATFORM_HEIGHT,
- this->actor.focus.pos.z, 0, 0, 0, 0);
+ this->actor.focus.pos.z, 0, 0, 0, BHEART_PARAM_NORMAL);
this->csTimer = 0;
Actor_SetScale(&this->actor, 0.0f);
AudioSfx_StopByPos(&this->actor.projectedPos);
@@ -1626,8 +1626,8 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->csState = 3;
Play_DisableMotionBlur();
Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_INIT_OLD);
@@ -1659,8 +1659,8 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) {
this->csTimer++;
switch (this->csState) {
case 0:
- if (ActorCutscene_GetCurrentIndex() == -1) {
- Cutscene_Start(play, &play->csCtx);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, PLAYER_CSMODE_1);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -1721,8 +1721,8 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) {
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
func_809E344C(this, play);
this->workTimer[WORK_TIMER_UNK1_A] = 50;
@@ -1773,7 +1773,7 @@ void Boss03_Stunned(Boss03* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
play_sound(NA_SE_IT_WALL_HIT_HARD);
- func_800BC848(&this->actor, play, 10, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 10);
}
} else {
Math_ApproachS(&this->actor.shape.rot.z, -0x6000, 0xA, 0x900);
@@ -1842,16 +1842,16 @@ void Boss03_UpdateCollision(Boss03* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sHeadJntSphElementsInit); i++) {
if (this->headCollider.elements[i].info.toucherFlags & TOUCH_HIT) {
this->headCollider.elements[i].info.toucherFlags &= ~TOUCH_HIT;
- player->unk_B84 = this->actor.shape.rot.y;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.shape.rot.y;
+ player->pushedSpeed = 20.0f;
}
}
for (i = 0; i < ARRAY_COUNT(sBodyJntSphElementsInit); i++) {
if (this->bodyCollider.elements[i].info.toucherFlags & TOUCH_HIT) {
this->bodyCollider.elements[i].info.toucherFlags &= ~TOUCH_HIT;
- player->unk_B84 = this->actor.shape.rot.y;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.shape.rot.y;
+ player->pushedSpeed = 20.0f;
}
}
}
@@ -1993,7 +1993,8 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
Math_ApproachS(&this->actor.shape.rot.z, 0, 0xA, 0x800);
this->actor.world.pos.y -= 100.0f;
this->actor.prevPos.y -= 100.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y += 100.0f;
this->actor.prevPos.y += 100.0f;
}
@@ -2070,9 +2071,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
if ((this->unk_240 % 2) == 0) {
for (i = 0; i < this->bubbleEffectSpawnCount; i++) {
- bubblePos.x = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.x;
- bubblePos.y = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.y;
- bubblePos.z = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.z;
+ bubblePos.x = Rand_CenteredFloat(100.0f) + this->actor.world.pos.x;
+ bubblePos.y = Rand_CenteredFloat(100.0f) + this->actor.world.pos.y;
+ bubblePos.z = Rand_CenteredFloat(100.0f) + this->actor.world.pos.z;
Boss03_SpawnEffectBubble(play, &bubblePos);
}
@@ -2103,9 +2104,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
if (this->wetSpotEffectSpawnCount != 0) {
this->wetSpotEffectSpawnCount--;
- wetSpotPos.x = randPlusMinusPoint5Scaled(50.0f) + player->actor.world.pos.x;
+ wetSpotPos.x = Rand_CenteredFloat(50.0f) + player->actor.world.pos.x;
wetSpotPos.y = PLATFORM_HEIGHT;
- wetSpotPos.z = randPlusMinusPoint5Scaled(50.0f) + player->actor.world.pos.z;
+ wetSpotPos.z = Rand_CenteredFloat(50.0f) + player->actor.world.pos.z;
Boss03_SpawnEffectWetSpot(play, &wetSpotPos);
}
}
@@ -2128,9 +2129,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
for (j = 0, i = 0; i < 20; j++) {
Matrix_RotateYF(yRot, MTXMODE_NEW);
Matrix_MultVecZ(Rand_ZeroFloat(60.000004f) + 312.0f, &dropletPos);
- dropletPos.x += this->unk_284 + randPlusMinusPoint5Scaled(40.0f);
+ dropletPos.x += this->unk_284 + Rand_CenteredFloat(40.0f);
dropletPos.y = PLATFORM_HEIGHT;
- dropletPos.z += this->unk_28C + randPlusMinusPoint5Scaled(40.0f);
+ dropletPos.z += this->unk_28C + Rand_CenteredFloat(40.0f);
if (sqrtf(SQ(dropletPos.x) + SQ(dropletPos.z)) < 355.0f) {
Boss03_SpawnEffectDroplet(play, &dropletPos);
@@ -2262,7 +2263,7 @@ void Boss03_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (!this->unk_2D5) {
if ((this->unk_25E % 2) != 0) {
@@ -2393,8 +2394,8 @@ void Boss03_DrawEffects(PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
for (i = 0; i < GYORG_EFFECT_COUNT; i++, eff++) {
if (eff->type == GYORG_EFFECT_BUBBLE) {
@@ -2425,7 +2426,7 @@ void Boss03_DrawEffects(PlayState* play) {
if ((eff->type == GYORG_EFFECT_DROPLET) || (eff->type == GYORG_EFFECT_SPLASH)) {
if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
@@ -2439,7 +2440,7 @@ void Boss03_DrawEffects(PlayState* play) {
Matrix_Translate(eff->pos.x, eff->pos.y, eff->pos.z, MTXMODE_NEW);
if (eff->type == GYORG_EFFECT_DROPLET) {
- Matrix_RotateYF(Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)) * (M_PI / 0x8000), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(Camera_GetInputDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
} else { // GYORG_EFFECT_SPLASH
Matrix_ReplaceRotation(&play->billboardMtxF);
}
@@ -2459,7 +2460,7 @@ void Boss03_DrawEffects(PlayState* play) {
for (i = 0; i < GYORG_EFFECT_COUNT; i++, eff++) {
if (eff->type == GYORG_EFFECT_WET_SPOT) {
if (!flag) {
- func_8012C448(gfxCtx);
+ Gfx_SetupDL44_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
@@ -2596,7 +2597,7 @@ void Boss03_SeaweedDraw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0D, mtx);
diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.h b/src/overlays/actors/ovl_Boss_03/z_boss_03.h
index a00dbacff..236606369 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.h
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.h
@@ -31,7 +31,7 @@ typedef enum {
/* 1 */ GYORG_EFFECT_BUBBLE,
/* 2 */ GYORG_EFFECT_DROPLET,
/* 3 */ GYORG_EFFECT_SPLASH,
- /* 4 */ GYORG_EFFECT_WET_SPOT,
+ /* 4 */ GYORG_EFFECT_WET_SPOT
} GyorgEffectType;
typedef struct Boss03 {
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 709ef43f8..4e22822a4 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -197,7 +197,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->unk_6F0 = this->unk_6E0 + ((this->unk_6E4 - this->unk_6E0) * 0.5f);
this->actor.world.pos.x = this->unk_6E8;
this->actor.world.pos.z = this->unk_6F0;
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, UPDBGCHECKINFO_FLAG_4);
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_60)) {
func_809ECD00(this, play);
@@ -254,16 +254,16 @@ void func_809EC568(Boss04* this, PlayState* play) {
this->unk_2D0 = 2000.0f;
if ((player->stateFlags1 & PLAYER_STATE1_100000) && (this->actor.projectedPos.z > 0.0f) &&
(fabsf(this->actor.projectedPos.x) < 300.0f) && (fabsf(this->actor.projectedPos.y) < 300.0f)) {
- if ((this->unk_704 >= 15) && (ActorCutscene_GetCurrentIndex() == -1)) {
+ if ((this->unk_704 >= 15) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
Actor* boss;
this->unk_708 = 10;
this->unk_704 = 0;
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
player->actor.world.pos.x = this->unk_6E8;
player->actor.world.pos.z = this->unk_6F0 + 410.0f;
player->actor.shape.rot.y = 0x7FFF;
@@ -389,8 +389,8 @@ void func_809EC568(Boss04* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
Play_DisableMotionBlur();
SET_EVENTINF(EVENTINF_60);
}
@@ -439,8 +439,8 @@ void func_809ECD18(Boss04* this, PlayState* play) {
if (Rand_ZeroOne() < 0.1f) {
Math_Vec3f_Copy(&this->unk_6C8, &player->actor.world.pos);
} else {
- this->unk_6C8.x = randPlusMinusPoint5Scaled(600.0f) + this->unk_6E8;
- this->unk_6C8.z = randPlusMinusPoint5Scaled(600.0f) + this->unk_6F0;
+ this->unk_6C8.x = Rand_CenteredFloat(600.0f) + this->unk_6E8;
+ this->unk_6C8.z = Rand_CenteredFloat(600.0f) + this->unk_6F0;
}
}
@@ -481,7 +481,7 @@ void func_809ECF58(Boss04* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
play_sound(NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 15, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 15, 10);
this->unk_6F4 = 15;
sp3C.x = this->actor.focus.pos.x;
sp3C.y = this->actor.focus.pos.y;
@@ -709,7 +709,8 @@ void Boss04_Update(Actor* thisx, PlayState* play2) {
Actor_MoveWithGravity(&this->actor);
this->actor.world.pos.y -= 100.0f;
this->actor.prevPos.y -= 100.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 100.0f, 120.0f, 200.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 100.0f, 120.0f, 200.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y += 100.0f;
this->actor.prevPos.y += 100.0f;
}
@@ -817,7 +818,7 @@ void Boss04_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_200 & 1) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
@@ -831,7 +832,7 @@ void Boss04_Draw(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
if (this->actionFunc != func_809EC568) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 150);
gSPDisplayList(POLY_XLU_DISP++, gWartShadowMaterialDL);
diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
index 13908ec4d..aa2929f28 100644
--- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c
+++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
@@ -4,7 +4,6 @@
* Description: Igos du Ikana window - curtains and ray effects
*/
-#include "prevent_bss_reordering.h"
#include "z_boss_06.h"
#include "z64shrink_window.h"
#include "overlays/actors/ovl_En_Knight/z_en_knight.h"
@@ -195,12 +194,12 @@ void func_809F24C8(Boss06* this, PlayState* play) {
switch (this->unk_1C9) {
case 0:
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
break;
}
- Cutscene_Start(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ Cutscene_StartManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -332,8 +331,8 @@ void func_809F24C8(Boss06* this, PlayState* play) {
func_809F2ED0(this, play);
func_80169AFC(play, this->subCamId, 0);
this->subCamId = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
D_809F4970->unk_151 = 0;
}
break;
@@ -516,8 +515,8 @@ void Boss06_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
temp_v0 = gSaveContext.save.time;
if (temp_v0 > CLOCK_TIME(12, 0)) {
diff --git a/src/overlays/actors/ovl_Boss_07/z_boss_07.c b/src/overlays/actors/ovl_Boss_07/z_boss_07.c
index 55b98ead2..a1ba4fda1 100644
--- a/src/overlays/actors/ovl_Boss_07/z_boss_07.c
+++ b/src/overlays/actors/ovl_Boss_07/z_boss_07.c
@@ -484,18 +484,18 @@ void Boss07_Incarnation_SpawnDust(Boss07* this, PlayState* play, u8 spawnInterva
Vec3f vel;
Vec3f accel;
- vel.x = randPlusMinusPoint5Scaled(5.0f);
+ vel.x = Rand_CenteredFloat(5.0f);
vel.y = Rand_ZeroFloat(2.0f) + 1.0f;
- vel.z = randPlusMinusPoint5Scaled(5.0f);
+ vel.z = Rand_CenteredFloat(5.0f);
accel.x = accel.z = 0.0f;
accel.y = -0.1f;
pos.y = Rand_ZeroFloat(10.0f) + 3.0f;
if (spawnAtFocus) {
- pos.x = this->actor.focus.pos.x + randPlusMinusPoint5Scaled(150.0f);
- pos.z = this->actor.focus.pos.z + randPlusMinusPoint5Scaled(150.0f);
+ pos.x = this->actor.focus.pos.x + Rand_CenteredFloat(150.0f);
+ pos.z = this->actor.focus.pos.z + Rand_CenteredFloat(150.0f);
} else {
- pos.z = this->incFeetPos[i].z + randPlusMinusPoint5Scaled(20.0f);
- pos.x = this->incFeetPos[i].x + randPlusMinusPoint5Scaled(20.0f);
+ pos.z = this->incFeetPos[i].z + Rand_CenteredFloat(20.0f);
+ pos.x = this->incFeetPos[i].x + Rand_CenteredFloat(20.0f);
}
func_800B0EB0(play, &pos, &vel, &accel, &sDarkOrange, &sDarkRed, Rand_ZeroFloat(150.0f) + 350.0f, 10,
Rand_ZeroFloat(5.0f) + 14.0f);
@@ -521,14 +521,14 @@ void Boss07_SpawnDustAtPos(PlayState* play, Vec3f* spawnPos, u8 count) {
Vec3f vel;
Vec3f accel;
- vel.x = randPlusMinusPoint5Scaled(3.0f);
+ vel.x = Rand_CenteredFloat(3.0f);
vel.y = Rand_ZeroFloat(2.0f) + 1.0f;
- vel.z = randPlusMinusPoint5Scaled(3.0f);
+ vel.z = Rand_CenteredFloat(3.0f);
accel.x = accel.z = 0.0f;
accel.y = -0.1f;
- pos.x = spawnPos->x + randPlusMinusPoint5Scaled(30.0f);
- pos.y = spawnPos->y + 15.0f + randPlusMinusPoint5Scaled(30.0f);
- pos.z = spawnPos->z + randPlusMinusPoint5Scaled(30.0f);
+ pos.x = spawnPos->x + Rand_CenteredFloat(30.0f);
+ pos.y = spawnPos->y + 15.0f + Rand_CenteredFloat(30.0f);
+ pos.z = spawnPos->z + Rand_CenteredFloat(30.0f);
func_800B0EB0(play, &pos, &vel, &accel, &sDarkOrange, &sDarkRed, Rand_ZeroFloat(50.0f) + 100.0f, 10,
Rand_ZeroFloat(5.0f) + 14.0f);
}
@@ -927,7 +927,7 @@ void Boss07_Wrath_Intro(Boss07* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamIndex, 0);
this->subCamIndex = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 6);
this->actor.flags |= ACTOR_FLAG_1;
Play_DisableMotionBlur();
@@ -982,10 +982,10 @@ void Boss07_Wrath_Death(Boss07* this, PlayState* play) {
Boss07_SmoothStop(this, 1.0f);
switch (this->csState) {
case MAJORAS_WRATH_DEATH_STATE_0:
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != -1) {
break;
}
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 1);
this->subCamIndex = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -1165,9 +1165,9 @@ void Boss07_Wrath_Death(Boss07* this, PlayState* play) {
spA8.y = Math_SinS(this->timer_ABC8 * 0x5000) * sp68 * 2.5f;
spA8.z = Math_CosS(this->timer_ABC8 * 0x8000) * sp68;
for (i = 0; i < 2; i++) {
- sp6C.x = randPlusMinusPoint5Scaled(500.0f) + this->actor.world.pos.x;
+ sp6C.x = Rand_CenteredFloat(500.0f) + this->actor.world.pos.x;
sp6C.y = Rand_ZeroFloat(50.0f) + this->actor.world.pos.y + 200.0f;
- sp6C.z = randPlusMinusPoint5Scaled(500.0f) + this->actor.world.pos.z;
+ sp6C.z = Rand_CenteredFloat(500.0f) + this->actor.world.pos.z;
EffectSsHahen_Spawn(play, &sp6C, &sp84, &sp78, 0, Rand_ZeroFloat(5.0f) + 20.0f, -1, 10, NULL);
}
}
@@ -1622,7 +1622,7 @@ void Boss07_Wrath_GrabPlayer(Boss07* this, PlayState* play) {
this->animEndFrame = Animation_GetLastFrame(&gMajorasWrathThrowAnim);
this->actionTimer = 0;
}
- if ((func_800B64FC(play, 1000.0f, &this->actor.world.pos, &sp2C) >= 0.0f) && (sp2C == 1)) {
+ if ((Actor_GetPlayerImpact(play, 1000.0f, &this->actor.world.pos, &sp2C) >= 0.0f) && (sp2C == 1)) {
Boss07_Wrath_SetupShock(this, play);
}
}
@@ -1659,7 +1659,7 @@ void Boss07_Wrath_ThrowPlayer(Boss07* this, PlayState* play) {
}
if (this->actionTimer < 7) {
player->actor.world.pos = this->whipGrabPos;
- if ((func_800B64FC(play, 1000.0f, &this->actor.world.pos, &sp30) >= 0.0f) && (sp30 == 1)) {
+ if ((Actor_GetPlayerImpact(play, 1000.0f, &this->actor.world.pos, &sp30) >= 0.0f) && (sp30 == 1)) {
Boss07_Wrath_SetupShock(this, play);
}
}
@@ -1894,7 +1894,7 @@ void Boss07_Wrath_WhipCollisionCheck(Vec3f* whipPos, f32 tension, Boss07* this,
}
if ((tension >= 50.0f) && (this->whipCollisionTimer == 0) &&
(!(player->stateFlags3 & PLAYER_STATE3_100) || (this->actionState == MAJORAS_WRATH_SPIN_ATTACK))) {
- if ((func_800B64FC(play, 1000.0f, &this->actor.world.pos, &sp98) >= 0.0f) && (sp98 != 1)) {
+ if ((Actor_GetPlayerImpact(play, 1000.0f, &this->actor.world.pos, &sp98) >= 0.0f) && (sp98 != 1)) {
sp98 = -1;
}
for (i = 10; i < sWhipSegCount; i += 3) {
@@ -1931,8 +1931,8 @@ void Boss07_Wrath_WhipCollisionCheck(Vec3f* whipPos, f32 tension, Boss07* this,
play_sound(NA_SE_EN_LAST3_GET_LINK_OLD);
}
} else if ((player->stateFlags1 & PLAYER_STATE1_400000) && Boss07_IsFacingPlayer(this, play)) {
- player->unk_B80 = 10.0f;
- player->unk_B84 = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = 10.0f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
play_sound(NA_SE_IT_SHIELD_BOUND);
this->whipCollisionTimer = 4;
} else {
@@ -1941,9 +1941,9 @@ void Boss07_Wrath_WhipCollisionCheck(Vec3f* whipPos, f32 tension, Boss07* this,
}
sp7C = player->actor.world.pos;
- sp7C.x += randPlusMinusPoint5Scaled(30.0f);
- sp7C.y += randPlusMinusPoint5Scaled(30.0f) + 20.0f;
- sp7C.z += randPlusMinusPoint5Scaled(30.0f);
+ sp7C.x += Rand_CenteredFloat(30.0f);
+ sp7C.y += Rand_CenteredFloat(30.0f) + 20.0f;
+ sp7C.z += Rand_CenteredFloat(30.0f);
EffectSsHitmark_SpawnFixedScale(play, 0, &sp7C);
Boss07_SpawnDustAtPos(play, &player->actor.world.pos, 7);
break;
@@ -1961,8 +1961,8 @@ void Boss07_Wrath_CollisionCheck(Boss07* this, PlayState* play) {
if (this->invincibilityTimer == 0) {
if (this->kickCollider.elements[0].info.toucherFlags & TOUCH_HIT) {
this->kickCollider.elements[0].info.toucherFlags &= ~TOUCH_HIT;
- player->unk_B84 = this->actor.yawTowardsPlayer;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = 20.0f;
Boss07_SpawnDustAtPos(play, &player->actor.world.pos, 12);
play_sound(NA_SE_IT_HOOKSHOT_STICK_OBJ);
}
@@ -2037,8 +2037,8 @@ void Boss07_Wrath_BreakIce(Boss07* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, this->bodyPartsPos, 30, NA_SE_EV_ICE_BROKEN);
for (i = 0; i < 2 * ARRAY_COUNT(this->bodyPartsPos); i++) {
- vel.x = randPlusMinusPoint5Scaled(7.0f);
- vel.z = randPlusMinusPoint5Scaled(7.0f);
+ vel.x = Rand_CenteredFloat(7.0f);
+ vel.z = Rand_CenteredFloat(7.0f);
vel.y = Rand_ZeroFloat(6.0f) + 4.0f;
pos.x = this->bodyPartsPos[i / 2].x + vel.x;
@@ -2141,8 +2141,8 @@ void Boss07_Wrath_Update(Actor* thisx, PlayState* play2) {
s32 i;
Player* player = GET_PLAYER(play);
- play->envCtx.unk_C1 = 2;
- play->envCtx.unk_C2 = 0;
+ play->envCtx.lightSetting = 2;
+ play->envCtx.prevLightSetting = 0;
this->actor.hintId = 52;
Math_ApproachF(&play->envCtx.lightBlend, 0.0f, 1.0f, 0.03f);
this->updateWhips = true;
@@ -2460,7 +2460,7 @@ void Boss07_Wrath_DrawWhips(Boss07* this, PlayState* play, Vec3f* pos, Vec3f* ro
Vec3f* vec3 = rot;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gMajorasMaskWhipShadowMaterialDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sREG(48) + 45, 35, 75, 255);
topSegIndex = (hand == RIGHT_HAND) ? this->whipTopIndex : 0;
@@ -2627,7 +2627,7 @@ void Boss07_Wrath_DrawShocks(Boss07* this, PlayState* play) {
OPEN_DISPS(gfxCtx = play->state.gfxCtx);
if ((this->unk_32C > 0.0f) || (this->unk_330 > 0.0f)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0);
@@ -2654,9 +2654,9 @@ void Boss07_Wrath_DrawShocks(Boss07* this, PlayState* play) {
if (this->unk_330 > 0.0f) {
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial2DL);
for (i = 0; i < 2 * ARRAY_COUNT(this->bodyPartsPos); i++) {
- Matrix_Translate(this->bodyPartsPos[i / 2].x + randPlusMinusPoint5Scaled(30.0f),
- this->bodyPartsPos[i / 2].y + randPlusMinusPoint5Scaled(30.0f),
- this->bodyPartsPos[i / 2].z + randPlusMinusPoint5Scaled(30.0f), MTXMODE_NEW);
+ Matrix_Translate(this->bodyPartsPos[i / 2].x + Rand_CenteredFloat(30.0f),
+ this->bodyPartsPos[i / 2].y + Rand_CenteredFloat(30.0f),
+ this->bodyPartsPos[i / 2].z + Rand_CenteredFloat(30.0f), MTXMODE_NEW);
Matrix_Scale(this->unk_330, this->unk_330, this->unk_330, MTXMODE_APPLY);
Matrix_RotateXFApply(Rand_ZeroFloat(2.0f * M_PI));
Matrix_RotateZF(Rand_ZeroFloat(2.0f * M_PI), MTXMODE_APPLY);
@@ -2679,7 +2679,7 @@ void Boss07_Wrath_DrawDeathLights(Boss07* this, PlayState* play, Vec3f* pos) {
if (this->deathOrbScale > 0.0f) {
Boss07_InitRand(1, 0x71B8, 0x263A);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, 20);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
for (i = 0; i < ARRAY_COUNT(this->deathLightScale); i++) {
temp = sShotEnvColors[0];
@@ -2697,7 +2697,7 @@ void Boss07_Wrath_DrawDeathLights(Boss07* this, PlayState* play, Vec3f* pos) {
gSPDisplayList(POLY_XLU_DISP++, gMajorasWrathDeathLightModelDL);
}
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, (u8)(220 + sREG(18)), (u8)(170 + sREG(16)));
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, (u8)(100 + sREG(22)), 128);
@@ -2724,7 +2724,7 @@ void Boss07_Static_DrawLight(Boss07* this, PlayState* play) {
player = GET_PLAYER(play);
if (this->introOrbScale > 0.0f) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)(sREG(52) + 255));
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0);
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
@@ -2759,8 +2759,8 @@ void Boss07_Wrath_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->dmgFogEffectTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
@@ -2901,7 +2901,7 @@ void Boss07_Wrath_DrawShadowTex(u8* shadowTex, Boss07* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
phi_f0 = (400.0f - this->actor.world.pos.y) * 0.0025f;
phi_f0 = CLAMP_MIN(phi_f0, 0.0f);
phi_f0 = CLAMP_MAX(phi_f0, 1.0f); // could be variant of clamp_var
@@ -3070,7 +3070,7 @@ void Boss07_Incarnation_Intro(Boss07* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamIndex, 0);
this->subCamIndex = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 6);
this->actor.flags |= ACTOR_FLAG_1;
}
@@ -3207,7 +3207,7 @@ void Boss07_Incarnation_Run(Boss07* this, PlayState* play) {
this->timer_AB40 = 0;
}
SkelAnime_Update(&this->skelAnime);
- if ((func_800B64FC(play, 5.0f, &this->actor.world.pos, &sp2C) >= 0.0f) && (sp2C == 0)) {
+ if ((Actor_GetPlayerImpact(play, 5.0f, &this->actor.world.pos, &sp2C) >= 0.0f) && (sp2C == 0)) {
Boss07_Incarnation_SetupStunned(this, play, 50);
Actor_PlaySfx(&this->actor, NA_SE_EN_LAST2_DAMAGE_OLD);
} else {
@@ -3298,7 +3298,7 @@ void Boss07_Incarnation_Hopak(Boss07* this, PlayState* play) {
if (this->timers[1] == 0) {
if ((this->actionTimer == 0) && (Rand_ZeroOne() < 0.7f)) {
if (Rand_ZeroOne() < 0.75f) {
- this->unk_180 = randPlusMinusPoint5Scaled(0x10000);
+ this->unk_180 = Rand_CenteredFloat(0x10000);
} else {
this->unk_180 = this->actor.yawTowardsPlayer;
}
@@ -3332,7 +3332,7 @@ void Boss07_Incarnation_Moonwalk(Boss07* this, PlayState* play) {
if (this->timers[1] == 0) {
if ((this->actionTimer == 0) && (Rand_ZeroOne() < 0.5f)) {
if (Rand_ZeroOne() < 0.75f) {
- this->unk_180 = randPlusMinusPoint5Scaled(0x10000);
+ this->unk_180 = Rand_CenteredFloat(0x10000);
} else {
this->unk_180 = this->actor.yawTowardsPlayer + 0x8000;
}
@@ -3363,7 +3363,7 @@ void Boss07_Incarnation_Pirouette(Boss07* this, PlayState* play) {
if (this->timers[1] == 0) {
if (((this->actionTimer % 0x40) == 0) && (Rand_ZeroOne() < 0.5f)) {
if (Rand_ZeroOne() < 0.75f) {
- this->unk_180 = randPlusMinusPoint5Scaled(0x10000);
+ this->unk_180 = Rand_CenteredFloat(0x10000);
} else {
this->unk_180 = this->actor.yawTowardsPlayer;
}
@@ -3404,10 +3404,10 @@ void Boss07_Incarnation_Death(Boss07* this, PlayState* play) {
Boss07_SmoothStop(this, 3.0f);
switch (this->csState) {
case MAJORAS_INCARNATION_DEATH_STATE_0:
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != -1) {
break;
}
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 7);
this->subCamIndex = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -3609,8 +3609,8 @@ void Boss07_Incarnation_Update(Actor* thisx, PlayState* play2) {
this->envEffectTimer = 0;
}
}
- play->envCtx.unk_C2 = D_80A08198[this->envEffectTimer];
- play->envCtx.unk_C1 = D_80A081A0[this->envEffectTimer];
+ play->envCtx.prevLightSetting = D_80A08198[this->envEffectTimer];
+ play->envCtx.lightSetting = D_80A081A0[this->envEffectTimer];
}
Math_ApproachF(&play->envCtx.lightBlend, 0.0f, 1.0f, 0.03f);
if (KREG(63) == 0) {
@@ -3666,7 +3666,7 @@ void Boss07_Afterimage_Draw(Actor* thisx, PlayState* play2) {
Boss07* sp34 = (Boss07*)this->actor.parent;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 100, 155, 900, 1099);
SkelAnime_DrawFlexOpa(play, sp34->skelAnime.skeleton, this->skelAnime.jointTable, sp34->skelAnime.dListCount, NULL,
NULL, &this->actor);
@@ -3788,8 +3788,8 @@ void Boss07_Incarnation_Draw(Actor* thisx, PlayState* play2) {
Boss07* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->dmgFogEffectTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
@@ -4140,9 +4140,9 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
Vec3f sp12C;
Vec3f sp120;
- sp138.x = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.x;
- sp138.y = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.y;
- sp138.z = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.z;
+ sp138.x = Rand_CenteredFloat(20.0f) + beamMarkPos.x;
+ sp138.y = Rand_CenteredFloat(20.0f) + beamMarkPos.y;
+ sp138.z = Rand_CenteredFloat(20.0f) + beamMarkPos.z;
sp12C.x = 0.0f;
sp12C.y = 6.0f;
sp12C.z = 0.0f;
@@ -4176,8 +4176,8 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
this->beamTargetPitch = sp118.x;
this->beamTargetYaw = sp118.y;
} else {
- player->unk_B84 = this->actor.yawTowardsPlayer;
- player->unk_B80 = this->beamXYscale * 0.5f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = this->beamXYscale * 0.5f;
sMajoraStatic->lensFlareOn = true;
sMajoraStatic->lensFlareScale = this->beamXYscale * 30.0f;
sMajoraStatic->lensFlarePos = this->unk_18A8;
@@ -4202,9 +4202,9 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
this->beamDmgTimer += 2;
this->unk_18C0 = sp180 * 0.062f;
if (this->beamDmgTimer < 10) {
- sp108.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(40.0f);
- sp108.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(40.0f);
- sp108.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(40.0f);
+ sp108.x = this->actor.world.pos.x + Rand_CenteredFloat(40.0f);
+ sp108.y = this->actor.world.pos.y + Rand_CenteredFloat(40.0f);
+ sp108.z = this->actor.world.pos.z + Rand_CenteredFloat(40.0f);
spFC.x = 0.0f;
spFC.y = 6.0f;
spFC.z = 0.0f;
@@ -4221,12 +4221,12 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
Boss07_Mask_SetupDamaged(this, play, 2, NULL);
Boss07_Mask_ClearBeam(this);
for (phi_s0_2 = 0; phi_s0_2 < 20; phi_s0_2++) {
- sp108.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(50.0f);
- sp108.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(50.0f);
- sp108.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(50.0f);
- spFC.x = randPlusMinusPoint5Scaled(20.0f);
- spFC.y = randPlusMinusPoint5Scaled(20.0f);
- spFC.z = randPlusMinusPoint5Scaled(20.0f);
+ sp108.x = this->actor.world.pos.x + Rand_CenteredFloat(50.0f);
+ sp108.y = this->actor.world.pos.y + Rand_CenteredFloat(50.0f);
+ sp108.z = this->actor.world.pos.z + Rand_CenteredFloat(50.0f);
+ spFC.x = Rand_CenteredFloat(20.0f);
+ spFC.y = Rand_CenteredFloat(20.0f);
+ spFC.z = Rand_CenteredFloat(20.0f);
spF0.x = spFC.x * -0.05f;
spF0.y = spFC.y * -0.05f;
spF0.z = spFC.z * -0.05f;
@@ -4260,9 +4260,9 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
this->beamDmgTimer += 2;
this->unk_18C0 = sp180 * 0.062f;
if (this->beamDmgTimer < 5) {
- spE0.x = sBossRemains[sp178]->actor.world.pos.x + randPlusMinusPoint5Scaled(40.0f);
- spE0.y = sBossRemains[sp178]->actor.world.pos.y + randPlusMinusPoint5Scaled(40.0f);
- spE0.z = sBossRemains[sp178]->actor.world.pos.z + randPlusMinusPoint5Scaled(40.0f);
+ spE0.x = sBossRemains[sp178]->actor.world.pos.x + Rand_CenteredFloat(40.0f);
+ spE0.y = sBossRemains[sp178]->actor.world.pos.y + Rand_CenteredFloat(40.0f);
+ spE0.z = sBossRemains[sp178]->actor.world.pos.z + Rand_CenteredFloat(40.0f);
spD4.x = 0.0f;
spD4.y = 6.0f;
spD4.z = 0.0f;
@@ -4278,14 +4278,14 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_FOLLOWERS_DEAD);
for (pad = 0; pad < 20; pad++) {
spE0.x =
- sBossRemains[sp178]->actor.world.pos.x + randPlusMinusPoint5Scaled(50.0f);
+ sBossRemains[sp178]->actor.world.pos.x + Rand_CenteredFloat(50.0f);
spE0.y =
- sBossRemains[sp178]->actor.world.pos.y + randPlusMinusPoint5Scaled(50.0f);
+ sBossRemains[sp178]->actor.world.pos.y + Rand_CenteredFloat(50.0f);
spE0.z =
- sBossRemains[sp178]->actor.world.pos.z + randPlusMinusPoint5Scaled(50.0f);
- spD4.x = randPlusMinusPoint5Scaled(20.0f);
- spD4.y = randPlusMinusPoint5Scaled(20.0f);
- spD4.z = randPlusMinusPoint5Scaled(20.0f);
+ sBossRemains[sp178]->actor.world.pos.z + Rand_CenteredFloat(50.0f);
+ spD4.x = Rand_CenteredFloat(20.0f);
+ spD4.y = Rand_CenteredFloat(20.0f);
+ spD4.z = Rand_CenteredFloat(20.0f);
spC8.x = spD4.x * -0.05f;
spC8.y = spD4.y * -0.05f;
spC8.z = spD4.z * -0.05f;
@@ -4302,9 +4302,9 @@ void Boss07_Mask_Beam(Boss07* this, PlayState* play) {
Vec3f spA4;
sp14B = true;
- spBC.x = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.x;
- spBC.y = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.y;
- spBC.z = randPlusMinusPoint5Scaled(20.0f) + beamMarkPos.z;
+ spBC.x = Rand_CenteredFloat(20.0f) + beamMarkPos.x;
+ spBC.y = Rand_CenteredFloat(20.0f) + beamMarkPos.y;
+ spBC.z = Rand_CenteredFloat(20.0f) + beamMarkPos.z;
spB0.x = 0.0f;
spB0.y = 6.0f;
spB0.z = 0.0f;
@@ -4387,10 +4387,10 @@ void Boss07_Mask_Intro(Boss07* this, PlayState* play) {
this->actor.world.pos.x = 0.0f;
this->actor.world.pos.y = 277.0f;
this->actor.world.pos.z = -922.5f;
- if (!((player->actor.world.pos.z < 700.0f) && (ActorCutscene_GetCurrentIndex() == -1))) {
+ if (!((player->actor.world.pos.z < 700.0f) && (CutsceneManager_GetCurrentCsId() == -1))) {
break;
}
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 7);
this->subCamIndex = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -4519,8 +4519,8 @@ void Boss07_Mask_Intro(Boss07* this, PlayState* play) {
this->actor.world.pos.x -= 2.0f;
}
for (i = 0; i < 3; i++) {
- sp60.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(110.0f);
- sp60.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(110.0f);
+ sp60.x = this->actor.world.pos.x + Rand_CenteredFloat(110.0f);
+ sp60.y = this->actor.world.pos.y + Rand_CenteredFloat(110.0f);
sp60.z = this->actor.world.pos.z + 10.0f;
EffectSsHahen_Spawn(play, &sp60, &sp78, &sp6C, 0, (Rand_ZeroOne() * 5.0f) + 10.0f, -1, 10, NULL);
}
@@ -4581,7 +4581,7 @@ void Boss07_Mask_Intro(Boss07* this, PlayState* play) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamIndex, 0);
this->subCamIndex = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 6);
this->actor.flags |= ACTOR_FLAG_1;
gSaveContext.eventInf[6] |= 2;
@@ -4636,8 +4636,8 @@ void Boss07_Mask_Death(Boss07* this, PlayState* play) {
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
switch (this->csState) {
case MAJORAS_MASK_DEATH_STATE_0:
- if (ActorCutscene_GetCurrentIndex() == -1) {
- Cutscene_Start(play, &play->csCtx);
+ if (CutsceneManager_GetCurrentCsId() == -1) {
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 1);
this->subCamIndex = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -4755,8 +4755,8 @@ void Boss07_Mask_Update(Actor* thisx, PlayState* play2) {
Math_Vec3f_Copy(&sSfxPoint, &this->actor.projectedPos);
if ((sMajoraStatic == NULL) || (sMajoraStatic->subCamIndex == SUB_CAM_ID_DONE)) {
this->updateWhips = true;
- play->envCtx.unk_C1 = 2;
- play->envCtx.unk_C2 = 0;
+ play->envCtx.lightSetting = 2;
+ play->envCtx.prevLightSetting = 0;
Math_ApproachF(&play->envCtx.lightBlend, this->beamXYscale, 1.0f, 0.1f);
this->actionTimer++;
if (KREG(63) == 0) {
@@ -4853,9 +4853,9 @@ void Boss07_Mask_Update(Actor* thisx, PlayState* play2) {
Vec3f sp44;
f32 sp40 = (this->actionFunc == Boss07_Mask_Death) ? 130.0f : 80.0f;
- sp5C.x = randPlusMinusPoint5Scaled(sp40) + this->actor.world.pos.x;
- sp5C.y = randPlusMinusPoint5Scaled(sp40) + this->actor.world.pos.y;
- sp5C.z = randPlusMinusPoint5Scaled(sp40) + this->actor.world.pos.z;
+ sp5C.x = Rand_CenteredFloat(sp40) + this->actor.world.pos.x;
+ sp5C.y = Rand_CenteredFloat(sp40) + this->actor.world.pos.y;
+ sp5C.z = Rand_CenteredFloat(sp40) + this->actor.world.pos.z;
sp50.x = 0.0f;
sp50.y = 5.0f;
sp50.z = 0.0f;
@@ -5075,8 +5075,8 @@ void Boss07_Mask_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
temp_f20 = this->dmgShakeTimer * (M_PI / 4.0f) * 0.06666667f;
temp_f22 = Math_SinS(this->dmgShakeTimer * 0x3500) * temp_f20 * 0.5f;
Matrix_RotateYF(Math_SinS(this->dmgShakeTimer * 0x4500) * temp_f20, MTXMODE_APPLY);
@@ -5194,7 +5194,7 @@ void Boss07_Projectile_Draw(Actor* thisx, PlayState* play2) {
Boss07* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, sShotPrimColors[this->shotColorIndex][0],
sShotPrimColors[this->shotColorIndex][1], sShotPrimColors[this->shotColorIndex][2], 255);
@@ -5462,8 +5462,8 @@ void Boss07_Remains_Fly(Boss07* this, PlayState* play) {
}
}
if (this->timer_18D6 != 0) {
- sp60.x = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.x;
- sp60.z = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.z;
+ sp60.x = Rand_CenteredFloat(80.0f) + this->actor.world.pos.x;
+ sp60.z = Rand_CenteredFloat(80.0f) + this->actor.world.pos.z;
if (this->readyDeath) {
sp48.x = sp48.z = 0.0f;
sp48.y = 0.03f;
@@ -5529,7 +5529,7 @@ void Boss07_Remains_Draw(Actor* thisx, PlayState* play2) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->dmgFogEffectTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
@@ -5725,14 +5725,14 @@ void Boss07_Top_Collide(Boss07* this, PlayState* play) {
CollisionCheck_SpawnShieldParticles(play, &this->actor.focus.pos);
CollisionCheck_SpawnShieldParticles(play, &top->actor.focus.pos);
if (this->timers[0] > 80) {
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled((f32)(sREG(29) + 20) * 0x100);
+ this->actor.shape.rot.z = Rand_CenteredFloat((f32)(sREG(29) + 20) * 0x100);
for (i = 0; i < 5; i++) {
DECR(this->timers[0]);
DECR(this->timers[1]);
}
}
if (top->timers[0] > 80) {
- top->actor.shape.rot.z = randPlusMinusPoint5Scaled((f32)(sREG(29) + 20) * 0x100);
+ top->actor.shape.rot.z = Rand_CenteredFloat((f32)(sREG(29) + 20) * 0x100);
for (i = 0; i < 5; i++) {
DECR(top->timers[0]);
DECR(top->timers[1]);
@@ -5760,8 +5760,8 @@ void Boss07_Top_CollisionCheck(Boss07* this, PlayState* play) {
if ((this->actor.colChkInfo.damageEffect == MAJORAS_TOP_DMGEFF_D) ||
(this->actor.colChkInfo.damageEffect == MAJORAS_TOP_DMGEFF_A)) {
if (this->actor.colChkInfo.damageEffect == MAJORAS_TOP_DMGEFF_D) {
- player->unk_B84 = this->actor.yawTowardsPlayer;
- player->unk_B80 = 20.0f;
+ player->pushedYaw = this->actor.yawTowardsPlayer;
+ player->pushedSpeed = 20.0f;
}
if (this->timers[0] > 40) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
@@ -5793,14 +5793,14 @@ void Boss07_Top_CollisionCheck(Boss07* this, PlayState* play) {
}
}
if (this->actor.bgCheckFlags & 1) {
- if ((func_800B64FC(play, 5.0f, &this->actor.world.pos, &sp3C) >= 0.0f) && (sp3C == 0)) {
+ if ((Actor_GetPlayerImpact(play, 5.0f, &this->actor.world.pos, &sp3C) >= 0.0f) && (sp3C == 0)) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.velocity.y = sREG(55) + 25.0f;
sp38 = true;
}
}
if (sp38 && (this->timers[0] > 90)) {
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled((f32)(sREG(29) + 30) * 0x100);
+ this->actor.shape.rot.z = Rand_CenteredFloat((f32)(sREG(29) + 30) * 0x100);
this->timers[0] = Rand_ZeroFloat(10.0f) + 70.0f;
this->timers[1] = this->timers[0] + 70;
}
@@ -5840,7 +5840,7 @@ void Boss07_Top_Draw(Actor* thisx, PlayState* play2) {
Boss07* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->dmgFogEffectTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 780, 1099);
}
@@ -5885,8 +5885,8 @@ void Boss07_Static_Update(Actor* thisx, PlayState* play2) {
}
break;
case MAJORAS_STATIC_CS_STATE_1:
- if (ActorCutscene_GetCurrentIndex() == -1) {
- Cutscene_Start(play, &play->csCtx);
+ if (CutsceneManager_GetCurrentCsId() == -1) {
+ Cutscene_StartManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 7);
this->subCamIndex = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
@@ -5966,7 +5966,7 @@ void Boss07_Static_Update(Actor* thisx, PlayState* play2) {
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamIndex, 0);
this->subCamIndex = SUB_CAM_ID_DONE;
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
func_800B7298(play, &this->actor, 6);
Play_DisableMotionBlur();
for (i = 0; i < ARRAY_COUNT(sBossRemains); i++) {
@@ -6044,7 +6044,7 @@ void Boss07_Static_DrawEffects(PlayState* play) {
s32 i;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(sEffects); i++, effect++) {
if (effect->type > MAJORAS_EFFECT_NONE) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 200, 20, 0, effect->alpha);
diff --git a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
index cb34f8ff8..cba240947 100644
--- a/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
+++ b/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c
@@ -258,7 +258,7 @@ s32 func_808CDE78(PlayState* play, SkelCurve* skelCurve, s32 limbIndex, Actor* t
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->envXluColor[0], this->envXluColor[1], this->envXluColor[2], 255);
@@ -284,7 +284,7 @@ void func_808CDFF8(Actor* thisx, PlayState* play) {
OPEN_DISPS(gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 25);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_25);
Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
SkelCurve_Draw(&this->actor, play, &this->skelCurve, func_808CDE78, NULL, 1, &this->actor);
@@ -299,7 +299,7 @@ void func_808CE078(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->envXluColor[0], this->envXluColor[1], this->envXluColor[2], 255);
diff --git a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c
index aa37e7b85..6882c189a 100644
--- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c
+++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.c
@@ -34,7 +34,7 @@ static s16 sObjectBankIndices[] = { OBJECT_GI_MASK14, OBJECT_GI_SWORD_4 };
static s16 sGetItemDraws[] = { GID_MASK_GREAT_FAIRY, GID_SWORD_GREAT_FAIRY };
-static u16 sCsActionIndices[] = { 0x6E, 0x236 };
+static u16 sCueTypes[] = { CS_CMD_ACTOR_CUE_110, CS_CMD_ACTOR_CUE_566 };
void DemoGetitem_Init(Actor* thisx, PlayState* play) {
s32 pad;
@@ -49,7 +49,7 @@ void DemoGetitem_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.25f);
this->actionFunc = func_80A4FB10;
this->item = sGetItemDraws[itemIndex];
- this->csAction = sCsActionIndices[itemIndex];
+ this->cueType = sCueTypes[itemIndex];
objectIndex = Object_GetIndex(&play->objectCtx, sObjectBankIndices[itemIndex]);
if (objectIndex < 0) {
Actor_Kill(&this->actor);
@@ -74,14 +74,14 @@ void func_80A4FB68(DemoGetitem* this, PlayState* play2) {
PlayState* play = play2;
u16 sp22 = (play->gameplayFrames * 1000) & 0xFFFF;
- if (Cutscene_CheckActorAction(play, this->csAction)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action != 4) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id != 4) {
this->actor.shape.yOffset = 0.0f;
}
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
case 2:
this->actor.draw = DemoGetitem_Draw;
- Cutscene_ActorTranslate(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csAction));
+ Cutscene_ActorTranslate(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
this->actor.shape.rot.y += 0x3E8;
break;
@@ -91,7 +91,7 @@ void func_80A4FB68(DemoGetitem* this, PlayState* play2) {
case 4:
this->actor.draw = DemoGetitem_Draw;
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csAction));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
this->actor.shape.yOffset = Math_SinS(sp22) * 15.0f;
break;
diff --git a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h
index 91c7dc97e..ca00f6048 100644
--- a/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h
+++ b/src/overlays/actors/ovl_Demo_Getitem/z_demo_getitem.h
@@ -12,7 +12,7 @@ typedef void (*DemoGetitemActionFunc)(struct DemoGetitem*, PlayState*);
typedef struct DemoGetitem {
/* 0x000 */ Actor actor;
/* 0x144 */ s16 item;
- /* 0x146 */ u16 csAction;
+ /* 0x146 */ u16 cueType;
/* 0x148 */ s8 objectIndex;
/* 0x14C */ DemoGetitemActionFunc actionFunc;
} DemoGetitem; // size = 0x150
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 f499b7e20..1ee2b1c9d 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -506,7 +506,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER)) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
@@ -572,7 +572,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
}
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(play->state.frames * 20.0f), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.0f), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -598,7 +598,8 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(gfxCtx);
+
+ Gfx_SetupDL25_Xlu(gfxCtx);
for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
@@ -644,7 +645,7 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(play->state.frames * 20.0f), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.0f), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
index 971adb3bd..cbee0a148 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
@@ -38,14 +38,14 @@ typedef struct DemoKankyo {
typedef enum {
/* 0 */ DEMO_KANKYO_TYPE_LOSTWOODS,
/* 1 */ DEMO_KANKYO_TYPE_GIANTS,
- /* 2 */ DEMO_KANKYO_TYPE_MOON,
+ /* 2 */ DEMO_KANKYO_TYPE_MOON
} DemoKankyoType;
typedef enum {
/* 0 */ DEMO_KANKYO_STATE_INIT,
/* 1 */ DEMO_KANKYO_STATE_SINGLE,
/* 2 */ DEMO_KANKYO_STATE_SKYFISH,
- /* 3 */ DEMO_KANKYO_STATE_DISABLED,
+ /* 3 */ DEMO_KANKYO_STATE_DISABLED
} DemoKankyoStateType;
#endif // Z_DEMO_KANKYO_H
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
index 76a4230f5..ec33a8a94 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
@@ -15,8 +15,12 @@ void DemoMoonend_Destroy(Actor* thisx, PlayState* play);
void DemoMoonend_Update(Actor* thisx, PlayState* play);
void DemoMoonend_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Demo_Moonend_InitVars = {
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play);
+void func_80C17B60(DemoMoonend* this, PlayState* play);
+void func_80C17C48(DemoMoonend* this, PlayState* play);
+void func_80C17FCC(Actor* thisx, PlayState* play);
+
+const ActorInit Demo_Moonend_InitVars = {
ACTOR_DEMO_MOONEND,
ACTORCAT_ITEMACTION,
FLAGS,
@@ -28,28 +32,185 @@ ActorInit Demo_Moonend_InitVars = {
(ActorFunc)DemoMoonend_Draw,
};
-#endif
+void DemoMoonend_Init(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-extern UNK_TYPE D_06001214;
-extern UNK_TYPE D_0600B540;
-extern UNK_TYPE D_060129F0;
+ Actor_SetScale(&this->actor, 0.1f);
+ this->actionFunc = DemoMoonend_DoNothing;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Init.s")
+ if (DEMOMOONEND_GET_PARAM_F(thisx) == 1) {
+ Actor_SetScale(&this->actor, 0.05f);
+ Actor_SetScale(&this->actor, 6.0f);
+ this->actor.draw = NULL;
+ this->cueType = CS_CMD_ACTOR_CUE_558;
+ this->actionFunc = func_80C17B60;
+ } else {
+ Actor_SetScale(&this->actor, 0.095f);
+ func_80183430(&this->skeletonInfo, &object_moonend_Blob_00B5A0, &object_moonend_Blob_001214, this->jointTable,
+ this->morphTable, NULL);
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->cueType = CS_CMD_ACTOR_CUE_560;
+ this->actionFunc = func_80C17C48;
+ this->actor.home.rot.z = 0;
+ this->actor.draw = NULL;
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Destroy.s")
+void DemoMoonend_Destroy(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B50.s")
+ if (DEMOMOONEND_GET_PARAM_F(thisx) != 1) {
+ func_8018349C(&this->skeletonInfo);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B60.s")
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17C48.s")
+void func_80C17B60(DemoMoonend* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Update.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = NULL;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17E70.s")
+ case 2:
+ this->actor.draw = func_80C17FCC;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17EE0.s")
+ default:
+ break;
+ }
+ }
+ if (this->cueId == 2) {
+ func_800B9010(&this->actor, NA_SE_EV_RAINBOW - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Draw.s")
+void func_80C17C48(DemoMoonend* this, PlayState* play) {
+ if (func_80183DE0(&this->skeletonInfo)) {
+ this->actor.home.rot.z = 0;
+ }
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17FCC.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 0.0f;
+ break;
+
+ case 2:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_EXPLOSION);
+ this->actor.home.rot.z = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (this->actor.home.rot.z != 0) {
+ func_800B9010(&this->actor, NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+ if ((play->csCtx.state != CS_STATE_IDLE) && (gSaveContext.sceneLayer == 8) && (play->csCtx.scriptIndex == 0)) {
+ switch (play->csCtx.curFrame) {
+ case 5:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
+ break;
+
+ case 50:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 100:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM3);
+ break;
+
+ case 150:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 200:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM4);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void DemoMoonend_Update(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+s32 func_80C17E70(PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 2) {
+ Matrix_Push();
+ Matrix_RotateYS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000, MTXMODE_APPLY);
+ }
+
+ return true;
+}
+
+s32 func_80C17EE0(PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 8) {
+ Matrix_Pop();
+ }
+
+ return true;
+}
+
+void DemoMoonend_Draw(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+ Mtx* mtx;
+
+ AnimatedMat_Draw(play, (AnimatedMaterial*)Lib_SegmentedToVirtual(object_moonend_Matanimheader_00B540));
+
+ mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
+
+ if (mtx != NULL) {
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ func_8018450C(play, &this->skeletonInfo, mtx, func_80C17E70, func_80C17EE0, &this->actor);
+ }
+}
+
+void func_80C17FCC(Actor* thisx, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_moonend_Matanimheader_0129F0));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_moonend_DL_010C40);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
index d36dcb284..b56c60a9b 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
@@ -2,14 +2,21 @@
#define Z_DEMO_MOONEND_H
#include "global.h"
+#include "objects/object_moonend/object_moonend.h"
struct DemoMoonend;
typedef void (*DemoMoonendActionFunc)(struct DemoMoonend*, PlayState*);
+#define DEMOMOONEND_GET_PARAM_F(thisx) (((thisx)->params) & 0xF)
+
typedef struct DemoMoonend {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x19C];
+ /* 0x144 */ SkeletonInfo skeletonInfo;
+ /* 0x174 */ Vec3s jointTable[30];
+ /* 0x228 */ Vec3s morphTable[30];
+ /* 0x2DC */ u16 cueType;
+ /* 0x2DE */ u16 cueId;
/* 0x2E0 */ DemoMoonendActionFunc actionFunc;
} DemoMoonend; // size = 0x2E4
diff --git a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
index b1d5c7128..2d0aa27cd 100644
--- a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
+++ b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.c
@@ -68,7 +68,7 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
this->unk_3E6 = 0;
this->unk_3DC = NULL;
this->unk_3E0 = NULL;
- this->unk_3F2 = 0;
+ this->cueId = 0;
this->unk_3D8 = 1.0f;
switch (DEMOSYOTEN_GET_F(&this->actor)) {
@@ -81,7 +81,7 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
this->actor.child =
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_DUST, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, 0);
- this->unk_3F0 = 0x215;
+ this->cueType = CS_CMD_ACTOR_CUE_533;
Actor_SetScale(&this->actor, 0.05f);
break;
@@ -91,14 +91,14 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
this->unk_3E0 = Lib_SegmentedToVirtual(&object_syoten_Matanimheader_001448);
this->unk_3E4 |= 1;
this->actionFunc = func_80C16BD4;
- this->unk_3F0 = 0x215;
+ this->cueType = CS_CMD_ACTOR_CUE_533;
Actor_SetScale(&this->actor, 0.05f);
break;
case DEMOSYOTEN_F_2:
this->unk_3DC = object_syoten_DL_001730;
this->unk_3E0 = Lib_SegmentedToVirtual(&object_syoten_Matanimheader_0018B8);
- this->unk_3F0 = 0x216;
+ this->cueType = CS_CMD_ACTOR_CUE_534;
this->actionFunc = func_80C16DD4;
this->unk_3E4 |= 2;
Actor_SetScale(&this->actor, 4.0f);
@@ -107,7 +107,7 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
case DEMOSYOTEN_F_3:
this->unk_3DC = object_syoten_DL_001DD0;
this->unk_3E0 = Lib_SegmentedToVirtual(&object_syoten_Matanimheader_002B98);
- this->unk_3F0 = 0x218;
+ this->cueType = CS_CMD_ACTOR_CUE_536;
this->unk_3E4 |= 8;
this->actionFunc = func_80C16EAC;
Actor_SetScale(&this->actor, 0.5f);
@@ -118,7 +118,7 @@ void DemoSyoten_Init(Actor* thisx, PlayState* play) {
this->unk_3E0 = Lib_SegmentedToVirtual(&object_syoten_Matanimheader_002B88);
this->unk_3E4 |= 2;
this->actionFunc = func_80C17008;
- this->unk_3F0 = 0x217;
+ this->cueType = CS_CMD_ACTOR_CUE_535;
this->unk_3E4 |= 1;
this->unk_3E4 |= 8;
this->actor.draw = func_80C17690;
@@ -219,20 +219,20 @@ void func_80C16A64(DemoSyoten* this, PlayState* play) {
}
void func_80C16A74(DemoSyoten* this, PlayState* play) {
- u16 temp_a0;
+ u16 cueId;
func_80183DE0(&this->unk_144);
- if (Cutscene_CheckActorAction(play, this->unk_3F0)) {
- if ((play->csCtx.frames >= 160) && (play->csCtx.frames < 322)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ if ((play->csCtx.curFrame >= 160) && (play->csCtx.curFrame < 322)) {
func_800B9010(&this->actor, NA_SE_EV_IKANA_SOUL_LV - SFX_FLAG);
- } else if (play->csCtx.frames == 322) {
+ } else if (play->csCtx.curFrame == 322) {
Actor_PlaySfx(&this->actor, NA_SE_EV_IKANA_SOUL_TRANSFORM);
}
- temp_a0 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->action;
- if (this->unk_3F2 != temp_a0) {
- this->unk_3F2 = temp_a0;
- switch (temp_a0) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -251,7 +251,7 @@ void func_80C16A74(DemoSyoten* this, PlayState* play) {
}
}
- if (temp_a0 == 3) {
+ if (cueId == 3) {
if (this->unk_3D8 > 0.0125f) {
this->unk_3D8 -= 0.0125f;
if (this->actor.child != NULL) {
@@ -271,13 +271,13 @@ void func_80C16A74(DemoSyoten* this, PlayState* play) {
void func_80C16BD4(DemoSyoten* this, PlayState* play) {
s32 pad;
- u16 temp_a0;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->unk_3F0)) {
- temp_a0 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->action;
- if (this->unk_3F2 != temp_a0) {
- this->unk_3F2 = temp_a0;
- switch (temp_a0) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
default:
this->actor.draw = NULL;
break;
@@ -304,7 +304,7 @@ void func_80C16BD4(DemoSyoten* this, PlayState* play) {
}
}
- switch (temp_a0) {
+ switch (cueId) {
case 3:
if (this->actor.scale.x < 0.05f) {
this->actor.scale.x += 0.000625f;
@@ -314,7 +314,7 @@ void func_80C16BD4(DemoSyoten* this, PlayState* play) {
case 4:
this->actor.speed =
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->urot.z * 0.005493164f;
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->rot.z * 0.005493164f;
if (this->unk_3EC < this->unk_3E8->count) {
if (func_80C16818(this)) {
this->unk_3EC++;
@@ -330,13 +330,13 @@ void func_80C16BD4(DemoSyoten* this, PlayState* play) {
void func_80C16DD4(DemoSyoten* this, PlayState* play) {
s32 pad;
- u16 temp_a0;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->unk_3F0)) {
- temp_a0 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->action;
- if (this->unk_3F2 != temp_a0) {
- this->unk_3F2 = temp_a0;
- switch (temp_a0) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -349,7 +349,7 @@ void func_80C16DD4(DemoSyoten* this, PlayState* play) {
}
}
- if ((temp_a0 == 2) && (this->unk_3E6 < 40)) {
+ if ((cueId == 2) && (this->unk_3E6 < 40)) {
this->unk_3E6++;
}
} else {
@@ -359,13 +359,13 @@ void func_80C16DD4(DemoSyoten* this, PlayState* play) {
void func_80C16EAC(DemoSyoten* this, PlayState* play) {
s32 pad;
- u16 temp_a0;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->unk_3F0)) {
- temp_a0 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->action;
- if (this->unk_3F2 != temp_a0) {
- this->unk_3F2 = temp_a0;
- switch (temp_a0) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
case 1:
this->actor.draw = NULL;
this->unk_3D8 = 0.0f;
@@ -378,7 +378,7 @@ void func_80C16EAC(DemoSyoten* this, PlayState* play) {
}
}
- if (temp_a0 == 2) {
+ if (cueId == 2) {
if (this->actor.scale.x < 8.0f) {
this->actor.scale.x += 0.1875f;
}
@@ -401,13 +401,13 @@ void func_80C16EAC(DemoSyoten* this, PlayState* play) {
}
void func_80C17008(DemoSyoten* this, PlayState* play) {
- u16 temp_a0;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->unk_3F0)) {
- temp_a0 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_3F0)]->action;
- if (this->unk_3F2 != temp_a0) {
- this->unk_3F2 = temp_a0;
- switch (temp_a0) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -419,7 +419,7 @@ void func_80C17008(DemoSyoten* this, PlayState* play) {
}
}
- if ((temp_a0 == 2) && (this->unk_3E6 < 15)) {
+ if ((cueId == 2) && (this->unk_3E6 < 15)) {
this->unk_3E6++;
}
} else {
@@ -487,7 +487,7 @@ void func_80C173B4(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->unk_144.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
func_8018450C(play, &this->unk_144, mtx, (void*)func_80C170F8, 0, &this->actor);
}
@@ -514,7 +514,7 @@ void DemoSyoten_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_3E4 & 4) {
Matrix_RotateZS(-this->actor.shape.rot.z, MTXMODE_APPLY);
@@ -553,7 +553,7 @@ void func_80C17690(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_APPLY);
if (this->unk_3E4 & 8) {
diff --git a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
index 7b60ae951..19f99bf2f 100644
--- a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
+++ b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
@@ -12,13 +12,13 @@ typedef void (*DemoSyotenActionFunc)(struct DemoSyoten*, PlayState*);
#define DEMOSYOTEN_7E00_3F 0x3F
-enum {
+typedef enum {
/* 0 */ DEMOSYOTEN_F_0,
/* 1 */ DEMOSYOTEN_F_1,
/* 2 */ DEMOSYOTEN_F_2,
/* 3 */ DEMOSYOTEN_F_3,
/* 4 */ DEMOSYOTEN_F_4
-};
+} DemoSyotenParam;
typedef struct DemoSyoten {
/* 0x000 */ Actor actor;
@@ -32,8 +32,8 @@ typedef struct DemoSyoten {
/* 0x3E6 */ s16 unk_3E6;
/* 0x3E8 */ Path* unk_3E8;
/* 0x3EC */ s32 unk_3EC;
- /* 0x3F0 */ u16 unk_3F0;
- /* 0x3F2 */ u16 unk_3F2;
+ /* 0x3F0 */ u16 cueType;
+ /* 0x3F2 */ u16 cueId;
/* 0x3F4 */ DemoSyotenActionFunc actionFunc;
} DemoSyoten; // size = 0x3F8
diff --git a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
index b2b8e0077..2db282367 100644
--- a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
+++ b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
@@ -24,11 +24,11 @@ void DemoTreLgt_SetupAnimate(DemoTreLgt* this, PlayState* play, f32 frame);
void DemoTreLgt_Animate(DemoTreLgt* this, PlayState* play);
typedef struct {
- f32 unk0;
- f32 unk4;
- f32 unk8;
- f32 unkC;
-} DemoTreLgtInfo;
+ /* 0x0 */ f32 unk0;
+ /* 0x4 */ f32 unk4;
+ /* 0x8 */ f32 unk8;
+ /* 0xC */ f32 unkC;
+} DemoTreLgtInfo; // size = 0x10
static DemoTreLgtInfo D_808E1490[2] = {
{ 1.0f, 136.0f, 190.0f, 40.0f },
@@ -53,8 +53,8 @@ static TransformUpdateIndex* sBoxLightAnimations[] = {
};
typedef enum {
- /* 0x00 */ DEMO_TRE_LGT_ACTION_WAIT, // wait until animation is needed
- /* 0x01 */ DEMO_TRE_LGT_ACTION_ANIMATE
+ /* 0 */ DEMO_TRE_LGT_ACTION_WAIT, // wait until animation is needed
+ /* 1 */ DEMO_TRE_LGT_ACTION_ANIMATE
} DemoTreLgtAction;
static DemoTreLgtActionFunc sActionFuncs[] = {
@@ -168,10 +168,12 @@ void DemoTreLgt_Draw(Actor* thisx, PlayState* play) {
DemoTreLgt* this = THIS;
OPEN_DISPS(gfxCtx);
+
if (this->action == DEMO_TRE_LGT_ACTION_ANIMATE) {
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 255, 0, 0);
SkelCurve_Draw(&this->actor, play, &this->skelCurve, DemoTreLgt_OverrideLimbDraw, NULL, 1, &this->actor);
}
+
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
index 1a1f4ae22..ddd012426 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
@@ -113,7 +113,7 @@ Actor* func_80C1D78C(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -124,23 +124,23 @@ Actor* func_80C1D78C(PlayState* play) {
void func_80C1D7FC(DmAh* this, PlayState* play) {
s32 D_80C1DE00[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 actionIndex;
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (!this->unk_29C) {
- this->action = 0xFF;
+ this->cueId = 255;
this->unk_29C = true;
this->animationIndex2 = this->animationIndex;
}
- if (Cutscene_CheckActorAction(play, 0x232)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x232);
- csAction = play->csCtx.actorActions[actionIndex]->action;
- if (this->action != (u8)csAction) {
- this->action = csAction;
- func_80C1D410(this, D_80C1DE00[csAction]);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ func_80C1D410(this, D_80C1DE00[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_29C) {
this->unk_29C = false;
@@ -181,7 +181,7 @@ void DmAh_Update(Actor* thisx, PlayState* play) {
func_80C1D6E0(this, play);
SkelAnime_Update(&this->skelAnime);
func_80C1D458(this);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
static Vec3f D_80C1DE14 = { 1000.0f, 0.0f, 0.0f };
@@ -245,7 +245,7 @@ void DmAh_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C1DE28[this->unk_284]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C1DE20[0]));
diff --git a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h
index df179c6f6..b1e16f6e0 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.h
@@ -19,7 +19,7 @@ typedef struct DmAh {
/* 0x1B0 */ Vec3s morphTable[OBJECT_AH_LIMB_MAX];
/* 0x216 */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
/* 0x27C */ u16 unk_27C;
- /* 0x27E */ u8 action;
+ /* 0x27E */ u8 cueId;
/* 0x280 */ Actor* unk_280;
/* 0x284 */ s16 unk_284;
/* 0x286 */ s16 unk_286;
diff --git a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
index f81713731..a7e3e4993 100644
--- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
+++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c
@@ -48,23 +48,23 @@ s32 DmAl_ChangeAnim(DmAl* this, s32 animIndex) {
void func_80C1BDD8(DmAl* this, PlayState* play) {
s32 D_80C1C280[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 actionIndex;
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (!this->unk_45C) {
- this->action = 0xFF;
+ this->cueId = 255;
this->unk_45C = true;
this->animIndex2 = this->animIndex;
}
- if (Cutscene_CheckActorAction(play, 0x232)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x232);
- csAction = play->csCtx.actorActions[actionIndex]->action;
- if (this->action != (u8)csAction) {
- this->action = csAction;
- DmAl_ChangeAnim(this, D_80C1C280[csAction]);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ DmAl_ChangeAnim(this, D_80C1C280[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_45C) {
this->unk_45C = false;
@@ -93,7 +93,7 @@ void DmAl_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
SkelAnime_Update(&this->skelAnime);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
s32 DmAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* rot, Vec3s* pos, Actor* thisx) {
@@ -152,7 +152,7 @@ void DmAl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmAl_OverrideLimbDraw, DmAl_PostLimbDraw,
DmAl_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_Dm_Al/z_dm_al.h b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
index 57e462de1..3c77ed6c3 100644
--- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
+++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
@@ -15,15 +15,15 @@ typedef struct DmAl {
/* 0x18C */ MtxF shawlMatrices[6];
/* 0x30C */ Vec3s jointTable[MADAME_AROMA_LIMB_MAX];
/* 0x3AE */ Vec3s morphTable[MADAME_AROMA_LIMB_MAX];
- /* 0x450 */ u8 action;
+ /* 0x450 */ u8 cueId;
/* 0x454 */ s32 animIndex;
/* 0x458 */ s32 animIndex2;
/* 0x45C */ s32 unk_45C;
} DmAl; // size = 0x460
typedef enum {
- /* 0x0 */ MADAME_AROMA_ANIMATION_0,
- /* 0x1 */ MADAME_AROMA_ANIMATION_1
+ /* 0 */ MADAME_AROMA_ANIMATION_0,
+ /* 1 */ MADAME_AROMA_ANIMATION_1
} DmAlAnimations;
#endif // Z_DM_AL_H
diff --git a/src/overlays/actors/ovl_Dm_An/z_dm_an.c b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
index d536425b0..86d57660f 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
@@ -160,7 +160,7 @@ Actor* func_80C1C8E8(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -195,28 +195,28 @@ void func_80C1C958(DmAn* this, PlayState* play) {
void func_80C1CAB0(DmAn* this, PlayState* play) {
s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
- u16 action;
- s32 sp20;
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk_2D0 == 0) {
- this->unk_2B0 = 255;
+ this->cueId = 255;
this->unk_2D0 = 1;
this->unk_2D4 = 0;
this->unk_2CC = this->unk_2C8;
}
- if (Cutscene_CheckActorAction(play, 0x22D)) {
- sp20 = Cutscene_GetActorActionIndex(play, 0x22D);
- action = play->csCtx.actorActions[sp20]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_557)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_557);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
- if (this->unk_2B0 != (action & 0xFF)) {
- this->unk_2B0 = action;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
this->unk_2D4 = 1;
- func_80C1C4D8(this, play, sp28[action]);
+ func_80C1C4D8(this, play, sp28[cueId]);
}
- switch (this->unk_2B0) {
+ switch (this->cueId) {
case 2:
case 4:
case 5:
@@ -229,8 +229,11 @@ void func_80C1CAB0(DmAn* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, sp20);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_2D0 != 0) {
this->unk_2D0 = 0;
@@ -264,7 +267,7 @@ void DmAn_Update(Actor* thisx, PlayState* play) {
func_80C1C410(this, play);
func_80C1C5B4(this);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
Vec3f D_80C1D2C8 = { 450.0f, 700.0f, -760.0f };
@@ -356,7 +359,7 @@ void func_80C1D0B0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C1D2F4[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C1D2E8[0]));
diff --git a/src/overlays/actors/ovl_Dm_An/z_dm_an.h b/src/overlays/actors/ovl_Dm_An/z_dm_an.h
index 2001a8ba6..6908e9342 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.h
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.h
@@ -21,7 +21,7 @@ typedef struct DmAn {
/* 0x2AC */ s8 unk_2AC;
/* 0x2AD */ s8 unk_2AD;
/* 0x2AE */ u16 unk_2AE;
- /* 0x2B0 */ u8 unk_2B0;
+ /* 0x2B0 */ u8 cueId;
/* 0x2B4 */ Actor* unk_2B4;
/* 0x2B8 */ s16 unk_2B8;
/* 0x2BA */ s16 unk_2BA;
diff --git a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
index b9c4cb33c..c6d93945b 100644
--- a/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
+++ b/src/overlays/actors/ovl_Dm_Bal/z_dm_bal.c
@@ -56,7 +56,7 @@ void DmBal_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_bal_Skel_00A6D0, &object_bal_Anim_0005FC, this->jointTable,
this->morphTable, OBJECT_BAL_LIMB_MAX);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->timer = 60;
this->eyeIndex = 0;
this->keepEyesShut = false;
@@ -74,15 +74,15 @@ void DmBal_DoNothing(DmBal* this, PlayState* play) {
}
void func_80C1EAE8(DmBal* this, PlayState* play) {
- static u16 D_80C1F2C0 = 0x63;
- s32 actionIndex;
+ static u16 sCueId = 99;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 0x238)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x238);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_568)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_568);
- if (D_80C1F2C0 != play->csCtx.actorActions[actionIndex]->action) {
- D_80C1F2C0 = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (sCueId != play->csCtx.actorCues[cueChannel]->id) {
+ sCueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->keepEyesShut = false;
this->eyeIndex = 0;
@@ -96,7 +96,7 @@ void func_80C1EAE8(DmBal* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 13);
break;
}
- } else if (D_80C1F2C0 == 3) {
+ } else if (sCueId == 3) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
this->keepEyesShut = true;
} else if (Animation_OnFrame(&this->skelAnime, 29.0f)) {
@@ -104,12 +104,12 @@ void func_80C1EAE8(DmBal* this, PlayState* play) {
this->eyeIndex = 0;
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
this->actor.home.pos = this->actor.world.pos;
} else {
this->keepEyesShut = false;
this->eyeIndex = 0;
- D_80C1F2C0 = 0x63;
+ sCueId = 99;
}
}
@@ -195,9 +195,11 @@ void DmBal_Draw(Actor* thisx, PlayState* play) {
DmBal* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
DmBal_OverrideLimbDraw, DmBal_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
index 997004fea..fe4a83a91 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.c
@@ -150,7 +150,7 @@ void func_80AA5580(SkelAnime* skelAnime, AnimationInfo* animation, u16 idx) {
void func_80AA561C(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames + 20) {
+ switch (play->csCtx.curFrame + 20) {
case 503:
case 926:
case 979:
@@ -169,7 +169,7 @@ void func_80AA561C(DmChar00* this, PlayState* play) {
break;
}
} else {
- switch (play->csCtx.frames + 20) {
+ switch (play->csCtx.curFrame + 20) {
case 503:
case 926:
case 979:
@@ -188,14 +188,14 @@ void func_80AA561C(DmChar00* this, PlayState* play) {
}
void func_80AA5720(DmChar00* this, PlayState* play) {
- if ((DMCHAR00_GET(&this->actor) == DMCHAR00_0) && (play->csCtx.frames == 505)) {
+ if ((DMCHAR00_GET(&this->actor) == DMCHAR00_0) && (play->csCtx.curFrame == 505)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_SPOT_LIGHT_OPEN);
}
}
void func_80AA575C(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 474:
case 489:
case 495:
@@ -227,24 +227,24 @@ void func_80AA575C(DmChar00* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
break;
}
- } else if (play->csCtx.frames == 660) {
+ } else if (play->csCtx.curFrame == 660) {
Actor_PlaySfx(&this->actor, NA_SE_EV_MONDO_SURPRISE);
}
}
void func_80AA5890(DmChar00* this, PlayState* play) {
- if ((DMCHAR00_GET(&this->actor) == DMCHAR00_0) && (play->csCtx.frames == 20)) {
+ if ((DMCHAR00_GET(&this->actor) == DMCHAR00_0) && (play->csCtx.curFrame == 20)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
}
}
void func_80AA58CC(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- if (play->csCtx.frames == 568) {
+ if (play->csCtx.curFrame == 568) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 375:
case 479:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
@@ -262,11 +262,11 @@ void func_80AA5950(DmChar00* this, PlayState* play) {
void func_80AA5960(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- if (play->csCtx.frames == 280) {
+ if (play->csCtx.curFrame == 280) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 87:
case 190:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
@@ -281,7 +281,7 @@ void func_80AA5960(DmChar00* this, PlayState* play) {
void func_80AA59E4(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 125:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
@@ -291,14 +291,14 @@ void func_80AA59E4(DmChar00* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
break;
}
- } else if (play->csCtx.frames == 125) {
+ } else if (play->csCtx.curFrame == 125) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
}
}
void func_80AA5A6C(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 44:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
@@ -308,14 +308,14 @@ void func_80AA5A6C(DmChar00* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
break;
}
- } else if (play->csCtx.frames == 44) {
+ } else if (play->csCtx.curFrame == 44) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
}
}
void func_80AA5AF4(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 352:
case 401:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
@@ -330,7 +330,7 @@ void func_80AA5AF4(DmChar00* this, PlayState* play) {
break;
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 362:
case 401:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
@@ -341,7 +341,7 @@ void func_80AA5AF4(DmChar00* this, PlayState* play) {
break;
}
- if ((play->csCtx.frames >= 500) && (play->csCtx.frames < 602)) {
+ if ((play->csCtx.curFrame >= 500) && (play->csCtx.curFrame < 602)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SHIVER - SFX_FLAG);
}
}
@@ -349,7 +349,7 @@ void func_80AA5AF4(DmChar00* this, PlayState* play) {
void func_80AA5BF8(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 762:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_SHOT_DASH);
break;
@@ -358,7 +358,7 @@ void func_80AA5BF8(DmChar00* this, PlayState* play) {
break;
}
} else {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 762:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_SHOT_DASH);
break;
@@ -375,14 +375,14 @@ void func_80AA5BF8(DmChar00* this, PlayState* play) {
}
void func_80AA5CD4(DmChar00* this, PlayState* play) {
- if ((DMCHAR00_GET(&this->actor) != DMCHAR00_0) && (play->csCtx.frames == 467)) {
+ if ((DMCHAR00_GET(&this->actor) != DMCHAR00_0) && (play->csCtx.curFrame == 467)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
}
}
void func_80AA5D10(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 8:
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
break;
@@ -396,7 +396,7 @@ void func_80AA5D10(DmChar00* this, PlayState* play) {
void func_80AA5D6C(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 2:
case 166:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
@@ -411,7 +411,7 @@ void func_80AA5D6C(DmChar00* this, PlayState* play) {
void func_80AA5DC8(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_0) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 233:
case 415:
case 593:
@@ -427,7 +427,7 @@ void func_80AA5DC8(DmChar00* this, PlayState* play) {
void func_80AA5E2C(DmChar00* this, PlayState* play) {
if (DMCHAR00_GET(&this->actor) == DMCHAR00_1) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 32:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
@@ -448,7 +448,7 @@ void func_80AA5E2C(DmChar00* this, PlayState* play) {
}
void func_80AA5EBC(DmChar00* this, PlayState* play) {
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
switch (play->sceneId) {
case SCENE_LOST_WOODS:
if (gSaveContext.sceneLayer == 1) {
@@ -458,11 +458,11 @@ void func_80AA5EBC(DmChar00* this, PlayState* play) {
case SCENE_OPENINGDAN:
if (gSaveContext.sceneLayer == 0) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AA5720(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
func_80AA575C(this, play);
- } else if (play->csCtx.currentCsIndex == 2) {
+ } else if (play->csCtx.scriptIndex == 2) {
func_80AA5890(this, play);
}
}
@@ -470,17 +470,17 @@ void func_80AA5EBC(DmChar00* this, PlayState* play) {
case SCENE_OKUJOU:
if (gSaveContext.sceneLayer == 0) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AA58CC(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
func_80AA5950(this, play);
- } else if (play->csCtx.currentCsIndex == 2) {
+ } else if (play->csCtx.scriptIndex == 2) {
func_80AA5960(this, play);
}
} else if (gSaveContext.sceneLayer == 2) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AA59E4(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
func_80AA5A6C(this, play);
}
}
@@ -488,34 +488,34 @@ void func_80AA5EBC(DmChar00* this, PlayState* play) {
case SCENE_00KEIKOKU:
if (gSaveContext.sceneLayer == 3) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AA5AF4(this, play);
- } else if (play->csCtx.currentCsIndex == 2) {
+ } else if (play->csCtx.scriptIndex == 2) {
func_80AA5E2C(this, play);
}
} else if (gSaveContext.sceneLayer == 7) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AA5BF8(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
func_80AA5CD4(this, play);
}
}
break;
case SCENE_MITURIN:
- if ((gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 1)) {
+ if ((gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 1)) {
func_80AA5DC8(this, play);
}
break;
case SCENE_INSIDETOWER:
- if ((gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 0)) {
+ if ((gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 0)) {
func_80AA5D10(this, play);
}
break;
case SCENE_PIRATE:
- if ((gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 0)) {
+ if ((gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 0)) {
func_80AA5D6C(this, play);
}
break;
@@ -535,7 +535,7 @@ void DmChar00_Init(Actor* thisx, PlayState* play) {
this->unk_250 = D_80AA77D8[DMCHAR00_GET(thisx)];
thisx->targetArrowOffset = 3000.0f;
- this->unk_260 = 99;
+ this->cueId = 99;
this->unk_262 = DMCHAR00_GET_F800(thisx);
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
@@ -551,18 +551,18 @@ void DmChar00_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AA62FC(DmChar00* this, PlayState* play) {
- u16 sp26 = DMCHAR00_GET(&this->actor) + 113;
- s32 temp_v0;
+ u16 cueType = CS_CMD_ACTOR_CUE_113 + DMCHAR00_GET(&this->actor);
+ s32 cueChannel;
s32 pad;
- if (Cutscene_CheckActorAction(play, sp26)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, sp26);
+ if (Cutscene_IsCueInChannel(play, cueType)) {
+ cueChannel = Cutscene_GetCueChannel(play, cueType);
- if (play->csCtx.frames == play->csCtx.actorActions[temp_v0]->startFrame) {
- if (this->unk_260 != play->csCtx.actorActions[temp_v0]->action) {
- this->unk_260 = play->csCtx.actorActions[temp_v0]->action;
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (play->csCtx.actorActions[temp_v0]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 0x1:
this->unk_261 = 0;
break;
@@ -786,9 +786,9 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
} else {
- this->unk_260 = 99;
+ this->cueId = 99;
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
@@ -853,7 +853,7 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
void func_80AA67F8(DmChar00* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((play->csCtx.state == 0) && (gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 1)) {
+ if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 1)) {
if (this->unk_261 != 42) {
this->unk_261 = 42;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
@@ -914,15 +914,15 @@ void DmChar00_Draw(Actor* thisx, PlayState* play2) {
s32 pad;
Gfx* gfx = GRAPH_ALLOC(play->state.gfxCtx, 4 * sizeof(Gfx));
- if ((play->csCtx.state == 0) &&
+ if ((play->csCtx.state == CS_STATE_IDLE) &&
((play->sceneId != SCENE_OPENINGDAN) || (gSaveContext.sceneLayer != 0) || (play->roomCtx.curRoom.num != 0) ||
- (play->csCtx.currentCsIndex != 1) || (DMCHAR00_GET(&this->actor) != DMCHAR00_0))) {
+ (play->csCtx.scriptIndex != 1) || (DMCHAR00_GET(&this->actor) != DMCHAR00_0))) {
return;
}
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
do {
phi_a0 = (this->unk_262 * 50) & 511;
diff --git a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
index 62ee0cb40..b4679647b 100644
--- a/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
+++ b/src/overlays/actors/ovl_Dm_Char00/z_dm_char00.h
@@ -23,7 +23,7 @@ typedef struct DmChar00 {
/* 0x23C */ DmChar00ActionFunc actionFunc;
/* 0x240 */ Color_RGBAf unk_240;
/* 0x250 */ Color_RGBAf unk_250;
- /* 0x260 */ u8 unk_260;
+ /* 0x260 */ u8 cueId;
/* 0x261 */ u8 unk_261;
/* 0x262 */ u16 unk_262;
} DmChar00; // size = 0x264
diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
index dab5b3c08..33c6eed8f 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -67,15 +67,15 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
switch (DMCHAR01_GET(&this->dyna.actor)) {
case DMCHAR01_0:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
this->unk_34C = 2;
this->actionFunc = func_80AA8F1C;
break;
}
if (gSaveContext.sceneLayer == 0) {
- play->envCtx.unk_1F = 5;
- play->envCtx.unk_20 = 5;
+ play->envCtx.lightConfig = 5;
+ play->envCtx.changeLightNextConfig = 5;
}
this->unk_348 = 255.0f;
@@ -97,7 +97,7 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
break;
case DMCHAR01_1:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02) || (gSaveContext.sceneLayer == 1)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE) || (gSaveContext.sceneLayer == 1)) {
this->unk_34C = 1;
this->actionFunc = func_80AA8F1C;
} else {
@@ -134,7 +134,7 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_LoadMesh(play, &this->dyna, &gWoodfallSceneryTempleRampAndPlatformCol);
this->unk_34D = true;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
this->actionFunc = func_80AA9020;
this->dyna.actor.world.pos.y -= 120.0f;
} else {
@@ -187,19 +187,20 @@ void func_80AA8698(DmChar01* this, PlayState* play) {
}
void func_80AA884C(DmChar01* this, PlayState* play) {
- s16 sp1E = this->dyna.actor.cutscene;
+ s16 csId = this->dyna.actor.csId;
- if (ActorCutscene_GetCanPlayNext(sp1E)) {
- ActorCutscene_Start(sp1E, &this->dyna.actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->dyna.actor);
this->actionFunc = func_80AA88A8;
} else {
- ActorCutscene_SetIntentToPlay(sp1E);
+ CutsceneManager_Queue(csId);
}
}
void func_80AA88A8(DmChar01* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 135)) {
- if (play->csCtx.frames == play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 135)]->startFrame) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_135)) {
+ if (play->csCtx.curFrame ==
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_135)]->startFrame) {
D_80AAAE24 = 1;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_FORT_RISING);
}
@@ -344,11 +345,11 @@ void func_80AA8F2C(DmChar01* this, PlayState* play) {
}
void func_80AA9020(DmChar01* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 135)) {
- CsCmdActorAction* temp_v1 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 135)];
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_135)) {
+ CsCmdActorCue* cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_135)];
- if ((temp_v1->startFrame == play->csCtx.frames) && (temp_v1->action == 2)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_20_02);
+ if ((cue->startFrame == play->csCtx.curFrame) && (cue->id == 2)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE);
this->actionFunc = func_80AA90AC;
}
}
@@ -373,17 +374,17 @@ void DmChar01_Update(Actor* thisx, PlayState* play2) {
Player* player = GET_PLAYER(play);
if (player->actor.world.pos.y > 5.0f) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
if (DMCHAR01_GET(&this->dyna.actor) == DMCHAR01_2) {
if (this->dyna.actor.xzDistToPlayer > 600.0f) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
}
@@ -422,7 +423,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if ((u8)this->unk_348 == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gDPPipeSync(POLY_OPA_DISP++);
@@ -434,7 +435,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gWoodfallSceneryDynamicPoisonWaterDL);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
gDPPipeSync(POLY_XLU_DISP++);
@@ -481,7 +482,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
diff --git a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
index 6f29531a0..7ce8df7d2 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
@@ -9,12 +9,12 @@ typedef void (*DmChar01ActionFunc)(struct DmChar01*, PlayState*);
#define DMCHAR01_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 0 */ DMCHAR01_0,
/* 1 */ DMCHAR01_1,
/* 2 */ DMCHAR01_2,
- /* 3 */ DMCHAR01_3,
-};
+ /* 3 */ DMCHAR01_3
+} DmChar01Param;
typedef struct DmChar01 {
/* 0x000 */ DynaPolyActor dyna;
diff --git a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
index 56c02526b..2f933c751 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
@@ -35,7 +35,7 @@ typedef enum {
/* 0 */ DMCHAR02_ANIM_HIT_GROUND,
/* 1 */ DMCHAR02_ANIM_TURN_AROUND,
/* 2 */ DMCHAR02_ANIM_JUGGLE,
- /* 3 */ DMCHAR02_ANIM_FALL,
+ /* 3 */ DMCHAR02_ANIM_FALL
} DmChar02Animation;
static AnimationInfo sAnimationInfo[] = {
@@ -61,7 +61,7 @@ void DmChar02_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16
}
void DmChar02_PlaySfxForDroppingOcarinaCutscene(DmChar02* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 95:
Actor_PlaySfx(&this->actor, NA_SE_EV_OCARINA_BOUND_0);
break;
@@ -75,7 +75,7 @@ void DmChar02_PlaySfxForDroppingOcarinaCutscene(DmChar02* this, PlayState* play)
}
void DmChar02_PlaySfxForCutscenes(DmChar02* this, PlayState* play) {
- if ((play->csCtx.state != 0) && (play->sceneId == SCENE_OKUJOU) && (play->csCtx.currentCsIndex == 1)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_OKUJOU) && (play->csCtx.scriptIndex == 1)) {
DmChar02_PlaySfxForDroppingOcarinaCutscene(this, play);
}
}
@@ -83,7 +83,7 @@ void DmChar02_PlaySfxForCutscenes(DmChar02* this, PlayState* play) {
void DmChar02_Init(Actor* thisx, PlayState* play) {
DmChar02* this = THIS;
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->animIndex = DMCHAR02_ANIM_HIT_GROUND;
this->actor.targetArrowOffset = 3000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
@@ -101,12 +101,12 @@ void DmChar02_Destroy(Actor* thisx, PlayState* play) {
void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play) {
u8 shouldChangeAnimation = true;
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 0x83)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x83);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_131)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_131);
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
default:
this->animIndex = DMCHAR02_ANIM_HIT_GROUND;
shouldChangeAnimation = false;
@@ -130,7 +130,7 @@ void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
@@ -172,10 +172,10 @@ void DmChar02_Draw(Actor* thisx, PlayState* play) {
DmChar02* this = THIS;
s32 shouldDraw = false;
- if ((play->csCtx.state == 0) && (this->actor.world.pos.y < 100.0f)) {
+ if ((play->csCtx.state == CS_STATE_IDLE) && (this->actor.world.pos.y < 100.0f)) {
shouldDraw = true;
- } else if (Cutscene_CheckActorAction(play, 0x6B)) {
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x6B)]->action) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_107)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_107)]->id) {
case 0x17:
case 0x1C:
case 0x26:
@@ -185,7 +185,7 @@ void DmChar02_Draw(Actor* thisx, PlayState* play) {
}
if (shouldDraw) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar02_OverrideLimbDraw, DmChar02_PostLimbDraw,
DmChar02_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
index b960ce698..e348d145a 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
@@ -76,14 +76,14 @@ void func_80AAB5F8(DmChar03* this, PlayState* play) {
}
void func_80AAB644(DmChar03* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x88)) {
- s32 index = Cutscene_GetActorActionIndex(play, 0x88);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136);
- if (play->csCtx.actorActions[index]->action == 4) {
+ if (play->csCtx.actorCues[cueChannel]->id == 4) {
this->unk_18E = true;
- this->offset.x = play->csCtx.actorActions[index]->startPos.x;
- this->offset.y = play->csCtx.actorActions[index]->startPos.y;
- this->offset.z = play->csCtx.actorActions[index]->startPos.z;
+ this->offset.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ this->offset.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ this->offset.z = play->csCtx.actorCues[cueChannel]->startPos.z;
}
}
}
@@ -94,11 +94,11 @@ void DmChar03_DoNothing(DmChar03* this, PlayState* play) {
void func_80AAB710(DmChar03* this, PlayState* play) {
u8 shouldChangeAnim = true;
- if (Cutscene_CheckActorAction(play, 0x88)) {
- s32 index = Cutscene_GetActorActionIndex(play, 0x88);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136);
- if (play->csCtx.frames == play->csCtx.actorActions[index]->startFrame) {
- switch (play->csCtx.actorActions[index]->action) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
shouldChangeAnim = false;
break;
@@ -124,7 +124,7 @@ void func_80AAB710(DmChar03* this, PlayState* play) {
DmChar03_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, index);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
@@ -140,8 +140,8 @@ void func_80AAB838(DmChar03* this, PlayState* play) {
void DmChar03_Update(Actor* thisx, PlayState* play) {
DmChar03* this = THIS;
- if (Cutscene_CheckActorAction(play, 0x88) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x88)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136)]->id == 2)) {
SkelAnime_Update(&this->skelAnime);
}
this->actionFunc(this, play);
@@ -163,9 +163,9 @@ void DmChar03_Draw(Actor* thisx, PlayState* play) {
DmChar03* this = THIS;
if (!this->unk_18E) {
- if ((Cutscene_CheckActorAction(play, 0x88)) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x88)]->action != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136)]->id != 1)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar03_OverrideLimbDraw, DmChar03_PostLimbDraw,
DmChar03_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
index 5c835152d..3375b522d 100644
--- a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
+++ b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.c
@@ -66,7 +66,7 @@ void DmChar04_Init(Actor* thisx, PlayState* play) {
this->primColors = sPrimColors[this->actor.params];
this->envColors = sEnvColors[this->actor.params];
this->actor.targetArrowOffset = 3000.0f;
- this->csAction = 0x63;
+ this->cueId = 99;
this->timer = this->actor.params << 0xB;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_02AF58.sh, &gameplay_keep_Anim_029140, this->jointTable,
@@ -81,15 +81,15 @@ void DmChar04_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AABE34(DmChar04* this, PlayState* play) {
- u16 params = this->actor.params + 0x71;
+ u16 cueType = CS_CMD_ACTOR_CUE_113 + this->actor.params;
- if (Cutscene_CheckActorAction(play, params)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, params);
+ if (Cutscene_IsCueInChannel(play, cueType)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, cueType);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
- if (play->csCtx.actorActions[actionIndex]->action == 1) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (play->csCtx.actorCues[cueChannel]->id == 1) {
this->animIndex = 0;
} else {
this->animIndex = 0;
@@ -97,9 +97,9 @@ void func_80AABE34(DmChar04* this, PlayState* play) {
DmChar04_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
} else {
- this->csAction = 0x63;
+ this->cueId = 99;
}
}
@@ -136,7 +136,7 @@ void DmChar04_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
alpha = (this->timer * 50) & 0x1FF;
if (alpha > 255) {
alpha = 511 - alpha;
diff --git a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h
index 0f0fcb6a1..c3d809c63 100644
--- a/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h
+++ b/src/overlays/actors/ovl_Dm_Char04/z_dm_char04.h
@@ -15,7 +15,7 @@ typedef struct DmChar04 {
/* 0x023C */ DmChar04ActionFunc actionFunc;
/* 0x240 */ Color_RGBAf primColors;
/* 0x250 */ Color_RGBAf envColors;
- /* 0x260 */ u8 csAction;
+ /* 0x260 */ u8 cueId;
/* 0x261 */ u8 animIndex;
/* 0x262 */ u16 timer;
} DmChar04; // size = 0x264
diff --git a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
index 77c7c5dab..e3dcec911 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.c
@@ -177,14 +177,14 @@ void func_80AAC990(DmChar05* this, PlayState* play) {
}
void func_80AAC9DC(DmChar05* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 109) != 0) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 109);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_109)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109);
- if (play->csCtx.actorActions[actionIndex]->action == 4) {
+ if (play->csCtx.actorCues[cueChannel]->id == 4) {
this->unk_18E = 1;
- this->unk_190.x = play->csCtx.actorActions[actionIndex]->startPos.x;
- this->unk_190.y = play->csCtx.actorActions[actionIndex]->startPos.y;
- this->unk_190.z = play->csCtx.actorActions[actionIndex]->startPos.z;
+ this->unk_190.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ this->unk_190.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ this->unk_190.z = play->csCtx.actorCues[cueChannel]->startPos.z;
}
}
}
@@ -199,17 +199,17 @@ void func_80AACA98(DmChar05* this, PlayState* play) {
}
void func_80AACAE4(DmChar05* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 564)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 564);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_564)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_564);
- if (play->csCtx.actorActions[actionIndex]->action == 2) {
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
+ if (play->csCtx.actorCues[cueChannel]->id == 2) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
Item_Give(play, ITEM_MASK_COUPLE);
}
this->unk_18E = 1;
- this->unk_190.x = play->csCtx.actorActions[actionIndex]->startPos.x;
- this->unk_190.y = play->csCtx.actorActions[actionIndex]->startPos.y;
- this->unk_190.z = play->csCtx.actorActions[actionIndex]->startPos.z;
+ this->unk_190.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ this->unk_190.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ this->unk_190.z = play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->unk_18E = 0;
}
@@ -277,13 +277,13 @@ void func_80AACD1C(DmChar05* this, PlayState* play) {
}
void func_80AACD68(DmChar05* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 473)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 473);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473);
this->unk_18E = 1;
- this->unk_190.x = play->csCtx.actorActions[actionIndex]->startPos.x;
- this->unk_190.y = play->csCtx.actorActions[actionIndex]->startPos.y;
- this->unk_190.z = play->csCtx.actorActions[actionIndex]->startPos.z;
+ this->unk_190.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ this->unk_190.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ this->unk_190.z = play->csCtx.actorCues[cueChannel]->startPos.z;
}
}
@@ -297,27 +297,27 @@ void func_80AACE10(DmChar05* this, PlayState* play) {
}
void func_80AACE5C(DmChar05* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 518)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 518);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518);
this->unk_18E = 1;
- this->unk_190.x = play->csCtx.actorActions[actionIndex]->startPos.x;
- this->unk_190.y = play->csCtx.actorActions[actionIndex]->startPos.y;
- this->unk_190.z = play->csCtx.actorActions[actionIndex]->startPos.z;
+ this->unk_190.x = play->csCtx.actorCues[cueChannel]->startPos.x;
+ this->unk_190.y = play->csCtx.actorCues[cueChannel]->startPos.y;
+ this->unk_190.z = play->csCtx.actorCues[cueChannel]->startPos.z;
}
}
void func_80AACF04(DmChar05* this, PlayState* play) {
u8 sp2F = true;
- s32 actionIndex;
+ s32 cueChannel;
switch (DMCHAR05_GET(&this->actor)) {
case DMCHAR05_0:
- if (Cutscene_CheckActorAction(play, 109)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 109);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_109)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
break;
@@ -351,16 +351,16 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
break;
case DMCHAR05_1:
- if (Cutscene_CheckActorAction(play, 473)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 473);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
break;
@@ -395,16 +395,16 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
break;
case DMCHAR05_2:
- if (Cutscene_CheckActorAction(play, 518)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 518);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
break;
@@ -438,16 +438,16 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
break;
case DMCHAR05_3:
- if (Cutscene_CheckActorAction(play, 559)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 559);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_559)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
default:
sp2F = false;
break;
@@ -474,10 +474,10 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
}
- if (play->csCtx.actorActions[actionIndex]->action != 4) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ if (play->csCtx.actorCues[cueChannel]->id != 4) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
} else {
- Cutscene_ActorTranslate(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslate(&this->actor, play, cueChannel);
}
}
@@ -492,29 +492,29 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
void func_80AAD3F8(DmChar05* this, PlayState* play) {
- if (play->csCtx.frames == 490) {
+ if (play->csCtx.curFrame == 490) {
Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
}
- if (play->csCtx.frames > 550) {
+ if (play->csCtx.curFrame > 550) {
Actor_PlaySfx(&this->actor, NA_SE_EN_MASK_FLOAT - SFX_FLAG);
}
}
void func_80AAD450(DmChar05* this, PlayState* play) {
- if (play->csCtx.frames == 262) {
+ if (play->csCtx.curFrame == 262) {
Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
}
- if (play->csCtx.frames > 318) {
+ if (play->csCtx.curFrame > 318) {
Actor_PlaySfx(&this->actor, NA_SE_EN_MASK_FLOAT - SFX_FLAG);
}
}
void func_80AAD4A8(DmChar05* this, PlayState* play) {
if (DMCHAR05_GET(&this->actor) == DMCHAR05_0) {
- if (Cutscene_CheckActorAction(play, 109) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 109)]->action == 3)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_109) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109)]->id == 3)) {
if (Animation_OnFrame(&this->skelAnime, 14.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_0);
} else if (Animation_OnFrame(&this->skelAnime, 19.0f)) {
@@ -522,15 +522,15 @@ void func_80AAD4A8(DmChar05* this, PlayState* play) {
}
}
} else if (DMCHAR05_GET(&this->actor) == DMCHAR05_1) {
- if (Cutscene_CheckActorAction(play, 473)) {
- if ((play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 473)]->action == 3) &&
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473)) {
+ if ((play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473)]->id == 3) &&
Animation_OnFrame(&this->skelAnime, 5.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_SAND);
}
}
} else if (DMCHAR05_GET(&this->actor) == DMCHAR05_2) {
- if (Cutscene_CheckActorAction(play, 518) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 518)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518)]->id == 2)) {
if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_IT_MASK_BOUND_0);
}
@@ -546,18 +546,18 @@ void func_80AAD4A8(DmChar05* this, PlayState* play) {
} else if (DMCHAR05_GET(&this->actor) == DMCHAR05_3) {
if (play->sceneId == SCENE_OKUJOU) {
if (gSaveContext.sceneLayer == 2) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
func_80AAD3F8(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
func_80AAD450(this, play);
}
}
} else if (play->sceneId == SCENE_SPOT00) {
if (gSaveContext.sceneLayer == 9) {
- if ((play->csCtx.currentCsIndex == 0) && (play->csCtx.frames == 255)) {
+ if ((play->csCtx.scriptIndex == 0) && (play->csCtx.curFrame == 255)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
}
- } else if ((gSaveContext.sceneLayer == 0xB) && (play->csCtx.frames == 115)) {
+ } else if ((gSaveContext.sceneLayer == 0xB) && (play->csCtx.curFrame == 115)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER_PREDEMO);
}
}
@@ -568,25 +568,25 @@ void DmChar05_Update(Actor* thisx, PlayState* play) {
DmChar05* this = THIS;
func_80AACF04(this, play);
- if (Cutscene_CheckActorAction(play, 109)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 109)]->action == 3) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_109)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109)]->id == 3) {
SkelAnime_Update(&this->skelAnime);
}
- } else if (Cutscene_CheckActorAction(play, 473)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 473)]->action == 3) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473)]->id == 3) {
SkelAnime_Update(&this->skelAnime);
}
- } else if (Cutscene_CheckActorAction(play, 518)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 518)]->action == 2) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518)]->id == 2) {
SkelAnime_Update(&this->skelAnime);
}
- } else if (Cutscene_CheckActorAction(play, 559)) {
- if ((play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 559)]->action == 2) ||
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 559)]->action == 3)) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_559)) {
+ if ((play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559)]->id == 2) ||
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559)]->id == 3)) {
SkelAnime_Update(&this->skelAnime);
}
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 559)]->action == 4) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559)]->id == 4) {
this->actor.world.rot.y += 0x258;
this->actor.shape.rot.y += 0x258;
}
@@ -607,11 +607,11 @@ void func_80AAD998(Actor* thisx, PlayState* play) {
s32 pad[2];
if (this->unk_18E == 0) {
- if (Cutscene_CheckActorAction(play, 109) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 109)]->action != 1)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_109) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_109)]->id != 1)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, this->unk_19C, this->unk_1A0, this->unk_1A4, this->unk_1A8,
this->unk_1AC, this->unk_1B0);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
@@ -628,9 +628,9 @@ void func_80AADA90(Actor* thisx, PlayState* play) {
DmChar05* this = THIS;
if (this->unk_18E == 0) {
- if (Cutscene_CheckActorAction(play, 473) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 473)]->action != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_473) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_473)]->id != 1)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
DmChar05_PostLimbDraw, &this->actor);
}
@@ -643,9 +643,9 @@ void func_80AADB4C(Actor* thisx, PlayState* play) {
DmChar05* this = THIS;
if (this->unk_18E == 0) {
- if (Cutscene_CheckActorAction(play, 518) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 518)]->action != 1)) {
- func_8012C28C(play->state.gfxCtx);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_518) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_518)]->id != 1)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, &this->actor);
}
@@ -657,19 +657,18 @@ void func_80AADB4C(Actor* thisx, PlayState* play) {
void func_80AADC00(Actor* thisx, PlayState* play) {
s32 pad;
DmChar05* this = THIS;
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 559)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 559);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_559)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_559);
- if ((play->csCtx.actorActions[actionIndex]->action != 1) &&
- (play->csCtx.actorActions[actionIndex]->action != 4)) {
- func_8012C28C(play->state.gfxCtx);
+ if ((play->csCtx.actorCues[cueChannel]->id != 1) && (play->csCtx.actorCues[cueChannel]->id != 4)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar05_OverrideLimbDraw,
DmChar05_PostLimbDraw, &this->actor);
}
- if (play->csCtx.actorActions[actionIndex]->action == 4) {
+ if (play->csCtx.actorCues[cueChannel]->id == 4) {
Matrix_Translate(-600.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Gfx_DrawDListOpa(play, object_dmask_DL_001E70);
}
diff --git a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
index 3bff39f6a..84f7c3e3e 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
@@ -9,7 +9,7 @@ typedef void (*DmChar05ActionFunc)(struct DmChar05*, PlayState*);
#define DMCHAR05_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 0 */ DMCHAR05_0,
/* 1 */ DMCHAR05_1,
/* 2 */ DMCHAR05_2,
@@ -22,8 +22,8 @@ enum {
/* 9 */ DMCHAR05_9,
/* 10 */ DMCHAR05_10,
/* 11 */ DMCHAR05_11,
- /* 12 */ DMCHAR05_12,
-};
+ /* 12 */ DMCHAR05_12
+} DmChar05Param;
typedef struct DmChar05 {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c b/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
index 0385a82d4..591249c77 100644
--- a/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
+++ b/src/overlays/actors/ovl_Dm_Char06/z_dm_char06.c
@@ -37,7 +37,7 @@ void DmChar06_SetupAction(DmChar06* this, DmChar06ActionFunc actionFunc) {
void DmChar06_Init(Actor* thisx, PlayState* play) {
DmChar06* this = THIS;
- SET_WEEKEVENTREG(WEEKEVENTREG_33_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE);
Actor_SetScale(&this->actor, 1.0f);
this->alpha = 255;
DmChar06_SetupAction(this, func_80AAE6F0);
@@ -47,17 +47,17 @@ void DmChar06_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AAE6F0(DmChar06* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x1CF)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 0x1CF);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_463)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_463);
- if ((play->csCtx.frames >= play->csCtx.actorActions[actionIndex]->startFrame) &&
- (play->csCtx.actorActions[actionIndex]->endFrame >= play->csCtx.frames)) {
- if (play->csCtx.actorActions[actionIndex]->action == 1) {
+ if ((play->csCtx.curFrame >= play->csCtx.actorCues[cueChannel]->startFrame) &&
+ (play->csCtx.actorCues[cueChannel]->endFrame >= play->csCtx.curFrame)) {
+ if (play->csCtx.actorCues[cueChannel]->id == 1) {
this->alpha = 255;
- } else if (play->csCtx.actorActions[actionIndex]->action == 2) {
- f32 lerp = 1.0f - Environment_LerpWeight(play->csCtx.actorActions[actionIndex]->endFrame,
- play->csCtx.actorActions[actionIndex]->startFrame,
- play->csCtx.frames);
+ } else if (play->csCtx.actorCues[cueChannel]->id == 2) {
+ f32 lerp =
+ 1.0f - Environment_LerpWeight(play->csCtx.actorCues[cueChannel]->endFrame,
+ play->csCtx.actorCues[cueChannel]->startFrame, play->csCtx.curFrame);
this->alpha = 255 * lerp;
}
}
@@ -78,7 +78,7 @@ void DmChar06_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 1, 2);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
diff --git a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
index 844be223e..c5c06958e 100644
--- a/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
+++ b/src/overlays/actors/ovl_Dm_Char07/z_dm_char07.c
@@ -75,7 +75,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
switch (this->dyna.actor.params) {
case DMCHAR07_STAGE:
@@ -112,7 +112,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
break;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
switch (this->dyna.actor.params) {
case DMCHAR07_STAGE:
diff --git a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
index 66d4a7f86..9f5d18967 100644
--- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
+++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
@@ -38,8 +38,8 @@ typedef enum {
/* 2 */ TURTLE_EYEMODE_CLOSED,
/* 3 */ TURTLE_EYEMODE_LOOK_STRAIGHT,
/* 4 */ TURTLE_EYEMODE_UNUSED,
- /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT,
-} EyeMode;
+ /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT
+} TurtleEyeMode;
typedef enum {
/* 0 */ TURTLE_ANIM_IDLE,
@@ -48,7 +48,7 @@ typedef enum {
/* 3 */ TURTLE_ANIM_SPEAK1,
/* 4 */ TURTLE_ANIM_COUGH,
/* 5 */ TURTLE_ANIM_SPEAK2,
- /* 6 */ TURTLE_ANIM_YAWN,
+ /* 6 */ TURTLE_ANIM_YAWN
} TurtleAnimation;
ActorInit Dm_Char08_InitVars = {
@@ -165,15 +165,15 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
this->unk_1F0 = 0.0f;
if (play->sceneId == SCENE_31MISAKI) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_53_20)) {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &gTurtleZoraCapeAwakeCol);
} else {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &gTurtleZoraCapeAsleepCol);
}
this->dynapolyInitialized = true;
} else if (play->sceneId == SCENE_SEA) {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &sTurtleGreatBayTempleCol);
this->dynapolyInitialized = true;
}
@@ -275,28 +275,28 @@ void DmChar08_WaitForSong(DmChar08* this, PlayState* play) {
}
void DmChar08_SetupAppearCs(DmChar08* this, PlayState* play) {
- s16 cs1 = this->dyna.actor.cutscene;
- s16 cs = ActorCutscene_GetAdditionalCutscene(
- ActorCutscene_GetAdditionalCutscene(ActorCutscene_GetAdditionalCutscene(cs1)));
+ s16 csId = this->dyna.actor.csId;
+ s16 additionalCsId =
+ CutsceneManager_GetAdditionalCsId(CutsceneManager_GetAdditionalCsId(CutsceneManager_GetAdditionalCsId(csId)));
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_93_08)) {
- cs1 = cs;
+ csId = additionalCsId;
}
- if (ActorCutscene_GetCanPlayNext(cs1)) {
- ActorCutscene_Start(cs1, &this->dyna.actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->dyna.actor);
SET_WEEKEVENTREG(WEEKEVENTREG_53_20);
SET_WEEKEVENTREG(WEEKEVENTREG_93_08);
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = func_80AAF884;
} else {
- ActorCutscene_SetIntentToPlay(cs1);
+ CutsceneManager_Queue(csId);
}
}
void func_80AAF884(DmChar08* this, PlayState* play) {
- if (play->csCtx.state == CS_STATE_0) {
- DynaPolyActor_Init(&this->dyna, 3);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &gTurtleZoraCapeAwakeCol);
this->dyna.actor.flags |= ACTOR_FLAG_1;
this->actionFunc = func_80AAF8F4;
@@ -321,33 +321,33 @@ void func_80AAF8F4(DmChar08* this, PlayState* play) {
}
void func_80AAFA18(DmChar08* this, PlayState* play) {
- s16 nextCs;
- s16 nextCs2;
- s16 nextCs1;
+ s16 nextCsId;
+ s16 nextCsId2;
+ s16 nextCsId1;
- nextCs1 = ActorCutscene_GetAdditionalCutscene(this->dyna.actor.cutscene);
- nextCs2 = nextCs1;
- nextCs1 = ActorCutscene_GetAdditionalCutscene(nextCs1);
+ nextCsId1 = CutsceneManager_GetAdditionalCsId(this->dyna.actor.csId);
+ nextCsId2 = nextCsId1;
+ nextCsId1 = CutsceneManager_GetAdditionalCsId(nextCsId1);
- nextCs = CHECK_WEEKEVENTREG(WEEKEVENTREG_53_40) ? nextCs1 : nextCs2;
+ nextCsId = CHECK_WEEKEVENTREG(WEEKEVENTREG_53_40) ? nextCsId1 : nextCsId2;
- if (ActorCutscene_GetCanPlayNext(nextCs) != 0) {
+ if (CutsceneManager_IsNext(nextCsId)) {
SET_WEEKEVENTREG(WEEKEVENTREG_53_40);
- ActorCutscene_Start(nextCs, &this->dyna.actor);
+ CutsceneManager_Start(nextCsId, &this->dyna.actor);
this->actionFunc = DmChar08_DoNothing;
} else {
- ActorCutscene_SetIntentToPlay(nextCs);
+ CutsceneManager_Queue(nextCsId);
}
}
void func_80AAFAC4(DmChar08* this, PlayState* play) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->actionFunc = func_80AAF8F4;
}
}
void func_80AAFAE4(DmChar08* this, PlayState* play) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->actionFunc = func_80AAFB04;
}
}
@@ -390,7 +390,7 @@ void DmChar08_SpawnBubbles(DmChar08* this, PlayState* play) {
void func_80AAFCCC(DmChar08* this, PlayState* play) {
switch (play->sceneId) {
case SCENE_31MISAKI:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
switch (this->unk_206) {
case 0:
break;
@@ -455,15 +455,15 @@ void DmChar08_DoNothing(DmChar08* this, PlayState* play) {
}
void func_80AAFE88(DmChar08* this, PlayState* play) {
- s32 actorActionIndex;
- CsCmdActorAction* csAction;
+ s32 cueChannel;
+ s32 pad;
f32 phi_f12;
- if (Cutscene_CheckActorAction(play, 474)) {
- actorActionIndex = Cutscene_GetActorActionIndex(play, 474);
- if (this->unk_1F6 != play->csCtx.actorActions[actorActionIndex]->action) {
- this->unk_1F6 = play->csCtx.actorActions[actorActionIndex]->action;
- switch (play->csCtx.actorActions[actorActionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_474)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_474);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->animIndex = TURTLE_ANIM_IDLE;
break;
@@ -514,12 +514,12 @@ void func_80AAFE88(DmChar08* this, PlayState* play) {
break;
}
}
- switch (play->csCtx.actorActions[actorActionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 2:
this->unk_1FF = 1;
- phi_f12 = 2.0f * Environment_LerpWeight(play->csCtx.actorActions[actorActionIndex]->endFrame,
- play->csCtx.actorActions[actorActionIndex]->startFrame,
- play->csCtx.frames);
+ phi_f12 =
+ 2.0f * Environment_LerpWeight(play->csCtx.actorCues[cueChannel]->endFrame,
+ play->csCtx.actorCues[cueChannel]->startFrame, play->csCtx.curFrame);
if (phi_f12 > 1.0f) {
phi_f12 = 1.0f;
}
@@ -529,30 +529,30 @@ void func_80AAFE88(DmChar08* this, PlayState* play) {
this->unk_1FF = 2;
}
- Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, actorActionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, cueChannel);
break;
case 5:
- Cutscene_ActorTranslateAndYawSmooth(&this->dyna.actor, play, actorActionIndex);
+ Cutscene_ActorTranslateAndYawSmooth(&this->dyna.actor, play, cueChannel);
break;
case 14:
- Cutscene_ActorTranslate(&this->dyna.actor, play, actorActionIndex);
- Math_SmoothStepToS(&this->dyna.actor.world.rot.y, play->csCtx.actorActions[actorActionIndex]->rot.y,
- 0xA, 0xDC, 1);
+ Cutscene_ActorTranslate(&this->dyna.actor, play, cueChannel);
+ Math_SmoothStepToS(&this->dyna.actor.world.rot.y, play->csCtx.actorCues[cueChannel]->rot.y, 0xA, 0xDC,
+ 1);
this->dyna.actor.shape.rot.y = this->dyna.actor.world.rot.y;
break;
default:
- Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, actorActionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, cueChannel);
break;
}
this->targetYPos = this->dyna.actor.world.pos.y;
- if ((this->unk_1FF >= 2) || (play->csCtx.actorActions[actorActionIndex]->action == 2)) {
+ if ((this->unk_1FF >= 2) || (play->csCtx.actorCues[cueChannel]->id == 2)) {
Math_SmoothStepToF(&this->unk_1F0, 1.0f, 0.02f, 0.1f, 0.00001f);
}
} else {
- this->unk_1F6 = 99;
+ this->cueId = 99;
}
}
@@ -893,9 +893,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
}
void func_80AB096C(DmChar08* this, PlayState* play) {
- if ((play->csCtx.state != 0) && (play->sceneId == SCENE_31MISAKI) && (gSaveContext.sceneLayer == 0) &&
- (play->csCtx.currentCsIndex == 0)) {
- if ((play->csCtx.frames >= 890) && (play->csCtx.frames < 922)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_31MISAKI) && (gSaveContext.sceneLayer == 0) &&
+ (play->csCtx.scriptIndex == 0)) {
+ if ((play->csCtx.curFrame >= 890) && (play->csCtx.curFrame < 922)) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
}
}
@@ -960,7 +960,7 @@ void DmChar08_UpdateCollision(DmChar08* this, PlayState* play) {
sTurtleGreatBayTempleColVertices[5].y = 0x4B0;
sTurtleGreatBayTempleColVertices[9].y = 0x6A4;
}
- func_800C6554(play, &play->colCtx.dyna);
+ DynaPoly_InvalidateLookup(play, &play->colCtx.dyna);
}
void DmChar08_Update(Actor* thisx, PlayState* play) {
@@ -988,9 +988,9 @@ void DmChar08_Update(Actor* thisx, PlayState* play) {
this->dyna.actor.world.pos.y = this->targetYPos;
if (play->sceneId == SCENE_31MISAKI) {
if (this->dyna.actor.xzDistToPlayer > 1300.0f) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
if (this->unk_1FF != 0) {
@@ -1002,7 +1002,7 @@ void DmChar08_Update(Actor* thisx, PlayState* play) {
}
s32 DmChar08_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
- if ((play->csCtx.state == 0) && (play->sceneId == SCENE_31MISAKI) &&
+ if ((play->csCtx.state == CS_STATE_IDLE) && (play->sceneId == SCENE_31MISAKI) &&
(limbIndex == TURTLE_LIMB_FRONT_RIGHT_UPPER_FLIPPER)) {
rot->z = -0x5E24;
}
@@ -1093,11 +1093,12 @@ void DmChar08_Draw(Actor* thisx, PlayState* play) {
DmChar08* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sBigTurtleEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sBigTurtleEyeTextures[this->eyeIndex]));
- if ((this->unk_1FF > 0) || (play->csCtx.state != CS_STATE_0)) {
+ if ((this->unk_1FF > 0) || (play->csCtx.state != CS_STATE_IDLE)) {
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, DmChar08_OverrideLimbDraw, DmChar08_PostLimbDraw,
DmChar08_TransformLimbDraw, &this->dyna.actor);
@@ -1113,11 +1114,12 @@ void DmChar08_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gTurtleAsleepDL);
} else if (this->unk_1FF == 1) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 2, 2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gTurtleAsleepDL);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.h b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.h
index f339bceaa..9fdbade43 100644
--- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.h
+++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.h
@@ -22,7 +22,7 @@ typedef struct DmChar08 {
/* 0x1E8 */ UNK_TYPE1 unk_1E8[8];
/* 0x1F0 */ f32 unk_1F0;
/* 0x1F4 */ s16 unk_1F4;
- /* 0x1F6 */ s16 unk_1F6;
+ /* 0x1F6 */ s16 cueId;
/* 0x1F6 */ s16 blinkTimer;
/* 0x1FA */ s16 unk_1FA;
/* 0x1FC */ u16 unk_1FC;
diff --git a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
index 442058677..587ca059d 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
@@ -127,24 +127,24 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
Path* path;
s32 pad;
s32 i;
- s32 actionIndex;
+ s32 cueChannel;
s32 max = 0;
- s32 pathnum;
+ s32 pathIndex;
u8 temp = false;
if (!DMCHAR09_GET_F(&this->actor)) {
- if (play->csCtx.currentCsIndex == 1) {
+ if (play->csCtx.scriptIndex == 1) {
temp = true;
}
- } else if (play->csCtx.currentCsIndex == 0) {
+ } else if (play->csCtx.scriptIndex == 0) {
temp = true;
}
- if (Cutscene_CheckActorAction(play, 0x1F7) && temp) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x1F7);
- if (this->unk_22F != play->csCtx.actorActions[actionIndex]->action) {
- this->unk_22F = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_503) && temp) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_503);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 2:
max = 0;
break;
@@ -159,13 +159,13 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
break;
}
- if (play->csCtx.actorActions[actionIndex]->action >= 2) {
- pathnum = DMCHAR09_GET_PATH(&this->actor);
- path = &play->setupPathList[pathnum];
+ if (play->csCtx.actorCues[cueChannel]->id >= 2) {
+ pathIndex = DMCHAR09_GET_PATH_INDEX(&this->actor);
+ path = &play->setupPathList[pathIndex];
for (i = 0; i < max; i++) {
- pathnum = path->unk1;
- path = &play->setupPathList[pathnum];
+ pathIndex = path->additionalPathIndex;
+ path = &play->setupPathList[pathIndex];
}
this->unk_224 = Lib_SegmentedToVirtual(path->points);
@@ -175,7 +175,7 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
this->unk_220 = 1;
this->unk_22E = true;
- this->speed = (u16)play->csCtx.actorActions[actionIndex]->rot.z * 0.00390625f;
+ this->speed = (u16)play->csCtx.actorCues[cueChannel]->rot.z * (1.0f / 256.0f);
this->actionFunc = func_80AB1FDC;
} else {
this->unk_22E = false;
@@ -183,7 +183,7 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
}
}
} else {
- this->unk_22F = 0x63;
+ this->cueId = 99;
}
}
@@ -202,7 +202,7 @@ void DmChar09_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
func_80AB2268(this, play);
func_80AB24BC(this, play);
- if ((play->csCtx.state != 0) && this->unk_22E && DMCHAR09_GET_100(thisx)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && this->unk_22E && DMCHAR09_GET_100(thisx)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK + SFX_FLAG);
}
}
@@ -217,9 +217,9 @@ s32 DmChar09_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void DmChar09_Draw(Actor* thisx, PlayState* play) {
DmChar09* this = THIS;
- if ((play->csCtx.state != 0) && this->unk_22E) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ if ((play->csCtx.state != CS_STATE_IDLE) && this->unk_22E) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, DmChar09_OverrideLimbDraw, NULL,
&this->actor);
}
diff --git a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
index dffe65975..cca08d079 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
@@ -4,7 +4,7 @@
#include "global.h"
#include "objects/object_bee/object_bee.h"
-#define DMCHAR09_GET_PATH(thisx) (((thisx)->params >> 4) & 0xF)
+#define DMCHAR09_GET_PATH_INDEX(thisx) (((thisx)->params >> 4) & 0xF)
#define DMCHAR09_GET_100(thisx) ((thisx)->params & 0x100)
#define DMCHAR09_GET_F(thisx) ((thisx)->params & 0xF)
@@ -31,7 +31,7 @@ typedef struct DmChar09 {
/* 0x22A */ s16 unk_22A;
/* 0x22C */ UNK_TYPE1 pad22C[2];
/* 0x22E */ u8 unk_22E;
- /* 0x22F */ u8 unk_22F;
+ /* 0x22F */ u8 cueId;
} DmChar09; // size = 0x230
#endif // Z_DM_CHAR09_H
diff --git a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
index 5321abc92..139d80bc3 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
@@ -160,7 +160,7 @@ Actor* func_80C24838(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -195,28 +195,28 @@ void func_80C248A8(DmGm* this, PlayState* play) {
void func_80C24A00(DmGm* this, PlayState* play) {
s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
- u16 action;
- s32 sp20;
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk_2D0 == 0) {
- this->unk_2B0 = 255;
+ this->cueId = 255;
this->unk_2D0 = 1;
this->unk_2D4 = 0;
this->unk_2CC = this->unk_2C8;
}
- if (Cutscene_CheckActorAction(play, 0x22D)) {
- sp20 = Cutscene_GetActorActionIndex(play, 0x22D);
- action = play->csCtx.actorActions[sp20]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_557)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_557);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
- if (this->unk_2B0 != (action & 0xFF)) {
- this->unk_2B0 = action;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
this->unk_2D4 = 1;
- func_80C24428(this, play, sp28[action]);
+ func_80C24428(this, play, sp28[cueId]);
}
- switch (this->unk_2B0) {
+ switch (this->cueId) {
case 2:
case 4:
case 5:
@@ -229,8 +229,11 @@ void func_80C24A00(DmGm* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, sp20);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_2D0 != 0) {
this->unk_2D0 = 0;
@@ -264,7 +267,7 @@ void DmGm_Update(Actor* thisx, PlayState* play) {
func_80C24360(this, play);
func_80C24504(this);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
Vec3f D_80C25218 = { 450.0f, 700.0f, -760.0f };
@@ -356,7 +359,7 @@ void func_80C25000(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C25244[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C25238[0]));
diff --git a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.h b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.h
index 54db8d30f..8b6b3f652 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.h
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.h
@@ -21,7 +21,7 @@ typedef struct DmGm {
/* 0x2AC */ s8 unk_2AC;
/* 0x2AD */ s8 unk_2AD;
/* 0x2AE */ u16 unk_2AE;
- /* 0x2B0 */ u8 unk_2B0;
+ /* 0x2B0 */ u8 cueId;
/* 0x2B4 */ Actor* unk_2B4;
/* 0x2B8 */ s16 unk_2B8;
/* 0x2BA */ s16 unk_2BA;
diff --git a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
index 98f7bac48..0eb622b49 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c
@@ -43,23 +43,23 @@ s32 func_80C1DED0(DmNb* this, s32 arg1) {
void func_80C1DF18(DmNb* this, PlayState* play) {
s32 sp2C[] = { 0, 0, 0, 0, 0 };
- u16 csAction;
- s32 csActionIndex;
+ u16 cueId;
+ s32 cueChannel;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk1F8 == 0) {
- this->unk1EC = 0xFF;
+ this->cueId = 255;
this->unk1F8 = 1;
this->unk1F4 = this->unk1F0;
}
- if (Cutscene_CheckActorAction(play, 0x232)) {
- csActionIndex = Cutscene_GetActorActionIndex(play, 0x232);
- csAction = play->csCtx.actorActions[csActionIndex]->action;
- if (this->unk1EC != (u8)csAction) {
- this->unk1EC = csAction;
- func_80C1DED0(this, sp2C[csAction]);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ this->cueId = cueId;
+ func_80C1DED0(this, sp2C[cueId]);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, csActionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk1F8 != 0) {
this->unk1F8 = 0;
@@ -87,7 +87,7 @@ void DmNb_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
SkelAnime_Update(&this->skelAnime);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void DmNb_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
@@ -96,7 +96,7 @@ void DmNb_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void DmNb_Draw(Actor* thisx, PlayState* play) {
DmNb* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, DmNb_TransformLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h
index 3f35beea0..7bb7b39cd 100644
--- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h
+++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.h
@@ -14,7 +14,7 @@ typedef struct DmNb {
/* 0x188 */ DmNbActionFunc actionFunc;
/* 0x18C */ Vec3s jointTable[NB_LIMB_MAX];
/* 0x1BC */ Vec3s morphTable[NB_LIMB_MAX];
- /* 0x1EC */ u8 unk1EC;
+ /* 0x1EC */ u8 cueId;
/* 0x1F0 */ s32 unk1F0;
/* 0x1F4 */ s32 unk1F4;
/* 0x1F8 */ s32 unk1F8;
diff --git a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c
index db76db278..e0d2fc2a3 100644
--- a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c
+++ b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.c
@@ -70,24 +70,24 @@ void DmOpstage_Destroy(Actor* thisx, PlayState* play) {
}
void DmOpstage_FollowCutsceneScript(DmOpstage* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel;
if (DMOPSTAGE_GET_TYPE(&this->dyna.actor) == DMOPSTAGE_TYPE_GROUND) {
- if (Cutscene_CheckActorAction(play, 0x73)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x73);
- if (play->csCtx.actorActions[actionIndex]->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_115)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_115);
+ if (play->csCtx.actorCues[cueChannel]->id == 2) {
this->dyna.actor.scale.x = 0.075f;
this->dyna.actor.scale.z = 0.3f;
} else {
this->dyna.actor.scale.x = 0.1f;
this->dyna.actor.scale.z = 0.1f;
}
- Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->dyna.actor, play, cueChannel);
}
- } else if (Cutscene_CheckActorAction(play, DMOPSTAGE_GET_ACTORACTION(&this->dyna.actor) + 0x74)) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_116 + DMOPSTAGE_GET_CUE_TYPE_OFFSET(&this->dyna.actor))) {
Cutscene_ActorTranslateAndYaw(
&this->dyna.actor, play,
- Cutscene_GetActorActionIndex(play, DMOPSTAGE_GET_ACTORACTION(&this->dyna.actor) + 0x74));
+ Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_116 + DMOPSTAGE_GET_CUE_TYPE_OFFSET(&this->dyna.actor)));
}
}
@@ -95,7 +95,7 @@ void DmOpstage_Update(Actor* thisx, PlayState* play) {
DmOpstage* this = THIS;
this->actionFunc(this, play);
- if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 0) && (play->csCtx.frames == 480)) {
+ if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 0) && (play->csCtx.curFrame == 480)) {
// This actor is responsible for playing the fairy sound during the exposition in the intro,
// during the transition to Lost Woods, before Ocarina gets stolen.
func_8019F128(NA_SE_EV_NAVY_FLY_REBIRTH);
diff --git a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
index 3d9195413..964965cae 100644
--- a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
+++ b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
@@ -4,7 +4,7 @@
#include "global.h"
#define DMOPSTAGE_GET_TYPE(thisx) ((thisx)->params & 0xFF)
-#define DMOPSTAGE_GET_ACTORACTION(thisx) (((thisx)->params >> 8) & 0xFF)
+#define DMOPSTAGE_GET_CUE_TYPE_OFFSET(thisx) (((thisx)->params >> 8) & 0xFF)
struct DmOpstage;
@@ -14,7 +14,7 @@ typedef enum {
/* 0 */ DMOPSTAGE_TYPE_GROUND,
/* 1 */ DMOPSTAGE_TYPE_ROOT_TREE,
/* 2 */ DMOPSTAGE_TYPE_CUT_TREE,
- /* 3 */ DMOPSTAGE_TYPE_STRAIGHT_TREE,
+ /* 3 */ DMOPSTAGE_TYPE_STRAIGHT_TREE
} DmOpStageTypes;
typedef struct DmOpstage {
diff --git a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c
index cd6890505..42a846357 100644
--- a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c
+++ b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.c
@@ -63,7 +63,7 @@ void DmRavine_Update(Actor* thisx, PlayState* play) {
play->roomCtx.unk7A[1]++;
if (play->roomCtx.unk7A[1] > 254) {
play->roomCtx.unk7A[1] = 254;
- if (play->csCtx.frames > 700) {
+ if (play->csCtx.curFrame > 700) {
play->roomCtx.unk7A[1] = 255;
play->roomCtx.unk7A[0] = 0;
this->state++; // -> DM_RAVINE_STATE_PENDING_DEATH
diff --git a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
index 01b9b52af..fbc5fcb8b 100644
--- a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
+++ b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
@@ -10,7 +10,7 @@ typedef void (*DmRavineActionFunc)(struct DmRavine*, PlayState*);
typedef enum {
/* 0 */ DM_RAVINE_STATE_INITIALIZED,
/* 1 */ DM_RAVINE_STATE_ACTIVE,
- /* 2 */ DM_RAVINE_STATE_PENDING_DEATH,
+ /* 2 */ DM_RAVINE_STATE_PENDING_DEATH
} DmRavineState;
typedef struct DmRavine {
diff --git a/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c b/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
index dc6d8bcef..83f635777 100644
--- a/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
+++ b/src/overlays/actors/ovl_Dm_Sa/z_dm_sa.c
@@ -108,7 +108,7 @@ void DmSa_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->alpha < 0xFF) {
gSPSegment(POLY_OPA_DISP++, 0x0C, func_80A2EB58(play->state.gfxCtx, this->alpha));
diff --git a/src/overlays/actors/ovl_Dm_Statue/z_dm_statue.c b/src/overlays/actors/ovl_Dm_Statue/z_dm_statue.c
index 11f2724de..77ce3c738 100644
--- a/src/overlays/actors/ovl_Dm_Statue/z_dm_statue.c
+++ b/src/overlays/actors/ovl_Dm_Statue/z_dm_statue.c
@@ -7,7 +7,7 @@
#include "z_dm_statue.h"
#include "objects/object_smtower/object_smtower.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((DmStatue*)thisx)
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
index 423c70fc5..1787bcf6f 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -108,7 +108,7 @@ typedef enum {
/* 68 */ SK_ANIM_LOOK_LEFT_START,
/* 69 */ SK_ANIM_LOOK_LEFT_LOOP,
/* 70 */ SK_ANIM_SNIFF,
- /* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF,
+ /* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF
} SkullKidAnimation;
typedef enum {
@@ -116,7 +116,7 @@ typedef enum {
/* 1 */ SK_MASK_TYPE_NORMAL,
/* 2 */ SK_MASK_TYPE_GLOWING_EYES,
/* 3 */ SK_MASK_TYPE_FADING_OUT,
- /* 9 */ SK_MASK_TYPE_RAISED = 9,
+ /* 9 */ SK_MASK_TYPE_RAISED = 9
} SkullKidMaskType;
typedef enum {
@@ -127,19 +127,19 @@ typedef enum {
/* 4 */ SK_HAND_TYPE_JUGGLING_OR_DROPPING_OCARINA,
/* 5 */ SK_HAND_TYPE_HOLDING_MAJORAS_MASK_AND_FLUTE,
/* 6 */ SK_HAND_TYPE_HOLDING_FLUTE,
- /* 9 */ SK_HAND_TYPE_DEFAULT = 9,
+ /* 9 */ SK_HAND_TYPE_DEFAULT = 9
} SkullKidHandType;
typedef enum {
/* 0 */ SK_FADE_IN_STATE_NONE,
/* 1 */ SK_FADE_IN_STATE_START,
/* 2 */ SK_FADE_IN_STATE_INCREASE_FOG,
- /* 3 */ SK_FADE_IN_STATE_INCREASE_ALPHA,
+ /* 3 */ SK_FADE_IN_STATE_INCREASE_ALPHA
} SkullKidFadeInState;
typedef enum {
/* 0 */ SK_FADE_OUT_STATE_NONE,
- /* 1 */ SK_FADE_OUT_STATE_FADING_OUT,
+ /* 1 */ SK_FADE_OUT_STATE_FADING_OUT
} SkullKidFadeOutState;
typedef enum {
@@ -336,7 +336,7 @@ void DmStk_ChangeAnim(DmStk* this, PlayState* play, SkelAnime* skelAnime, Animat
* after Skull Kid steals Epona.
*/
void DmStk_PlaySfxForIntroCutsceneFirstPart(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames + 20) {
+ switch (play->csCtx.curFrame + 20) {
case 1195:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
break;
@@ -427,7 +427,7 @@ void DmStk_PlaySfxForIntroCutsceneFirstPart(DmStk* this, PlayState* play) {
* any sound in-game, since all sound effects are muted when it plays.
*/
void DmStk_PlaySfxForTitleCutscene(DmStk* this, PlayState* play) {
- if (play->csCtx.frames == 535) {
+ if (play->csCtx.curFrame == 535) {
func_8019F128(NA_SE_EV_CLOCK_TOWER_BELL);
}
}
@@ -437,7 +437,7 @@ void DmStk_PlaySfxForTitleCutscene(DmStk* this, PlayState* play) {
* that starts after the fade-to-white and ends when the player gains control.
*/
void DmStk_PlaySfxForIntroCutsceneSecondPart(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 78:
case 89:
case 100:
@@ -469,7 +469,7 @@ void DmStk_PlaySfxForIntroCutsceneSecondPart(DmStk* this, PlayState* play) {
* the Happy Mask Salesman.
*/
void DmStk_PlaySfxForObtainingMajorasMaskCutscene(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 18:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_GASAGOSO);
break;
@@ -490,7 +490,7 @@ void DmStk_PlaySfxForObtainingMajorasMaskCutscene(DmStk* this, PlayState* play)
* the hallucinatory Deku Scrubs scene.
*/
void DmStk_PlaySfxForCurseCutsceneFirstPart(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 415:
func_801A479C(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 100);
break;
@@ -518,7 +518,7 @@ void DmStk_PlaySfxForCurseCutsceneFirstPart(DmStk* this, PlayState* play) {
void DmStk_PlaySfxForCurseCutsceneSecondPart(DmStk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 10:
func_801A479C(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 50);
break;
@@ -558,7 +558,7 @@ void DmStk_PlaySfxForCurseCutsceneSecondPart(DmStk* this, PlayState* play) {
if (player) {}
- if ((play->csCtx.frames >= 263) && (play->csCtx.frames < 698)) {
+ if ((play->csCtx.curFrame >= 263) && (play->csCtx.curFrame < 698)) {
Actor_PlaySfx(&player->actor, NA_SE_EN_STALKIDS_BODY_LEV - SFX_FLAG);
}
}
@@ -571,7 +571,7 @@ void DmStk_PlaySfxForCurseCutsceneSecondPart(DmStk* this, PlayState* play) {
void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* play) {
static s32 sMoonCallTimer = 0;
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 140:
func_801A479C(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 80);
break;
@@ -594,7 +594,7 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* pla
break;
}
- if ((this->animIndex == SK_ANIM_OCARINA_JUGGLE) && (play->csCtx.frames < 700)) {
+ if ((this->animIndex == SK_ANIM_OCARINA_JUGGLE) && (play->csCtx.curFrame < 700)) {
if (Animation_OnFrame(&this->skelAnime, 5.0f) || Animation_OnFrame(&this->skelAnime, 25.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_OTEDAMA1);
} else if (Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 40.0f)) {
@@ -602,7 +602,7 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* pla
}
}
- if (play->csCtx.frames >= 700) {
+ if (play->csCtx.curFrame >= 700) {
if (sMoonCallTimer < 128) {
if ((sMoonCallTimer & 0x1F) == 0) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
@@ -621,7 +621,7 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* pla
* Handles sound effects for the cutscene where Skull Kid drops the Ocarina of Time.
*/
void DmStk_PlaySfxForDroppingOcarinaCutscene(DmStk* this, PlayState* play) {
- if (play->csCtx.frames == 3) {
+ if (play->csCtx.curFrame == 3) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL06_SURPRISED);
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_DOWN_K);
}
@@ -631,7 +631,7 @@ void DmStk_PlaySfxForDroppingOcarinaCutscene(DmStk* this, PlayState* play) {
* Handles sound effects for the cutscene where Skull Kid is shivering in the rain.
*/
void DmStk_PlaySfxForShiveringInRainCutscene(DmStk* this, PlayState* play) {
- if ((play->csCtx.frames >= 642) && (play->csCtx.frames < 845)) {
+ if ((play->csCtx.curFrame >= 642) && (play->csCtx.curFrame < 845)) {
Actor_PlaySfx(&this->actor, NA_SE_NE_STAL23_COLD - SFX_FLAG);
}
}
@@ -641,14 +641,14 @@ void DmStk_PlaySfxForShiveringInRainCutscene(DmStk* this, PlayState* play) {
* in Termina Field.
*/
void DmStk_PlaySfxForPlayingWithFairiesCutscene(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 58:
case 61:
case 68:
case 72:
case 77:
case 79:
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_WATER2);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_TALL_GRASS);
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_WALK);
break;
@@ -668,7 +668,7 @@ void DmStk_PlaySfxForPlayingWithFairiesCutscene(DmStk* this, PlayState* play) {
* the Giants are walking away.
*/
void DmStk_PlaySfxForEndingCutsceneFirstPart(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 5:
Audio_PlayAmbience(AMBIENCE_ID_0C);
break;
@@ -686,7 +686,7 @@ void DmStk_PlaySfxForEndingCutsceneFirstPart(DmStk* this, PlayState* play) {
void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 5:
Audio_PlayAmbience(AMBIENCE_ID_0C);
break;
@@ -760,7 +760,7 @@ void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) {
void DmStk_PlaySfxForClockTowerIntroCutsceneVersion2(DmStk* this, PlayState* play) {
static s32 sMoonCallTimer = 0;
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 40:
func_801A479C(&this->actor.projectedPos, NA_SE_EN_STALKIDS_FLOAT, 80);
break;
@@ -779,7 +779,7 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion2(DmStk* this, PlayState* pla
break;
}
- if (play->csCtx.frames >= 408) {
+ if (play->csCtx.curFrame >= 408) {
if (sMoonCallTimer < 128) {
if ((sMoonCallTimer & 0x1F) == 0) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL20_CALL_MOON);
@@ -803,7 +803,7 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
this->oathToOrderCutsceneVoicePos.y = this->actor.projectedPos.y;
this->oathToOrderCutsceneVoicePos.z = this->actor.projectedPos.z;
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 64:
Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL06_SURPRISED);
break;
@@ -843,17 +843,18 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
case 594:
Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL24_SCREAM2);
break;
+
+ default:
+ break;
}
- if (1) {}
-
- if ((play->csCtx.frames >= 62) && (play->csCtx.frames < 273)) {
+ if ((play->csCtx.curFrame >= 62) && (play->csCtx.curFrame < 273)) {
if ((Rand_ZeroOne() < 0.75f) && ((play->state.frames % 2) != 0)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_EARTHQUAKE);
}
}
- if ((play->csCtx.frames >= 498) && (play->csCtx.frames < 577)) {
+ if ((play->csCtx.curFrame >= 498) && (play->csCtx.curFrame < 577)) {
if ((play->state.frames % 4) == 0) {
if ((play->state.frames & 4) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_BODY_LEV);
@@ -863,7 +864,7 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
}
}
- if (play->csCtx.frames >= 290) {
+ if (play->csCtx.curFrame >= 290) {
func_8019F128(NA_SE_EV_KYOJIN_VOICE_SUCCESS - SFX_FLAG);
}
}
@@ -874,7 +875,7 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
* moon, which is slightly longer.
*/
void DmStk_PlaySfxForMoonWarpCutsceneVersion1(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 551:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_PULLED);
break;
@@ -896,7 +897,7 @@ void DmStk_PlaySfxForMoonWarpCutsceneVersion1(DmStk* this, PlayState* play) {
* warps to the moon, which is slightly shorter.
*/
void DmStk_PlaySfxForMoonWarpCutsceneVersion2(DmStk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 311:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_PULLED);
break;
@@ -916,14 +917,14 @@ void DmStk_PlaySfxForMoonWarpCutsceneVersion2(DmStk* this, PlayState* play) {
* Handles sound effects for all cutscenes.
*/
void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
switch (play->sceneId) {
case SCENE_LOST_WOODS:
if (gSaveContext.sceneLayer == 1) {
DmStk_PlaySfxForIntroCutsceneFirstPart(this, play);
} else if (gSaveContext.sceneLayer == 0) {
DmStk_PlaySfxForIntroCutsceneSecondPart(this, play);
- } else if ((gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0)) {
+ } else if ((gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) {
DmStk_PlaySfxForObtainingMajorasMaskCutscene(this, play);
}
break;
@@ -936,9 +937,9 @@ void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
case SCENE_OPENINGDAN:
if (gSaveContext.sceneLayer == 0) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
DmStk_PlaySfxForCurseCutsceneFirstPart(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
DmStk_PlaySfxForCurseCutsceneSecondPart(this, play);
}
}
@@ -946,19 +947,19 @@ void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
case SCENE_OKUJOU:
if (gSaveContext.sceneLayer == 0) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
DmStk_PlaySfxForDroppingOcarinaCutscene(this, play);
- } else if (play->csCtx.currentCsIndex == 2) {
+ } else if (play->csCtx.scriptIndex == 2) {
DmStk_PlaySfxForClockTowerIntroCutsceneVersion2(this, play);
- } else if (play->csCtx.currentCsIndex == 3) {
+ } else if (play->csCtx.scriptIndex == 3) {
DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(this, play);
}
} else if (gSaveContext.sceneLayer == 2) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
DmStk_PlaySfxForMoonWarpCutsceneVersion1(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
DmStk_PlaySfxForMoonWarpCutsceneVersion2(this, play);
}
}
@@ -966,15 +967,15 @@ void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
case SCENE_00KEIKOKU:
if (gSaveContext.sceneLayer == 3) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
DmStk_PlaySfxForShiveringInRainCutscene(this, play);
- } else if (play->csCtx.currentCsIndex == 2) {
+ } else if (play->csCtx.scriptIndex == 2) {
DmStk_PlaySfxForPlayingWithFairiesCutscene(this, play);
}
} else if (gSaveContext.sceneLayer == 7) {
- if (play->csCtx.currentCsIndex == 0) {
+ if (play->csCtx.scriptIndex == 0) {
DmStk_PlaySfxForEndingCutsceneFirstPart(this, play);
- } else if (play->csCtx.currentCsIndex == 1) {
+ } else if (play->csCtx.scriptIndex == 1) {
DmStk_PlaySfxForEndingCutsceneSecondPart(this, play);
}
}
@@ -1052,7 +1053,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
R_MOON_CRASH_TIMER_X = 115;
}
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
sCylinderInit.base.colType = COLTYPE_WOOD;
this->actionFunc = DmStk_ClockTower_StartIntroCutsceneVersion1;
} else {
@@ -1119,7 +1120,7 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
this->fadeOutTimer = 0;
this->alpha = this->alpha;
this->actor.targetArrowOffset = 1100.0f;
- this->csAction = 99;
+ this->cueId = 99;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gSkullKidSkel, NULL, NULL, NULL, 0);
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
@@ -1127,9 +1128,9 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.currentCsIndex > 0)) {
- play->envCtx.unk_17 = 15;
- play->envCtx.unk_18 = 15;
+ if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.scriptIndex > 0)) {
+ play->envCtx.skyboxConfig = 15;
+ play->envCtx.changeSkyboxNextConfig = 15;
}
}
@@ -1165,40 +1166,40 @@ void DmStk_WaitForTelescope(DmStk* this, PlayState* play) {
* Plays the cutscene in the telescope where the Moon's Tear falls.
*/
void DmStk_StartTelescopeCutscene(DmStk* this, PlayState* play) {
- s16 dayOneAndTwoCutscene = this->actor.cutscene;
- s16 dayThreeCutscene = ActorCutscene_GetAdditionalCutscene(dayOneAndTwoCutscene);
- s16 finalHoursCutscene = ActorCutscene_GetAdditionalCutscene(dayThreeCutscene);
- s16 cutscene;
+ s16 dayOneAndTwoCsId = this->actor.csId;
+ s16 dayThreeCsId = CutsceneManager_GetAdditionalCsId(dayOneAndTwoCsId);
+ s16 finalHoursCsId = CutsceneManager_GetAdditionalCsId(dayThreeCsId);
+ s16 csId;
if (gSaveContext.save.day < 3) {
- cutscene = dayOneAndTwoCutscene;
+ csId = dayOneAndTwoCsId;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40) ||
((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0)))) {
- cutscene = finalHoursCutscene;
+ csId = finalHoursCsId;
} else {
- cutscene = dayThreeCutscene;
+ csId = dayThreeCsId;
}
- if (ActorCutscene_GetCanPlayNext(cutscene)) {
- ActorCutscene_Start(cutscene, &this->actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->actor);
Environment_StartTime();
this->actionFunc = DmStk_DoNothing;
} else {
- ActorCutscene_SetIntentToPlay(cutscene);
+ CutsceneManager_Queue(csId);
}
}
void DmStk_ClockTower_StartIntroCutsceneVersion1(DmStk* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(9)) {
- ActorCutscene_Start(9, &this->actor);
+ if (CutsceneManager_IsNext(9)) {
+ CutsceneManager_Start(9, &this->actor);
this->actionFunc = DmStk_ClockTower_WaitForIntroCutsceneVersion1ToEnd;
} else {
- ActorCutscene_SetIntentToPlay(9);
+ CutsceneManager_Queue(9);
}
}
void DmStk_ClockTower_WaitForIntroCutsceneVersion1ToEnd(DmStk* this, PlayState* play) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->animIndex = SK_ANIM_CALL_DOWN_MOON_LOOP;
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
@@ -1207,16 +1208,16 @@ void DmStk_ClockTower_WaitForIntroCutsceneVersion1ToEnd(DmStk* this, PlayState*
}
void DmStk_ClockTower_StartIntroCutsceneVersion2(DmStk* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(11)) {
- ActorCutscene_Start(11, &this->actor);
+ if (CutsceneManager_IsNext(11)) {
+ CutsceneManager_Start(11, &this->actor);
this->actionFunc = DmStk_ClockTower_WaitForIntroCutsceneVersion2ToEnd;
} else {
- ActorCutscene_SetIntentToPlay(11);
+ CutsceneManager_Queue(11);
}
}
void DmStk_ClockTower_WaitForIntroCutsceneVersion2ToEnd(DmStk* this, PlayState* play) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->animIndex = SK_ANIM_FLOATING_ARMS_CROSSED;
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
this->actionFunc = DmStk_ClockTower_Idle;
@@ -1224,21 +1225,21 @@ void DmStk_ClockTower_WaitForIntroCutsceneVersion2ToEnd(DmStk* this, PlayState*
}
void DmStk_ClockTower_StartDropOcarinaCutscene(DmStk* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(10)) {
+ if (CutsceneManager_IsNext(10)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_DAMAGE);
- ActorCutscene_Start(10, &this->actor);
+ CutsceneManager_Start(10, &this->actor);
this->actor.shape.rot.x = 0;
this->actor.world.rot.x = this->actor.shape.rot.x;
this->actor.shape.rot.y = this->actor.shape.rot.x;
this->actor.world.rot.y = this->actor.shape.rot.x;
this->actionFunc = DmStk_ClockTower_WaitForDropOcarinaCutsceneToEnd;
} else {
- ActorCutscene_SetIntentToPlay(10);
+ CutsceneManager_Queue(10);
}
}
void DmStk_ClockTower_WaitForDropOcarinaCutsceneToEnd(DmStk* this, PlayState* play) {
- if ((play->csCtx.state != 0) && (play->csCtx.frames > 20)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->csCtx.curFrame > 20)) {
this->actionFunc = DmStk_ClockTower_Idle;
}
}
@@ -1307,21 +1308,21 @@ void DmStk_ClockTower_WaitForDeflectionToEnd(DmStk* this, PlayState* play) {
*/
void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
s32 pad;
- s32 actorActionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 107)) {
- actorActionIndex = Cutscene_GetActorActionIndex(play, 107);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_107)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_107);
- if (play->csCtx.frames == play->csCtx.actorActions[actorActionIndex]->startFrame) {
- if (this->csAction != play->csCtx.actorActions[actorActionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actorActionIndex]->action;
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
if (play->sceneId == SCENE_CLOCKTOWER) {
this->handType = SK_HAND_TYPE_HOLDING_FLUTE;
} else {
this->handType = SK_HAND_TYPE_DEFAULT;
}
- switch (play->csCtx.actorActions[actorActionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 0:
case 1:
this->animIndex = SK_ANIM_IDLE;
@@ -1402,7 +1403,7 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
case 22:
this->animIndex = SK_ANIM_PLAY_OCARINA_WHILE_FLOATING;
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
@@ -1414,7 +1415,7 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
case 24:
this->animIndex = SK_ANIM_CALL_DOWN_MOON_START;
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
@@ -1425,14 +1426,14 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
case 26:
this->animIndex = SK_ANIM_SMACK_FAIRY_START;
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
case 27:
this->animIndex = SK_ANIM_HIT_BY_BUBBLE;
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
this->handType = SK_HAND_TYPE_HOLDING_OCARINA;
}
break;
@@ -1581,9 +1582,9 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actorActionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
} else {
- this->csAction = 99;
+ this->cueId = 99;
}
if (this->fadeInState == SK_FADE_IN_STATE_START) {
@@ -1714,7 +1715,7 @@ void DmStk_UpdateCollision(DmStk* this, PlayState* play) {
void DmStk_ClockTower_IdleWithOcarina(DmStk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
DmStk_ClockTower_AdjustHeightAndRotation(this, play);
this->actor.flags |= ACTOR_FLAG_1;
this->tatlMessageTimer++;
@@ -1739,7 +1740,7 @@ void DmStk_ClockTower_IdleWithOcarina(DmStk* this, PlayState* play) {
* If he is hit in this state, he will just deflect the attack.
*/
void DmStk_ClockTower_Idle(DmStk* this, PlayState* play) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
DmStk_ClockTower_AdjustHeightAndRotation(this, play);
this->actor.flags |= ACTOR_FLAG_1;
@@ -1794,17 +1795,17 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
break;
case SK_DEKU_PIPES_CS_STATE_PLAYER_USED_OCARINA:
- if (ActorCutscene_GetCanPlayNext(16)) {
+ if (CutsceneManager_IsNext(16)) {
this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_START;
- ActorCutscene_Start(16, &this->actor);
+ CutsceneManager_Start(16, &this->actor);
this->actionFunc = DmStk_ClockTower_Idle;
} else {
- ActorCutscene_SetIntentToPlay(16);
+ CutsceneManager_Queue(16);
}
break;
case SK_DEKU_PIPES_CS_STATE_START:
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_END;
}
break;
@@ -1814,8 +1815,8 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
// Skull Kid is always loaded in the scene, even if he isn't visible, hence why time always passes.
if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) &&
(play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) &&
- (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) &&
- (play->csCtx.state == 0)) {
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) &&
+ (play->csCtx.state == CS_STATE_IDLE)) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
if (R_TIME_SPEED != 0) {
gSaveContext.save.time =
@@ -1824,9 +1825,9 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
}
}
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.currentCsIndex > 0)) {
- play->envCtx.unk_17 = 15;
- play->envCtx.unk_18 = 15;
+ if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.scriptIndex > 0)) {
+ play->envCtx.skyboxConfig = 15;
+ play->envCtx.changeSkyboxNextConfig = 15;
}
}
@@ -1888,7 +1889,7 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
case SK_MASK_TYPE_NORMAL:
if ((play->sceneId == SCENE_LOST_WOODS) && (gSaveContext.sceneLayer == 1) &&
- (play->csCtx.frames < 1400)) {
+ (play->csCtx.curFrame < 1400)) {
if (this->fogN == this->fogF) {
this->fogF = this->fogN;
}
@@ -1905,8 +1906,8 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPDisplayList(POLY_OPA_DISP++, gSkullKidMajorasMask1DL);
gSPDisplayList(POLY_OPA_DISP++, gSkullKidMajorasMaskEyesDL);
- if (Cutscene_CheckActorAction(play, 513) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 513)]->action == 2) &&
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_513) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_513)]->id == 2) &&
(this->objectStk2ObjectIndex >= 0)) {
Matrix_Push();
Matrix_Scale(2.0f, 2.0f, 2.0f, MTXMODE_APPLY);
@@ -2033,10 +2034,10 @@ void DmStk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
this->alpha = this->alpha;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->alpha < 255) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 1, 2);
gDPPipeSync(POLY_XLU_DISP++);
diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
index f55321ef7..cc7ac89ea 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
@@ -12,7 +12,7 @@ typedef void (*DmStkActionFunc)(struct DmStk*, PlayState*);
typedef enum {
/* 0 */ DM_STK_TYPE_SKULL_KID,
- /* 1 */ DM_STK_TYPE_MAJORAS_MASK,
+ /* 1 */ DM_STK_TYPE_MAJORAS_MASK
} DmStkType;
typedef struct DmStk {
@@ -41,7 +41,7 @@ typedef struct DmStk {
/* 0x32E */ u8 fadeInState;
/* 0x32F */ u8 fadeOutState;
/* 0x330 */ s32 fadeOutTimer;
- /* 0x334 */ u8 csAction;
+ /* 0x334 */ u8 cueId;
/* 0x335 */ u8 hasBeenHit; // set but never used
/* 0x336 */ s8 objectStkObjectIndex;
/* 0x337 */ s8 objectStk2ObjectIndex;
diff --git a/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c b/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c
index 13a7e264f..fd945787d 100644
--- a/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c
+++ b/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c
@@ -65,37 +65,37 @@ Actor* func_80C22350(DmTag* this, PlayState* play, u8 actorCat, s16 actorId) {
return foundActor;
}
-s32 func_80C22400(DmTag* this, s16 arg1) {
+s32 func_80C22400(DmTag* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(arg1);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_80C2247C(DmTag* this, s32 arg1) {
+s16 func_80C2247C(DmTag* this, s32 numCutscenes) {
s32 i;
- s16 cs = this->actor.cutscene;
+ s16 csId = this->actor.csId;
- for (i = 0; i < arg1; i++) {
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
- return cs;
+ return csId;
}
s32 func_80C224D8(DmTag* this, PlayState* play) {
s32 pad;
Actor* sp30;
Actor* sp2C;
- s16 sp2A = this->actor.cutscene;
+ s16 csId = this->actor.csId;
s32 ret = false;
sp30 = func_80C22350(this, play, ACTORCAT_NPC, ACTOR_EN_AN);
@@ -103,9 +103,9 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
switch (this->unk_1A4) {
case 0:
- if (func_80C22400(this, sp2A)) {
+ if (func_80C22400(this, csId)) {
if ((sp2C != NULL) && (sp2C->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), sp2C);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), sp2C);
}
this->unk_1A4++;
ret = true;
@@ -114,7 +114,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
case 1:
if ((sp30 != NULL) && (sp30->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(func_80C2247C(this, 0))),
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(func_80C2247C(this, 0))),
sp30);
}
this->unk_1A4++;
@@ -122,7 +122,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
break;
case 2:
- ActorCutscene_Stop(func_80C2247C(this, 0));
+ CutsceneManager_Stop(func_80C2247C(this, 0));
if (func_80C22400(this, func_80C2247C(this, 1))) {
this->unk_1A4++;
ret = true;
@@ -130,7 +130,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
break;
case 3:
- ActorCutscene_Stop(func_80C2247C(this, 1));
+ CutsceneManager_Stop(func_80C2247C(this, 1));
if (func_80C22400(this, func_80C2247C(this, 2))) {
this->unk_1A4++;
ret = true;
@@ -138,7 +138,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
break;
case 4:
- ActorCutscene_Stop(func_80C2247C(this, 2));
+ CutsceneManager_Stop(func_80C2247C(this, 2));
if (func_80C22400(this, func_80C2247C(this, 3))) {
this->unk_1A4++;
ret = true;
@@ -146,7 +146,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
break;
case 5:
- ActorCutscene_Stop(func_80C2247C(this, 3));
+ CutsceneManager_Stop(func_80C2247C(this, 3));
if (func_80C22400(this, func_80C2247C(this, 4))) {
this->unk_1A4++;
ret = true;
diff --git a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
index a671fe3f2..30d1cb3ef 100644
--- a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
+++ b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
@@ -47,7 +47,7 @@ typedef enum {
/* 4 */ ZELDA_ANIM_GIVING_OCARINA,
/* 5 */ ZELDA_ANIM_PLAYING_OCARINA_START,
/* 6 */ ZELDA_ANIM_PLAYING_OCARINA,
- /* 7 */ ZELDA_ANIM_MAX,
+ /* 7 */ ZELDA_ANIM_MAX
} DmZlAnimation;
static TexturePtr sMouthTextures[] = {
@@ -61,7 +61,7 @@ typedef enum {
/* 0 */ ZELDA_MOUTH_NEUTRAL,
/* 1 */ ZELDA_MOUTH_SMILING,
/* 2 */ ZELDA_MOUTH_FROWNING,
- /* 3 */ ZELDA_MOUTH_OPEN,
+ /* 3 */ ZELDA_MOUTH_OPEN
} DmZlMouthTextures;
static TexturePtr sEyeTextures[] = {
@@ -81,7 +81,7 @@ typedef enum {
/* 3 */ ZELDA_EYE_WIDE,
/* 4 */ ZELDA_EYE_HAPPY,
/* 5 */ ZELDA_EYE_OPEN_LOOKING_LEFT,
- /* 6 */ ZELDA_EYE_OPEN_LOOKING_RIGHT,
+ /* 6 */ ZELDA_EYE_OPEN_LOOKING_RIGHT
} DmZlEyeTextures;
// Unused in MM
@@ -92,7 +92,7 @@ typedef enum {
/* 3 */ ZELDA_EYE_STATE_LOOKING_RIGHT,
/* 4 */ ZELDA_EYE_STATE_WIDE,
/* 5 */ ZELDA_EYE_STATE_HAPPY,
- /* 6 */ ZELDA_EYE_STATE_CLOSED2,
+ /* 6 */ ZELDA_EYE_STATE_CLOSED2
} DmZlEyeStates;
/**
@@ -131,14 +131,14 @@ void DmZl_DoNothing(DmZl* this, PlayState* play) {
}
void DmZl_UpdateCutscene(DmZl* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel; // reused as animIndex
- if (Cutscene_CheckActorAction(play, 0x66)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x66);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_102)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_102);
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
s16 nextAnimIndex = ZELDA_ANIM_FACING_AWAY;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
default:
case 1:
break;
@@ -159,14 +159,14 @@ void DmZl_UpdateCutscene(DmZl* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- actionIndex = this->animIndex;
+ cueChannel = this->animIndex;
- if ((actionIndex == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (actionIndex == ZELDA_ANIM_GIVING_OCARINA_START) ||
- (actionIndex == ZELDA_ANIM_PLAYING_OCARINA_START)) {
+ if ((cueChannel == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (cueChannel == ZELDA_ANIM_GIVING_OCARINA_START) ||
+ (cueChannel == ZELDA_ANIM_PLAYING_OCARINA_START)) {
// these animations don't loop at the end, they lead into the next animation
this->animIndex++;
DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
@@ -289,7 +289,7 @@ void DmZl_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTextureIndex]));
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
DmZl_OverrideLimbDraw, DmZl_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_Door_Ana/z_door_ana.c b/src/overlays/actors/ovl_Door_Ana/z_door_ana.c
index 1e2a59b76..c889de158 100644
--- a/src/overlays/actors/ovl_Door_Ana/z_door_ana.c
+++ b/src/overlays/actors/ovl_Door_Ana/z_door_ana.c
@@ -100,7 +100,7 @@ void DoorAna_WaitClosed(DoorAna* this, PlayState* play) {
if (grottoType == DOORANA_TYPE_HIDDEN_STORMS) {
//! @bug Implementation from OoT is not updated for MM, grotto does not open on Song of Storms
- if (this->actor.xyzDistToPlayerSq < SQ(200.0f) && EnvFlags_Get(play, 5)) {
+ if (this->actor.xyzDistToPlayerSq < SQ(200.0f) && CutsceneFlags_Get(play, 5)) {
grottoIsOpen = true;
this->actor.flags &= ~ACTOR_FLAG_10; // always update OFF
}
@@ -176,11 +176,11 @@ void DoorAna_GrabLink(DoorAna* this, PlayState* play) {
Player* player;
s8 pad[2];
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
index 8a9d26a4d..7e202b0af 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
@@ -101,8 +101,8 @@ static InitChainEntry sInitChain[] = {
};
typedef struct {
- /* 0x00 */ s16 sceneId;
- /* 0x02 */ u8 index;
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ u8 index;
} ShutterSceneInfo; // size = 0x4
ShutterSceneInfo D_808A2258[] = {
@@ -115,9 +115,9 @@ ShutterSceneInfo D_808A2258[] = {
};
typedef struct {
- /* 0x00 */ s16 dungeonSceneId;
- /* 0x02 */ s16 bossSceneId;
- /* 0x04 */ u8 index;
+ /* 0x0 */ s16 dungeonSceneId;
+ /* 0x2 */ s16 bossSceneId;
+ /* 0x4 */ u8 index;
} BossDoorInfo; // size = 0x6
BossDoorInfo D_808A22A0[] = {
@@ -139,15 +139,17 @@ void DoorShutter_SetupAction(DoorShutter* this, DoorShutterActionFunc actionFunc
}
s32 func_808A0900(DoorShutter* this, PlayState* play) {
- TransitionActorEntry* transitionEntry = &play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)];
+ TransitionActorEntry* transitionEntry =
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)];
s8 frontRoom = transitionEntry->sides[0].room;
if (frontRoom == transitionEntry->sides[1].room) {
- if (ABS_ALT(BINANG_SUB(this->actor.shape.rot.y, this->actor.yawTowardsPlayer)) < 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->slidingDoor.dyna.actor.shape.rot.y,
+ this->slidingDoor.dyna.actor.yawTowardsPlayer)) < 0x4000) {
frontRoom = -1;
}
}
- return frontRoom == this->actor.room;
+ return frontRoom == this->slidingDoor.dyna.actor.room;
}
s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) {
@@ -173,13 +175,13 @@ s32 DoorShutter_SetupDoor(DoorShutter* this, PlayState* play) {
}
if (doorType == 1) {
- if (!Flags_GetClear(play, this->actor.room)) {
+ if (!Flags_GetClear(play, this->slidingDoor.dyna.actor.room)) {
DoorShutter_SetupAction(this, func_808A0F88);
this->unk_168 = 1.0f;
return true;
}
} else if ((doorType == 2) || (doorType == 7)) {
- if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
DoorShutter_SetupAction(this, func_808A1548);
this->unk_168 = 1.0f;
return true;
@@ -201,8 +203,8 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
s32 sp24;
s32 i;
- Actor_ProcessInitChain(&this->actor, sInitChain);
- this->doorType = DOORSHUTTER_GET_380(&this->actor);
+ Actor_ProcessInitChain(&this->slidingDoor.dyna.actor, sInitChain);
+ this->doorType = DOORSHUTTER_GET_380(&this->slidingDoor.dyna.actor);
sp24 = D_808A2240[this->doorType];
if (sp24 < 0) {
@@ -216,7 +218,7 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
sp24 = shutterSceneInfo->index;
if (sp24 == 6) {
- this->actor.flags |= ACTOR_FLAG_10000000;
+ this->slidingDoor.dyna.actor.flags |= ACTOR_FLAG_10000000;
}
} else if (sp24 == 0) {
BossDoorInfo* bossDoorInfo = &D_808A22A0[0];
@@ -227,13 +229,13 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
}
}
- this->unk_15E = bossDoorInfo->index;
+ this->slidingDoor.unk_15E = bossDoorInfo->index;
} else {
- this->actor.room = -1;
+ this->slidingDoor.dyna.actor.room = -1;
}
if ((this->requiredObjBankIndex = Object_GetIndex(&play->objectCtx, D_808A2180[sp24].objectId)) < 0) {
- Actor_Kill(&this->actor);
+ Actor_Kill(&this->slidingDoor.dyna.actor);
return;
}
@@ -241,19 +243,19 @@ void DoorShutter_Init(Actor* thisx, PlayState* play2) {
this->unk_163 = sp24;
if ((this->doorType == 4) || (this->doorType == 5)) {
- if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if (!Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
this->unk_166 = 10;
}
}
- Actor_SetFocus(&this->actor, 60.0f);
+ Actor_SetFocus(&this->slidingDoor.dyna.actor, 60.0f);
}
void DoorShutter_Destroy(Actor* thisx, PlayState* play) {
DoorShutter* this = THIS;
- if (this->actor.room >= 0) {
- s32 transitionActorId = DOORSHUTTER_GET_FC00(&this->actor);
+ if (this->slidingDoor.dyna.actor.room >= 0) {
+ s32 transitionActorId = DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor);
play->doorCtx.transitionActorList[transitionActorId].id =
-play->doorCtx.transitionActorList[transitionActorId].id;
@@ -263,8 +265,8 @@ void DoorShutter_Destroy(Actor* thisx, PlayState* play) {
void DoorShutter_SetupType(DoorShutter* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->requiredObjBankIndex) &&
(!R_PLAY_FILL_SCREEN_ON || (R_PLAY_FILL_SCREEN_ALPHA == 0))) {
- this->actor.objBankIndex = this->requiredObjBankIndex;
- this->actor.draw = DoorShutter_Draw;
+ this->slidingDoor.dyna.actor.objBankIndex = this->requiredObjBankIndex;
+ this->slidingDoor.dyna.actor.draw = DoorShutter_Draw;
DoorShutter_SetupDoor(this, play);
}
}
@@ -278,7 +280,7 @@ f32 func_808A0D90(PlayState* play, DoorShutter* this, f32 arg2, f32 arg3, f32 ar
sp28.y = player->actor.world.pos.y + arg2;
sp28.z = player->actor.world.pos.z;
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp1C, &sp28);
+ Actor_OffsetOfPointInActorCoords(&this->slidingDoor.dyna.actor, &sp1C, &sp28);
if ((arg3 < fabsf(sp1C.x)) || (arg4 < fabsf(sp1C.y))) {
return FLT_MAX;
@@ -294,7 +296,7 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
f32 temp_f0 = func_808A0D90(play, this, 0.0f, shutterInfo->unk_0A, shutterInfo->unk_0B);
if (fabsf(temp_f0) < 50.0f) {
- s16 temp_v0_2 = BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y);
+ s16 temp_v0_2 = BINANG_SUB(player->actor.shape.rot.y, this->slidingDoor.dyna.actor.shape.rot.y);
if (temp_f0 > 0.0f) {
temp_v0_2 = 0x8000 - temp_v0_2;
@@ -309,28 +311,29 @@ s32 func_808A0E28(DoorShutter* this, PlayState* play) {
}
void func_808A0F88(DoorShutter* this, PlayState* play) {
- if (Flags_GetClear(play, this->actor.room) || Flags_GetClearTemp(play, this->actor.room)) {
- this->unk_160 = this->actor.cutscene;
+ if (Flags_GetClear(play, this->slidingDoor.dyna.actor.room) ||
+ Flags_GetClearTemp(play, this->slidingDoor.dyna.actor.room)) {
+ this->csId = this->slidingDoor.dyna.actor.csId;
if (this->doorType == 7) {
- if (this->unk_160 != -1) {
- this->unk_160 = ActorCutscene_GetAdditionalCutscene(this->unk_160);
+ if (this->csId != CS_ID_NONE) {
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
}
}
- if (ActorCutscene_GetCanPlayNext(this->unk_160)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_160, &this->actor);
- Flags_SetClear(play, this->actor.room);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->slidingDoor.dyna.actor);
+ Flags_SetClear(play, this->slidingDoor.dyna.actor.room);
DoorShutter_SetupAction(this, func_808A1784);
this->unk_167 = -1;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_160);
+ CutsceneManager_Queue(this->csId);
}
} else if (func_808A0E28(this, play)) {
Player* player = GET_PLAYER(play);
player->doorType = PLAYER_DOORTYPE_TALKING;
- player->doorActor = &this->actor;
- this->actor.textId = 0x1801;
+ player->doorActor = &this->slidingDoor.dyna.actor;
+ this->slidingDoor.dyna.actor.textId = 0x1801;
func_80122F28(player);
}
}
@@ -339,16 +342,16 @@ void func_808A1080(DoorShutter* this, PlayState* play) {
}
void func_808A1090(DoorShutter* this, PlayState* play) {
- if (this->unk_15C != 0) {
+ if (this->slidingDoor.unk_15C != 0) {
DoorShutter_SetupAction(this, func_808A1684);
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
if (this->unk_166 != 0) {
- Flags_SetSwitch(play, DOORSHUTTER_GET_7F(&this->actor));
+ Flags_SetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor));
if (this->doorType != 5) {
- gSaveContext.save.inventory.dungeonKeys[gSaveContext.mapIndex]--;
- Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ DUNGEON_KEY_COUNT(gSaveContext.mapIndex) = DUNGEON_KEY_COUNT(gSaveContext.mapIndex) - 1;
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
} else {
- Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK_B);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK_B);
}
}
} else {
@@ -359,7 +362,7 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
player->doorType = PLAYER_DOORTYPE_SLIDING;
player->doorDirection = doorDirection;
- player->doorActor = &this->actor;
+ player->doorActor = &this->slidingDoor.dyna.actor;
if (this->unk_163 == 7) {
player->doorTimer = 12;
@@ -368,20 +371,21 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
}
if (this->doorType == 6) {
- if (gSaveContext.save.playerData.healthCapacity < (DOORSHUTTER_GET_1F(&this->actor) * 0x10)) {
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity <
+ (DOORSHUTTER_GET_1F(&this->slidingDoor.dyna.actor) * 0x10)) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x14FC;
+ this->slidingDoor.dyna.actor.textId = 0x14FC;
}
} else if (this->unk_166 != 0) {
if (this->doorType == 5) {
if (!CHECK_DUNGEON_ITEM(DUNGEON_BOSS_KEY, gSaveContext.mapIndex)) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x1803;
+ this->slidingDoor.dyna.actor.textId = 0x1803;
}
player->doorTimer += 10;
} else if (DUNGEON_KEY_COUNT(gSaveContext.mapIndex) <= 0) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->actor.textId = 0x1802;
+ this->slidingDoor.dyna.actor.textId = 0x1802;
} else {
player->doorTimer += 10;
}
@@ -392,7 +396,7 @@ void func_808A1090(DoorShutter* this, PlayState* play) {
}
void func_808A1288(DoorShutter* this, PlayState* play) {
- if (this->actor.category == ACTORCAT_DOOR) {
+ if (this->slidingDoor.dyna.actor.category == ACTORCAT_DOOR) {
Player* player = GET_PLAYER(play);
s32 sp38 = this->unk_164;
s32 sp34 = 0xF;
@@ -406,17 +410,18 @@ void func_808A1288(DoorShutter* this, PlayState* play) {
this->unk_164 = sp38;
this->unk_168 = 0.0f;
- Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->actor, player->unk_3BA, this->unk_168, 12, sp34, 10);
+ Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->slidingDoor.dyna.actor, player->doorBgCamIndex,
+ this->unk_168, 12, sp34, 10);
}
}
s32 func_808A1340(DoorShutter* this, PlayState* play) {
Vec3f sp2C;
- if (this->actor.velocity.y == 0.0f) {
+ if (this->slidingDoor.dyna.actor.velocity.y == 0.0f) {
func_808A1288(this, play);
if (this->unk_163 != 7) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
}
}
@@ -424,20 +429,22 @@ s32 func_808A1340(DoorShutter* this, PlayState* play) {
s32 pad;
if (this->unk_163 == 7) {
- func_800B9010(&this->actor, NA_SE_EV_IKANA_DOOR_OPEN - SFX_FLAG);
+ func_800B9010(&this->slidingDoor.dyna.actor, NA_SE_EV_IKANA_DOOR_OPEN - SFX_FLAG);
}
- Lib_Vec3f_TranslateAndRotateY(&this->actor.home.pos, this->actor.shape.rot.y,
+ Lib_Vec3f_TranslateAndRotateY(&this->slidingDoor.dyna.actor.home.pos, this->slidingDoor.dyna.actor.shape.rot.y,
(this->unk_163 == 7) ? &D_808A22C4 : &D_808A22D0, &sp2C);
- Math_StepToF(&this->actor.velocity.y, 5.0f, 0.5f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 5.0f, 0.5f);
- if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &sp2C, this->actor.velocity.y) == 0.0f) {
+ if (Math_Vec3f_StepToXZ(&this->slidingDoor.dyna.actor.world.pos, &sp2C,
+ this->slidingDoor.dyna.actor.velocity.y) == 0.0f) {
return true;
}
} else {
- Math_StepToF(&this->actor.velocity.y, 15.0f, 3.0f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 15.0f, 3.0f);
- if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y + 200.0f, this->actor.velocity.y)) {
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y + 200.0f,
+ this->slidingDoor.dyna.actor.velocity.y)) {
return true;
}
}
@@ -449,13 +456,13 @@ s32 func_808A1478(DoorShutter* this, PlayState* play, f32 arg2) {
if (temp == this->unk_168) {
if (arg2 == 1.0f) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_METALDOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_METALDOOR_CLOSE);
} else {
- Actor_PlaySfx(&this->actor, NA_SE_EV_METALDOOR_OPEN);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_METALDOOR_OPEN);
}
- if ((this->unk_160 != -1) && (ActorCutscene_GetCurrentIndex() == this->unk_160)) {
- func_800B724C(play, &this->actor, PLAYER_CSMODE_1);
+ if ((this->csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->csId)) {
+ func_800B724C(play, &this->slidingDoor.dyna.actor, PLAYER_CSMODE_1);
}
}
@@ -467,28 +474,28 @@ s32 func_808A1478(DoorShutter* this, PlayState* play, f32 arg2) {
void func_808A1548(DoorShutter* this, PlayState* play) {
if (func_808A1478(this, play, 1.0f)) {
- if (Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
- this->unk_160 = this->actor.cutscene;
- if (ActorCutscene_GetCanPlayNext(this->unk_160)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_160, &this->actor);
+ if (Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
+ this->csId = this->slidingDoor.dyna.actor.csId;
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->slidingDoor.dyna.actor);
DoorShutter_SetupAction(this, func_808A1784);
this->unk_167 = -1;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_160);
+ CutsceneManager_Queue(this->csId);
}
} else if (func_808A0E28(this, play)) {
Player* player = GET_PLAYER(play);
player->doorType = PLAYER_DOORTYPE_TALKING;
- player->doorActor = &this->actor;
- this->actor.textId = 0x1800;
+ player->doorActor = &this->slidingDoor.dyna.actor;
+ this->slidingDoor.dyna.actor.textId = 0x1800;
func_80122F28(player);
}
}
}
void func_808A1618(DoorShutter* this, PlayState* play) {
- if ((this->unk_15C == 0) && !Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->actor))) {
+ if ((this->slidingDoor.unk_15C == 0) && !Flags_GetSwitch(play, DOORSHUTTER_GET_7F(&this->slidingDoor.dyna.actor))) {
DoorShutter_SetupAction(this, func_808A1548);
} else {
func_808A1090(this, play);
@@ -505,14 +512,14 @@ void func_808A1684(DoorShutter* this, PlayState* play) {
phi_f0 = 50.0f;
}
- if (phi_f0 < this->actor.xzDistToPlayer) {
+ if (phi_f0 < this->slidingDoor.dyna.actor.xzDistToPlayer) {
if (this->unk_163 == 7) {
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
} else {
if (DoorShutter_SetupDoor(this, play)) {
- this->actor.velocity.y = 30.0f;
+ this->slidingDoor.dyna.actor.velocity.y = 30.0f;
}
- Actor_PlaySfx(&this->actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_SLIDE_DOOR_CLOSE);
}
DoorShutter_SetupAction(this, func_808A1B48);
}
@@ -521,7 +528,7 @@ void func_808A1684(DoorShutter* this, PlayState* play) {
void func_808A1784(DoorShutter* this, PlayState* play) {
if (this->unk_167 != 0) {
- if (func_800F22C4(this->unk_160, &this->actor)) {
+ if (func_800F22C4(this->csId, &this->slidingDoor.dyna.actor) != 0) {
if (this->unk_167 < 0) {
if ((play->state.frames % 2) != 0) {
this->unk_167++;
@@ -545,16 +552,18 @@ void func_808A1784(DoorShutter* this, PlayState* play) {
void func_808A1884(DoorShutter* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s8 room = this->actor.room;
+ s8 room = this->slidingDoor.dyna.actor.room;
Vec3f sp44;
- if (this->actor.room >= 0) {
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp44, &player->actor.world.pos);
+ if (this->slidingDoor.dyna.actor.room >= 0) {
+ Actor_OffsetOfPointInActorCoords(&this->slidingDoor.dyna.actor, &sp44, &player->actor.world.pos);
- this->actor.room =
- play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)].sides[(sp44.z < 0.0f) ? 0 : 1].room;
+ this->slidingDoor.dyna.actor.room =
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)]
+ .sides[(sp44.z < 0.0f) ? 0 : 1]
+ .room;
- if (room != this->actor.room) {
+ if (room != this->slidingDoor.dyna.actor.room) {
Room temp = play->roomCtx.curRoom;
play->roomCtx.curRoom = play->roomCtx.prevRoom;
@@ -564,14 +573,14 @@ void func_808A1884(DoorShutter* this, PlayState* play) {
func_8012EBF8(play, &play->roomCtx);
}
- this->unk_15C = 0;
- this->actor.velocity.y = 0.0f;
+ this->slidingDoor.unk_15C = 0;
+ this->slidingDoor.dyna.actor.velocity.y = 0.0f;
if (DoorShutter_SetupDoor(this, play) && !(player->stateFlags1 & PLAYER_STATE1_800)) {
DoorShutter_SetupAction(this, func_808A1C50);
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
func_801226E0(play, ((void)0, gSaveContext.respawn[RESPAWN_MODE_DOWN].data));
- player->unk_A86 = -1;
+ player->csId = CS_ID_NONE;
func_800B7298(play, NULL, PLAYER_CSMODE_115);
}
}
@@ -580,20 +589,22 @@ void func_808A1884(DoorShutter* this, PlayState* play) {
s32 func_808A1A70(DoorShutter* this) {
if (this->unk_163 == 7) {
if (this->unk_163 == 7) {
- func_800B9010(&this->actor, NA_SE_EV_IKANA_DOOR_CLOSE - SFX_FLAG);
+ func_800B9010(&this->slidingDoor.dyna.actor, NA_SE_EV_IKANA_DOOR_CLOSE - SFX_FLAG);
}
- Math_StepToF(&this->actor.velocity.y, 5.0f, 0.5f);
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 5.0f, 0.5f);
- if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &this->actor.home.pos, this->actor.velocity.y) == 0.0f) {
+ if (Math_Vec3f_StepToXZ(&this->slidingDoor.dyna.actor.world.pos, &this->slidingDoor.dyna.actor.home.pos,
+ this->slidingDoor.dyna.actor.velocity.y) == 0.0f) {
return true;
}
} else {
- if (this->actor.velocity.y < 20.0f) {
- Math_StepToF(&this->actor.velocity.y, 20.0f, 8.0f);
+ if (this->slidingDoor.dyna.actor.velocity.y < 20.0f) {
+ Math_StepToF(&this->slidingDoor.dyna.actor.velocity.y, 20.0f, 8.0f);
}
- if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, this->actor.velocity.y)) {
+ if (Math_StepToF(&this->slidingDoor.dyna.actor.world.pos.y, this->slidingDoor.dyna.actor.home.pos.y,
+ this->slidingDoor.dyna.actor.velocity.y)) {
return true;
}
}
@@ -604,18 +615,19 @@ void func_808A1B48(DoorShutter* this, PlayState* play) {
s16 quakeIndex;
if (func_808A1A70(this)) {
- if (this->actor.velocity.y > 20.0f) {
- this->actor.floorHeight = this->actor.home.pos.y;
- Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, 45.0f, 10, 8.0f, 500, 10, 0);
+ if (this->slidingDoor.dyna.actor.velocity.y > 20.0f) {
+ this->slidingDoor.dyna.actor.floorHeight = this->slidingDoor.dyna.actor.home.pos.y;
+ Actor_SpawnFloorDustRing(play, &this->slidingDoor.dyna.actor, &this->slidingDoor.dyna.actor.world.pos,
+ 45.0f, 10, 8.0f, 500, 10, 0);
}
- Actor_PlaySfx(&this->actor, NA_SE_EV_BIGWALL_BOUND);
+ Actor_PlaySfx(&this->slidingDoor.dyna.actor, NA_SE_EV_BIGWALL_BOUND);
- quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, -32536);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
- Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
+ Rumble_Request(this->slidingDoor.dyna.actor.xyzDistToPlayerSq, 180, 20, 100);
func_808A1884(this, play);
}
@@ -624,7 +636,7 @@ void func_808A1B48(DoorShutter* this, PlayState* play) {
void func_808A1C50(DoorShutter* this, PlayState* play) {
if (this->unk_167++ > 30) {
if (GET_PLAYER(play)->csMode == PLAYER_CSMODE_115) {
- func_800B7298(play, NULL, PLAYER_CSMODE_6);
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
}
DoorShutter_SetupDoor(this, play);
}
@@ -639,7 +651,9 @@ void DoorShutter_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_163 == 7) {
- this->actor.home.rot.z = Math_Vec3f_DistXZ(&this->actor.home.pos, &this->actor.world.pos) * -100.0f;
+ this->slidingDoor.dyna.actor.home.rot.z =
+ Math_Vec3f_DistXZ(&this->slidingDoor.dyna.actor.home.pos, &this->slidingDoor.dyna.actor.world.pos) *
+ -100.0f;
}
}
}
@@ -652,8 +666,9 @@ s32 func_808A1D68(DoorShutter* this, PlayState* play) {
return true;
}
- temp_a0 = BINANG_SUB(Actor_WorldYawTowardPoint(&this->actor, &play->view.eye), this->actor.shape.rot.y);
- temp_a1 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
+ temp_a0 = BINANG_SUB(Actor_WorldYawTowardPoint(&this->slidingDoor.dyna.actor, &play->view.eye),
+ this->slidingDoor.dyna.actor.shape.rot.y);
+ temp_a1 = BINANG_SUB(this->slidingDoor.dyna.actor.yawTowardsPlayer, this->slidingDoor.dyna.actor.shape.rot.y);
temp_a0 = ABS_ALT(temp_a0);
temp_a1 = ABS_ALT(temp_a1);
@@ -674,30 +689,31 @@ void DoorShutter_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_164 == 7) {
Matrix_Translate(0.0f, 64.96f, 0.0f, MTXMODE_APPLY);
- Matrix_RotateZS(this->actor.home.rot.z, MTXMODE_APPLY);
+ Matrix_RotateZS(this->slidingDoor.dyna.actor.home.rot.z, MTXMODE_APPLY);
Matrix_Translate(0.0f, -64.96f, 0.0f, MTXMODE_APPLY);
}
if (sp44->unk_04 != 0) {
TransitionActorEntry* transitionEntry =
- &play->doorCtx.transitionActorList[DOORSHUTTER_GET_FC00(&this->actor)];
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->slidingDoor.dyna.actor)];
if ((play->roomCtx.prevRoom.num >= 0) ||
(transitionEntry->sides[0].room == transitionEntry->sides[1].room)) {
- s16 yaw = this->actor.shape.rot.y - Math_Vec3f_Yaw(&play->view.eye, &this->actor.world.pos);
+ s16 yaw = this->slidingDoor.dyna.actor.shape.rot.y -
+ Math_Vec3f_Yaw(&play->view.eye, &this->slidingDoor.dyna.actor.world.pos);
if (ABS_ALT(yaw) < 0x4000) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
- } else if (this->actor.room == transitionEntry->sides[0].room) {
+ } else if (this->slidingDoor.dyna.actor.room == transitionEntry->sides[0].room) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
} else if (this->doorType == 5) {
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_808A22DC[this->unk_15E]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_808A22DC[this->slidingDoor.unk_15E]));
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
index c64d3d523..abdf0ce84 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h
@@ -2,6 +2,7 @@
#define Z_DOOR_SHUTTER_H
#include "global.h"
+#include "z64door.h"
struct DoorShutter;
@@ -10,14 +11,10 @@ typedef void (*DoorShutterActionFunc)(struct DoorShutter*, PlayState*);
#define DOORSHUTTER_GET_1F(thisx) ((thisx)->params & 0x1F)
#define DOORSHUTTER_GET_7F(thisx) ((thisx)->params & 0x7F)
#define DOORSHUTTER_GET_380(thisx) (((thisx)->params >> 7) & 7)
-#define DOORSHUTTER_GET_FC00(thisx) ((u16)(thisx)->params >> 0xA)
typedef struct DoorShutter {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ UNK_TYPE1 unk144[0x18];
- /* 0x015C */ s16 unk_15C;
- /* 0x015E */ s16 unk_15E;
- /* 0x0160 */ s16 unk_160;
+ /* 0x000 */ SlidingDoorActor slidingDoor;
+ /* 0x160 */ s16 csId;
/* 0x0162 */ u8 doorType;
/* 0x0163 */ u8 unk_163;
/* 0x0164 */ u8 unk_164;
diff --git a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
index 701b38639..af4f27aea 100644
--- a/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
+++ b/src/overlays/actors/ovl_Door_Spiral/z_door_spiral.h
@@ -7,7 +7,8 @@ struct DoorSpiral;
typedef struct DoorSpiral {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0xC];
+ /* 0x144 */ u8 shouldClimb;
+ /* 0x145 */ UNK_TYPE1 unk_145[0xB];
} DoorSpiral; // size = 0x150
#endif // Z_DOOR_SPIRAL_H
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index 57fa310e1..de20e6f63 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -47,8 +47,8 @@ void func_808BAAF4(DoorWarp1* this, PlayState* play);
void func_808BABF4(DoorWarp1* this, PlayState* play);
void func_808BB8D4(DoorWarp1* this, PlayState* play, s32 arg2);
-static s16 D_808BC000;
-static f32 D_808BC004;
+s16 D_808BC000;
+f32 D_808BC004;
ActorInit Door_Warp1_InitVars = {
ACTOR_DOOR_WARP1,
@@ -280,15 +280,15 @@ void func_808B8E78(DoorWarp1* this, PlayState* play) {
}
s32 func_808B900C(DoorWarp1* this, PlayState* play) {
- s32 index;
+ s32 cueChannel;
u8 ret = false;
- if (Cutscene_CheckActorAction(play, 569)) {
- index = Cutscene_GetActorActionIndex(play, 569);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_569)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_569);
- if (this->unk_208 != play->csCtx.actorActions[index]->action) {
- this->unk_208 = play->csCtx.actorActions[index]->action;
- if (play->csCtx.actorActions[index]->action == 2) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (play->csCtx.actorCues[cueChannel]->id == 2) {
ret = true;
}
}
@@ -345,7 +345,7 @@ void func_808B921C(DoorWarp1* this, PlayState* play) {
}
if (func_808B866C(this, play) && !Play_InCsMode(play)) {
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
Message_StartTextbox(play, 0xF2, &this->dyna.actor);
DoorWarp1_SetupAction(this, func_808B93A0);
}
@@ -368,7 +368,7 @@ void func_808B93A0(DoorWarp1* this, PlayState* play) {
DoorWarp1_SetupAction(this, func_808B9524);
} else {
func_8019F230();
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
DoorWarp1_SetupAction(this, func_808B94A4);
}
}
@@ -377,7 +377,7 @@ void func_808B93A0(DoorWarp1* this, PlayState* play) {
}
void func_808B94A4(DoorWarp1* this, PlayState* play) {
- if (!func_808B866C(this, play) && (ActorCutscene_GetCurrentIndex() != play->playerActorCsIds[8])) {
+ if (!func_808B866C(this, play) && (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
DoorWarp1_SetupAction(this, func_808B921C);
}
func_808BB8D4(this, play, 1);
@@ -385,10 +385,10 @@ void func_808B94A4(DoorWarp1* this, PlayState* play) {
}
void func_808B9524(DoorWarp1* this, PlayState* play) {
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[9])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[9]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[9], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE], NULL);
DoorWarp1_SetupAction(this, func_808B958C);
}
}
@@ -458,10 +458,10 @@ void func_808B977C(DoorWarp1* this, PlayState* play) {
}
void func_808B9840(DoorWarp1* this, PlayState* play) {
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[9])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[9]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[9], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE], NULL);
DoorWarp1_SetupAction(this, func_808B98A8);
}
}
@@ -554,28 +554,31 @@ void func_808B9CE8(DoorWarp1* this, PlayState* play) {
switch (play->sceneId) {
case SCENE_MITURIN_BS:
- gSaveContext.save.unk_ECC[0] =
- (((void)0, gSaveContext.save.unk_ECC[0]) & 0xFFFFFF00) | (((u8)gSaveContext.save.unk_ECC[1]) & 0xFF);
+ gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0xFFFFFF00) |
+ (((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF);
break;
case SCENE_HAKUGIN_BS:
- gSaveContext.save.unk_ECC[0] = (((void)0, gSaveContext.save.unk_ECC[0]) & 0xFFFF00FF) |
- ((((u8)gSaveContext.save.unk_ECC[1]) & 0xFF) << 8);
+ gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0xFFFF00FF) |
+ ((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF) << 8);
break;
case SCENE_INISIE_BS:
- gSaveContext.save.unk_ECC[0] = (((void)0, gSaveContext.save.unk_ECC[0]) & 0xFF00FFFF) |
- ((((u8)gSaveContext.save.unk_ECC[1]) & 0xFF) << 0x10);
+ gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0xFF00FFFF) |
+ ((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF) << 0x10);
break;
case SCENE_SEA_BS:
- gSaveContext.save.unk_ECC[0] = (((void)0, gSaveContext.save.unk_ECC[0]) & 0x00FFFFFF) |
- ((((u8)gSaveContext.save.unk_ECC[1]) & 0xFF) << 0x18);
+ gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0x00FFFFFF) |
+ ((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF) << 0x18);
+ break;
+
+ default:
break;
}
- gSaveContext.save.unk_ECC[1] =
- (gSaveContext.save.unk_ECC[1] & 0xFFFFFF00) | ((((u8)gSaveContext.save.unk_ECC[1]) + 1) & 0xFF);
+ gSaveContext.save.saveInfo.unk_EA8[1] = (gSaveContext.save.saveInfo.unk_EA8[1] & 0xFFFFFF00) |
+ ((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) + 1) & 0xFF);
Item_Give(play, func_808B849C(this, play) + (ITEM_REMAINS_ODOLWA - 1));
DoorWarp1_SetupAction(this, func_808B9E94);
}
@@ -617,10 +620,10 @@ void func_808B9FD0(DoorWarp1* this, PlayState* play) {
return;
}
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[9])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[9]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[9], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_ENTRANCE], NULL);
AudioSfx_PlaySfx(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
Animation_ChangeImpl(&this->skelAnime, &gWarpCrystalAnim, 1.0f, Animation_GetLastFrame(&gWarpCrystalAnim),
@@ -638,7 +641,7 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
if ((play->sceneId == SCENE_MITURIN_BS) || (play->sceneId == SCENE_HAKUGIN_BS) ||
(play->sceneId == SCENE_INISIE_BS) || (play->sceneId == SCENE_SEA_BS)) {
- D_801F4DE2 = play->sceneId;
+ gDungeonBossWarpSceneId = play->sceneId;
if (play->sceneId == SCENE_MITURIN_BS) {
phi_v0_2 = 0;
} else if (play->sceneId == SCENE_HAKUGIN_BS) {
@@ -658,19 +661,19 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
switch (phi_v0_2) {
case 0:
- phi_a0 = gSaveContext.save.unk_ECC[0] & 0xFF;
+ phi_a0 = gSaveContext.save.saveInfo.unk_EA8[0] & 0xFF;
break;
case 1:
- phi_a0 = (gSaveContext.save.unk_ECC[0] & 0xFF00) >> 8;
+ phi_a0 = (gSaveContext.save.saveInfo.unk_EA8[0] & 0xFF00) >> 8;
break;
case 2:
- phi_a0 = (gSaveContext.save.unk_ECC[0] & 0xFF0000) >> 0x10;
+ phi_a0 = (gSaveContext.save.saveInfo.unk_EA8[0] & 0xFF0000) >> 0x10;
break;
case 3:
- phi_a0 = (gSaveContext.save.unk_ECC[0] & 0xFF000000) >> 0x18;
+ phi_a0 = (gSaveContext.save.saveInfo.unk_EA8[0] & 0xFF000000) >> 0x18;
break;
default:
@@ -711,7 +714,7 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
} else {
switch (phi_v0_2) {
case 0:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
// Skips the entrance cutscene as this flag is attached to `ENTRANCE(WOODFALL_TEMPLE, 1)`
SET_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE_PRISON);
play->nextEntrance = ENTRANCE(WOODFALL_TEMPLE, 1);
@@ -728,7 +731,7 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
break;
case 1:
- SET_WEEKEVENTREG(WEEKEVENTREG_33_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE);
play->nextEntrance = ENTRANCE(MOUNTAIN_VILLAGE_SPRING, 7);
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
@@ -736,14 +739,14 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
break;
case 3:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
play->nextEntrance = ENTRANCE(ZORA_CAPE, 9);
gSaveContext.nextCutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_55_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE);
play->nextEntrance = ENTRANCE(ZORA_CAPE, 8);
gSaveContext.nextCutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -753,7 +756,7 @@ void func_808BA10C(DoorWarp1* this, PlayState* play) {
break;
case 2:
- SET_WEEKEVENTREG(WEEKEVENTREG_52_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE);
play->nextEntrance = ENTRANCE(IKANA_CANYON, 15);
gSaveContext.nextCutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -810,6 +813,9 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
case PLAYER_FORM_HUMAN:
temp_f0 = -25.0f;
break;
+
+ default:
+ break;
}
temp_f2 = this->dyna.actor.world.pos.y + (this->dyna.actor.shape.yOffset * 0.1f) + temp_f0;
@@ -880,7 +886,7 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
void func_808BAAF4(DoorWarp1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 cutscene;
+ s16 csId;
f32 phi_f2;
phi_f2 = 200.0f;
@@ -891,14 +897,14 @@ void func_808BAAF4(DoorWarp1* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_86_80) && (fabsf(this->dyna.actor.xzDistToPlayer) < phi_f2) &&
((player->actor.world.pos.y - 20.0f) < this->dyna.actor.world.pos.y) &&
(this->dyna.actor.world.pos.y < (player->actor.world.pos.y + 20.0f))) {
- cutscene = this->dyna.actor.cutscene;
+ csId = this->dyna.actor.csId;
- if (ActorCutscene_GetCanPlayNext(cutscene)) {
- ActorCutscene_Start(cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->dyna.actor);
SET_WEEKEVENTREG(WEEKEVENTREG_86_80);
DoorWarp1_SetupAction(this, func_808BABF4);
} else {
- ActorCutscene_SetIntentToPlay(cutscene);
+ CutsceneManager_Queue(csId);
}
}
}
@@ -931,7 +937,7 @@ void func_808BACCC(DoorWarp1* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0xFF, 200, 255, 255, (u8)this->unk_1B8);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, (u8)this->unk_1B8);
@@ -969,7 +975,7 @@ void func_808BAE9C(DoorWarp1* this, PlayState* play) {
sp84 = 1.0f - ((2.0f - this->unk_1A4) / 1.7f);
this->unk_1AC += sp84 * 15.0f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255.0f * sp84, 255, 255, (u8)this->unk_1B4);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 255.0f * sp84, 255, 255);
@@ -1059,7 +1065,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
@@ -1076,7 +1082,7 @@ void func_808BB4F4(DoorWarp1* this, PlayState* play2) {
Matrix_RotateYS(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
Matrix_Scale(1.0f, 0.0f, 1.0f, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, sp64[sp60].r, sp64[sp60].g, sp64[sp60].b, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->unk_203);
diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
index 076999e57..de67845ed 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
@@ -13,15 +13,15 @@ typedef void (*DoorWarp1ActionFunc)(struct DoorWarp1*, PlayState*);
#define DOORWARP1_GET_FF00_2(thisx) ((thisx)->params & 0xFF00)
#define DOORWARP1_GET_FF00_3(thisx) ((thisx)->params >> 8)
-enum {
+typedef enum {
/* 0 */ ENDOORWARP1_FF_0,
/* 1 */ ENDOORWARP1_FF_1,
/* 2 */ ENDOORWARP1_FF_2,
/* 3 */ ENDOORWARP1_FF_3,
/* 4 */ ENDOORWARP1_FF_4,
/* 5 */ ENDOORWARP1_FF_5,
- /* 6 */ ENDOORWARP1_FF_6,
-};
+ /* 6 */ ENDOORWARP1_FF_6
+} DoorWarp1Param;
typedef struct DoorWarp1 {
/* 0x000 */ DynaPolyActor dyna;
@@ -53,7 +53,7 @@ typedef struct DoorWarp1 {
/* 0x202 */ u8 unk_202;
/* 0x203 */ u8 unk_203;
/* 0x204 */ f32 unk_204;
- /* 0x208 */ u8 unk_208;
+ /* 0x208 */ u8 cueId;
} DoorWarp1; // size = 0x20C
#endif // Z_DOOR_WARP1_H
diff --git a/src/overlays/actors/ovl_Eff_Change/z_eff_change.c b/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
index 9174fafc0..bc95d4312 100644
--- a/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
+++ b/src/overlays/actors/ovl_Eff_Change/z_eff_change.c
@@ -56,7 +56,7 @@ void EffChange_Init(Actor* thisx, PlayState* play) {
this->step = 0;
this->actor.shape.rot.y = 0;
this->skeletonInfo.frameCtrl.unk_C = (2.0f / 3.0f);
- ActorCutscene_SetIntentToPlay(0x7B);
+ CutsceneManager_Queue(CS_ID_GLOBAL_ELEGY);
}
void EffChange_Destroy(Actor* thisx, PlayState* play) {
@@ -80,7 +80,7 @@ void func_80A4C5CC(EffChange* this, PlayState* play) {
if (func_80183DE0(&this->skeletonInfo)) {
Actor_Kill(&this->actor);
- ActorCutscene_Stop(0x7B);
+ CutsceneManager_Stop(CS_ID_GLOBAL_ELEGY);
func_800FD2B4(play, 0.0f, 850.0f, 0.2f, 0.0f);
return;
}
@@ -109,11 +109,11 @@ void func_80A4C5CC(EffChange* this, PlayState* play) {
phi_fv0 = 0.0f;
}
func_800FD2B4(play, phi_fv0, 850.0f, 0.2f, 0.0f);
- if (ActorCutscene_GetCurrentIndex() != 0x7B) {
- if (ActorCutscene_GetCanPlayNext(0x7B)) {
- ActorCutscene_Start(0x7B, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_GLOBAL_ELEGY) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_ELEGY)) {
+ CutsceneManager_Start(CS_ID_GLOBAL_ELEGY, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(0x7B);
+ CutsceneManager_Queue(CS_ID_GLOBAL_ELEGY);
}
}
}
@@ -133,7 +133,7 @@ void EffChange_Draw(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
index 2833477e4..742b3bb70 100644
--- a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
+++ b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
@@ -63,6 +63,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dz = 1.0f;
this->scalingFactor = 0.2f;
break;
+
case EFF_DUST_TYPE_1:
this->actionFunc = func_80918FE4;
this->actor.draw = func_80919768;
@@ -71,6 +72,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dz = 0.8f;
this->scalingFactor = 0.5f;
break;
+
case EFF_DUST_TYPE_SPIN_ATTACK_CHARGE:
case EFF_DUST_TYPE_3:
this->actionFunc = func_80919230;
@@ -79,6 +81,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 15.0f;
break;
+
case EFF_DUST_TYPE_4:
this->actionFunc = func_80919230;
this->actor.draw = func_809199FC;
@@ -86,6 +89,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 10.0f;
break;
+
case EFF_DUST_TYPE_5:
this->actionFunc = func_80919230;
this->actor.draw = func_809199FC;
@@ -93,6 +97,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 20.0f;
break;
+
default:
SystemArena_Free(this);
break;
@@ -105,7 +110,7 @@ void EffDust_Destroy(Actor* thisx, PlayState* play) {
void func_80918D64(EffDust* this, PlayState* play) {
s16 theta;
- s16 fi;
+ s16 phi;
s32 i;
s32 j;
f32* distanceTraveled = this->distanceTraveled;
@@ -122,10 +127,10 @@ void func_80918D64(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
// Spherical coordinate system.
- fi = randPlusMinusPoint5Scaled(0x10000);
+ phi = Rand_CenteredFloat(0x10000);
theta = Rand_ZeroFloat(0x1000);
- this->initialPositions[i].x = -(f32)this->actor.home.rot.z * Math_CosS(fi) * Math_CosS(theta);
- this->initialPositions[i].y = -(f32)this->actor.home.rot.z * Math_SinS(fi) * Math_CosS(theta);
+ this->initialPositions[i].x = -(f32)this->actor.home.rot.z * Math_CosS(phi) * Math_CosS(theta);
+ this->initialPositions[i].y = -(f32)this->actor.home.rot.z * Math_SinS(phi) * Math_CosS(theta);
this->initialPositions[i].z = -(f32)this->actor.home.rot.z * Math_SinS(theta);
this->distanceTraveled[i] = 0.0f;
this->index++;
@@ -136,7 +141,7 @@ void func_80918D64(EffDust* this, PlayState* play) {
void func_80918FE4(EffDust* this, PlayState* play) {
s16 theta;
- s16 fi;
+ s16 phi;
f32* distanceTraveled = this->distanceTraveled;
s32 i;
s32 j;
@@ -152,11 +157,11 @@ void func_80918FE4(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
// Spherical coordinate system.
- fi = randPlusMinusPoint5Scaled(0x10000);
+ phi = Rand_CenteredFloat(0x10000);
theta = Rand_ZeroFloat(0x2000);
- this->initialPositions[i].x = 400.0f * Math_CosS(fi) * Math_CosS(theta);
+ this->initialPositions[i].x = 400.0f * Math_CosS(phi) * Math_CosS(theta);
this->initialPositions[i].y = 400.0f * Math_SinS(theta);
- this->initialPositions[i].z = 400.0f * Math_SinS(fi) * Math_CosS(theta);
+ this->initialPositions[i].z = 400.0f * Math_SinS(phi) * Math_CosS(theta);
this->distanceTraveled[i] = 0.0f;
this->index++;
}
@@ -171,7 +176,7 @@ void func_80919230(EffDust* this, PlayState* play) {
s32 i;
s32 j;
- if (parent == NULL || parent->update == NULL || !(player->stateFlags1 & PLAYER_STATE1_1000)) {
+ if ((parent == NULL) || (parent->update == NULL) || !(player->stateFlags1 & PLAYER_STATE1_1000)) {
if (this->life != 0) {
this->life--;
} else {
@@ -201,7 +206,7 @@ void func_80919230(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
- theta = randPlusMinusPoint5Scaled(0x10000);
+ theta = Rand_CenteredFloat(0x10000);
switch (this->actor.params) {
case EFF_DUST_TYPE_SPIN_ATTACK_CHARGE:
this->initialPositions[i].x = (Rand_ZeroOne() * 4500.0f) + 700.0f;
@@ -235,6 +240,9 @@ void func_80919230(EffDust* this, PlayState* play) {
this->initialPositions[i].z = 4000.0f * Math_CosS(theta);
}
break;
+
+ default:
+ break;
}
this->distanceTraveled[i] = 0.0f;
@@ -268,7 +276,8 @@ void func_80919768(Actor* thisx, PlayState* play2) {
sp92 = Math_Vec3f_Yaw(&activeCamEye, &thisx->world.pos);
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
@@ -318,7 +327,8 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
Player* player = GET_PLAYER(play);
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
+
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
@@ -326,7 +336,7 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
distanceTraveled = this->distanceTraveled;
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- if (player->unk_B08[0] >= 0.85f) {
+ if (player->unk_B08 >= 0.85f) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 0);
@@ -339,7 +349,7 @@ void func_809199FC(Actor* thisx, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (*distanceTraveled * 255.0f));
aux = 1.0f - SQ(*distanceTraveled);
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
Matrix_Translate(initialPositions->x * ((this->dx * aux) + (1.0f - this->dx)),
(initialPositions->y * (1.0f - *distanceTraveled)) + 320.0f,
(initialPositions->z * (1.0f - *distanceTraveled)) + -20.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
index 38b724865..20a1df27e 100644
--- a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
+++ b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
@@ -22,12 +22,12 @@ typedef struct EffDust {
} EffDust; // size = 0x560
typedef enum {
- /* 0x0 */ EFF_DUST_TYPE_0,
- /* 0x1 */ EFF_DUST_TYPE_1,
- /* 0x2 */ EFF_DUST_TYPE_SPIN_ATTACK_CHARGE,
- /* 0x3 */ EFF_DUST_TYPE_3,
- /* 0x4 */ EFF_DUST_TYPE_4,
- /* 0x5 */ EFF_DUST_TYPE_5
+ /* 0 */ EFF_DUST_TYPE_0,
+ /* 1 */ EFF_DUST_TYPE_1,
+ /* 2 */ EFF_DUST_TYPE_SPIN_ATTACK_CHARGE,
+ /* 3 */ EFF_DUST_TYPE_3,
+ /* 4 */ EFF_DUST_TYPE_4,
+ /* 5 */ EFF_DUST_TYPE_5
} EffDustType;
#endif // Z_EFF_DUST_H
diff --git a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
index 0ebb5139d..9b5290907 100644
--- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
+++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c
@@ -4,7 +4,6 @@
* Description: Wave Created by Turtle Awakening
*/
-#include "prevent_bss_reordering.h"
#include "z_eff_kamejima_wave.h"
#include "objects/object_kamejima/object_kamejima.h"
@@ -50,7 +49,7 @@ void EffKamejimaWave_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.2f);
this->actor.scale.y = 0.0f;
- if (EFFKAMEJIMAWAVE_GET_F(thisx) == EFFKAMEJIMAWAVE_PARAMS_1) {
+ if (EFFKAMEJIMAWAVE_GET_F(thisx) == EFFKAMEJIMAWAVE_PARAM_1) {
this->actionFunc = func_80BCEDE0;
sVtxAlpha = 255;
} else {
@@ -82,9 +81,9 @@ void func_80BCEBC0(EffKamejimaWave* this, PlayState* play) {
}
void func_80BCEC6C(EffKamejimaWave* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x1E0)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 0x1E0));
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x1E0)]->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_480)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_480));
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_480)]->id == 2) {
this->scaleOffset = 0.05f;
this->actionFunc = func_80BCEBC0;
this->actor.draw = EffKamejimaWave_Draw;
@@ -117,9 +116,9 @@ void func_80BCED34(EffKamejimaWave* this, PlayState* play) {
}
void func_80BCEDE0(EffKamejimaWave* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x1F6)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 0x1F6));
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x1F6)]->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_502)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_502));
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_502)]->id == 2) {
this->scaleOffset = 0.03f;
this->actor.scale.x = 0.35f;
this->actionFunc = func_80BCED34;
@@ -160,7 +159,7 @@ void EffKamejimaWave_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(6.0f, 5.0f, 5.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
AnimatedMat_Draw(play, D_80BCF1C4);
diff --git a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
index c79537363..de5567ff0 100644
--- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
+++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
@@ -16,9 +16,9 @@ typedef struct EffKamejimaWave {
/* 0x14C */ EffKamejimaWaveActionFunc actionFunc;
} EffKamejimaWave; // size = 0x150
-typedef enum params {
- /* 0x0 */ EFFKAMEJIMAWAVE_PARAMS_0,
- /* 0x1 */ EFFKAMEJIMAWAVE_PARAMS_1
-} EffKamejimaWaveParams;
+typedef enum EffKamejimaWaveParam {
+ /* 0 */ EFFKAMEJIMAWAVE_PARAM_0,
+ /* 1 */ EFFKAMEJIMAWAVE_PARAM_1
+} EffKamejimaWaveParam;
#endif // Z_EFF_KAMEJIMA_WAVE_H
diff --git a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
index 015e9e715..8ec3ac959 100644
--- a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
+++ b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
@@ -22,10 +22,10 @@ void func_80BEBEB8(EffLastday* this, PlayState* play);
void func_80BEBF78(EffLastday* this, PlayState* play);
typedef enum EffLastDayAction {
- /* 0x0 */ EFFLASTDAY_ACTION_NONE,
- /* 0x1 */ EFFLASTDAY_ACTION_1,
- /* 0x2 */ EFFLASTDAY_ACTION_2,
- /* 0x3 */ EFFLASTDAY_ACTION_3
+ /* 0 */ EFFLASTDAY_ACTION_NONE,
+ /* 1 */ EFFLASTDAY_ACTION_1,
+ /* 2 */ EFFLASTDAY_ACTION_2,
+ /* 3 */ EFFLASTDAY_ACTION_3
} EffLastDayAction;
ActorInit Eff_Lastday_InitVars = {
@@ -46,26 +46,26 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.1f);
switch (EFFLASTDAY_GET_F(&this->actor)) {
- case EFFLASTDAY_PARAMS_1:
+ case EFFLASTDAY_PARAM_1:
this->dList = object_lastday_DL_000510;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000608);
- this->csActionCmd = 0x1FC;
+ this->cueType = CS_CMD_ACTOR_CUE_508;
this->actionFunc = func_80BEBDF8;
Actor_SetScale(&this->actor, 1.0f);
break;
- case EFFLASTDAY_PARAMS_2:
+ case EFFLASTDAY_PARAM_2:
this->dList = object_lastday_DL_000210;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000308);
- this->csActionCmd = 0x1FD;
+ this->cueType = CS_CMD_ACTOR_CUE_509;
this->actionFunc = func_80BEBEB8;
Actor_SetScale(&this->actor, 0.5f);
break;
- case EFFLASTDAY_PARAMS_3:
+ case EFFLASTDAY_PARAM_3:
this->dList = object_lastday_DL_000060;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000148);
- this->csActionCmd = 0x1FE;
+ this->cueType = CS_CMD_ACTOR_CUE_510;
this->actionFunc = func_80BEBF78;
Actor_SetScale(&this->actor, 0.2f);
this->actor.home.rot.z = 0;
@@ -74,18 +74,18 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
default:
this->dList = object_lastday_DL_000370;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000448);
- this->csActionCmd = 0x1FB;
+ this->cueType = CS_CMD_ACTOR_CUE_507;
this->actionFunc = func_80BEBD0C;
Actor_SetScale(&this->actor, 1.0f);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_1);
+ EFFLASTDAY_PARAM_1);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_2);
+ EFFLASTDAY_PARAM_2);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_3);
+ EFFLASTDAY_PARAM_3);
break;
}
}
@@ -94,12 +94,12 @@ void EffLastday_Destroy(Actor* thisx, PlayState* play) {
}
void func_80BEBD0C(EffLastday* this, PlayState* play) {
- u16 csAction;
+ u16 cueId;
- if ((Cutscene_CheckActorAction(play, this->csActionCmd))) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csActionCmd));
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionCmd)]->action;
- switch (csAction) {
+ if ((Cutscene_IsCueInChannel(play, this->cueType))) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ switch (cueId) {
default:
this->actor.draw = NULL;
this->alpha = 0;
@@ -128,12 +128,12 @@ void func_80BEBD0C(EffLastday* this, PlayState* play) {
}
void func_80BEBDF8(EffLastday* this, PlayState* play) {
- u16 csAction;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->csActionCmd)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csActionCmd));
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionCmd)]->action;
- switch (csAction) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ switch (cueId) {
default:
this->actor.draw = NULL;
this->step = 0;
@@ -154,12 +154,12 @@ void func_80BEBDF8(EffLastday* this, PlayState* play) {
}
void func_80BEBEB8(EffLastday* this, PlayState* play) {
- u16 csAction;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->csActionCmd)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csActionCmd));
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionCmd)]->action;
- switch (csAction) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ switch (cueId) {
default:
this->actor.draw = NULL;
this->step = 0;
@@ -180,12 +180,12 @@ void func_80BEBEB8(EffLastday* this, PlayState* play) {
}
void func_80BEBF78(EffLastday* this, PlayState* play) {
- u16 csAction;
+ u16 cueId;
- if (Cutscene_CheckActorAction(play, this->csActionCmd)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csActionCmd));
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionCmd)]->action;
- switch (csAction) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ switch (cueId) {
default:
this->actor.draw = NULL;
this->alpha = 0;
@@ -238,10 +238,10 @@ void EffLastday_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
switch (EFFLASTDAY_GET_F(thisx)) {
- case EFFLASTDAY_PARAMS_1:
- case EFFLASTDAY_PARAMS_2:
+ case EFFLASTDAY_PARAM_1:
+ case EFFLASTDAY_PARAM_2:
break;
- case EFFLASTDAY_PARAMS_3:
+ case EFFLASTDAY_PARAM_3:
EffLastday_SetVtxAlpha(this->alpha);
break;
default:
diff --git a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
index 89266d744..9d2087ae1 100644
--- a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
+++ b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
@@ -15,15 +15,15 @@ typedef struct EffLastday {
/* 0x148 */ AnimatedMaterial* matAnim;
/* 0x14C */ s16 step;
/* 0x14E */ s16 alpha;
- /* 0x150 */ s16 csActionCmd;
+ /* 0x150 */ s16 cueType;
/* 0x154 */ EffLastdayActionFunc actionFunc;
} EffLastday; // size = 0x158
-typedef enum EffLastDayParams {
- /* 0x0 */ EFFLASTDAY_PARAMS_0,
- /* 0x1 */ EFFLASTDAY_PARAMS_1,
- /* 0x2 */ EFFLASTDAY_PARAMS_2,
- /* 0x3 */ EFFLASTDAY_PARAMS_3
-} EffLastDayParams;
+typedef enum EffLastDayParam {
+ /* 0 */ EFFLASTDAY_PARAM_0,
+ /* 1 */ EFFLASTDAY_PARAM_1,
+ /* 2 */ EFFLASTDAY_PARAM_2,
+ /* 3 */ EFFLASTDAY_PARAM_3
+} EffLastDayParam;
#endif // Z_EFF_LASTDAY_H
diff --git a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
index 4d66cc827..88c604c5e 100644
--- a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
+++ b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
@@ -5,6 +5,7 @@
*/
#include "z_eff_stk.h"
+#include "objects/object_stk2/object_stk2.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -15,7 +16,8 @@ void EffStk_Destroy(Actor* thisx, PlayState* play);
void EffStk_Update(Actor* thisx, PlayState* play);
void EffStk_Draw(Actor* thisx, PlayState* play);
-#if 0
+void func_80BF0DE0(EffStk* this, PlayState* play);
+
ActorInit Eff_Stk_InitVars = {
ACTOR_EFF_STK,
ACTORCAT_ITEMACTION,
@@ -28,16 +30,75 @@ ActorInit Eff_Stk_InitVars = {
(ActorFunc)EffStk_Draw,
};
-#endif
+void EffStk_Init(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
-extern UNK_TYPE D_06009F60;
+ Actor_SetScale(&this->actor, 0.2f);
+ this->actionFunc = func_80BF0DE0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Init.s")
+void EffStk_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Destroy.s")
+void func_80BF0DE0(EffStk* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_512)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_512)]->id) {
+ case 2:
+ this->actor.draw = EffStk_Draw;
+ if (this->unk146 < 0x3C00) {
+ this->unk146 += 0x400;
+ this->unk148 = Math_SinS(this->unk146) * -630.0f;
+ }
+ this->unk144++;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/func_80BF0DE0.s")
+ case 3:
+ this->actor.draw = EffStk_Draw;
+ if (this->unk146 < 0x3C00) {
+ this->unk146 += 0x400;
+ this->unk148 = Math_SinS(this->unk146) * -630.0f;
+ }
+ this->unk144--;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Update.s")
+ default:
+ this->actor.draw = NULL;
+ this->unk146 = 0;
+ this->unk148 = 0.0f;
+ break;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Draw.s")
+void EffStk_Update(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EffStk_Draw(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
+ s32 pad;
+ Camera* activeCam = GET_ACTIVE_CAM(play);
+ Vec3f eye = activeCam->eye;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW);
+ Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Translate(0.0f, 0.0f, this->unk148, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ AnimatedMat_DrawAlphaStep(play, Lib_SegmentedToVirtual(object_stk2_Matanimheader_009F60), 1.0f, this->unk144);
+ gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
+ gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
+ gSPDisplayList(POLY_XLU_DISP++, object_stk2_DL_008920);
+ gSPDisplayList(POLY_XLU_DISP++, object_stk2_DL_008A38);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
index 4b2b84783..03b6660d2 100644
--- a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
+++ b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
@@ -9,7 +9,9 @@ typedef void (*EffStkActionFunc)(struct EffStk*, PlayState*);
typedef struct EffStk {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x8];
+ /* 0x144 */ s16 unk144;
+ /* 0x146 */ s16 unk146;
+ /* 0x148 */ f32 unk148;
/* 0x14C */ EffStkActionFunc actionFunc;
} EffStk; // size = 0x150
diff --git a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
index 842ae4b9e..3a57149a7 100644
--- a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
+++ b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c
@@ -43,12 +43,12 @@ void EffZoraband_Destroy(Actor* thisx, PlayState* play) {
}
void EffZoraband_MikauFadeOut(EffZoraband* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x20F)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_527)) {
if ((EFFZORABAND_GET_F(&this->actor) + 2) ==
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x20F)]->action) {
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_527)]->id) {
this->stateFlags |= 2;
}
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x20F)]->action == 7) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_527)]->id == 7) {
this->actor.draw = NULL;
} else {
this->actor.draw = EffZoraband_Draw;
@@ -79,7 +79,7 @@ void EffZoraband_Draw(Actor* thisx, PlayState* play2) {
if (this->alpha != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_zoraband_Matanimheader_000F38));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
index 3d7df7c27..c88835373 100644
--- a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
+++ b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
@@ -111,21 +111,21 @@ void func_8092E284(ElfMsg* this, PlayState* play) {
if ((player->tatlActor != NULL) && ((func_8092E1FC(this)))) {
player->tatlTextId = func_8092E1D0(this);
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
tatl->elfMsg = &this->actor;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
if ((player->tatlTextId < 0) && (this->actor.home.rot.x < 0)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
- ActorCutscene_Stop(0x7D);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
this->actor.home.rot.x = 0;
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_800E0348(play->cameraPtrs[CAM_ID_MAIN]);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
diff --git a/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c b/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
index a29b226b0..8244c7fb6 100644
--- a/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
+++ b/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
@@ -100,9 +100,9 @@ s32 func_8096EE50(ElfMsg2* this) {
void func_8096EE64(ElfMsg2* this, PlayState* play) {
if (Actor_TextboxIsClosing(&this->actor, play)) {
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -115,14 +115,14 @@ void func_8096EE64(ElfMsg2* this, PlayState* play) {
}
ElfMsg2_SetupAction(this, func_8096EF98);
- } else if ((this->actor.cutscene != -1) && (ActorCutscene_GetCurrentIndex() != this->actor.cutscene)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ } else if ((this->actor.csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != this->actor.csId)) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
diff --git a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c
index da6b29180..e3e8b7bc5 100644
--- a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c
+++ b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c
@@ -110,20 +110,20 @@ void func_80A2CF7C(ElfMsg3* this, PlayState* play) {
((player->actor.world.pos.y - this->actor.world.pos.y) < (100.0f * this->actor.scale.y))) &&
(fabsf(player->actor.world.pos.z - this->actor.world.pos.z) < (100.0f * this->actor.scale.z))) {
player->tatlTextId = func_80A2CF50(this);
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
tatl->elfMsg = &this->actor;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
if ((player->tatlTextId < 0) && (this->actor.home.rot.x < 0)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
- ActorCutscene_Stop(0x7D);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_800E0348(play->cameraPtrs[CAM_ID_MAIN]);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
diff --git a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c
index 7fbf402fa..c917f01a7 100644
--- a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c
+++ b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c
@@ -115,20 +115,20 @@ void func_80AFD668(ElfMsg4* this, PlayState* play) {
if ((player->tatlActor != NULL) && func_80AFD5E0(this)) {
player->tatlTextId = ElfMsg4_GetTextId(this);
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
tatl->elfMsg = this->elfMsg5;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
if ((player->tatlTextId < 0) && (this->actor.home.rot.x < 0)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
- ActorCutscene_Stop(0x7D);
- ActorCutscene_SetIntentToPlay((s16)this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext((s16)this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_800E0348(play->cameraPtrs[CAM_ID_MAIN]);
} else {
- ActorCutscene_SetIntentToPlay((s16)this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -139,7 +139,7 @@ void func_80AFD770(ElfMsg4* this, PlayState* play) {
while (bgActor != NULL) {
if ((bgActor->id != ACTOR_ELF_MSG5) || (ELFMSG4_GET_TEXT(&this->actor) != ELFMSG5_GET_FF(bgActor)) ||
- (this->actor.cutscene != bgActor->cutscene)) {
+ (this->actor.csId != bgActor->csId)) {
bgActor = bgActor->next;
} else {
this->elfMsg5 = bgActor;
diff --git a/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.c b/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.c
index 1507da5e2..89fbd9f6b 100644
--- a/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.c
+++ b/src/overlays/actors/ovl_Elf_Msg6/z_elf_msg6.c
@@ -154,15 +154,15 @@ void ElfMsg6_Init(Actor* thisx, PlayState* play) {
case 1:
this->actionFunc = func_80BA1F80;
- if ((this->actor.cutscene == -1) || ((ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) &&
- Flags_GetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor)))) {
+ if ((this->actor.csId == CS_ID_NONE) || ((ELFMSG6_SWITCHFLAG(&this->actor) != 0x7F) &&
+ Flags_GetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor)))) {
Actor_Kill(&this->actor);
return;
}
switch (ELFMSG6_GET_F0(&this->actor)) {
case 0:
- if (gSaveContext.save.inventory.items[ITEM_HOOKSHOT] != ITEM_HOOKSHOT) {
+ if (gSaveContext.save.saveInfo.inventory.items[ITEM_HOOKSHOT] != ITEM_HOOKSHOT) {
Actor_Kill(&this->actor);
return;
}
@@ -246,10 +246,10 @@ void func_80BA1C88(ElfMsg6* this, PlayState* play, s16 arg2) {
if (player->tatlActor != NULL) {
player->tatlTextId = arg2;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
sp20->elfMsg = &this->actor;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
}
}
@@ -280,10 +280,10 @@ void func_80BA1CF8(ElfMsg6* this, PlayState* play) {
this->actor.textId = 0x25B;
} else if (func_80BA1C00(this) && (player->actor.speed > 1.0f)) {
player->tatlTextId = -this->actor.textId;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
sp20->elfMsg = &this->actor;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
}
}
@@ -321,10 +321,10 @@ void func_80BA1E30(ElfMsg6* this, PlayState* play) {
if (func_80BA1C00(this) && (player->actor.speed > 1.0f)) {
player->tatlTextId = -this->actor.textId;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
sp20->elfMsg = &this->actor;
- if (this->actor.cutscene == -1) {
- this->actor.cutscene = 0x7C;
+ if (this->actor.csId == CS_ID_NONE) {
+ this->actor.csId = CS_ID_GLOBAL_TALK;
}
}
}
@@ -336,14 +336,14 @@ void func_80BA1F80(ElfMsg6* this, PlayState* play) {
}
if (func_80BA1C00(this)) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, NULL);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, NULL);
Flags_SetSwitch(play, ELFMSG6_SWITCHFLAG(&this->actor));
Actor_Kill(&this->actor);
return;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_En_Ah/z_en_ah.c b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
index 5ea851023..0a8df4f40 100644
--- a/src/overlays/actors/ovl_En_Ah/z_en_ah.c
+++ b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
@@ -25,7 +25,7 @@ static u8 D_80BD3DB0[] = {
/* 0x08 */ SCHEDULE_CMD_RET_VAL_L(1),
/* 0x0B */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(2, 0x20 - 0x0F),
/* 0x0F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 0, 23, 0, 0x1D - 0x15),
- /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_50_20, 0x1C - 0x19),
+ /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x1C - 0x19),
/* 0x19 */ SCHEDULE_CMD_RET_VAL_L(1),
/* 0x1C */ SCHEDULE_CMD_RET_NONE(),
/* 0x1D */ SCHEDULE_CMD_RET_VAL_L(3),
@@ -557,7 +557,7 @@ void EnAh_Update(Actor* thisx, PlayState* play) {
func_8013C964(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2D8 & 7);
if (!(this->unk_2D8 & 0x10)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
func_80BD2BA4(this, play);
}
@@ -619,7 +619,7 @@ void EnAh_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1DC != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BD3F14[this->unk_2FA]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80BD3F0C[this->unk_2FC]));
diff --git a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
index d22c2d258..6e56cc609 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
@@ -150,7 +150,7 @@ void func_80BECC7C(EnAkindonuts* this, PlayState* play) {
}
if (this->unk_32C & 2) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -179,7 +179,7 @@ s32 func_80BECD10(EnAkindonuts* this, Path* path, s32 arg2) {
phi_f14 = sp5C[idx + 1].z - sp5C[idx - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
}
@@ -232,8 +232,10 @@ s32 func_80BECFBC(EnAkindonuts* this) {
case 3:
Inventory_DeleteItem(ITEM_DEED_OCEAN, SLOT(ITEM_DEED_OCEAN));
return GI_RUPEE_HUGE;
+
+ default:
+ return GI_NONE;
}
- return GI_NONE;
}
s32 func_80BED034(EnAkindonuts* this) {
@@ -249,8 +251,10 @@ s32 func_80BED034(EnAkindonuts* this) {
case 3:
return GI_POTION_BLUE;
+
+ default:
+ return GI_NONE;
}
- return GI_NONE;
}
void func_80BED090(PlayState* play) {
@@ -300,7 +304,7 @@ s32 func_80BED208(EnAkindonuts* this) {
return 0;
}
- if (gSaveContext.save.playerData.rupees < 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
return 1;
}
@@ -322,7 +326,7 @@ s32 func_80BED27C(EnAkindonuts* this) {
return 0;
}
- if (gSaveContext.save.playerData.rupees < 200) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 200) {
return 1;
}
@@ -336,7 +340,7 @@ s32 func_80BED2FC(EnAkindonuts* this) {
return 2;
}
- if (gSaveContext.save.playerData.rupees < 40) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 40) {
return 1;
}
@@ -350,7 +354,7 @@ s32 func_80BED35C(EnAkindonuts* this) {
return 2;
}
- if (gSaveContext.save.playerData.rupees < 100) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 100) {
return 1;
}
@@ -1417,14 +1421,14 @@ void func_80BEF518(EnAkindonuts* this, PlayState* play) {
}
if (this->unk_35E == 0) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_35E = 1;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return;
}
}
@@ -1546,14 +1550,14 @@ void func_80BEFAF0(EnAkindonuts* this, PlayState* play) {
if (func_80BECD10(this, this->path, this->unk_334) && (sp34 < 10.0f)) {
if (this->unk_334 >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->actionFunc = func_80BEFD74;
} else {
this->unk_334++;
}
}
} else if (this->actor.playerHeightRel > 500.0f) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->actionFunc = func_80BEFD74;
}
@@ -1569,17 +1573,17 @@ void func_80BEFAF0(EnAkindonuts* this, PlayState* play) {
func_80BECBE0(this, sp32);
if (this->unk_35E == 2) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_35E = 3;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return;
}
} else if ((this->unk_35E == 1) && (this->unk_356 == 20)) {
- ActorCutscene_Stop(this->cutscene);
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->unk_35E = 2;
}
this->unk_356++;
@@ -1606,7 +1610,7 @@ void EnAkindonuts_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = -1.0f;
if (!ENAKINDONUTS_GET_4(&this->actor)) {
- this->path = SubS_GetPathByIndex(play, ENAKINDONUTS_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENAKINDONUTS_GET_PATH_INDEX(&this->actor), ENAKINDONUTS_PATH_INDEX_NONE);
if (this->path == NULL) {
Actor_Kill(&this->actor);
return;
@@ -1617,7 +1621,7 @@ void EnAkindonuts_Init(Actor* thisx, PlayState* play) {
this->unk_32C |= 0x2;
this->unk_32C |= 0x4;
this->unk_338 = 4;
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
func_80BEE938(this, play);
this->actionFunc = func_80BEEB20;
}
@@ -1705,7 +1709,7 @@ void EnAkindonuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx
void EnAkindonuts_Draw(Actor* thisx, PlayState* play) {
EnAkindonuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnAkindonuts_OverrideLimbDraw, EnAkindonuts_PostLimbDraw,
EnAkindonuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
index 72c932d0c..680fdbb75 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
@@ -10,12 +10,14 @@ typedef void (*EnAkindonutsUnkFunc)(struct EnAkindonuts*, PlayState*);
#define ENAKINDONUTS_GET_3(thisx) ((thisx)->params & 3)
#define ENAKINDONUTS_GET_4(thisx) (((thisx)->params & 4) >> 2)
-#define ENAKINDONUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENAKINDONUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
-enum {
+#define ENAKINDONUTS_PATH_INDEX_NONE 0x3F
+
+typedef enum {
/* 1 */ ENAKINDONUTS_3_1 = 1,
- /* 2 */ ENAKINDONUTS_3_2,
-};
+ /* 2 */ ENAKINDONUTS_3_2
+} EnAkindonutsParam;
typedef struct EnAkindonuts {
/* 0x000 */ Actor actor;
@@ -43,7 +45,7 @@ typedef struct EnAkindonuts {
/* 0x358 */ f32 unk_358;
/* 0x35C */ s16 unk_35C;
/* 0x35E */ s16 unk_35E;
- /* 0x360 */ s16 cutscene;
+ /* 0x360 */ s16 csId;
/* 0x362 */ s16 unk_362;
/* 0x364 */ s16 unk_364;
/* 0x366 */ s8 unk_366;
diff --git a/src/overlays/actors/ovl_En_Al/z_en_al.c b/src/overlays/actors/ovl_En_Al/z_en_al.c
index 443065633..2568d6617 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.c
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.c
@@ -219,30 +219,30 @@ Actor* func_80BDE384(EnAl* this, PlayState* play) {
return actor;
}
-s32 func_80BDE408(EnAl* this, s16 arg1) {
+s32 func_80BDE408(EnAl* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(arg1);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_80BDE484(EnAl* this, s32 arg1) {
- s16 cs = this->actor.cutscene;
+s16 func_80BDE484(EnAl* this, s32 numCutscenes) {
+ s16 csId = this->actor.csId;
s32 i;
- for (i = 0; i < arg1; i++) {
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
- return cs;
+ return csId;
}
s32 func_80BDE4E0(EnAl* this, s16* arg1, s16 arg2) {
@@ -317,13 +317,13 @@ s32 func_80BDE678(EnAl* this, s16* arg1, s16 arg2) {
s32 func_80BDE7FC(EnAl* this, PlayState* play) {
s32 pad;
- s16 sp2A = func_80BDE484(this, 0);
+ s16 csId = func_80BDE484(this, 0);
s32 pad2;
s32 sp20 = false;
switch (this->unk_4E6) {
case 0:
- if (!func_80BDE408(this, sp2A)) {
+ if (!func_80BDE408(this, csId)) {
break;
}
@@ -332,7 +332,8 @@ s32 func_80BDE7FC(EnAl* this, PlayState* play) {
case 6:
case 8:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), this->actor.child);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
+ this->actor.child);
}
this->unk_4E6++;
sp20 = true;
@@ -342,13 +343,13 @@ s32 func_80BDE7FC(EnAl* this, PlayState* play) {
case 3:
case 5:
case 7:
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
this->unk_4E6++;
sp20 = true;
break;
case 9:
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
this->unk_4E6++;
sp20 = true;
break;
@@ -479,10 +480,10 @@ s32 func_80BDEC2C(EnAl* this, PlayState* play) {
if ((this->unk_4C2 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_4C2 &= ~0x1800;
- if (player->exchangeItemId == 0x33) {
+ if (player->exchangeItemId == PLAYER_IA_LETTER_MAMA) {
this->unk_4C2 |= 0x800;
this->unk_4F4 = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
+ } else if (player->exchangeItemId != PLAYER_IA_NONE) {
this->unk_4C2 |= 0x1000;
this->unk_4F4 = player->exchangeItemId;
}
@@ -906,7 +907,7 @@ void EnAl_Draw(Actor* thisx, PlayState* play) {
if (this->unk_35C != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, 850.0f, MTXMODE_APPLY);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnAl_OverrideLimbDraw, EnAl_PostLimbDraw,
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 73d9ffc57..7d1f1e140 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -193,9 +193,9 @@ void EnAm_SpawnEffects(EnAm* this, PlayState* play) {
// Dust Clouds that spawn from the hop
for (i = 4; i > 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(65.0f) + this->actor.world.pos.x;
- effectPos.y = randPlusMinusPoint5Scaled(10.0f) + (this->actor.world.pos.y + 40.0f);
- effectPos.z = randPlusMinusPoint5Scaled(65.0f) + this->actor.world.pos.z;
+ effectPos.x = Rand_CenteredFloat(65.0f) + this->actor.world.pos.x;
+ effectPos.y = Rand_CenteredFloat(10.0f) + (this->actor.world.pos.y + 40.0f);
+ effectPos.z = Rand_CenteredFloat(65.0f) + this->actor.world.pos.z;
EffectSsKirakira_SpawnSmall(play, &effectPos, &sVelocity, &sAccel, &D_808B1118, &D_808B111C);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_WALK);
@@ -254,7 +254,7 @@ void EnAm_ApplyEnemyTexture(EnAm* this, PlayState* play) {
func_808B0358(this);
} else {
tempTextureBlend = this->textureBlend + 20;
- rand = randPlusMinusPoint5Scaled(10.0f);
+ rand = Rand_CenteredFloat(10.0f);
cos = Math_CosS(this->actor.shape.rot.y) * rand;
sin = Math_SinS(this->actor.shape.rot.y) * rand;
this->actor.world.pos.x = this->actor.home.pos.x + cos;
@@ -422,8 +422,9 @@ void func_808B0894(EnAm* this, PlayState* play) {
this->armosYaw = this->actor.yawTowardsPlayer;
func_808B0208(this, play);
if (this->explodeTimer == 1) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 2, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 2, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
}
@@ -432,7 +433,7 @@ void func_808B0894(EnAm* this, PlayState* play) {
for (i = 0; i < 8; i++) {
dustPos.x = (Math_SinS(0) * 7.0f) + this->actor.world.pos.x;
- dustPos.y = (randPlusMinusPoint5Scaled(10.0f) * 6.0f) + (this->actor.world.pos.y + 40.0f);
+ dustPos.y = (Rand_CenteredFloat(10.0f) * 6.0f) + (this->actor.world.pos.y + 40.0f);
dustPos.z = (Math_CosS(0) * 7.0f) + this->actor.world.pos.z;
func_800B0EB0(play, &dustPos, &gZeroVec3f, &gZeroVec3f, &D_808B1120, &D_808B1124, 200, 45, 12);
@@ -509,7 +510,9 @@ void EnAm_Update(Actor* thisx, PlayState* play) {
}
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 100.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetFocus(&this->actor, 64.0f);
Collider_UpdateCylinder(&this->actor, &this->enemyCollider);
Collider_UpdateCylinder(&this->actor, &this->interactCollider);
@@ -561,13 +564,15 @@ void EnAm_Draw(Actor* thisx, PlayState* play) {
EnAm* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 0, 0, 0, this->textureBlend);
POLY_OPA_DISP = &gfx[2];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, EnAm_PostLimbDraw,
&this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale, 0.0f,
this->drawDmgEffAlpha, ACTOR_DRAW_DMGEFF_LIGHT_ORBS);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_And/z_en_and.c b/src/overlays/actors/ovl_En_And/z_en_and.c
index 5c888ba45..d3c9adcec 100644
--- a/src/overlays/actors/ovl_En_And/z_en_and.c
+++ b/src/overlays/actors/ovl_En_And/z_en_and.c
@@ -10,14 +10,13 @@
#define THIS ((EnAnd*)thisx)
+#define EYE_TEXTURES_COUNT 4
+
void EnAnd_Init(Actor* thisx, PlayState* play);
void EnAnd_Destroy(Actor* thisx, PlayState* play);
void EnAnd_Update(Actor* thisx, PlayState* play);
void EnAnd_Draw(Actor* thisx, PlayState* play);
-void func_80C18C50(EnAnd* this, PlayState* play);
-
-#if 0
ActorInit En_And_InitVars = {
ACTOR_EN_AND,
ACTORCAT_NPC,
@@ -30,22 +29,163 @@ ActorInit En_And_InitVars = {
(ActorFunc)EnAnd_Draw,
};
-#endif
+static AnimationInfoS sAnimationInfo[] = {
+ { &gAndStaticAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaiseHeadAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gAndRaisedHeadLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaiseHandAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gAndRaisedHandLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gAndRaisedHandWalkAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+};
-extern UNK_TYPE D_0600B380;
+s32 EnAnd_ChangeAnim(EnAnd* this, s32 animIndex) {
+ s32 ret = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18B90.s")
+ if (this->animIndex != animIndex) {
+ this->animIndex = animIndex;
+ ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ }
+ return ret;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18BD8.s")
+void EnAnd_Blink(EnAnd* this) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= EYE_TEXTURES_COUNT) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = 0;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18C50.s")
+void EnAnd_HandleCutscene(EnAnd* this, PlayState* play) {
+ s32 csAnimations[] = { 0, 1, 2, 3, 5, 7 };
+ u16 cueType;
+ s32 cueChannel;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Init.s")
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (!this->isCutscenePlaying) {
+ // Cutscene is starting
+ this->cueId = 255;
+ this->isCutscenePlaying = true;
+ this->prevAnimIndex = this->animIndex;
+ }
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_565)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_565);
+ cueType = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueType) {
+ this->cueId = cueType;
+ EnAnd_ChangeAnim(this, csAnimations[cueType]);
+ }
+ switch (this->cueId) {
+ case 3:
+ case 4:
+ if ((this->animIndex == 3) || (this->animIndex == 5)) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnAnd_ChangeAnim(this, this->animIndex + 1);
+ }
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Destroy.s")
+ default:
+ break;
+ }
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
+ }
+ } else if (this->isCutscenePlaying) {
+ this->isCutscenePlaying = false;
+ EnAnd_ChangeAnim(this, this->prevAnimIndex);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Update.s")
+void EnAnd_Init(Actor* thisx, PlayState* play) {
+ EnAnd* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/func_80C18ED0.s")
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 14.0f);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gAndSkel, NULL, this->jointTable, this->morphTable,
+ OBJECT_AND_LIMB_MAX);
+ this->animIndex = -1;
+ EnAnd_ChangeAnim(this, 0);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->flags |= 8;
+ this->actionFunc = EnAnd_HandleCutscene;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_And/EnAnd_Draw.s")
+void EnAnd_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void EnAnd_Update(Actor* thisx, PlayState* play) {
+ EnAnd* this = THIS;
+
+ this->actionFunc(this, play);
+ SkelAnime_Update(&this->skelAnime);
+ EnAnd_Blink(this);
+}
+
+void EnAnd_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
+ EnAnd* this = THIS;
+ s32 stepRot;
+ s32 overrideRot;
+
+ stepRot = this->flags & 8 ? false : true;
+ overrideRot = this->flags & 2 ? true : false;
+ if (!stepRot) {
+ overrideRot = false;
+ }
+
+ switch (limbIndex) {
+ case OBJECT_AND_LIMB_HEAD:
+ SubS_UpdateLimb(this->headRotZ + this->torsoRotZ + 0x4000,
+ this->headRotY + this->torsoRotY + this->actor.shape.rot.y + 0x4000, &this->headComputedPos,
+ &this->headComputedRot, stepRot, overrideRot);
+ Matrix_Pop();
+ Matrix_Translate(this->headComputedPos.x, this->headComputedPos.y, this->headComputedPos.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headComputedRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headComputedRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headComputedRot.z, MTXMODE_APPLY);
+ Matrix_Push();
+ break;
+
+ case OBJECT_AND_LIMB_TORSO:
+ SubS_UpdateLimb(this->torsoRotZ + 0x4000, this->torsoRotY + this->actor.shape.rot.y + 0x4000,
+ &this->torsoComputedPos, &this->torsoComputedRot, stepRot, overrideRot);
+ Matrix_Pop();
+ Matrix_Translate(this->torsoComputedPos.x, this->torsoComputedPos.y, this->torsoComputedPos.z, MTXMODE_NEW);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->torsoComputedRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->torsoComputedRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->torsoComputedRot.z, MTXMODE_APPLY);
+ Matrix_Push();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void EnAnd_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sMouthTextures[] = { gAndMouthNeutralTex, gAndMouthSmileTex };
+ static TexturePtr sEyeTextures[EYE_TEXTURES_COUNT] = {
+ gAndEyeOpenTex,
+ gAndEyeClosingTex,
+ gAndEyeClosedTex,
+ gAndEyeOpeningTex,
+ };
+ EnAnd* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[0]));
+
+ SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ this->skelAnime.dListCount, NULL, NULL, EnAnd_TransformLimbDraw, &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_And/z_en_and.h b/src/overlays/actors/ovl_En_And/z_en_and.h
index a0610a408..6b5a0bb7d 100644
--- a/src/overlays/actors/ovl_En_And/z_en_and.h
+++ b/src/overlays/actors/ovl_En_And/z_en_and.h
@@ -2,6 +2,7 @@
#define Z_EN_AND_H
#include "global.h"
+#include "objects/object_and/object_and.h"
struct EnAnd;
@@ -9,9 +10,29 @@ typedef void (*EnAndActionFunc)(struct EnAnd*, PlayState*);
typedef struct EnAnd {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x44];
+ /* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnAndActionFunc actionFunc;
- /* 0x18C */ char unk_18C[0x188];
+ /* 0x18C */ u8 cueId;
+ /* 0x18D */ UNK_TYPE1 pad18D[0x7];
+ /* 0x194 */ Vec3f headComputedPos;
+ /* 0x1A0 */ Vec3f torsoComputedPos;
+ /* 0x1AC */ Vec3s headComputedRot;
+ /* 0x1B2 */ Vec3s torsoComputedRot;
+ /* 0x1B8 */ Vec3s jointTable[OBJECT_AND_LIMB_MAX];
+ /* 0x254 */ Vec3s morphTable[OBJECT_AND_LIMB_MAX];
+ /* 0x2F0 */ u16 flags;
+ /* 0x2F2 */ UNK_TYPE1 pad2F2[0x4];
+ /* 0x2F6 */ s16 headRotZ;
+ /* 0x2F8 */ s16 headRotY;
+ /* 0x2FA */ s16 torsoRotZ;
+ /* 0x2FC */ s16 torsoRotY;
+ /* 0x2FE */ UNK_TYPE1 pad2FE[0x2];
+ /* 0x300 */ s16 blinkTimer;
+ /* 0x302 */ s16 eyeTexIndex;
+ /* 0x304 */ s32 animIndex;
+ /* 0x308 */ s32 prevAnimIndex;
+ /* 0x30C */ s32 isCutscenePlaying;
+ /* 0x310 */ UNK_TYPE1 pad310[4];
} EnAnd; // size = 0x314
#endif // Z_EN_AND_H
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
index b2a6456bc..90d31b601 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -220,10 +220,10 @@ void EnAni_FallToGround(EnAni* this, PlayState* play) {
Animation_Change(&this->skelAnime, &gAniLandingThenStandingUpAnim, 1.0f, 0.0f, 16.0f, ANIMMODE_ONCE, 0.0f);
this->stateFlags |= ANI_STATE_WRITHING;
- quakeIndex = Quake_Add(play->cameraPtrs[CAM_ID_MAIN], QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(play->cameraPtrs[CAM_ID_MAIN], QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 27000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
Actor_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT);
}
@@ -291,7 +291,7 @@ void EnAni_Update(Actor* thisx, PlayState* play) {
}
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
if (this->actor.xzDistToPlayer < 100.0f && !(this->stateFlags & ANI_STATE_CLIMBING)) {
Actor_TrackPlayer(play, &this->actor, &this->headRot, &this->chestRot, this->actor.focus.pos);
@@ -305,15 +305,15 @@ void EnAni_Update(Actor* thisx, PlayState* play) {
this->blinkFunc(this);
if (this->stateFlags & ANI_STATE_FALLING) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->stateFlags &= ~ANI_STATE_FALLING;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
- this->actor.cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- Camera_SetToTrackActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(this->actor.cutscene)),
- &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->actor.csId)),
+ &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -345,7 +345,7 @@ void EnAni_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, -1000.0f, MTXMODE_APPLY);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.h b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
index fcced964b..d0f2e6a12 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.h
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
@@ -28,10 +28,10 @@ typedef struct EnAni {
/* 0x2FC */ EnAniActionFunc actionFunc;
} EnAni; // size = 0x300
-enum EnAniType {
- /* else */ ANI_TYPE_STANDING, // unfinshed and unused
- /* 1 */ ANI_TYPE_TREE_HANGING = 1,
-};
+typedef enum EnAniType {
+ /* 1 */ ANI_TYPE_TREE_HANGING = 1,
+ /* 2 */ ANI_TYPE_STANDING // unfinshed and unused. Never read as 2, only taken as the "else" case from `ANI_TYPE_TREE_HANGING`
+} EnAniType;
#define ANI_GET_TYPE(thisx) ((thisx)->params & 0xFF)
diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
index 97bc517c9..dcd380256 100644
--- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
+++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c
@@ -12,27 +12,25 @@
#define THIS ((EnAob01*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnAob01_Init(Actor* thisx, PlayState* play);
void EnAob01_Destroy(Actor* thisx, PlayState* play);
void EnAob01_Update(Actor* thisx, PlayState* play);
void EnAob01_Draw(Actor* thisx, PlayState* play);
-void func_809C1C9C(EnAob01* this, PlayState* play);
-void func_809C1D64(EnAob01* this, PlayState* play);
-void func_809C2060(EnAob01* this, PlayState* play);
-void func_809C21E0(EnAob01* this, PlayState* play);
-void func_809C26E4(EnAob01* this, PlayState* play);
-void func_809C2730(EnAob01* this, PlayState* play);
-void func_809C2788(EnAob01* this, PlayState* play);
-void func_809C2824(EnAob01* this, PlayState* play);
-void func_809C28B8(EnAob01* this, PlayState* play);
-void func_809C2A64(EnAob01* this, PlayState* play);
-void func_809C2BE4(EnAob01* this, PlayState* play);
-void func_809C2C9C(EnAob01* this, PlayState* play);
-void func_809C2D0C(EnAob01* this, PlayState* play);
-s32 func_809C2EC4(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_StartRace(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_RespondToPlayAgainQuestion(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_Idle(EnAob01* this, PlayState* play);
+void EnAob01_BeforeRace_Talk(EnAob01* this, PlayState* play);
+void EnAob01_Race_SkipNonRaceCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_HandleRaceCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_HandleRaceEndCutscene(EnAob01* this, PlayState* play);
+void EnAob01_Race_StartCutscene(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_GiveRaceResult(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_GiveReward(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_AfterGivingReward(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_AskToPlayAgain(EnAob01* this, PlayState* play);
+void EnAob01_AfterRace_Talk(EnAob01* this, PlayState* play);
+s32 EnAob01_PlayerIsHoldingDog(EnAob01* this, PlayState* play);
ActorInit En_Aob_01_InitVars = {
ACTOR_EN_AOB_01,
@@ -46,6 +44,22 @@ ActorInit En_Aob_01_InitVars = {
(ActorFunc)EnAob01_Draw,
};
+typedef enum {
+ /* 0 */ EN_AOB01_ANIM_IDLE_1,
+ /* 1 */ EN_AOB01_ANIM_LAUGH_START,
+ /* 2 */ EN_AOB01_ANIM_LAUGH_LOOP,
+ /* 3 */ EN_AOB01_ANIM_SURPRISE_START,
+ /* 4 */ EN_AOB01_ANIM_SURPRISE_LOOP,
+ /* 5 */ EN_AOB01_ANIM_IDLE_2
+} EnAob01Animation;
+
+typedef enum {
+ /* 0 */ EN_AOB01_EYE_OPEN,
+ /* 1 */ EN_AOB01_EYE_HALF,
+ /* 2 */ EN_AOB01_EYE_CLOSED,
+ /* 3 */ EN_AOB01_EYE_MAX
+} EnAob01EyeTexture;
+
static AnimationInfo sAnimationInfo[] = {
{ &gMamamuYanIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
{ &gMamamuYanLaughStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f },
@@ -76,12 +90,16 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- Vec3f unk_00;
- s16 unk_04;
- s16 unk_06;
-} EnAobStruct;
+ /* 0x0 */ Vec3f pos;
+ /* 0xC */ s16 rotY;
+ /* 0xE */ s16 pathIndex;
+} DogInfo; // size = 0x10
-static EnAobStruct D_809C384C[] = {
+/**
+ * Stores the starting position, y-rotation, and path index for all 14 dogs in the racetrack.
+ * This actor is responsible for spawning these dogs; they are not spawned as part of the scene.
+ */
+static DogInfo sDogInfo[RACEDOG_COUNT] = {
{ { -4130.0f, 150.0f, 1367.0f }, 84, 0 }, { { -4861.0f, 172.0f, 1606.0f }, 94, 4 },
{ { -4139.0f, 155.0f, 2133.0f }, 73, 6 }, { { -4406.0f, 144.0f, 1416.0f }, 88, 2 },
{ { -4156.0f, 155.0f, 1731.0f }, 42, 0 }, { { -4033.0f, 157.0f, 1994.0f }, -65, 1 },
@@ -91,105 +109,137 @@ static EnAobStruct D_809C384C[] = {
{ { -4827.0f, 168.0f, 1328.0f }, 115, 4 }, { { -4130.0f, 150.0f, 1367.0f }, 112, 0 },
};
-void func_809C10B0(EnAob01* this, s32 arg1) {
+void EnAob01_Blink(EnAob01* this, s32 maxEyeIndex) {
if (DECR(this->blinkTimer) == 0) {
this->eyeIndex++;
- if (this->eyeIndex >= arg1) {
- this->eyeIndex = 0;
+ if (this->eyeIndex >= maxEyeIndex) {
+ this->eyeIndex = EN_AOB01_EYE_OPEN;
this->blinkTimer = Rand_S16Offset(30, 30);
}
}
}
-void func_809C1124(void) {
+/**
+ * Called every frame during the race in order to make in-game time pass.
+ */
+void EnAob01_AdvanceTime(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
-void func_809C1158(EnAob01* this, PlayState* play) {
- s32 temp_s0 = ENAOB01_GET_7E00_2(&this->actor);
+/**
+ * Initializes all the paths that the dogs follow.
+ */
+void EnAob01_InitializeDogPaths(EnAob01* this, PlayState* play) {
+ s32 pathIndex = ENAOB01_GET_STARTING_DOG_PATH_INDEX(&this->actor);
s16 i = 0;
- if (temp_s0 != 0x3F) {
+ if (pathIndex != ENAOB01_PATH_INDEX_NONE) {
do {
- this->unk_1D8[i] = SubS_GetPathByIndex(play, temp_s0, 0x3F);
- temp_s0 = this->unk_1D8[i]->unk1;
+ this->dogPaths[i] = SubS_GetPathByIndex(play, pathIndex, ENAOB01_PATH_INDEX_NONE);
+ pathIndex = this->dogPaths[i]->additionalPathIndex;
i++;
- } while (temp_s0 != 0xFF);
+ } while (pathIndex != ADDITIONAL_PATH_INDEX_NONE);
}
}
-void func_809C11EC(EnAob01* this, PlayState* play) {
+/**
+ * Spawns the dogs that mill about the racetrack before and after each race.
+ */
+void EnAob01_SpawnDogs(EnAob01* this, PlayState* play) {
s32 enDgParams;
s16 i;
- func_809C1158(this, play);
+ EnAob01_InitializeDogPaths(this, play);
- for (i = 0; i < ARRAY_COUNT(D_809C384C); i++) {
- enDgParams = ENDG_PARAMS(this->unk_1D8[D_809C384C[i].unk_06]->unk1, i);
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ enDgParams = ENDG_PARAMS(this->dogPaths[sDogInfo[i].pathIndex]->additionalPathIndex, i);
- this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_DG, D_809C384C[i].unk_00.x, D_809C384C[i].unk_00.y, D_809C384C[i].unk_00.z,
- 0, DEG_TO_BINANG(D_809C384C[i].unk_04), 0, enDgParams, 0xFFFF, this->actor.halfDaysBits, NULL);
+ this->dogs[i] = Actor_SpawnAsChildAndCutscene(
+ &play->actorCtx, play, ACTOR_EN_DG, sDogInfo[i].pos.x, sDogInfo[i].pos.y, sDogInfo[i].pos.z, 0,
+ DEG_TO_BINANG(sDogInfo[i].rotY), 0, enDgParams, (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
}
-void func_809C1304(EnAob01* this, PlayState* play) {
+/**
+ * Spawns the dogs that run around the track during each race.
+ */
+void EnAob01_SpawnRacedogs(EnAob01* this, PlayState* play) {
s16 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++) {
- this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_RACEDOG, (i * 15.0f) + -3897.0f, 130.0f, 1290.0f - (i * 10.0f), 0, 0x1555,
- 0, (i << 5) | ENAOB01_GET_7E00_1(&this->actor), 0xFFFF, this->actor.halfDaysBits, NULL);
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ this->dogs[i] = Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_RACEDOG, (i * 15.0f) + -3897.0f,
+ 130.0f, 1290.0f - (i * 10.0f), 0, 0x1555, 0,
+ ENRACEDOG_PARAMS(i, ENAOB01_GET_RACEDOG_PATH_INDEX(&this->actor)),
+ (u16)CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
}
-s32 func_809C1424(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her laugh start animation, this function will
+ * transition her to her laugh loop animation. This function will return true if she is
+ * *either* in her laugh start or laugh loop animation, false otherwise.
+ */
+s32 EnAob01_ProcessLaughAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if (this->unk_43C == 1) {
+ if (this->animIndex == EN_AOB01_ANIM_LAUGH_START) {
if (curFrame == lastFrame) {
- this->unk_43C = 2;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
+ this->animIndex = EN_AOB01_ANIM_LAUGH_LOOP;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_LOOP);
return true;
}
- } else if (this->unk_43C == 2) {
+ } else if (this->animIndex == EN_AOB01_ANIM_LAUGH_LOOP) {
return true;
}
+
return false;
}
-s32 func_809C14D0(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her idle animation, this function will
+ * transition her to her surprise start animation. If the racetrack owner is at the
+ * end of her surprise start animation, this function will transition her to her
+ * surprise loop animation. This function will return true if she is *either* in
+ * her surprise start or surprise loop animation, false otherwise.
+ */
+s32 EnAob01_ProcessSurpriseAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C == 0) || (this->unk_43C == 5)) {
+ if ((this->animIndex == EN_AOB01_ANIM_IDLE_1) || (this->animIndex == EN_AOB01_ANIM_IDLE_2)) {
if (curFrame == lastFrame) {
- this->unk_43C = 3;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
+ this->animIndex = EN_AOB01_ANIM_SURPRISE_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_SURPRISE_START);
return true;
}
- } else if (this->unk_43C == 3) {
+ } else if (this->animIndex == EN_AOB01_ANIM_SURPRISE_START) {
if (curFrame == lastFrame) {
- this->unk_43C = 4;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
+ this->animIndex = EN_AOB01_ANIM_SURPRISE_LOOP;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_SURPRISE_LOOP);
return true;
}
- } else if (this->unk_43C == 4) {
+ } else if (this->animIndex == EN_AOB01_ANIM_SURPRISE_LOOP) {
return true;
}
+
return false;
}
-s32 func_809C15BC(EnAob01* this) {
+/**
+ * If the racetrack owner is at the end of her current animation, this function will
+ * transition her to her the idle animation. This function will return true if she is
+ * in her idle animation, false otherwise.
+ */
+s32 EnAob01_ProcessIdleAnim(EnAob01* this) {
s16 curFrame = this->skelAnime.curFrame;
- s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->unk_43C].animation);
+ s16 lastFrame = Animation_GetLastFrame(sAnimationInfo[this->animIndex].animation);
- if ((this->unk_43C != 0) && (this->unk_43C != 5)) {
+ if ((this->animIndex != EN_AOB01_ANIM_IDLE_1) && (this->animIndex != EN_AOB01_ANIM_IDLE_2)) {
if (curFrame == lastFrame) {
- this->unk_43C = 5;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
+ this->animIndex = EN_AOB01_ANIM_IDLE_2;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE_2);
return true;
}
} else {
@@ -199,7 +249,7 @@ s32 func_809C15BC(EnAob01* this) {
return false;
}
-void func_809C165C(EnAob01* this, PlayState* play) {
+void EnAob01_UpdateCollision(EnAob01* this, PlayState* play) {
this->collider.dim.pos.x = this->actor.world.pos.x;
this->collider.dim.pos.y = this->actor.world.pos.y;
this->collider.dim.pos.z = this->actor.world.pos.z;
@@ -207,263 +257,278 @@ void func_809C165C(EnAob01* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
-void func_809C16DC(EnAob01* this, PlayState* play) {
+/**
+ * Handles all parts of the conversation with the racetrack owner before the race begins.
+ */
+void EnAob01_BeforeRace_HandleConversation(EnAob01* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- switch (this->unk_210) {
+ switch (this->textId) {
case 0:
- case 0x3524:
- case 0x3535:
- case 0x3548:
- case 0x3549:
- case 0x354A:
+ case 0x3524: // You can't play if you can't pay!
+ case 0x3535: // Really?
+ case 0x3548: // I can't let you play. (Goron)
+ case 0x3549: // I can't let you play. (Zora)
+ case 0x354A: // I can't let you play. (Deku)
switch (gSaveContext.save.day) {
case 1:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_64_80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_64_80);
- this->unk_210 = 0x3520;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1);
+ this->textId = 0x3520; // This is the Doggy Racetrack. (Day 1)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_01)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_01);
- this->unk_210 = 0x3530;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1);
+ this->textId = 0x3530; // This is the Doggy Racetrack. (Night 1)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
case 2:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_02)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_02);
- this->unk_210 = 0x3531;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2);
+ this->textId = 0x3531; // This is the Doggy Racetrack. (Day 2)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_04)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_04);
- this->unk_210 = 0x3532;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2);
+ this->textId = 0x3532; // This is the Doggy Racetrack. (Night 2)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
case 3:
if (!gSaveContext.save.isNight) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_08)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_08);
- this->unk_210 = 0x3533;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3);
+ this->textId = 0x3533; // This is the Doggy Racetrack. (Day 3)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
} else {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_10)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_65_10);
- this->unk_210 = 0x3534;
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3);
+ this->textId = 0x3534; // This is the Doggy Racetrack. (Night 3)
} else {
- this->unk_210 = 0x352F;
+ this->textId = 0x352F; // What do you want?
}
}
break;
}
break;
- case 0x3520:
- case 0x352F:
- case 0x3530:
- case 0x3531:
- case 0x3532:
- case 0x3533:
- case 0x3534:
- this->unk_210 = 0x3521;
+ case 0x3520: // This is the Doggy Racetrack. (Day 1)
+ case 0x352F: // What do you want?
+ case 0x3530: // This is the Doggy Racetrack. (Night 1)
+ case 0x3531: // This is the Doggy Racetrack. (Day 2)
+ case 0x3532: // This is the Doggy Racetrack. (Night 2)
+ case 0x3533: // This is the Doggy Racetrack. (Day 3)
+ case 0x3534: // This is the Doggy Racetrack. (Night 3)
+ this->textId = 0x3521; // Do you want to try the dog race?
break;
- case 0x3521:
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
+ case 0x3521: // Do you want to try the dog race?
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
switch (player->transformation) {
case PLAYER_FORM_GORON:
- this->unk_210 = 0x3548;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3548; // I can't let you play. (Goron)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_ZORA:
- this->unk_210 = 0x3549;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3549; // I can't let you play. (Zora)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_DEKU:
- this->unk_210 = 0x354A;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x354A; // I can't let you play. (Deku)
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
break;
case PLAYER_FORM_HUMAN:
- if (gSaveContext.save.playerData.rupees < 10) {
- this->unk_210 = 0x3524;
- this->unk_2D2 |= 0x10;
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
+ this->textId = 0x3524; // You can't play if you can't pay!
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
} else {
- this->unk_210 = 0x3522;
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
+ this->textId = 0x3522; // Bring me the fastest dog!
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
}
}
} else {
- this->unk_2D2 |= 0x10;
- this->unk_210 = 0x3535;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->textId = 0x3535; // Is that dog fine?
}
break;
- case 0x3522:
- case 0x3523:
- if (this->unk_2D2 & 8) {
- this->unk_210 = 0x3525;
+ case 0x3522: // Bring me the fastest dog!
+ case 0x3523: // Hurry up and bring me a dog!
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
+ this->textId = 0x3525; // Is that dog okay?
break;
}
- this->unk_210 = 0x3523;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3523; // Hurry up and bring me a dog!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
- case 0x3525:
- case 0x3526:
- if (this->unk_2D2 & 4) {
- if (this->unk_2D2 & 8) {
- this->unk_210 = 0x3525;
+ case 0x3525: // Is that dog okay?
+ case 0x3526: // Don't wait! Hurry up and choose!
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG) {
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
+ this->textId = 0x3525; // Is that dog okay?
break;
}
- this->unk_210 = 0x3523;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3523; // Hurry up and bring me a dog!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
- this->unk_210 = 0x3527;
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ this->textId = 0x3527; // If you win, you'll get more than you bet.
break;
}
- this->unk_210 = 0x3526;
- this->unk_2D2 |= 0x40;
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x3526; // Don't wait! Hurry up and choose!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
- case 0x3527:
- this->unk_210 = 0x3528;
+ case 0x3527: // If you win, you'll get more than you bet.
+ this->textId = 0x3528; // How much will you bet?
break;
- case 0x3528:
- if (gSaveContext.save.playerData.rupees < this->unk_434) {
- this->unk_210 = 0x3536;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ case 0x3528: // How much will you bet?
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->rupeesBet) {
+ this->textId = 0x3536; // You don't have enough rupees for that bet.
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- if (this->unk_434 == 0) {
- this->unk_210 = 0x3537;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ if (this->rupeesBet == 0) {
+ this->textId = 0x3537; // You can't race if you don't bet.
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- gSaveContext.unk_3F5C = this->unk_434;
- play->msgCtx.bankRupees = this->unk_434;
- this->unk_210 = 0x3529;
+ gSaveContext.unk_3F5C = this->rupeesBet;
+ play->msgCtx.bankRupees = this->rupeesBet;
+ this->textId = 0x3529; // Is that bet okay?
break;
- case 0x3529:
- if (this->unk_2D2 & 2) {
- this->unk_2D2 &= ~2;
- Rupees_ChangeBy(-this->unk_434);
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ case 0x3529: // Is that bet okay?
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ Rupees_ChangeBy(-this->rupeesBet);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->actionFunc = func_809C1C9C;
+ this->actionFunc = EnAob01_BeforeRace_StartRace;
return;
}
- this->unk_210 = 0x3528;
+ this->textId = 0x3528; // How much will you bet?
break;
- case 0x3536:
- case 0x3537:
- this->unk_210 = 0x3528;
+ case 0x3536: // You don't have enough rupees for that bet.
+ case 0x3537: // You can't race if you don't bet.
+ this->textId = 0x3528; // How much will you bet?
break;
}
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ Message_StartTextbox(play, this->textId, &this->actor);
}
-void func_809C1C9C(EnAob01* this, PlayState* play) {
+/**
+ * Once the player's rupees are done counting down, this function will
+ * reload the racetrack to start the race.
+ */
+void EnAob01_BeforeRace_StartRace(EnAob01* this, PlayState* play) {
if (gSaveContext.rupeeAccumulator == 0) {
SET_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
- this->unk_2D2 |= 0x20;
- func_800FD750(0x40);
+ this->stateFlags |= ENAOB01_FLAG_STARTED_RACE;
+ func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(DOGGY_RACETRACK, 1);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_64;
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 2;
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & 7) | (this->unk_432 * 8);
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_STARTED);
+ SET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX(this->selectedDogIndex);
play->transitionTrigger = TRANS_TRIGGER_START;
}
}
-void func_809C1D64(EnAob01* this, PlayState* play) {
+/**
+ * Handles the player's response to the question of whether or not they want to play again.
+ * Once the textbox closes, the racetrack owner will go back to being idle.
+ */
+void EnAob01_BeforeRace_RespondToPlayAgainQuestion(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (talkState == TEXT_STATE_CHOICE) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
play_sound(NA_SE_SY_ERROR);
- this->unk_210 = 0x3524;
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ this->textId = 0x3524; // You can't play if you can't pay!
+ Message_StartTextbox(play, this->textId, &this->actor);
} else {
func_8019F208();
- this->unk_2D2 |= 4;
- this->unk_2D2 |= 0x10;
- this->unk_210 = 0x3522;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C21E0;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->textId = 0x3522; // Bring me the fastest dog!
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_BeforeRace_Talk;
}
break;
case 1:
func_8019F230();
- this->unk_210 = 0x3535;
- Message_StartTextbox(play, this->unk_210, &this->actor);
+ this->textId = 0x3535; // Really?
+ Message_StartTextbox(play, this->textId, &this->actor);
break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->unk_210 = 0;
- this->actionFunc = func_809C2060;
+ this->textId = 0;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
}
}
-void func_809C1EC8(EnAob01* this, PlayState* play) {
+/**
+ * Handles various things that are common to all action functions, like tracking the
+ * player, blinking, handling collision, etc.
+ */
+void EnAob01_UpdateCommon(EnAob01* this, PlayState* play) {
static TrackOptionsSet sTrackOptions = {
{ 0xFA0, 4, 1, 3 },
{ 0x1770, 4, 1, 6 },
@@ -474,6 +539,7 @@ void func_809C1EC8(EnAob01* this, PlayState* play) {
Vec3f point;
SkelAnime_Update(&this->skelAnime);
+
if (SubS_AngleDiffLessEqual(this->actor.shape.rot.y, 0x36B0, this->actor.yawTowardsPlayer)) {
point.x = player->actor.world.pos.x;
point.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
@@ -488,124 +554,153 @@ void func_809C1EC8(EnAob01* this, PlayState* play) {
Math_SmoothStepToS(&this->torsoRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->torsoRot.y, 0, 4, 0x3E8, 1);
}
- func_809C10B0(this, 3);
- SubS_FillLimbRotTables(play, this->unk_2F8, this->unk_318, ARRAY_COUNT(this->unk_2F8));
- func_809C165C(this, play);
+
+ EnAob01_Blink(this, EN_AOB01_EYE_MAX);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ EnAob01_UpdateCollision(this, play);
+
+ // This specific code ensures that in-game time passes during the race.
if (player->stateFlags1 & PLAYER_STATE1_20) {
- func_809C1124();
+ EnAob01_AdvanceTime();
}
}
-void func_809C2060(EnAob01* this, PlayState* play) {
- if (func_809C15BC(this)) {
- if (func_809C2EC4(this, play) && !(this->unk_2D2 & 0x100)) {
+/**
+ * Stand around and wait until either the player talks to the racetrack owner or until
+ * the player bumps into them while holding a dog. In either case, the racetrack owner
+ * will then start talking with the player.
+ */
+void EnAob01_BeforeRace_Idle(EnAob01* this, PlayState* play) {
+ if (EnAob01_ProcessIdleAnim(this)) {
+ if (EnAob01_PlayerIsHoldingDog(this, play) && !(this->stateFlags & ENAOB01_FLAG_PLAYER_CAN_TALK)) {
if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 100.0f);
- this->unk_2D2 |= 8;
- this->actionFunc = func_809C21E0;
+ this->stateFlags |= ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
+ this->actionFunc = EnAob01_BeforeRace_Talk;
}
- } else if (Actor_ProcessTalkRequest(&this->actor, &play->state) && (this->unk_2D2 & 0x100)) {
- this->unk_2D2 &= ~0x100;
- this->unk_2E6 = this->trackTarget;
- this->unk_2EC = this->headRot;
- this->unk_2F2 = this->torsoRot;
- func_809C16DC(this, play);
- this->actionFunc = func_809C21E0;
+ } else if (Actor_ProcessTalkRequest(&this->actor, &play->state) &&
+ (this->stateFlags & ENAOB01_FLAG_PLAYER_CAN_TALK)) {
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CAN_TALK;
+ this->prevTrackTarget = this->trackTarget;
+ this->prevHeadRot = this->headRot;
+ this->prevTorsoRot = this->torsoRot;
+ EnAob01_BeforeRace_HandleConversation(this, play);
+ this->actionFunc = EnAob01_BeforeRace_Talk;
} else {
- this->unk_2D2 &= ~0x100;
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CAN_TALK;
if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.ocFlags2 & OC2_HIT_PLAYER)) {
- this->unk_2D2 |= 0x100;
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CAN_TALK;
func_800B8614(&this->actor, play, 100.0f);
}
}
}
}
-void func_809C21E0(EnAob01* this, PlayState* play) {
+/**
+ * Handles the actual action of talking with the player before the race begins.
+ */
+void EnAob01_BeforeRace_Talk(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
- if ((this->unk_2D2 & 8) && !func_809C2EC4(this, play)) {
- if ((this->unk_210 != 0) && (this->unk_210 != 0x3535) && (this->unk_210 != 0x3524) &&
- (this->unk_210 != 0x3548) && (this->unk_210 != 0x3549) && (this->unk_210 != 0x354A)) {
- this->unk_210 = 0x3523;
+ //! @bug: This block of code acts as a failsafe for when the player triggered this conversation by
+ //! bumping into the racetrack owner while holding the dog and, at the same time, threw or dropped
+ //! the dog frame-perfectly by pressing A. In this case, the code successfully returns the racetrack
+ //! owner to her idle state. Unfortunately, the player can also drop the dog by shielding. If this
+ //! shield drop is done frame-perfectly, then the below code will not function properly and will
+ //! instead softlock the game.
+ if ((this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) && !EnAob01_PlayerIsHoldingDog(this, play)) {
+ if ((this->textId != 0) && (this->textId != 0x3535) && (this->textId != 0x3524) && (this->textId != 0x3548) &&
+ (this->textId != 0x3549) && (this->textId != 0x354A)) {
+ this->textId = 0x3523; // Hurry up and bring me a dog!
}
+
this->actor.textId = 0;
- this->unk_2D2 &= ~8;
+ this->stateFlags &= ~ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
this->actor.flags &= ~ACTOR_FLAG_10000;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
return;
}
- if (this->unk_2D2 & 0x40) {
- if (!func_809C1424(this)) {
+ if (this->stateFlags & ENAOB01_FLAG_LAUGH) {
+ if (!EnAob01_ProcessLaughAnim(this)) {
return;
}
- } else if (!func_809C15BC(this)) {
+ } else if (!EnAob01_ProcessIdleAnim(this)) {
return;
}
- if (this->unk_2D2 & 8) {
+ if (this->stateFlags & ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80123E90(play, &this->actor);
- if (this->unk_2D2 & 4) {
- func_809C16DC(this, play);
- this->unk_2D2 &= ~4;
+ if (this->stateFlags & ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG) {
+ EnAob01_BeforeRace_HandleConversation(this, play);
+ this->stateFlags &= ~ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG;
} else {
- this->unk_2D2 |= 0x10;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->stateFlags |= ENAOB01_FLAG_CONVERSATION_OVER;
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
+ // Put my dog down!
Message_StartTextbox(play, 0x354B, &this->actor);
}
- this->unk_2D2 &= ~8;
+
+ this->stateFlags &= ~ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG;
}
} else if (talkState == TEXT_STATE_CHOICE) {
if (Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
switch (play->msgCtx.choiceIndex) {
case 0:
func_8019F208();
- this->unk_2D2 |= 2;
- func_809C16DC(this, play);
+ this->stateFlags |= ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE;
+ EnAob01_BeforeRace_HandleConversation(this, play);
break;
case 1:
func_8019F230();
- func_809C16DC(this, play);
+ EnAob01_BeforeRace_HandleConversation(this, play);
break;
}
}
} else if (talkState == TEXT_STATE_5) {
if (Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- if (this->unk_2D2 & 0x10) {
- this->unk_2D2 &= ~0x10;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ if (this->stateFlags & ENAOB01_FLAG_CONVERSATION_OVER) {
+ this->stateFlags &= ~ENAOB01_FLAG_CONVERSATION_OVER;
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
} else {
- func_809C16DC(this, play);
+ EnAob01_BeforeRace_HandleConversation(this, play);
}
}
} else if ((talkState == TEXT_STATE_14) && Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- this->unk_434 = play->msgCtx.bankRupeesSelected;
- func_809C16DC(this, play);
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ this->rupeesBet = play->msgCtx.bankRupeesSelected;
+ EnAob01_BeforeRace_HandleConversation(this, play);
}
}
-s32 func_809C2504(EnAob01* this, PlayState* play) {
+/**
+ * Checks all dog instances to see if any of them have reached a certain point along the racetrack,
+ * as specified by the cutscene's custom value. Once one of them has reached that point, this function
+ * will switch to following that dog and set the csId to correspond to the next cutscene in the race
+ * sequence; this usually appears to the user as a cut to a different camera angle. Returns true if any
+ * dog has reached the specified point, false otherwise.
+ */
+s32 EnAob01_Race_DogHasReachedNextCutsceneTrigger(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (npc != NULL) {
- if ((npc->id == ACTOR_EN_RACEDOG) && (func_800F2178(this->unk_430) == ((EnRacedog*)npc)->currentPoint)) {
- ActorCutscene_Stop(this->unk_430);
- this->unk_3F4 = npc;
- this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
+ if ((npc->id == ACTOR_EN_RACEDOG) &&
+ (CutsceneManager_GetCutsceneCustomValue(this->csId) == ((EnRacedog*)npc)->currentPoint)) {
+ CutsceneManager_Stop(this->csId);
+ this->dogToFollow = npc;
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
return true;
}
npc = npc->next;
@@ -614,12 +709,17 @@ s32 func_809C2504(EnAob01* this, PlayState* play) {
return false;
}
-s32 func_809C2594(EnAob01* this, PlayState* play) {
+/**
+ * Finds the dog that the player selected and starts following it. Returns true if it finds the player's
+ * selected dog and false otherwise, though nothing actually cares about this return value, and it should
+ * always be true in normal function (it is impossible to start a race without selecting a dog).
+ */
+s32 EnAob01_Race_FollowSelectedDog(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
while (npc != NULL) {
if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->index == ((EnRacedog*)npc)->selectedDogIndex)) {
- this->unk_3F4 = npc;
+ this->dogToFollow = npc;
return true;
}
npc = npc->next;
@@ -628,54 +728,82 @@ s32 func_809C2594(EnAob01* this, PlayState* play) {
return false;
}
-s32 func_809C25E4(EnAob01* this, PlayState* play) {
+/**
+ * Returns true if the race should be ended, which can happen in either of the following circumstances:
+ * - All `RACEDOG_COUNT` dogs have finished the race.
+ * - At least 10 dogs have finished the race, and at least 500 frames have passed since the 10th place
+ * dog finished. This is controlled by the forceRaceEndTimer, which is set in EnAob01_Init.
+ */
+s32 EnAob01_Race_IsRaceOver(EnAob01* this, PlayState* play) {
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- s16 count = 0;
+ s16 finishedCount = 0;
while (npc != NULL) {
if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->raceStatus == RACEDOG_RACE_STATUS_FINISHED)) {
- count++;
+ finishedCount++;
}
npc = npc->next;
}
- if (count >= 14) {
+ if (finishedCount >= RACEDOG_COUNT) {
return true;
}
- if ((count >= 10) && (DECR(this->unk_440) == 0)) {
+ if ((finishedCount >= 10) && (DECR(this->forceRaceEndTimer) == 0)) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * If the current cutscene has a positive length, and if the current cutscene is over (in other words,
+ * if the length has elapsed), this function will set the csId to the next cutscene in the race sequence
+ * and return true. In all other cases, it will return false. Note that *all* of the race cutscenes have
+ * a length of -1, so in practice, this function never does anything and always returns false.
+ */
+s32 EnAob01_Race_CurrentCutsceneHasEnded(EnAob01* this) {
+ if ((CutsceneManager_GetLength(this->csId) > 0) && (CutsceneManager_GetCurrentCsId() != this->csId)) {
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
return true;
}
return false;
}
-s32 func_809C2680(EnAob01* this) {
- if ((ActorCutscene_GetLength(this->unk_430) > 0) && (ActorCutscene_GetCurrentIndex() != this->unk_430)) {
- this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
- return true;
- }
- return false;
+/**
+ * The only way we end up inside this function is if we tried to start a cutscene with a custom
+ * value of 255. This does not correspond to a point on the racetrack, nor is it the special value
+ * of 99, which is used to signal the race ending cutscene. Thus, whatever cutscene we're trying
+ * to play here is almost certainly not a race cutscene, so this function just skips it and tries
+ * to play the next cutscene.
+ */
+void EnAob01_Race_SkipNonRaceCutscene(EnAob01* this, PlayState* play) {
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ this->actionFunc = EnAob01_Race_StartCutscene;
}
-void func_809C26E4(EnAob01* this, PlayState* play) {
- ActorCutscene_Stop(this->unk_430);
- this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
- this->actionFunc = func_809C2824;
-}
-
-void func_809C2730(EnAob01* this, PlayState* play) {
- if (func_809C2504(this, play) || func_809C2680(this)) {
- ActorCutscene_SetIntentToPlay(this->unk_430);
- this->actionFunc = func_809C2824;
+/**
+ * Wait around doing nothing until the next cutscene is triggered (in practice, this only happens
+ * when a dog reaches the next cutscene trigger), at which point we queue up the next cutscene.
+ */
+void EnAob01_Race_HandleRaceCutscene(EnAob01* this, PlayState* play) {
+ if (EnAob01_Race_DogHasReachedNextCutsceneTrigger(this, play) || EnAob01_Race_CurrentCutsceneHasEnded(this)) {
+ CutsceneManager_Queue(this->csId);
+ this->actionFunc = EnAob01_Race_StartCutscene;
}
}
-void func_809C2788(EnAob01* this, PlayState* play) {
- this->unk_2D2 |= 0x20;
- if (func_809C25E4(this, play)) {
+/**
+ * Waits until the race is over, then reloads the racetrack to return it
+ * to its regular playable state.
+ */
+void EnAob01_Race_HandleRaceEndCutscene(EnAob01* this, PlayState* play) {
+ this->stateFlags |= ENAOB01_FLAG_STARTED_RACE;
+ if (EnAob01_Race_IsRaceOver(this, play)) {
if (AudioSeq_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_HORSE_GOAL) {
play->nextEntrance = ENTRANCE(DOGGY_RACETRACK, 1);
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 3;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_ENDED);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -683,93 +811,109 @@ void func_809C2788(EnAob01* this, PlayState* play) {
}
}
-void func_809C2824(EnAob01* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_430)) {
- ActorCutscene_Start(this->unk_430, this->unk_3F4);
- switch (func_800F2178(this->unk_430)) {
+/**
+ * Starts the cutscene specified by the csId and switches to an appropriate
+ * action function based on the cutscene's custom value.
+ */
+void EnAob01_Race_StartCutscene(EnAob01* this, PlayState* play) {
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, this->dogToFollow);
+ switch (CutsceneManager_GetCutsceneCustomValue(this->csId)) {
case 255:
- this->actionFunc = func_809C26E4;
+ this->actionFunc = EnAob01_Race_SkipNonRaceCutscene;
break;
case 99:
- this->actionFunc = func_809C2788;
+ this->actionFunc = EnAob01_Race_HandleRaceEndCutscene;
break;
default:
- this->actionFunc = func_809C2730;
+ this->actionFunc = EnAob01_Race_HandleRaceCutscene;
}
} else {
- ActorCutscene_SetIntentToPlay(this->unk_430);
+ CutsceneManager_Queue(this->csId);
}
}
-void func_809C28B8(EnAob01* this, PlayState* play) {
+/**
+ * Tells the player how their selected dog did in the race and gives the player
+ * rupees depending on their performance. If their dog placed 1st, they will
+ * receive triple the rupees they bet. If their dog places 2nd, they will receive
+ * double the rupees they bet. If their dog places 3rd through 5th, they will
+ * receive the same number of rupees they bet.
+ */
+void EnAob01_AfterRace_GiveRaceResult(EnAob01* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80123E90(play, &this->actor);
- this->unk_434 = gSaveContext.unk_3F5C;
- switch ((gSaveContext.eventInf[0] & 0xF8) >> 3) {
+ this->rupeesBet = gSaveContext.unk_3F5C;
+ switch (GET_EVENTINF_DOG_RACE_RACE_STANDING) {
case 1:
- this->unk_210 = 0x352A;
- this->unk_2D2 |= 0x80;
- this->unk_434 *= 3;
- Rupees_ChangeBy(this->unk_434);
- play->msgCtx.bankRupees = this->unk_434;
+ this->textId = 0x352A; // You took 1st place!
+ this->stateFlags |= ENAOB01_FLAG_SURPRISE;
+ this->rupeesBet *= 3;
+ Rupees_ChangeBy(this->rupeesBet);
+ play->msgCtx.bankRupees = this->rupeesBet;
break;
case 2:
- this->unk_210 = 0x352B;
- this->unk_2D2 |= 0x80;
- this->unk_434 *= 2;
- Rupees_ChangeBy(this->unk_434);
- play->msgCtx.bankRupees = this->unk_434;
+ this->textId = 0x352B; // You took 2nd place!
+ this->stateFlags |= ENAOB01_FLAG_SURPRISE;
+ this->rupeesBet *= 2;
+ Rupees_ChangeBy(this->rupeesBet);
+ play->msgCtx.bankRupees = this->rupeesBet;
break;
case 3:
case 4:
case 5:
- this->unk_210 = 0x352C;
- Rupees_ChangeBy(this->unk_434);
+ this->textId = 0x352C; // I'll give you back what you bet.
+ Rupees_ChangeBy(this->rupeesBet);
break;
default:
- this->unk_210 = 0x352D;
- this->unk_2D2 |= 0x40;
- this->unk_43C = 1;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
+ this->textId = 0x352D; // Bad choice!
+ this->stateFlags |= ENAOB01_FLAG_LAUGH;
+ this->animIndex = EN_AOB01_ANIM_LAUGH_START;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_LAUGH_START);
break;
}
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C2D0C;
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_AfterRace_Talk;
} else if (this->actor.xzDistToPlayer < 100.0f) {
func_800B8614(&this->actor, play, 100.0f);
}
}
-void func_809C2A64(EnAob01* this, PlayState* play) {
+/**
+ * Gives the player the reward for winning 150 or more rupees from the dog race. The first
+ * time this happens, the player will receive a Heart Piece; any other time, they will
+ * instead receive a Red Rupee.
+ */
+void EnAob01_AfterRace_GiveReward(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
- if (func_809C15BC(this)) {
+ if (EnAob01_ProcessIdleAnim(this)) {
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->unk_434 = 0;
+ this->rupeesBet = 0;
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
}
if (Actor_HasParent(&this->actor, play)) {
- this->trackTarget = this->unk_2E6;
- this->headRot = this->unk_2EC;
- this->torsoRot = this->unk_2F2;
+ this->trackTarget = this->prevTrackTarget;
+ this->headRot = this->prevHeadRot;
+ this->torsoRot = this->prevTorsoRot;
this->actor.parent = NULL;
this->actor.shape.rot.y = this->actor.world.rot.y;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_20)) {
- this->actionFunc = func_809C2BE4;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE)) {
+ this->actionFunc = EnAob01_AfterRace_AfterGivingReward;
} else {
- SET_WEEKEVENTREG(WEEKEVENTREG_08_20);
- this->actionFunc = func_809C2BE4;
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE);
+ this->actionFunc = EnAob01_AfterRace_AfterGivingReward;
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_20)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE)) {
Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
} else {
Actor_OfferGetItem(&this->actor, play, GI_HEART_PIECE, 300.0f, 300.0f);
@@ -777,7 +921,12 @@ void func_809C2A64(EnAob01* this, PlayState* play) {
}
}
-void func_809C2BE4(EnAob01* this, PlayState* play) {
+/**
+ * If the current time is after the racetrack closes, kick the player out.
+ * Otherwise, ask the player if they want to play again. This function is
+ * only used when the player has won the 150 rupee reward.
+ */
+void EnAob01_AfterRace_AfterGivingReward(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
@@ -789,51 +938,63 @@ void func_809C2BE4(EnAob01* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
- this->unk_210 = 0;
+ this->textId = 0;
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
- gSaveContext.eventInf[0] &= (u8)~7;
- this->actionFunc = func_809C2C9C;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_NOT_STARTED);
+ this->actionFunc = EnAob01_AfterRace_AskToPlayAgain;
}
}
-void func_809C2C9C(EnAob01* this, PlayState* play) {
+/**
+ * Ask if the player wants to play again. This function is only used when
+ * the player has won the 150 rupee reward.
+ */
+void EnAob01_AfterRace_AskToPlayAgain(EnAob01* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- this->unk_210 = 0x354C;
- Message_ContinueTextbox(play, this->unk_210);
- this->actionFunc = func_809C1D64;
+ this->textId = 0x354C; // Want to play again?
+ Message_ContinueTextbox(play, this->textId);
+ this->actionFunc = EnAob01_BeforeRace_RespondToPlayAgainQuestion;
} else {
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
}
-void func_809C2D0C(EnAob01* this, PlayState* play) {
+/**
+ * Handles the conversation the racetrack owner has with the player after the race
+ * is over. If the player won 150 or more rupees, this function will transition to
+ * the action function that gives them the reward. If the player did *not* win 150
+ * or more rupees, then if the current time is after the racetrack closes, this
+ * kicks the player out. Otherwise, this asks the player if they want to play again.
+ * Much of the logic here is duplicated in the above two functions.
+ */
+void EnAob01_AfterRace_Talk(EnAob01* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
- if (this->unk_2D2 & 0x40) {
- if (!func_809C1424(this)) {
+ if (this->stateFlags & ENAOB01_FLAG_LAUGH) {
+ if (!EnAob01_ProcessLaughAnim(this)) {
return;
}
- } else if (this->unk_2D2 & 0x80) {
- if (!func_809C14D0(this)) {
+ } else if (this->stateFlags & ENAOB01_FLAG_SURPRISE) {
+ if (!EnAob01_ProcessSurpriseAnim(this)) {
return;
}
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- this->unk_2D2 &= ~0x40;
- this->unk_2D2 &= ~0x80;
- if (this->unk_434 >= 150) {
- this->unk_210 = 0x352E;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C2A64;
+ this->stateFlags &= ~ENAOB01_FLAG_LAUGH;
+ this->stateFlags &= ~ENAOB01_FLAG_SURPRISE;
+ if (this->rupeesBet >= 150) {
+ this->textId = 0x352E; // You won over 150 rupees!
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_AfterRace_GiveReward;
} else {
- this->trackTarget = this->unk_2E6;
- this->headRot = this->unk_2EC;
- this->torsoRot = this->unk_2F2;
+ this->trackTarget = this->prevTrackTarget;
+ this->headRot = this->prevHeadRot;
+ this->torsoRot = this->prevTorsoRot;
- this->unk_434 = 0;
+ this->rupeesBet = 0;
this->actor.shape.rot.y = this->actor.world.rot.y;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED);
@@ -843,35 +1004,40 @@ void func_809C2D0C(EnAob01* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
- this->unk_210 = 0x354C;
- Message_StartTextbox(play, this->unk_210, &this->actor);
- this->actionFunc = func_809C1D64;
- gSaveContext.eventInf[0] &= (u8)~7;
+ this->textId = 0x354C; // Want to play again?
+ Message_StartTextbox(play, this->textId, &this->actor);
+ this->actionFunc = EnAob01_BeforeRace_RespondToPlayAgainQuestion;
+ SET_EVENTINF_DOG_RACE_STATE(EVENTINF_DOG_RACE_STATE_NOT_STARTED);
}
}
}
-s32 func_809C2EC4(EnAob01* this, PlayState* play) {
+s32 EnAob01_PlayerIsHoldingDog(EnAob01* this, PlayState* play) {
Actor* dog = play->actorCtx.actorLists[ACTORCAT_ENEMY].first;
while (dog != NULL) {
if (dog->id == ACTOR_EN_DG) {
- this->unk_432 = ((EnDg*)dog)->selectedDogIndex;
- if (this->unk_432 == -1) {
+ this->selectedDogIndex = ((EnDg*)dog)->selectedDogIndex;
+ if (this->selectedDogIndex == -1) {
return false;
}
- if (this->unk_432 == ENDG_GET_INDEX(dog)) {
+ if (this->selectedDogIndex == ENDG_GET_INDEX(dog)) {
return true;
}
}
+
dog = dog->next;
}
return false;
}
-void func_809C2F34(EnAob01* this, PlayState* play) {
+/**
+ * Moves the player and racetrack owner to the center of the racetrack
+ * (out of the way of the dogs) and stops drawing the player.
+ */
+void EnAob01_Race_HidePlayer(EnAob01* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->actor.world.pos.x = -4134.0f;
@@ -884,40 +1050,48 @@ void func_809C2F34(EnAob01* this, PlayState* play) {
this->actor.prevPos = this->actor.world.pos;
}
-void func_809C2FA0(void) {
+/**
+ * Generates a randomized list of dog text offsets and stores them in weekEventRegs.
+ * EnDg uses these text offsets to determine what text to show when the player picks
+ * the dog up while equipped with the Mask of Truth, and EnRacedog uses them to
+ * determine what condition the dog is in.
+ */
+void EnAob01_InitializeDogTextOffsets(void) {
u8 i;
u8 rand;
- u8 index;
- u8 orig;
- u8 orig2;
- u8 sp44[7];
- u8 sp34[] = {
+ u8 dogTextOffsetsTemp;
+ u8 packedDogTextOffsets[(RACEDOG_COUNT + 1) / 2];
+ u8 dogTextOffsets[RACEDOG_COUNT] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
};
- for (i = 0; i < ARRAY_COUNT(sp34); i++) {
- rand = Rand_ZeroFloat(14.0f);
- orig = sp34[i];
+ // Swap around the dog text offsets randomly 14 times.
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ rand = Rand_ZeroFloat(RACEDOG_COUNT);
- sp34[i] = sp34[rand];
- sp34[rand] = orig;
+ dogTextOffsetsTemp = dogTextOffsets[i];
+ dogTextOffsets[i] = dogTextOffsets[rand];
+ dogTextOffsets[rand] = dogTextOffsetsTemp;
}
- for (i = 0; i < ARRAY_COUNT(sp44); i++) {
- gSaveContext.save.weekEventReg[42 + i] = 0;
- sp44[i] = 0;
+ // Clear out all weekEventRegs related to the dog text offsets.
+ for (i = 0; i < ARRAY_COUNT(packedDogTextOffsets); i++) {
+ CLEAR_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(i);
+ packedDogTextOffsets[i] = 0;
}
- for (i = 0; i < ARRAY_COUNT(sp34); i++) {
- orig2 = sp34[i];
- index = i / 2;
+ // Go through all the dog text offsets and pack them into weekEventRegs.
+ for (i = 0; i < RACEDOG_COUNT; i++) {
+ u8 dogTextOffsetsTemp = dogTextOffsets[i];
+ u8 j = i / 2;
if (i % 2) {
- sp44[index] |= orig2 << 0x4;
- gSaveContext.save.weekEventReg[42 + index] =
- ((void)0, gSaveContext.save.weekEventReg[42 + index]) | sp44[index];
+ //! @note sets text offsets for both even and odd entry.
+ //! Requires `RACEDOG_COUNT` to be even to work properly.
+ packedDogTextOffsets[j] |= dogTextOffsetsTemp << 4;
+ SET_WEEKEVENTREG_DOG_RACE_TEXT_OFFSETS(j, packedDogTextOffsets[j]);
} else {
- sp44[index] |= orig2;
+ packedDogTextOffsets[j] |= dogTextOffsetsTemp;
}
}
}
@@ -931,36 +1105,36 @@ void EnAob01_Init(Actor* thisx, PlayState* play) {
MAMAMU_YAN_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->unk_43C = 0;
- Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
+ this->animIndex = EN_AOB01_ANIM_IDLE_1;
+ Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_AOB01_ANIM_IDLE_1);
Actor_SetScale(&this->actor, 0.01f);
- switch (gSaveContext.eventInf[0] & 7) {
- case 0:
- func_809C2FA0();
- func_809C11EC(this, play);
+ switch (GET_EVENTINF_DOG_RACE_STATE) {
+ case EVENTINF_DOG_RACE_STATE_NOT_STARTED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
this->actor.flags |= ACTOR_FLAG_1;
- this->actionFunc = func_809C2060;
+ this->actionFunc = EnAob01_BeforeRace_Idle;
break;
- case 2:
- this->unk_440 = 500;
- func_809C1304(this, play);
+ case EVENTINF_DOG_RACE_STATE_STARTED:
+ this->forceRaceEndTimer = 500;
+ EnAob01_SpawnRacedogs(this, play);
this->actor.draw = NULL;
- this->unk_430 = this->actor.cutscene;
- func_809C2594(this, play);
- ActorCutscene_SetIntentToPlay(this->unk_430);
+ this->csId = this->actor.csId;
+ EnAob01_Race_FollowSelectedDog(this, play);
+ CutsceneManager_Queue(this->csId);
this->actor.flags &= ~ACTOR_FLAG_1;
- func_809C2F34(this, play);
- this->actionFunc = func_809C2824;
+ EnAob01_Race_HidePlayer(this, play);
+ this->actionFunc = EnAob01_Race_StartCutscene;
break;
- case 3:
- func_809C2FA0();
- func_809C11EC(this, play);
+ case EVENTINF_DOG_RACE_STATE_ENDED:
+ EnAob01_InitializeDogTextOffsets();
+ EnAob01_SpawnDogs(this, play);
this->actor.flags |= ACTOR_FLAG_1;
this->actor.flags |= ACTOR_FLAG_10000;
- this->actionFunc = func_809C28B8;
+ this->actionFunc = EnAob01_AfterRace_GiveRaceResult;
break;
}
}
@@ -968,9 +1142,10 @@ void EnAob01_Init(Actor* thisx, PlayState* play) {
void EnAob01_Destroy(Actor* thisx, PlayState* play) {
EnAob01* this = THIS;
- if (!(this->unk_2D2 & 0x20)) {
+ if (!(this->stateFlags & ENAOB01_FLAG_STARTED_RACE)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT);
}
+
Collider_DestroyCylinder(play, &this->collider);
}
@@ -978,7 +1153,7 @@ void EnAob01_Update(Actor* thisx, PlayState* play) {
EnAob01* this = THIS;
this->actionFunc(this, play);
- func_809C1EC8(this, play);
+ EnAob01_UpdateCommon(this, play);
}
s32 EnAob01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
@@ -1013,18 +1188,19 @@ s32 EnAob01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if ((limbIndex == MAMAMU_YAN_LIMB_TORSO) || (limbIndex == MAMAMU_YAN_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == MAMAMU_YAN_LIMB_RIGHT_UPPER_ARM)) {
- rot->y += (s16)Math_SinS(this->unk_2F8[limbIndex]) * 200;
- rot->z += (s16)Math_CosS(this->unk_318[limbIndex]) * 200;
+ rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
}
+
return false;
}
void EnAob01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
- static Vec3f D_809C3968 = { 0.0f, 0.0f, 0.0f };
+ static Vec3f sFocusOffset = { 0.0f, 0.0f, 0.0f };
EnAob01* this = THIS;
if (limbIndex == MAMAMU_YAN_LIMB_HEAD) {
- Matrix_MultVec3f(&D_809C3968, &this->actor.focus.pos);
+ Matrix_MultVec3f(&sFocusOffset, &this->actor.focus.pos);
}
}
@@ -1039,7 +1215,7 @@ void EnAob01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
@@ -1050,7 +1226,7 @@ void EnAob01_Draw(Actor* thisx, PlayState* play) {
EnAob01_TransformLimbDraw, &this->actor);
if (this->actor.draw != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.5f;
scale.y = 0.5f;
diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
index 2507b1728..5f7775368 100644
--- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
+++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.h
@@ -8,38 +8,58 @@ struct EnAob01;
typedef void (*EnAob01ActionFunc)(struct EnAob01*, PlayState*);
-#define ENAOB01_GET_7E00_1(thisx) ((thisx)->params & 0x7E00)
-#define ENAOB01_GET_7E00_2(thisx) (((thisx)->params & 0x7E00) >> 9)
+// This needs to be kept in sync with the number of weekEventRegs used to store the text ID offsets for
+// the race dogs. In particular, there needs to be one weekEventReg for every two dogs. This needs to be
+// an even number to ensure that all text ID offsets are created (see EnAob01_InitializeDogTextOffsets).
+#define RACEDOG_COUNT 14
+
+#define ENAOB01_GET_STARTING_DOG_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+//! @bug This should be shifted up by 1 to match how EnRacedog expects the path index to be supplied.
+//! It doesn't cause any problems in the final game because every time EnAob01 is spawned, all the
+//! bits here are zero.
+#define ENAOB01_GET_RACEDOG_PATH_INDEX(thisx) ((thisx)->params & 0x7E00)
+
+#define ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE (1 << 1)
+#define ENAOB01_FLAG_PLAYER_TOLD_TO_PICK_A_DOG (1 << 2)
+#define ENAOB01_FLAG_TALKING_TO_PLAYER_HOLDING_DOG (1 << 3)
+#define ENAOB01_FLAG_CONVERSATION_OVER (1 << 4)
+#define ENAOB01_FLAG_STARTED_RACE (1 << 5)
+#define ENAOB01_FLAG_LAUGH (1 << 6)
+#define ENAOB01_FLAG_SURPRISE (1 << 7)
+#define ENAOB01_FLAG_PLAYER_CAN_TALK (1 << 8)
+
+#define ENAOB01_PATH_INDEX_NONE 0x3F
typedef struct EnAob01 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnAob01ActionFunc actionFunc;
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ Path* unk_1D8[14];
- /* 0x210 */ u16 unk_210;
+ /* 0x1D8 */ Path* dogPaths[RACEDOG_COUNT];
+ /* 0x210 */ u16 textId;
/* 0x212 */ Vec3s jointTable[MAMAMU_YAN_LIMB_MAX];
/* 0x272 */ Vec3s morphTable[MAMAMU_YAN_LIMB_MAX];
- /* 0x2D2 */ u16 unk_2D2;
+ /* 0x2D2 */ u16 stateFlags;
/* 0x2D4 */ Vec3s trackTarget;
/* 0x2DA */ Vec3s headRot;
/* 0x2E0 */ Vec3s torsoRot;
- /* 0x2E6 */ Vec3s unk_2E6;
- /* 0x2EC */ Vec3s unk_2EC;
- /* 0x2F2 */ Vec3s unk_2F2;
- /* 0x2F8 */ s16 unk_2F8[MAMAMU_YAN_LIMB_MAX];
- /* 0x318 */ s16 unk_318[MAMAMU_YAN_LIMB_MAX];
+ /* 0x2E6 */ Vec3s prevTrackTarget;
+ /* 0x2EC */ Vec3s prevHeadRot;
+ /* 0x2F2 */ Vec3s prevTorsoRot;
+ /* 0x2F8 */ s16 limbRotTableY[MAMAMU_YAN_LIMB_MAX];
+ /* 0x318 */ s16 limbRotTableZ[MAMAMU_YAN_LIMB_MAX];
/* 0x338 */ UNK_TYPE1 unk338[0xB6];
/* 0x3EE */ s16 eyeIndex;
/* 0x3F0 */ s16 blinkTimer;
- /* 0x3F4 */ Actor* unk_3F4;
- /* 0x3F8 */ Actor* unk_3F8[14];
- /* 0x430 */ s16 unk_430;
- /* 0x432 */ s16 unk_432;
- /* 0x434 */ s32 unk_434;
+ /* 0x3F4 */ Actor* dogToFollow;
+ /* 0x3F8 */ Actor* dogs[RACEDOG_COUNT];
+ /* 0x430 */ s16 csId;
+ /* 0x432 */ s16 selectedDogIndex;
+ /* 0x434 */ s32 rupeesBet; // Also used for determining how many rupees to give to the player if they place 1st-5th in the race.
/* 0x438 */ UNK_TYPE1 unk438[4];
- /* 0x43C */ s32 unk_43C;
- /* 0x440 */ s16 unk_440;
+ /* 0x43C */ s32 animIndex;
+ /* 0x440 */ s16 forceRaceEndTimer;
} EnAob01; // size = 0x444
#endif // Z_EN_AOB_01_H
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 c7077e56e..e47a726a4 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
@@ -78,26 +78,26 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (this->actor.params == -ENARROW_8) {
+ if (this->actor.params == -ARROW_TYPE_DEKU_NUT) {
this->unk_263 = 1;
- this->actor.params = ENARROW_8;
+ this->actor.params = ARROW_TYPE_DEKU_NUT;
}
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
SkelAnime_Init(play, &this->arrow.skelAnime, &gameplay_keep_Skel_014560, &gameplay_keep_Anim_0128BC,
this->arrow.jointTable, this->arrow.jointTable, 5);
- if (this->actor.params < ENARROW_3) {
- if (this->actor.params == ENARROW_1) {
+ if (this->actor.params < ARROW_TYPE_FIRE) {
+ if (this->actor.params == ARROW_TYPE_NORMAL_HORSE) {
D_8088C234.elemDuration = 4;
} else {
D_8088C234.elemDuration = 16;
}
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C234);
- } else if (this->actor.params == ENARROW_3) {
+ } else if (this->actor.params == ARROW_TYPE_FIRE) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C258);
- } else if (this->actor.params == ENARROW_4) {
+ } else if (this->actor.params == ARROW_TYPE_ICE) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C27C);
- } else if (this->actor.params == ENARROW_5) {
+ } else if (this->actor.params == ARROW_TYPE_LIGHT) {
Effect_Add(play, &this->unk_240, EFFECT_BLURE2, 0, 0, &D_8088C2A0);
}
}
@@ -105,20 +105,20 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
Collider_InitQuad(play, &this->collider);
Collider_SetQuad(play, &this->collider, &this->actor, &sQuadInit);
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
this->collider.info.toucherFlags &= ~(TOUCH_SFX_WOOD | TOUCH_SFX_HARD);
this->collider.info.toucherFlags |= 0;
}
- if (this->actor.params < ENARROW_0) {
+ if (this->actor.params < ARROW_TYPE_NORMAL_LIT) {
this->collider.base.atFlags = (AT_TYPE_ENEMY | AT_ON);
} else {
this->collider.info.toucher.dmgFlags = Actor_GetArrowDmgFlags(this->actor.params);
- if (this->actor.params == ENARROW_8) {
+ if (this->actor.params == ARROW_TYPE_DEKU_NUT) {
this->collider.info.toucher.damage = 1;
}
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
Actor_SetScale(&this->actor, 1.0f);
}
}
@@ -128,7 +128,7 @@ void EnArrow_Init(Actor* thisx, PlayState* play) {
void EnArrow_Destroy(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
Effect_Destroy(play, this->unk_240);
}
@@ -138,7 +138,7 @@ void EnArrow_Destroy(Actor* thisx, PlayState* play) {
this->unk_264->flags &= ~ACTOR_FLAG_8000;
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6) && (this->actor.child == NULL)) {
+ if (ARROW_IS_MAGICAL(this->actor.params) && (this->actor.child == NULL)) {
Magic_Reset(play);
}
}
@@ -153,7 +153,7 @@ void func_8088A594(EnArrow* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->actor.parent != NULL) {
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (Math_SmoothStepToF(&this->bubble.unk_144, 16.0f, 0.07f, 1.8f, 0.0f) > 0.5f) {
func_800B9010(&this->actor, NA_SE_PL_DEKUNUTS_BUBLE_BREATH - SFX_FLAG);
return;
@@ -166,8 +166,8 @@ void func_8088A594(EnArrow* this, PlayState* play) {
}
}
} else {
- if ((this->actor.params != ENARROW_8) && (player->unk_D57 == 0)) {
- if (this->actor.params == ENARROW_7) {
+ if ((this->actor.params != ARROW_TYPE_DEKU_NUT) && (player->unk_D57 == 0)) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
Magic_Reset(play);
}
Actor_Kill(&this->actor);
@@ -175,22 +175,22 @@ void func_8088A594(EnArrow* this, PlayState* play) {
}
switch (this->actor.params) {
- case ENARROW_6:
+ case ARROW_TYPE_SLINGSHOT:
Player_PlaySfx(player, NA_SE_IT_SLING_SHOT);
break;
- case ENARROW_0:
- case ENARROW_1:
- case ENARROW_2:
+ case ARROW_TYPE_NORMAL_LIT:
+ case ARROW_TYPE_NORMAL_HORSE:
+ case ARROW_TYPE_NORMAL:
Player_PlaySfx(player, NA_SE_IT_ARROW_SHOT);
break;
- case ENARROW_3:
- case ENARROW_4:
- case ENARROW_5:
+ case ARROW_TYPE_FIRE:
+ case ARROW_TYPE_ICE:
+ case ARROW_TYPE_LIGHT:
Player_PlaySfx(player, NA_SE_IT_MAGIC_ARROW_SHOT);
- case ENARROW_7:
+ case ARROW_TYPE_DEKU_BUBBLE:
Player_PlaySfx(player, NA_SE_PL_DEKUNUTS_FIRE);
break;
}
@@ -198,13 +198,13 @@ void func_8088A594(EnArrow* this, PlayState* play) {
this->actionFunc = func_8088ACE0;
Math_Vec3f_Copy(&this->unk_228, &this->actor.world.pos);
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
this->bubble.unk_144 = CLAMP_MIN(this->bubble.unk_144, 3.5f);
func_8088A514(this);
this->unk_260 = 99;
Magic_Reset(play);
- } else if (this->actor.params >= ENARROW_6) {
- if ((this->actor.params == ENARROW_8) && (this->actor.world.rot.x < 0)) {
+ } else if (!ARROW_IS_ARROW(this->actor.params)) {
+ if ((this->actor.params == ARROW_TYPE_DEKU_NUT) && (this->actor.world.rot.x < 0)) {
Actor_SetScale(&this->actor, 0.009f);
this->unk_260 = 40;
} else {
@@ -295,14 +295,14 @@ void func_8088AA98(EnArrow* this, PlayState* play) {
EffectSsGRipple_Spawn(play, &sp44, 100, 500, 4);
EffectSsGRipple_Spawn(play, &sp44, 100, 500, 8);
- if ((this->actor.params == ENARROW_4) || (this->actor.params == ENARROW_3)) {
- if ((this->actor.params == ENARROW_4) && (func_8088B6B0 != this->actionFunc)) {
+ if ((this->actor.params == ARROW_TYPE_ICE) || (this->actor.params == ARROW_TYPE_FIRE)) {
+ if ((this->actor.params == ARROW_TYPE_ICE) && (func_8088B6B0 != this->actionFunc)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_BG_ICEFLOE, sp44.x, sp44.y, sp44.z, 0, 0, 0, 300);
Actor_Kill(&this->actor);
return;
}
- this->actor.params = ENARROW_2;
+ this->actor.params = ARROW_TYPE_NORMAL;
this->collider.info.toucher.dmgFlags = 0x20;
if (this->actor.child != NULL) {
@@ -329,14 +329,14 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
s32 sp50;
if ((DECR(this->unk_260) == 0) ||
- ((this->actor.params == ENARROW_7) &&
+ ((this->actor.params == ARROW_TYPE_DEKU_BUBBLE) &&
((this->unk_262 != 0) || (phi_a2 = (this->collider.base.atFlags & AT_HIT) != 0)))) {
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (phi_a2 && (this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4) &&
(this->collider.base.atFlags & AT_BOUNCED)) {
if ((this->collider.base.at != NULL) && (this->collider.base.at->id != ACTOR_OBJ_SYOKUDAI)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
- this->actor.world.rot.y += BINANG_ROT180((s16)randPlusMinusPoint5Scaled(8000.0f));
+ this->actor.world.rot.y += BINANG_ROT180((s16)(s32)Rand_CenteredFloat(0x1F40));
this->actor.velocity.y = -this->actor.velocity.y;
this->bubble.unk_149 = -1;
return;
@@ -361,18 +361,18 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
return;
}
- sp50 =
- (this->actor.params != ENARROW_0) && (this->actor.params < ENARROW_8) && (this->collider.base.atFlags & AT_HIT);
+ sp50 = (this->actor.params != ARROW_TYPE_NORMAL_LIT) && (this->actor.params < ARROW_TYPE_DEKU_NUT) &&
+ (this->collider.base.atFlags & AT_HIT);
if (sp50 || (this->unk_262 != 0)) {
- if (this->actor.params >= ENARROW_6) {
+ if (!ARROW_IS_ARROW(this->actor.params)) {
if (sp50) {
this->actor.world.pos.x = (this->actor.world.pos.x + this->actor.prevPos.x) * 0.5f;
this->actor.world.pos.y = (this->actor.world.pos.y + this->actor.prevPos.y) * 0.5f;
this->actor.world.pos.z = (this->actor.world.pos.z + this->actor.prevPos.z) * 0.5f;
}
- if (this->actor.params == ENARROW_8) {
+ if (this->actor.params == ARROW_TYPE_DEKU_NUT) {
R_TRANS_FADE_FLASH_ALPHA_STEP = -1;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_M_FIRE1, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, 0, 0, this->actor.speed == 0.0f);
@@ -408,12 +408,12 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
} else if (this->unk_262 != 0) {
this->actionFunc = func_8088B630;
Animation_PlayOnce(&this->arrow.skelAnime, &gameplay_keep_Anim_0128BC);
- if (this->actor.params >= ENARROW_0) {
+ if (this->actor.params >= ARROW_TYPE_NORMAL_LIT) {
this->unk_260 = 60;
} else {
this->unk_260 = 20;
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6)) {
+ if (ARROW_IS_MAGICAL(this->actor.params)) {
this->actor.draw = NULL;
}
Actor_PlaySfx(&this->actor, NA_SE_IT_ARROW_STICK_OBJ);
@@ -422,7 +422,7 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
}
} else {
func_8088AA98(this, play);
- if (this->actor.params == ENARROW_7) {
+ if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
if (this->bubble.unk_149 == 0) {
sp78 = sqrtf(SQ(this->actor.speed) + SQ(this->actor.velocity.y));
sp74 = Math_SinS(this->actor.world.rot.y) * this->actor.speed;
@@ -468,12 +468,13 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
if ((this->unk_262 = BgCheck_ProjectileLineTest(&play->colCtx, &this->actor.prevPos, &this->actor.world.pos,
&sp9C, &this->actor.wallPoly, true, true, true, true, &spA8))) {
+ // `func_800B90AC` only returns a boolean, and does not process any code
func_800B90AC(play, &this->actor, this->actor.wallPoly, spA8, &sp9C);
Math_Vec3f_Copy(&this->actor.world.pos, &sp9C);
this->actor.wallBgId = spA8;
}
- if (this->actor.params < ENARROW_6) {
+ if (ARROW_IS_ARROW(this->actor.params)) {
this->actor.shape.rot.x = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
}
}
@@ -512,7 +513,7 @@ void func_8088B630(EnArrow* this, PlayState* play) {
SkelAnime_Update(&this->arrow.skelAnime);
if (this->actor.wallBgId != BG_ACTOR_MAX) {
- BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, this->actor.wallBgId, &this->actor);
+ DynaPolyActor_TransformCarriedActor(&play->colCtx, this->actor.wallBgId, &this->actor);
}
if (DECR(this->unk_260) == 0) {
@@ -540,21 +541,27 @@ void EnArrow_Update(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((this->unk_263 != 0) ||
- ((this->actor.params >= ENARROW_0) && ((this->actor.params == ENARROW_7) || (player->unk_D57 != 0))) ||
+ ((this->actor.params >= ARROW_TYPE_NORMAL_LIT) &&
+ ((this->actor.params == ARROW_TYPE_DEKU_BUBBLE) || (player->unk_D57 != 0))) ||
!Player_InBlockingCsMode(play, player)) {
this->actionFunc(this, play);
}
- if ((this->actor.params >= ENARROW_3) && (this->actor.params < ENARROW_6)) {
- s16 sp44[] = { ACTOR_ARROW_FIRE, ACTOR_ARROW_ICE, ACTOR_ARROW_LIGHT };
+ if (ARROW_IS_MAGICAL(this->actor.params)) {
+ s16 sp44[] = {
+ ACTOR_ARROW_FIRE, // ARROW_MAGIC_FIRE
+ ACTOR_ARROW_ICE, // ARROW_MAGIC_ICE
+ ACTOR_ARROW_LIGHT, // ARROW_MAGIC_LIGHT
+ };
if (this->actor.child == NULL) {
- Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, sp44[this->actor.params - ENARROW_3],
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, sp44[ARROW_GET_MAGIC_FROM_TYPE(this->actor.params)],
this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
- } else if (this->actor.params == ENARROW_0) {
+ } else if (this->actor.params == ARROW_TYPE_NORMAL_LIT) {
func_800B0EB0(play, &this->unk_234, &D_8088C2CC, &D_8088C2D8, &D_8088C2E4, &D_8088C2E8, 100, 0, 8);
}
+
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.prevPos);
}
@@ -579,8 +586,8 @@ void func_8088B88C(PlayState* play, EnArrow* this, EnArrowUnkStruct* arg2) {
}
Matrix_MultVec3f(&sp4C[0], &sp40);
Matrix_MultVec3f(&sp4C[1], &sp34);
- if (this->actor.params < ENARROW_8) {
- sp30 = this->actor.params < ENARROW_6;
+ if (this->actor.params < ARROW_TYPE_DEKU_NUT) {
+ sp30 = ARROW_IS_ARROW(this->actor.params);
if (this->unk_264 == NULL) {
sp30 &= func_80126440(play, &this->collider, &this->unk_244, &sp40, &sp34);
} else if (sp30 && (sp40.x == this->unk_244.tip.x) && (sp40.y == this->unk_244.tip.y) &&
@@ -635,11 +642,11 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
EnArrow* this = THIS;
s32 phi_v0;
- if (this->actor.params < ENARROW_6) {
- func_8012C28C(play->state.gfxCtx);
+ if (ARROW_IS_ARROW(this->actor.params)) {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawLod(play, this->arrow.skelAnime.skeleton, this->arrow.skelAnime.jointTable, NULL, NULL,
&this->actor, this->actor.projectedPos.z < 160.0f ? 0 : 1);
- } else if (this->actor.params == ENARROW_7) {
+ } else if (this->actor.params == ARROW_TYPE_DEKU_BUBBLE) {
s32 spA4 = 255 - (s32)(this->bubble.unk_144 * 4.0f);
f32 spA0 = (this->actor.speed * 0.1f) + 1.0f;
f32 sp9C = (1.0f / spA0);
@@ -693,11 +700,11 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C240(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu2(play->state.gfxCtx);
gSPClearGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
- if (this->actor.params == ENARROW_6) {
+ if (this->actor.params == ARROW_TYPE_SLINGSHOT) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 255, 255, sp63);
sp5C = 50.0f;
@@ -729,7 +736,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
} else if (this->actor.velocity.y != 0.0f) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -737,5 +744,6 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
+
func_8088B88C(play, this, &D_8088C2EC[0]);
}
diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
index 313dd86bb..14d5bef94 100644
--- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
+++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h
@@ -7,17 +7,30 @@ struct EnArrow;
typedef void (*EnArrowActionFunc)(struct EnArrow*, PlayState*);
-enum {
- /* 0 */ ENARROW_0, // Lit arrow
- /* 1 */ ENARROW_1, // Horse arrow
- /* 2 */ ENARROW_2, // Normal arrow
- /* 3 */ ENARROW_3, // Fire arrow
- /* 4 */ ENARROW_4, // Ice arrow
- /* 5 */ ENARROW_5, // Light arrow
- /* 6 */ ENARROW_6, // ?
- /* 7 */ ENARROW_7, // Deku bubble
- /* 8 */ ENARROW_8, // Deku Nut
-};
+typedef enum ArrowType {
+ /* 0 */ ARROW_TYPE_NORMAL_LIT, // Normal arrow lit on fire
+ /* 1 */ ARROW_TYPE_NORMAL_HORSE, // Normal arrow shot while riding a horse
+ /* 2 */ ARROW_TYPE_NORMAL,
+ /* 3 */ ARROW_TYPE_FIRE,
+ /* 4 */ ARROW_TYPE_ICE,
+ /* 5 */ ARROW_TYPE_LIGHT,
+ /* 6 */ ARROW_TYPE_SLINGSHOT,
+ /* 7 */ ARROW_TYPE_DEKU_BUBBLE,
+ /* 8 */ ARROW_TYPE_DEKU_NUT
+} ArrowType;
+
+#define ARROW_IS_MAGICAL(arrowType) (((arrowType) >= ARROW_TYPE_FIRE) && ((arrowType) <= ARROW_TYPE_LIGHT))
+#define ARROW_GET_MAGIC_FROM_TYPE(arrowType) (s32)((arrowType) - ARROW_TYPE_FIRE)
+#define ARROW_IS_ARROW(arrowType) ((arrowType) < ARROW_TYPE_SLINGSHOT)
+
+typedef enum ArrowMagic {
+ /* -1 */ ARROW_MAGIC_INVALID = -1,
+ /* 0 */ ARROW_MAGIC_FIRE = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_FIRE),
+ /* 1 */ ARROW_MAGIC_ICE = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_ICE),
+ /* 2 */ ARROW_MAGIC_LIGHT = ARROW_GET_MAGIC_FROM_TYPE(ARROW_TYPE_LIGHT),
+ /* 3 */ ARROW_MAGIC_DEKU_BUBBLE // Only used in Player. Does not map to ARROW_TYPE_SLINGSHOT
+} ArrowMagic;
+
typedef struct {
/* 0x144 */ SkelAnime skelAnime;
diff --git a/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c b/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
index 630d0e599..e8b74f8ec 100644
--- a/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
+++ b/src/overlays/actors/ovl_En_Attack_Niw/z_en_attack_niw.c
@@ -54,9 +54,9 @@ void EnAttackNiw_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.gravity = 0.0f;
- this->randomTargetCenterOffset.x = randPlusMinusPoint5Scaled(100.0f);
- this->randomTargetCenterOffset.y = randPlusMinusPoint5Scaled(10.0f);
- this->randomTargetCenterOffset.z = randPlusMinusPoint5Scaled(100.0f);
+ this->randomTargetCenterOffset.x = Rand_CenteredFloat(100.0f);
+ this->randomTargetCenterOffset.y = Rand_CenteredFloat(10.0f);
+ this->randomTargetCenterOffset.z = Rand_CenteredFloat(100.0f);
Actor_SetScale(&this->actor, 0.01f);
this->actor.flags &= ~ACTOR_FLAG_1; // Unnecessary: this actor does not start with this flag
@@ -68,7 +68,7 @@ void EnAttackNiw_Destroy(Actor* thisx, PlayState* play) {
EnAttackNiw* this = THIS;
EnNiw* parent = (EnNiw*)this->actor.parent;
- if (this->actor.parent != NULL && this->actor.parent->update != NULL) {
+ if ((this->actor.parent != NULL) && (this->actor.parent->update != NULL)) {
if (parent->attackNiwCount > 0) {
parent->attackNiwCount--;
}
@@ -78,11 +78,11 @@ void EnAttackNiw_Destroy(Actor* thisx, PlayState* play) {
/**
* Summary: instead of using SkelAnime animations AttackNiw modifies head+wings directly to create animations
*
- * EnNiw has its own version of this function, probably copy paste since AttackNiw only uses two animationState (2/5)
+ * EnNiw has its own version of this function, probably copy paste since AttackNiw only uses two animIndex (2/5)
*/
-void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animationState) {
+void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animIndex) {
if (this->unkTimer24C == 0) {
- if (animationState == 0) {
+ if (animIndex == 0) {
this->targetBodyRotY = 0.0f;
} else {
this->targetBodyRotY = -10000.0f;
@@ -92,7 +92,7 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->unkTimer24C = 3;
if ((this->clearRotYToggleTimer % 2) == 0) {
this->targetBodyRotY = 0.0f;
- if (animationState == 0) {
+ if (animIndex == 0) {
this->unkTimer24C = Rand_ZeroFloat(30.0f);
}
}
@@ -102,7 +102,7 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->unkToggle28A++;
this->unkToggle28A &= 1;
- switch (animationState) { // only case 2 and 5 are ever called in AttackNiw
+ switch (animIndex) { // only case 2 and 5 are ever called in AttackNiw
case NIW_ANIM_STILL:
this->targetLeftWingRotZ = 0.0f;
this->targetRightWingRotZ = 0.0f;
@@ -156,6 +156,9 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->targetLeftWingRotY = 10000.0f;
}
break;
+
+ default:
+ break;
}
}
@@ -308,7 +311,7 @@ void EnAttackNiw_AimAtPlayer(EnAttackNiw* this, PlayState* play) {
}
if (this->randomAngleChangeTimer == 50) {
- this->targetRotY = randPlusMinusPoint5Scaled(200.0f) + this->actor.yawTowardsPlayer;
+ this->targetRotY = Rand_CenteredFloat(200.0f) + this->actor.yawTowardsPlayer;
}
Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 2, this->rotStep, 0);
@@ -366,7 +369,9 @@ void EnAttackNiw_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->actionFunc == EnAttackNiw_EnterViewFromOffscreen) {
Actor_MoveWithoutGravity(&this->actor);
@@ -444,7 +449,7 @@ s32 EnAttackNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnAttackNiw_Draw(Actor* thisx, PlayState* play) {
EnAttackNiw* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnAttackNiw_OverrideLimbDraw, NULL, &this->actor);
}
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 ff865d99f..f4a9005f6 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -72,7 +72,7 @@ typedef enum {
/* 10 */ BEAVER_ANIM_TALK_TO_RIGHT,
/* 11 */ BEAVER_ANIM_BOW,
/* 12 */ BEAVER_ANIM_IDLE_FACE_LEFT,
- /* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT,
+ /* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT
} BeaverAnimation;
static AnimationSpeedInfo sAnimationInfo[] = {
@@ -253,7 +253,7 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
if (this->unk_2F8 == 0) {
this->unk_374 |= 2;
}
- SubS_FillCutscenesList(&this->actor, this->unk_3D0, ARRAY_COUNT(this->unk_3D0));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
if (D_80A9913C == NULL) {
D_80A9913C = THIS;
this->unk_374 |= 1;
@@ -273,7 +273,7 @@ void EnAz_Init(Actor* thisx, PlayState* play2) {
this->collider.dim.height *= 1.2f;
this->collider.dim.yShift *= 1.2f;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if ((this->actor.bgCheckFlags & BGCHECKFLAG_WATER) && (this->actor.depthInWater > 22.0f)) {
this->unk_374 |= 0x100;
this->unk_376 |= 0x100;
@@ -595,7 +595,7 @@ void func_80A95CEC(EnAz* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
}
- if (SubS_StartActorCutscene(&this->actor, 0x7C, this->unk_3D0[0], SUBS_CUTSCENE_NORMAL)) {
+ if (SubS_StartCutscene(&this->actor, CS_ID_GLOBAL_TALK, this->csIdList[0], SUBS_CUTSCENE_NORMAL)) {
func_80A97C0C(this, play);
}
}
@@ -649,10 +649,10 @@ void func_80A95F94(EnAz* this, PlayState* play) {
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);
+ if (CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_3D0[0]);
+ CutsceneManager_Queue(this->csIdList[0]);
}
if (Actor_WorldDistXYZToPoint(&this->actor, &this->actor.home.pos) > 20.0f) {
func_800B9010(&this->actor, NA_SE_EV_BEAVER_SWIM_MOTOR - SFX_FLAG);
@@ -672,7 +672,7 @@ void func_80A95FE8(EnAz* this, PlayState* play) {
this->actor.shape.rot.x = 0;
this->actor.gravity = 0.0f;
func_80A97C0C(this, play);
- ActorCutscene_Stop(this->unk_3D0[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
}
Actor_MoveWithGravity(&this->actor);
}
@@ -688,7 +688,8 @@ s32 func_80A9617C(EnAz* this, PlayState* play) {
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)) {
+ if (SubS_StartCutscene(&brother->actor, brother->csIdList[0], CS_ID_GLOBAL_TALK,
+ SUBS_CUTSCENE_NORMAL)) {
brother->unk_374 |= 0x8000;
play->msgCtx.msgMode = 0x44;
ret = 0;
@@ -1398,7 +1399,7 @@ void func_80A97A28(EnAz* this, PlayState* play) {
}
void func_80A97A40(EnAz* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->actor, 0, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->actor, 0, CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
play->msgCtx.msgMode = 0;
play->msgCtx.msgLength = 0;
func_80A97A9C(this, play);
@@ -1660,9 +1661,9 @@ void EnAz_Update(Actor* thisx, PlayState* play2) {
this->unk_39C = 0;
}
if (!(this->unk_374 & 0x1000)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 0x400);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_400);
this->unk_374 &= ~0x1000;
}
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -1783,7 +1784,9 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
EnAz* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->unk_374 & 2) {
@@ -1791,13 +1794,16 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
func_80A98DA4, func_80A98E48, &this->actor);
} else {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sYoungerBrotherEyeTextures[this->unk_37E]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sYoungerBrotherBeltTextures[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.speed > 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);
@@ -1805,7 +1811,7 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
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);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_374 & 2) {
s32 i;
Vec3f sp98;
@@ -1835,7 +1841,7 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
} 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_RotateZS(DEG_TO_BINANG(D_80A993D0[this->unk_384].z), 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));
@@ -1846,12 +1852,13 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_XLU_DISP++, gBeaverYoungerBrotherTailVortexDL);
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_RotateZS(DEG_TO_BINANG(D_80A993D0[this->unk_384].z), 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++, gBeaverYoungerBrotherTailSplashDL);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
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 2a219eb24..a4c1785fe 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.h
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.h
@@ -45,7 +45,7 @@ typedef struct EnAz {
/* 0x3C4 */ s16 unk_3C4;
/* 0x3C6 */ UNK_TYPE1 unk3C6[6];
/* 0x3CC */ s32 getItemId;
- /* 0x3D0 */ s16 unk_3D0[1];
+ /* 0x3D0 */ s16 csIdList[1];
/* 0x3D2 */ u16 unk_3D2;
/* 0x3D4 */ s16 unk_3D4;
/* 0x3D6 */ s16 unk_3D6;
diff --git a/src/overlays/actors/ovl_En_Baba/z_en_baba.c b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
index 3aad703de..e62cc45f4 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
@@ -293,9 +293,9 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK;
- func_80151BB4(play, 0x33);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK);
}
- func_80151BB4(play, 4);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY);
}
}
@@ -511,7 +511,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
} else if (play->sceneId == SCENE_BACKTOWN) {
if ((BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE) &&
(gSaveContext.save.entrance != ENTRANCE(NORTH_CLOCK_TOWN, 7)) &&
- (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F)) {
+ (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != BOMB_SHOP_LADY_PATH_INDEX_NONE)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_40) ||
(gSaveContext.save.time >= CLOCK_TIME(0, 20) && (gSaveContext.save.time < CLOCK_TIME(6, 0)))) {
Actor_Kill(&this->actor);
@@ -550,7 +550,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
this->animIndex = BOMB_SHOP_LADY_ANIM_SWAY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnBaba_DoNothing;
- } else if (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F) {
+ } else if (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != BOMB_SHOP_LADY_PATH_INDEX_NONE) {
this->animIndex = BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnBaba_Walk;
@@ -602,7 +602,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_02);
EnBaba_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
return;
@@ -625,7 +625,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
}
}
} else if (talkState == TEXT_STATE_DONE) {
- if (Message_ShouldAdvance(play) && (play->msgCtx.unk120B1 == 0)) {
+ if (Message_ShouldAdvance(play) && (play->msgCtx.bombersNotebookEventQueueCount == 0)) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_02);
EnBaba_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
}
@@ -728,7 +728,7 @@ void EnBaba_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor), BOMB_SHOP_LADY_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
@@ -748,7 +748,7 @@ void EnBaba_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnBaba_UpdateModel(this, play);
}
@@ -810,7 +810,7 @@ void EnBaba_Draw(Actor* thisx, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_VISIBLE) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBbaEyeTex));
@@ -821,7 +821,7 @@ void EnBaba_Draw(Actor* thisx, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_DRAW_SHADOW) {
if ((this->animIndex == BOMB_SHOP_LADY_ANIM_KNOCKED_OVER) ||
(this->animIndex == BOMB_SHOP_LADY_ANIM_LYING_DOWN)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos.x = this->actor.world.pos.x + 20.0f;
pos.y = this->actor.world.pos.y;
pos.z = this->actor.world.pos.z + 20.0f;
diff --git a/src/overlays/actors/ovl_En_Baba/z_en_baba.h b/src/overlays/actors/ovl_En_Baba/z_en_baba.h
index 7da0ed054..9618dd3a2 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.h
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.h
@@ -12,6 +12,8 @@ typedef void (*EnBabaActionFunc)(struct EnBaba*, PlayState*);
#define BOMB_SHOP_LADY_GET_PATH_INDEX(thisx) (((thisx)->params & 0x3F00) >> 8)
#define BOMB_SHOP_LADY_GET_TYPE(thisx) (((thisx)->params & 0xC000) >> 0xE)
+#define BOMB_SHOP_LADY_PATH_INDEX_NONE 0x3F
+
// Types BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE and BOMB_SHOP_LADY_TYPE_IDLE can only be used in SCENE_BACKTOWN
// Type BOMB_SHOP_LADY_TYPE_SWAY can be used anywhere except SCENE_BACKTOWN and SCENE_BOMYA
typedef enum {
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 9a71c1864..406270ff8 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -27,18 +27,18 @@ void EnBaguo_UpdateEffects(EnBaguo* this, PlayState* play);
void EnBaguo_DrawEffects(EnBaguo* this, PlayState* play);
typedef enum {
- /* 0x0 */ NEJIRON_ACTION_INACTIVE, // The Nejiron is either underground or emerging from underground
- /* 0x1 */ NEJIRON_ACTION_ACTIVE, // The Nejiron is above ground and actively chasing the player
- /* 0x2 */ NEJIRON_ACTION_RETREATING, // The Nejiron is burrowing back underground
- /* 0x3 */ NEJIRON_ACTION_EXPLODING // The Nejiron has detonated
+ /* 0 */ NEJIRON_ACTION_INACTIVE, // The Nejiron is either underground or emerging from underground
+ /* 1 */ NEJIRON_ACTION_ACTIVE, // The Nejiron is above ground and actively chasing the player
+ /* 2 */ NEJIRON_ACTION_RETREATING, // The Nejiron is burrowing back underground
+ /* 3 */ NEJIRON_ACTION_EXPLODING // The Nejiron has detonated
} NejironAction;
/**
* These directions are relative to the Nejiron.
*/
typedef enum {
- /* 0x0 */ NEJIRON_DIRECTION_RIGHT,
- /* 0x1 */ NEJIRON_DIRECTION_LEFT
+ /* 0 */ NEJIRON_DIRECTION_RIGHT,
+ /* 1 */ NEJIRON_DIRECTION_LEFT
} NejironRollDirection;
ActorInit En_Baguo_InitVars = {
@@ -392,7 +392,9 @@ void EnBaguo_Update(Actor* thisx, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->action != NEJIRON_ACTION_INACTIVE) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
@@ -417,7 +419,7 @@ void EnBaguo_DrawBody(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
@@ -447,9 +449,9 @@ void EnBaguo_InitializeEffect(EnBaguo* this, Vec3f* pos, Vec3f* velocity, Vec3f*
effect->accel = *accel;
effect->scale = scale;
effect->timer = timer;
- effect->rotation.x = (s16)randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.y = (s16)randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.z = (s16)randPlusMinusPoint5Scaled(30000.0f);
+ effect->rotation.x = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rotation.y = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rotation.z = (s16)(s32)Rand_CenteredFloat(0x7530);
return;
}
}
@@ -494,7 +496,7 @@ void EnBaguo_DrawEffects(EnBaguo* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isEnabled) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
index 3021ffbd2..7ff5da288 100644
--- a/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
+++ b/src/overlays/actors/ovl_En_Baisen/z_en_baisen.c
@@ -252,7 +252,9 @@ void EnBaisen_Update(Actor* thisx, PlayState* play) {
}
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetScale(&this->actor, 0.01f);
if (this->unk290) {
func_80BE871C(this);
@@ -279,7 +281,7 @@ s32 EnBaisen_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void EnBaisen_Draw(Actor* thisx, PlayState* play) {
EnBaisen* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBaisen_OverrideLimbDraw, NULL, &this->actor);
}
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 61b060110..acb47b743 100644
--- a/src/overlays/actors/ovl_En_Bat/z_en_bat.c
+++ b/src/overlays/actors/ovl_En_Bat/z_en_bat.c
@@ -4,11 +4,10 @@
* Description: Bad Bat
*/
-#include "prevent_bss_reordering.h"
#include "z_en_bat.h"
#include "objects/object_bat/object_bat.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnBat*)thisx)
@@ -162,11 +161,10 @@ void EnBat_Init(Actor* thisx, PlayState* play) {
EnBat_SetupFlyIdle(this);
while (BAD_BAT_GET_NUMBER_TO_SPAWN(thisx) > 1) {
Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_BAT, thisx->world.pos.x + randPlusMinusPoint5Scaled(200.0f),
- thisx->world.pos.y + randPlusMinusPoint5Scaled(100.0f),
- thisx->world.pos.z + randPlusMinusPoint5Scaled(200.0f), randPlusMinusPoint5Scaled(0x2000),
- 0xFFFF * Rand_ZeroOne(), 0, BAD_BAT_PARAMS(this->switchFlag, this->paramFlags, 0), -1,
- thisx->halfDaysBits, NULL);
+ &play->actorCtx, play, ACTOR_EN_BAT, thisx->world.pos.x + Rand_CenteredFloat(200.0f),
+ thisx->world.pos.y + Rand_CenteredFloat(100.0f), thisx->world.pos.z + Rand_CenteredFloat(200.0f),
+ Rand_CenteredFloat(0x2000), 0xFFFF * Rand_ZeroOne(), 0,
+ BAD_BAT_PARAMS(this->switchFlag, this->paramFlags, 0), CS_ID_NONE, thisx->halfDaysBits, NULL);
BAD_BAT_GET_NUMBER_TO_SPAWN(thisx)--;
}
}
@@ -480,13 +478,15 @@ void EnBat_Update(Actor* thisx, PlayState* play) {
}
if (this->actionFunc == EnBat_DiveAttack) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else if ((this->actionFunc != EnBat_FlyIdle) ||
((this->actor.xzDistToPlayer < 400.0f) && (this->actor.projectedPos.z > 0.0f))) {
if (this->paramFlags & BAD_BAT_PARAMFLAG_0) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 15.0f, 50.0f, UPDBGCHECKINFO_FLAG_4);
}
} else {
Math_Vec3f_Copy(&this->actor.prevPos, &prevPos);
@@ -529,7 +529,7 @@ void EnBat_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gSPMatrix(&gfx[1], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(&gfx[2], gBadBatSetupDL);
gSPDisplayList(&gfx[3], gBadBatBodyDL);
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 c58344400..c1d13be5a 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -32,7 +32,7 @@ void EnBb_Revive(EnBb* this, PlayState* play);
typedef enum {
/* -1 */ BB_BODY_PART_DRAW_STATUS_BROKEN = -1,
/* 0 */ BB_BODY_PART_DRAW_STATUS_ALIVE,
- /* 1 */ BB_BODY_PART_DRAW_STATUS_DEAD,
+ /* 1 */ BB_BODY_PART_DRAW_STATUS_DEAD
} EnBbBodyPartDrawStatus;
ActorInit En_Bb_InitVars = {
@@ -73,7 +73,7 @@ typedef enum {
/* 0x3 */ EN_BB_DMGEFF_ICE_ARROW = 0x3,
/* 0x4 */ EN_BB_DMGEFF_LIGHT_ARROW,
/* 0x5 */ EN_BB_DMGEFF_ZORA_MAGIC,
- /* 0xE */ EN_BB_DMGEFF_HOOKSHOT = 0xE,
+ /* 0xE */ EN_BB_DMGEFF_HOOKSHOT = 0xE
} EnBbDamageEffect;
static DamageTable sDamageTable = {
@@ -585,7 +585,8 @@ void EnBb_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((this->actionFunc != EnBb_Dead) && (this->actionFunc != EnBb_WaitForRevive)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 40.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
this->collider.dim.worldSphere.center.x = this->actor.world.pos.x;
this->collider.dim.worldSphere.center.y = this->actor.world.pos.y + 15.0f;
@@ -681,14 +682,14 @@ void EnBb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnBb_OverrideLimbDraw,
EnBb_PostLimbDraw, &this->actor);
if (this->flameScaleX > 0.0f) {
currentMatrixState = Matrix_GetCurrent();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000),
MTXMODE_APPLY);
Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c
index 1b9538146..d124f0b77 100644
--- a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c
+++ b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.c
@@ -162,7 +162,7 @@ void EnBba01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnBba01_Draw;
this->waitingOnInit = false;
- if (ENBBA01_GET_PATH(&this->actor) == 0x3F) {
+ if (ENBBA01_GET_PATH_INDEX(&this->actor) == ENBBA01_PATH_INDEX_NONE) {
this->actionFunc = EnBba01_FaceFoward;
} else {
this->actionFunc = EnBba01_Walk;
@@ -227,7 +227,7 @@ void EnBba01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1;
- this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH(&this->enHy.actor), 0x3F);
+ this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH_INDEX(&this->enHy.actor), ENBBA01_PATH_INDEX_NONE);
this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnBba01_FinishInit;
@@ -244,7 +244,7 @@ void EnBba01_Update(Actor* thisx, PlayState* play) {
EnBba01_TestIsTalking(this, play);
this->enHy.actionFunc(&this->enHy, play);
- Actor_UpdateBgCheckInfo(play, &this->enHy.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->enHy.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnBba01_UpdateModel(this, play);
func_809CC270(this, play);
}
@@ -261,11 +261,14 @@ s32 EnBba01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (limbIndex == BBA_LIMB_RIGHT_LOWER_ARM_ROOT) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
+
if (limbIndex == BBA_LIMB_RIGHT_LOWER_ARM_ROOT) {
Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->enHy.headRot.y, MTXMODE_APPLY);
@@ -297,8 +300,10 @@ void EnBba01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
if (limbIndex == BBA_LIMB_HEAD) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -318,7 +323,7 @@ void EnBba01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 255, 255, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 55, 55, 255, 0));
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
index 7160594d8..0cc158f2a 100644
--- a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
+++ b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
@@ -7,7 +7,9 @@ struct EnBba01;
typedef void (*EnBba01ActionFunc)(struct EnBba01*, PlayState*);
-#define ENBBA01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENBBA01_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENBBA01_PATH_INDEX_NONE 0x3F
typedef struct EnBba01 {
/* 0x000 */ EnHy enHy;
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 9b04d1e80..d52f12ccf 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -32,7 +32,7 @@ void EnBbfall_Frozen(EnBbfall* this, PlayState* play);
typedef enum {
/* -1 */ BBFALL_BODY_PART_DRAW_STATUS_BROKEN = -1,
/* 0 */ BBFALL_BODY_PART_DRAW_STATUS_ALIVE,
- /* 1 */ BBFALL_BODY_PART_DRAW_STATUS_DEAD,
+ /* 1 */ BBFALL_BODY_PART_DRAW_STATUS_DEAD
} EnBbfallBodyPartDrawStatus;
ActorInit En_Bbfall_InitVars = {
@@ -102,7 +102,7 @@ typedef enum {
/* 0x3 */ EN_BBFALL_DMGEFF_ICE_ARROW = 0x3,
/* 0x4 */ EN_BBFALL_DMGEFF_LIGHT_ARROW,
/* 0x5 */ EN_BBFALL_DMGEFF_ZORA_MAGIC,
- /* 0xE */ EN_BBFALL_DMGEFF_HOOKSHOT = 0xE,
+ /* 0xE */ EN_BBFALL_DMGEFF_HOOKSHOT = 0xE
} EnBbfallDamageEffect;
static DamageTable sDamageTable = {
@@ -211,9 +211,9 @@ void EnBbfall_Thaw(EnBbfall* this, PlayState* play) {
*/
s32 EnBbfall_IsTouchingLava(EnBbfall* this, PlayState* play) {
if (!SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
- u32 floorType = func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ FloorType floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- if ((floorType == 2) || (floorType == 3) || (floorType == 9)) {
+ if ((floorType == FLOOR_TYPE_2) || (floorType == FLOOR_TYPE_3) || (floorType == FLOOR_TYPE_9)) {
return true;
}
}
@@ -340,7 +340,7 @@ void EnBbfall_Fly(EnBbfall* this, PlayState* play) {
// Bounce upwards off the ground
this->actor.velocity.y *= -1.2f;
this->actor.velocity.y = CLAMP(this->actor.velocity.y, 8.0f, 12.0f);
- this->actor.shape.rot.y += (s16)randPlusMinusPoint5Scaled(73728.0f);
+ this->actor.shape.rot.y += (s16)(s32)Rand_CenteredFloat(0x12000);
}
this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
@@ -600,7 +600,8 @@ void EnBbfall_Update(Actor* thisx, PlayState* play) {
if (this->actionFunc != EnBbfall_Dead) {
Actor_MoveWithGravity(&this->actor);
if (this->isBgCheckCollisionEnabled) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 20.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
}
for (i = ARRAY_COUNT(this->flamePos) - 1; i >= 2; i--) {
@@ -717,13 +718,13 @@ void EnBbfall_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnBbfall_OverrideLimbDraw,
EnBbfall_PostLimbDraw, &this->actor);
if (this->flameOpacity > 0) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000),
MTXMODE_APPLY);
Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Bee/z_en_bee.c b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
index ad45c3a66..1c2d1ed0f 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.c
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
@@ -104,7 +104,7 @@ void EnBee_Init(Actor* thisx, PlayState* play) {
sNumLoadedBees++;
this->actor.shape.shadowScale = 12.0f;
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ITEMACTION);
}
@@ -149,7 +149,7 @@ void EnBee_FlyIdle(EnBee* this, PlayState* play) {
Vec3f nextPos;
s32 pad[2];
- if ((this->actor.category != ACTORCAT_ENEMY) && (ActorCutscene_GetCurrentIndex() == -1)) {
+ if ((this->actor.category != ACTORCAT_ENEMY) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
func_800BC154(play, &play->actorCtx, &this->actor, ACTORCAT_ENEMY);
}
@@ -158,9 +158,9 @@ void EnBee_FlyIdle(EnBee* this, PlayState* play) {
nextPos.z += Math_CosS(this->targetYaw) * 30.0f;
if ((this->instanceId % 2) == 0) {
- this->targetYaw += (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ this->targetYaw += (s16)((s32)Rand_CenteredFloat(1000.0f) + 4000);
} else {
- this->targetYaw -= (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ this->targetYaw -= (s16)((s32)Rand_CenteredFloat(1000.0f) + 4000);
}
this->flightHoverOffset += 1000;
@@ -197,10 +197,10 @@ void EnBee_Attack(EnBee* this, PlayState* play) {
yawOffset = (this->instanceId * 0x700) + 0x2000;
for (i = 0; i < 2; i++) {
- rand = randPlusMinusPoint5Scaled(20.0f);
+ rand = Rand_CenteredFloat(20.0f);
nextPos.x += Math_SinS((f32)this->actor.yawTowardsPlayer + this->targetYaw + yawOffset) * (rand + 30.0f);
nextPos.y = (Math_SinS(this->flightHoverOffset) * 10.0f) + (player->actor.floorHeight + 40.0f);
- rand = randPlusMinusPoint5Scaled(20.0f);
+ rand = Rand_CenteredFloat(20.0f);
nextPos.z += Math_CosS((f32)this->actor.yawTowardsPlayer + this->targetYaw + yawOffset) * (rand + 30.0f);
Math_Vec3f_Copy(&this->targetPos[i], &nextPos);
@@ -210,14 +210,12 @@ void EnBee_Attack(EnBee* this, PlayState* play) {
Math_Vec3f_Copy(&nextPos, &this->targetPos[this->posIndex]);
if ((this->instanceId % 2) == 0) {
- this->targetYaw +=
- (this->instanceId * 0x700) + (s32)randPlusMinusPoint5Scaled((this->instanceId * 0x700) * 0.5f);
+ this->targetYaw += (this->instanceId * 0x700) + (s32)Rand_CenteredFloat((this->instanceId * 0x700) * 0.5f);
} else {
- this->targetYaw -=
- (this->instanceId * 0x700) + (s32)randPlusMinusPoint5Scaled((this->instanceId * 0x700) * 0.5f);
+ this->targetYaw -= (this->instanceId * 0x700) + (s32)Rand_CenteredFloat((this->instanceId * 0x700) * 0.5f);
}
- this->flightHoverOffset += (s32)randPlusMinusPoint5Scaled(500.0f) + 1000;
+ this->flightHoverOffset += (s32)Rand_CenteredFloat(500.0f) + 1000;
if (this->targetYaw > 0x10000) {
this->targetYaw = 0;
@@ -271,7 +269,9 @@ void EnBee_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -282,7 +282,7 @@ void EnBee_Update(Actor* thisx, PlayState* play) {
void EnBee_Draw(Actor* thisx, PlayState* play) {
EnBee* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bee/z_en_bee.h b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
index 09d9ef931..b1773a5ca 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.h
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
@@ -9,8 +9,8 @@ struct EnBee;
typedef void (*EnBeeActionFunc)(struct EnBee*, PlayState*);
typedef enum {
- /* 0 */ BEE_BEHAVIOR_IDLE = 0,
- /* 1 */ BEE_BEHAVIOR_ATTACK,
+ /* 0 */ BEE_BEHAVIOR_IDLE,
+ /* 1 */ BEE_BEHAVIOR_ATTACK
} BeeBehaviorType;
typedef struct EnBee {
diff --git a/src/overlays/actors/ovl_En_Bh/z_en_bh.c b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
index da6bc06a3..6d99ada15 100644
--- a/src/overlays/actors/ovl_En_Bh/z_en_bh.c
+++ b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
@@ -59,9 +59,9 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
xzDist = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timer2 == 0) || (xzDist < 100.0f)) {
- this->pos.x = randPlusMinusPoint5Scaled(300.0f) + this->actor.home.pos.x;
- this->pos.y = randPlusMinusPoint5Scaled(100.0f) + this->actor.home.pos.y;
- this->pos.z = randPlusMinusPoint5Scaled(300.0f) + this->actor.home.pos.z;
+ this->pos.x = Rand_CenteredFloat(300.0f) + this->actor.home.pos.x;
+ this->pos.y = Rand_CenteredFloat(100.0f) + this->actor.home.pos.y;
+ this->pos.z = Rand_CenteredFloat(300.0f) + this->actor.home.pos.z;
this->timer2 = Rand_ZeroFloat(50.0f) + 30.0f;
this->step = 0;
}
@@ -85,7 +85,7 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
this->skelanime.playSpeed = 1.0f;
this->timer = Rand_ZeroFloat(70.0f) + 50.0f;
} else if (((this->timer & 7) == 7) && (Rand_ZeroOne() < 0.5f)) {
- this->unk1E4 = randPlusMinusPoint5Scaled(3000.0f);
+ this->unk1E4 = Rand_CenteredFloat(3000.0f);
}
} else {
SkelAnime_Update(&this->skelanime);
@@ -114,7 +114,7 @@ void EnBh_Update(Actor* thisx, PlayState* play) {
void EnBh_Draw(Actor* thisx, PlayState* play) {
EnBh* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateZS(this->unk1E2, MTXMODE_APPLY);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, NULL,
NULL, &this->actor);
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 2ffe6c8ef..1b849799a 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -102,9 +102,9 @@ void EnBigokuta_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->shellCollider, &this->picto.actor, &sShellCylinderInit);
Collider_InitAndSetCylinder(play, &this->bodyCollider, &this->picto.actor, &sBodyCylinderInit);
CollisionCheck_SetInfo(&this->picto.actor.colChkInfo, NULL, &sColChkInfoInit);
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->picto.actor.cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->picto.actor.csId);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02) ||
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE) ||
((this->picto.actor.params != 0xFF) && Flags_GetSwitch(play, this->picto.actor.params))) {
Actor_Kill(&this->picto.actor);
} else {
@@ -129,8 +129,8 @@ void EnBigokuta_Destroy(Actor* thisx, PlayState* play) {
void EnBigokuta_SetupCutsceneCamera(EnBigokuta* this, PlayState* play, Vec3f* subCamAt, Vec3f* subCamEye) {
s16 angle;
- ActorCutscene_Start(this->picto.actor.cutscene, &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_Start(this->picto.actor.csId, &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
Play_SetCameraAtEye(play, this->subCamId, subCamAt, subCamEye);
angle = BINANG_SUB(Actor_WorldYawTowardPoint(&this->picto.actor, subCamEye), this->picto.actor.home.rot.y);
@@ -160,7 +160,7 @@ void EnBigokuta_ResetCamera(EnBigokuta* this, PlayState* play) {
subCam = Play_GetCamera(play, this->subCamId);
Play_SetCameraAtEye(play, CAM_ID_MAIN, &subCam->at, &subCam->eye);
this->subCamId = SUB_CAM_ID_DONE;
- ActorCutscene_Stop(this->picto.actor.cutscene);
+ CutsceneManager_Stop(this->picto.actor.csId);
}
}
@@ -267,15 +267,15 @@ void EnBigokuta_IdleAboveWater(EnBigokuta* this, PlayState* play) {
}
void EnBigokuta_UpdateOrSetupCam(EnBigokuta* this, PlayState* play) {
- if (this->picto.actor.cutscene != -1) {
+ if (this->picto.actor.csId != CS_ID_NONE) {
if (this->subCamId != SUB_CAM_ID_DONE) {
EnBigokuta_MoveCamera(this, play);
- } else if (ActorCutscene_GetCanPlayNext(this->picto.actor.cutscene)) {
+ } else if (CutsceneManager_IsNext(this->picto.actor.csId)) {
Camera* mainCam = Play_GetCamera(play, CAM_ID_MAIN);
EnBigokuta_SetupCutsceneCamera(this, play, &mainCam->at, &mainCam->eye);
} else {
- ActorCutscene_SetIntentToPlay(this->picto.actor.cutscene);
+ CutsceneManager_Queue(this->picto.actor.csId);
}
}
}
@@ -289,7 +289,7 @@ void EnBigokuta_SetupSuckInPlayer(EnBigokuta* this, PlayState* play) {
this->timer = 0;
Animation_Change(&this->skelAnime, &gBigOctoIdleAnim, 1.0f, 12.0f, 12.0f, ANIMMODE_ONCE, -3.0f);
- ActorCutscene_SetIntentToPlay(this->picto.actor.cutscene);
+ CutsceneManager_Queue(this->picto.actor.csId);
this->playerHoldPos.x = (Math_SinS(this->picto.actor.shape.rot.y) * 66.0f) + this->picto.actor.world.pos.x;
this->playerHoldPos.y = (this->picto.actor.home.pos.y - 49.5f) + 42.899998f;
@@ -355,7 +355,7 @@ void EnBigokuta_HoldPlayer(EnBigokuta* this, PlayState* play) {
}
void EnBigokuta_SetupDeathCutscene(EnBigokuta* this) {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->timer = 0;
this->bodyCollider.base.acFlags &= ~AC_ON;
this->actionFunc = EnBigokuta_PlayDeathCutscene;
@@ -374,11 +374,11 @@ void EnBigokuta_PlayDeathCutscene(EnBigokuta* this, PlayState* play) {
Actor_SpawnIceEffects(play, &this->picto.actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.5f, 0.35f);
EnBigokuta_SetupDeathEffects(this);
}
- } else if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->picto.actor);
+ } else if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->picto.actor);
if (!CHECK_EVENTINF(EVENTINF_41) && !CHECK_EVENTINF(EVENTINF_35)) {
- func_800B724C(play, &this->picto.actor, PLAYER_CSMODE_7);
+ func_800B724C(play, &this->picto.actor, PLAYER_CSMODE_WAIT);
} else {
player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
@@ -390,7 +390,7 @@ void EnBigokuta_PlayDeathCutscene(EnBigokuta* this, PlayState* play) {
EnBigokuta_SetupDeathEffects(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -436,9 +436,9 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
bubblePos.y = this->picto.actor.world.pos.y;
for (i = 0; i < 20; i++) {
- bubbleVel.x = randPlusMinusPoint5Scaled(10.0f);
+ bubbleVel.x = Rand_CenteredFloat(10.0f);
bubbleVel.y = Rand_ZeroFloat(5.5f) + 5.5f;
- bubbleVel.z = randPlusMinusPoint5Scaled(10.0f);
+ bubbleVel.z = Rand_CenteredFloat(10.0f);
bubblePos.x = this->picto.actor.world.pos.x + (2.0f * bubbleVel.x);
bubblePos.z = this->picto.actor.world.pos.z + (2.0f * bubbleVel.z);
@@ -450,11 +450,11 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
Flags_SetSwitch(play, this->picto.actor.params);
}
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
Actor_Kill(&this->picto.actor);
if (!CHECK_EVENTINF(EVENTINF_41) && !CHECK_EVENTINF(EVENTINF_35)) {
- func_800B724C(play, &this->picto.actor, PLAYER_CSMODE_6);
+ func_800B724C(play, &this->picto.actor, PLAYER_CSMODE_END);
} else {
Player* player = GET_PLAYER(play);
@@ -604,7 +604,7 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
MTXMODE_APPLY);
}
} else if (this->actionFunc == EnBigokuta_SuckInPlayer) {
- f32 sin = sin_rad(this->timer * (M_PI / 3.0f)) * 0.5f;
+ f32 sin = Math_SinF(this->timer * (M_PI / 3.0f)) * 0.5f;
Matrix_Scale(((this->timer * (2 / 90.0f)) * (0.5f + sin)) + 1.0f,
((this->timer * (2 / 90.0f)) * (0.5f - sin)) + 1.0f, 1.0f - ((this->timer * 0.3f) / 9.0f),
@@ -613,7 +613,7 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
if (this->timer == 0) {
Matrix_Scale(0.9f, 0.9f, 1.15f, MTXMODE_APPLY);
} else if (this->timer > 0) {
- f32 sin = sin_rad(this->timer * (M_PI / 3.0f)) * 0.5f;
+ f32 sin = Math_SinF(this->timer * (M_PI / 3.0f)) * 0.5f;
Matrix_Scale(((0.5f + sin) * 0.2f) + 1.0f, ((0.5f - sin) * 0.2f) + 1.0f, 0.7f, MTXMODE_APPLY);
} else {
@@ -657,10 +657,11 @@ void EnBigokuta_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
if ((this->actionFunc != EnBigokuta_PlayDeathEffects) || (this->timer != 0)) {
Scene_SetRenderModeXlu(play, 0, 1);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, 255);
POLY_OPA_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -668,7 +669,7 @@ void EnBigokuta_Draw(Actor* thisx, PlayState* play) {
} else {
Scene_SetRenderModeXlu(play, 1, 2);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 0, 0, 0, (this->picto.actor.scale.y * 7727.273f));
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
index 6bcfa79fb..41ae325e0 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.h
@@ -16,7 +16,7 @@ typedef struct EnBigokuta {
/* 0x190 */ u8 drawDmgEffType;
/* 0x192 */ s16 timer;
/* 0x194 */ s16 subCamId;
- /* 0x196 */ s16 cutscene;
+ /* 0x196 */ s16 csId;
/* 0x198 */ Vec3s jointTable[BIGOKUTA_LIMB_MAX];
/* 0x210 */ Vec3s morphTable[BIGOKUTA_LIMB_MAX];
/* 0x288 */ f32 drawDmgEffAlpha;
diff --git a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
index 74fbbfc51..3daaf1f85 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
@@ -267,7 +267,7 @@ void func_80A27B58(EnBigpamet* this) {
this->unk_2A2 = 40;
for (ptr = &this->unk_2FC[0], i = 0; i < ARRAY_COUNT(this->unk_2FC); i++, ptr++) {
- temp_s1 = (s32)randPlusMinusPoint5Scaled(20480.0f) + this->actor.wallYaw;
+ temp_s1 = (s32)Rand_CenteredFloat(0x5000) + this->actor.wallYaw;
temp_s2 = Rand_S16Offset(0x1000, 0x3000);
temp_fs2 = Math_SinS(temp_s2);
@@ -342,7 +342,7 @@ void func_80A27FE8(EnBigpamet* this, PlayState* play) {
pos.y += 8.0f;
if (this->actionFunc != func_80A28D0C) {
- sp32 = (s32)randPlusMinusPoint5Scaled(0x8000) + this->actor.world.rot.y;
+ sp32 = (s32)Rand_CenteredFloat(0x8000) + this->actor.world.rot.y;
pos.x -= 55.0f * Math_SinS(sp32);
pos.z -= 55.0f * Math_CosS(sp32);
}
@@ -540,13 +540,13 @@ void func_80A287E8(EnBigpamet* this, PlayState* play) {
}
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
this->actor.velocity.y = this->unk_29E * 0.375f;
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 15, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 10);
+ Quake_SetPerturbations(quakeIndex, 15, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 10);
Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
@@ -759,7 +759,9 @@ void EnBigpamet_Update(Actor* thisx, PlayState* play) {
if ((this->actionFunc != func_80A281DC) && (this->actionFunc != func_80A282C8)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 50.0f, 60.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 50.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
func_80A276F4(this);
Actor_SetFocus(&this->actor, 25.0f);
@@ -788,7 +790,7 @@ void func_80A292A8(EnBigpamet* this, PlayState* play) {
if (this->unk_2A2 > 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -832,7 +834,7 @@ void EnBigpamet_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80A29754[this->unk_29C]);
@@ -872,7 +874,7 @@ void EnBigpamet_PostLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
void func_80A2966C(Actor* thisx, PlayState* play) {
EnBigpamet* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime1.skeleton, this->skelAnime1.jointTable, this->skelAnime1.dListCount,
EnBigpamet_OverrideLimbDraw1, EnBigpamet_PostLimbDraw1, &this->actor);
func_80A292A8(this, play);
diff --git a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
index bb9d29280..a3561c33b 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
@@ -8,10 +8,10 @@ struct EnBigpamet;
typedef void (*EnBigpametActionFunc)(struct EnBigpamet*, PlayState*);
-enum {
+typedef enum {
/* 0 */ ENBIGPAMET_0,
- /* 1 */ ENBIGPAMET_1,
-};
+ /* 1 */ ENBIGPAMET_1
+} EnBigpametParam;
typedef struct {
/* 0x00 */ Vec3f unk_00;
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 db124dc97..762141ed4 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -8,7 +8,7 @@
#include "objects/object_bigpo/object_bigpo.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnBigpo*)thisx)
@@ -293,22 +293,22 @@ void EnBigpo_WellWaitForProximity(EnBigpo* this, PlayState* play) {
}
void EnBigpo_SetupSpawnCutscene(EnBigpo* this) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = EnBigpo_WaitCutsceneQueue;
}
void EnBigpo_WaitCutsceneQueue(EnBigpo* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
- func_800B724C(play, &this->actor, PLAYER_CSMODE_7);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_WAIT);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
if (this->actor.params == ENBIGPO_REGULAR) { // and SUMMONED, got switched earlier
EnBigpo_SpawnCutsceneStage1(this, play);
} else { // ENBIGPO_REVEALEDFIRE
EnBigpo_SetupFlameCirclePositions(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -375,7 +375,6 @@ void EnBigpo_SpawnCutsceneStage4(EnBigpo* this, PlayState* play) {
this->actor.shape.rot.y += this->rotVelocity;
EnBigpo_RotateSpawnCutsceneFires(this);
- if (1) {}
for (i = 0; i < ARRAY_COUNT(this->fires); i++) {
this->fires[i].pos.y += this->actor.velocity.y;
}
@@ -464,14 +463,14 @@ void EnBigpo_SpawnCutsceneStage8(EnBigpo* this, PlayState* play) {
dampe = SubS_FindActor(play, NULL, ACTORCAT_NPC, ACTOR_EN_TK);
if (dampe != NULL) {
// if dampe exists, switch to viewing his running away cutscene
- dampe->params = this->actor.cutscene;
+ dampe->params = this->actor.csId;
} else {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
} else { // ENBIGPO_REGULAR
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
- func_800B724C(play, &this->actor, PLAYER_CSMODE_6);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_END);
EnBigpo_SetupIdleFlying(this); // setup idle flying
}
}
@@ -555,7 +554,7 @@ void EnBigpo_IdleFlying(EnBigpo* this, PlayState* play) {
// flight position calculations
this->hoverHeightCycleTimer = (this->hoverHeightCycleTimer == 0) ? 40 : (this->hoverHeightCycleTimer - 1);
Math_StepToF(&this->savedHeight, player->actor.world.pos.y + 100.0f, 1.5f);
- this->actor.world.pos.y = (sin_rad(this->hoverHeightCycleTimer * (M_PI / 20)) * 10.0f) + this->savedHeight;
+ this->actor.world.pos.y = (Math_SinF(this->hoverHeightCycleTimer * (M_PI / 20)) * 10.0f) + this->savedHeight;
Math_StepToF(&this->actor.speed, 3.0f, 0.2f);
func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
@@ -828,7 +827,7 @@ void EnBigpo_ScoopSoulIdle(EnBigpo* this, PlayState* play) {
EnBigpo_SetupScoopSoulLeaving(this);
} else {
Actor_OfferGetItem(&this->actor, play, GI_MAX, 35.0f, 60.0f);
- this->actor.world.pos.y = (sin_rad(this->idleTimer * (M_PI / 20)) * 5.0f) + this->savedHeight;
+ this->actor.world.pos.y = (Math_SinF(this->idleTimer * (M_PI / 20)) * 5.0f) + this->savedHeight;
}
}
@@ -861,7 +860,7 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
// count the number of possible fires we can find (4 in vanilla)
for (enemyPtr = GET_FIRST_ENEMY(play); enemyPtr != NULL; enemyPtr = enemyPtr->next) {
- if (enemyPtr->id == ACTOR_EN_BIGPO && enemyPtr->params == ENBIGPO_POSSIBLEFIRE) {
+ if ((enemyPtr->id == ACTOR_EN_BIGPO) && (enemyPtr->params == ENBIGPO_POSSIBLEFIRE)) {
fireCount++;
}
}
@@ -882,7 +881,7 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
randomIndex = ((s32)Rand_ZeroFloat(fireCount)) % fireCount;
while (enemyPtr != NULL) {
- if (enemyPtr->id == ACTOR_EN_BIGPO && enemyPtr->params == ENBIGPO_POSSIBLEFIRE) {
+ if ((enemyPtr->id == ACTOR_EN_BIGPO) && (enemyPtr->params == ENBIGPO_POSSIBLEFIRE)) {
if (randomIndex == 0) {
randomFirePo = (EnBigpo*)enemyPtr;
randomFirePo->actor.params = ENBIGPO_CHOSENFIRE;
@@ -1174,7 +1173,7 @@ void EnBigpo_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
}
if (this->actionFunc == EnBigpo_LanternFalling) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 27.0f, 60.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 27.0f, 60.0f, UPDBGCHECKINFO_FLAG_4);
}
if (this->actor.draw == EnBigpo_DrawScoopSoul) {
@@ -1225,8 +1224,8 @@ s32 EnBigpo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
Gfx** gfx) {
EnBigpo* this = THIS;
// not fully invisible
- if (!(this->mainColor.a != 0 && limbIndex != 7) ||
- (this->actionFunc == EnBigpo_BurnAwayDeath && this->idleTimer >= 2)) {
+ if ((this->mainColor.a == 0) || (limbIndex == 7) ||
+ ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2))) {
*dList = NULL;
}
return false;
@@ -1291,7 +1290,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, PlayState* play) {
if ((this->mainColor.a == 255) || (this->mainColor.a == 0)) {
// fully visible OR fully transparent
dispHead = POLY_OPA_DISP;
- gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(dispHead, gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0C, &D_801AEFA0); // empty display list for no transparency
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(play->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
@@ -1301,7 +1300,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, PlayState* play) {
} else {
dispHead = POLY_XLU_DISP;
- gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(dispHead, gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0C, &D_801AEF88); // transparency display list
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(play->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
@@ -1330,7 +1329,7 @@ void EnBigpo_DrawScoopSoul(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (play->gameplayFrames * -15) % 512, 0x20,
@@ -1382,7 +1381,7 @@ void EnBigpo_DrawLantern(Actor* thisx, PlayState* play) {
dispHead = POLY_XLU_DISP;
}
- gSPDisplayList(&dispHead[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dispHead[0], gSetupDLs[SETUPDL_25]);
gSPSegment(&dispHead[1], 0x0A, Gfx_EnvColor(play->state.gfxCtx, 160, 0, 255, this->mainColor.a));
@@ -1416,9 +1415,10 @@ void EnBigpo_DrawCircleFlames(Actor* thisx, PlayState* play) {
s32 i;
mtfxPtr = Matrix_GetCurrent();
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS(BINANG_ROT180(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))), MTXMODE_NEW);
if (this->actionFunc == EnBigpo_SpawnCutsceneStage6) {
Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);
@@ -1458,7 +1458,7 @@ void EnBigpo_RevealedFire(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (play->gameplayFrames * -20) % 512, 0x20,
diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
index 9b84784f4..b532d6d08 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
@@ -53,16 +53,16 @@ typedef struct EnBigpo {
/* 0x338 */ EnBigpoFireEffect fires[3];
} EnBigpo; // size = 0x398
-// well ver is regular, dampe basement ver is summoned
-// on spawn, 3/possible fires are turned into chosenfire
-enum EnBigpoType {
+// well version is "regular" (spawns automatically), dampe basement version is "summoned"
+// on room enter, 3 "possiblefire" are turned into "chosenfire" at random
+typedef enum EnBigpoType {
/* 0 */ ENBIGPO_REGULAR,
/* 1 */ ENBIGPO_SUMMONED,
/* 2 */ ENBIGPO_POSSIBLEFIRE,
/* 3 */ ENBIGPO_CHOSENFIRE,
/* 4 */ ENBIGPO_REVEALEDFIRE,
- /* 5 */ ENBIGPO_UNK5,
-};
+ /* 5 */ ENBIGPO_UNK5
+} EnBigpoType;
#define BIGPO_GET_SWITCHFLAGS(thisx) (u8)((thisx)->params >> 0x8)
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 803aafc3b..695ac9153 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -254,7 +254,7 @@ typedef enum {
/* 0x5 */ BIGSLIME_DMGEFF_ELECTRIC_STUN,
/* 0xD */ BIGSLIME_DMGEFF_DEKU_STUN = 0xD,
/* 0xE */ BIGSLIME_DMGEFF_HOOKSHOT,
- /* 0xF */ BIGSLIME_DMGEFF_BREAK_ICE,
+ /* 0xF */ BIGSLIME_DMGEFF_BREAK_ICE
} BigslimeDamageEffect;
static DamageTable sDamageTable = {
@@ -347,7 +347,7 @@ void EnBigslime_Init(Actor* thisx, PlayState* play2) {
return;
}
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->actor.scale.x = this->actor.scale.z = 0.15f;
this->actor.scale.y = 0.075f;
this->vtxScaleX = this->vtxScaleZ = 0.015000001f;
@@ -657,7 +657,7 @@ void EnBigslime_AddWavySurface(EnBigslime* this) {
randFloat = (Rand_ZeroOne() * 40.0f) + 50.0f;
}
- this->vtxSurfacePerturbation[i] = sin_rad((randInt + i) * (M_PI / 3)) * randFloat * 0.001f;
+ this->vtxSurfacePerturbation[i] = Math_SinF((randInt + i) * (M_PI / 3)) * randFloat * 0.001f;
}
}
@@ -673,7 +673,7 @@ void EnBigslime_UpdateWavySurface(EnBigslime* this) {
}
this->wavySurfaceTimer--;
- vtxSurfaceWave = sin_rad(this->wavySurfaceTimer * (M_PI / 12));
+ vtxSurfaceWave = Math_SinF(this->wavySurfaceTimer * (M_PI / 12));
for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
staticVtx = &sBigslimeStaticVtx[i];
dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
@@ -692,9 +692,9 @@ void EnBigslime_InitFallMinislime(EnBigslime* this) {
for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
minislime = this->minislime[i];
minislime->actor.params = MINISLIME_INIT_FALL;
- minislime->actor.world.pos.x = randPlusMinusPoint5Scaled(80.0f) + (GBT_ROOM_5_MIN_X + ((i % 4) + 1) * 192.0f);
+ minislime->actor.world.pos.x = Rand_CenteredFloat(80.0f) + (GBT_ROOM_5_MIN_X + ((i % 4) + 1) * 192.0f);
minislime->actor.world.pos.y = Rand_ZeroFloat(250.0f) + (GBT_ROOM_5_CENTER_Y + 50.0f);
- minislime->actor.world.pos.z = randPlusMinusPoint5Scaled(80.0f) + (GBT_ROOM_5_MIN_Z + ((i / 4) + 1) * 192.0f);
+ minislime->actor.world.pos.z = Rand_CenteredFloat(80.0f) + (GBT_ROOM_5_MIN_Z + ((i / 4) + 1) * 192.0f);
}
this->minislimeState = MINISLIME_ACTIVE_INIT_STATE;
@@ -742,11 +742,11 @@ void EnBigslime_EndThrowMinislime(EnBigslime* this) {
void EnBigslime_BreakIntoMinislime(EnBigslime* this, PlayState* play) {
s32 i;
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 15, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 15);
+ Quake_SetPerturbations(quakeIndex, 15, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 15);
Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100);
@@ -847,9 +847,9 @@ void EnBigslime_EndCutscene(EnBigslime* this, PlayState* play) {
subCam = Play_GetCamera(play, this->subCamId);
Play_SetCameraAtEye(play, CAM_ID_MAIN, &subCam->at, &subCam->eye);
this->subCamId = SUB_CAM_ID_DONE;
- ActorCutscene_Stop(this->cutscene);
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- func_800B724C(play, &this->actor, PLAYER_CSMODE_6);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_END);
}
}
@@ -986,7 +986,7 @@ void EnBigslime_SetupCallMinislime(EnBigslime* this, PlayState* play) {
Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoCallAnim, 5.0f);
EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_GREET);
this->callTimer = 0;
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = EnBigslime_CallMinislime;
}
@@ -1169,7 +1169,7 @@ void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
s32 j;
for (i = 0; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- vtxY = (((cos_rad(i * (M_PI / 6)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
+ vtxY = (((Math_CosF(i * (M_PI / 6)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1188,7 +1188,7 @@ void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
}
for (; i < BIGSLIME_NUM_RING_VTX; i++) {
- vtxY = ((cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 16)) * 0.05f) + -1.0f) * BIGSLIME_RADIUS_F;
+ vtxY = ((Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 16)) * 0.05f) + -1.0f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1301,7 +1301,7 @@ void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this) {
sBigslimeTargetVtx[0].n.ob[2] = 0;
for (i = 1; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- upperSphereCos = (((cos_rad((i - 1) * (M_PI / 5)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
+ upperSphereCos = (((Math_CosF((i - 1) * (M_PI / 5)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1318,7 +1318,7 @@ void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this) {
}
for (; i < BIGSLIME_NUM_RING_FACES; i++) {
- lowerSphereCos = cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / BIGSLIME_NUM_RING_FACES));
+ lowerSphereCos = Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / BIGSLIME_NUM_RING_FACES));
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1361,7 +1361,7 @@ void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this) {
sBigslimeTargetVtx[0].n.ob[2] = 0;
for (i = 1; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- upperSphereCos = cos_rad((i - 1) * (M_PI / 10));
+ upperSphereCos = Math_CosF((i - 1) * (M_PI / 10));
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1374,7 +1374,7 @@ void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this) {
for (; i < BIGSLIME_NUM_RING_FACES; i++) {
lowerSphereCos =
- (((cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 5)) + 1) * 0.925f) + -1.0f) * BIGSLIME_RADIUS_F;
+ (((Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 5)) + 1) * 0.925f) + -1.0f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1614,7 +1614,7 @@ void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, PlayState* play) {
if (this->numGekkoMeleeAttacks == 0) {
this->numGekkoPosGrabPlayer--;
- if ((gSaveContext.save.playerData.health < 5) || (this->numGekkoPosGrabPlayer == 0)) {
+ if ((gSaveContext.save.saveInfo.playerData.health < 5) || (this->numGekkoPosGrabPlayer == 0)) {
this->numGekkoPosGrabPlayer = 0;
this->gekkoRot.y = this->actor.world.rot.y;
this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * -50.0f;
@@ -1692,7 +1692,7 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
EnBigslime_UpdateCameraGrabPlayer(this, play);
if (this->windupPunchTimer > 0) {
invWindupPunchTimer = 1.0f / this->windupPunchTimer;
- scale = cos_rad(this->windupPunchTimer * (M_PI / 27)) + 1.0f;
+ scale = Math_CosF(this->windupPunchTimer * (M_PI / 27)) + 1.0f;
player->actor.world.pos.y = this->actor.world.pos.y + (this->actor.scale.y * -500.0f);
// Linearly interpolate gekkoRot.y --> this->actor.world.rot.y
@@ -1705,7 +1705,7 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_PUNCH1);
}
- scale = 0.5f - cos_rad(-this->windupPunchTimer * (M_PI / 5)) * 0.5f;
+ scale = 0.5f - Math_CosF(-this->windupPunchTimer * (M_PI / 5)) * 0.5f;
if (this->windupPunchTimer == -5) {
if (player->stateFlags2 & PLAYER_STATE2_80) {
player->actor.parent = NULL;
@@ -1879,7 +1879,7 @@ void EnBigslime_Freeze(EnBigslime* this, PlayState* play) {
if (vtxIceSeed < BIGSLIME_NUM_VTX) {
dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][vtxIceSeed];
targetVtx = &sBigslimeTargetVtx[vtxIceSeed];
- randFloat = randPlusMinusPoint5Scaled(40.0f);
+ randFloat = Rand_CenteredFloat(40.0f);
dynamicVtx->n.ob[0] += (s16)(randFloat / this->actor.scale.x);
dynamicVtx->n.ob[1] += (s16)(randFloat / this->actor.scale.y);
dynamicVtx->n.ob[2] += (s16)(randFloat / this->actor.scale.z);
@@ -2444,9 +2444,9 @@ void EnBigslime_SetupFrogSpawn(EnBigslime* this, PlayState* play) {
func_800B0DE0(play, &dustPos, &gZeroVec3f, &gZeroVec3f, &dustPrimColor, &dustEnvColor, 500, 50);
for (i = 0; i < 25; i++) {
- hahenVel.x = randPlusMinusPoint5Scaled(5.0f);
+ hahenVel.x = Rand_CenteredFloat(5.0f);
hahenVel.y = Rand_ZeroFloat(3.0f) + 4.0f;
- hahenVel.z = randPlusMinusPoint5Scaled(5.0f);
+ hahenVel.z = Rand_CenteredFloat(5.0f);
EffectSsHahen_Spawn(play, worldPos, &hahenVel, &hahenAccel, 0, Rand_S16Offset(12, 3), HAHEN_OBJECT_DEFAULT, 10,
0);
}
@@ -2464,7 +2464,8 @@ void EnBigslime_FrogSpawn(EnBigslime* this, PlayState* play) {
this->spawnFrogTimer--;
// Zoom the camera in and out at the newly spawned red frog
- subCamZoom = sin_rad(this->spawnFrogTimer * (M_PI / 5)) * ((0.04f * (this->spawnFrogTimer * 0.1f)) + 0.02f) + 1.0f;
+ subCamZoom =
+ Math_SinF(this->spawnFrogTimer * (M_PI / 5)) * ((0.04f * (this->spawnFrogTimer * 0.1f)) + 0.02f) + 1.0f;
subCamEye.x = subCam->at.x + (this->subCamDistToFrog.x * subCamZoom);
subCamEye.z = subCam->at.z + (this->subCamDistToFrog.z * subCamZoom);
subCamEye.y = subCam->at.y + (this->subCamDistToFrog.y * subCamZoom);
@@ -2523,31 +2524,31 @@ void EnBigslime_InitEntrance(EnBigslime* this, PlayState* play) {
}
void EnBigslime_SetupCutscene(EnBigslime* this) {
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
- ActorCutscene_Stop(0x7D);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
}
if (this->actor.colChkInfo.health == 0) {
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFuncStored = this->actionFunc;
this->actionFunc = EnBigslime_PlayCutscene;
this->actor.speed = 0.0f;
}
void EnBigslime_PlayCutscene(EnBigslime* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() == 0x7D) {
- ActorCutscene_Stop(0x7D);
- ActorCutscene_SetIntentToPlay(this->cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ CutsceneManager_Queue(this->csId);
+ } else if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
if (this->actionFuncStored != EnBigslime_SquishFlat) {
- func_800B724C(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_WAIT);
}
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->csId);
if (this->actor.colChkInfo.health == 0) {
EnBigslime_SetupCutsceneDefeat(this, play);
} else if ((this->actionFuncStored == EnBigslime_DamageGekko) ||
@@ -2560,7 +2561,7 @@ void EnBigslime_PlayCutscene(EnBigslime* this, PlayState* play) {
EnBigslime_SetupCutsceneStartBattle(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -2838,7 +2839,9 @@ void EnBigslime_UpdateGekko(Actor* thisx, PlayState* play) {
Actor_MoveWithoutGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 40.0f, 80.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 40.0f, 80.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
this->gekkoCollider.dim.pos.x = (s16)this->actor.world.pos.x;
this->gekkoCollider.dim.pos.z = (s16)this->actor.world.pos.z;
if (this->gekkoCollider.base.acFlags & AC_ON) {
@@ -2882,7 +2885,8 @@ void EnBigslime_SetSysMatrix(Vec3f* pos, PlayState* play, Gfx* shadowDList, f32
zx = 1.0f - (yDistMinY * (1.0f / 1550.0f));
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
sysMatrix->xx = zx;
sysMatrix->yy = 1.0f;
sysMatrix->zz = zx;
@@ -2905,6 +2909,7 @@ void EnBigslime_SetSysMatrix(Vec3f* pos, PlayState* play, Gfx* shadowDList, f32
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, (u8)(alpha * zx));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, shadowDList);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2934,12 +2939,13 @@ void EnBigslime_DrawMinislime(EnBigslime* this, PlayState* play2) {
}
OPEN_DISPS(play->state.gfxCtx);
+
for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
minislime = this->minislime[indices[i]];
lights = LightContext_NewLights(&play->lightCtx, play->state.gfxCtx);
Lights_BindAll(lights, play->lightCtx.listHead, &minislime->actor.world.pos, play);
Lights_Draw(lights, play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&minislime->actor, play, 0);
Matrix_SetTranslateRotateYXZ(minislime->actor.world.pos.x, minislime->actor.world.pos.y,
minislime->actor.world.pos.z, &minislime->actor.shape.rot);
@@ -2961,6 +2967,7 @@ void EnBigslime_DrawMinislime(EnBigslime* this, PlayState* play2) {
minislime->actor.scale.y * 400.0f, minislime->actor.shape.rot.y,
minislime->actor.shape.shadowAlpha * (175.0f / 255.0f));
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -2978,8 +2985,9 @@ void EnBigslime_DrawBigslime(Actor* thisx, PlayState* play) {
MtxF* billboardMtxF;
s32 i;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
+
OPEN_DISPS(play->state.gfxCtx);
// Draw Bigslime
@@ -3016,6 +3024,7 @@ void EnBigslime_DrawBigslime(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, gBigslimeBubbleDL);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
EnBigslime_SetSysMatrix(&this->actor.world.pos, play, gBigslimeShadowDL, this->vtxScaleX, this->vtxScaleZ,
@@ -3068,7 +3077,7 @@ void EnBigslime_DrawGekko(Actor* thisx, PlayState* play) {
EnBigslime* this = THIS;
s32 pad;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc == EnBigslime_DamageGekko) {
func_800AE434(play, &gekkoDamageColor, this->damageSpinTimer, 20);
} else if ((this->actionFunc == EnBigslime_CutsceneDefeat) || (this->actionFunc == EnBigslime_GekkoDespawn)) {
@@ -3121,7 +3130,7 @@ void EnBigslime_DrawShatteringEffects(EnBigslime* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
// Draw Shockwave
if (this->shockwaveAlpha > 0) {
diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
index 52a29013c..8f2b5bee3 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
@@ -66,7 +66,7 @@ typedef struct EnBigslime {
/* 0x02B4 */ u8 shockwaveAlpha;
/* 0x02B5 */ u8 gekkoDrawDmgEffType;
/* 0x02B6 */ s16 gekkoYaw;
- /* 0x02B8 */ s16 cutscene;
+ /* 0x02B8 */ s16 csId;
/* 0x02BA */ union { // multi-use timer
s16 idleTimer;
s16 noticeTimer;
@@ -87,7 +87,7 @@ typedef struct EnBigslime {
s16 isDespawned;
s16 isInitJump;
};
- /* 0x02BC */ s16 wavySurfaceTimer; // decrements from 24, used in sin_rad for currData2
+ /* 0x02BC */ s16 wavySurfaceTimer; // decrements from 24, used in Math_SinF for currData2
/* 0x02BE */ s16 stunTimer;
/* 0x02C0 */ union {
s16 freezeTimer;
diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
index b0c4102c2..745e3b3e7 100644
--- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
+++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c
@@ -337,7 +337,7 @@ void EnBji01_Init(Actor* thisx, PlayState* play) {
this->animIndex = -1;
Actor_SetScale(&this->actor, 0.01f);
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
this->moonsTear = (ObjMoonStone*)SubS_FindActor(play, NULL, ACTORCAT_PROP, ACTOR_OBJ_MOON_STONE);
switch (gSaveContext.save.entrance) {
@@ -373,7 +373,7 @@ void EnBji01_Update(Actor* thisx, PlayState* play) {
s32 pad;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
SkelAnime_Update(&this->skelAnime);
if (this->blinkTimer-- <= 0) {
@@ -434,9 +434,11 @@ void EnBji01_Draw(Actor* thisx, PlayState* play) {
EnBji01* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBji01_OverrideLimbDraw, EnBji01_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
index 29afaf533..84c346a1c 100644
--- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
+++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.h
@@ -31,7 +31,7 @@ typedef struct EnBji01 {
/* 0x2A6 */ s16 headZRotStep;
/* 0x2A8 */ s16 headXRotStep;
/* 0x2AA */ u16 textId;
- /* 0x2AC */ s16 cutscenes[1];
+ /* 0x2AC */ s16 csIdList[1];
/* 0x2B0 */ ObjMoonStone* moonsTear;
} EnBji01; // size = 0x2B4
diff --git a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
index 5ebfca40f..ef5c9c0e2 100644
--- a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
+++ b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
@@ -229,7 +229,7 @@ typedef enum {
/* 1 */ TOILET_HAND_BEHAVIOUR_TAKE_ITEM, // take paper and disappear to use it
/* 2 */ TOILET_HAND_BEHAVIOUR_USE_ITEM, // using paper, flushing
/* 3 */ TOILET_HAND_BEHAVIOUR_REAPPEAR, // reappear with reward
- /* 4 */ TOILET_HAND_BEHAVIOUR_REWARD_GIVEN,
+ /* 4 */ TOILET_HAND_BEHAVIOUR_REWARD_GIVEN
} ToiletHandBehaviour;
// msgevent callback/communication. Follow and choose parts of script to run
@@ -456,7 +456,7 @@ void EnBjt_Draw(Actor* thisx, PlayState* play) {
EnBjt* this = THIS;
if (this->scheduleResult != TOILET_HAND_SCH_NONE) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
index bdc59540b..b388421b7 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.c
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.c
@@ -230,7 +230,7 @@ void EnBom_Move(EnBom* this, PlayState* play) {
Math_StepToF(&this->actor.speed, 0.0f, 0.08f);
} else {
Vec3f* sp58;
- u32 sp54 = func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ FloorType floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
Vec3f slopeNormal;
s16 downwardSlopeYaw;
f32 sp40;
@@ -239,11 +239,11 @@ void EnBom_Move(EnBom* this, PlayState* play) {
sp58 = &D_80872E68[this->isPowderKeg];
- if (sp54 == 5) {
+ if (floorType == FLOOR_TYPE_5) {
sp58 = &D_80872E68[2];
}
- if ((sp54 == 4) || (sp54 == 14) || (sp54 == 15)) {
+ if ((floorType == FLOOR_TYPE_4) || (floorType == FLOOR_TYPE_14) || (floorType == FLOOR_TYPE_15)) {
s16 sp36;
Math_ApproachF(&this->actor.shape.yOffset, 0.0f, 0.1f, 50.0f);
@@ -262,8 +262,8 @@ void EnBom_Move(EnBom* this, PlayState* play) {
sp3C += 3.0f * slopeNormal.z;
sp38 = sqrtf(SQ(sp40) + SQ(sp3C));
- if ((sp38 < this->actor.speed) ||
- (SurfaceType_GetSlope(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 1)) {
+ if ((sp38 < this->actor.speed) || (SurfaceType_GetFloorEffect(&play->colCtx, this->actor.floorPoly,
+ this->actor.floorBgId) == FLOOR_EFFECT_1)) {
if (sp38 > 16.0f) {
this->actor.speed = 16.0f;
} else {
@@ -286,7 +286,7 @@ void EnBom_Move(EnBom* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
Actor_PlaySfx(&this->actor, this->isPowderKeg ? NA_SE_EV_TRE_BOX_BOUND : NA_SE_EV_BOMB_BOUND);
if (this->actor.velocity.y < sp58->y) {
- if ((sp54 == 4) || (sp54 == 14) || (sp54 == 15)) {
+ if ((floorType == FLOOR_TYPE_4) || (floorType == FLOOR_TYPE_14) || (floorType == FLOOR_TYPE_15)) {
this->actor.velocity.y = 0.0f;
} else {
this->actor.velocity.y = this->actor.velocity.y * sp58->z;
@@ -327,7 +327,7 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
static Color_RGBA8 D_80872E90 = { 185, 140, 70, 255 };
static Color_RGBA8 D_80872E94 = { 255, 255, 255, 255 };
s32 i;
- s32 temp_s0;
+ FloorType floorType;
f32 temp_f20;
s32 pad;
f32 spCC;
@@ -348,7 +348,7 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
this->collider2.elements->dim.worldSphere.radius = D_80872E8C[this->isPowderKeg];
if (this->timer == 7) {
- this->collider2.base.atFlags &= ~OC1_TYPE_1;
+ this->collider2.base.atFlags &= ~AT_TYPE_ENEMY;
}
if (this->actor.params == BOMB_TYPE_EXPLOSION) {
@@ -394,11 +394,11 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
spB4.y = this->actor.world.pos.y + 500.0f;
spB4.z = this->actor.world.pos.z + spC0.z;
if (BgCheck_EntityRaycastFloor3(&play->colCtx, &spB0, &spAC, &spB4) != BGCHECK_Y_MIN) {
- temp_s0 = func_800C99D4(&play->colCtx, spB0, spAC);
+ floorType = SurfaceType_GetFloorType(&play->colCtx, spB0, spAC);
temp_f20 = BgCheck_EntityRaycastFloor1(&play->colCtx, &spB0, &spB4);
- if ((temp_s0 == 4) || (temp_s0 == 15) || (temp_s0 == 14)) {
- if (temp_s0 == 4) {
+ if ((floorType == FLOOR_TYPE_4) || (floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
+ if (floorType == FLOOR_TYPE_4) {
sp84 = D_80872E90;
sp80 = D_80872E90;
} else {
@@ -423,8 +423,8 @@ void EnBom_Explode(EnBom* this, PlayState* play) {
}
}
-static s16 D_80872E98[] = { 3, 5 };
-static s16 D_80872E9C[] = { 10, 15 };
+static s16 sQuakeY[] = { 3, 5 };
+static s16 sQuakeDurations[] = { 10, 15 };
void EnBom_Update(Actor* thisx, PlayState* play) {
Vec3f effVelocity = { 0.0f, 0.0f, 0.0f };
@@ -450,7 +450,7 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
this->unk_1FC--;
Math_ApproachZeroF(&thisx->speed, 1.0f, 1.0f);
Actor_MoveWithGravity(thisx);
- Actor_UpdateBgCheckInfo(play, thisx, 35.0f, 10.0f, 36.0f, 4);
+ Actor_UpdateBgCheckInfo(play, thisx, 35.0f, 10.0f, 36.0f, UPDBGCHECKINFO_FLAG_4);
if (this->unk_1FC == 0) {
if (this->isPowderKeg) {
gSaveContext.powderKegTimer = 0;
@@ -476,7 +476,9 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, thisx, 35.0f, 10.0f, 36.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, thisx, 35.0f, 10.0f, 36.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (thisx->params == BOMB_TYPE_BODY) {
static Vec3us D_80872ED4[] = {
{ 40, 20, 100 },
@@ -543,7 +545,8 @@ void EnBom_Update(Actor* thisx, PlayState* play) {
}
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, effPos.x, effPos.y - 10.0f, effPos.z, 0, 0, 0,
this->isPowderKeg);
- func_800BC848(thisx, play, D_80872E98[this->isPowderKeg], D_80872E9C[this->isPowderKeg]);
+ Actor_RequestQuakeAndRumble(thisx, play, sQuakeY[this->isPowderKeg],
+ sQuakeDurations[this->isPowderKeg]);
play->envCtx.lightSettings.diffuseColor1[0] = play->envCtx.lightSettings.diffuseColor1[1] =
play->envCtx.lightSettings.diffuseColor1[2] = 250;
play->envCtx.lightSettings.ambientColor[0] = play->envCtx.lightSettings.ambientColor[1] =
@@ -613,7 +616,7 @@ void EnBom_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->actor.params == BOMB_TYPE_BODY) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Collider_UpdateSpheres(0, &this->collider2);
diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.h b/src/overlays/actors/ovl_En_Bom/z_en_bom.h
index bf568cd6a..d11547230 100644
--- a/src/overlays/actors/ovl_En_Bom/z_en_bom.h
+++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.h
@@ -11,11 +11,17 @@ typedef void (*EnBomActionFunc)(struct EnBom*, PlayState*);
#define ENBOM_GETZ_80(thisx) ((thisx)->shape.rot.z & 0x80)
#define ENBOM_GETZ_FF00(thisx) (((thisx)->shape.rot.z & 0xFF00) >> 8)
-typedef enum {
+typedef enum BombType {
/* 0 */ BOMB_TYPE_BODY,
- /* 1 */ BOMB_TYPE_EXPLOSION,
+ /* 1 */ BOMB_TYPE_EXPLOSION
} BombType;
+// Passed via x rotation
+typedef enum BombExplosiveType {
+ /* 0 */ BOMB_EXPLOSIVE_TYPE_BOMB,
+ /* 1 */ BOMB_EXPLOSIVE_TYPE_POWDER_KEG
+} BombExplosiveType;
+
typedef struct EnBom {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider1;
diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
index 8481b88a9..19f2e1d9b 100644
--- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
+++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c
@@ -93,14 +93,14 @@ void EnBomBowlMan_Init(Actor* thisx, PlayState* play) {
return;
}
- this->unk_29A = ENBOMBOWLMAN_GET_FF00(&this->actor);
- this->path = SubS_GetPathByIndex(play, this->unk_29A, 0x3F);
+ this->pathIndex = ENBOMBOWLMAN_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENBOMBOWLMAN_PATH_INDEX_NONE);
this->unk_2C8 = 80.0f;
if ((gSaveContext.save.entrance == ENTRANCE(EAST_CLOCK_TOWN, 2)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_73_80) &&
!CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- this->unk_2D6 = this->actor.cutscene;
- if (this->unk_2D6 == 0) {
+ this->csId3 = this->actor.csId;
+ if (this->csId3 == 0) {
Actor_Kill(&this->actor);
}
func_809C52B4(this);
@@ -156,7 +156,7 @@ void func_809C4B50(EnBomBowlMan* this) {
}
void func_809C4B6C(EnBomBowlMan* this) {
- if ((this->unk_29A != ENBOMBOWLMAN_FF00_MINUS1) && (this->path != NULL)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
if (!SubS_CopyPointFromPath(this->path, this->unk_298, &this->unk_2A0)) {
Actor_Kill(&this->actor);
}
@@ -173,9 +173,9 @@ void func_809C4BC4(EnBomBowlMan* this, PlayState* play) {
func_809C4B50(this);
func_809C493C(this, 0, 1.0f);
- for (i = 0; i < ARRAY_COUNT(gSaveContext.save.bomberCode); i++) {
+ for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.bomberCode); i++) {
Math_Vec3f_Copy(&sp7C, &this->actor.home.pos);
- code = gSaveContext.save.bomberCode[i];
+ code = gSaveContext.save.saveInfo.bomberCode[i];
if (code == 1) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_809C61A0[i]);
this->unk_2D8[code] = this;
@@ -192,11 +192,11 @@ void func_809C4BC4(EnBomBowlMan* this, PlayState* play) {
}
}
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D0);
- } else if (!ActorCutscene_GetCanPlayNext(this->unk_2D0)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D0);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId1);
+ } else if (!CutsceneManager_IsNext(this->csId1)) {
+ CutsceneManager_Queue(this->csId1);
}
func_809C493C(this, 3, 1.0f);
@@ -214,18 +214,18 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
if (this->unk_2B8 == 0) {
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D0);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId1);
return;
}
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D0)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D0);
+ if (!CutsceneManager_IsNext(this->csId1)) {
+ CutsceneManager_Queue(this->csId1);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D0, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId1, &this->actor);
this->unk_2B8 = 1;
this->unk_2C0 = 0;
this->unk_2D4 = this->actor.yawTowardsPlayer;
@@ -248,7 +248,7 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
case 0:
this->unk_2C0 = 1;
D_809C6104 = 1;
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(this->unk_2D0)),
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csId1)),
&this->unk_2D8[0]->actor);
this->unk_2D4 = 0;
this->unk_2BC = 10;
@@ -268,7 +268,7 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
case 2:
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_2B8 = 2;
- ActorCutscene_Stop(this->unk_2D0);
+ CutsceneManager_Stop(this->csId1);
func_809C59A4(this, play);
sp28 = true;
} else {
@@ -276,13 +276,13 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
play->msgCtx.msgLength = 0;
func_809C493C(this, 1, 1.0f);
D_809C6100 = 1;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D2);
- } else if (!ActorCutscene_GetCanPlayNext(this->unk_2D2)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D2);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId2);
+ } else if (!CutsceneManager_IsNext(this->csId2)) {
+ CutsceneManager_Queue(this->csId2);
}
- ActorCutscene_Stop(this->unk_2D0);
+ CutsceneManager_Stop(this->csId1);
this->actionFunc = func_809C5B1C;
sp28 = true;
}
@@ -299,7 +299,7 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
case 4:
if (this->unk_2B8 != 2) {
- ActorCutscene_Stop(this->unk_2D0);
+ CutsceneManager_Stop(this->csId1);
}
play->msgCtx.msgLength = 0;
func_809C493C(this, 1, 1.0f);
@@ -309,9 +309,9 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
break;
case 5:
- func_80151BB4(play, 0x24);
- func_80151BB4(play, 0x25);
- func_80151BB4(play, 0);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS);
this->actionFunc = func_809C51B4;
sp28 = true;
break;
@@ -330,7 +330,7 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
void func_809C51B4(EnBomBowlMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((play->msgCtx.unk120B1 == 0) &&
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
play->nextEntrance = Entrance_CreateFromSpawn(6);
gSaveContext.nextCutsceneIndex = 0;
@@ -365,7 +365,7 @@ void func_809C5310(EnBomBowlMan* this, PlayState* play) {
if (player->actor.world.pos.x < 1510.0f) {
if (player->transformation != PLAYER_FORM_DEKU) {
if (this->actor.xzDistToPlayer < this->unk_2C8) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
func_809C53A4(this);
}
} else {
@@ -423,7 +423,7 @@ void func_809C5598(EnBomBowlMan* this, PlayState* play) {
} else if (this->actor.textId == 0x734) {
this->actor.textId = 0x715;
} else if (this->actor.textId == 0x715) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
func_809C493C(this, 17, 1.0f);
func_809C59A4(this, play);
return;
@@ -432,10 +432,10 @@ void func_809C5598(EnBomBowlMan* this, PlayState* play) {
} else if (this->actor.textId == 0x735) {
this->unk_2C2 = 0;
func_809C493C(this, 17, 1.0f);
- func_80151BB4(play, 0x24);
- func_80151BB4(play, 0x25);
- func_80151BB4(play, 0);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = func_809C5738;
return;
}
@@ -448,29 +448,29 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) {
s16 yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_2A0);
if (this->unk_2C2 == 0) {
- if ((play->msgCtx.unk120B1 == 0) &&
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
this->unk_2C2 = 1;
func_809C4B6C(this);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
- } else if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId3);
+ } else if (!CutsceneManager_IsNext(this->csId3)) {
+ CutsceneManager_Queue(this->csId3);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId3, &this->actor);
this->unk_2C2 = 2;
func_809C493C(this, 18, 1.0f);
}
}
} else if (this->unk_2C2 == 1) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
- } else if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId3);
+ } else if (!CutsceneManager_IsNext(this->csId3)) {
+ CutsceneManager_Queue(this->csId3);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId3, &this->actor);
this->unk_2C2 = 2;
func_809C493C(this, 18, 1.0f);
}
@@ -485,7 +485,7 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) {
if (this->unk_298 >= this->path->count) {
SET_WEEKEVENTREG(WEEKEVENTREG_84_80);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_04);
- ActorCutscene_Stop(this->unk_2D6);
+ CutsceneManager_Stop(this->csId3);
Actor_Kill(&this->actor);
return;
}
@@ -530,13 +530,13 @@ void func_809C5AA4(EnBomBowlMan* this, PlayState* play) {
}
void func_809C5B1C(EnBomBowlMan* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D2);
- } else if (!ActorCutscene_GetCanPlayNext(this->unk_2D2)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D2);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId2);
+ } else if (!CutsceneManager_IsNext(this->csId2)) {
+ CutsceneManager_Queue(this->csId2);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D2, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId2, &this->actor);
func_809C5BA0(this);
}
}
@@ -574,7 +574,7 @@ void func_809C5BF4(EnBomBowlMan* this, PlayState* play) {
}
if (this->unk_2F4 == 0) {
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(this->unk_2D2));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csId2));
if (D_809C6100 > 5) {
Player* player = GET_PLAYER(play);
@@ -630,7 +630,9 @@ void EnBomBowlMan_Update(Actor* thisx, PlayState* play) {
this->unk_2F2 = (s32)Rand_ZeroFloat(60.0f) + 20;
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
s32 EnBomBowlMan_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
@@ -676,8 +678,8 @@ void EnBomBowlMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_809C6214[this->unk_2F0]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_809C6220[this->unk_2F4]));
diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
index fc911dd04..df515ef4f 100644
--- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
+++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
@@ -9,52 +9,52 @@ typedef void (*EnBomBowlManActionFunc)(struct EnBomBowlMan*, PlayState*);
#define ENBOMBOWLMAN_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBOWLMAN_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
-#define ENBOMBOWLMAN_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+#define ENBOMBOWLMAN_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+
+#define ENBOMBOWLMAN_PATH_INDEX_NONE 0x3F
#define ENBOMBOWLMAN_F0_0 0
#define ENBOMBOWLMAN_F0_2 2
-#define ENBOMBOWLMAN_FF00_MINUS1 -1
-
typedef struct EnBomBowlMan {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ SkelAnime skelAnime;
- /* 0x0188 */ Vec3s jointTable[21];
- /* 0x0206 */ Vec3s morphTable[21];
- /* 0x0284 */ EnBomBowlManActionFunc actionFunc;
- /* 0x0288 */ s16 unk_288;
- /* 0x028A */ s16 unk_28A;
- /* 0x028C */ UNK_TYPE1 unk28C[2];
- /* 0x028E */ s16 unk_28E;
- /* 0x0290 */ s16 unk_290;
- /* 0x0292 */ UNK_TYPE1 unk292[2];
- /* 0x0294 */ Path* path;
- /* 0x0298 */ s16 unk_298;
- /* 0x029A */ s16 unk_29A;
- /* 0x029C */ s16 unk_29C;
- /* 0x029E */ s16 unk_29E;
- /* 0x02A0 */ Vec3f unk_2A0;
- /* 0x02AC */ UNK_TYPE1 unk2AC[0xC];
- /* 0x02B8 */ s16 unk_2B8;
- /* 0x02BA */ s16 unk_2BA;
- /* 0x02BC */ s16 unk_2BC;
- /* 0x02BE */ UNK_TYPE1 unk2BE[2];
- /* 0x02C0 */ s16 unk_2C0;
- /* 0x02C2 */ s16 unk_2C2;
- /* 0x02C4 */ f32 unk_2C4;
- /* 0x02C8 */ f32 unk_2C8;
- /* 0x02CC */ s16 unk_2CC[2];
- /* 0x02D0 */ s16 unk_2D0;
- /* 0x02D2 */ s16 unk_2D2;
- /* 0x02D4 */ s16 unk_2D4;
- /* 0x02D6 */ s16 unk_2D6;
- /* 0x02D8 */ struct EnBomBowlMan* unk_2D8[5];
- /* 0x02EC */ UNK_TYPE1 unk2EC[0x4];
- /* 0x02F0 */ s16 unk_2F0;
- /* 0x02F2 */ s16 unk_2F2;
- /* 0x02F4 */ s16 unk_2F4;
- /* 0x02F6 */ s16 unk_2F6;
- /* 0x02F8 */ s32 unk_2F8;
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ Vec3s jointTable[21];
+ /* 0x206 */ Vec3s morphTable[21];
+ /* 0x284 */ EnBomBowlManActionFunc actionFunc;
+ /* 0x288 */ s16 unk_288;
+ /* 0x28A */ s16 unk_28A;
+ /* 0x28C */ UNK_TYPE1 unk28C[2];
+ /* 0x28E */ s16 unk_28E;
+ /* 0x290 */ s16 unk_290;
+ /* 0x292 */ UNK_TYPE1 unk292[2];
+ /* 0x294 */ Path* path;
+ /* 0x298 */ s16 unk_298;
+ /* 0x29A */ s16 pathIndex;
+ /* 0x29C */ s16 unk_29C;
+ /* 0x29E */ s16 unk_29E;
+ /* 0x2A0 */ Vec3f unk_2A0;
+ /* 0x2AC */ UNK_TYPE1 unk2AC[0xC];
+ /* 0x2B8 */ s16 unk_2B8;
+ /* 0x2BA */ s16 unk_2BA;
+ /* 0x2BC */ s16 unk_2BC;
+ /* 0x2BE */ UNK_TYPE1 unk2BE[2];
+ /* 0x2C0 */ s16 unk_2C0;
+ /* 0x2C2 */ s16 unk_2C2;
+ /* 0x2C4 */ f32 unk_2C4;
+ /* 0x2C8 */ f32 unk_2C8;
+ /* 0x2CC */ s16 csIdList[2];
+ /* 0x2D0 */ s16 csId1;
+ /* 0x2D2 */ s16 csId2;
+ /* 0x2D4 */ s16 unk_2D4;
+ /* 0x2D6 */ s16 csId3;
+ /* 0x2D8 */ struct EnBomBowlMan* unk_2D8[5];
+ /* 0x2EC */ UNK_TYPE1 unk2EC[0x4];
+ /* 0x2F0 */ s16 unk_2F0;
+ /* 0x2F2 */ s16 unk_2F2;
+ /* 0x2F4 */ s16 unk_2F4;
+ /* 0x2F6 */ s16 unk_2F6;
+ /* 0x2F8 */ s32 unk_2F8;
} EnBomBowlMan; // size = 0x2FC
#endif // Z_EN_BOM_BOWL_MAN_H
diff --git a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
index 40e93b861..ee00081db 100644
--- a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
+++ b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
@@ -120,7 +120,7 @@ s32 EnBomChu_UpdateFloorPoly(EnBomChu* this, CollisionPoly* floorPoly, PlayState
return false;
}
- angle = func_80086C48(normDotUp);
+ angle = Math_FAcosF(normDotUp);
if (angle < 0.001f) {
return false;
}
@@ -177,7 +177,7 @@ void EnBomChu_WaitForRelease(EnBomChu* this, PlayState* play) {
} else if (Actor_HasNoParent(&this->actor, play)) {
player = GET_PLAYER(play);
Math_Vec3f_Copy(&this->actor.world.pos, &player->actor.world.pos);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.shape.rot.y = player->actor.shape.rot.y;
this->actor.flags |= ACTOR_FLAG_1;
@@ -193,7 +193,7 @@ void EnBomChu_WaitForRelease(EnBomChu* this, PlayState* play) {
s32 EnBomChu_IsOnCollisionPoly(PlayState* play, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** poly,
s32* bgId) {
if ((BgCheck_EntityLineTest1(&play->colCtx, posA, posB, posResult, poly, true, true, true, true, bgId)) &&
- (!(func_800C9A4C(&play->colCtx, *poly, *bgId) & 0x30))) {
+ !(SurfaceType_GetWallFlags(&play->colCtx, *poly, *bgId) & (WALL_FLAG_4 | WALL_FLAG_5))) {
return true;
}
@@ -326,7 +326,7 @@ void EnBomChu_Explode(EnBomChu* this, PlayState* play) {
s32 i;
bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
this->shouldTimerCountDown = true;
this->isMoving = false;
@@ -408,7 +408,7 @@ void EnBomChu_HandleNonSceneCollision(EnBomChu* this, PlayState* play) {
Math_Vec3f_Copy(&originalWorldPos, &this->actor.world.pos);
Math_Vec3f_Copy(&originalAxisUp, &this->axisUp);
yaw = this->actor.shape.rot.y;
- BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, this->actor.floorBgId, &this->actor);
+ DynaPolyActor_TransformCarriedActor(&play->colCtx, this->actor.floorBgId, &this->actor);
if (yaw != this->actor.shape.rot.y) {
yaw = this->actor.shape.rot.y - yaw;
@@ -542,7 +542,7 @@ void EnBomChu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->timer >= 40) {
diff --git a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
index cccddedfd..ef30692e6 100644
--- a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
+++ b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.c
@@ -66,7 +66,7 @@ void EnBombal_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 6;
this->actor.colChkInfo.health = 1;
this->scale = 0.1f;
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
func_80C05B24(this);
}
@@ -109,16 +109,16 @@ void func_80C05C44(EnBombal* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_73_10) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_85_02)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
return;
}
- if (!ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
phi_s0 = true;
}
} else {
@@ -147,7 +147,7 @@ void func_80C05DE8(EnBombal* this, PlayState* play) {
if (this->timer == 0) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_73_10) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_85_02)) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
}
Actor_Kill(&this->actor);
return;
@@ -249,15 +249,15 @@ void EnBombal_DrawEffects(EnBombal* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
if (sPtr->isEnabled != 0) {
Matrix_Translate(sPtr->pos.x, sPtr->pos.y, sPtr->pos.z, MTXMODE_NEW);
Matrix_Scale(sPtr->scale, sPtr->scale, sPtr->scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(&gSun1Tex));
@@ -269,7 +269,7 @@ void EnBombal_DrawEffects(EnBombal* this, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, sPtr->alpha);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(play->state.frames * 20.0f), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.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++, &gSunSparkleModelDL);
diff --git a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.h b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.h
index 7c72f3eea..67550c59b 100644
--- a/src/overlays/actors/ovl_En_Bombal/z_en_bombal.h
+++ b/src/overlays/actors/ovl_En_Bombal/z_en_bombal.h
@@ -23,7 +23,7 @@ typedef struct EnBombal {
/* 0x144 */ EnBombalActionFunc actionFunc;
/* 0x148 */ s16 timer;
/* 0x14A */ s16 isPopped;
- /* 0x14C */ s16 cutscene;
+ /* 0x14C */ s16 csId;
/* 0x150 */ f32 scale;
/* 0x154 */ f32 oscillationAngle;
/* 0x158 */ ColliderCylinder collider;
diff --git a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
index f96809878..55f7ff281 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
@@ -124,11 +124,11 @@ void EnBombers_Init(Actor* thisx, PlayState* play) {
this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 0);
if (bomBowlMan != NULL) {
- s32 cs = this->actor.cutscene;
+ s32 csId = this->actor.csId;
s32 i = 0;
// clang-format off
- while (cs != -1) { bomBowlMan->unk_2CC[i] = cs; cs = ActorCutscene_GetAdditionalCutscene(cs); i++; }
+ while (csId != CS_ID_NONE) { bomBowlMan->csIdList[i] = csId; csId = CutsceneManager_GetAdditionalCsId(csId); i++; }
// clang-format on
CLEAR_WEEKEVENTREG(WEEKEVENTREG_76_01);
@@ -236,8 +236,8 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
if (this->unk_2A8 == 0) {
Math_Vec3f_Copy(&sp60, &this->actor.home.pos);
- sp60.x += randPlusMinusPoint5Scaled(150.0f);
- sp60.z += randPlusMinusPoint5Scaled(150.0f);
+ sp60.x += Rand_CenteredFloat(150.0f);
+ sp60.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp60)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp60, &sp6C,
@@ -487,7 +487,9 @@ void EnBombers_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.uncullZoneForward = 500.0f;
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -517,8 +519,8 @@ void EnBombers_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C0482C[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C04838[this->unk_2BE]));
diff --git a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
index 85c5ecdb3..1585613ce 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
@@ -10,13 +10,13 @@ typedef void (*EnBombersActionFunc)(struct EnBombers*, PlayState*);
#define ENBOMBERS_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBERS_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
-enum {
+typedef enum {
/* 0 */ ENBOMBERS_F_0,
/* 1 */ ENBOMBERS_F_1,
/* 2 */ ENBOMBERS_F_2,
/* 3 */ ENBOMBERS_F_3,
- /* 4 */ ENBOMBERS_F_4,
-};
+ /* 4 */ ENBOMBERS_F_4
+} EnBombersParam;
#define ENBOMBERS_F0_0 0
diff --git a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
index d479e0745..81e8723e0 100644
--- a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
+++ b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.c
@@ -101,8 +101,8 @@ void EnBombers2_Init(Actor* thisx, PlayState* play) {
this->unk_2AC = 1;
this->actor.world.pos.z += cos;
}
- this->cutscene = this->actor.cutscene;
- if (this->cutscene == 0) {
+ this->csId = this->actor.csId;
+ if (this->csId == 0) {
Actor_Kill(&this->actor);
}
func_80C04B40(this);
@@ -220,7 +220,8 @@ void func_80C04D8C(EnBombers2* this, PlayState* play) {
s32 correctDigits;
for (i = 0; i < ARRAY_COUNT(this->correctDigitSlots); i++) {
- if (!(this->correctDigitSlots[i]) && (play->msgCtx.unk12054[i] == gSaveContext.save.bomberCode[i])) {
+ if (!(this->correctDigitSlots[i]) &&
+ (play->msgCtx.unk12054[i] == gSaveContext.save.saveInfo.bomberCode[i])) {
this->correctDigitSlots[i] = true;
}
}
@@ -308,13 +309,13 @@ void func_80C050B8(EnBombers2* this, PlayState* play) {
void func_80C0520C(EnBombers2* this, PlayState* play) {
if (this->unk_2A8 == 0) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->cutscene) == 0) {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
+ } else if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_2A8 = 1;
}
} else {
@@ -331,7 +332,7 @@ void func_80C0520C(EnBombers2* this, PlayState* play) {
this->unk_2A8 = 0;
this->unk_2C0 = 1;
SET_WEEKEVENTREG(WEEKEVENTREG_73_80);
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->unk_2AC = 1;
this->actor.textId = sTextIds[this->textIdIndex];
Message_StartTextbox(play, this->actor.textId, &this->actor);
@@ -400,7 +401,9 @@ void EnBombers2_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if (this->unk_2AC == 0) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
Math_Vec3f_Copy(&this->actor.world.pos, &sp34);
}
@@ -422,12 +425,12 @@ s32 func_80C056D4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
}
void EnBombers2_Draw(Actor* thisx, PlayState* play) {
-
EnBombers2* this = THIS;
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C05920));
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(sSetPrimColorDlPtr));
diff --git a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h
index 4a79e6615..9e6f6b577 100644
--- a/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h
+++ b/src/overlays/actors/ovl_En_Bombers2/z_en_bombers2.h
@@ -27,7 +27,7 @@ typedef struct EnBombers2 {
/* 0x2A8 */ s32 unk_2A8;
/* 0x2AC */ u8 unk_2AC;
/* 0x2AE */ s16 animIndex;
- /* 0x2B0 */ s16 cutscene;
+ /* 0x2B0 */ s16 csId;
/* 0x2B2 */ s16 unk_2B2;
/* 0x2B4 */ s16 unk_2B4;
/* 0x2B6 */ s16 unk_2B6;
diff --git a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
index ea9ab2e22..cc9ac1e2c 100644
--- a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
+++ b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c
@@ -336,7 +336,9 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
if (this->actor.gravity != 0.0f) {
DREG(6) = 1;
- Actor_UpdateBgCheckInfo(play, &this->actor, 5.0f, 10.0f, 0.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 5.0f, 10.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
DREG(6) = 0;
}
@@ -355,7 +357,9 @@ void EnBombf_Update(Actor* thisx, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_BOUND);
Actor_MoveWithGravity(&this->actor);
DREG(6) = 1;
- Actor_UpdateBgCheckInfo(play, &this->actor, 5.0f, 10.0f, 0.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 5.0f, 10.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
DREG(6) = 0;
this->actor.speed *= 0.7f;
this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
@@ -469,7 +473,7 @@ void EnBombf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (ENBOMBF_GET(&this->actor) <= ENBOMBF_0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (ENBOMBF_GET(&this->actor) != ENBOMBF_0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
index 8f3b4d3f3..229a1e695 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
@@ -39,7 +39,7 @@ void func_80C00168(EnBomjima* this, PlayState* play);
void func_80C00234(EnBomjima* this);
void func_80C00284(EnBomjima* this, PlayState* play);
-typedef enum EN_BOMJIMA_ACTION {
+typedef enum EnBomjimaAction {
/* 0 */ EN_BOMJIMA_ACTION_0,
/* 1 */ EN_BOMJIMA_ACTION_1,
/* 2 */ EN_BOMJIMA_ACTION_2,
@@ -47,8 +47,8 @@ typedef enum EN_BOMJIMA_ACTION {
/* 4 */ EN_BOMJIMA_ACTION_4,
/* 5 */ EN_BOMJIMA_ACTION_5,
/* 6 */ EN_BOMJIMA_ACTION_6,
- /* 7 */ EN_BOMJIMA_ACTION_7,
-} EN_BOMJIMA_ACTION;
+ /* 7 */ EN_BOMJIMA_ACTION_7
+} EnBomjimaAction;
static s32 D_80C009F0 = 0;
static s32 D_80C009F4 = 0;
@@ -119,7 +119,7 @@ s16 D_80C00AF8[] = {
void EnBomjima_Init(Actor* thisx, PlayState* play) {
EnBomjima* this = THIS;
- s32 cs;
+ s32 csId;
s32 i;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -135,12 +135,12 @@ void EnBomjima_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
if (this->unk_2E6 == 0) {
- cs = this->actor.cutscene;
+ csId = this->actor.csId;
i = 0;
- while (cs != -1) {
+ while (csId != CS_ID_NONE) {
// clang-format off
- this->cutscenes[i] = cs; cs = ActorCutscene_GetAdditionalCutscene(cs);
+ this->csIdList[i] = csId; csId = CutsceneManager_GetAdditionalCsId(csId);
// clang-format on
i++;
}
@@ -266,8 +266,8 @@ void func_80BFE67C(EnBomjima* this, PlayState* play) {
if (this->unk_2C0 == 0) {
Math_Vec3f_Copy(&sp54, &this->actor.home.pos);
- sp54.x += randPlusMinusPoint5Scaled(150.0f);
- sp54.z += randPlusMinusPoint5Scaled(150.0f);
+ sp54.x += Rand_CenteredFloat(150.0f);
+ sp54.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp54)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp54, &sp6C,
@@ -340,8 +340,8 @@ void func_80BFEA94(EnBomjima* this, PlayState* play) {
this->bombal = (EnBombal*)actor;
Math_Vec3f_Copy(&this->unk_2B0, &actor->world.pos);
- if (this->bombalCutscene == 0) {
- this->bombalCutscene = this->bombal->actor.cutscene;
+ if (this->bombalCsId == 0) {
+ this->bombalCsId = this->bombal->actor.csId;
}
func_80BFEB1C(this);
break;
@@ -389,7 +389,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
return;
}
- if (ActorCutscene_GetCurrentIndex() == -1) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
func_800B8614(&this->actor, play, 70.0f);
}
@@ -422,7 +422,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
}
sp40.x = (Math_SinS(sp3E) * (Rand_ZeroFloat(20.0f) + 40.0f)) + this->bombal->actor.world.pos.x;
- sp40.y = this->bombal->actor.world.pos.y - randPlusMinusPoint5Scaled(40.0f);
+ sp40.y = this->bombal->actor.world.pos.y - Rand_CenteredFloat(40.0f);
sp40.z = (Math_CosS(sp3E) * (Rand_ZeroFloat(20.0f) + 40.0f)) + this->bombal->actor.world.pos.z;
SoundSource_PlaySfxAtFixedWorldPos(play, &sp40, 50, NA_SE_EV_BOMBERS_SHOT_EXPLOSUIN);
@@ -433,8 +433,8 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
func_80BFE494(this, 5, 1.0f);
this->unk_29A = 0;
Math_Vec3f_Copy(&this->unk_2A4, &this->actor.home.pos);
- this->unk_2A4.x += randPlusMinusPoint5Scaled(150.0f);
- this->unk_2A4.z += randPlusMinusPoint5Scaled(150.0f);
+ this->unk_2A4.x += Rand_CenteredFloat(150.0f);
+ this->unk_2A4.z += Rand_CenteredFloat(150.0f);
this->unk_2A2++;
}
}
@@ -465,17 +465,17 @@ void func_80BFEFF0(EnBomjima* this) {
void func_80BFF03C(EnBomjima* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->cutscenes[0]);
- } else if (!ActorCutscene_GetCanPlayNext(this->cutscenes[0])) {
- ActorCutscene_SetIntentToPlay(this->cutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
+ } else if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
} else {
player->stateFlags1 &= ~PLAYER_STATE1_20;
CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_04);
this->actor.world.rot.y = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play));
this->unk_2DC = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play));
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscenes[0], &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->actor);
func_80BFF120(this);
}
}
@@ -494,7 +494,7 @@ void func_80BFF174(EnBomjima* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->cutsceneTimer == 1) {
- ActorCutscene_Stop(this->cutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
this->cutsceneEnded = true;
}
@@ -576,7 +576,7 @@ void func_80BFF430(EnBomjima* this, PlayState* play) {
if (bombal != NULL) {
bombal->scale = 0.0f;
- bombal->cutscene = this->bombalCutscene;
+ bombal->csId = this->bombalCsId;
Actor_ChangeFocus(&this->actor, play, &bombal->actor);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_04);
func_80BFE65C(this);
@@ -653,14 +653,14 @@ void func_80BFF754(EnBomjima* this, PlayState* play) {
f32 y;
f32 z;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->cutscenes[1]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[1]);
return;
}
- if (!ActorCutscene_GetCanPlayNext(this->cutscenes[1])) {
- ActorCutscene_SetIntentToPlay(this->cutscenes[1]);
+ if (!CutsceneManager_IsNext(this->csIdList[1])) {
+ CutsceneManager_Queue(this->csIdList[1]);
return;
}
@@ -690,7 +690,7 @@ void func_80BFF754(EnBomjima* this, PlayState* play) {
}
D_80C009F0 = 0;
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscenes[1], &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[1], &this->actor);
this->actionFunc = func_80BFF9B0;
}
@@ -720,12 +720,12 @@ void func_80BFF9B0(EnBomjima* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_76_08);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_76_10);
- gSaveContext.save.bombersCaughtNum = 0;
- gSaveContext.save.bombersCaughtOrder[0] = 0;
- gSaveContext.save.bombersCaughtOrder[1] = 0;
- gSaveContext.save.bombersCaughtOrder[2] = 0;
- gSaveContext.save.bombersCaughtOrder[3] = 0;
- gSaveContext.save.bombersCaughtOrder[4] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtNum = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[0] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[1] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[2] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[3] = 0;
+ gSaveContext.save.saveInfo.bombersCaughtOrder[4] = 0;
func_80BFE494(this, 3, 1.0f);
this->unk_2C8 = 9;
@@ -774,7 +774,7 @@ void func_80BFFBC4(EnBomjima* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_86;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- ActorCutscene_Stop(this->cutscenes[1]);
+ CutsceneManager_Stop(this->csIdList[1]);
}
}
@@ -1044,7 +1044,9 @@ void EnBomjima_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.uncullZoneForward = 500.0f;
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -1096,8 +1098,8 @@ void EnBomjima_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C00B3C[this->unk_2E0]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C00B48[this->unk_2E4]));
diff --git a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h
index 6a434be42..b8196b344 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.h
@@ -40,7 +40,7 @@ typedef struct EnBomjima {
/* 0x2CA */ s16 unk_2CA;
/* 0x2CC */ f32 animLastFrame;
/* 0x2D0 */ f32 unk_2D0;
- /* 0x2D4 */ s16 cutscenes[2];
+ /* 0x2D4 */ s16 csIdList[2];
/* 0x2D8 */ UNK_TYPE1 unk2D8[4]; // maybe a part of the above?
/* 0x2DC */ s16 unk_2DC;
/* 0x2DE */ s16 cutsceneEnded;
@@ -52,7 +52,7 @@ typedef struct EnBomjima {
/* 0x2EA */ s16 unk_2EA;
/* 0x2EC */ s32 animIndex;
/* 0x2F0 */ EnBombal* bombal;
- /* 0x2F4 */ s16 bombalCutscene;
+ /* 0x2F4 */ s16 bombalCsId;
/* 0x2F8 */ ColliderCylinder collider;
} EnBomjima; // size = 0x344
diff --git a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
index c8de769c7..fbdcb860f 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
@@ -275,8 +275,8 @@ void func_80C014E4(EnBomjimb* this, PlayState* play) {
case 0:
if (this->unk_2AE == 0) {
Math_Vec3f_Copy(&sp48, &this->actor.home.pos);
- sp48.x += randPlusMinusPoint5Scaled(150.0f);
- sp48.z += randPlusMinusPoint5Scaled(150.0f);
+ sp48.x += Rand_CenteredFloat(150.0f);
+ sp48.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp48)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp48, &sp60,
@@ -686,11 +686,12 @@ void func_80C02740(EnBomjimb* this, PlayState* play) {
return;
}
- Message_StartTextbox(play, D_80C03230[((void)0, gSaveContext.save.bombersCaughtNum)], &this->actor);
- gSaveContext.save.bombersCaughtOrder[((void)0, gSaveContext.save.bombersCaughtNum)] = this->unk_2C8 + 1;
- gSaveContext.save.bombersCaughtNum++;
+ Message_StartTextbox(play, D_80C03230[((void)0, gSaveContext.save.saveInfo.bombersCaughtNum)], &this->actor);
+ gSaveContext.save.saveInfo.bombersCaughtOrder[((void)0, gSaveContext.save.saveInfo.bombersCaughtNum)] =
+ this->unk_2C8 + 1;
+ gSaveContext.save.saveInfo.bombersCaughtNum++;
- if (gSaveContext.save.bombersCaughtNum > 4) {
+ if (gSaveContext.save.saveInfo.bombersCaughtNum > 4) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
} else {
Actor_PlaySfx(&this->actor, NA_SE_SY_PIECE_OF_HEART);
@@ -761,7 +762,7 @@ void func_80C02A14(EnBomjimb* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
Message_CloseTextbox(play);
- if ((this->unk_2CA == 8) && (gSaveContext.save.bombersCaughtNum >= 5)) {
+ if ((this->unk_2CA == 8) && (gSaveContext.save.saveInfo.bombersCaughtNum >= 5)) {
func_80C02CA4(this, play);
} else {
if (this->unk_2CA == 8) {
@@ -858,7 +859,9 @@ void EnBomjimb_Update(Actor* thisx, PlayState* play2) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -909,8 +912,8 @@ void EnBomjimb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C03274[this->unk_2C2]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C03280[this->unk_2C8]));
diff --git a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
index f411f21a2..a784e335d 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
@@ -11,19 +11,19 @@ typedef void (*EnBomjimbActionFunc)(struct EnBomjimb*, PlayState*);
#define ENBOMJIMB_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
#define ENBOMJIMB_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0 */ ENBOMJIMB_F_0,
/* 1 */ ENBOMJIMB_F_1,
/* 2 */ ENBOMJIMB_F_2,
/* 3 */ ENBOMJIMB_F_3,
- /* 4 */ ENBOMJIMB_F_4,
-};
+ /* 4 */ ENBOMJIMB_F_4
+} EnBomjimbParamF;
-enum {
+typedef enum {
/* 0 */ ENBOMJIMB_F0_0,
/* 1 */ ENBOMJIMB_F0_1,
- /* 2 */ ENBOMJIMB_F0_2,
-};
+ /* 2 */ ENBOMJIMB_F0_2
+} EnBomjimbParamF0;
typedef struct EnBomjimb {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.c b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
index 4abfad7b1..f9b5b3d41 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.c
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.c
@@ -164,7 +164,7 @@ void EnBoom_Destroy(Actor* thisx, PlayState* play) {
}
void func_808A2918(EnBoom* this, PlayState* play) {
- Actor* sp7C;
+ Actor* targetActor;
Player* player = GET_PLAYER(play);
s32 sp74;
s16 sp72;
@@ -175,25 +175,26 @@ void func_808A2918(EnBoom* this, PlayState* play) {
f32 sp64;
f32 distXYZ;
- sp7C = this->player;
+ targetActor = this->moveTo;
- if (sp7C != NULL) {
- sp72 = Actor_WorldYawTowardPoint(&this->actor, &sp7C->focus.pos);
+ if (targetActor != NULL) {
+ sp72 = Actor_WorldYawTowardPoint(&this->actor, &targetActor->focus.pos);
sp70 = this->actor.world.rot.y - sp72;
- sp6E = Actor_WorldPitchTowardPoint(&this->actor, &sp7C->focus.pos);
+ sp6E = Actor_WorldPitchTowardPoint(&this->actor, &targetActor->focus.pos);
sp6C = this->actor.world.rot.x - sp6E;
- sp64 = (200.0f - Math_Vec3f_DistXYZ(&this->actor.world.pos, &sp7C->focus.pos)) * 0.005f;
+ sp64 = (200.0f - Math_Vec3f_DistXYZ(&this->actor.world.pos, &targetActor->focus.pos)) * 0.005f;
if (sp64 < 0.12f) {
sp64 = 0.12f;
}
- if ((&player->actor != sp7C) && ((sp7C->update == NULL) || ((this->unk_1CF < 0) && (ABS_ALT(sp70) > 0x4000)))) {
- this->player = NULL;
+ if ((&player->actor != targetActor) &&
+ ((targetActor->update == NULL) || ((this->unk_1CF < 0) && (ABS_ALT(sp70) > 0x4000)))) {
+ this->moveTo = NULL;
} else {
if (this->unk_1CE != 0) {
this->unk_1CE--;
- this->actor.world.rot.y += (this->actor.params == 0) ? 0x190 : -0x190;
+ this->actor.world.rot.y += (this->actor.params == ZORA_BOOMERANG_LEFT) ? 0x190 : -0x190;
} else {
if (this->unk_1CF > 0) {
this->unk_1CF--;
@@ -202,7 +203,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
}
Math_ScaledStepToS(&this->actor.world.rot.y, sp72,
- (this->unk_1CF > 0) ? 1000 : (s16)(((sp70 < 0) ? -sp70 : sp70) * sp64));
+ (this->unk_1CF > 0) ? 1000 : (s16)(ABS_ALT(sp70) * sp64));
}
Math_ScaledStepToS(&this->actor.world.rot.x, sp6E, ABS_ALT(sp6C) * sp64);
@@ -242,7 +243,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
if (sp74 != 0) {
this->actor.world.rot.x = -this->actor.world.rot.x;
this->actor.world.rot.y += 0x8000;
- this->player = &player->actor;
+ this->moveTo = &player->actor;
this->unk_1CC = 0;
}
}
@@ -250,34 +251,34 @@ void func_808A2918(EnBoom* this, PlayState* play) {
if (this->unk_1CC <= 16) {
distXYZ = Math_Vec3f_DistXYZ(&this->actor.world.pos, &player->actor.focus.pos);
- if (&player->actor != this->player) {
- if (this->player == 0) {
+ if (&player->actor != this->moveTo) {
+ if (this->moveTo == 0) {
this->unk_1CE = 8;
}
- this->player = &player->actor;
+ this->moveTo = &player->actor;
}
if (distXYZ < 40.0f) {
- sp7C = this->unk_1C8;
- if (sp7C != NULL) {
- Math_Vec3f_Copy(&sp7C->world.pos, &player->actor.world.pos);
- if (sp7C->id == ACTOR_EN_ITEM00) {
- sp7C->gravity = -0.9f;
- sp7C->bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH);
+ targetActor = this->unk_1C8;
+ if (targetActor != NULL) {
+ Math_Vec3f_Copy(&targetActor->world.pos, &player->actor.world.pos);
+ if (targetActor->id == ACTOR_EN_ITEM00) {
+ targetActor->gravity = -0.9f;
+ targetActor->bgCheckFlags &= ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH);
} else {
- sp7C->flags &= ~ACTOR_FLAG_2000;
+ targetActor->flags &= ~ACTOR_FLAG_2000;
}
}
Actor_Kill(&this->actor);
}
}
- sp7C = this->unk_1C8;
- if (sp7C != NULL) {
- if (sp7C->update == NULL) {
+ targetActor = this->unk_1C8;
+ if (targetActor != NULL) {
+ if (targetActor->update == NULL) {
this->unk_1C8 = NULL;
} else {
- Math_Vec3f_Copy(&sp7C->world.pos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&targetActor->world.pos, &this->actor.world.pos);
}
}
}
@@ -298,7 +299,7 @@ void EnBoom_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, 0.0f);
}
- if (this->actor.params != 0) {
+ if (this->actor.params != ZORA_BOOMERANG_LEFT) {
this->unk_1CD--;
} else {
this->unk_1CD++;
@@ -310,7 +311,7 @@ typedef struct {
/* 0x00 */ Gfx* unk_00;
/* 0x04 */ Vec3f unk_04;
/* 0x10 */ Vec3f unk_10;
-} EnBoomStruct;
+} EnBoomStruct; // size = 0x1C
EnBoomStruct D_808A3078[] = {
{ gameplay_keep_DL_06FE20, { -960.0f, 0.0f, 0.0f }, { 960.0f, 0.0f, 0.0f } },
@@ -326,7 +327,7 @@ void EnBoom_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_RotateYS(this->actor.world.rot.y, MTXMODE_APPLY);
- Matrix_RotateZS((this->actor.params != 0) ? 0x1F40 : -0x1F40, MTXMODE_APPLY);
+ Matrix_RotateZS((this->actor.params != ZORA_BOOMERANG_LEFT) ? 0x1F40 : -0x1F40, MTXMODE_APPLY);
Matrix_RotateXS(this->actor.world.rot.x, MTXMODE_APPLY);
Matrix_MultVec3f(&sp58->unk_04, &sp4C);
Matrix_MultVec3f(&sp58->unk_10, &sp40);
@@ -335,7 +336,7 @@ void EnBoom_Draw(Actor* thisx, PlayState* play) {
EffectBlure_AddVertex(Effect_GetByIndex(this->effectIndex), &sp4C, &sp40);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateYS(this->unk_1CD * 0x2EE0, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Boom/z_en_boom.h b/src/overlays/actors/ovl_En_Boom/z_en_boom.h
index e5e3fa2b3..7bae2b150 100644
--- a/src/overlays/actors/ovl_En_Boom/z_en_boom.h
+++ b/src/overlays/actors/ovl_En_Boom/z_en_boom.h
@@ -3,6 +3,11 @@
#include "global.h"
+typedef enum {
+ /* 0 */ ZORA_BOOMERANG_LEFT,
+ /* 1 */ ZORA_BOOMERANG_RIGHT
+} EnBoomType;
+
struct EnBoom;
typedef void (*EnBoomActionFunc)(struct EnBoom*, PlayState*);
@@ -10,7 +15,7 @@ typedef void (*EnBoomActionFunc)(struct EnBoom*, PlayState*);
typedef struct EnBoom {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderQuad collider;
- /* 0x1C4 */ Actor* player;
+ /* 0x1C4 */ Actor* moveTo;
/* 0x1C8 */ Actor* unk_1C8;
/* 0x1CC */ u8 unk_1CC;
/* 0x1CD */ u8 unk_1CD;
diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.c b/src/overlays/actors/ovl_En_Box/z_en_box.c
index 4e6d3ae3a..044f54334 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -73,7 +73,7 @@ static InitChainEntry sInitChain[] = {
};
typedef struct {
- f32 data[5];
+ /* 0x0 */ f32 data[5];
} EnBox_PlaybackSpeed; // 0x14
static EnBox_PlaybackSpeed sPlaybackSpeed = { { 1.5f, 1.0f, 1.5f, 1.0f, 1.5f } };
@@ -122,6 +122,7 @@ void func_80867C8C(struct_80867BDC_a0* arg0, PlayState* play) {
if (temp_s6 > 0) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Push();
for (i = 0; i < temp_s6; i++) {
f32 temp_f0 = (f32)i / temp_s6;
@@ -143,13 +144,14 @@ void func_80867C8C(struct_80867BDC_a0* arg0, PlayState* play) {
Matrix_Scale(temp_f26, temp_f26, temp_f26, MTXMODE_APPLY);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
}
Matrix_Pop();
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -187,7 +189,7 @@ void EnBox_ClipToGround(EnBox* this, PlayState* play) {
void EnBox_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnBox* this = THIS;
- s16 cutsceneIdx;
+ s16 csId;
CollisionHeader* colHeader;
f32 animFrame;
f32 animFrameEnd;
@@ -213,7 +215,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.x = 0x7FFF;
this->collectableFlag = 0;
} else {
- func_800C636C(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCeilingCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->collectableFlag = (this->dyna.actor.world.rot.x & 0x7F);
this->dyna.actor.world.rot.x = 0;
}
@@ -228,7 +230,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
animFrame = animFrameEnd;
} else if (((this->type == ENBOX_TYPE_BIG_SWITCH_FLAG_FALL) || (this->type == ENBOX_TYPE_SMALL_SWITCH_FLAG_FALL)) &&
!Flags_GetSwitch(play, this->switchFlag)) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
if (Rand_ZeroOne() < 0.5f) {
this->movementFlags |= ENBOX_MOVE_FALL_ANGLE_SIDE;
}
@@ -240,7 +242,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
} else if (((this->type == ENBOX_TYPE_BIG_ROOM_CLEAR) || (this->type == ENBOX_TYPE_SMALL_ROOM_CLEAR)) &&
!Flags_GetClear(play, this->dyna.actor.room)) {
EnBox_SetupAction(this, EnBox_AppearOnRoomClear);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
if (this->movementFlags & ENBOX_MOVE_0x80) {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 50.0f;
} else {
@@ -254,7 +256,7 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
} else if (((this->type == ENBOX_TYPE_BIG_SWITCH_FLAG) || (this->type == ENBOX_TYPE_SMALL_SWITCH_FLAG)) &&
!Flags_GetSwitch(play, this->switchFlag)) {
EnBox_SetupAction(this, EnBox_AppearSwitchFlag);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
if (this->movementFlags & ENBOX_MOVE_0x80) {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 50.0f;
} else {
@@ -290,17 +292,17 @@ void EnBox_Init(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->dyna.actor, 40.0f);
}
- this->cutsceneIdxA = -1;
- this->cutsceneIdxB = -1;
- cutsceneIdx = this->dyna.actor.cutscene;
+ this->csId1 = CS_ID_NONE;
+ this->csId2 = CS_ID_NONE;
+ csId = this->dyna.actor.csId;
- while (cutsceneIdx != -1) {
- if (func_800F2178(cutsceneIdx) == 1) {
- this->cutsceneIdxB = cutsceneIdx;
+ while (csId != CS_ID_NONE) {
+ if (CutsceneManager_GetCutsceneCustomValue(csId) == 1) {
+ this->csId2 = csId;
} else {
- this->cutsceneIdxA = cutsceneIdx;
+ this->csId1 = csId;
}
- cutsceneIdx = ActorCutscene_GetAdditionalCutscene(cutsceneIdx);
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
func_80867BDC(&this->unk_1F4, play, &this->dyna.actor.home.pos);
}
@@ -377,7 +379,7 @@ void EnBox_FallOnSwitchFlag(EnBox* this, PlayState* play) {
Actor_SetClosestSecretDistance(&this->dyna.actor, play);
if (this->unk_1A0 >= 0) {
EnBox_SetupAction(this, EnBox_Fall);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else if (this->unk_1A0 >= -11) {
this->unk_1A0++;
} else if (Flags_GetSwitch(play, this->switchFlag)) {
@@ -388,12 +390,12 @@ void EnBox_FallOnSwitchFlag(EnBox* this, PlayState* play) {
void EnBox_AppearSwitchFlag(EnBox* this, PlayState* play) {
Actor_SetClosestSecretDistance(&this->dyna.actor, play);
if (Flags_GetSwitch(play, this->switchFlag)) {
- if (ActorCutscene_GetCanPlayNext(this->cutsceneIdxA)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutsceneIdxA, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->csId1)) {
+ CutsceneManager_StartWithPlayerCs(this->csId1, &this->dyna.actor);
EnBox_SetupAction(this, func_80868AFC);
this->unk_1A0 = -30;
} else {
- ActorCutscene_SetIntentToPlay(this->cutsceneIdxA);
+ CutsceneManager_Queue(this->csId1);
}
}
}
@@ -401,19 +403,19 @@ void EnBox_AppearSwitchFlag(EnBox* this, PlayState* play) {
void EnBox_AppearOnRoomClear(EnBox* this, PlayState* play) {
Actor_SetClosestSecretDistance(&this->dyna.actor, play);
if (Flags_GetClearTemp(play, this->dyna.actor.room)) {
- if (ActorCutscene_GetCanPlayNext(this->cutsceneIdxA)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutsceneIdxA, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->csId1)) {
+ CutsceneManager_StartWithPlayerCs(this->csId1, &this->dyna.actor);
Flags_SetClear(play, this->dyna.actor.room);
EnBox_SetupAction(this, func_80868AFC);
this->unk_1A0 = -30;
} else {
- ActorCutscene_SetIntentToPlay(this->cutsceneIdxA);
+ CutsceneManager_Queue(this->csId1);
}
}
}
void func_80868AFC(EnBox* this, PlayState* play) {
- if ((func_800F22C4(this->cutsceneIdxA, &this->dyna.actor) != 0) || (this->unk_1A0 != 0)) {
+ if ((func_800F22C4(this->csId1, &this->dyna.actor) != 0) || (this->unk_1A0 != 0)) {
EnBox_SetupAction(this, func_80868B74);
this->unk_1A0 = 0;
func_80867FBC(&this->unk_1F4, play, (this->movementFlags & ENBOX_MOVE_0x80) != 0);
@@ -422,7 +424,7 @@ void func_80868AFC(EnBox* this, PlayState* play) {
}
void func_80868B74(EnBox* this, PlayState* play) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
if (this->unk_1A0 < 0) {
this->unk_1A0++;
} else if (this->unk_1A0 < 40) {
@@ -432,7 +434,7 @@ void func_80868B74(EnBox* this, PlayState* play) {
this->dyna.actor.world.pos.y += 1.25f;
}
this->unk_1A0++;
- if ((this->cutsceneIdxA != -1) && ActorCutscene_GetCurrentIndex() == this->cutsceneIdxA) {
+ if ((this->csId1 != -1) && CutsceneManager_GetCurrentCsId() == this->csId1) {
if (this->unk_1A0 == 2) {
func_800B724C(play, &this->dyna.actor, PLAYER_CSMODE_4);
} else if (this->unk_1A0 == 22) {
@@ -445,7 +447,7 @@ void func_80868B74(EnBox* this, PlayState* play) {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
} else {
EnBox_SetupAction(this, EnBox_WaitOpen);
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
@@ -460,8 +462,8 @@ void EnBox_WaitOpen(EnBox* this, PlayState* play) {
this->alpha = 255;
this->movementFlags |= ENBOX_MOVE_IMMOBILE;
- if ((this->unk_1EC != 0) && ((this->cutsceneIdxB < 0) || (ActorCutscene_GetCurrentIndex() == this->cutsceneIdxB) ||
- (ActorCutscene_GetCurrentIndex() == -1))) {
+ if ((this->unk_1EC != 0) && ((this->csId2 < 0) || (CutsceneManager_GetCurrentCsId() == this->csId2) ||
+ (CutsceneManager_GetCurrentCsId() == CS_ID_NONE))) {
if (this->unk_1EC < 0) {
animHeader = &gBoxChestOpenAnim;
playbackSpeed = 1.5f;
@@ -612,7 +614,8 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
}
if (!(this->movementFlags & ENBOX_MOVE_IMMOBILE)) {
Actor_MoveWithGravity(&this->dyna.actor);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
}
Actor_SetFocus(&this->dyna.actor, 40.0f);
if ((this->getItemId == GI_ICE_TRAP) && (this->actionFunc == EnBox_Open) && (this->skelAnime.curFrame > 45.0f) &&
@@ -693,6 +696,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
EnBox* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->unk_1F4.unk_10 != NULL) {
this->unk_1F4.unk_10(&this->unk_1F4, play);
}
@@ -703,12 +707,12 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, EnBox_SetRenderMode1(play->state.gfxCtx));
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL,
EnBox_PostLimbDraw, &this->dyna.actor, POLY_OPA_DISP);
} else if (this->alpha != 0) {
gDPPipeSync(POLY_XLU_DISP++);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
if ((this->type == ENBOX_TYPE_BIG_INVISIBLE) || (this->type == ENBOX_TYPE_SMALL_INVISIBLE)) {
gSPSegment(POLY_XLU_DISP++, 0x08, EnBox_SetRenderMode3(play->state.gfxCtx));
@@ -718,5 +722,6 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL,
EnBox_PostLimbDraw, &this->dyna.actor, POLY_XLU_DISP);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.h b/src/overlays/actors/ovl_En_Box/z_en_box.h
index 9cb5af18d..75d9f09c9 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.h
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.h
@@ -60,8 +60,8 @@ typedef struct EnBox {
/* 0x1F2 */ u8 iceSmokeTimer;
/* 0x1F3 */ s8 unk_1F3;
/* 0x1F4 */ struct_80867BDC_a0 unk_1F4;
- /* 0x218 */ s16 cutsceneIdxA;
- /* 0x21A */ s16 cutsceneIdxB;
+ /* 0x218 */ s16 csId1;
+ /* 0x21A */ s16 csId2;
/* 0x21C */ s32 getItemId;
/* 0x220 */ s32 collectableFlag;
} EnBox; // size = 0x224
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 db6019b99..92d56eec5 100644
--- a/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
+++ b/src/overlays/actors/ovl_En_Bubble/z_en_bubble.c
@@ -392,7 +392,8 @@ 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);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 16.0f, 16.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
Actor_SetFocus(&this->actor, this->actor.shape.yOffset);
}
@@ -404,14 +405,14 @@ void EnBubble_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->actionFunc != EnBubble_Disappear) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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_RotateZF(DEG_TO_RAD((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);
+ Matrix_RotateZF(DEG_TO_RAD(-(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);
diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/src/overlays/actors/ovl_En_Butte/z_en_butte.c
index 05072da72..ce859ad53 100644
--- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c
+++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c
@@ -139,7 +139,7 @@ void func_8091C178(EnButte* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C240(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu2(play->state.gfxCtx);
sp48 = Math_SinS(D_8091D3A0) * 250.0f;
sp48 = CLAMP(sp48, 0, 255);
@@ -416,7 +416,7 @@ void EnButte_Update(Actor* thisx, PlayState* play) {
this->unk_258 += 0x600;
if (ENBUTTE_GET_1(&this->actor) == ENBUTTE_1) {
- if (GET_PLAYER(play)->meleeWeaponState == 0) {
+ if (GET_PLAYER(play)->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) {
if (this->unk_252 > 0) {
this->unk_252--;
}
@@ -446,7 +446,7 @@ void EnButte_Draw(Actor* thisx, PlayState* play) {
EnButte* this = THIS;
if (this->unk_250 != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
}
diff --git a/src/overlays/actors/ovl_En_Cha/z_en_cha.c b/src/overlays/actors/ovl_En_Cha/z_en_cha.c
index 92030934f..cbe96e0f0 100644
--- a/src/overlays/actors/ovl_En_Cha/z_en_cha.c
+++ b/src/overlays/actors/ovl_En_Cha/z_en_cha.c
@@ -72,13 +72,13 @@ void EnCha_Destroy(Actor* thisx, PlayState* play) {
void EnCha_Ring(EnCha* this, PlayState* play) {
EnCha_Idle(this, play);
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->actionFunc = EnCha_Idle;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = EnCha_Idle;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
index e75d11bc6..8e3e907bb 100644
--- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
+++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
@@ -20,7 +20,7 @@ typedef enum {
/* 0x05 */ CLEAR_TAG_EFFECT_LIGHT_RAYS,
/* 0x06 */ CLEAR_TAG_EFFECT_SHOCKWAVE,
/* 0x07 */ CLEAR_TAG_EFFECT_SPLASH,
- /* 0x08 */ CLEAR_TAG_EFFECT_ISOLATED_SMOKE,
+ /* 0x08 */ CLEAR_TAG_EFFECT_ISOLATED_SMOKE
} ClearTagEffectType;
void EnClearTag_Init(Actor* thisx, PlayState* play);
@@ -463,7 +463,7 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) {
}
// Initialize flash effect
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 30.0f, 100.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 30.0f, 100.0f, UPDBGCHECKINFO_FLAG_4);
pos = this->actor.world.pos;
EnClearTag_CreateFlashEffect(this, &pos, sFlashMaxScale[thisx->params], this->actor.floorHeight);
@@ -494,8 +494,8 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) {
vel.z = cosf(i * (33.0f / 40.0f)) * i * .5f;
vel.y = Rand_ZeroFloat(8.0f) + 7.0f;
- vel.x += randPlusMinusPoint5Scaled(0.5f);
- vel.z += randPlusMinusPoint5Scaled(0.5f);
+ vel.x += Rand_CenteredFloat(0.5f);
+ vel.z += Rand_CenteredFloat(0.5f);
accel.x = 0.0f;
accel.y = -1.0f;
@@ -556,7 +556,7 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) {
}
break;
case 1:
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
this->subCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE);
@@ -585,8 +585,8 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) {
mainCam->eyeNext = this->subCamEye;
mainCam->at = this->subCamAt;
func_80169AFC(play, this->subCamId, 0);
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->cameraState = 0;
this->subCamId = SUB_CAM_ID_DONE;
this->activeTimer = 20;
@@ -807,8 +807,9 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
EnClearTagEffect* firstEffect = this->effect;
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
// Draw all Debris effects.
for (i = 0; i < ARRAY_COUNT(this->effect); i++, effect++) {
@@ -981,7 +982,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 200);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 200);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sWaterSplashTextures[effect->actionTimer]));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BACK);
isMaterialApplied++;
diff --git a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c
index 876914a2a..8eb9eb839 100644
--- a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c
+++ b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.c
@@ -152,7 +152,7 @@ void EnCne01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnCne01_Draw;
this->waitingOnInit = false;
- if (ENCNE01_GET_PATH(&this->actor) == 0x3F) {
+ if (ENCNE01_GET_PATH_INDEX(&this->actor) == ENCNE01_PATH_INDEX_NONE) {
this->actionFunc = EnCne01_FaceForward;
} else {
this->actionFunc = EnCne01_Walk;
@@ -217,7 +217,7 @@ void EnCne01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1;
- this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH(&this->enHy.actor), 0x3F);
+ this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH_INDEX(&this->enHy.actor), ENCNE01_PATH_INDEX_NONE);
this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnCne01_FinishInit;
@@ -234,7 +234,7 @@ void EnCne01_Update(Actor* thisx, PlayState* play) {
EnCne01_TestIsTalking(this, play);
this->enHy.actionFunc(&this->enHy, play);
- Actor_UpdateBgCheckInfo(play, &this->enHy.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->enHy.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnCne01_UpdateModel(this, play);
func_809CB4A0(this, play);
}
@@ -251,10 +251,12 @@ s32 EnCne01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (limbIndex == CNE_LIMB_HEAD) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment);
*dList = gCneHeadBrownHairDL;
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
if (limbIndex == CNE_LIMB_HEAD) {
@@ -289,8 +291,10 @@ void EnCne01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
if (limbIndex == CNE_LIMB_RIGHT_FOOT) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -310,7 +314,7 @@ void EnCne01_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x0A, Gfx_EnvColor(play->state.gfxCtx, 160, 180, 255, 0));
diff --git a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
index 253025760..feee462a9 100644
--- a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
+++ b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
@@ -7,7 +7,9 @@ struct EnCne01;
typedef void (*EnCne01ActionFunc)(struct EnCne01*, PlayState*);
-#define ENCNE01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENCNE01_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENCNE01_PATH_INDEX_NONE 0x3F
typedef struct EnCne01 {
/* 0x000 */ EnHy enHy;
diff --git a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
index 13ff0ce10..fa6349871 100644
--- a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
+++ b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.c
@@ -163,7 +163,7 @@ void func_80AFDFB4(EnColMan* this, PlayState* play) {
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f)) {
if (!this->hasSetRandomValues) {
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(30000.0f);
+ this->actor.world.rot.y = Rand_CenteredFloat(30000.0f);
this->actor.speed = 2.0f + BREG(56) + Rand_ZeroFloat(2.0f);
this->actor.velocity.y = 12.0f + BREG(57) + Rand_ZeroFloat(5.0f);
this->hasSetRandomValues = true;
@@ -172,9 +172,9 @@ void func_80AFDFB4(EnColMan* this, PlayState* play) {
}
for (i = 0; i < 2; i++) {
- velocity.x = randPlusMinusPoint5Scaled(2.0f);
+ velocity.x = Rand_CenteredFloat(2.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 1.0f;
- velocity.z = randPlusMinusPoint5Scaled(2.0f);
+ velocity.z = Rand_CenteredFloat(2.0f);
accel.y = -0.1f;
accel.z = 0.0f;
accel.x = 0.0f;
@@ -203,7 +203,8 @@ void func_80AFE25C(EnColMan* this, PlayState* play) {
CLEAR_TAG_SMALL_EXPLOSION);
} else {
EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.y, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -222,7 +223,9 @@ void EnColMan_Update(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, this->scale);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 30.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -231,45 +234,56 @@ void func_80AFE414(Actor* thisx, PlayState* play) {
EnColMan* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE4AC(Actor* thisx, PlayState* play) {
EnColMan* this = THIS;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropRecoveryHeartTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE584(Actor* thisx, PlayState* play) {
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_06AB30);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80AFE650(Actor* thisx, PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gDropBombTex));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
index 977bf2473..c002dc5e3 100644
--- a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
+++ b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
@@ -21,7 +21,7 @@ typedef enum {
/* 1 */ EN_COL_MAN_RECOVERY_HEART,
/* 2 */ EN_COL_MAN_FALLING_ROCK,
/* 3 */ EN_COL_MAN_CUTSCENE_BOMB,
- /* 4 */ EN_COL_MAN_GAMEPLAY_BOMB,
+ /* 4 */ EN_COL_MAN_GAMEPLAY_BOMB
} EnColManType;
#endif // Z_EN_COL_MAN_H
diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
index 1de5d137e..aa74c5007 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -5,6 +5,7 @@
*/
#include "z_en_cow.h"
+#include "z64horse.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -116,7 +117,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnCow_Idle;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) && (CURRENT_DAY != 1) &&
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) && (CURRENT_DAY != 1) &&
(EN_COW_TYPE(thisx) == EN_COW_TYPE_ABDUCTED)) {
Actor_Kill(&this->actor);
return;
@@ -130,7 +131,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->animationCycle = 0;
this->actor.targetMode = 6;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
func_801A5080(4);
break;
case EN_COW_TYPE_TAIL:
@@ -264,13 +265,13 @@ void EnCow_Talk(EnCow* this, PlayState* play) {
void EnCow_Idle(EnCow* this, PlayState* play) {
if ((play->msgCtx.ocarinaMode == 0) || (play->msgCtx.ocarinaMode == 4)) {
- if (D_801BDAA4 != 0) {
+ if (gHorsePlayedEponasSong) {
if (this->flags & EN_COW_FLAG_WONT_GIVE_MILK) {
this->flags &= ~EN_COW_FLAG_WONT_GIVE_MILK;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
} else if ((this->actor.xzDistToPlayer < 150.0f) &&
ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 25000) {
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
this->actionFunc = EnCow_Talk;
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 170.0f);
@@ -340,7 +341,7 @@ void EnCow_Update(Actor* thisx, PlayState* play2) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (SkelAnime_Update(&this->skelAnime)) {
if (this->skelAnime.animation == &gCowChewAnim) {
@@ -421,7 +422,7 @@ void EnCow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnCow_Draw(Actor* thisx, PlayState* play) {
EnCow* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnCow_OverrideLimbDraw, EnCow_PostLimbDraw, &this->actor);
}
@@ -429,7 +430,7 @@ void EnCow_Draw(Actor* thisx, PlayState* play) {
void EnCow_DrawTail(Actor* thisx, PlayState* play) {
EnCow* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.h b/src/overlays/actors/ovl_En_Cow/z_en_cow.h
index 3c73b747f..200ec5bec 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.h
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.h
@@ -10,9 +10,9 @@
#define EN_COW_FLAG_WONT_GIVE_MILK (1 << 2)
typedef enum {
- /* 0 */ EN_COW_TYPE_DEFAULT,
- /* 1 */ EN_COW_TYPE_TAIL,
- /* 2 */ EN_COW_TYPE_ABDUCTED,
+ /* 0 */ EN_COW_TYPE_DEFAULT,
+ /* 1 */ EN_COW_TYPE_TAIL,
+ /* 2 */ EN_COW_TYPE_ABDUCTED
} EnCowType;
struct EnCow;
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 2bbee66d5..4c88b84cb 100644
--- a/src/overlays/actors/ovl_En_Crow/z_en_crow.c
+++ b/src/overlays/actors/ovl_En_Crow/z_en_crow.c
@@ -6,7 +6,7 @@
#include "z_en_crow.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnCrow*)thisx)
@@ -74,7 +74,7 @@ typedef enum {
/* 2 */ GUAY_DMGEFF_FIRE,
/* 3 */ GUAY_DMGEFF_ICE,
/* 4 */ GUAY_DMGEFF_LIGHT,
- /* 5 */ GUAY_DMGEFF_ELECTRIC,
+ /* 5 */ GUAY_DMGEFF_ELECTRIC
} GuayDamageEffect;
static DamageTable sDamageTable = {
@@ -507,7 +507,8 @@ void EnCrow_Update(Actor* thisx, PlayState* play) {
height = 0.0f;
Actor_MoveWithGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f * scale, 25.0f * scale, 50.0f * scale, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f * scale, 25.0f * scale, 50.0f * scale,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
} else {
height = 0.0f;
}
@@ -551,9 +552,9 @@ s32 EnCrow_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (this->actor.colChkInfo.health != 0) {
if (limbIndex == OBJECT_CROW_LIMB_UPPER_TAIL) {
- rot->y += (s16)(0xC00 * sin_rad(this->skelAnime.curFrame * (M_PI / 4)));
+ rot->y += (s16)(0xC00 * Math_SinF(this->skelAnime.curFrame * (M_PI / 4)));
} else if (limbIndex == OBJECT_CROW_LIMB_TAIL) {
- rot->y += (s16)(0x1400 * sin_rad((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
+ rot->y += (s16)(0x1400 * Math_SinF((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
}
}
return false;
@@ -573,7 +574,7 @@ void EnCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnCrow_Draw(Actor* thisx, PlayState* play) {
EnCrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnCrow_OverrideLimbDraw, EnCrow_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
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 fbd829212..25013327a 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -62,7 +62,7 @@ void func_80B3E168(EnDaiEffect* effect, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < EN_DAI_EFFECT_COUNT; i++, effect++) {
if (effect->isEnabled == true) {
@@ -176,13 +176,13 @@ s32 func_80B3E5DC(EnDai* this, s32 arg1) {
s32 func_80B3E69C(EnDai* this, PlayState* play) {
s32 ret = false;
- if ((play->csCtx.state != CS_STATE_0) && (play->sceneId == SCENE_12HAKUGINMAE) &&
- (play->csCtx.currentCsIndex == 0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_30_01)) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_12HAKUGINMAE) &&
+ (play->csCtx.scriptIndex == 0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_30_01)) {
if (!(this->unk_1CE & 0x10)) {
Flags_SetSwitch(play, 20);
this->unk_1CE |= (0x80 | 0x10);
this->unk_1CE &= ~(0x100 | 0x20);
- this->unk_1CC = 0xFF;
+ this->cueId = 255;
this->unk_1DC = 0;
this->unk_1CD = 0;
this->unk_1F0 = D_80B3FBF0;
@@ -240,7 +240,7 @@ static s32 D_80B3FC8C[] = {
0x920C0F0C, 0x930C1211, 0x5520100E, 0x0C940C12, 0x10000000,
};
-s16 func_80B3E8BC(EnDai* this, s32 arg1) {
+s16 func_80B3E8BC(EnDai* this, s32 cueId) {
static f32 D_80B3FCB4[] = {
1.0f, 6.0f, 16.0f, 19.0f, 46.0f, 48.0f, 50.0f, 52.0f, 54.0f, 1.0f, 6.0f, 36.0f,
};
@@ -256,10 +256,10 @@ s16 func_80B3E8BC(EnDai* this, s32 arg1) {
s32 i;
s32 end;
- if (arg1 == 3) {
+ if (cueId == 3) {
end = 9;
i = 0;
- } else if (arg1 == 4) {
+ } else if (cueId == 4) {
end = 12;
i = 9;
} else {
@@ -402,12 +402,12 @@ s32 func_80B3ED88(EnDai* this) {
}
void func_80B3EE8C(EnDai* this, PlayState* play) {
- s16 cutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
- if (ActorCutscene_GetCanPlayNext(cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(cutscene, &this->actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(cutscene);
+ CutsceneManager_Queue(csId);
}
}
@@ -445,15 +445,15 @@ void func_80B3F044(EnDai* this, PlayState* play) {
static s32 D_80B3FE38[] = {
0, 0, 6, 7, 8,
};
- s32 sp2C = 0;
- s32 sp28;
+ s32 cueChannel = 0;
+ s32 cueId;
- if (Cutscene_CheckActorAction(play, 472)) {
- sp2C = Cutscene_GetActorActionIndex(play, 472);
- sp28 = play->csCtx.actorActions[sp2C]->action;
- if (this->unk_1CC != (u8)sp28) {
- func_80B3E5DC(this, D_80B3FE38[sp28]);
- switch (sp28) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_472)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_472);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ func_80B3E5DC(this, D_80B3FE38[cueId]);
+ switch (cueId) {
case 1:
this->unk_1E0 = 0.0f;
break;
@@ -467,10 +467,10 @@ void func_80B3F044(EnDai* this, PlayState* play) {
break;
}
}
- this->unk_1CC = sp28;
+ this->cueId = cueId;
}
- switch (this->unk_1CC) {
+ switch (this->cueId) {
case 1:
this->unk_1E0 += 1.0f;
if (this->unk_1E0 < 30.0f) {
@@ -481,20 +481,20 @@ void func_80B3F044(EnDai* this, PlayState* play) {
break;
case 2:
- if (play->csCtx.frames == 360) {
+ if (play->csCtx.curFrame == 360) {
Actor_PlaySfx(&this->actor, NA_SE_EN_DAIGOLON_SLEEP3 - SFX_FLAG);
}
if (Animation_OnFrame(&this->skelAnime, 43.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_BOUND_1);
}
- this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
+ this->unk_1D6 = func_80B3E8BC(this, this->cueId);
break;
case 3:
if (Animation_OnFrame(&this->skelAnime, 6.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_DAIGOLON_SLEEP1);
}
- this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
+ this->unk_1D6 = func_80B3E8BC(this, this->cueId);
break;
case 4:
@@ -504,11 +504,11 @@ void func_80B3F044(EnDai* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 35.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_BOUND_0);
}
- this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
+ this->unk_1D6 = func_80B3E8BC(this, this->cueId);
break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, sp2C);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
void EnDai_Init(Actor* thisx, PlayState* play) {
@@ -525,7 +525,7 @@ void EnDai_Init(Actor* thisx, PlayState* play) {
this->unk_1CE = 0;
this->unk_1D6 = 0;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
SubS_UpdateFlags(&this->unk_1CE, 3, 7);
this->unk_1CE |= 0x80;
this->unk_1CD = 0xFF;
@@ -649,7 +649,7 @@ void func_80B3F78C(EnDai* this, PlayState* play) {
this->unk_1CE &= ~0x40;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -683,7 +683,7 @@ void func_80B3F920(EnDai* this, PlayState* play) {
this->unk_1CE |= 0x40;
if (this->unk_1CD == 0xFF) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -701,7 +701,7 @@ void func_80B3F920(EnDai* this, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Dai/z_en_dai.h b/src/overlays/actors/ovl_En_Dai/z_en_dai.h
index 4dc059c39..35928388f 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.h
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.h
@@ -26,7 +26,7 @@ typedef struct EnDai {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnDaiActionFunc actionFunc;
/* 0x18C */ MtxF unk_18C;
- /* 0x1CC */ u8 unk_1CC;
+ /* 0x1CC */ u8 cueId;
/* 0x1CD */ u8 unk_1CD;
/* 0x1CE */ u16 unk_1CE;
/* 0x1D0 */ s32 unk_1D0;
diff --git a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
index b68634f81..2c232f096 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
@@ -76,14 +76,14 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->unk_278 = ENDAIKU_GET_FF(&this->actor);
- if (this->unk_278 == ENDAIKU_PARAMS_FF_3) {
- this->unk_288 = ENDAIKU_GET_FF00(&this->actor);
- this->unk_258 = SubS_GetPathByIndex(play, this->unk_288, 0x3F);
- } else if (this->unk_278 == ENDAIKU_PARAMS_FF_2) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_3) {
+ this->pathIndex = ENDAIKU_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENDAIKU_PATH_INDEX_NONE);
+ } else if (this->unk_278 == ENDAIKU_PARAM_FF_2) {
this->unk_264 = -2000;
}
- if (this->unk_278 == ENDAIKU_PARAMS_FF_0) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_0) {
this->collider.dim.radius = 30;
this->collider.dim.height = 60;
this->collider.dim.yShift = 0;
@@ -100,20 +100,20 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = -3.0f;
switch (this->unk_278) {
- case ENDAIKU_PARAMS_FF_0:
+ case ENDAIKU_PARAM_FF_0:
this->unk_27E = this->unk_278 * 4 + 4;
- case ENDAIKU_PARAMS_FF_1:
+ case ENDAIKU_PARAM_FF_1:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_002FA0,
this->jointTable, this->morphTable, 17);
break;
- case ENDAIKU_PARAMS_FF_2:
+ case ENDAIKU_PARAM_FF_2:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_00B690,
this->jointTable, this->morphTable, 17);
break;
- case ENDAIKU_PARAMS_FF_3:
+ case ENDAIKU_PARAM_FF_3:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_001114,
this->jointTable, this->morphTable, 17);
break;
@@ -134,8 +134,8 @@ void func_8094373C(EnDaiku* this, s32 arg1) {
}
void func_809437C8(EnDaiku* this) {
- if ((this->unk_288 != -1) && (this->unk_258 != 0)) {
- if (!SubS_CopyPointFromPath(this->unk_258, this->unk_25C, &this->unk_26C)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
+ if (!SubS_CopyPointFromPath(this->path, this->unk_25C, &this->unk_26C)) {
Actor_Kill(&this->actor);
}
}
@@ -173,7 +173,7 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
s32 pad2;
if (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
- if (this->unk_278 == ENDAIKU_PARAMS_FF_1) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_1) {
this->actor.textId = 0x2365;
} else {
this->actor.textId = 0x2366;
@@ -188,7 +188,7 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
return;
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_2) && (this->unk_284 <= currentFrame)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_2) && (this->unk_284 <= currentFrame)) {
if (Rand_ZeroOne() < 0.5f) {
func_8094373C(this, 7);
} else {
@@ -196,8 +196,9 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
}
}
- if (this->unk_278 == ENDAIKU_PARAMS_FF_3) {
- f32 sq, abs;
+ if (this->unk_278 == ENDAIKU_PARAM_FF_3) {
+ f32 xzDist;
+ f32 yawDiff;
Math_ApproachF(&this->actor.world.pos.x, this->unk_26C.x, 0.5f,
fabsf(2.0f * Math_SinS(this->actor.world.rot.y)));
@@ -205,11 +206,11 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
fabsf(2.0f * Math_CosS(this->actor.world.rot.y)));
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_282, 1, 0x7D0, 0xA);
- sq = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
- abs = fabsf(this->actor.world.rot.y - this->unk_282);
- if ((sq < SQ(2.0f)) && (this->unk_258 != NULL) && (abs < 10.0f)) {
+ xzDist = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
+ yawDiff = fabsf(this->actor.world.rot.y - this->unk_282);
+ if ((xzDist < 4.0f) && (this->path != NULL) && (yawDiff < 10.0f)) {
this->unk_25C++;
- if (this->unk_25C >= this->unk_258->count) {
+ if (this->unk_25C >= this->path->count) {
this->unk_25C = 0;
}
@@ -218,10 +219,11 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
}
}
- if (this->unk_278 != ENDAIKU_PARAMS_FF_0) {
+ if (this->unk_278 != ENDAIKU_PARAM_FF_0) {
s16 angle = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.world.rot.y));
+
this->unk_280 = this->actor.yawTowardsPlayer;
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_1) || (this->unk_278 == ENDAIKU_PARAMS_FF_2) || (angle <= 0x2890)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_1) || (this->unk_278 == ENDAIKU_PARAM_FF_2) || (angle <= 0x2890)) {
func_800B8614(&this->actor, play, 100.0f);
}
}
@@ -235,7 +237,7 @@ void func_80943BC0(EnDaiku* this) {
void func_80943BDC(EnDaiku* this, PlayState* play) {
f32 currentFrame = this->skelAnime.curFrame;
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_2) && (this->unk_284 <= currentFrame)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_2) && (this->unk_284 <= currentFrame)) {
if (Rand_ZeroOne() < 0.5f) {
func_8094373C(this, 7);
} else {
@@ -257,7 +259,7 @@ void EnDaiku_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_0) && (gSaveContext.save.day == 3) && (gSaveContext.save.isNight)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_0) && (gSaveContext.save.day == 3) && (gSaveContext.save.isNight)) {
Actor_Kill(&this->actor);
return;
}
@@ -278,7 +280,9 @@ void EnDaiku_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Math_SmoothStepToS(&this->unk_260, this->unk_266, 1, 0xBB8, 0);
Math_SmoothStepToS(&this->unk_25E, this->unk_264, 1, 0xBB8, 0);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.uncullZoneForward = 650.0f;
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -310,7 +314,7 @@ void EnDaiku_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
gSPDisplayList(POLY_OPA_DISP++, D_809440D4[this->unk_278]);
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_3) && (limbIndex == 8)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_3) && (limbIndex == 8)) {
gSPDisplayList(POLY_OPA_DISP++, object_daiku_DL_008EC8);
}
@@ -322,7 +326,7 @@ void EnDaiku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
switch (this->unk_278) {
case 0:
diff --git a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
index 4a3c9b444..ff88c8c9a 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
@@ -8,14 +8,16 @@ struct EnDaiku;
typedef void (*EnDaikuActionFunc)(struct EnDaiku*, PlayState*);
#define ENDAIKU_GET_FF(thisx) ((thisx)->params & 0xFF)
-#define ENDAIKU_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+#define ENDAIKU_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
- /* 0x0 */ ENDAIKU_PARAMS_FF_0,
- /* 0x1 */ ENDAIKU_PARAMS_FF_1,
- /* 0x2 */ ENDAIKU_PARAMS_FF_2,
- /* 0x3 */ ENDAIKU_PARAMS_FF_3,
-};
+#define ENDAIKU_PATH_INDEX_NONE 0x3F
+
+typedef enum {
+ /* 0 */ ENDAIKU_PARAM_FF_0,
+ /* 1 */ ENDAIKU_PARAM_FF_1,
+ /* 2 */ ENDAIKU_PARAM_FF_2,
+ /* 3 */ ENDAIKU_PARAM_FF_3
+} EnDaikuParam;
typedef struct EnDaiku {
/* 0x000 */ Actor actor;
@@ -23,7 +25,7 @@ typedef struct EnDaiku {
/* 0x188 */ Vec3s jointTable[17];
/* 0x1EE */ Vec3s morphTable[17];
/* 0x254 */ EnDaikuActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x25E */ s16 unk_25E;
/* 0x260 */ s16 unk_260;
@@ -38,7 +40,7 @@ typedef struct EnDaiku {
/* 0x280 */ s16 unk_280;
/* 0x282 */ s16 unk_282;
/* 0x284 */ f32 unk_284;
- /* 0x288 */ s16 unk_288;
+ /* 0x288 */ s16 pathIndex;
/* 0x28A */ s16 unk_28A;
/* 0x28C */ s16 unk_28C;
/* 0x28E */ UNK_TYPE1 unk_28E[0xE];
diff --git a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
index e93cf4493..311b6d216 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
@@ -69,8 +69,8 @@ static ColliderCylinderInit sCylinderInit = {
};
void func_80BE61D0(EnDaiku2* this) {
- if ((this->unk_27A != -1) && (this->unk_258 != 0)) {
- if (!SubS_CopyPointFromPath(this->unk_258, this->unk_25C, &this->unk_268)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
+ if (!SubS_CopyPointFromPath(this->path, this->unk_25C, &this->unk_268)) {
Actor_Kill(&this->actor);
}
}
@@ -87,8 +87,8 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->unk_278 = ENDAIKU2_GET_7F(&this->actor);
- this->unk_27A = ENDAIKU2_GET_1F80(&this->actor);
- this->unk_258 = SubS_GetPathByIndex(play, this->unk_27A, 0x3F);
+ this->pathIndex = ENDAIKU2_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENDAIKU2_PATH_INDEX_NONE);
this->unk_280 = ENDAIKU2_GET_8000(&this->actor);
Actor_SetScale(&this->actor, 0.01f);
if (!this->unk_280) {
@@ -100,7 +100,7 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
if (this->unk_278 == ENDAIKU2_GET_7F_127) {
this->unk_278 = ENDAIKU2_GET_7F_MINUS1;
} else if (Flags_GetSwitch(play, this->unk_278)) {
- this->unk_25C = this->unk_258->count - 1;
+ this->unk_25C = this->path->count - 1;
func_80BE61D0(this);
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_268);
}
@@ -243,9 +243,9 @@ void func_80BE66E4(EnDaiku2* this, PlayState* play) {
sp70.y += 40.0f;
sp70.z += Math_CosS(this->actor.world.rot.y) * 70.0f;
- sp70.x += randPlusMinusPoint5Scaled(5.0f);
- sp70.y += randPlusMinusPoint5Scaled(5.0f);
- sp70.z += randPlusMinusPoint5Scaled(5.0f);
+ sp70.x += Rand_CenteredFloat(5.0f);
+ sp70.y += Rand_CenteredFloat(5.0f);
+ sp70.z += Rand_CenteredFloat(5.0f);
sp88.y = -1.0f;
@@ -342,9 +342,9 @@ void func_80BE6D40(EnDaiku2* this, PlayState* play) {
Math_ApproachF(&this->actor.world.pos.z, this->unk_268.z, 0.5f, fabsf(Math_CosS(this->actor.world.rot.y) * 6.0f));
if ((sqrtf(SQ(this->actor.world.pos.x - this->unk_268.x) + SQ(this->actor.world.pos.z - this->unk_268.z)) < 4.0f) &&
- (this->unk_258 != 0)) {
+ (this->path != NULL)) {
this->unk_25C++;
- if (this->unk_25C >= this->unk_258->count) {
+ if (this->unk_25C >= this->path->count) {
func_80BE6EB0(this);
return;
}
@@ -385,7 +385,7 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
fabsf(Math_CosS(this->actor.world.rot.y) * 4.0f));
if ((sqrtf(SQ(this->actor.world.pos.x - this->unk_268.x) + SQ(this->actor.world.pos.z - this->unk_268.z)) <
4.0f) &&
- (this->unk_258 != 0)) {
+ (this->path != NULL)) {
if (!func_80BE64C0(this, play)) {
if (this->unk_276 != 3) {
func_80BE6408(this, 3);
@@ -412,7 +412,7 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
Math_Vec3f_Copy(&sp40, &this->unk_268);
var = this->unk_25C;
this->unk_25C++;
- if (this->unk_25C < this->unk_258->count) {
+ if (this->unk_25C < this->path->count) {
func_80BE61D0(this);
func_80BE6CFC(this);
return;
@@ -453,7 +453,9 @@ void EnDaiku2_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, 65.0f);
Actor_MoveWithGravity(&this->actor);
Math_ApproachF(&this->unk_260, this->unk_264, 0.3f, 2.0f);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
func_80BE7600(this, play);
@@ -464,7 +466,7 @@ void EnDaiku2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (limbIndex == 14) {
Matrix_Scale(this->unk_260, this->unk_260, this->unk_260, MTXMODE_APPLY);
@@ -484,7 +486,7 @@ void EnDaiku2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnDaiku2_PostLimbDraw, &this->actor);
@@ -505,9 +507,9 @@ void func_80BE7504(EnDaiku2* this, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, f32 ar
effect->unk_1C = *arg3;
effect->unk_30 = arg4;
effect->unk_34 = arg5;
- effect->unk_28.x = randPlusMinusPoint5Scaled(30000.0f);
- effect->unk_28.y = randPlusMinusPoint5Scaled(30000.0f);
- effect->unk_28.z = randPlusMinusPoint5Scaled(30000.0f);
+ effect->unk_28.x = Rand_CenteredFloat(30000.0f);
+ effect->unk_28.y = Rand_CenteredFloat(30000.0f);
+ effect->unk_28.z = Rand_CenteredFloat(30000.0f);
break;
}
}
@@ -542,7 +544,7 @@ void func_80BE7718(EnDaiku2* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
objectIdx = Object_GetIndex(&play->objectCtx, OBJECT_BOMBIWA);
if ((objectIdx >= 0) && Object_IsLoaded(&play->objectCtx, objectIdx)) {
diff --git a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
index 130a06a23..58fc26b9a 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
@@ -8,14 +8,16 @@ struct EnDaiku2;
typedef void (*EnDaiku2ActionFunc)(struct EnDaiku2*, PlayState*);
#define ENDAIKU2_GET_7F(thisx) ((thisx)->params & 0x7F)
-#define ENDAIKU2_GET_1F80(thisx) (((thisx)->params >> 7) & 0x3F)
+#define ENDAIKU2_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x3F)
#define ENDAIKU2_GET_8000(thisx) (((thisx)->params >> 15) & 0x1)
-enum {
+#define ENDAIKU2_PATH_INDEX_NONE 0x3F
+
+typedef enum {
/* -1 */ ENDAIKU2_GET_7F_MINUS1 = -1,
/* 0 */ ENDAIKU2_GET_7F_0,
- /* 127 */ ENDAIKU2_GET_7F_127 = 127,
-};
+ /* 127 */ ENDAIKU2_GET_7F_127 = 127
+} EnDaiku2Param;
typedef struct EnDaiku2Effect {
/* 0x00 */ u8 isEnabled;
@@ -35,7 +37,7 @@ typedef struct EnDaiku2 {
/* 0x188 */ Vec3s jointTable[17];
/* 0x1EE */ Vec3s morphTable[17];
/* 0x254 */ EnDaiku2ActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x260 */ f32 unk_260;
/* 0x264 */ f32 unk_264;
@@ -43,7 +45,7 @@ typedef struct EnDaiku2 {
/* 0x274 */ s16 unk_274;
/* 0x276 */ s16 unk_276;
/* 0x278 */ s16 unk_278;
- /* 0x27A */ s16 unk_27A;
+ /* 0x27A */ s16 pathIndex;
/* 0x27C */ UNK_TYPE1 unk_27C[0x4];
/* 0x280 */ s32 unk_280;
/* 0x284 */ f32 unk_284;
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 dd05c2d48..de02f44ad 100644
--- a/src/overlays/actors/ovl_En_Death/z_en_death.c
+++ b/src/overlays/actors/ovl_En_Death/z_en_death.c
@@ -7,7 +7,7 @@
#include "z_en_death.h"
#include "z64rumble.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnDeath*)thisx)
diff --git a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
index d38f23224..422b35e87 100644
--- a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
+++ b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
@@ -384,7 +384,7 @@ void EnDekubaba_Grow(EnDekubaba* this, PlayState* play) {
this->size * 0.01f * (0.5f + (15 - this->timer) * 0.5f / 15.0f);
Math_ScaledStepToS(&this->actor.shape.rot.x, 0x1800, 0x800);
- headDistVertical = sin_rad(CLAMP_MAX((15 - this->timer) * (1.0f / 15), 0.7f) * M_PI) * 32.0f + 14.0f;
+ headDistVertical = Math_SinF(CLAMP_MAX((15 - this->timer) * (1.0f / 15), 0.7f) * M_PI) * 32.0f + 14.0f;
if (this->actor.shape.rot.x < -0x38E3) {
headDistHorizontal = 0.0f;
@@ -468,7 +468,7 @@ void EnDekubaba_Retract(EnDekubaba* this, PlayState* play) {
this->size * 0.01f * (0.5f + this->timer * (1.0f / 30));
Math_ScaledStepToS(&this->actor.shape.rot.x, -0x4000, 0x300);
- headDistVertical = (sin_rad(CLAMP_MAX(this->timer * 0.033f, 0.7f) * M_PI) * 32.0f) + 14.0f;
+ headDistVertical = (Math_SinF(CLAMP_MAX(this->timer * 0.033f, 0.7f) * M_PI) * 32.0f) + 14.0f;
if (this->actor.shape.rot.x < -0x38E3) {
headDistHorizontal = 0.0f;
@@ -1186,9 +1186,10 @@ void EnDekubaba_Update(Actor* thisx, PlayState* play) {
if (this->actionFunc == EnDekubaba_PrunedSomersaultDie) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, this->size * 15.0f, 10.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, this->size * 15.0f, 10.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else if (this->actionFunc != EnDekubaba_DeadStickDrop) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->boundFloor == NULL) {
this->boundFloor = this->actor.floorPoly;
}
@@ -1318,7 +1319,7 @@ void EnDekubaba_DrawShadow(EnDekubaba* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
@@ -1346,7 +1347,7 @@ void EnDekubaba_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Math_Vec3f_Copy(&this->bodyPartsPos[0], &this->actor.world.pos);
if (this->actionFunc != EnDekubaba_DeadStickDrop) {
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 b9e48e6db..cef97a8b0 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -643,7 +643,9 @@ void EnDekunuts_Update(Actor* thisx, PlayState* play) {
func_808BE73C(this, play);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, this->collider.dim.radius, this->collider.dim.height, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, this->collider.dim.radius, this->collider.dim.height,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
if (this->collider.base.acFlags & AC_ON) {
@@ -665,7 +667,9 @@ void EnDekunuts_Update(Actor* thisx, PlayState* play) {
s32 EnDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDekunuts* this = THIS;
- f32 arg1, arg2, arg3;
+ f32 arg1;
+ f32 arg2;
+ f32 arg3;
f32 currentFrame;
if (this->actionFunc == func_808BDA4C) {
diff --git a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
index 59b6677a0..248f758ac 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
@@ -10,12 +10,12 @@ typedef void (*EnDekunutsActionFunc)(struct EnDekunuts*, PlayState*);
#define ENDEKUNUTS_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0x00 */ ENDEKUNUTS_GET_FF00_0,
/* 0x01 */ ENDEKUNUTS_GET_FF00_1,
/* 0x02 */ ENDEKUNUTS_GET_FF00_2,
/* 0xFF */ ENDEKUNUTS_GET_FF00_FF = 0xFF
-};
+} EnDekunutsParam;
typedef struct EnDekunuts {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
index 0d7de9cf1..faacd7510 100644
--- a/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
+++ b/src/overlays/actors/ovl_En_Demo_heishi/z_en_demo_heishi.c
@@ -23,11 +23,11 @@ void EnDemoheishi_Talk(EnDemoheishi* this, PlayState* play);
s32 EnDemoheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
typedef enum {
- /* 0 */ DEMOHEISHI_ANIM_STAND_HAND_ON_HIP,
- /* 1 */ DEMOHEISHI_ANIM_CHEER_WITH_SPEAR,
- /* 2 */ DEMOHEISHI_ANIM_WAVE,
- /* 3 */ DEMOHEISHI_ANIM_SIT_AND_REACH,
- /* 4 */ DEMOHEISHI_ANIM_STAND_UP
+ /* 0 */ DEMOHEISHI_ANIM_STAND_HAND_ON_HIP,
+ /* 1 */ DEMOHEISHI_ANIM_CHEER_WITH_SPEAR,
+ /* 2 */ DEMOHEISHI_ANIM_WAVE,
+ /* 3 */ DEMOHEISHI_ANIM_SIT_AND_REACH,
+ /* 4 */ DEMOHEISHI_ANIM_STAND_UP
} EnDemoheishiAnimation;
ActorInit En_Demo_heishi_InitVars = {
@@ -160,7 +160,9 @@ void EnDemoheishi_Update(Actor* thisx, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetScale(&this->actor, 0.01f);
EnDemoheishi_SetHeadRotation(this);
@@ -186,7 +188,7 @@ s32 EnDemoheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
void EnDemoheishi_Draw(Actor* thisx, PlayState* play) {
EnDemoheishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnDemoheishi_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Dg/z_en_dg.c b/src/overlays/actors/ovl_En_Dg/z_en_dg.c
index 9b513ef67..46c6de979 100644
--- a/src/overlays/actors/ovl_En_Dg/z_en_dg.c
+++ b/src/overlays/actors/ovl_En_Dg/z_en_dg.c
@@ -5,13 +5,12 @@
*/
#include "z_en_dg.h"
+#include "overlays/actors/ovl_En_Aob_01/z_en_aob_01.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_800000)
#define THIS ((EnDg*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnDg_Init(Actor* thisx, PlayState* play);
void EnDg_Destroy(Actor* thisx, PlayState* play);
void EnDg_Update(Actor* thisx, PlayState* play);
@@ -63,7 +62,7 @@ ActorInit En_Dg_InitVars = {
typedef enum {
/* 0 */ DOG_GRAB_STATE_NONE,
/* 1 */ DOG_GRAB_STATE_HELD,
- /* 2 */ DOG_GRAB_STATE_THROWN_OR_SITTING_AFTER_THROW,
+ /* 2 */ DOG_GRAB_STATE_THROWN_OR_SITTING_AFTER_THROW
} DogGrabState;
typedef enum {
@@ -75,7 +74,7 @@ typedef enum {
/* 5 */ DOG_BEHAVIOR_ZORA_WAIT,
/* 6 */ DOG_BEHAVIOR_DEKU,
/* 7 */ DOG_BEHAVIOR_DEKU_WAIT,
- /* 8 */ DOG_BEHAVIOR_DEFAULT,
+ /* 8 */ DOG_BEHAVIOR_DEFAULT
} DogBehavior;
static u8 sIsAnyDogHeld = false;
@@ -86,10 +85,10 @@ static s16 sBremenMaskFollowerIndex = ENDG_INDEX_NO_BREMEN_MASK_FOLLOWER;
* Stores the state for the dogs milling about at the Doggy Racetrack.
*/
typedef struct {
- s16 color; // The dog's color, which is used as an index into sBaseSpeeds
- s16 index; // The dog's index within sDogInfo
- s16 textId; // The ID of the text to display when the dog is picked up
-} RacetrackDogInfo;
+ /* 0x0 */ s16 color; // The dog's color, which is used as an index into sBaseSpeeds
+ /* 0x2 */ s16 index; // The dog's index within sDogInfo
+ /* 0x4 */ s16 textId; // The ID of the text to display when the dog is picked up
+} RacetrackDogInfo; // size = 0x6
/**
* A table of RacetrackDogInfo for every dog at the Doggy Racetrack. Note that the textId values
@@ -237,7 +236,7 @@ void EnDg_UpdateCollision(EnDg* this, PlayState* play) {
Collider_ResetCylinderOC(play, &this->collider.base);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
void EnDg_GetFloorRot(EnDg* this, Vec3f* floorRot) {
@@ -281,7 +280,7 @@ s32 EnDg_HasReachedPoint(EnDg* this, Path* path, s32 pointIndex) {
diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RADF_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
@@ -310,7 +309,7 @@ s16 EnDg_GetYRotation(Path* path, s32 index, Vec3f* pos, f32* distSq) {
*distSq = SQ(diffX) + SQ(diffZ);
- return RADF_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
+ return RAD_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
}
/**
@@ -359,9 +358,9 @@ void EnDg_SpawnFloorDustRing(EnDg* this, PlayState* play) {
Vec3f pos;
if (((this->index + curFrame) % mod) == 0) {
- pos.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ pos.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
pos.y = this->actor.world.pos.y;
- pos.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ pos.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &pos, 10.0f, 0, 2.0f, 300, 0, true);
}
}
@@ -417,20 +416,13 @@ void EnDg_SetupIdleMove(EnDg* this, PlayState* play) {
/**
* Updates the text ID in sRacetrackDogInfo based on what was set in the weekEventRegs by
- * En_Aob_01. This makes it sp the proper message can be displayed when the player picks up
+ * En_Aob_01. This makes it so the proper message can be displayed when the player picks up
* the dog with the Mask of Truth equipped.
*/
void EnDg_UpdateTextId(EnDg* this) {
- if (this->index < 14) {
- // Assuming that the weekEventRegs haven't been tampered with, then this will produce a text ID in
- // the range of 0x3538 to 0x3545.
- if (this->index % 2) {
- sRacetrackDogInfo[this->index].textId =
- 0x3538 + ((gSaveContext.save.weekEventReg[42 + (this->index / 2)] & 0xF0) >> 4);
- } else {
- sRacetrackDogInfo[this->index].textId =
- 0x3538 + (gSaveContext.save.weekEventReg[42 + (this->index / 2)] & 0x0F);
- }
+ if (this->index < RACEDOG_COUNT) {
+ // This will produce a text ID in the range of 0x3538 to 0x3545.
+ sRacetrackDogInfo[this->index].textId = GET_WEEKEVENTREG_DOG_RACE_TEXT(this->index, 0x3538);
} else {
Actor_Kill(&this->actor);
}
@@ -908,14 +900,14 @@ void EnDg_JumpAttack(EnDg* this, PlayState* play) {
if (curFrame < 9) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = randPlusMinusPoint5Scaled(1.0f) + 3.0f;
+ sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = Rand_CenteredFloat(1.0f) + 3.0f;
}
EnDg_SpawnFloorDustRing(this, play);
} else {
this->dogFlags |= DOG_FLAG_JUMP_ATTACKING;
if (Animation_OnFrame(&this->skelAnime, 9.0f)) {
- f32 rand = randPlusMinusPoint5Scaled(1.5f);
+ f32 rand = Rand_CenteredFloat(1.5f);
sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = 1.2f;
this->actor.velocity.y = 2.0f * rand + 3.0f;
@@ -1310,7 +1302,7 @@ void EnDg_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->path = SubS_GetPathByIndex(play, ENDG_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENDG_GET_PATH_INDEX(&this->actor), ENDG_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.0075f);
this->actor.targetMode = 1;
this->actor.gravity = -3.0f;
@@ -1387,7 +1379,7 @@ void EnDg_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Dg/z_en_dg.h b/src/overlays/actors/ovl_En_Dg/z_en_dg.h
index 62c01a011..e36342706 100644
--- a/src/overlays/actors/ovl_En_Dg/z_en_dg.h
+++ b/src/overlays/actors/ovl_En_Dg/z_en_dg.h
@@ -11,17 +11,19 @@ typedef enum {
/* 3 */ DOG_COLOR_BEIGE,
/* 4 */ DOG_COLOR_BROWN,
/* 5 */ DOG_COLOR_BLUE,
- /* 6 */ DOG_COLOR_GOLD,
-} DogColors;
+ /* 6 */ DOG_COLOR_GOLD
+} DogColor;
struct EnDg;
typedef void (*EnDgActionFunc)(struct EnDg*, PlayState*);
#define ENDG_GET_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENDG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENDG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
#define ENDG_PARAMS(path, index) ((path << 10) | (index << 5))
+#define ENDG_PATH_INDEX_NONE 0x3F
+
typedef enum {
/* 0 */ ENDG_INDEX_RACETRACK_0,
/* 1 */ ENDG_INDEX_RACETRACK_1,
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 9c9c46e07..e24e2691b 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -248,7 +248,7 @@ static TexturePtr D_8089E33C[] = {
object_dinofos_Tex_009030,
};
-static s16 D_8089E34C = -1;
+static s16 sCsId = CS_ID_NONE;
static s32 D_8089E350 = 0;
static InitChainEntry sInitChain[] = {
@@ -291,13 +291,13 @@ void EnDinofos_Init(Actor* thisx, PlayState* play) {
}
this->unk_28B = 0;
- if (thisx->cutscene == -1) {
+ if (thisx->csId == CS_ID_NONE) {
func_8089B7B0(this);
} else {
this->actor.flags |= ACTOR_FLAG_100000;
this->actor.gravity = 0.0f;
this->actor.velocity.y = 0.0f;
- D_8089E34C = thisx->cutscene;
+ sCsId = thisx->csId;
func_8089D2E0(this);
}
@@ -367,9 +367,9 @@ void func_8089ABF4(EnDinofos* this, PlayState* play) {
Play_SetCameraAtEye(play, CAM_ID_MAIN, &subCam->at, &subCam->eye);
this->subCamId = SUB_CAM_ID_DONE;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
if (this->actor.colChkInfo.health == 0) {
- func_800B724C(play, &this->actor, PLAYER_CSMODE_6);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_END);
}
}
}
@@ -438,8 +438,9 @@ s32 func_8089AE00(EnDinofos* this, PlayState* play) {
return true;
}
- if ((this->actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != 0) && this->actor.isTargeted &&
- (Rand_ZeroOne() < 0.5f) && func_8089A968(this) && Player_IsFacingActor(&this->actor, 0x2000, play)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ this->actor.isTargeted && (Rand_ZeroOne() < 0.5f) && func_8089A968(this) &&
+ Player_IsFacingActor(&this->actor, 0x2000, play)) {
if (Rand_ZeroOne() < 0.5f) {
func_8089C024(this, 2);
} else {
@@ -584,7 +585,7 @@ void func_8089B72C(EnDinofos* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
func_8089ABF4(this, play);
this->actor.flags &= ~ACTOR_FLAG_100000;
- this->actor.cutscene = -1;
+ this->actor.csId = CS_ID_NONE;
func_8089B7B0(this);
}
}
@@ -972,7 +973,7 @@ void func_8089C7B8(EnDinofos* this, PlayState* play) {
if (this->unk_290 == 0) {
func_8089ACEC(this, play);
if (this->actor.colChkInfo.health == 0) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
func_8089CFAC(this);
} else {
func_8089D2E0(this);
@@ -1004,7 +1005,7 @@ void func_8089C938(EnDinofos* this, PlayState* play) {
Math_StepToF(&this->actor.speed, 0.0f, 0.5f);
if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
if (this->actor.colChkInfo.health == 0) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
func_8089CFAC(this);
} else {
func_8089D2E0(this);
@@ -1061,7 +1062,7 @@ void func_8089CB10(EnDinofos* this, PlayState* play) {
}
void func_8089CBEC(EnDinofos* this, PlayState* play) {
- s16 temp_s3 = ((s32)randPlusMinusPoint5Scaled(0x1000) + this->actor.shape.rot.y) + this->unk_28E;
+ s16 temp_s3 = ((s32)Rand_CenteredFloat(0x1000) + this->actor.shape.rot.y) + this->unk_28E;
Vec3f sp88;
Vec3f sp7C;
ColliderJntSphElementDim* dim;
@@ -1080,10 +1081,10 @@ void func_8089CBEC(EnDinofos* this, PlayState* play) {
temp_s0 = CLAMP_MIN(temp_s0, 0);
sp88.x = 11.0f * temp_f20;
- sp88.y = randPlusMinusPoint5Scaled(2.0f) + -5.4f;
+ sp88.y = Rand_CenteredFloat(2.0f) + -5.4f;
sp88.z = 11.0f * temp_f22;
sp7C.x = 0.9f * temp_f20;
- sp7C.y = randPlusMinusPoint5Scaled(0.6f) + 1.4f;
+ sp7C.y = Rand_CenteredFloat(0.6f) + 1.4f;
sp7C.z = 0.9f * temp_f22;
func_800B9010(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
EffectSsDFire_Spawn(play, &this->limbPos[10], &sp88, &sp7C, 30, 22, 255 - (temp_s0 * 20), 20, 3, 8);
@@ -1097,7 +1098,7 @@ void func_8089CBEC(EnDinofos* this, PlayState* play) {
for (i = 6; i < end; i++) {
dim = &this->colliderJntSph.elements[i].dim;
- temp_s3 = (s32)(cos_rad((this->unk_290 + ((i - 5) << 1)) * (M_PI / 20)) * 0x2C00) + this->actor.shape.rot.y;
+ temp_s3 = (s32)(Math_CosF((this->unk_290 + ((i - 5) << 1)) * (M_PI / 20)) * 0x2C00) + this->actor.shape.rot.y;
dim->worldSphere.center.x = (s32)this->limbPos[10].x + (s32)(Math_SinS(temp_s3) * dim->modelSphere.center.z);
dim->worldSphere.center.y = (s32)this->limbPos[10].y + (s32)dim->modelSphere.center.y;
@@ -1196,21 +1197,21 @@ void func_8089D1E0(EnDinofos* this, PlayState* play) {
}
void func_8089D2E0(EnDinofos* this) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_8089D318;
}
void func_8089D318(EnDinofos* this, PlayState* play) {
Vec3f subCamEye;
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
if (this->actor.colChkInfo.health == 0) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
- func_800B724C(play, &this->actor, PLAYER_CSMODE_7);
+ CutsceneManager_Start(this->actor.csId, &this->actor);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_WAIT);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
}
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
if (this->actor.colChkInfo.health == 0) {
subCamEye.x = (Math_SinS(this->actor.shape.rot.y) * 150.0f) + this->actor.focus.pos.x;
subCamEye.y = this->actor.focus.pos.y;
@@ -1221,7 +1222,7 @@ void func_8089D318(EnDinofos* this, PlayState* play) {
func_8089B100(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -1231,9 +1232,9 @@ void func_8089D42C(EnDinofos* this, PlayState* play) {
if ((this->actionFunc == func_8089B834) && (this->unk_290 != 0)) {
Math_ScaledStepToS(&this->unk_28E, Math_SinS(this->unk_290 * 1400) * 0x2C00, 0x300);
} else if (this->actionFunc == func_8089CA74) {
- Math_ScaledStepToS(&this->unk_28E, cos_rad(M_PI) * 0x2C00, 0x233);
+ Math_ScaledStepToS(&this->unk_28E, Math_CosF(M_PI) * 0x2C00, 0x2C00 / 20);
} else if (this->actionFunc == func_8089CBEC) {
- this->unk_28E = cos_rad(this->unk_290 * (M_PI / 20)) * 0x2C00;
+ this->unk_28E = Math_CosF(this->unk_290 * (M_PI / 20)) * 0x2C00;
} else if (!Play_InCsMode(play)) {
temp_v0_2 = this->unk_28E + this->actor.shape.rot.y;
temp_v0_2 = BINANG_SUB(this->actor.yawTowardsPlayer, temp_v0_2);
@@ -1273,12 +1274,12 @@ s32 func_8089D60C(EnDinofos* this, PlayState* play) {
Enemy_StartFinishingBlow(play, &this->actor);
D_8089E350--;
if (D_8089E350 == 0) {
- if (D_8089E34C != -1) {
- this->actor.cutscene = D_8089E34C;
+ if (sCsId != CS_ID_NONE) {
+ this->actor.csId = sCsId;
}
}
- if (this->actor.cutscene != -1) {
+ if (this->actor.csId != CS_ID_NONE) {
Audio_RestorePrevBgm();
}
}
@@ -1356,7 +1357,9 @@ void EnDinofos_Update(Actor* thisx, PlayState* play2) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 30.0f, 60.0f, 0x5D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_40);
if (this->actionFunc != func_8089C7B8) {
if ((this->actor.depthInWater > 0.0f) && (this->actor.depthInWater < 10.0f)) {
if (!((play->gameplayFrames % 4) & 1)) {
@@ -1472,7 +1475,7 @@ void EnDinofos_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_288 == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPSegment(POLY_OPA_DISP++, 0x08, D_8089E33C[this->unk_289]);
@@ -1483,7 +1486,7 @@ void EnDinofos_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
func_8089DC4C, func_8089DC84, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPSegment(POLY_XLU_DISP++, 0x08, D_8089E33C[this->unk_289]);
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 7a8bc5ddb..c7dbd8888 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -104,7 +104,7 @@ void EnDnb_Init(Actor* thisx, PlayState* play) {
s32 i;
s16* alloc;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_hanareyama_obj_Colheader_004D8C);
alloc = Lib_SegmentedToVirtual(object_hanareyama_obj_Vec_004710);
@@ -156,7 +156,7 @@ void func_80A50510(EnDnb* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++) {
Matrix_Push();
@@ -180,7 +180,7 @@ void func_80A5063C(EnDnb* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++) {
Matrix_Push();
@@ -263,37 +263,36 @@ s32 func_80A50950(EnDnbUnkStruct* arg0, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 256; i++, arg0++) {
- if (arg0->isEnabled == 1) {
- if (!isGfxSetup) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
- isGfxSetup = true;
- }
- Matrix_Push();
-
- //! FAKE:
- if (1) {}
-
- arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
-
- Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
- Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
-
- Matrix_Pop();
- sp5C += 1;
+ if (arg0->isEnabled != 1) {
+ continue;
}
+
+ if (!isGfxSetup) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
+ isGfxSetup = true;
+ }
+ Matrix_Push();
+
+ arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
+
+ Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
+ Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
+ gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
+
+ Matrix_Pop();
+ sp5C += 1;
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
index fd60eca75..216ca0031 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
@@ -213,8 +213,8 @@ void func_80A51648(EnDnk* this, PlayState* play) {
}
void func_80A51890(EnDnk* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 126)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 126));
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_126)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_126));
}
}
@@ -334,7 +334,7 @@ void func_80A51CB8(EnDnk* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A5245C[this->unk_2A0]));
gDPPipeSync(POLY_OPA_DISP++);
@@ -402,7 +402,7 @@ void func_80A51DA4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
}
void func_80A51FC0(EnDnk* this, PlayState* play) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, func_80A51D78, func_80A51DA4,
&this->actor);
}
@@ -423,7 +423,7 @@ void func_80A52018(Actor* thisx, PlayState* play) {
}
void func_80A52074(EnDnk* this, PlayState* play) {
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 80:
func_8019F128(NA_SE_EN_DEKNUTS_DANCE1);
break;
@@ -441,13 +441,13 @@ void func_80A52074(EnDnk* this, PlayState* play) {
break;
}
- if ((play->csCtx.frames >= 198) && (play->csCtx.frames < 438)) {
+ if ((play->csCtx.curFrame >= 198) && (play->csCtx.curFrame < 438)) {
func_8019F128(NA_SE_EN_DEKNUTS_DANCE - SFX_FLAG);
}
}
void func_80A52134(EnDnk* this, PlayState* play) {
- if ((play->csCtx.state != 0) && (ENDNK_GET_3C(&this->actor) == 4) && (play->sceneId == SCENE_SPOT00) &&
+ if ((play->csCtx.state != CS_STATE_IDLE) && (ENDNK_GET_3C(&this->actor) == 4) && (play->sceneId == SCENE_SPOT00) &&
(gSaveContext.sceneLayer == 2)) {
func_80A52074(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
index f0665f1b5..57467b3f1 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
@@ -10,13 +10,13 @@ typedef void (*EnDnkActionFunc)(struct EnDnk*, PlayState*);
#define ENDNK_GET_3(thisx) ((thisx)->params & 0x3)
#define ENDNK_GET_3C(thisx) ((thisx)->params & 0x3C)
-enum {
- /* 0x0 */ ENDNK_GET_3_0,
- /* 0x1 */ ENDNK_GET_3_1,
- /* 0x2 */ ENDNK_GET_3_2,
- /* 0x3 */ ENDNK_GET_3_3,
- /* 0x4 */ ENDNK_GET_3_4,
-};
+typedef enum {
+ /* 0 */ ENDNK_GET_3_0,
+ /* 1 */ ENDNK_GET_3_1,
+ /* 2 */ ENDNK_GET_3_2,
+ /* 3 */ ENDNK_GET_3_3,
+ /* 4 */ ENDNK_GET_3_4
+} EnDnkParam;
typedef struct EnDnk {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Dno/z_en_dno.c b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
index aad29992a..904a18e62 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -63,7 +63,7 @@ typedef enum {
/* 16 */ EN_DNO_ANIM_IMPLORE_START,
/* 17 */ EN_DNO_ANIM_SHOCK_START,
/* 18 */ EN_DNO_ANIM_SHOCK_LOOP,
- /* 19 */ EN_DNO_ANIM_GRIEVE,
+ /* 19 */ EN_DNO_ANIM_GRIEVE
} EnDnoAnimation;
static AnimationSpeedInfo sAnimations[] = {
@@ -235,7 +235,7 @@ void EnDno_Init(Actor* thisx, PlayState* play) {
this->morphTable, DEKU_BUTLER_LIMB_MAX);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, thisx, &sCylinderInit);
- Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Animation_Change(&this->skelAnime, sAnimations[EN_DNO_ANIM_IDLE_WITH_CANDLE].animation, 1.0f, 0.0f,
Animation_GetLastFrame(sAnimations[EN_DNO_ANIM_IDLE_WITH_CANDLE].animation),
sAnimations[EN_DNO_ANIM_IDLE_WITH_CANDLE].mode,
@@ -243,7 +243,7 @@ void EnDno_Init(Actor* thisx, PlayState* play) {
this->unk_3BE = 0x3E93;
this->unk_3C0 = 60.0f;
this->unk_3B0 = 0;
- this->unk_468 = 99;
+ this->cueId = 99;
this->skelAnime.playSpeed = 0.0f;
switch (EN_DNO_GET_C000(thisx)) {
@@ -762,7 +762,7 @@ void func_80A72C04(EnDno* this, PlayState* play) {
}
void func_80A72CF8(EnDno* this, PlayState* play) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_DOOR_WARP1, this->actor.world.pos.x + 80.0f,
this->actor.floorHeight, this->actor.world.pos.z, 0, 0, 0, 0x201);
}
@@ -916,12 +916,12 @@ void func_80A732C8(EnDno* this, PlayState* play) {
void func_80A73408(EnDno* this, PlayState* play) {
s32 phi_a2;
u8 sp33 = true;
- s32 temp_v0;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 475)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, 475);
- if (this->unk_468 != play->csCtx.actorActions[temp_v0]->action) {
- switch (play->csCtx.actorActions[temp_v0]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_475)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_475);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
phi_a2 = 13;
break;
@@ -940,7 +940,7 @@ void func_80A73408(EnDno* this, PlayState* play) {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, phi_a2, &this->animIndex);
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
if ((Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) &&
@@ -960,7 +960,7 @@ void EnDno_Update(Actor* thisx, PlayState* play) {
func_80A73408(this, play);
this->actionFunc(this, play);
if (this->unk_3B0 & 4) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -1032,7 +1032,7 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (phi_v0 == true) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (limbIndex == 13) {
Matrix_Scale(this->unk_454, this->unk_454, this->unk_454, MTXMODE_APPLY);
Matrix_RotateXS(this->unk_45C, MTXMODE_APPLY);
@@ -1058,7 +1058,7 @@ void EnDno_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(0.15f, 0.15f, 1.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, -3200.0f, 0.0f, MTXMODE_APPLY);
- gfxXlu = func_8012C2B4(POLY_XLU_DISP);
+ gfxXlu = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(gfxXlu, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(&gfxXlu[1], 0x08,
diff --git a/src/overlays/actors/ovl_En_Dno/z_en_dno.h b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
index 470c82ee8..b2e7f750f 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.h
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
@@ -13,8 +13,8 @@ typedef void (*EnDnoActionFunc)(struct EnDno*, PlayState*);
#define EN_DNO_GET_C000(thisx) (((thisx)->params >> 0xE) & 0x3)
typedef enum {
- /* 0x0 */ EN_DNO_GET_C000_0,
- /* 0x1 */ EN_DNO_GET_C000_1,
+ /* 0 */ EN_DNO_GET_C000_0,
+ /* 1 */ EN_DNO_GET_C000_1
} EnDnoUnkC000;
typedef struct EnDno {
@@ -47,7 +47,7 @@ typedef struct EnDno {
/* 0x460 */ Actor* unk_460;
/* 0x464 */ u16 textId;
/* 0x466 */ s16 unk_466;
- /* 0x468 */ u8 unk_468;
+ /* 0x468 */ u8 cueId;
} EnDno; // size = 0x46C
#endif // Z_EN_DNO_H
diff --git a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
index 11240f27b..1dd5dac34 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
@@ -29,7 +29,7 @@ typedef enum {
/* 1 */ EN_DNP_EYE_HALF,
/* 2 */ EN_DNP_EYE_CLOSED,
/* 3 */ EN_DNP_EYE_ANGRY,
- /* 4 */ EN_DNP_EYE_MAX,
+ /* 4 */ EN_DNP_EYE_MAX
} EnDnpEyeIndex;
ActorInit En_Dnp_InitVars = {
@@ -265,11 +265,11 @@ s32 func_80B3CF60(EnDnp* this, PlayState* play) {
s32 func_80B3D044(EnDnp* this, PlayState* play) {
s32 ret = false;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (!(this->unk_322 & 0x200)) {
this->unk_322 |= (0x200 | 0x10);
this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_324 = 0xFF;
+ this->cueId = 255;
}
SubS_UpdateFlags(&this->unk_322, 0, 7);
this->actionFunc = func_80B3D11C;
@@ -292,20 +292,19 @@ void func_80B3D11C(EnDnp* this, PlayState* play) {
EN_DNP_ANIM_ANGRY_START, EN_DNP_ANIM_JUMP, EN_DNP_ANIM_BOUNCE_START,
EN_DNP_ANIM_GLARE_START, EN_DNP_ANIM_BOW,
};
- s32 temp_v0;
- s32 val;
+ s32 cueChannel;
+ s32 cueId;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_29_40) && (play->sceneId == SCENE_MITURIN) &&
- (play->csCtx.currentCsIndex == 0)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_29_40) && (play->sceneId == SCENE_MITURIN) && (play->csCtx.scriptIndex == 0)) {
this->unk_322 |= 0x20;
SET_WEEKEVENTREG(WEEKEVENTREG_29_40);
}
- if (Cutscene_CheckActorAction(play, 101)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, 101);
- val = play->csCtx.actorActions[temp_v0]->action;
- if (this->unk_324 != (u8)val) {
- EnDnp_ChangeAnim(this, sCsAnimations[val]);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_101)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_101);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ EnDnp_ChangeAnim(this, sCsAnimations[cueId]);
if (this->animIndex == EN_DNP_ANIM_CUTSCENE_IDLE) {
this->unk_322 |= 8;
} else {
@@ -323,14 +322,14 @@ void func_80B3D11C(EnDnp* this, PlayState* play) {
}
}
- this->unk_324 = val;
+ this->cueId = cueId;
if (((this->animIndex == EN_DNP_ANIM_THINK_START) || (this->animIndex == EN_DNP_ANIM_ARMS_TOGETHER_START) ||
(this->animIndex == EN_DNP_ANIM_LAUGH_START) || (this->animIndex == EN_DNP_ANIM_ANGRY_START) ||
(this->animIndex == EN_DNP_ANIM_BOUNCE_START) || (this->animIndex == EN_DNP_ANIM_GLARE_START)) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnDnp_ChangeAnim(this, this->animIndex + 1);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
@@ -387,11 +386,11 @@ void func_80B3D47C(EnDnp* this, PlayState* play) {
}
void func_80B3D558(EnDnp* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
SET_WEEKEVENTREG(WEEKEVENTREG_23_20);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -415,7 +414,7 @@ void EnDnp_Init(Actor* thisx, PlayState* play) {
SubS_UpdateFlags(&this->unk_322, 0, 7);
this->actor.shape.rot.x = 0;
this->actor.world.rot.x = this->actor.shape.rot.x;
- this->actor.cutscene = 0x10;
+ this->actor.csId = 16;
this->actionFunc = func_80B3D47C;
} else if (((EN_DNP_GET_TYPE(&this->actor) == EN_DNP_TYPE_WOODFALL_TEMPLE) &&
!Inventory_HasItemInBottle(ITEM_DEKU_PRINCESS) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) ||
@@ -457,7 +456,7 @@ void EnDnp_Update(Actor* thisx, PlayState* play) {
func_80B3CD1C(this);
func_80B3CEC0(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
sp2C = this->collider.dim.radius + 50;
sp28 = this->collider.dim.height + 30;
if ((this->unk_322 & 0x400) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) {
@@ -543,7 +542,7 @@ void EnDnp_Draw(Actor* thisx, PlayState* play) {
if (this->unk_322 & 0x100) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
diff --git a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
index a41a63615..9b02f19d3 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
@@ -11,9 +11,9 @@ typedef void (*EnDnpActionFunc)(struct EnDnp*, PlayState*);
#define EN_DNP_GET_TYPE(thisx) ((thisx)->params & 7)
typedef enum {
- /* 0x0 */ EN_DNP_TYPE_WOODFALL_TEMPLE,
- /* 0x1 */ EN_DNP_TYPE_RELEASED_FROM_BOTTLE,
- /* 0x2 */ EN_DNP_TYPE_DEKU_KINGS_CHAMBER,
+ /* 0 */ EN_DNP_TYPE_WOODFALL_TEMPLE,
+ /* 1 */ EN_DNP_TYPE_RELEASED_FROM_BOTTLE,
+ /* 2 */ EN_DNP_TYPE_DEKU_KINGS_CHAMBER
} EnDnpType;
typedef struct EnDnp {
@@ -26,7 +26,7 @@ typedef struct EnDnp {
/* 0x1EA */ Vec3s jointTable[DEKU_PRINCESS_LIMB_MAX];
/* 0x286 */ Vec3s morphTable[DEKU_PRINCESS_LIMB_MAX];
/* 0x322 */ u16 unk_322;
- /* 0x324 */ u8 unk_324;
+ /* 0x324 */ u8 cueId;
/* 0x328 */ s32 unk_328;
/* 0x32C */ UNK_TYPE1 unk_32C[0x2];
/* 0x32E */ s16 unk_32E;
diff --git a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
index 131a27d74..667f1eafb 100644
--- a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
+++ b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.c
@@ -121,10 +121,10 @@ void func_80A52604(EnDnq* this, PlayState* play) {
s32 func_80A52648(EnDnq* this, PlayState* play) {
s32 ret = false;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (!(this->unk_37C & 0x20)) {
this->picto.actor.flags &= ~ACTOR_FLAG_1;
- this->unk_1DC = 0xFF;
+ this->cueId = 255;
this->unk_37C |= 0x20;
}
SubS_UpdateFlags(&this->unk_37C, 0, 7);
@@ -132,7 +132,7 @@ s32 func_80A52648(EnDnq* this, PlayState* play) {
} else {
if (this->unk_37C & 0x20) {
this->picto.actor.flags |= ACTOR_FLAG_1;
- this->unk_1DC = 0xFF;
+ this->cueId = 255;
this->unk_37C &= ~0x20;
SubS_UpdateFlags(&this->unk_37C, 3, 7);
}
@@ -346,7 +346,7 @@ void func_80A52DC8(EnDnq* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_23_20)) {
this->unk_390 = 70.0f;
if (Inventory_HasItemInBottle(ITEM_DEKU_PRINCESS) && !Play_InCsMode(play) &&
- (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) && (ActorCutscene_GetCurrentIndex() == -1)) {
+ (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
if ((DECR(this->unk_384) == 0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_29_40)) {
Message_StartTextbox(play, 0x969, NULL);
this->unk_384 = 200;
@@ -391,15 +391,15 @@ void func_80A53038(EnDnq* this, PlayState* play) {
static s32 D_80A535FC[] = {
0, 1, 2, 3, 5, 6,
};
- s32 temp_v0;
- u32 temp_v1;
+ s32 cueChannel;
+ u32 cueId;
- if (Cutscene_CheckActorAction(play, 105)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, 105);
- temp_v1 = play->csCtx.actorActions[temp_v0]->action;
- if (this->unk_1DC != (u8)temp_v1) {
- func_80A5257C(this, D_80A535FC[temp_v1]);
- this->unk_1DC = temp_v1;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_105)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_105);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ func_80A5257C(this, D_80A535FC[cueId]);
+ this->cueId = cueId;
}
if ((this->unk_398 == 4) && Animation_OnFrame(&this->skelAnime, 2.0f)) {
@@ -411,7 +411,7 @@ void func_80A53038(EnDnq* this, PlayState* play) {
func_80A5257C(this, this->unk_398 + 1);
}
- Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, cueChannel);
}
}
@@ -455,7 +455,7 @@ void EnDnq_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
func_80A52B68(this, play);
SkelAnime_Update(&this->skelAnime);
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->unk_394 = this->picto.actor.xzDistToPlayer;
func_80A52C6C(this, play);
func_8013C964(&this->picto.actor, play, this->unk_390, fabsf(this->picto.actor.playerHeightRel) + 1.0f,
@@ -469,7 +469,7 @@ void EnDnq_Update(Actor* thisx, PlayState* play) {
void EnDnq_Draw(Actor* thisx, PlayState* play) {
EnDnq* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->picto.actor);
}
diff --git a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.h b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.h
index 5afb8bdf8..6ede37a55 100644
--- a/src/overlays/actors/ovl_En_Dnq/z_en_dnq.h
+++ b/src/overlays/actors/ovl_En_Dnq/z_en_dnq.h
@@ -14,7 +14,7 @@ typedef struct EnDnq {
/* 0x148 */ SkelAnime skelAnime;
/* 0x18C */ EnDnqActionFunc actionFunc;
/* 0x190 */ ColliderCylinder collider;
- /* 0x1DC */ u8 unk_1DC;
+ /* 0x1DC */ u8 cueId;
/* 0x1E0 */ s32 unk_1E0;
/* 0x1E4 */ Vec3s jointTable[DEKU_KING_LIMB_MAX];
/* 0x2AA */ Vec3s morphTable[DEKU_KING_LIMB_MAX];
diff --git a/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
index d21448217..d662e7e55 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -30,7 +30,7 @@ typedef enum {
/* 7 */ EN_DNS_ANIM_RUN_LOOP,
/* 8 */ EN_DNS_ANIM_DANCE,
/* 9 */ EN_DNS_ANIM_FLIP,
- /* 10 */ EN_DNS_ANIM_MAX,
+ /* 10 */ EN_DNS_ANIM_MAX
} EnDnsAnimation;
static s32 D_8092DCB0[] = {
@@ -205,19 +205,19 @@ s32* func_8092C9BC(EnDns* this, PlayState* play) {
return 0;
}
-s32 func_8092CA74(EnDns* this) {
+s32 EnDns_GetCueType(EnDns* this) {
switch (ENDNS_GET_7(&this->actor)) {
case ENDNS_GET_7_0:
- return 465;
+ return CS_CMD_ACTOR_CUE_465;
case ENDNS_GET_7_1:
- return 466;
+ return CS_CMD_ACTOR_CUE_466;
case ENDNS_GET_7_2:
- return 467;
+ return CS_CMD_ACTOR_CUE_467;
case ENDNS_GET_7_3:
- return 468;
+ return CS_CMD_ACTOR_CUE_468;
}
return 0;
@@ -249,13 +249,13 @@ s32 func_8092CAD0(EnDns* this, PlayState* play) {
s32 func_8092CB98(EnDns* this, PlayState* play) {
s32 phi_v1 = 0;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (!(this->unk_2C6 & 0x80)) {
- this->unk_2C8 = func_8092CA74(this);
+ this->cueType = EnDns_GetCueType(this);
this->actor.flags &= ~ACTOR_FLAG_1;
SubS_UpdateFlags(&this->unk_2C6, 0, 7);
this->unk_2C6 |= 0x80;
- this->unk_1D8 = 0xFF;
+ this->cueId = 255;
}
phi_v1 = 1;
} else if (this->unk_2C6 & 0x80) {
@@ -377,7 +377,7 @@ s32 func_8092D068(EnDns* this) {
void func_8092D108(EnDns* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_SetTranslateRotateYXZ(this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z,
&this->actor.home.rot);
@@ -479,15 +479,15 @@ void func_8092D5E8(EnDns* this, PlayState* play) {
EN_DNS_ANIM_SURPRISE_START,
EN_DNS_ANIM_RUN_START,
};
- s32 temp_v0;
- u32 temp_v1;
+ s32 cueChannel;
+ u32 cueId;
- if (Cutscene_CheckActorAction(play, this->unk_2C8)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, this->unk_2C8);
- temp_v1 = play->csCtx.actorActions[temp_v0]->action;
- if (this->unk_1D8 != (u8)temp_v1) {
- func_8092C63C(this, D_8092DE0C[temp_v1]);
- this->unk_1D8 = temp_v1;
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueChannel = Cutscene_GetCueChannel(play, this->cueType);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
+ if (this->cueId != (u8)cueId) {
+ func_8092C63C(this, D_8092DE0C[cueId]);
+ this->cueId = cueId;
}
if (((this->animIndex == EN_DNS_ANIM_SURPRISE_START) || (this->animIndex == EN_DNS_ANIM_RUN_START)) &&
@@ -495,7 +495,7 @@ void func_8092D5E8(EnDns* this, PlayState* play) {
func_8092C63C(this, this->animIndex + 1);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, temp_v0);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
@@ -550,7 +550,7 @@ void EnDns_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
func_8092C934(this);
func_8092C86C(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_8013C964(&this->actor, play, 80.0f, 40.0f, PLAYER_IA_NONE, this->unk_2C6 & 7);
Actor_SetFocus(&this->actor, 34.0f);
func_8092C6FC(this, play);
@@ -640,7 +640,7 @@ void EnDns_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Dns/z_en_dns.h b/src/overlays/actors/ovl_En_Dns/z_en_dns.h
index b54e49a6a..ade8b6174 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.h
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.h
@@ -13,20 +13,19 @@ typedef s32 (*EnDnsFunc)(struct EnDns*, PlayState*);
#define ENDNS_GET_4000(thisx) ((thisx)->params & 0x4000)
#define ENDNS_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
- /* 0x0 */ ENDNS_GET_7_0,
- /* 0x1 */ ENDNS_GET_7_1,
- /* 0x2 */ ENDNS_GET_7_2,
- /* 0x3 */ ENDNS_GET_7_3,
-};
+typedef enum {
+ /* 0 */ ENDNS_GET_7_0,
+ /* 1 */ ENDNS_GET_7_1,
+ /* 2 */ ENDNS_GET_7_2,
+ /* 3 */ ENDNS_GET_7_3
+} EnDnsParam;
typedef struct EnDns {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnDnsActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
- /* 0x1D8 */ u8 unk_1D8;
- /* 0x1D9 */ UNK_TYPE1 unk_1D9[0x3];
+ /* 0x1D8 */ u8 cueId;
/* 0x1DC */ s32 unk_1DC;
/* 0x1E0 */ s32* unk_1E0;
/* 0x1E4 */ Gfx* unk_1E4[13];
@@ -35,7 +34,7 @@ typedef struct EnDns {
/* 0x22A */ Vec3s jointTable[KINGS_CHAMBER_DEKU_GUARD_LIMB_MAX];
/* 0x278 */ Vec3s morphTable[KINGS_CHAMBER_DEKU_GUARD_LIMB_MAX];
/* 0x2C6 */ u16 unk_2C6;
- /* 0x2C8 */ u16 unk_2C8;
+ /* 0x2C8 */ u16 cueType;
/* 0x2CA */ UNK_TYPE1 unk_2CA[0x2];
/* 0x2CC */ s16 unk_2CC;
/* 0x2CE */ s16 unk_2CE;
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 52870a787..6149a7360 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -358,7 +358,7 @@ void func_80876930(EnDodongo* this, PlayState* play, Vec3f* arg2) {
s16 temp2;
f32 temp3;
- if (func_800C9BB8(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == COLPOLY_SURFACE_SNOW) {
+ if (SurfaceType_GetMaterial(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == SURFACE_MATERIAL_SNOW) {
sp80 = &D_8087932C;
sp7C = &D_80879330;
} else {
@@ -371,11 +371,11 @@ void func_80876930(EnDodongo* this, PlayState* play, Vec3f* arg2) {
temp3 = this->unk_334 * 30.0f;
for (i = 0; i < 3; i++) {
- sp88.x = randPlusMinusPoint5Scaled(temp3) + arg2->x;
+ sp88.x = Rand_CenteredFloat(temp3) + arg2->x;
sp88.y = Rand_ZeroFloat(5.0f) + this->actor.floorHeight;
- sp88.z = randPlusMinusPoint5Scaled(temp3) + arg2->z;
- D_8087933C.x = randPlusMinusPoint5Scaled(2.0f);
- D_8087933C.z = randPlusMinusPoint5Scaled(2.0f);
+ sp88.z = Rand_CenteredFloat(temp3) + arg2->z;
+ D_8087933C.x = Rand_CenteredFloat(2.0f);
+ D_8087933C.z = Rand_CenteredFloat(2.0f);
func_800B0DE0(play, &sp88, &gZeroVec3f, &D_8087933C, sp80, sp7C, temp1, temp2);
}
}
@@ -738,9 +738,9 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
this->timer--;
if (this->timer == 10) {
for (i = 10; i >= 0; i--) {
- sp84.x = randPlusMinusPoint5Scaled(10.0f);
- sp84.y = randPlusMinusPoint5Scaled(10.0f);
- sp84.z = randPlusMinusPoint5Scaled(10.0f);
+ sp84.x = Rand_CenteredFloat(10.0f);
+ sp84.y = Rand_CenteredFloat(10.0f);
+ sp84.z = Rand_CenteredFloat(10.0f);
sp78.x = sp84.x * -0.1f;
sp78.y = sp84.y * -0.1f;
sp78.z = sp84.z * -0.1f;
@@ -914,7 +914,8 @@ void func_808787B0(EnDodongo* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->timer == 0) {
EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
+ this->actor.world.pos.y, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
}
@@ -1024,7 +1025,9 @@ void EnDodongo_Update(Actor* thisx, PlayState* play2) {
EnDodongo_UpdateDamage(this, play);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 75.0f, 60.0f, 70.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 75.0f, 60.0f, 70.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GERUDOFT_DOWN);
}
@@ -1100,7 +1103,7 @@ void EnDodongo_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnDodongo_Draw(Actor* thisx, PlayState* play) {
EnDodongo* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnDodongo_OverrideLimbDraw,
EnDodongo_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.c b/src/overlays/actors/ovl_En_Door/z_en_door.c
index 478f071b3..60d0ec673 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.c
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.c
@@ -15,7 +15,6 @@
#include "objects/object_wdor03/object_wdor03.h"
#include "objects/object_wdor04/object_wdor04.h"
#include "objects/object_wdor05/object_wdor05.h"
-#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_numa_obj/object_numa_obj.h"
#include "objects/object_kaizoku_obj/object_kaizoku_obj.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
@@ -240,7 +239,7 @@ u8 D_80867744[] = {
};
u8 D_8086775C[] = {
- /* 0x00 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_52_20, 0x1B - 0x04),
+ /* 0x00 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE, 0x1B - 0x04),
/* 0x04 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_75_20, 0x1B - 0x08),
/* 0x08 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_14_04, 0x0E - 0x0C),
/* 0x0C */ SCHEDULE_CMD_RET_VAL_S(29),
@@ -290,10 +289,10 @@ ActorInit En_Door_InitVars = {
};
typedef struct {
- /* 0x00 */ s16 sceneId;
- /* 0x02 */ u8 dListIndex;
- /* 0x04 */ s16 objectId;
-} EnDoorInfo;
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ u8 dListIndex;
+ /* 0x4 */ s16 objectId;
+} EnDoorInfo; // size = 0x6
static EnDoorInfo sObjInfo[] = {
{ SCENE_MITURIN, 0x01, OBJECT_NUMA_OBJ },
@@ -387,21 +386,22 @@ static Gfx* D_808679A4[14][2] = {
void EnDoor_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
s32 objectBankIndex;
- EnDoorInfo* objectInfo = sObjInfo;
+ EnDoorInfo* objectInfo = &sObjInfo[0];
EnDoor* this = THIS;
s32 i;
- Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ Actor_ProcessInitChain(&this->knobDoor.dyna.actor, sInitChain);
- this->unk_1A4 = ENDOOR_GET_PARAMS_7(thisx);
+ this->doorType = ENDOOR_GET_TYPE(thisx);
- this->switchFlag = ENDOOR_GET_PARAMS_7F(thisx);
- if ((this->unk_1A4 == 7) && (this->switchFlag == 0)) {
- DynaPolyActor_Init(&this->dyna, 0);
- DynaPolyActor_LoadMesh(play, &this->dyna, &gDoorCol);
+ this->switchFlag = ENDOOR_GET_PARAM_7F(thisx);
+ if ((this->doorType == ENDOOR_TYPE_7) && (this->switchFlag == 0)) {
+ DynaPolyActor_Init(&this->knobDoor.dyna, 0);
+ DynaPolyActor_LoadMesh(play, &this->knobDoor.dyna, &gDoorCol);
}
- SkelAnime_Init(play, &this->skelAnime, &gDoorSkel, &gameplay_keep_Anim_020658, this->limbTable, this->limbTable, 5);
- if (this->unk_1A4 == 5) {
+ SkelAnime_Init(play, &this->knobDoor.skelAnime, &gDoorSkel, &gameplay_keep_Anim_020658, this->limbTable,
+ this->limbTable, DOOR_LIMB_MAX);
+ if (this->doorType == ENDOOR_TYPE_5) {
objectInfo = &sObjInfo[17 + this->switchFlag];
} else {
for (i = 0; i < ARRAY_COUNT(sObjInfo) - 34; i++, objectInfo++) {
@@ -414,52 +414,53 @@ void EnDoor_Init(Actor* thisx, PlayState* play2) {
}
}
- this->dlIndex = objectInfo->dListIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex;
objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectBankIndex < 0) {
objectInfo = &sObjInfo[15];
objectBankIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectBankIndex != 0) {
- Actor_Kill(&this->dyna.actor);
+ Actor_Kill(&this->knobDoor.dyna.actor);
return;
}
}
- this->requiredObjBankIndex = objectBankIndex;
- this->dlIndex = objectInfo->dListIndex; // Set twice?
- if (this->dyna.actor.objBankIndex == this->requiredObjBankIndex) {
+ this->knobDoor.requiredObjBankIndex = objectBankIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex; // Set twice?
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
func_80866A5C(this, play);
} else {
this->actionFunc = func_80866A5C;
}
- Actor_SetFocus(&this->dyna.actor, 35.0f);
+ Actor_SetFocus(&this->knobDoor.dyna.actor, 35.0f);
}
void EnDoor_Destroy(Actor* thisx, PlayState* play) {
EnDoor* this = (EnDoor*)thisx;
- if (this->unk_1A4 != 7) {
- TransitionActorEntry* transitionEntry = &play->doorCtx.transitionActorList[(u16)this->dyna.actor.params >> 0xA];
+ if (this->doorType != ENDOOR_TYPE_7) {
+ TransitionActorEntry* transitionEntry =
+ &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->knobDoor.dyna.actor)];
if (transitionEntry->id < 0) {
transitionEntry->id = -transitionEntry->id;
}
} else if (this->switchFlag == 0) {
- DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->knobDoor.dyna.bgId);
}
}
void func_80866A5C(EnDoor* this, PlayState* play) {
- if (Object_IsLoaded(&play->objectCtx, this->requiredObjBankIndex)) {
- this->dyna.actor.objBankIndex = this->requiredObjBankIndex;
+ if (Object_IsLoaded(&play->objectCtx, this->knobDoor.requiredObjBankIndex)) {
+ this->knobDoor.dyna.actor.objBankIndex = this->knobDoor.requiredObjBankIndex;
this->actionFunc = func_80866B20;
- this->dyna.actor.world.rot.y = 0;
- if (this->unk_1A4 == 1) {
+ this->knobDoor.dyna.actor.world.rot.y = 0;
+ if (this->doorType == ENDOOR_TYPE_1) {
if (!Flags_GetSwitch(play, this->switchFlag)) {
this->unk_1A6 = 10;
}
- } else if ((this->unk_1A4 == 4) &&
- (Actor_WorldDistXZToActor(&this->dyna.actor, &GET_PLAYER(play)->actor) > 120.0f)) {
+ } else if ((this->doorType == ENDOOR_TYPE_4) &&
+ (Actor_WorldDistXZToActor(&this->knobDoor.dyna.actor, &GET_PLAYER(play)->actor) > 120.0f)) {
this->actionFunc = func_8086704C;
- this->dyna.actor.world.rot.y = -0x1800;
+ this->knobDoor.dyna.actor.world.rot.y = -0x1800;
}
}
}
@@ -468,28 +469,29 @@ void func_80866B20(EnDoor* this, PlayState* play) {
static s32 D_80867BC0;
Player* player = GET_PLAYER(play);
- if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state) && (this->dyna.actor.textId == 0x1821)) {
+ if (Actor_ProcessTalkRequest(&this->knobDoor.dyna.actor, &play->state) &&
+ (this->knobDoor.dyna.actor.textId == 0x1821)) {
D_80867BC0 = true;
}
- if (this->unk_1A1 != 0) {
+ if (this->knobDoor.playOpenAnim) {
this->actionFunc = func_80867144;
- Animation_PlayOnceSetSpeed(&this->skelAnime, sAnimations[this->animIndex],
+ Animation_PlayOnceSetSpeed(&this->knobDoor.skelAnime, sAnimations[this->knobDoor.animIndex],
(player->stateFlags1 & PLAYER_STATE1_8000000) ? 0.75f : 1.5f);
if (this->unk_1A6 != 0) {
- gSaveContext.save.inventory.dungeonKeys[gSaveContext.mapIndex]--;
+ DUNGEON_KEY_COUNT(gSaveContext.mapIndex) = DUNGEON_KEY_COUNT(gSaveContext.mapIndex) - 1;
Flags_SetSwitch(play, this->switchFlag);
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
}
} else if (this->unk_1A7 != 0) {
this->actionFunc = func_80866F94;
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_OPEN);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN);
} else if (!Player_InCsMode(play)) {
Vec3f playerPosRelToDoor;
- Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&this->knobDoor.dyna.actor, &playerPosRelToDoor, &player->actor.world.pos);
if (D_80867BC0 || ((fabsf(playerPosRelToDoor.y) < 20.0f) && (fabsf(playerPosRelToDoor.x) < 20.0f) &&
(fabsf(playerPosRelToDoor.z) < 50.0f))) {
- s16 yawDiff = player->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ s16 yawDiff = player->actor.shape.rot.y - this->knobDoor.dyna.actor.shape.rot.y;
if (playerPosRelToDoor.z > 0.0f) {
yawDiff = (0x8000 - yawDiff);
@@ -497,51 +499,52 @@ void func_80866B20(EnDoor* this, PlayState* play) {
if (ABS_ALT(yawDiff) < 0x3000) {
player->doorType = PLAYER_DOORTYPE_HANDLE;
player->doorDirection = playerPosRelToDoor.z >= 0.0f ? 1.0f : -1.0f;
- player->doorActor = &this->dyna.actor;
+ player->doorActor = &this->knobDoor.dyna.actor;
if (this->unk_1A6 != 0) {
- if (gSaveContext.save.inventory.dungeonKeys[((void)0, gSaveContext.mapIndex)] <= 0) {
+ if (DUNGEON_KEY_COUNT(gSaveContext.mapIndex) <= 0) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = 0x1802;
+ this->knobDoor.dyna.actor.textId = 0x1802;
} else {
player->doorTimer = 10;
}
- } else if (this->unk_1A4 == 4) {
+ } else if (this->doorType == ENDOOR_TYPE_4) {
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = 0x1800;
- } else if ((this->unk_1A4 == 0) || (this->unk_1A4 == 2) || (this->unk_1A4 == 3)) {
+ this->knobDoor.dyna.actor.textId = 0x1800;
+ } else if ((this->doorType == ENDOOR_TYPE_0) || (this->doorType == ENDOOR_TYPE_2) ||
+ (this->doorType == ENDOOR_TYPE_3)) {
s32 halfDaysDayBit = (play->actorCtx.halfDaysBit & HALFDAYBIT_DAWNS) >> 1;
s32 halfDaysNightBit = play->actorCtx.halfDaysBit & HALFDAYBIT_NIGHTS;
s16 temp_a2 = D_801AED48[this->switchFlag & 7];
s32 textIdOffset = (this->switchFlag >> 3) & 0xF;
- if (((this->unk_1A4 == 0) && !((halfDaysDayBit | halfDaysNightBit) & temp_a2)) ||
- ((this->unk_1A4 == 2) && !(halfDaysNightBit & temp_a2)) ||
- ((this->unk_1A4 == 3) && !(halfDaysDayBit & temp_a2))) {
+ if (((this->doorType == ENDOOR_TYPE_0) && !((halfDaysDayBit | halfDaysNightBit) & temp_a2)) ||
+ ((this->doorType == ENDOOR_TYPE_2) && !(halfDaysNightBit & temp_a2)) ||
+ ((this->doorType == ENDOOR_TYPE_3) && !(halfDaysDayBit & temp_a2))) {
s16 baseTextId = 0x182D;
- if (this->unk_1A4 == 3) {
+ if (this->doorType == ENDOOR_TYPE_3) {
baseTextId = 0x180D;
- } else if (this->unk_1A4 == 2) {
+ } else if (this->doorType == ENDOOR_TYPE_2) {
baseTextId = 0x181D;
}
player->doorType = PLAYER_DOORTYPE_TALKING;
- this->dyna.actor.textId = baseTextId + textIdOffset;
+ this->knobDoor.dyna.actor.textId = baseTextId + textIdOffset;
}
- } else if ((this->unk_1A4 == 5) && (playerPosRelToDoor.z > 0.0f)) {
+ } else if ((this->doorType == ENDOOR_TYPE_5) && (playerPosRelToDoor.z > 0.0f)) {
ScheduleOutput scheduleOutput;
if (Schedule_RunScript(play, D_8086778C[this->switchFlag], &scheduleOutput)) {
- this->dyna.actor.textId = scheduleOutput.result + 0x1800;
+ this->knobDoor.dyna.actor.textId = scheduleOutput.result + 0x1800;
- player->doorType = ((this->dyna.actor.textId == 0x1821) && D_80867BC0)
+ player->doorType = ((this->knobDoor.dyna.actor.textId == 0x1821) && D_80867BC0)
? PLAYER_DOORTYPE_PROXIMITY
: PLAYER_DOORTYPE_TALKING;
}
}
func_80122F28(player);
}
- } else if ((this->unk_1A4 == 4) && (this->dyna.actor.xzDistToPlayer > 240.0f)) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_OPEN);
+ } else if ((this->doorType == ENDOOR_TYPE_4) && (this->knobDoor.dyna.actor.xzDistToPlayer > 240.0f)) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN);
this->actionFunc = func_80867080;
}
}
@@ -556,34 +559,34 @@ void func_80866F94(EnDoor* this, PlayState* play) {
} else {
direction = -1;
}
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, direction * 0x3E80, 0x7D0)) {
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, direction * 0x3E80, 0x7D0)) {
Math_StepToC(&this->unk_1A7, 0, 1);
}
} else {
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, 0, 0x7D0)) {
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, 0, 0x7D0)) {
this->actionFunc = func_80866B20;
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_AUTO_DOOR_CLOSE);
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_AUTO_DOOR_CLOSE);
}
}
}
void func_8086704C(EnDoor* this, PlayState* play) {
- if (this->dyna.actor.xzDistToPlayer < 120.0f) {
+ if (this->knobDoor.dyna.actor.xzDistToPlayer < 120.0f) {
this->actionFunc = func_808670F0;
}
}
void func_80867080(EnDoor* this, PlayState* play) {
- if (this->dyna.actor.xzDistToPlayer < 120.0f) {
+ if (this->knobDoor.dyna.actor.xzDistToPlayer < 120.0f) {
this->actionFunc = func_808670F0;
- } else if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, -0x1800, 0x100)) {
+ } else if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, -0x1800, 0x100)) {
this->actionFunc = func_8086704C;
}
}
void func_808670F0(EnDoor* this, PlayState* play) {
- if (Math_ScaledStepToS(&this->dyna.actor.world.rot.y, 0, 0x700)) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_CLOSE);
+ if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, 0, 0x700)) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_CLOSE);
this->actionFunc = func_80866B20;
}
}
@@ -593,19 +596,19 @@ void func_80867144(EnDoor* this, PlayState* play) {
s32 i;
if (DECR(this->unk_1A6) == 0) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->knobDoor.skelAnime)) {
this->actionFunc = func_80866B20;
- this->unk_1A1 = 0;
- } else if (Animation_OnFrame(&this->skelAnime, sAnimOpenFrames[this->animIndex])) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_OC_DOOR_OPEN);
- if (this->skelAnime.playSpeed < 1.5f) {
+ this->knobDoor.playOpenAnim = false;
+ } else if (Animation_OnFrame(&this->knobDoor.skelAnime, sAnimOpenFrames[this->knobDoor.animIndex])) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_OC_DOOR_OPEN);
+ if (this->knobDoor.skelAnime.playSpeed < 1.5f) {
numEffects = (s32)(Rand_ZeroOne() * 30.0f) + 50;
for (i = 0; i < numEffects; i++) {
- EffectSsBubble_Spawn(play, &this->dyna.actor.world.pos, 60.0, 100.0f, 50.0f, 0.15f);
+ EffectSsBubble_Spawn(play, &this->knobDoor.dyna.actor.world.pos, 60.0, 100.0f, 50.0f, 0.15f);
}
}
- } else if (Animation_OnFrame(&this->skelAnime, sAnimCloseFrames[this->animIndex])) {
- Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DOOR_CLOSE);
+ } else if (Animation_OnFrame(&this->knobDoor.skelAnime, sAnimCloseFrames[this->knobDoor.animIndex])) {
+ Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_CLOSE);
}
}
}
@@ -620,28 +623,28 @@ s32 EnDoor_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
TransitionActorEntry* transitionEntry;
EnDoor* this = THIS;
- if (limbIndex == 4) {
- Gfx** dl = D_808679A4[this->dlIndex];
+ if (limbIndex == DOOR_LIMB_4) {
+ Gfx** dl = D_808679A4[this->knobDoor.dlIndex];
s16 temp;
s32 dlIndex;
transitionEntry = NULL;
- if (this->unk_1A4 != 7) {
- transitionEntry = &play->doorCtx.transitionActorList[(u16)this->dyna.actor.params >> 0xA];
+ if (this->doorType != ENDOOR_TYPE_7) {
+ transitionEntry = &play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&this->knobDoor.dyna.actor)];
}
- rot->z += this->dyna.actor.world.rot.y;
- if ((this->unk_1A4 == 7) || (play->roomCtx.prevRoom.num >= 0) ||
+ rot->z += this->knobDoor.dyna.actor.world.rot.y;
+ if ((this->doorType == ENDOOR_TYPE_7) || (play->roomCtx.prevRoom.num >= 0) ||
(transitionEntry->sides[0].room == transitionEntry->sides[1].room)) {
s32 pad;
- temp = (this->dyna.actor.shape.rot.y + this->skelAnime.jointTable[3].z + rot->z) -
- Math_Vec3f_Yaw(&play->view.eye, &this->dyna.actor.world.pos);
+ temp = (this->knobDoor.dyna.actor.shape.rot.y + this->knobDoor.skelAnime.jointTable[3].z + rot->z) -
+ Math_Vec3f_Yaw(&play->view.eye, &this->knobDoor.dyna.actor.world.pos);
*dList = (ABS_ALT(temp) < 0x4000) ? dl[0] : dl[1];
} else {
dlIndex = 0;
- if (transitionEntry->sides[0].room != this->dyna.actor.room) {
+ if (transitionEntry->sides[0].room != this->knobDoor.dyna.actor.room) {
dlIndex = 1;
}
*dList = dl[dlIndex];
@@ -653,17 +656,18 @@ s32 EnDoor_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnDoor_Draw(Actor* thisx, PlayState* play) {
EnDoor* this = THIS;
- if (this->dyna.actor.objBankIndex == this->requiredObjBankIndex) {
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
- if ((this->unk_1A4 == 7) && (this->switchFlag == 0)) {
+
+ if ((this->doorType == ENDOOR_TYPE_7) && (this->switchFlag == 0)) {
Gfx_DrawDListOpa(play, gameplay_keep_DL_0221B8);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
}
- SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnDoor_OverrideLimbDraw, NULL,
- &this->dyna.actor);
- if (this->dyna.actor.world.rot.y != 0) {
- if (this->dyna.actor.world.rot.y > 0) {
+ SkelAnime_DrawOpa(play, this->knobDoor.skelAnime.skeleton, this->knobDoor.skelAnime.jointTable,
+ EnDoor_OverrideLimbDraw, NULL, &this->knobDoor.dyna.actor);
+ if (this->knobDoor.dyna.actor.world.rot.y != 0) {
+ if (this->knobDoor.dyna.actor.world.rot.y > 0) {
gSPDisplayList(POLY_OPA_DISP++, gDoorRightDL);
} else {
gSPDisplayList(POLY_OPA_DISP++, gDoorLeftDL);
@@ -672,6 +676,7 @@ void EnDoor_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1A6) {
Actor_DrawDoorLock(play, this->unk_1A6, 0);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.h b/src/overlays/actors/ovl_En_Door/z_en_door.h
index bea44a122..03dc31ab6 100644
--- a/src/overlays/actors/ovl_En_Door/z_en_door.h
+++ b/src/overlays/actors/ovl_En_Door/z_en_door.h
@@ -2,27 +2,34 @@
#define Z_EN_DOOR_H
#include "global.h"
+#include "z64door.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
struct EnDoor;
typedef void (*EnDoorActionFunc)(struct EnDoor*, PlayState*);
-#define ENDOOR_GET_PARAMS_7(thisx) (((thisx)->params >> 7) & 7)
-#define ENDOOR_GET_PARAMS_7F(thisx) (((thisx)->params) & 0x7F)
+#define ENDOOR_GET_TYPE(thisx) (((thisx)->params >> 7) & 7)
+#define ENDOOR_GET_PARAM_7F(thisx) (((thisx)->params) & 0x7F)
+typedef enum EnDoorType {
+ /* 0 */ ENDOOR_TYPE_0,
+ /* 1 */ ENDOOR_TYPE_1,
+ /* 2 */ ENDOOR_TYPE_2,
+ /* 3 */ ENDOOR_TYPE_3,
+ /* 4 */ ENDOOR_TYPE_4,
+ /* 5 */ ENDOOR_TYPE_5,
+ /* 6 */ ENDOOR_TYPE_6,
+ /* 7 */ ENDOOR_TYPE_7
+} EnDoorType;
typedef struct EnDoor {
- /* 0x000 */ DynaPolyActor dyna;
- /* 0x15C */ SkelAnime skelAnime;
- /* 0x1A0 */ u8 animIndex;
- /* 0x1A1 */ u8 unk_1A1;
- /* 0x1A2 */ s8 requiredObjBankIndex;
- /* 0x1A3 */ s8 dlIndex;
- /* 0x1A4 */ u8 unk_1A4;
+ /* 0x000 */ KnobDoorActor knobDoor;
+ /* 0x1A4 */ u8 doorType;
/* 0x1A5 */ u8 switchFlag;
/* 0x1A6 */ u8 unk_1A6;
/* 0x1A7 */ s8 unk_1A7;
- /* 0x1A8 */ Vec3s limbTable[5];
+ /* 0x1A8 */ Vec3s limbTable[DOOR_LIMB_MAX];
/* 0x1C8 */ EnDoorActionFunc actionFunc;
} EnDoor;
diff --git a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c
index 8959dde7a..d48bfd359 100644
--- a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c
+++ b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.c
@@ -92,9 +92,9 @@ void EnDoorEtc_Init(Actor* thisx, PlayState* play2) {
s32 i;
EnDoorEtc* this = THIS;
- Actor_ProcessInitChain(&this->actor, sInitChain);
- Actor_SetScale(&this->actor, 0.01f);
- this->actor.shape.rot.x = -0x4000;
+ Actor_ProcessInitChain(&this->knobDoor.dyna.actor, sInitChain);
+ Actor_SetScale(&this->knobDoor.dyna.actor, 0.01f);
+ this->knobDoor.dyna.actor.shape.rot.x = -0x4000;
this->angle = 0;
for (i = 0; i < 15; i++, objectInfo++) {
if (play->sceneId == objectInfo->sceneId) {
@@ -106,19 +106,19 @@ void EnDoorEtc_Init(Actor* thisx, PlayState* play2) {
}
objectIndex = Object_GetIndex(&play->objectCtx, objectInfo->objectId);
if (objectIndex < 0) {
- Actor_Kill(&this->actor);
+ Actor_Kill(&this->knobDoor.dyna.actor);
} else {
- this->objectIndex = objectIndex;
- this->dListIndex = objectInfo->dListIndex;
- if (this->actor.objBankIndex == this->objectIndex) {
+ this->knobDoor.requiredObjBankIndex = objectIndex;
+ this->knobDoor.dlIndex = objectInfo->dListIndex;
+ if (this->knobDoor.dyna.actor.objBankIndex == this->knobDoor.requiredObjBankIndex) {
EnDoorEtc_WaitForObject(this, play);
} else {
this->actionFunc = EnDoorEtc_WaitForObject;
}
}
Collider_InitCylinder(play, &this->collider);
- Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ Collider_SetCylinder(play, &this->collider, &this->knobDoor.dyna.actor, &sCylinderInit);
+ this->knobDoor.dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
}
void EnDoorEtc_Destroy(Actor* thisx, PlayState* play) {
@@ -139,11 +139,11 @@ s32 EnDoorEtc_IsDistanceGreater(Vec3f* a, Vec3f* b, f32 c) {
}
void EnDoorEtc_WaitForObject(EnDoorEtc* this, PlayState* play) {
- if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
- this->actor.flags &= ~ACTOR_FLAG_10;
- this->actor.objBankIndex = this->objectIndex;
+ if (Object_IsLoaded(&play->objectCtx, this->knobDoor.requiredObjBankIndex)) {
+ this->knobDoor.dyna.actor.flags &= ~ACTOR_FLAG_10;
+ this->knobDoor.dyna.actor.objBankIndex = this->knobDoor.requiredObjBankIndex;
this->actionFunc = func_80AC2354;
- this->actor.draw = EnDoorEtc_Draw;
+ this->knobDoor.dyna.actor.draw = EnDoorEtc_Draw;
}
}
@@ -175,27 +175,28 @@ void func_80AC21A0(EnDoorEtc* this, PlayState* play) {
s16 yawDiff;
s32 yawDiffAbs;
- Actor_OffsetOfPointInActorCoords(&this->actor, &playerOffsetFromDoor, &player->actor.world.pos);
- if (this->unk_1A1 == 0) {
+ Actor_OffsetOfPointInActorCoords(&this->knobDoor.dyna.actor, &playerOffsetFromDoor, &player->actor.world.pos);
+ if (!this->knobDoor.playOpenAnim) {
if ((!Player_InCsMode(play)) &&
((fabsf(playerOffsetFromDoor.y) < 20.0f) && fabsf(playerOffsetFromDoor.x) < 20.0f) &&
(fabsf(playerOffsetFromDoor.z) < 50.0f)) {
- yawDiff = player->actor.shape.rot.y - this->actor.shape.rot.y;
+ yawDiff = player->actor.shape.rot.y - this->knobDoor.dyna.actor.shape.rot.y;
if (playerOffsetFromDoor.z > 0.0f) {
yawDiff = 0x8000 - yawDiff;
}
yawDiffAbs = ABS_ALT(yawDiff);
if (yawDiffAbs < 0x3000) {
player->doorDirection = (playerOffsetFromDoor.z >= 0.0f) ? 1.0f : -1.0f;
- player->doorActor = &this->actor;
- player->doorType = -1;
+ player->doorActor = &this->knobDoor.dyna.actor;
+ player->doorType = PLAYER_DOORTYPE_TALKING;
}
}
}
- if ((this->actor.textId == 0x239B) && Flags_GetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->actor))) {
- Flags_UnsetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->actor));
+ if ((this->knobDoor.dyna.actor.textId == 0x239B) &&
+ Flags_GetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->knobDoor.dyna.actor))) {
+ Flags_UnsetSwitch(play, ENDOORETC_GET_SWITCHFLAG(&this->knobDoor.dyna.actor));
this->actionFunc = func_80AC2154;
- this->actor.textId = 0x1800; // "It won't budge!"
+ this->knobDoor.dyna.actor.textId = 0x1800; // "It won't budge!"
this->unk_1F4 |= 1;
this->timer = 0x5A;
}
@@ -206,18 +207,18 @@ void func_80AC2354(EnDoorEtc* this, PlayState* play) {
while (door != NULL) {
if ((door->id != ACTOR_EN_DOOR) ||
- !EnDoorEtc_IsDistanceGreater(&door->world.pos, &this->actor.world.pos, 10.0f)) {
+ !EnDoorEtc_IsDistanceGreater(&door->world.pos, &this->knobDoor.dyna.actor.world.pos, 10.0f)) {
door = door->next;
} else {
- this->actor.world.pos.x = door->world.pos.x;
- this->actor.world.pos.y = door->world.pos.y;
- this->actor.world.pos.z = door->world.pos.z;
- this->actor.shape.rot.y = door->shape.rot.y;
- this->actor.world.rot.y = door->world.rot.y;
+ this->knobDoor.dyna.actor.world.pos.x = door->world.pos.x;
+ this->knobDoor.dyna.actor.world.pos.y = door->world.pos.y;
+ this->knobDoor.dyna.actor.world.pos.z = door->world.pos.z;
+ this->knobDoor.dyna.actor.shape.rot.y = door->shape.rot.y;
+ this->knobDoor.dyna.actor.world.rot.y = door->world.rot.y;
Actor_Kill(door);
this->actionFunc = func_80AC21A0;
- this->actor.textId = 0x239B;
- Actor_SetFocus(&this->actor, 70.0f);
+ this->knobDoor.dyna.actor.textId = 0x239B;
+ Actor_SetFocus(&this->knobDoor.dyna.actor, 70.0f);
break;
}
}
@@ -229,7 +230,7 @@ void EnDoorEtc_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->unk_1F4 & 1) {
- Collider_UpdateCylinder(&this->actor, &this->collider);
+ Collider_UpdateCylinder(&this->knobDoor.dyna.actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -239,7 +240,7 @@ void EnDoorEtc_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(-2900.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateZS(this->angle, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
index 49ca83f2a..9cd63248f 100644
--- a/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
+++ b/src/overlays/actors/ovl_En_Door_Etc/z_en_door_etc.h
@@ -2,6 +2,7 @@
#define Z_EN_DOOR_ETC_H
#include "global.h"
+#include "z64door.h"
struct EnDoorEtc;
@@ -10,11 +11,7 @@ struct EnDoorEtc;
typedef void (*EnDoorEtcActionFunc)(struct EnDoorEtc*, PlayState*);
typedef struct EnDoorEtc {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char pad_144[0x5D];
- /* 0x1A1 */ u8 unk_1A1;
- /* 0x1A2 */ s8 objectIndex;
- /* 0x1A3 */ u8 dListIndex; // Never read, inferred from ovl_En_Door
+ /* 0x000 */ KnobDoorActor knobDoor;
/* 0x1A4 */ s16 angle;
/* 0x1A6 */ s16 timer;
/* 0x1A8 */ ColliderCylinder collider;
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 13c467613..fae9fc4fc 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -35,17 +35,17 @@ typedef enum {
/* 0 */ DEEP_PYTHON_EXTEND_STATE_NOT_FULLY_EXTENDED,
/* 1 */ DEEP_PYTHON_EXTEND_STATE_FULLY_EXTENDED,
/* 2 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_LARGE_SWAY,
- /* 3 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_SMALL_SWAY,
+ /* 3 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_SMALL_SWAY
} DeepPythonExtendState;
typedef enum {
/* 0 */ DEEP_PYTHON_GRAB_STATE_START,
- /* 1 */ DEEP_PYTHON_GRAB_STATE_GRABBED,
+ /* 1 */ DEEP_PYTHON_GRAB_STATE_GRABBED
} DeepPythonGrabState;
typedef enum {
/* 0 */ DEEP_PYTHON_ATTACK_STATE_START,
- /* 1 */ DEEP_PYTHON_ATTACK_STATE_RELEASED,
+ /* 1 */ DEEP_PYTHON_ATTACK_STATE_RELEASED
} DeepPythonAttackState;
static s32 sNumPythonsDead = 0;
@@ -299,11 +299,11 @@ void EnDragon_SpawnBubbles(EnDragon* this, PlayState* play, Vec3f basePos) {
Vec3f bubblePos;
s32 i;
- bubbleCount = (s32)randPlusMinusPoint5Scaled(5.0f) + 10;
+ bubbleCount = (s32)Rand_CenteredFloat(5.0f) + 10;
colorIndex = 0;
if (this->action == DEEP_PYTHON_ACTION_DEAD) {
colorIndex = 1;
- bubbleCount = (s32)randPlusMinusPoint5Scaled(5.0f) + 10;
+ bubbleCount = (s32)Rand_CenteredFloat(5.0f) + 10;
}
for (i = 0; i < bubbleCount; i++) {
@@ -311,9 +311,9 @@ void EnDragon_SpawnBubbles(EnDragon* this, PlayState* play, Vec3f basePos) {
sBubbleVelocity.x = Rand_ZeroFloat(1.0f) * 23.0f;
sBubbleVelocity.y = Rand_ZeroFloat(1.0f) * 10.0f;
sBubbleVelocity.z = Rand_ZeroFloat(1.0f) * 23.0f;
- bubblePos.x += randPlusMinusPoint5Scaled(i * 30.0f);
- bubblePos.y += randPlusMinusPoint5Scaled(5.0f);
- bubblePos.z += randPlusMinusPoint5Scaled(i * 30.0f);
+ bubblePos.x += Rand_CenteredFloat(i * 30.0f);
+ bubblePos.y += Rand_CenteredFloat(5.0f);
+ bubblePos.z += Rand_CenteredFloat(i * 30.0f);
sBubbleAccel.y = Rand_ZeroFloat(1.0f) * 20.0f * 3.0f;
scale = Rand_S16Offset(380, 240);
EffectSsDtBubble_SpawnCustomColor(play, &bubblePos, &sBubbleVelocity, &sBubbleAccel,
@@ -447,7 +447,7 @@ void EnDragon_Extend(EnDragon* this, PlayState* play) {
}
void EnDragon_SetSubCamEyeAt(EnDragon* this, PlayState* play, Vec3f subCamEye, Vec3f subCamAt) {
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
Math_Vec3f_Copy(&this->subCamEye, &subCamEye);
Math_Vec3f_Copy(&this->subCamAt, &subCamAt);
Play_SetCameraAtEye(play, this->subCamId, &this->subCamAt, &this->subCamEye);
@@ -458,10 +458,10 @@ void EnDragon_SetupGrab(EnDragon* this, PlayState* play) {
Vec3f extendedPos;
s16 yaw;
- if (!ActorCutscene_GetCanPlayNext(this->grabCutsceneIndex)) {
- ActorCutscene_SetIntentToPlay(this->grabCutsceneIndex);
+ if (!CutsceneManager_IsNext(this->grabCsId)) {
+ CutsceneManager_Queue(this->grabCsId);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->grabCutsceneIndex, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->grabCsId, &this->actor);
Math_Vec3f_Copy(&extendedPos, &this->burrowEntrancePos);
extendedPos.x += Math_SinS(this->actor.world.rot.y) * -530.0f;
extendedPos.z += Math_CosS(this->actor.world.rot.y) * -530.0f;
@@ -496,7 +496,7 @@ void EnDragon_Grab(EnDragon* this, PlayState* play) {
Vec3f pos; // used as both the extended position and the camera eye
Vec3f subCamAt;
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
SkelAnime_Update(&this->skelAnime);
if (this->grabTimer == 0) {
@@ -535,7 +535,7 @@ void EnDragon_Grab(EnDragon* this, PlayState* play) {
if (this->grabTimer > sMaxGrabTimerPerPython[this->pythonIndex]) {
if (this->state == DEEP_PYTHON_GRAB_STATE_START) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
this->state = DEEP_PYTHON_GRAB_STATE_GRABBED;
}
@@ -617,7 +617,7 @@ void EnDragon_Attack(EnDragon* this, PlayState* play) {
(this->collider.elements[2].info.bumperFlags & BUMP_HIT)) {
player->actor.parent = NULL;
this->grabWaitTimer = 30;
- ActorCutscene_Stop(this->grabCutsceneIndex);
+ CutsceneManager_Stop(this->grabCsId);
if (player->stateFlags2 & PLAYER_STATE2_80) {
player->unk_AE8 = 100;
}
@@ -634,10 +634,10 @@ void EnDragon_Attack(EnDragon* this, PlayState* play) {
}
void EnDragon_SetupDead(EnDragon* this, PlayState* play) {
- if (!ActorCutscene_GetCanPlayNext(this->deathCutsceneIndex)) {
- ActorCutscene_SetIntentToPlay(this->deathCutsceneIndex);
+ if (!CutsceneManager_IsNext(this->deathCsId)) {
+ CutsceneManager_Queue(this->deathCsId);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->deathCutsceneIndex, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->deathCsId, &this->actor);
this->endFrame = Animation_GetLastFrame(&gDeepPythonSmallSideSwayAnim);
Animation_Change(&this->skelAnime, &gDeepPythonSmallSideSwayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
this->timer = 20;
@@ -682,7 +682,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
seahorsePos.y += -100.0f + BREG(33);
seahorsePos.z += (Math_CosS((this->actor.parent->world.rot.y + 0x8000)) * (500.0f + BREG(38)));
if (Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_OT, seahorsePos.x, seahorsePos.y,
- seahorsePos.z, 0, this->actor.shape.rot.y, 0, 0x4000, this->actor.cutscene,
+ seahorsePos.z, 0, this->actor.shape.rot.y, 0, 0x4000, this->actor.csId,
this->actor.halfDaysBits, NULL)) {
SET_WEEKEVENTREG(WEEKEVENTREG_13_01);
switch (this->pythonIndex) {
@@ -725,7 +725,7 @@ void EnDragon_Dead(EnDragon* this, PlayState* play) {
void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 sp30;
+ PlayerImpactType playerImpactType;
if (this->action == DEEP_PYTHON_ACTION_EXTEND) {
if ((this->collider.elements[2].info.bumperFlags & BUMP_HIT) ||
@@ -753,7 +753,8 @@ void EnDragon_UpdateDamage(EnDragon* this, PlayState* play) {
if ((this->action == DEEP_PYTHON_ACTION_EXTEND) && (this->grabWaitTimer == 0) &&
(player->invincibilityTimer == 0) && (this->collider.elements[0].info.ocElemFlags & OCELEM_HIT) &&
- (!(func_800B64FC(play, 1000.0f, &this->actor.world.pos, &sp30) >= 0.0f) || (sp30 != 1))) {
+ !((Actor_GetPlayerImpact(play, 1000.0f, &this->actor.world.pos, &playerImpactType) >= 0.0f) &&
+ (playerImpactType == PLAYER_IMPACT_ZORA_BARRIER))) {
this->actor.speed = 0.0f;
this->action = DEEP_PYTHON_ACTION_GRAB;
this->actor.flags |= ACTOR_FLAG_100000;
@@ -834,8 +835,8 @@ void EnDragon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
void EnDragon_Draw(Actor* thisx, PlayState* play) {
EnDragon* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnDragon_OverrideLimbDraw, EnDragon_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
index cb2ab9490..a35c8fa9b 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
@@ -13,7 +13,7 @@ typedef enum {
/* 3 */ DEEP_PYTHON_ACTION_DAMAGE,
/* 4 */ DEEP_PYTHON_ACTION_RETREAT,
/* 5 */ DEEP_PYTHON_ACTION_SETUP_DEAD,
- /* 6 */ DEEP_PYTHON_ACTION_DEAD,
+ /* 6 */ DEEP_PYTHON_ACTION_DEAD
} DeepPythonAction;
struct EnDragon;
@@ -47,8 +47,8 @@ typedef struct EnDragon {
/* 0x2BA */ s16 action;
/* 0x2BC */ UNK_TYPE1 unk_2BC[0x2];
/* 0x2BE */ s16 state;
- /* 0x2C0 */ s16 grabCutsceneIndex;
- /* 0x2C2 */ s16 deathCutsceneIndex;
+ /* 0x2C0 */ s16 grabCsId;
+ /* 0x2C2 */ s16 deathCsId;
/* 0x2C4 */ UNK_TYPE1 unk_2C4[0x4];
/* 0x2C8 */ s16 subCamId;
/* 0x2CA */ s16 grabTimer; // Counts up from the time a grab starts until the time the actor begins attacking
diff --git a/src/overlays/actors/ovl_En_Drs/z_en_drs.c b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
index 7e232d5bd..9fc28c952 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
@@ -110,9 +110,11 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
// after that it will no longer be rendered.
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_02) && (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp].segment);
gSPDisplayList(POLY_OPA_DISP++, &gMoonMaskDL);
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp2].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -120,7 +122,7 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnDrs_Draw(Actor* thisx, PlayState* play) {
EnDrs* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnDrs_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
index 67dff9c41..6c6b40318 100644
--- a/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
+++ b/src/overlays/actors/ovl_En_Ds2n/z_en_ds2n.c
@@ -121,7 +121,7 @@ void EnDs2n_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->blinkState]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->blinkState]));
diff --git a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c
index b25e4eb47..06b4308a0 100644
--- a/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c
+++ b/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c
@@ -55,7 +55,7 @@ void func_80A61334(EnDyExtra* this, PlayState* play) {
this->actor.velocity.y = 0.0f;
}
- if (this->unk14C == 0 && this->unk14A != 0) {
+ if ((this->unk14C == 0) && (this->unk14A != 0)) {
this->unk14C = 0x32;
this->actionFunc = func_80A613C8;
}
@@ -64,7 +64,7 @@ void func_80A61334(EnDyExtra* this, PlayState* play) {
void func_80A613C8(EnDyExtra* this, PlayState* play) {
Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f);
- if (this->unk14C == 0 || this->unk150 < 0.02f) {
+ if ((this->unk14C == 0) || (this->unk150 < 0.02f)) {
Actor_Kill(&this->actor);
return;
}
@@ -114,7 +114,7 @@ void EnDyExtra_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, play->state.frames * 2, 0, 0x20, 0x40, 1, play->state.frames,
play->state.frames * -8, 0x10, 0x10));
diff --git a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
index 509e4fa9a..bd9949c61 100644
--- a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
+++ b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
@@ -13,7 +13,7 @@
typedef enum {
/* 0 */ EGBLOCK_EFFECT_DEBRIS_SOLID,
- /* 1 */ EGBLOCK_EFFECT_DEBRIS_FLAT,
+ /* 1 */ EGBLOCK_EFFECT_DEBRIS_FLAT
} EnEgblockEffectType;
void EnEgblock_Init(Actor* thisx, PlayState* play);
@@ -110,7 +110,7 @@ void EnEgblock_Draw(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnEgblock* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->inactive != true) {
OPEN_DISPS(play->state.gfxCtx);
@@ -134,8 +134,8 @@ void EnEgblock_SpawnEffect(EnEgblock* this, Vec3f* pos, s16 lifetime, s16 arg3)
if (!effect->isActive) {
effect->isActive = true;
effect->pos = *pos;
- effect->pos.x += randPlusMinusPoint5Scaled(50.0f);
- effect->pos.z += randPlusMinusPoint5Scaled(50.0f);
+ effect->pos.x += Rand_CenteredFloat(50.0f);
+ effect->pos.z += Rand_CenteredFloat(50.0f);
effect->timer = lifetime;
effect->alpha = 255;
effect->type = arg3;
@@ -146,9 +146,9 @@ void EnEgblock_SpawnEffect(EnEgblock* this, Vec3f* pos, s16 lifetime, s16 arg3)
effect->velocity.y = 5.0f + (10.0f * Rand_ZeroOne());
effect->velocity.z = 2.0f * (Rand_ZeroOne() - 0.5f);
effect->scale = 0.5f + (0.2f * Rand_ZeroFloat(1.0f));
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
break;
}
}
@@ -193,7 +193,7 @@ void EnEgblock_DrawEffects(EnEgblock* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
diff --git a/src/overlays/actors/ovl_En_Egol/z_en_egol.c b/src/overlays/actors/ovl_En_Egol/z_en_egol.c
index 21ce6d52e..1a54c8c33 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.c
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.c
@@ -37,7 +37,7 @@ typedef enum {
/* 0 */ EYEGORE_EFFECT_IMPACT,
/* 1 */ EYEGORE_EFFECT_PIECE_LARGE,
/* 2 */ EYEGORE_EFFECT_PIECE_SMALL,
- /* 3 */ EYEGORE_EFFECT_DEBRIS,
+ /* 3 */ EYEGORE_EFFECT_DEBRIS
} EnEgolEffectType;
typedef enum {
@@ -56,7 +56,7 @@ typedef enum {
/* 12 */ EYEGORE_ANIM_SIT,
/* 13 */ EYEGORE_ANIM_LEFT_PUNCH,
/* 14 */ EYEGORE_ANIM_RIGHT_PUNCH,
- /* 15 */ EYEGORE_ANIM_MAX,
+ /* 15 */ EYEGORE_ANIM_MAX
} EnEgolAnimation;
typedef enum {
@@ -64,7 +64,7 @@ typedef enum {
/* 1 */ EYEGORE_LASER_START,
/* 2 */ EYEGORE_LASER_CHARGING,
/* 3 */ EYEGORE_LASER_FIRE,
- /* 7 */ EYEGORE_LASER_ON = 7,
+ /* 7 */ EYEGORE_LASER_ON = 7
} EnEgolLaserState;
void EnEgol_Init(Actor* thisx, PlayState* play);
@@ -238,7 +238,7 @@ typedef enum {
/* 0x0 */ EYEGORE_DMGEFF_IMMUNE_0,
/* 0x4 */ EYEGORE_DMGEFF_LIGHT_ARROW = 4,
/* 0xE */ EYEGORE_DMGEFF_NONE = 0xE,
- /* 0xF */ EYEGORE_DMGEFF_IMMUNE_F,
+ /* 0xF */ EYEGORE_DMGEFF_IMMUNE_F
} EnEgolDamageEffect;
static DamageTable sDamageTable = {
@@ -328,19 +328,19 @@ void EnEgol_FootstepEffects(EnEgol* this, PlayState* play, f32 leftFootFrame, f3
if (Animation_OnFrame(&this->skelAnime, leftFootFrame) || Animation_OnFrame(&this->skelAnime, rightFootFrame)) {
Vec3f spawnPos;
Player* player = GET_PLAYER(play);
- s32 quakeSize;
+ s32 quakeYOffset;
s32 pad;
Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_WALK);
- quakeSize = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
if (player->stateFlags3 != PLAYER_STATE3_1000000) {
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
}
if (Animation_OnFrame(&this->skelAnime, leftFootFrame)) {
Math_Vec3f_Copy(&spawnPos, &this->leftFootPos);
@@ -394,7 +394,7 @@ void EnEgol_DestroyBlocks(EnEgol* this, PlayState* play, Vec3f pos1, Vec3f pos2)
}
void EnEgol_GetWaypoint(EnEgol* this) {
- if ((this->pathIndex != -1) && (this->path != NULL) &&
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL) &&
!SubS_CopyPointFromPath(this->path, this->waypoint, &this->waypointPos)) {
Actor_Kill(&this->actor);
}
@@ -426,9 +426,9 @@ void EnEgol_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetJntSph(play, &this->eyeCollider, &this->actor, &sEyeJntSphInit, this->eyeElements);
Collider_InitAndSetQuad(play, &this->laserCollider, &this->actor, &sLaserQuadInit);
- this->pathIndex = EYEGORE_GET_PATH(&this->actor);
- if (this->pathIndex == 0x3F) {
- this->pathIndex = -1;
+ this->pathIndex = EYEGORE_GET_PATH_INDEX(&this->actor);
+ if (this->pathIndex == EYEGORE_PATH_INDEX_NONE) {
+ this->pathIndex = PATH_INDEX_NONE;
Actor_Kill(&this->actor);
return;
}
@@ -445,7 +445,7 @@ void EnEgol_Init(Actor* thisx, PlayState* play) {
this->minLaserRange = 200.0f;
}
- this->path = SubS_GetPathByIndex(play, this->pathIndex, 0x3F);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, EYEGORE_PATH_INDEX_NONE);
EYEGORE_SET_SPH_DIM(this->eyeCollider.elements[0], 500, 0, 0, 26, 1.0f);
@@ -610,8 +610,7 @@ void EnEgol_Retreat(EnEgol* this, PlayState* play) {
if ((ABS_ALT(angleToFacing) < 0x3000) && (fabsf(this->actor.world.pos.y - player->actor.world.pos.y) < 50.0f) &&
(this->actor.xzDistToPlayer < 100.0f) && (player->invincibilityTimer == 0)) {
- func_800B8D50(play, &this->actor, 2.0f, (s32)randPlusMinusPoint5Scaled(0x2000) + this->actor.world.rot.y, 5.0f,
- 0x10);
+ func_800B8D50(play, &this->actor, 2.0f, (s32)Rand_CenteredFloat(0x2000) + this->actor.world.rot.y, 5.0f, 0x10);
}
Math_Vec3f_Copy(&spawnPos, &gZeroVec3f);
if ((this->actor.world.pos.y - 50.0f) <= player->actor.world.pos.y) {
@@ -755,7 +754,7 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
f32 nz;
s32 pad3;
s32 i;
- s32 quakeSize;
+ s32 quakeYOffset;
Player* player = GET_PLAYER(play);
nx = COLPOLY_GET_NORMAL(colPoly->normal.x);
@@ -764,23 +763,23 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
/*! @bug The following is supposed to calculate the rotation from vertical to the collision poly normal.
* However, the calculation is performed incorrectly. The correct calculation is
- * rotToNorm.x = func_80086B30(nz, ny) * 0x8000 / M_PI;
- * rotToNorm.z = func_80086B30(-nx, sqrtf(1.0f - SQ(nx))) * 0x8000 / M_PI;
+ * rotToNorm.x = Math_FAtan2F(nz, ny) * 0x8000 / M_PI;
+ * rotToNorm.z = Math_FAtan2F(-nx, sqrtf(1.0f - SQ(nx))) * 0x8000 / M_PI;
*/
- rotToNorm.x = -func_80086B30(-nz * ny, 1.0f) * 0x8000 / M_PI;
- rotToNorm.z = func_80086B30(-nx * ny, 1.0f) * 0x8000 / M_PI;
+ rotToNorm.x = RAD_TO_BINANG_ALT2(-Math_FAtan2F(-nz * ny, 1.0f));
+ rotToNorm.z = RAD_TO_BINANG_ALT2(Math_FAtan2F(-nx * ny, 1.0f));
if ((this->actor.world.pos.y - 50.0f) <= player->actor.world.pos.y) {
EnEgol_SpawnEffect(this, &hitPos, &rotToNorm, 100, 0.02f, EYEGORE_EFFECT_IMPACT);
}
- quakeSize = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
if (player->stateFlags3 != PLAYER_STATE3_1000000) {
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
}
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
func_800B31BC(play, &hitPos, 40, -2, 255, 20);
@@ -880,16 +879,16 @@ void EnEgol_Slam(EnEgol* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
f32 dyToPlayer = fabsf(player->actor.world.pos.y - this->actor.world.pos.y);
- s32 quakeSize;
+ s32 quakeYOffset;
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
- quakeSize = 4 - (s32)(dyToPlayer * 0.02f);
- if (quakeSize > 4) {
- quakeSize = 4;
- } else if (quakeSize < 1) {
- quakeSize = 1;
+ quakeYOffset = 4 - (s32)(dyToPlayer * 0.02f);
+ if (quakeYOffset > 4) {
+ quakeYOffset = 4;
+ } else if (quakeYOffset < 1) {
+ quakeYOffset = 1;
}
- func_800BC848(&this->actor, play, quakeSize, 2);
+ Actor_RequestQuakeAndRumble(&this->actor, play, quakeYOffset, 2);
if (this->actor.floorBgId == BGCHECK_SCENE) {
Math_Vec3f_Copy(&spawnPos, &this->actor.world.pos);
spawnPos.x += Math_SinS(this->actor.world.rot.y) * 60.0f;
@@ -1043,11 +1042,11 @@ void EnEgol_Damaged(EnEgol* this, PlayState* play) {
}
void EnEgol_StartDeathCutscene(EnEgol* this, PlayState* play) {
- if (!ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ if (!CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Queue(this->actor.csId);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
this->subCamFovTarget = 60.0f;
EnEgol_ChangeAnim(this, EYEGORE_ANIM_DEATH);
this->action = EYEGORE_ACTION_DYING;
@@ -1064,7 +1063,7 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
this->subCamAt.y = 60.0f;
this->subCamAt.z = 260.0f;
Math_Vec3f_Copy(&atOffset, &this->subCamAt);
- OLib_DbCameraVec3fSum(&this->actor.world, &atOffset, &this->subCamAt, 1);
+ OLib_Vec3fAdd(&this->actor.world, &atOffset, &this->subCamAt, OLIB_ADD_OFFSET);
this->subCamEye.x = this->actor.world.pos.x;
this->subCamEye.y = this->actor.world.pos.y + 70.0f;
this->subCamEye.z = this->actor.world.pos.z;
@@ -1075,12 +1074,12 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
if (this->switchFlag > -1) {
Flags_SetSwitch(play, this->switchFlag);
}
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
Actor_Kill(&this->actor);
} else {
if (Animation_OnFrame(&this->skelAnime, 46.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_EXPLOSION);
- func_800BC848(&this->actor, play, 10, 5);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 10, 5);
}
if ((curFrame >= this->animEndFrame) && (this->action != EYEGORE_ACTION_DEAD)) {
s32 i;
@@ -1101,7 +1100,7 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
typedef enum {
/* 0 */ EYEGORE_HIT_NONE,
/* 1 */ EYEGORE_HIT_DAMAGE,
- /* 2 */ EYEGORE_HIT_IMMUNE, // Makes hitmarks, but no reaction
+ /* 2 */ EYEGORE_HIT_IMMUNE // Makes hitmarks, but no reaction
} EyegoreHitReaction;
void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
@@ -1268,7 +1267,8 @@ void EnEgol_Update(Actor* thisx, PlayState* play) {
// last argument is DMG_ZORA_BOOMERANG | DMG_HOOKSHOT | DMG_NORMAL_ARROW | DMG_FIRE_ARROW | DMG_ICE_ARROW |
// DMG_LIGHT_ARROW | DMG_DEKU_BUBBLE
- if ((projectile != NULL) && !((projectile->id == ACTOR_EN_ARROW) && (projectile->params == ENARROW_5))) {
+ if ((projectile != NULL) &&
+ !((projectile->id == ACTOR_EN_ARROW) && (projectile->params == ARROW_TYPE_LIGHT))) {
this->eyelidRotTarget = 0xFA0;
this->eyeShutTimer = 20;
if (this->action == EYEGORE_ACTION_LASER) {
@@ -1294,7 +1294,9 @@ void EnEgol_Update(Actor* thisx, PlayState* play) {
Math_SmoothStepToS(&this->eyelidRot, this->eyelidRotTarget, 1, 0x7D0, 0);
EnEgol_CollisionCheck(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 50.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 50.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->action != EYEGORE_ACTION_DEAD) {
//! @bug This should be ||, not &&. As is, the check always succeeds.
if (!((this->action == EYEGORE_ACTION_DAMAGED) && (this->action == EYEGORE_ACTION_DYING))) {
@@ -1449,7 +1451,7 @@ void EnEgol_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->action != EYEGORE_ACTION_DEAD) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gEyegoreEyeLaserTexAnim));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -1474,7 +1476,7 @@ void EnEgol_Draw(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_OPA_DISP++, gEyegoreLaserDL);
}
if (((this->action == EYEGORE_ACTION_LASER) && (this->laserState >= EYEGORE_LASER_FIRE)) || this->chargingLaser) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
if (!this->chargingLaser) {
s32 i;
@@ -1531,9 +1533,9 @@ void EnEgol_SpawnEffect(EnEgol* this, Vec3f* pos, Vec3s* rot, s16 lifetime, f32
effect->timer = lifetime;
effect->alpha = 255;
effect->type = type;
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
if ((effect->type == EYEGORE_EFFECT_PIECE_LARGE) || (effect->type == EYEGORE_EFFECT_PIECE_SMALL)) {
effect->accel.y = -1.0f;
effect->velocity.x = 4.0f * (Rand_ZeroOne() - 0.5f);
@@ -1597,7 +1599,7 @@ void EnEgol_DrawEffects(EnEgol* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
Matrix_Push();
diff --git a/src/overlays/actors/ovl_En_Egol/z_en_egol.h b/src/overlays/actors/ovl_En_Egol/z_en_egol.h
index cec69e5a1..e85e4b98a 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.h
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.h
@@ -8,10 +8,12 @@ struct EnEgol;
typedef void (*EnEgolActionFunc)(struct EnEgol*, PlayState*);
-#define EYEGORE_GET_PATH(thisx) ((thisx)->params & 0x3F)
+#define EYEGORE_GET_PATH_INDEX(thisx) ((thisx)->params & 0x3F)
#define EYEGORE_GET_SWITCH(thisx) (((thisx)->params >> 6) & 0x7F)
-#define EYEGORE_PARAMS(switch, path) ((((switch) & 0x7F) << 6) | ((path) & 0x3F))
+#define EYEGORE_PATH_INDEX_NONE 0x3F
+
+#define EYEGORE_PARAMS(switch, pathIndex) ((((switch) & 0x7F) << 6) | ((pathIndex) & 0x3F))
#define EYEGORE_EFFECT_COUNT 100
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 13075fd55..3dc6e4a72 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -62,8 +62,10 @@ static Color_RGBAf sOuterColors[] = {
};
typedef struct {
- u8 r, g, b;
-} FairyColorFlags;
+ /* 0x0 */ u8 r;
+ /* 0x1 */ u8 g;
+ /* 0x2 */ u8 b;
+} FairyColorFlags; // size = 0x3
static FairyColorFlags sColorFlags[] = {
{ 0, 0, 0 }, { 1, 0, 0 }, { 1, 2, 0 }, { 1, 0, 2 }, { 0, 1, 0 }, { 2, 1, 0 }, { 0, 1, 2 },
@@ -199,7 +201,7 @@ void func_8088C858(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
}
}
@@ -214,7 +216,7 @@ void func_8088C920(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
}
}
@@ -262,7 +264,7 @@ void func_8088C9CC(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(0.5f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
}
}
@@ -291,7 +293,7 @@ void func_8088CC48(EnElf* this, PlayState* play) {
this->unk_246 = 0;
this->unk_24A = (s32)Rand_ZeroFloat(1048.0f) + 0x200;
this->unk_224 = this->actor.world.pos;
- this->unk_258 = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_258 = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
func_8088CBAC(this, play);
this->unk_25C = 0;
@@ -355,8 +357,9 @@ void EnElf_Init(Actor* thisx, PlayState* play2) {
this->elfMsg = NULL;
this->unk_234 = NULL;
this->unk_269 = 20;
- if ((gSaveContext.save.playerData.tatlTimer >= 25800) || (gSaveContext.save.playerData.tatlTimer < 3000)) {
- gSaveContext.save.playerData.tatlTimer = 0;
+ if ((gSaveContext.save.saveInfo.playerData.tatlTimer >= 25800) ||
+ (gSaveContext.save.saveInfo.playerData.tatlTimer < 3000)) {
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
}
this->unk_266 = QuestHint_GetTatlTextId(play);
break;
@@ -635,9 +638,9 @@ s32 func_8088DCA4(EnElf* this) {
}
void func_8088DD34(EnElf* this, PlayState* play) {
- Player* refActor = GET_PLAYER(play);
+ Actor* playerActor = &GET_PLAYER(play)->actor;
s32 pad;
- Player* player2 = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
f32 heightDiff;
SkelAnime_Update(&this->skelAnime);
@@ -649,7 +652,7 @@ void func_8088DD34(EnElf* this, PlayState* play) {
func_8088CBAC(this, play);
if (this->fairyFlags & 0x800) {
- this->unk_224.y = player2->bodyPartsPos[0].y;
+ this->unk_224.y = player->bodyPartsPos[0].y;
}
func_8088D8D0(this, &this->unk_224);
@@ -669,17 +672,17 @@ void func_8088DD34(EnElf* this, PlayState* play) {
return;
}
- heightDiff = this->actor.world.pos.y - refActor->actor.world.pos.y;
+ heightDiff = this->actor.world.pos.y - playerActor->world.pos.y;
if ((this->fairyFlags & 0x1000) && (heightDiff > 0.0f) && (heightDiff < 60.0f) &&
- !func_8088C804(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) {
+ !func_8088C804(&this->actor.world.pos, &playerActor->world.pos, 10.0f)) {
Health_ChangeBy(play, 0x80);
if (this->fairyFlags & 0x200) {
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
gSaveContext.jinxTimer = 0;
this->unk_254 = 50.0f;
- this->unk_248 = refActor->actor.shape.rot.y;
+ this->unk_248 = playerActor->shape.rot.y;
this->unk_24C = -0x1000;
this->unk_224.y = 30.0f;
this->unk_250 = 0.0f;
@@ -854,8 +857,8 @@ void func_8088E60C(EnElf* this, PlayState* play) {
glowLightRadius = 0;
}
- if (Cutscene_CheckActorAction(play, 201)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 201)]->action == 6) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_201)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_201)]->id == 6) {
glowLightRadius = 0;
}
}
@@ -882,18 +885,18 @@ void func_8088E850(EnElf* this, PlayState* play) {
Actor* arrowPointedActor;
f32 xScale;
f32 distFromLinksHead;
- u32 sp38;
+ u32 cueChannel;
func_8088F214(this, play);
func_8088E5A8(this, play);
xScale = 0.0f;
- if (Cutscene_CheckActorAction(play, 201)) {
- sp38 = Cutscene_GetActorActionIndex(play, 201);
- func_808908D0(&nextPos, play, sp38);
- this->actor.shape.rot.y = play->csCtx.actorActions[sp38]->urot.y;
- this->actor.shape.rot.x = play->csCtx.actorActions[sp38]->urot.x;
- if (play->csCtx.actorActions[sp38]->action == 5) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_201)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_201);
+ func_808908D0(&nextPos, play, cueChannel);
+ this->actor.shape.rot.y = play->csCtx.actorCues[cueChannel]->rot.y;
+ this->actor.shape.rot.x = play->csCtx.actorCues[cueChannel]->rot.x;
+ if (play->csCtx.actorCues[cueChannel]->id == 5) {
func_8088F5F4(this, play, 16);
}
@@ -903,14 +906,13 @@ void func_8088E850(EnElf* this, PlayState* play) {
func_8088D660(this, &nextPos, 0.2f);
}
- if ((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 0) &&
- (play->csCtx.currentCsIndex == 0) &&
- ((play->csCtx.frames == 149) || (play->csCtx.frames == 381) || (play->csCtx.frames == 591))) {
+ if ((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 0) &&
+ ((play->csCtx.curFrame == 149) || (play->csCtx.curFrame == 381) || (play->csCtx.curFrame == 591))) {
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
}
- if ((play->sceneId == SCENE_SECOM) && (gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 4) &&
- (play->csCtx.frames == 95)) {
+ if ((play->sceneId == SCENE_SECOM) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 4) &&
+ (play->csCtx.curFrame == 95)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
}
} else {
@@ -1015,7 +1017,7 @@ void func_8088E850(EnElf* this, PlayState* play) {
func_8088E60C(this, play);
- if (!Cutscene_CheckActorAction(play, 0xC9)) {
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_201)) {
this->actor.shape.rot.y = this->unk_258;
}
}
@@ -1090,7 +1092,7 @@ void func_8088EFA4(EnElf* this, PlayState* play) {
}
} else if ((arrayPointerActor != NULL) && (player->targetedActor != NULL)) {
u8 temp = this->unk_269;
- u16 targetSfxId = this->unk_269 == 0 ? NA_SE_PL_WALK_GROUND - SFX_FLAG : NA_SE_PL_WALK_GROUND - SFX_FLAG;
+ u16 targetSfxId = (this->unk_269 == 0) ? NA_SE_NONE : NA_SE_NONE;
if (!temp) {
Actor_PlaySfx(&this->actor, targetSfxId);
@@ -1105,9 +1107,9 @@ void func_8088F214(EnElf* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 pad;
- if (play->csCtx.state != 0) {
- if (Cutscene_CheckActorAction(play, 201)) {
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 201)]->action) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_201)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_201)]->id) {
case 4:
sp34 = 7;
break;
@@ -1245,9 +1247,9 @@ void func_8088F5F4(EnElf* this, PlayState* play, s32 sparkleLife) {
Color_RGBA8 envColor;
if (!(this->fairyFlags & 8)) {
- sparklePos.x = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.x;
+ sparklePos.x = Rand_CenteredFloat(6.0f) + this->actor.world.pos.x;
sparklePos.y = (Rand_ZeroOne() * 6.0f) + this->actor.world.pos.y;
- sparklePos.z = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.z;
+ sparklePos.z = Rand_CenteredFloat(6.0f) + this->actor.world.pos.z;
primColor.r = this->innerColor.r;
primColor.g = this->innerColor.g;
@@ -1324,19 +1326,19 @@ void func_8088FC34(EnElf* this, PlayState* play) {
}
void func_8088FD04(EnElf* this) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
this->unk_264 &= ~1;
this->unk_264 |= 2;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
this->unk_264 |= 1;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
this->unk_264 &= ~1;
this->unk_264 |= 2;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->unk_264 |= 1;
}
}
@@ -1347,8 +1349,8 @@ void func_8088FDCC(EnElf* this) {
this->fairyFlags &= ~0x20;
this->actor.focus.pos = this->actor.world.pos;
this->unk_234 = NULL;
- if ((this->unk_264 & 2) && (this->actor.cutscene != 0x7C)) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if ((this->unk_264 & 2) && (this->actor.csId != CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_Stop(this->actor.csId);
}
this->unk_264 &= ~0x20;
}
@@ -1455,11 +1457,12 @@ void func_8089010C(Actor* thisx, PlayState* play) {
if (temp_v0 != this->unk_266) {
this->unk_266 = temp_v0;
- gSaveContext.save.playerData.tatlTimer = 0;
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
}
if ((player->tatlTextId == 0) && (player->targetedActor == NULL)) {
- if ((gSaveContext.save.playerData.tatlTimer >= 600) && (gSaveContext.save.playerData.tatlTimer <= 3000)) {
+ if ((gSaveContext.save.saveInfo.playerData.tatlTimer >= 600) &&
+ (gSaveContext.save.saveInfo.playerData.tatlTimer <= 3000)) {
player->tatlTextId = QuestHint_GetTatlTextId(play);
}
}
@@ -1474,7 +1477,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
if (thisx->textId == QuestHint_GetTatlTextId(play)) {
this->fairyFlags |= 0x80;
- gSaveContext.save.playerData.tatlTimer = 3001;
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 3001;
}
this->fairyFlags |= 0x10;
@@ -1483,8 +1486,8 @@ void func_8089010C(Actor* thisx, PlayState* play) {
func_8088C51C(this, 3);
if (this->elfMsg != NULL) {
this->elfMsg->flags |= ACTOR_FLAG_TALK_REQUESTED;
- thisx->cutscene = this->elfMsg->cutscene;
- if (thisx->cutscene != -1) {
+ thisx->csId = this->elfMsg->csId;
+ if (thisx->csId != CS_ID_NONE) {
func_8088FD04(this);
}
if (this->elfMsg->home.rot.x == -0x961) {
@@ -1492,7 +1495,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
Actor_ChangeFocus(thisx, play, this->elfMsg);
}
} else {
- thisx->cutscene = -1;
+ thisx->csId = CS_ID_NONE;
}
thisx->flags &= ~ACTOR_FLAG_10000;
} else if (this->unk_264 & 4) {
@@ -1505,10 +1508,10 @@ void func_8089010C(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (!Play_InCsMode(play)) {
- if (gSaveContext.save.playerData.tatlTimer < 25800) {
- gSaveContext.save.playerData.tatlTimer++;
+ if (gSaveContext.save.saveInfo.playerData.tatlTimer < 25800) {
+ gSaveContext.save.saveInfo.playerData.tatlTimer++;
} else if (!(this->fairyFlags & 0x80)) {
- gSaveContext.save.playerData.tatlTimer = 0;
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
}
}
}
@@ -1525,7 +1528,7 @@ void func_8089010C(Actor* thisx, PlayState* play) {
this->unk_269--;
}
- if (!this->unk_269 && (play->csCtx.state != 0)) {
+ if (!this->unk_269 && (play->csCtx.state != CS_STATE_IDLE)) {
this->unk_269 = 1;
}
}
@@ -1578,8 +1581,8 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
if (player->currentMask != PLAYER_MASK_GIANT) {
if (!(this->fairyFlags & 8) &&
- (!Cutscene_CheckActorAction(play, 201) ||
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 201)]->action != 6)) &&
+ (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_201) ||
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_201)]->id != 6)) &&
(!(player->stateFlags1 & PLAYER_STATE1_100000) || (kREG(90) < this->actor.projectedPos.z))) {
Gfx* gfx = GRAPH_ALLOC(play->state.gfxCtx, 4 * sizeof(Gfx));
f32 alphaScale;
@@ -1587,7 +1590,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C94C(play->state.gfxCtx);
+ Gfx_SetupDL27_Xlu(play->state.gfxCtx);
envAlpha = (this->timer * 50) & 0x1FF;
envAlpha = (envAlpha >= 0x100) ? 511 - envAlpha : envAlpha;
@@ -1622,17 +1625,17 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
void func_808908D0(Vec3f* vec, PlayState* play, u32 action) {
Vec3f startPos;
Vec3f endPos;
- CsCmdActorAction* npcAction = play->csCtx.actorActions[action];
+ CsCmdActorCue* cue = play->csCtx.actorCues[action];
f32 lerp;
- startPos.x = npcAction->startPos.x;
- startPos.y = npcAction->startPos.y;
- startPos.z = npcAction->startPos.z;
+ startPos.x = cue->startPos.x;
+ startPos.y = cue->startPos.y;
+ startPos.z = cue->startPos.z;
- endPos.x = npcAction->endPos.x;
- endPos.y = npcAction->endPos.y;
- endPos.z = npcAction->endPos.z;
+ endPos.x = cue->endPos.x;
+ endPos.y = cue->endPos.y;
+ endPos.z = cue->endPos.z;
- lerp = Environment_LerpWeight(npcAction->endFrame, npcAction->startFrame, play->csCtx.frames);
+ lerp = Environment_LerpWeight(cue->endFrame, cue->startFrame, play->csCtx.curFrame);
VEC3F_LERPIMPDST(vec, &startPos, &endPos, lerp);
}
diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.h b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
index 680d59158..18e444e97 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.h
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
@@ -50,14 +50,14 @@ typedef struct EnElf {
} EnElf; // size = 0x274
typedef enum {
- /* 0x00 */ ENELF_TYPE_0,
- /* 0x01 */ ENELF_TYPE_1,
- /* 0x02 */ ENELF_TYPE_2,
- /* 0x03 */ ENELF_TYPE_3,
- /* 0x04 */ ENELF_TYPE_4,
- /* 0x05 */ ENELF_TYPE_5,
- /* 0x06 */ ENELF_TYPE_6,
- /* 0x07 */ ENELF_TYPE_7
+ /* 0 */ ENELF_TYPE_0,
+ /* 1 */ ENELF_TYPE_1,
+ /* 2 */ ENELF_TYPE_2,
+ /* 3 */ ENELF_TYPE_3,
+ /* 4 */ ENELF_TYPE_4,
+ /* 5 */ ENELF_TYPE_5,
+ /* 6 */ ENELF_TYPE_6,
+ /* 7 */ ENELF_TYPE_7
} FairyType;
#endif // Z_EN_ELF_H
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 12026b8b9..2584a1c73 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -66,7 +66,7 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 1.25f);
this->actionFunc = EnElfbub_Idle;
- this->zRot = randPlusMinusPoint5Scaled(0x10000);
+ this->zRot = Rand_CenteredFloat(0x10000);
this->zRotDelta = 1000;
this->xScale = 0.08f;
@@ -151,7 +151,7 @@ void EnElfbub_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(0.0f, 0.0f, 1.0f, MTXMODE_APPLY);
Matrix_ReplaceRotation(&play->billboardMtxF);
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 2189bba99..cacef3f4d 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -47,14 +47,14 @@ ActorInit En_Elfgrp_InitVars = {
(ActorFunc)NULL,
};
-void func_80A396B0(EnElfgrp* this, s32 arg1) {
- while (arg1 > 0) {
- if (this->actor.cutscene == -1) {
+void func_80A396B0(EnElfgrp* this, s32 numCutscenes) {
+ while (numCutscenes > 0) {
+ if (this->actor.csId == CS_ID_NONE) {
break;
}
- this->actor.cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- arg1--;
+ numCutscenes--;
}
}
@@ -101,13 +101,13 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
break;
case ENELFGRP_2:
- if (gSaveContext.save.playerData.isDoubleMagicAcquired == true) {
+ if (gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired == true) {
func_80A396B0(this, 1);
}
break;
case ENELFGRP_3:
- if (gSaveContext.save.playerData.doubleDefense) {
+ if (gSaveContext.save.saveInfo.playerData.doubleDefense) {
func_80A396B0(this, 1);
}
break;
@@ -125,7 +125,7 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
this->actor.textId = (this->unk_147 * 3) + 0x581;
} else {
this->actionFunc = func_80A3A8F8;
- if ((gSaveContext.save.weekEventReg[9] & this->unk_146)) {
+ if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->unk_146)) {
this->actor.textId = (this->unk_147 * 3) + 0x580;
} else {
this->actor.textId = (this->unk_147 * 3) + 0x57F;
@@ -158,13 +158,13 @@ void EnElfgrp_Init(Actor* thisx, PlayState* play) {
func_80A396B0(this, 3);
this->unk_14A |= 2;
}
- } else if (gSaveContext.save.playerData.isMagicAcquired == true) {
+ } else if (gSaveContext.save.saveInfo.playerData.isMagicAcquired == true) {
func_80A396B0(this, 1);
}
} else {
func_80A39DC8(this, play, 24, 0);
this->actionFunc = func_80A3A8F8;
- if ((gSaveContext.save.weekEventReg[9] & this->unk_146)) {
+ if ((gSaveContext.save.saveInfo.weekEventReg[9] & this->unk_146)) {
this->actor.textId = 0x580;
} else {
this->actor.textId = 0x578;
@@ -183,7 +183,7 @@ s32 func_80A39BD0(PlayState* play, s32 arg2) {
return 0;
}
- return (((void)0, gSaveContext.save.inventory.strayFairies[arg2 - 1]) - func_80A39C1C(play, arg2)) + 10;
+ return (((void)0, gSaveContext.save.saveInfo.inventory.strayFairies[arg2 - 1]) - func_80A39C1C(play, arg2)) + 10;
}
s32 func_80A39C1C(PlayState* play, s32 arg1) {
@@ -207,13 +207,13 @@ s32 func_80A39C1C(PlayState* play, s32 arg1) {
}
if (arg1 == 0) {
- if (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 1) {
+ if (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 1) {
return 25;
}
return 24;
}
- temp_v1 = (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 >> (((arg1 - 1) * 5) + 1)) & 0x1F;
+ temp_v1 = (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 >> (((arg1 - 1) * 5) + 1)) & 0x1F;
if (temp_v1 < 10) {
temp_v1 = 10;
} else if (temp_v1 > 25) {
@@ -229,13 +229,13 @@ void func_80A39CD4(PlayState* play, s32 arg1, s32 arg2) {
if (arg1 == 0) {
if (arg2 == 25) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= 1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= 1;
} else {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 &= ~1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~1;
}
} else {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 &= ~(0x1F << ((arg1 * 5) - 4));
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= arg2 << ((arg1 * 5) - 4);
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~(0x1F << ((arg1 * 5) - 4));
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= arg2 << ((arg1 * 5) - 4);
}
}
@@ -262,8 +262,8 @@ void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) {
}
for (i = 0; i < arg2; i++) {
- elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, randPlusMinusPoint5Scaled(20.0f) + sp6C.x, sp6C.y,
- randPlusMinusPoint5Scaled(20.0f) + sp6C.z, 0, 0, 0, params);
+ elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, Rand_CenteredFloat(20.0f) + sp6C.x, sp6C.y,
+ Rand_CenteredFloat(20.0f) + sp6C.z, 0, 0, 0, params);
if (elforg == NULL) {
continue;
}
@@ -345,9 +345,9 @@ void func_80A3A044(PlayState* play) {
}
void func_80A3A0AC(EnElfgrp* this, PlayState* play) {
- if (!Cutscene_CheckActorAction(play, 0x64)) {
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) {
this->actionFunc = func_80A3A600;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -386,12 +386,12 @@ void func_80A3A210(EnElfgrp* this, PlayState* play) {
}
void func_80A3A274(EnElfgrp* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x64)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) {
if (this->unk_14A & 1) {
func_800B9010(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
}
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x64)]->action) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_100)]->id) {
case 2:
if (!(this->unk_14A & 1)) {
if (this->unk_147 == ENELFGRP_0) {
@@ -414,8 +414,8 @@ void func_80A3A274(EnElfgrp* this, PlayState* play) {
}
void func_80A3A398(EnElfgrp* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = func_80A3A274;
Flags_UnsetSwitch(play, ENELFGRP_GET_FE00(&this->actor));
if (this->unk_14A & 2) {
@@ -431,7 +431,7 @@ void func_80A3A398(EnElfgrp* this, PlayState* play) {
}
this->unk_14A &= ~8;
} else if (this->actor.xzDistToPlayer < 350.0f) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -443,9 +443,10 @@ void func_80A3A484(EnElfgrp* this, PlayState* play) {
}
void func_80A3A4AC(EnElfgrp* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x64)) {
- s32 temp = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x64)]->action;
- if (temp == 3) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_100)) {
+ s32 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_100)]->id;
+
+ if (cueId == 3) {
this->actionFunc = func_80A3A484;
this->unk_144 = 90;
}
@@ -453,10 +454,10 @@ void func_80A3A4AC(EnElfgrp* this, PlayState* play) {
}
void func_80A3A520(EnElfgrp* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x67)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_103)) {
this->actionFunc = func_80A3A600;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = func_80A3A4AC;
Flags_SetSwitch(play, ENELFGRP_GET_FE00(&this->actor));
@@ -468,7 +469,7 @@ void func_80A3A520(EnElfgrp* this, PlayState* play) {
Flags_SetSwitch(play, this->actor.home.rot.z);
}
} else if (this->actor.xzDistToPlayer < 350.0f) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -524,7 +525,7 @@ void func_80A3A7FC(EnElfgrp* this, PlayState* play) {
s32 temp_s0;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- gSaveContext.save.weekEventReg[9] |= this->unk_146;
+ gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146;
this->actionFunc = func_80A3A6F4;
temp_s0 = func_80A39BD0(play, this->unk_147);
func_80A39DC8(this, play, temp_s0, 1);
@@ -544,7 +545,7 @@ void func_80A3A8F8(EnElfgrp* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- gSaveContext.save.weekEventReg[9] |= this->unk_146;
+ gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146;
this->actionFunc = func_80A3A6F4;
return;
}
@@ -563,7 +564,7 @@ void func_80A3A8F8(EnElfgrp* this, PlayState* play) {
player->stateFlags1 |= PLAYER_STATE1_20000000;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = func_80A3A77C;
- gSaveContext.save.weekEventReg[9] |= this->unk_146;
+ gSaveContext.save.saveInfo.weekEventReg[9] |= this->unk_146;
} else {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 100.0f);
diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
index 975b08c2c..692a76d82 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
@@ -10,13 +10,13 @@ typedef void (*EnElfgrpActionFunc)(struct EnElfgrp*, PlayState*);
#define ENELFGRP_GET(thisx) ((thisx)->params & 0xF)
#define ENELFGRP_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 0 */ ENELFGRP_0,
/* 2 */ ENELFGRP_1,
/* 2 */ ENELFGRP_2,
/* 3 */ ENELFGRP_3,
- /* 4 */ ENELFGRP_4,
-};
+ /* 4 */ ENELFGRP_4
+} EnElfgrpParam;
typedef struct EnElfgrp {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
index 65cc04d84..9b65ae2a6 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -58,7 +58,7 @@ void EnElforg_InitializeParams(EnElforg* this) {
this->actor.speed = 1.0f;
this->targetSpeedXZ = 1.0f;
this->actor.velocity.y = 0.0f;
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x10000);
this->timer = 0;
this->secondaryTimer = Rand_ZeroFloat(100.0f);
this->actor.shape.yOffset = 0.0f;
@@ -93,18 +93,18 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
}
break;
+ case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
+ case STRAY_FAIRY_TYPE_BUBBLE:
+ case STRAY_FAIRY_TYPE_CHEST:
+ case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
+ break;
+
default:
if (Flags_GetSwitch(play, STRAY_FAIRY_FLAG(thisx))) {
Actor_Kill(thisx);
return;
}
break;
-
- case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
- case STRAY_FAIRY_TYPE_BUBBLE:
- case STRAY_FAIRY_TYPE_CHEST:
- case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
- break;
}
if (Map_IsInDungeonOrBossArea(play)) {
@@ -176,9 +176,9 @@ void EnElforg_SpawnSparkles(EnElforg* this, PlayState* play, s32 life) {
s32 pad;
s32 index;
- pos.x = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.x;
+ pos.x = Rand_CenteredFloat(6.0f) + this->actor.world.pos.x;
pos.y = (Rand_ZeroOne() * 6.0f) + this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y);
- pos.z = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.z;
+ pos.z = Rand_CenteredFloat(6.0f) + this->actor.world.pos.z;
index = (this->area < STRAY_FAIRY_AREA_CLOCK_TOWN || this->area >= STRAY_FAIRY_AREA_MAX)
? STRAY_FAIRY_AREA_CLOCK_TOWN
: this->area;
@@ -431,16 +431,16 @@ void EnElforg_ClockTownFairyCollected(EnElforg* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20000000;
Actor_Kill(&this->actor);
SET_WEEKEVENTREG(WEEKEVENTREG_08_80);
- ActorCutscene_Stop(0x7C);
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
return;
}
func_800B9010(&this->actor, NA_SE_PL_CHIBI_FAIRY_HEAL - SFX_FLAG);
- if (ActorCutscene_GetCurrentIndex() != 0x7C) {
- if (ActorCutscene_GetCanPlayNext(0x7C)) {
- ActorCutscene_Start(0x7C, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_GLOBAL_TALK) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_Start(CS_ID_GLOBAL_TALK, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
}
}
@@ -485,21 +485,22 @@ void EnElforg_FreeFloating(EnElforg* this, PlayState* play) {
// Bring me back to North Clock Town!
Message_StartTextbox(play, 0x579, NULL);
this->actionFunc = EnElforg_ClockTownFairyCollected;
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
return;
}
if (Map_IsInDungeonOrBossArea(play)) {
- gSaveContext.save.inventory.strayFairies[gSaveContext.dungeonIndex]++;
+ gSaveContext.save.saveInfo.inventory.strayFairies[gSaveContext.dungeonIndex]++;
// You found a Stray Fairy!
Message_StartTextbox(play, 0x11, NULL);
- if (gSaveContext.save.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] >= 15) {
+ if (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] >= 15) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
}
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
func_80ACCBB8(this, play);
if (Player_GetMask(play) == PLAYER_MASK_GREAT_FAIRY) {
if (!(this->strayFairyFlags & STRAY_FAIRY_FLAG_GREAT_FAIRYS_MASK_EQUIPPED)) {
@@ -560,7 +561,7 @@ void EnElforg_TrappedByEnemy(EnElforg* this, PlayState* play) {
void EnElforg_SetupTrappedByEnemy(EnElforg* this, PlayState* play) {
Actor* enemy = EnElforg_GetHoldingEnemy(this, play);
- if (enemy != NULL && enemy->update != NULL) {
+ if ((enemy != NULL) && (enemy->update != NULL)) {
this->actionFunc = EnElforg_TrappedByEnemy;
this->enemy = enemy;
}
@@ -586,7 +587,7 @@ void EnElforg_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if (this->timer == 0 && this->secondaryTimer > 0) {
+ if ((this->timer == 0) && (this->secondaryTimer > 0)) {
this->secondaryTimer--;
} else {
this->timer++;
@@ -625,7 +626,7 @@ void EnElforg_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
switch (this->area) {
case STRAY_FAIRY_AREA_WOODFALL:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gStrayFairyWoodfallTexAnim));
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 a39a03567..737ffd2d3 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c
@@ -5,6 +5,9 @@
*/
#include "z_en_encount1.h"
+#include "overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h"
+#include "overlays/actors/ovl_En_Wallmas/z_en_wallmas.h"
+#include "overlays/actors/ovl_En_Pr2/z_en_pr2.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_100000 | ACTOR_FLAG_CANT_LOCK_ON)
@@ -13,7 +16,7 @@
void EnEncount1_Init(Actor* thisx, PlayState* play);
void EnEncount1_Update(Actor* thisx, PlayState* play);
-void func_808E0954(EnEncount1* this, PlayState* play);
+void EnEncount1_SpawnActor(EnEncount1* this, PlayState* play);
ActorInit En_Encount1_InitVars = {
ACTOR_EN_ENCOUNT1,
@@ -27,14 +30,19 @@ ActorInit En_Encount1_InitVars = {
(ActorFunc)NULL,
};
-static s16 sActorList[] = {
- ACTOR_EN_GRASSHOPPER,
- ACTOR_EN_WALLMAS,
- ACTOR_EN_PR2,
- ACTOR_EN_PR2,
+static s16 sActorIds[] = {
+ ACTOR_EN_GRASSHOPPER, // EN_ENCOUNT1_GRASSHOPPER
+ ACTOR_EN_WALLMAS, // EN_ENCOUNT1_WALLMASTER
+ ACTOR_EN_PR2, // EN_ENCOUNT1_SKULLFISH
+ ACTOR_EN_PR2, // EN_ENCOUNT1_SKULLFISH_2
};
-static s16 sActorParams[] = { 1, 0, 1, 3 };
+static s16 sActorParams[] = {
+ EN_GRASSHOPPER_PARAMS(EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED), // EN_ENCOUNT1_GRASSHOPPER
+ WALLMASTER_PARAMS(WALLMASTER_TYPE_TIMER_ONLY, 0, false), // EN_ENCOUNT1_WALLMASTER
+ ENPR2_PARAMS(1, 0), // EN_ENCOUNT1_SKULLFISH
+ ENPR2_PARAMS(3, 0) // EN_ENCOUNT1_SKULLFISH_2
+};
void EnEncount1_Init(Actor* thisx, PlayState* play) {
EnEncount1* this = THIS;
@@ -44,69 +52,72 @@ void EnEncount1_Init(Actor* thisx, PlayState* play) {
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;
+ this->type = ENENCOUNT1_GET_TYPE(&this->actor);
+ this->spawnActiveMax = ENENCOUNT1_GET_SPAWN_ACTIVE_MAX(&this->actor);
+ this->spawnTotalMax = ENENCOUNT1_GET_SPAWN_TOTAL_MAX(&this->actor);
+ this->spawnTimeMin = ENENCOUNT1_GET_SPAWN_TIME_MIN(&this->actor);
+ this->spawnUnusedProp = ENENCOUNT1_GET_SPAWN_UNUSED_PROP(&this->actor);
+ this->spawnDistanceMax = (ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(&this->actor) * 40.0f) + 120.0f;
- if (this->unk_154 >= 0x3F) {
- this->unk_154 = -1;
+ if (this->spawnTotalMax >= ENENCOUNT1_SPAWNS_TOTAL_MAX_INFINITE) {
+ this->spawnTotalMax = -1;
}
- if (this->actor.world.rot.z < 0) {
- this->unk_160 = -1.0f;
+ if (ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(&this->actor) < 0) {
+ this->spawnDistanceMax = -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;
+ if (this->type == EN_ENCOUNT1_SKULLFISH_2) {
+ this->pathIndex = ENENCOUNT1_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENENCOUNT1_PATH_INDEX_NONE);
+ this->spawnTotalMax = -1;
+ this->spawnDistanceMax = -1.0f;
}
this->actor.flags &= ~ACTOR_FLAG_1;
- this->actionFunc = func_808E0954;
+ this->actionFunc = EnEncount1_SpawnActor;
}
-void func_808E0954(EnEncount1* this, PlayState* play) {
+void EnEncount1_SpawnActor(EnEncount1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
- f32 sp64;
- f32 temp_fv0_2;
- s16 sp5E;
- s16 actorList;
+ f32 scale;
+ f32 floorHeight;
+ s16 rotY;
+ s16 actorId;
s32 actorParams;
- CollisionPoly* sp54;
- s32 sp50;
+ CollisionPoly* floorPoly;
+ s32 bgId;
- 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)))) {
+ if (((this->spawnActiveCount >= this->spawnActiveMax) ||
+ ((this->spawnDistanceMax > 0.0f) && (this->spawnDistanceMax < this->actor.xzDistToPlayer)) ||
+ ((this->spawnTotalMax > 0) && (this->spawnTotalMax <= this->spawnTotalCount)))) {
return;
- } else if (this->unk_156 != 0) {
- this->unk_156++;
- if (this->unk_156 < this->unk_158) {
+ }
+
+ if (this->timer != 0) {
+ this->timer++;
+ if (this->timer < this->spawnTimeMin) {
return;
}
}
- this->unk_156 = 0;
- switch (this->actorType) {
+ this->timer = 0;
+ switch (this->type) {
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;
+ scale = Rand_CenteredFloat(40.0f) + 200.0f;
+ rotY = player->actor.shape.rot.y;
+ if (this->spawnActiveCount & 1) {
+ rotY = -rotY;
+ scale = Rand_CenteredFloat(20.0f) + 100.0f;
}
- spawnPos.x = player->actor.world.pos.x + (Math_SinS(sp5E) * sp64) + randPlusMinusPoint5Scaled(40.0f);
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(rotY) * scale) + Rand_CenteredFloat(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) ||
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(rotY) * scale) + Rand_CenteredFloat(40.0f);
+ floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos);
+ if ((floorHeight <= BGCHECK_Y_MIN) ||
((player->actor.depthInWater != BGCHECK_Y_MIN) &&
- (temp_fv0_2 < (player->actor.world.pos.y - player->actor.depthInWater)))) {
+ (floorHeight < (player->actor.world.pos.y - player->actor.depthInWater)))) {
return;
}
- spawnPos.y = temp_fv0_2;
+ spawnPos.y = floorHeight;
break;
case EN_ENCOUNT1_WALLMASTER:
@@ -114,36 +125,36 @@ void func_808E0954(EnEncount1* this, PlayState* play) {
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);
+ scale = Rand_CenteredFloat(250.0f) + 500.0f;
+ rotY = player->actor.shape.rot.y;
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(rotY) * scale) + Rand_CenteredFloat(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))) {
+ spawnPos.z = player->actor.world.pos.z + (Math_CosS(rotY) * scale) + Rand_CenteredFloat(40.0f);
+ floorHeight = BgCheck_EntityRaycastFloor5(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos);
+ if (!(player->stateFlags1 & PLAYER_STATE1_8000000) || (floorHeight <= BGCHECK_Y_MIN) ||
+ (player->actor.depthInWater < floorHeight)) {
return;
}
break;
case EN_ENCOUNT1_SKULLFISH_2:
- if ((this->path != NULL) && (!SubS_CopyPointFromPath(this->path, 0, &spawnPos))) {
+ if ((this->path != NULL) && !SubS_CopyPointFromPath(this->path, 0, &spawnPos)) {
Actor_Kill(&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,
+ actorId = sActorIds[this->type];
+ actorParams = sActorParams[this->type];
+ if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, actorId, spawnPos.x, spawnPos.y, spawnPos.z, 0, 0, 0,
actorParams) != NULL) {
- this->unk_14E++;
- if (this->unk_154 > 0) {
- this->unk_152++;
+ this->spawnActiveCount++;
+ if (this->spawnTotalMax > 0) {
+ this->spawnTotalCount++;
}
- if ((this->unk_14E >= this->unk_14C) && (this->unk_158 != 0)) {
- this->unk_156 = 1;
+ if ((this->spawnActiveCount >= this->spawnActiveMax) && (this->spawnTimeMin != 0)) {
+ this->timer = 1;
}
}
}
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 52e0fb30c..0eb675272 100644
--- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
+++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.h
@@ -3,15 +3,24 @@
#include "global.h"
+#define ENENCOUNT1_SPAWNS_TOTAL_MAX_INFINITE 63 // aka 0x3F, All bits set
+
#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)
+#define ENENCOUNT1_GET_SPAWN_ACTIVE_MAX(thisx) (((thisx)->params >> 6) & 0x1F)
+#define ENENCOUNT1_GET_SPAWN_TOTAL_MAX(thisx) ((thisx)->params & 0x3F)
+#define ENENCOUNT1_GET_PATH_INDEX(thisx) ((thisx)->params & 0x3F) // Used only by EN_ENCOUNT1_SKULLFISH_2 which doesn't use SpawnTotalMax
+
+#define ENENCOUNT1_PATH_INDEX_NONE 0x3F
+
+#define ENENCOUNT1_GET_SPAWN_TIME_MIN(thisx) ((thisx)->world.rot.x) // Time to wait between spawning
+#define ENENCOUNT1_GET_SPAWN_UNUSED_PROP(thisx) ((thisx)->world.rot.y) // Unused spawn property
+#define ENENCOUNT1_GET_SPAWN_DISTANCE_MAX(thisx) ((thisx)->world.rot.z) // Negative means infinite distance
typedef enum EnEncount1Enemy {
- /* 0x0 */ EN_ENCOUNT1_GRASSHOPPER,
- /* 0x1 */ EN_ENCOUNT1_WALLMASTER,
- /* 0x2 */ EN_ENCOUNT1_SKULLFISH,
- /* 0x3 */ EN_ENCOUNT1_SKULLFISH_2,
+ /* 0 */ EN_ENCOUNT1_GRASSHOPPER,
+ /* 1 */ EN_ENCOUNT1_WALLMASTER,
+ /* 2 */ EN_ENCOUNT1_SKULLFISH,
+ /* 3 */ EN_ENCOUNT1_SKULLFISH_2
} EnEncount1Enemy;
struct EnEncount1;
@@ -22,16 +31,16 @@ typedef struct EnEncount1 {
/* 0x000 */ Actor actor;
/* 0x144 */ EnEncount1ActionFunc actionFunc;
/* 0x148 */ Path* path;
- /* 0x14C */ s16 unk_14C;
- /* 0x14E */ s16 unk_14E;
- /* 0x150 */ s16 actorType;
- /* 0x152 */ s16 unk_152;
- /* 0x154 */ s16 unk_154;
- /* 0x156 */ s16 unk_156;
- /* 0x158 */ s16 unk_158;
- /* 0x15A */ s16 unk_15A;
- /* 0x15C */ s32 unk_15C;
- /* 0x160 */ f32 unk_160;
+ /* 0x14C */ s16 spawnActiveMax;
+ /* 0x14E */ s16 spawnActiveCount;
+ /* 0x150 */ s16 type;
+ /* 0x152 */ s16 spawnTotalCount;
+ /* 0x154 */ s16 spawnTotalMax;
+ /* 0x156 */ s16 timer;
+ /* 0x158 */ s16 spawnTimeMin;
+ /* 0x15A */ s16 pathIndex;
+ /* 0x15C */ s32 spawnUnusedProp;
+ /* 0x160 */ f32 spawnDistanceMax;
} EnEncount1; // size = 0x164
#endif // Z_EN_ENCOUNT1_H
diff --git a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
index 33a819b20..ad2f48c7f 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
@@ -270,24 +270,26 @@ void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
+
sPtr = this->effects;
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, sPtr++) {
if (sPtr->isEnabled) {
Matrix_Translate(sPtr->pos.x, sPtr->pos.y, sPtr->pos.z, MTXMODE_NEW);
Matrix_Scale(sPtr->scale, sPtr->scale, sPtr->scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, sPtr->alpha);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(play->state.frames * 20.0f), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.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++, gSunSparkleModelDL);
}
}
+
CLOSE_DISPS(gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c b/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
index 8d9a18cf1..5e28850c6 100644
--- a/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
+++ b/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
@@ -103,11 +103,11 @@ void func_809C4078(EnEncount4* this, PlayState* play) {
return;
}
- fireWallParams = BGFIREWALL_PARAMS_0;
+ fireWallParams = BGFIREWALL_PARAM_0;
if ((this->unk_148 == 0) || (captainKeeta->unk2DC != 0)) {
i = 0;
if (this->unk_148 != 0) {
- fireWallParams = BGFIREWALL_PARAMS_1;
+ fireWallParams = BGFIREWALL_PARAM_1;
i = 2;
}
while (i < ARRAY_COUNT(D_809C46DC)) {
@@ -171,10 +171,10 @@ void func_809C42A8(EnEncount4* this, PlayState* play) {
if (this->unk_14C != 0) {
yRot += 0x8000;
}
- pos.x += Math_SinS(yRot) * (40.0f + randPlusMinusPoint5Scaled(40.0f));
- pos.z += Math_CosS(yRot) * (40.0f + randPlusMinusPoint5Scaled(40.0f));
+ pos.x += Math_SinS(yRot) * (40.0f + Rand_CenteredFloat(40.0f));
+ pos.z += Math_CosS(yRot) * (40.0f + Rand_CenteredFloat(40.0f));
if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_SKB, pos.x, pos.y, pos.z, 0, 0, 0,
- ENSKB_PARAMS_0) != NULL) {
+ ENSKB_PARAM_0) != NULL) {
this->unk_14C++;
if (this->unk_14C >= 2) {
this->actionFunc = func_809C4598;
diff --git a/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
index 1786380ac..6121cce9d 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero/z_en_ending_hero.c
@@ -68,7 +68,9 @@ void EnEndingHero_Update(Actor* thisx, PlayState* play) {
}
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
static TexturePtr sEyeTextures[] = {
@@ -85,8 +87,9 @@ void EnEndingHero_Draw(Actor* thisx, PlayState* play) {
s32 index = 0;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->unk242]));
diff --git a/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
index 2650ad156..604bcd583 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero2/z_en_ending_hero2.c
@@ -61,14 +61,16 @@ void EnEndingHero2_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
void EnEndingHero2_Draw(Actor* thisx, PlayState* play) {
EnEndingHero2* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
index 8dcc12199..e95d8a6a7 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero3/z_en_ending_hero3.c
@@ -61,14 +61,16 @@ void EnEndingHero3_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
void EnEndingHero3_Draw(Actor* thisx, PlayState* play) {
EnEndingHero3* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
index 333bbc918..39fd515b1 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero4/z_en_ending_hero4.c
@@ -61,14 +61,16 @@ void EnEndingHero4_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
void EnEndingHero4_Draw(Actor* thisx, PlayState* play) {
EnEndingHero4* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
index ee62798f1..dd656f903 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero5/z_en_ending_hero5.c
@@ -62,7 +62,9 @@ void EnEndingHero5_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
Gfx* D_80C23BF0[] = { object_daiku_DL_0070C0, object_daiku_DL_006FB0, object_daiku_DL_006E80, object_daiku_DL_006D70,
@@ -83,26 +85,34 @@ void EnEndingHero5_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnEndingHero5_Draw(Actor* thisx, PlayState* play) {
EnEndingHero5* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
switch (this->unk25C) {
case 0:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
+
case 1:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
+
case 2:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
+
case 3:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
+
case 4:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
index 06f973265..9c5bbf42e 100644
--- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
+++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c
@@ -101,7 +101,9 @@ void EnEndingHero6_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
void EnEndingHero6_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
@@ -112,7 +114,7 @@ void EnEndingHero6_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
OPEN_DISPS(play->state.gfxCtx);
- if (this->npcIndex >= 4 && limbIndex == 15) {
+ if ((this->npcIndex >= 4) && (limbIndex == 15)) {
index = this->npcIndex - 4;
gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[index]);
}
@@ -131,28 +133,35 @@ void EnEndingHero6_Draw(Actor* thisx, PlayState* play) {
if (this->isIdle == 1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
- if (this->objectIndex >= 0 && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ if ((this->objectIndex >= 0) && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectIndex].segment);
switch (this->npcIndex) {
case 4:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
+
case 5:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
+
case 6:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
+
case 7:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
+
case 8:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
if (this->npcIndex == 0) {
diff --git a/src/overlays/actors/ovl_En_Estone/z_en_estone.c b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
index 72ac311a7..64bfdaecc 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.c
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
@@ -64,10 +64,10 @@ void EnEstone_Init(Actor* thisx, PlayState* play) {
s32 pad;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 15.0f);
- this->rotVel.x = this->rotVel.y = this->rotVel.z = randPlusMinusPoint5Scaled(1.0f) * 20.0f;
+ this->rotVel.x = this->rotVel.y = this->rotVel.z = Rand_CenteredFloat(1.0f) * 20.0f;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x2710);
+ this->actor.world.rot.y += (s16)(s32)Rand_CenteredFloat(0x2710);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.params == ENESTONE_TYPE_LARGE) {
@@ -174,7 +174,8 @@ void EnEstone_Update(Actor* thisx, PlayState* play2) {
Actor_MoveWithGravity(&this->actor);
if ((this->timer == 0) && !this->inactive) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 50.0f, 100.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 50.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
}
if (!this->inactive) {
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -194,9 +195,9 @@ void EnEstone_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
- Matrix_RotateXFApply(this->rot.x * (M_PI / 180.0f));
- Matrix_RotateYF(this->rot.y * (M_PI / 180.0f), MTXMODE_APPLY);
- Matrix_RotateZF(this->rot.z * (M_PI / 180.0f), MTXMODE_APPLY);
+ Matrix_RotateXFApply(DEG_TO_RAD(this->rot.x));
+ Matrix_RotateYF(DEG_TO_RAD(this->rot.y), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(this->rot.z), MTXMODE_APPLY);
Matrix_Scale(this->scale, this->scale, this->scale, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
@@ -223,9 +224,9 @@ void EnEstone_SpawnEffect(EnEstone* this, Vec3f* pos, Vec3f* velocity, Vec3f* ac
effect->accel = *accel;
effect->scale = scale;
effect->timer = lifetime;
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
break;
}
}
@@ -265,7 +266,7 @@ void EnEstone_DrawEffects(EnEstone* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isActive) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
diff --git a/src/overlays/actors/ovl_En_Estone/z_en_estone.h b/src/overlays/actors/ovl_En_Estone/z_en_estone.h
index ceb26c9c6..f9b44b944 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.h
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.h
@@ -11,7 +11,7 @@ typedef void (*EnEstoneActionFunc)(struct EnEstone*, PlayState*);
typedef enum {
/* 0 */ ENESTONE_TYPE_LARGE,
- /* 1 */ ENESTONE_TYPE_SMALL,
+ /* 1 */ ENESTONE_TYPE_SMALL
} EnEstoneType;
typedef struct {
diff --git a/src/overlays/actors/ovl_En_Fall/z_en_fall.c b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
index b83799ea6..03989b01f 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
@@ -52,11 +52,11 @@ void EnFall_FireRing_Draw(Actor* thisx, PlayState* play);
void EnFall_MoonsTear_Draw(Actor* thisx, PlayState* play);
typedef struct {
- u8 modelIndex;
- Vec3f pos;
- Vec3f velocity;
- Vec3s rot;
-} EnFallDebrisEffect;
+ /* 0x00 */ u8 modelIndex;
+ /* 0x04 */ Vec3f pos;
+ /* 0x10 */ Vec3f velocity;
+ /* 0x1C */ Vec3s rot;
+} EnFallDebrisEffect; // size = 0x24
#define EN_FALL_DEBRIS_EFFECT_COUNT 50
@@ -315,10 +315,10 @@ void EnFall_Setup(EnFall* this, PlayState* play) {
void EnFall_CrashingMoon_HandleGiantsCutscene(EnFall* this, PlayState* play) {
static s32 sGiantsCutsceneState = 0;
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 1) && (play->csCtx.currentCsIndex == 0)) {
+ if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 1) && (play->csCtx.scriptIndex == 0)) {
switch (sGiantsCutsceneState) {
case 0:
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
sGiantsCutsceneState += 2;
}
break;
@@ -327,20 +327,20 @@ void EnFall_CrashingMoon_HandleGiantsCutscene(EnFall* this, PlayState* play) {
if (CHECK_QUEST_ITEM(QUEST_REMAINS_ODOLWA) && CHECK_QUEST_ITEM(QUEST_REMAINS_GOHT) &&
CHECK_QUEST_ITEM(QUEST_REMAINS_GYORG) && CHECK_QUEST_ITEM(QUEST_REMAINS_TWINMOLD)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_93_04)) {
- if (ActorCutscene_GetCanPlayNext(0xC)) {
- ActorCutscene_Start(0xC, &this->actor);
+ if (CutsceneManager_IsNext(12)) {
+ CutsceneManager_Start(12, &this->actor);
sGiantsCutsceneState++;
} else {
- ActorCutscene_SetIntentToPlay(0xC);
+ CutsceneManager_Queue(12);
}
- } else if (ActorCutscene_GetCanPlayNext(0xB)) {
- ActorCutscene_Start(0xB, &this->actor);
+ } else if (CutsceneManager_IsNext(11)) {
+ CutsceneManager_Start(11, &this->actor);
SET_WEEKEVENTREG(WEEKEVENTREG_93_04);
sGiantsCutsceneState++;
} else {
- ActorCutscene_SetIntentToPlay(0xB);
+ CutsceneManager_Queue(11);
}
- } else if (play->csCtx.frames > 1600) {
+ } else if (play->csCtx.curFrame > 1600) {
play->nextEntrance = ENTRANCE(CLOCK_TOWER_ROOFTOP, 0);
gSaveContext.nextCutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -351,7 +351,7 @@ void EnFall_CrashingMoon_HandleGiantsCutscene(EnFall* this, PlayState* play) {
break;
case 9:
- play->csCtx.frames--;
+ play->csCtx.curFrame--;
break;
}
}
@@ -359,15 +359,15 @@ void EnFall_CrashingMoon_HandleGiantsCutscene(EnFall* this, PlayState* play) {
void EnFall_CrashingMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
EnFall_CrashingMoon_HandleGiantsCutscene(this, play);
- if (Cutscene_CheckActorAction(play, 0x85)) {
- if (Cutscene_CheckActorAction(play, 133) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id == 1) {
this->actor.draw = NULL;
} else {
this->actor.draw = EnFall_Moon_Draw;
- if (Cutscene_CheckActorAction(play, 133) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action == 2) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 133));
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id == 2) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133));
}
}
} else {
@@ -376,8 +376,8 @@ void EnFall_CrashingMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
}
void EnFall_StoppedOpenMouthMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 133)) {
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id) {
case 3:
if (this->eyeGlowIntensity == 0.0f) {
Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_EYE_FLASH);
@@ -396,10 +396,10 @@ void EnFall_StoppedOpenMouthMoon_PerformCutsceneActions(EnFall* this, PlayState*
}
void EnFall_StoppedClosedMouthMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 133)) {
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id) {
case 2:
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 133));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133));
break;
case 4:
@@ -409,9 +409,9 @@ void EnFall_StoppedClosedMouthMoon_PerformCutsceneActions(EnFall* this, PlayStat
}
if ((play->sceneId == SCENE_OKUJOU) && (gSaveContext.sceneLayer == 2)) {
- switch (play->csCtx.currentCsIndex) {
+ switch (play->csCtx.scriptIndex) {
case 0:
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 1060:
Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
break;
@@ -424,13 +424,13 @@ void EnFall_StoppedClosedMouthMoon_PerformCutsceneActions(EnFall* this, PlayStat
Actor_PlaySfx(&this->actor, NA_SE_EV_SLIP_MOON);
break;
}
- if (play->csCtx.frames >= 1145) {
+ if (play->csCtx.curFrame >= 1145) {
func_800B9010(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
}
break;
case 1:
- switch (play->csCtx.frames) {
+ switch (play->csCtx.curFrame) {
case 561:
Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
break;
@@ -443,7 +443,7 @@ void EnFall_StoppedClosedMouthMoon_PerformCutsceneActions(EnFall* this, PlayStat
Actor_PlaySfx(&this->actor, NA_SE_EV_SLIP_MOON);
break;
}
- if (play->csCtx.frames >= 650) {
+ if (play->csCtx.curFrame >= 650) {
func_800B9010(&this->actor, NA_SE_EV_FALL_POWER - SFX_FLAG);
}
break;
@@ -452,7 +452,7 @@ void EnFall_StoppedClosedMouthMoon_PerformCutsceneActions(EnFall* this, PlayStat
}
void EnFall_ClockTowerOrTitleScreenMoon_PerformCutsceneActions(EnFall* this, PlayState* play) {
- if (play->csCtx.state != 0 && play->sceneId == SCENE_OKUJOU) {
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_OKUJOU)) {
func_800B9010(&this->actor, NA_SE_EV_MOON_FALL - SFX_FLAG);
}
}
@@ -463,16 +463,16 @@ void EnFall_ClockTowerOrTitleScreenMoon_PerformCutsceneActions(EnFall* this, Pla
void EnFall_Moon_PerformDefaultActions(EnFall* this, PlayState* play) {
u16 currentDay;
- if (Cutscene_CheckActorAction(play, 133)) {
- if (Cutscene_CheckActorAction(play, 133) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id == 1) {
this->actor.draw = NULL;
} else {
Actor_SetScale(&this->actor, this->scale * 3.6f);
this->actor.draw = EnFall_Moon_Draw;
- if (Cutscene_CheckActorAction(play, 133) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 133)]->action == 2) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 133));
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_133) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133)]->id == 2) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_133));
}
}
} else {
@@ -510,8 +510,9 @@ void EnFall_MoonsTear_DoNothing(EnFall* this, PlayState* play) {
void EnFall_MoonsTear_Fall(EnFall* this, PlayState* play) {
s32 pad;
- if (Cutscene_CheckActorAction(play, 517) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 517)]->action == 2 && this->actor.draw == NULL) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_517) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_517)]->id == 2) &&
+ (this->actor.draw == NULL)) {
EnFall_MoonsTear_Initialize(this);
}
@@ -574,11 +575,11 @@ void EnFall_Fireball_SetPerVertexAlpha(f32 fireballAlpha) {
void EnFall_Fireball_Update(Actor* thisx, PlayState* play) {
EnFall* this = THIS;
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 2)) {
+ if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 2)) {
play->skyboxCtx.rot.y -= 0.05f;
}
- if (Cutscene_CheckActorAction(play, 450)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_450)) {
this->actor.draw = EnFall_Fireball_Draw;
if (this->flags & FLAG_FIRE_BALL_INTENSIFIES) {
this->fireballIntensity += 0.01f;
@@ -586,9 +587,9 @@ void EnFall_Fireball_Update(Actor* thisx, PlayState* play) {
this->fireballIntensity = 1.0f;
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 450));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, 450));
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 450)]->action) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, 450)]->id) {
default:
this->actor.draw = NULL;
this->fireballAlpha = 0;
@@ -625,7 +626,7 @@ void EnFall_Fireball_Update(Actor* thisx, PlayState* play) {
this->actor.draw = NULL;
}
- if (Cutscene_CheckActorAction(play, 0x1C2) && this->fireballAlpha > 0) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_450) && (this->fireballAlpha > 0)) {
func_8019F128(NA_SE_EV_MOON_FALL_LAST - SFX_FLAG);
}
Actor_SetScale(&this->actor, this->scale * 1.74f);
@@ -661,16 +662,16 @@ s32 EnFall_RisingDebris_InitializeEffect(EnFall* this) {
debrisEffects[i].pos.x = this->actor.world.pos.x;
debrisEffects[i].pos.y = this->actor.world.pos.y;
debrisEffects[i].pos.z = this->actor.world.pos.z;
- angle = randPlusMinusPoint5Scaled(0x10000);
+ angle = Rand_CenteredFloat(0x10000);
scale = (1.0f - (Rand_ZeroFloat(1.0f) * Rand_ZeroFloat(1.0f))) * 3000.0f;
debrisEffects[i].pos.x += Math_SinS(angle) * scale;
debrisEffects[i].pos.z += Math_CosS(angle) * scale;
debrisEffects[i].velocity.x = 0.0f;
debrisEffects[i].velocity.z = 0.0f;
debrisEffects[i].velocity.y = 80.0f;
- debrisEffects[i].rot.x = randPlusMinusPoint5Scaled(0x10000);
- debrisEffects[i].rot.y = randPlusMinusPoint5Scaled(0x10000);
- debrisEffects[i].rot.z = randPlusMinusPoint5Scaled(0x10000);
+ debrisEffects[i].rot.x = Rand_CenteredFloat(0x10000);
+ debrisEffects[i].rot.y = Rand_CenteredFloat(0x10000);
+ debrisEffects[i].rot.z = Rand_CenteredFloat(0x10000);
this->activeDebrisEffectCount++;
return true;
}
@@ -682,9 +683,9 @@ s32 EnFall_RisingDebris_InitializeEffect(EnFall* this) {
void EnFall_RisingDebris_Update(Actor* thisx, PlayState* play) {
EnFall* this = THIS;
- if (Cutscene_CheckActorAction(play, 451)) {
- if (Cutscene_CheckActorAction(play, 451) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 451)]->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_451)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_451) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_451)]->id == 2) {
EnFall_RisingDebris_UpdateEffects(this);
EnFall_RisingDebris_InitializeEffect(this);
} else if (this->activeDebrisEffectCount != 0) {
@@ -699,8 +700,8 @@ void EnFall_RisingDebris_Update(Actor* thisx, PlayState* play) {
void EnFall_FireRing_Update(Actor* thisx, PlayState* play) {
EnFall* this = THIS;
- if (Cutscene_CheckActorAction(play, 450) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 450)]->action == 5) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_450) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_450)]->id == 5) {
if (!(this->flags & FLAG_FIRE_RING_APPEARS)) {
Actor_PlaySfx(&this->actor, NA_SE_IT_DM_RING_EXPLOSION);
}
@@ -735,7 +736,7 @@ void EnFall_Moon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
Matrix_MultVec3f(sFocusOffset, &this->actor.focus.pos);
@@ -753,7 +754,7 @@ void EnFall_OpenMouthMoon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
primColor = (this->eyeGlowIntensity * 200.0f) + 40.0f;
@@ -771,7 +772,7 @@ void EnFall_LodMoon_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 20, 25, 30, 0, 0x3E7, 0x3200);
@@ -825,7 +826,7 @@ void EnFall_Fireball_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
this->fireballYTexScroll1 += (s32)(4.0f + (this->fireballIntensity * 12.0f));
this->fireballYTexScroll2 += (s32)(2.0f + (this->fireballIntensity * 6.0f));
@@ -863,7 +864,7 @@ void EnFall_RisingDebris_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gMoonDebrisMaterialDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -889,11 +890,12 @@ void EnFall_FireRing_Draw(Actor* thisx, PlayState* play) {
if (this->fireRingAlpha > 1.0f) {
this->fireRingAlpha = 1.0f;
}
+
OPEN_DISPS(play->state.gfxCtx);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(gMoonFireRingTexAnim));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
@@ -913,13 +915,13 @@ void EnFall_MoonsTear_Draw(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gFallingMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFallingMoonsTearDL);
Matrix_Scale(3.0f, 3.0f, 6.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gFallingMoonsTearFireDL);
diff --git a/src/overlays/actors/ovl_En_Fall/z_en_fall.h b/src/overlays/actors/ovl_En_Fall/z_en_fall.h
index c9eaaf44f..60bb7ec33 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.h
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.h
@@ -19,7 +19,7 @@ typedef enum {
/* 9 */ EN_FALL_TYPE_CLOCK_TOWER_MOON,
/* 10 */ EN_FALL_TYPE_STOPPED_MOON_OPEN_MOUTH,
/* 11 */ EN_FALL_TYPE_CRASH_FIRE_RING,
- /* 12 */ EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER,
+ /* 12 */ EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER
} EnFallType;
struct EnFall;
diff --git a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
index 33cf9a64d..bdf742ec3 100644
--- a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
+++ b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.c
@@ -44,7 +44,7 @@ void EnFall2_Init(Actor* thisx, PlayState* play) {
this->unk2DC = Lib_SegmentedToVirtual(object_fall2_Matanimheader_008840);
Actor_SetScale(&this->actor, 0.02f);
this->actionFunc = func_80C1B9D4;
- this->csActionIndex = 0x231;
+ this->cueType = CS_CMD_ACTOR_CUE_561;
this->alphaLevel = 0.0f;
}
@@ -92,13 +92,13 @@ void EnFall2_DoNothing(EnFall2* this, PlayState* play) {
void func_80C1B8B4(EnFall2* this) {
this->actor.draw = EnFall2_Draw;
- if (this->csActorAction == 1) {
+ if (this->cueId == 1) {
Actor_SetScale(&this->actor, 0.02f);
}
}
void func_80C1B8F0(EnFall2* this) {
- switch (this->csActorAction) {
+ switch (this->cueId) {
case 1:
if (this->alphaLevel < 1.0f) {
this->alphaLevel += 1.0f / 30.0f;
@@ -125,12 +125,10 @@ void func_80C1B8F0(EnFall2* this) {
void func_80C1B9D4(EnFall2* this, PlayState* play) {
func_80183DE0(&this->skeletonInfo);
- if (Cutscene_CheckActorAction(play, this->csActionIndex)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csActionIndex));
- if (this->csActorAction !=
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionIndex)]->action) {
- this->csActorAction =
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csActionIndex)]->action;
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
func_80C1B8B4(this);
}
func_80C1B8F0(this);
@@ -155,13 +153,13 @@ void EnFall2_Draw(Actor* thisx, PlayState* play) {
Mtx* mtx;
if (!(this->alphaLevel <= 0.0f)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_fall2_Matanimheader_008840));
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((s16)(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY);
func_8018450C(play, &this->skeletonInfo, mtx, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.h b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.h
index 41f064498..3555595f3 100644
--- a/src/overlays/actors/ovl_En_Fall2/z_en_fall2.h
+++ b/src/overlays/actors/ovl_En_Fall2/z_en_fall2.h
@@ -15,8 +15,8 @@ typedef struct EnFall2 {
/* 0x228 */ Vec3s unk228[30];
/* 0x2DC */ AnimatedMaterial* unk2DC;
/* 0x2E0 */ f32 alphaLevel;
- /* 0x2E4 */ s16 csActorAction;
- /* 0x2E6 */ u16 csActionIndex;
+ /* 0x2E4 */ s16 cueId;
+ /* 0x2E6 */ u16 cueType;
/* 0x2E8 */ EnFall2ActionFunc actionFunc;
} EnFall2; // size = 0x2EC
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 932d937ee..269866ff0 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -166,13 +166,13 @@ void EnFamos_Init(Actor* thisx, PlayState* play) {
s32 i;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (FAMOS_GET_PATH(thisx) != 0xFF) {
- path = &play->setupPathList[this->actor.params];
+ if (FAMOS_GET_PATH_INDEX(&this->actor) != FAMOS_PATH_INDEX_NONE) {
+ path = &play->setupPathList[FAMOS_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathNodeCount = path->count;
- if (this->pathNodeCount == 1) {
+ this->pathCount = path->count;
+ if (this->pathCount == 1) {
this->pathPoints = NULL;
- this->pathNodeCount = 0;
+ this->pathCount = 0;
}
}
@@ -265,7 +265,7 @@ void EnFamos_SetupDeathDebris(EnFamos* this) {
rock->rotation.y = (s32)Rand_Next() >> 0x10;
rock->rotation.z = (s32)Rand_Next() >> 0x10;
rock->pos.x = Math_SinS(randVelDirection) * 20.0f + this->actor.world.pos.x;
- rock->pos.y = randPlusMinusPoint5Scaled(60.0f) + (this->actor.world.pos.y + 40.0f);
+ rock->pos.y = Rand_CenteredFloat(60.0f) + (this->actor.world.pos.y + 40.0f);
rock->pos.z = Math_CosS(randVelDirection) * 20.0f + this->actor.world.pos.z;
rock->scale = Rand_ZeroFloat(0.002f) + (2.5f * 0.001f);
}
@@ -365,15 +365,15 @@ void EnFamos_StillIdle(EnFamos* this, PlayState* play) {
*/
void EnFamos_SetupPathingIdle(EnFamos* this) {
if (this->isCalm) {
- this->currentPathNode++;
- if (this->currentPathNode == this->pathNodeCount) {
- this->currentPathNode = 0;
+ this->waypointIndex++;
+ if (this->waypointIndex == this->pathCount) {
+ this->waypointIndex = 0;
}
} else {
this->isCalm = true;
}
- Math_Vec3s_ToVec3f(&this->targetDest, &this->pathPoints[this->currentPathNode]);
+ Math_Vec3s_ToVec3f(&this->targetDest, &this->pathPoints[this->waypointIndex]);
this->targetYaw = Actor_WorldYawTowardPoint(&this->actor, &this->targetDest);
this->actionFunc = EnFamos_PathingIdle;
this->actor.speed = 0.0f;
@@ -489,7 +489,7 @@ void EnFamos_SetupChase(EnFamos* this) {
void EnFamos_Chase(EnFamos* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f abovePlayerPos;
- u32 surfaceType;
+ FloorProperty surfaceType;
EnFamos_UpdateBobbingHeight(this);
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x800);
@@ -500,9 +500,9 @@ void EnFamos_Chase(EnFamos* this, PlayState* play) {
this->actor.world.rot.x = -Actor_WorldPitchTowardPoint(&this->actor, &abovePlayerPos);
Math_StepToF(&this->actor.speed, 6.0f, 0.5f);
- surfaceType = func_800C9B18(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
if ((this->actor.xzDistToPlayer < 30.0f) && (this->actor.floorHeight > BGCHECK_Y_MIN) && // close enough
- (surfaceType != 0xC && surfaceType != 0xD)) {
+ ((surfaceType != FLOOR_PROPERTY_12) && (surfaceType != FLOOR_PROPERTY_13))) {
EnFamos_SetupAttackAim(this);
} else if ((Player_GetMask(play) == PLAYER_MASK_STONE) ||
@@ -543,9 +543,10 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) {
this->emblemCollider.base.acFlags &= ~AC_ON;
}
- surfaceType = func_800C9B18(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
hitFloor = this->actor.bgCheckFlags & BGCHECKFLAG_GROUND;
- if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == 0xC) || (surfaceType == 0xD)) {
+ if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == FLOOR_PROPERTY_12) ||
+ (surfaceType == FLOOR_PROPERTY_13)) {
this->collider1.base.atFlags &= ~AT_ON;
this->collider2.base.atFlags |= AT_ON;
if (hitFloor) {
@@ -686,12 +687,12 @@ void EnFamos_DeathExplosion(EnFamos* this, PlayState* play) {
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 4);
}
- this->actor.world.pos.x = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.x;
- this->actor.world.pos.z = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.z;
+ this->actor.world.pos.x = Rand_CenteredFloat(5.0f) + this->targetDest.x;
+ this->actor.world.pos.z = Rand_CenteredFloat(5.0f) + this->targetDest.z;
if (this->stateTimer == 1) {
- EnBom* explosion =
- (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y + 40.0f, this->actor.world.pos.z, 0, 0, 0, BOMB_TYPE_BODY);
+ EnBom* explosion = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
+ this->actor.world.pos.y + 40.0f, this->actor.world.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (explosion != NULL) {
explosion->timer = 0; // instant explosion
}
@@ -747,7 +748,7 @@ void EnFamos_Update(Actor* thisx, PlayState* play) {
f32 oldHeight;
s32 oldHoverTimer; // save old value to test if changed
- if (this->debrisTimer <= 0 ||
+ if ((this->debrisTimer <= 0) ||
(this->debrisTimer--, EnFamos_UpdateDebrisPosRot(this), (this->actionFunc != EnFamos_DeathFade))) {
oldHoverTimer = this->hoverTimer;
EnFamos_UpdateFlipStatus(this);
@@ -766,7 +767,9 @@ void EnFamos_Update(Actor* thisx, PlayState* play) {
}
if (this->flippedTimer >= 0) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 80.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 80.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if ((this->actionFunc == EnFamos_Attack) && (this->animatedMaterialIndex != FAMOS_ANIMATED_MAT_NORMAL) &&
(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
this->actor.world.pos.y -= 60.0f;
@@ -827,9 +830,10 @@ void EnFamos_DrawDebris(EnFamos* this, PlayState* play) {
EnFamosRock* rock;
OPEN_DISPS(play->state.gfxCtx);
+
dispOpa = POLY_OPA_DISP;
- gSPDisplayList(&dispOpa[0], &sSetupDL[6 * 0x19]);
+ gSPDisplayList(&dispOpa[0], gSetupDLs[SETUPDL_25]);
gDPSetPrimColor(&dispOpa[1], 0, 0x80, 255, 255, 255, 255);
@@ -856,7 +860,7 @@ void EnFamos_DrawDebris(EnFamos* this, PlayState* play) {
void EnFamos_Draw(Actor* thisx, PlayState* play) {
EnFamos* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc != EnFamos_DeathFade) {
AnimatedMat_Draw(play, sEmblemAnimatedMats[this->animatedMaterialIndex]);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnFamos_OverrideLimbDraw,
diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.h b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
index 874da9034..468356376 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.h
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
@@ -15,9 +15,11 @@ typedef struct EnFamosRock {
/* 0x20 */ f32 scale;
} EnFamosRock; // size = 0x24
-#define FAMOS_GET_PATH(thisx) ((thisx)->params)
+#define FAMOS_GET_PATH_INDEX(thisx) ((thisx)->params)
#define FAMOS_GET_AGGRO_DISTANCE(thisx) ((thisx)->shape.rot.x)
+#define FAMOS_PATH_INDEX_NONE 0xFF
+
// stateTimer gets reused:
// after spotting player, counts frames until first attack (8)
// after lost aggro, measures frames looking around before returning to home (60)
@@ -33,8 +35,8 @@ typedef struct EnFamos {
/* 0x1D0 */ EnFamosActionFunc actionFunc;
/* 0x1D4 */ u8 animatedMaterialIndex;
/* 0x1D5 */ u8 hasFinishedRotating; // stable up or down
- /* 0x1D6 */ u8 pathNodeCount;
- /* 0x1D7 */ u8 currentPathNode;
+ /* 0x1D6 */ u8 pathCount;
+ /* 0x1D7 */ u8 waypointIndex;
/* 0x1D8 */ u8 isCalm; // is NOT aware of player
/* 0x1DA */ s16 hoverTimer; // start 30, decr to 0, repeat: for trig height adjustment when hovering
/* 0x1DC */ s16 stateTimer; // reused for different actionFunc
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.c b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
index 90f90cf74..491d3c499 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -107,7 +107,7 @@ s32 EnFg_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s32 ret;
ret = false;
- if (animIndex >= 0 && animIndex < 4) {
+ if ((animIndex >= 0) && (animIndex < 4)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -151,15 +151,19 @@ s32 EnFg_GetDamageEffect(EnFg* this) {
case 1:
ret = FG_DMGEFFECT_DEKUSTICK;
break;
+
case 15:
ret = FG_DMGEFFECT_HOOKSHOT;
break;
+
case 14:
ret = FG_DMGEFFECT_ARROW;
break;
+
case 3:
ret = FG_DMGEFFECT_ICEARROW;
break;
+
default:
ret = FG_DMGEFFECT_EXPLOSION;
break;
@@ -187,8 +191,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.world.pos.y = this->actor.floorHeight + 2.0f;
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_ARROW:
this->actor.flags &= ~ACTOR_FLAG_1;
this->skelAnime.playSpeed = 0.0f;
@@ -202,10 +208,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
- if (1) {}
this->actor.params = FG_BLACK;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
@@ -218,6 +224,7 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (DECR(this->timer) == 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_JUMP);
@@ -251,8 +258,10 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
@@ -269,6 +278,7 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
this->skelAnime.curFrame = 8.0f;
@@ -338,14 +348,15 @@ void EnFg_Update(Actor* thisx, PlayState* play) {
s32 flagSet;
flag = this->actor.flags;
- flagSet = ((flag & 0x2000) == 0x2000);
+ flagSet = CHECK_FLAG_ALL(flag, ACTOR_FLAG_2000);
if (1) {}
if (!flagSet) {
- flagSet = ((flag & 0x8000) == 0x8000);
+ flagSet = CHECK_FLAG_ALL(flag, ACTOR_FLAG_8000);
if (1) {}
if (!flagSet) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, BASE_REG(16, 0), BASE_REG(16, 1), 0.0f, 0x5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, sREG(0), sREG(1), 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -376,11 +387,13 @@ void EnFg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if ((limbIndex == 7) || (limbIndex == 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Push();
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, *dList);
Matrix_Pop();
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -402,7 +415,8 @@ void EnFg_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, envColor[this->actor.params].r, envColor[this->actor.params].g,
envColor[this->actor.params].b, envColor[this->actor.params].a);
@@ -410,6 +424,7 @@ void EnFg_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(object_fr_Tex_0059A0));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFg_OverrideLimbDraw, EnFg_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -455,29 +470,32 @@ void EnFg_DrawDust(PlayState* play, EnFgEffectDust* dustEffect) {
s16 firstDone = false;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 10; i++, dustEffect++) {
- if (dustEffect->type) {
- if (!firstDone) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
- firstDone = true;
- }
-
- if (1) {}
- alpha = (255.0f / 16.0f) * dustEffect->timer;
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
- gDPPipeSync(POLY_XLU_DISP++);
- Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- index = 0.5f * dustEffect->timer;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
+ if (dustEffect->type == 0) {
+ continue;
}
+
+ if (!firstDone) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
+ firstDone = true;
+ }
+
+ alpha = (255.0f / 16.0f) * dustEffect->timer;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
+ gDPPipeSync(POLY_XLU_DISP++);
+ Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ index = 0.5f * dustEffect->timer;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
+ gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.h b/src/overlays/actors/ovl_En_Fg/z_en_fg.h
index 6440812ca..a1917b9bc 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.h
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.h
@@ -9,21 +9,21 @@ typedef void (*EnFgActionFunc)(struct EnFg*, PlayState*);
// Based on the envColor data. Related to params but mostly unused.
typedef enum {
- /* 0x0 */ FG_YELLOW,
- /* 0x1 */ FG_CYAN,
- /* 0x2 */ FG_PINK,
- /* 0x3 */ FG_BLUE,
- /* 0x4 */ FG_WHITE,
- /* 0x5 */ FG_BLACK, // All frogs are blackened when hit by an explosion
+ /* 0 */ FG_YELLOW,
+ /* 1 */ FG_CYAN,
+ /* 2 */ FG_PINK,
+ /* 3 */ FG_BLUE,
+ /* 4 */ FG_WHITE,
+ /* 5 */ FG_BLACK // All frogs are blackened when hit by an explosion
} FrogType;
typedef enum {
- /* 0x0 */ FG_DMGEFFECT_NONE,
- /* 0x1 */ FG_DMGEFFECT_EXPLOSION, // Bomb or bombchu, not powderkeg
- /* 0x2 */ FG_DMGEFFECT_DEKUSTICK,
- /* 0x3 */ FG_DMGEFFECT_HOOKSHOT,
- /* 0x4 */ FG_DMGEFFECT_ARROW,
- /* 0x5 */ FG_DMGEFFECT_ICEARROW,
+ /* 0 */ FG_DMGEFFECT_NONE,
+ /* 1 */ FG_DMGEFFECT_EXPLOSION, // Bomb or bombchu, not powderkeg
+ /* 2 */ FG_DMGEFFECT_DEKUSTICK,
+ /* 3 */ FG_DMGEFFECT_HOOKSHOT,
+ /* 4 */ FG_DMGEFFECT_ARROW,
+ /* 5 */ FG_DMGEFFECT_ICEARROW
} FrogDamageEffect;
typedef struct {
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 357887c97..fd3b723d8 100644
--- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -8,7 +8,7 @@
#include "overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h"
#include "objects/object_firefly/object_firefly.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnFirefly*)thisx)
@@ -301,7 +301,7 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y,
Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), 0x300);
} else if (rand < 0.8f) {
- this->actor.shape.rot.y += (s16)randPlusMinusPoint5Scaled(1536.0f);
+ this->actor.shape.rot.y += (s16)(s32)Rand_CenteredFloat(0x600);
}
// Climb if too close to ground
@@ -703,7 +703,8 @@ void EnFirefly_Update(Actor* thisx, PlayState* play2) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 15.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 15.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
this->collider.dim.worldSphere.center.x = this->actor.world.pos.x;
this->collider.dim.worldSphere.center.y = (s32)this->actor.world.pos.y + 10;
this->collider.dim.worldSphere.center.z = this->actor.world.pos.z;
@@ -827,7 +828,7 @@ void EnFirefly_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
}
- gSPDisplayList(gfx, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx, gSetupDLs[SETUPDL_25]);
if (this->currentType == KEESE_FIRE) {
gDPSetEnvColor(&gfx[1], 0, 0, 0, 0);
diff --git a/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c b/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
index 6c105caa2..00a0d4d9d 100644
--- a/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
+++ b/src/overlays/actors/ovl_En_Firefly2/z_en_firefly2.c
@@ -6,7 +6,7 @@
#include "z_en_firefly2.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnFirefly2*)thisx)
diff --git a/src/overlays/actors/ovl_En_Fish/z_en_fish.c b/src/overlays/actors/ovl_En_Fish/z_en_fish.c
index 2f54e4dcb..0331ec347 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.c
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.c
@@ -264,7 +264,7 @@ void func_8091DEE4(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.terminalVelocity = 0.0f;
this->unk_240 = Rand_S16Offset(5, D_8091FACC[this->unk_278]);
- this->unk_248 = 0;
+ this->updBgCheckInfoFlags = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_268 = 0;
@@ -314,7 +314,7 @@ void func_8091E070(EnFish* this) {
phi_a1 = D_8091FAD4[this->unk_278];
}
this->unk_240 = Rand_S16Offset(15, phi_a1);
- this->unk_248 = 0;
+ this->updBgCheckInfoFlags = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_26C = 0;
@@ -361,7 +361,7 @@ void func_8091E2E0(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.terminalVelocity = 0.0f;
this->unk_240 = Rand_S16Offset(10, 40);
- this->unk_248 = 0;
+ this->updBgCheckInfoFlags = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_268 = 0;
@@ -440,7 +440,7 @@ void func_8091E5EC(EnFish* this) {
this->unk_26C = 0;
func_8091D660(this);
this->unk_240 = Rand_S16Offset(10, 30);
- this->unk_248 = 0;
+ this->updBgCheckInfoFlags = 0;
this->unkFunc = func_8091E658;
}
@@ -493,7 +493,7 @@ void func_8091E810(EnFish* this) {
this->actor.terminalVelocity = -10.0f;
this->actor.shape.yOffset = 0.0f;
func_8091D6C4(this);
- this->unk_248 = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
this->unkFunc = func_8091E880;
this->unk_24C = 0.0f;
this->unk_240 = 300;
@@ -551,7 +551,7 @@ void func_8091E9A4(EnFish* this) {
this->actor.shape.yOffset = 300.0f;
func_8091D6C4(this);
this->unkFunc = func_8091EAF0;
- this->unk_248 = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
this->unk_24C = 0.0f;
if (sp24 && (this->actor.draw != NULL)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FISH_LEAP);
@@ -612,7 +612,7 @@ void func_8091ECF4(EnFish* this) {
this->unk_240 = 200;
func_8091D660(this);
this->unkFunc = func_8091ED70;
- this->unk_248 = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
this->unk_24C = 0.0f;
}
@@ -677,7 +677,7 @@ void func_8091EF30(EnFish* this) {
this->unk_240 = 15;
this->unk_279 = 10;
this->unkFunc = func_8091EFE8;
- this->unk_248 = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
this->unk_24C = 0.0f;
}
@@ -772,7 +772,7 @@ void func_8091F344(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.terminalVelocity = 0.0f;
this->unk_240 = Rand_S16Offset(5, 35);
- this->unk_248 = 1;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1;
this->unk_268 = 0;
this->unk_26C = 0;
this->unk_26E = 1500;
@@ -856,7 +856,7 @@ void func_8091F5A4(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
func_8091D7C4(this);
Actor_MoveWithGravity(&this->actor);
- if (this->unk_248 != 0) {
+ if (this->updBgCheckInfoFlags != 0) {
u32 temp = (play->sceneId != SCENE_LABO);
phi_f0 = BREG(1) + 10.0f;
@@ -864,7 +864,7 @@ void func_8091F5A4(Actor* thisx, PlayState* play) {
if (temp) {
phi_f0 = 6.0f;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 17.5f, phi_f0, 0.0f, this->unk_248);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 17.5f, phi_f0, 0.0f, this->updBgCheckInfoFlags);
}
if ((this->actor.xzDistToPlayer < 70.0f) && (this->unkFunc != func_8091EFE8)) {
@@ -948,7 +948,7 @@ void EnFish_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colour->r, colour->g, colour->b, 255);
diff --git a/src/overlays/actors/ovl_En_Fish/z_en_fish.h b/src/overlays/actors/ovl_En_Fish/z_en_fish.h
index 528eeb40c..2a348051e 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.h
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.h
@@ -7,12 +7,12 @@ struct EnFish;
typedef void (*EnFishUnkFunc)(Actor*, PlayState*);
-enum {
+typedef enum {
/* -1 */ ENFISH_MINUS1 = -1,
/* 0 */ ENFISH_0,
/* 1 */ ENFISH_1,
- /* 2 */ ENFISH_2,
-};
+ /* 2 */ ENFISH_2
+} EnFishParam;
typedef struct EnFish {
/* 0x000 */ Actor actor;
@@ -26,7 +26,7 @@ typedef struct EnFish {
/* 0x242 */ s16 unk_242;
/* 0x244 */ s16 unk_244;
/* 0x246 */ s16 unk_246;
- /* 0x248 */ s32 unk_248;
+ /* 0x248 */ s32 updBgCheckInfoFlags;
/* 0x24C */ f32 unk_24C;
/* 0x250 */ f32 unk_250;
/* 0x254 */ f32 unk_254;
diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
index a53393284..923cfeef2 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
@@ -151,7 +151,7 @@ s32 func_80B28478(EnFish2* this) {
void EnFish2_Init(Actor* thisx, PlayState* play) {
EnFish2* this = THIS;
s32 i;
- s32 cs;
+ s32 csId;
Math_Vec3f_Copy(&this->unk_324, &this->actor.home.pos);
this->unk_344 = D_80B2B2F0;
@@ -187,12 +187,12 @@ void EnFish2_Init(Actor* thisx, PlayState* play) {
this->unk_2C0 = 3;
}
}
- cs = this->actor.cutscene;
+ csId = this->actor.csId;
this->unk_330 = D_80B2B370[this->unk_2C0];
i = 0;
// clang-format off
- while (cs != -1) { this->unk_2BA[i] = cs; cs = ActorCutscene_GetAdditionalCutscene(cs); i++; }
+ while (csId != CS_ID_NONE) { this->csIdList[i] = csId; csId = CutsceneManager_GetAdditionalCsId(csId); i++; }
// clang-format on
Collider_InitAndSetJntSph(play, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
@@ -352,7 +352,7 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
this->unk_2B4 = (s32)Rand_ZeroFloat(20.0f) + 10;
} else if (this->unk_2B4 == 1) {
if ((this->unk_348 == 0) || (Rand_ZeroOne() < 0.6f)) {
- this->unk_348 = randPlusMinusPoint5Scaled(0x2000);
+ this->unk_348 = Rand_CenteredFloat(0x2000);
} else {
this->unk_348 = Math_Vec3f_Pitch(&this->actor.world.pos, &this->unk_324);
if (this->unk_348 < -0x1000) {
@@ -416,7 +416,7 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
if (this->unk_354 != NULL) {
D_80B2B2E4 = 0;
D_80B2B2E0 = 1;
- fish->unk_2BA[0] = this->unk_2BA[0];
+ fish->csIdList[0] = this->csIdList[0];
fish->unk_350 = this->unk_350;
}
}
@@ -545,8 +545,8 @@ void func_80B295A4(EnFish2* this, PlayState* play) {
Math_ApproachZeroF(&this->actor.speed, 0.3f, 0.3f);
if (this->unk_2B4 != 0) {
Math_Vec3f_Copy(&sp60, &this->unk_318);
- sp60.x += randPlusMinusPoint5Scaled(100.0f);
- sp60.z += randPlusMinusPoint5Scaled(100.0f);
+ sp60.x += Rand_CenteredFloat(100.0f);
+ sp60.z += Rand_CenteredFloat(100.0f);
for (i = 0; i < 2; i++) {
EffectSsBubble_Spawn(play, &sp60, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(this->unk_330 * 4.0f) + 0.1f);
@@ -784,11 +784,11 @@ void func_80B29EE4(EnFish2* this, PlayState* play) {
void func_80B2A01C(EnFish2* this, PlayState* play) {
if (this->unk_2B4 == 0) {
- if (!ActorCutscene_GetCanPlayNext(this->unk_2BA[0])) {
- ActorCutscene_SetIntentToPlay(this->unk_2BA[0]);
+ if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
} else {
this->unk_2B4 = 15;
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2BA[0], &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->actor);
this->actionFunc = func_80B2A094;
}
}
@@ -801,13 +801,13 @@ void func_80B2A094(EnFish2* this, PlayState* play) {
D_80B2B2E4 = 1;
}
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->unk_2BA[0]);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->csIdList[0]);
if (D_80B2B2EC != 0) {
D_80B2B2EC++;
if (D_80B2B2EC > 200) {
Actor_Kill(&this->actor);
- ActorCutscene_Stop(this->unk_2BA[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
return;
}
}
@@ -862,7 +862,7 @@ void func_80B2A23C(EnFish2* this, PlayState* play) {
if ((this->unk_2B4 == 0) && (D_80B2B2E4 == 3)) {
D_80B2B2E0 = D_80B2B2EC = D_80B2B2E4 = 0;
D_80B2B2F4 = NULL;
- ActorCutscene_Stop(this->unk_2BA[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
Actor_Kill(&this->actor);
}
}
@@ -912,10 +912,10 @@ void func_80B2A498(EnFish2* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp6C, &this->actor.world.pos);
- sp6C.x += randPlusMinusPoint5Scaled(70.0f);
+ sp6C.x += Rand_CenteredFloat(70.0f);
sp6C.y = this->unk_334 + 10.0f;
- sp6C.z += randPlusMinusPoint5Scaled(70.0f);
- EffectSsGSplash_Spawn(play, &sp6C, NULL, NULL, 0, (s32)randPlusMinusPoint5Scaled(50.0f) + 350);
+ sp6C.z += Rand_CenteredFloat(70.0f);
+ EffectSsGSplash_Spawn(play, &sp6C, NULL, NULL, 0, (s32)Rand_CenteredFloat(50.0f) + 350);
}
}
}
@@ -970,11 +970,11 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
if ((play->gameplayFrames % 8) == 0) {
Math_Vec3f_Copy(&sp5C, &this->unk_324);
- sp5C.x += randPlusMinusPoint5Scaled(100.0f);
+ sp5C.x += Rand_CenteredFloat(100.0f);
sp5C.y = this->actor.floorHeight;
- sp5C.z += randPlusMinusPoint5Scaled(100.0f);
+ sp5C.z += Rand_CenteredFloat(100.0f);
- for (i = 0; i < (s32)randPlusMinusPoint5Scaled(5.0f) + 10; i++) {
+ for (i = 0; i < (s32)Rand_CenteredFloat(5.0f) + 10; i++) {
EffectSsBubble_Spawn(play, &sp5C, 0, 5.0f, 5.0f, Rand_ZeroFloat(this->unk_330 * 4.0f) + 0.1f);
}
}
@@ -987,7 +987,8 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
this->unk_33C = 25.0f - ((this->unk_330 - 0.01f) * 1000.0f);
Actor_SetScale(&this->actor, this->unk_330);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0, 15.0f, 10.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0, 15.0f, 10.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
if (this->actor.params != 2) {
this->unk_2D4 = this->actor.floorHeight + (this->unk_330 * 1000.0f);
@@ -1077,8 +1078,8 @@ void EnFish2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
void EnFish2_Draw(Actor* thisx, PlayState* play) {
EnFish2* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFish2_OverrideLimbDraw, EnFish2_PostLimbDraw, &this->actor);
func_80B2B180(this, play);
@@ -1101,9 +1102,9 @@ void func_80B2ADB0(EnFish2* this, Vec3f* vec, s16 arg2) {
ptr->unk_20 = VIRTUAL_TO_PHYSICAL(SEGMENTED_TO_VIRTUAL(phi_v0));
ptr->unk_00 = true;
ptr->unk_04 = *vec;
- ptr->unk_04.x += randPlusMinusPoint5Scaled(ptr->unk_00 + (this->unk_330 * 4000.0f));
- ptr->unk_04.y += randPlusMinusPoint5Scaled(20.0f);
- ptr->unk_04.z += randPlusMinusPoint5Scaled(ptr->unk_00 + (this->unk_330 * 4000.0f));
+ ptr->unk_04.x += Rand_CenteredFloat(ptr->unk_00 + (this->unk_330 * 4000.0f));
+ ptr->unk_04.y += Rand_CenteredFloat(20.0f);
+ ptr->unk_04.z += Rand_CenteredFloat(ptr->unk_00 + (this->unk_330 * 4000.0f));
ptr->unk_18 = (this->unk_330 * 20.0f) - (Rand_ZeroFloat(5.0f) * 0.01f);
ptr->unk_1C = 0x42;
ptr->unk_10 = arg2;
@@ -1156,7 +1157,7 @@ void func_80B2B180(EnFish2* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
ptr = &this->unk_3F8[0];
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
if (ptr->unk_00) {
diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
index 49941d67e..20b1ff21b 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h
@@ -28,7 +28,7 @@ typedef struct EnFish2 {
/* 0x02B4 */ s16 unk_2B4;
/* 0x02B6 */ s16 unk_2B6;
/* 0x02B8 */ s16 unk_2B8;
- /* 0x02BA */ s16 unk_2BA[3];
+ /* 0x02BA */ s16 csIdList[3];
/* 0x02C0 */ s32 unk_2C0;
/* 0x02C4 */ s32 unk_2C4;
/* 0x02C8 */ u8 unk_2C8;
diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
index 31d884c4d..20edbcbc2 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -25,24 +25,24 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2);
void EnFishing_DrawOwner(Actor* thisx, PlayState* play);
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x02 */ Vec3s pos;
- /* 0x08 */ u8 unk_08;
- /* 0x0C */ f32 unk_0C;
+ /* 0x0 */ u8 unk_00;
+ /* 0x2 */ Vec3s pos;
+ /* 0x8 */ u8 unk_08;
+ /* 0xC */ f32 unk_0C;
} FishingFishInit; // size = 0x10
#define EFFECT_COUNT 130
typedef enum {
- /* 0x00 */ FS_EFF_NONE,
- /* 0x01 */ FS_EFF_RIPPLE,
- /* 0x02 */ FS_EFF_DUST_SPLASH,
- /* 0x03 */ FS_EFF_WATER_DUST,
- /* 0x04 */ FS_EFF_BUBBLE,
- /* 0x05 */ FS_EFF_RAIN_DROP,
- /* 0x06 */ FS_EFF_OWNER_HAT,
- /* 0x07 */ FS_EFF_RAIN_RIPPLE,
- /* 0x08 */ FS_EFF_RAIN_SPLASH
+ /* 0 */ FS_EFF_NONE,
+ /* 1 */ FS_EFF_RIPPLE,
+ /* 2 */ FS_EFF_DUST_SPLASH,
+ /* 3 */ FS_EFF_WATER_DUST,
+ /* 4 */ FS_EFF_BUBBLE,
+ /* 5 */ FS_EFF_RAIN_DROP,
+ /* 6 */ FS_EFF_OWNER_HAT,
+ /* 7 */ FS_EFF_RAIN_RIPPLE,
+ /* 8 */ FS_EFF_RAIN_SPLASH
} FishingEffectType;
typedef struct {
@@ -73,9 +73,9 @@ typedef enum {
} FishingPropType;
typedef struct {
- /* 0x00 */ u8 type;
- /* 0x02 */ Vec3s pos;
-} FishingPropInit; // size = 0x08
+ /* 0x0 */ u8 type;
+ /* 0x2 */ Vec3s pos;
+} FishingPropInit; // size = 0x8
typedef struct {
/* 0x00 */ Vec3f pos;
@@ -93,8 +93,8 @@ typedef struct {
} FishingProp; // size = 0x3C
typedef enum {
- /* 0x00 */ FS_GROUP_FISH_NONE,
- /* 0x01 */ FS_GROUP_FISH_NORMAL
+ /* 0 */ FS_GROUP_FISH_NONE,
+ /* 1 */ FS_GROUP_FISH_NORMAL
} FishingGroupFishType;
#define GROUP_FISH_COUNT 60
@@ -835,7 +835,7 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
if (sLinkAge != 1) {
// HIGH_SCORE(HS_FISHING) from OoT
- if (gSaveContext.save.unk_EE4 & 0x1000) {
+ if (gSaveContext.save.saveInfo.unk_EC0 & 0x1000) {
D_8090CD08 = 0;
} else {
D_8090CD08 = 1;
@@ -853,18 +853,18 @@ void EnFishing_Init(Actor* thisx, PlayState* play2) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
if (sLinkAge == 1) {
- if (gSaveContext.save.unk_EE4 & 0x7F) {
- D_809171CC = gSaveContext.save.unk_EE4 & 0x7F;
+ if (gSaveContext.save.saveInfo.unk_EC0 & 0x7F) {
+ D_809171CC = gSaveContext.save.saveInfo.unk_EC0 & 0x7F;
} else {
D_809171CC = 40.0f;
}
- } else if (gSaveContext.save.unk_EE4 & 0x7F000000) {
- D_809171CC = (gSaveContext.save.unk_EE4 & 0x7F000000) >> 0x18;
+ } else if (gSaveContext.save.saveInfo.unk_EC0 & 0x7F000000) {
+ D_809171CC = (gSaveContext.save.saveInfo.unk_EC0 & 0x7F000000) >> 0x18;
} else {
D_809171CC = 45.0f;
}
- D_809171D1 = (gSaveContext.save.unk_EE4 & 0xFF0000) >> 0x10;
+ D_809171D1 = (gSaveContext.save.saveInfo.unk_EC0 & 0xFF0000) >> 0x10;
if ((D_809171D1 & 7) == 7) {
play->roomCtx.unk7A[0] = 90;
D_809171CA = 1;
@@ -1252,7 +1252,7 @@ void EnFishing_DrawEffects(FishingEffect* effect, PlayState* play) {
for (i = 30; i < EFFECT_COUNT; i++) {
if (effect->type == FS_EFF_RAIN_DROP) {
if (flag == 0) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 150, 255, 255, 30);
flag++;
@@ -1271,7 +1271,7 @@ void EnFishing_DrawEffects(FishingEffect* effect, PlayState* play) {
effect++;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
effect = firstEffect + 30;
flag = 0;
@@ -1325,9 +1325,9 @@ void EnFishing_DrawEffects(FishingEffect* effect, PlayState* play) {
effect = firstEffect;
if (effect->type == FS_EFF_OWNER_HAT) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
- Matrix_RotateYF((sEffOwnerHatRot.y * M_PI) / 32768, MTXMODE_APPLY);
- Matrix_RotateXFApply((sEffOwnerHatRot.x * M_PI) / 32768);
- Matrix_RotateZF((sEffOwnerHatRot.z * M_PI) / 32768, MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD_ALT2(sEffOwnerHatRot.y), MTXMODE_APPLY);
+ Matrix_RotateXFApply(BINANG_TO_RAD_ALT2(sEffOwnerHatRot.x));
+ Matrix_RotateZF(BINANG_TO_RAD_ALT2(sEffOwnerHatRot.z), MTXMODE_APPLY);
Matrix_Scale(effect->unk_30, effect->unk_30, effect->unk_30, MTXMODE_APPLY);
Matrix_Translate(-1250.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXFApply(M_PI / 2);
@@ -1659,7 +1659,7 @@ void EnFishing_UpdateSinkingLure(PlayState* play) {
}
if (D_8090CD14 == 5) {
- Matrix_RotateYF(player->actor.shape.rot.y * (M_PI / 32768), MTXMODE_NEW);
+ Matrix_RotateYF(BINANG_TO_RAD(player->actor.shape.rot.y), MTXMODE_NEW);
sp94.x = 5.0f;
sp94.y = 0.0f;
sp94.z = 3.0f;
@@ -1708,7 +1708,7 @@ void EnFishing_DrawSinkingLure(PlayState* play) {
EnFishing_UpdateSinkingLure(play);
if (sLurePos.y < WATER_SURFACE_Y(play)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFishingSinkingLureSegmentMaterialDL);
@@ -1725,7 +1725,7 @@ void EnFishing_DrawSinkingLure(PlayState* play) {
}
}
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gFishingSinkingLureSegmentMaterialDL);
@@ -1757,7 +1757,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
if (D_8090CD54 != 0) {
@@ -1772,7 +1772,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
sLurePos = sFishingHookedFish->fishMouthPos;
if ((D_8090CD14 == 5) && (D_80917206 == 2)) {
- Matrix_RotateYF(player->actor.shape.rot.y * (M_PI / 32768), MTXMODE_NEW);
+ Matrix_RotateYF(BINANG_TO_RAD(player->actor.shape.rot.y), MTXMODE_NEW);
posSrc.x = 2.0f;
posSrc.y = 0.0f;
posSrc.z = 0.0f;
@@ -1800,7 +1800,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
Matrix_RotateZF(M_PI / 2, MTXMODE_APPLY);
Matrix_RotateYF(M_PI / 2, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gFishingLureFloatDL);
@@ -1821,7 +1821,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
EnFishing_DrawLureHook(play, &hookPos[1], &sLureHookRefPos[1], 1);
}
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x14);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 55);
@@ -1838,9 +1838,9 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
dy = sLurePos.y - sRodTipPos.y;
dz = sLurePos.z - sRodTipPos.z;
- ry = func_80086B30(dx, dz);
+ ry = Math_FAtan2F(dx, dz);
dist = sqrtf(SQ(dx) + SQ(dz));
- rx = -func_80086B30(dy, dist);
+ rx = -Math_FAtan2F(dy, dist);
dist = sqrtf(SQ(dx) + SQ(dy) + SQ(dz)) * 0.001f;
@@ -1865,9 +1865,9 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
dy = D_80917218.y - (linePos + i)->y;
dz = D_80917218.z - (linePos + i)->z;
- ry = func_80086B30(dx, dz);
+ ry = Math_FAtan2F(dx, dz);
dist = sqrtf(SQ(dx) + SQ(dz));
- rx = -func_80086B30(dy, dist);
+ rx = -Math_FAtan2F(dy, dist);
dist = sqrtf(SQ(dx) + SQ(dy) + SQ(dz)) * 0.001f;
@@ -1893,7 +1893,7 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
}
Matrix_Pop();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -1949,25 +1949,25 @@ void EnFishing_DrawRod(PlayState* play) {
D_8090CD34 = 0.0f;
}
- spC8 = player->unk_B08[1];
- Math_SmoothStepToF(&player->unk_B08[1], input->rel.stick_y * 0.02f, 0.3f, 5.0f, 0.0f);
- spC8 = player->unk_B08[1] - spC8;
+ spC8 = player->unk_B0C;
+ Math_SmoothStepToF(&player->unk_B0C, input->rel.stick_y * 0.02f, 0.3f, 5.0f, 0.0f);
+ spC8 = player->unk_B0C - spC8;
- spC4 = player->unk_B08[0];
- Math_SmoothStepToF(&player->unk_B08[0], input->rel.stick_x * 0.02f, 0.3f, 5.0f, 0.0f);
- spC4 = player->unk_B08[0] - spC4;
+ spC4 = player->unk_B08;
+ Math_SmoothStepToF(&player->unk_B08, input->rel.stick_x * 0.02f, 0.3f, 5.0f, 0.0f);
+ spC4 = player->unk_B08 - spC4;
- if (player->unk_B08[0] > 1.0f) {
- player->unk_B08[0] = 1.0f;
+ if (player->unk_B08 > 1.0f) {
+ player->unk_B08 = 1.0f;
}
- if (player->unk_B08[1] > 1.0f) {
- player->unk_B08[1] = 1.0f;
+ if (player->unk_B0C > 1.0f) {
+ player->unk_B0C = 1.0f;
}
- if (player->unk_B08[0] < -1.0f) {
- player->unk_B08[0] = -1.0f;
+ if (player->unk_B08 < -1.0f) {
+ player->unk_B08 = -1.0f;
}
- if (player->unk_B08[1] < -1.0f) {
- player->unk_B08[1] = -1.0f;
+ if (player->unk_B0C < -1.0f) {
+ player->unk_B0C = -1.0f;
}
Math_ApproachF(&D_8090CD28, spC4 * 70.0f * -0.01f, 1.0f, D_8090CD30);
@@ -1976,8 +1976,8 @@ void EnFishing_DrawRod(PlayState* play) {
Math_ApproachF(&D_8090CD34, 1.0f, 1.0f, 0.1f);
Math_ApproachZeroF(&D_8090CD38, 1.0f, 0.05f);
} else {
- Math_ApproachZeroF(&player->unk_B08[1], 1.0f, 0.1f);
- Math_ApproachZeroF(&player->unk_B08[0], 1.0f, 0.1f);
+ Math_ApproachZeroF(&player->unk_B0C, 1.0f, 0.1f);
+ Math_ApproachZeroF(&player->unk_B08, 1.0f, 0.1f);
Math_ApproachF(&D_8090CD2C, (Math_SinS(D_809171FE * 3000) * 0.025f) + -0.03f, 1.0f, 0.05f);
Math_ApproachZeroF(&D_8090CD28, 1.0f, 0.05f);
@@ -1988,13 +1988,13 @@ void EnFishing_DrawRod(PlayState* play) {
}
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gFishingRodSetupDL);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 155, 0, 255);
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
if (sLinkAge != 1) {
Matrix_Translate(0.0f, 400.0f, 0.0f, MTXMODE_APPLY);
@@ -2009,11 +2009,11 @@ void EnFishing_DrawRod(PlayState* play) {
}
Matrix_RotateXFApply(-0.6283185f);
- Matrix_RotateZF((player->unk_B08[0] * 0.5f) + 0.4712389f, MTXMODE_APPLY);
+ Matrix_RotateZF((player->unk_B08 * 0.5f) + 0.4712389f, MTXMODE_APPLY);
Matrix_RotateXFApply((D_8090CD40 + 20.0f) * 0.01f * M_PI);
Matrix_Scale(0.70000005f, 0.70000005f, 0.70000005f, MTXMODE_APPLY);
- spC0 = (D_8090CD3C * (((player->unk_B08[1] - 1.0f) * -0.25f) + 0.5f)) + (D_8090CD2C + D_8090CD38);
+ spC0 = (D_8090CD3C * (((player->unk_B0C - 1.0f) * -0.25f) + 0.5f)) + (D_8090CD2C + D_8090CD38);
Matrix_Translate(0.0f, 0.0f, -1300.0f, MTXMODE_APPLY);
@@ -2230,7 +2230,8 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
Vec3f sp80 = this->actor.world.pos;
this->actor.prevPos = this->actor.world.pos = sLurePos;
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 30.0f, 0x43);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_40);
this->actor.world.pos = sp80;
if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
@@ -2444,7 +2445,7 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
sLureRot.x = 0.0f;
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
D_809101C0 += 6.0f;
- Audio_PlaySfxAtPos(&D_8090D614, NA_SE_PL_WALK_SAND);
+ Audio_PlaySfxAtPos(&D_8090D614, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_SAND);
}
} else {
if (D_809101C0 > 150.0f) {
@@ -2456,9 +2457,9 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
}
Math_ApproachZeroF(&D_809101B4, 1.0f, 0.3f);
- Math_ApproachS(&D_809101B8, (D_809101B0 * 32768.0f) / M_PI, 3, spDC);
+ Math_ApproachS(&D_809101B8, RAD_TO_BINANG_ALT2(D_809101B0), 3, spDC);
- sLureRot.y = (D_809101B8 / 32768.0f) * M_PI;
+ sLureRot.y = BINANG_TO_RAD_ALT(D_809101B8);
sp90.x = 0.0f;
sp90.y = 0.0f;
@@ -2494,7 +2495,8 @@ void EnFishing_UpdateLure(EnFishing* this, PlayState* play) {
sp58 = this->actor.world.pos;
this->actor.prevPos = this->actor.world.pos = sLurePos;
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 30.0f, 0x44);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
this->actor.world.pos = sp58;
D_80917278.y += -0.5f;
@@ -2713,7 +2715,7 @@ void func_809038A4(EnFishing* this, Input* input) {
sp24 = SQ(sp34.x) + SQ(sp34.y) + SQ(sp34.z);
if ((D_8090CD14 == 3) && (this->unk_19A == 0) && (D_8090CD0C == 0)) {
- Matrix_RotateYF((-this->actor.shape.rot.y / 32768.0f) * M_PI, MTXMODE_NEW);
+ Matrix_RotateYF(BINANG_TO_RAD_ALT(-this->actor.shape.rot.y), MTXMODE_NEW);
Matrix_MultVec3f(&sp34, &sp28);
if ((sp28.z > 0.0f) || (this->unk_1A4 < 40.0f)) {
@@ -2793,8 +2795,8 @@ void func_80903C60(EnFishing* this, u8 arg1) {
void EnFishing_HandleAquariumDialog(EnFishing* this, PlayState* play) {
if (sLinkAge == 1) {
- if (gSaveContext.save.unk_EE4 & 0x7F) {
- if (gSaveContext.save.unk_EE4 & 0x80) {
+ if (gSaveContext.save.saveInfo.unk_EC0 & 0x7F) {
+ if (gSaveContext.save.saveInfo.unk_EC0 & 0x80) {
this->actor.textId = 0x40B1;
} else {
this->actor.textId = 0x4089;
@@ -2802,8 +2804,8 @@ void EnFishing_HandleAquariumDialog(EnFishing* this, PlayState* play) {
} else {
this->actor.textId = 0x40AE;
}
- } else if (gSaveContext.save.unk_EE4 & 0x7F000000) {
- if (gSaveContext.save.unk_EE4 & 0x80000000) {
+ } else if (gSaveContext.save.saveInfo.unk_EC0 & 0x7F000000) {
+ if (gSaveContext.save.saveInfo.unk_EC0 & 0x80000000) {
this->actor.textId = 0x40B1;
} else {
this->actor.textId = 0x4089;
@@ -3001,9 +3003,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->actor.shape.rot.y = -0x8000;
if ((this->actor.projectedPos.z < 200.0f) && (this->actor.projectedPos.z > 0.0f)) {
- spC4.x = randPlusMinusPoint5Scaled(5.0f) + 130.0f;
+ spC4.x = Rand_CenteredFloat(5.0f) + 130.0f;
spC4.y = 40.0f;
- spC4.z = randPlusMinusPoint5Scaled(5.0f) + 1280.0f;
+ spC4.z = Rand_CenteredFloat(5.0f) + 1280.0f;
EnFishing_SpawnBubble(NULL, play->specialEffects, &spC4, Rand_ZeroFloat(0.02f) + 0.03f, 1);
}
@@ -3078,9 +3080,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
} else {
this->unk_150 = 1;
this->unk_172[0] = Rand_ZeroFloat(30.0f) + 10.0f;
- this->unk_1AC.x = randPlusMinusPoint5Scaled(300.0f);
+ this->unk_1AC.x = Rand_CenteredFloat(300.0f);
this->unk_1AC.y = (WATER_SURFACE_Y(play) - 50.0f) - Rand_ZeroFloat(50.0f);
- this->unk_1AC.z = randPlusMinusPoint5Scaled(300.0f);
+ this->unk_1AC.z = Rand_CenteredFloat(300.0f);
this->unk_188 = 1.0f;
this->unk_18C = 2000.0f;
}
@@ -3142,8 +3144,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Math_ApproachF(&this->unk_1A8, 4096.0f, 1.0f, 256.0f);
if ((play->gameplayFrames % 32) == 0) {
- this->unk_1AC.x = randPlusMinusPoint5Scaled(600.0f);
- this->unk_1AC.z = randPlusMinusPoint5Scaled(600.0f);
+ this->unk_1AC.x = Rand_CenteredFloat(600.0f);
+ this->unk_1AC.z = Rand_CenteredFloat(600.0f);
this->unk_1AC.y = -120.0f;
}
} else if (sp124 > 50.0f) {
@@ -3598,8 +3600,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
for (spA2 = 0; spA2 < 100; spA2++) {
- Matrix_RotateYF(randPlusMinusPoint5Scaled(2.3561945f) +
- (((this->actor.yawTowardsPlayer + 0x8000) / 32768.0f) * M_PI),
+ Matrix_RotateYF(Rand_CenteredFloat(0.75f * M_PI) +
+ BINANG_TO_RAD_ALT(this->actor.yawTowardsPlayer + 0x8000),
MTXMODE_NEW);
Matrix_MultVec3f(&sp10C, &sp100);
@@ -3743,8 +3745,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((D_80917272 == 0) && (D_80917274 == 0)) {
// Assignment of OoT's D_80B7E086 here removed in MM
- if (((sLinkAge == 1) && (gSaveContext.save.unk_EE4 & 0x400)) ||
- ((sLinkAge != 1) && (gSaveContext.save.unk_EE4 & 0x800))) {
+ if (((sLinkAge == 1) && (gSaveContext.save.saveInfo.unk_EC0 & 0x400)) ||
+ ((sLinkAge != 1) && (gSaveContext.save.saveInfo.unk_EC0 & 0x800))) {
// Assignment of OoT's D_80B7A67C here removed in MM, this is now an empty branch
}
} else {
@@ -3774,7 +3776,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
player->unk_B28 = 3;
Rumble_Override(0.0f, 1, 3, 1);
D_809171D8++;
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
D_8090CD4C = 100;
D_80911F48 = 45.0f;
D_8090CD14 = 5;
@@ -3803,7 +3805,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
sp10C.y = 10.0f;
sp10C.z = 50.0f;
}
- Matrix_RotateYF((player->actor.shape.rot.y / 32768.0f) * M_PI, MTXMODE_NEW);
+ Matrix_RotateYF(BINANG_TO_RAD_ALT(player->actor.shape.rot.y), MTXMODE_NEW);
Matrix_MultVec3f(&sp10C, &sSubCamEye);
sSubCamEye.x += player->actor.world.pos.x;
@@ -4065,7 +4067,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
func_80903C60(this, 1);
this->unk_17C = this->actor.velocity.y;
this->actor.velocity.y = 0.0f;
- this->unk_162 = randPlusMinusPoint5Scaled(32768.0f);
+ this->unk_162 = (s16)(s32)Rand_CenteredFloat(0x8000);
} else if ((this->actor.world.pos.y < WATER_SURFACE_Y(play)) &&
(this->actor.prevPos.y >= WATER_SURFACE_Y(play))) {
if (this->unk_17C < -5.0f) {
@@ -4096,7 +4098,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->actor.prevPos.y -= spD8;
this->actor.velocity.y = -1.0f;
if (KREG(90) == 0) { // Check added in MM
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 100.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 30.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
}
this->actor.world.pos.y += spD8;
this->actor.prevPos.y += spD8;
@@ -4125,10 +4128,10 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if (Rand_ZeroOne() < 0.5f) {
this->unk_15E = 0;
} else {
- this->unk_15E = (s16)randPlusMinusPoint5Scaled(32.0f) + 0x8000;
+ this->unk_15E = (s16)(s32)Rand_CenteredFloat(0x20) + 0x8000;
}
- this->unk_160 = (s16)randPlusMinusPoint5Scaled(16384.0f);
+ this->unk_160 = (s16)(s32)Rand_CenteredFloat(0x4000);
this->unk_188 = 1.0f;
this->unk_18C = 5000.0f;
this->unk_194 = 5000.0f;
@@ -4138,8 +4141,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((this->unk_150 == 5) && !(this->unk_154 & 1)) {
Vec3f pos;
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat(10.0f) + this->actor.world.pos.z;
pos.y = this->actor.floorHeight + 5.0f;
EnFishing_SpawnWaterDust(&this->actor.projectedPos, play->specialEffects, &pos,
(this->unk_1A4 * 0.005f) + 0.15f);
@@ -4157,9 +4160,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_1CA--;
for (i = 0; i < 2; i++) {
- pos.x = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.x;
- pos.y = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.y;
- pos.z = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(range) + this->actor.world.pos.x;
+ pos.y = Rand_CenteredFloat(range) + this->actor.world.pos.y;
+ pos.z = Rand_CenteredFloat(range) + this->actor.world.pos.z;
EnFishing_SpawnBubble(&this->actor.projectedPos, play->specialEffects, &pos, Rand_ZeroFloat(0.035f) + 0.04f,
0);
}
@@ -4222,23 +4225,23 @@ void EnFishing_LoachPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
void EnFishing_DrawFish(Actor* thisx, PlayState* play) {
EnFishing* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
- Matrix_RotateYF(((this->unk_15A + this->actor.shape.rot.y) / 32768.0f) * M_PI, MTXMODE_APPLY);
- Matrix_RotateXFApply(((this->unk_158 + this->actor.shape.rot.x) / 32768.0f) * M_PI);
- Matrix_RotateZF(((this->unk_15C + this->actor.shape.rot.z) / 32768.0f) * M_PI, MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD_ALT(this->unk_15A + this->actor.shape.rot.y), MTXMODE_APPLY);
+ Matrix_RotateXFApply(BINANG_TO_RAD_ALT(this->unk_158 + this->actor.shape.rot.x));
+ Matrix_RotateZF(BINANG_TO_RAD_ALT(this->unk_15C + this->actor.shape.rot.z), MTXMODE_APPLY);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
if (this->unk_148 == 0) {
- Matrix_RotateYF((this->unk_164 * (M_PI / 32768)) - (M_PI / 2), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(this->unk_164) - (M_PI / 2), MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, this->unk_164 * 10.0f * 0.01f, MTXMODE_APPLY);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnFishing_FishOverrideLimbDraw, EnFishing_FishPostLimbDraw, &this->actor);
} else {
Matrix_Translate(0.0f, 0.0f, 3000.0f, MTXMODE_APPLY);
- Matrix_RotateYF(this->unk_164 * (M_PI / 32768), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(this->unk_164), MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, -3000.0f, MTXMODE_APPLY);
Matrix_RotateYF(-(M_PI / 2), MTXMODE_APPLY);
@@ -4408,7 +4411,7 @@ void EnFishing_DrawPondProps(PlayState* play) {
if (prop->shouldDraw) {
Matrix_Translate(prop->pos.x, prop->pos.y, prop->pos.z, MTXMODE_NEW);
Matrix_Scale(prop->scale, 1.0f, prop->scale, MTXMODE_APPLY);
- Matrix_RotateYF(prop->lilyPadAngle * (M_PI / 32768), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(prop->lilyPadAngle), MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, 20.0f, MTXMODE_APPLY);
Matrix_RotateYF(prop->rotY, MTXMODE_APPLY);
@@ -4565,14 +4568,14 @@ void EnFishing_UpdateGroupFishes(PlayState* play) {
spD6 = Math_Atan2S_XY(dist, dy);
if ((dist < 10.0f) || (((fish->timer % 32) == 0) && (Rand_ZeroOne() > 0.5f))) {
- fish->unk_10.y = basePos[groupIndex].y + randPlusMinusPoint5Scaled(10.0f);
+ fish->unk_10.y = basePos[groupIndex].y + Rand_CenteredFloat(10.0f);
if (D_8090CF18 != 0) {
- fish->unk_10.x = basePos[groupIndex].x + randPlusMinusPoint5Scaled(200.0f);
- fish->unk_10.z = basePos[groupIndex].z + randPlusMinusPoint5Scaled(200.0f);
+ fish->unk_10.x = basePos[groupIndex].x + Rand_CenteredFloat(200.0f);
+ fish->unk_10.z = basePos[groupIndex].z + Rand_CenteredFloat(200.0f);
} else {
- fish->unk_10.x = basePos[groupIndex].x + randPlusMinusPoint5Scaled(100.0f);
- fish->unk_10.z = basePos[groupIndex].z + randPlusMinusPoint5Scaled(100.0f);
+ fish->unk_10.x = basePos[groupIndex].x + Rand_CenteredFloat(100.0f);
+ fish->unk_10.z = basePos[groupIndex].z + Rand_CenteredFloat(100.0f);
}
ripplePos = fish->pos;
@@ -4660,8 +4663,8 @@ void EnFishing_DrawGroupFishes(PlayState* play) {
if (fish->shouldDraw) {
Matrix_Translate(fish->pos.x, fish->pos.y, fish->pos.z, MTXMODE_NEW);
- Matrix_RotateYF(((f32)fish->unk_3E * M_PI) / 32768.0f, MTXMODE_APPLY);
- Matrix_RotateXFApply((-(f32)fish->unk_3C * M_PI) / 32768.0f);
+ Matrix_RotateYF(BINANG_TO_RAD_ALT2(fish->unk_3E), MTXMODE_APPLY);
+ Matrix_RotateXFApply(BINANG_TO_RAD_ALT2(-(f32)fish->unk_3C));
Matrix_Scale(fish->unk_2C * scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
@@ -4682,7 +4685,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
case 0:
if (D_809171FC == 0) {
if (sLinkAge != 1) {
- if ((gSaveContext.save.unk_EE4 & 0x100) && !(gSaveContext.save.unk_EE4 & 0x200)) {
+ if ((gSaveContext.save.saveInfo.unk_EC0 & 0x100) && !(gSaveContext.save.saveInfo.unk_EC0 & 0x200)) {
this->actor.textId = 0x4093;
} else {
this->actor.textId = 0x407B;
@@ -4700,9 +4703,9 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
if (D_809171FC == 0) {
this->unk_154 = 1;
if (sLinkAge != 1) {
- gSaveContext.save.unk_EE4 |= 0x200;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x200;
} else {
- gSaveContext.save.unk_EE4 |= 0x100;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x100;
}
} else {
this->unk_154 = 10;
@@ -4718,7 +4721,7 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees >= 20) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 20) {
Rupees_ChangeBy(-20);
if (!Rumble_ControllerOneHasRumblePak()) {
this->actor.textId = 0x407C;
@@ -4785,8 +4788,8 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
D_8090CD04 = 20;
this->unk_154 = 0;
- if ((gSaveContext.save.unk_EE4 & 0xFF0000) < 0xFF0000) {
- gSaveContext.save.unk_EE4 += 0x10000;
+ if ((gSaveContext.save.saveInfo.unk_EC0 & 0xFF0000) < 0xFF0000) {
+ gSaveContext.save.saveInfo.unk_EC0 += 0x10000;
}
}
break;
@@ -4895,29 +4898,29 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
if (sLinkAge == 1) {
f32 temp;
- gSaveContext.save.unk_EE4 &= 0xFFFFFF00;
- gSaveContext.save.unk_EE4 |= ((s16)D_809171CC & 0x7F);
- temp = (gSaveContext.save.unk_EE4 & 0x7F000000) >> 0x18;
+ gSaveContext.save.saveInfo.unk_EC0 &= 0xFFFFFF00;
+ gSaveContext.save.saveInfo.unk_EC0 |= ((s16)D_809171CC & 0x7F);
+ temp = (gSaveContext.save.saveInfo.unk_EC0 & 0x7F000000) >> 0x18;
if (temp < D_809171CC) {
- gSaveContext.save.unk_EE4 &= 0xFFFFFF;
- gSaveContext.save.unk_EE4 |= ((s16)D_809171CC & 0x7F) << 0x18;
+ gSaveContext.save.saveInfo.unk_EC0 &= 0xFFFFFF;
+ gSaveContext.save.saveInfo.unk_EC0 |= ((s16)D_809171CC & 0x7F) << 0x18;
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80000000;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x80000000;
}
}
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x80;
this->unk_154 = 0;
break;
}
} else {
- gSaveContext.save.unk_EE4 &= 0xFFFFFF;
- gSaveContext.save.unk_EE4 |= ((s16)D_809171CC & 0x7F) << 0x18;
+ gSaveContext.save.saveInfo.unk_EC0 &= 0xFFFFFF;
+ gSaveContext.save.saveInfo.unk_EC0 |= ((s16)D_809171CC & 0x7F) << 0x18;
if (D_809171D2 == 2) {
- gSaveContext.save.unk_EE4 |= 0x80000000;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x80000000;
this->unk_154 = 0;
break;
}
@@ -4934,14 +4937,14 @@ void EnFishing_HandleOwnerDialog(EnFishing* this, PlayState* play) {
}
if (sLinkAge == 1) {
- if ((D_809171CC >= 50.0f) && !(gSaveContext.save.unk_EE4 & 0x400)) {
- gSaveContext.save.unk_EE4 |= 0x400;
+ if ((D_809171CC >= 50.0f) && !(gSaveContext.save.saveInfo.unk_EC0 & 0x400)) {
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x400;
getItemId = GI_HEART_PIECE;
sSinkingLureLocation = Rand_ZeroFloat(3.999f) + 1.0f;
}
} else {
- if ((D_809171CC >= 60.0f) && !(gSaveContext.save.unk_EE4 & 0x800)) {
- gSaveContext.save.unk_EE4 |= 0x800;
+ if ((D_809171CC >= 60.0f) && !(gSaveContext.save.saveInfo.unk_EC0 & 0x800)) {
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x800;
getItemId = GI_SKULL_TOKEN;
sSinkingLureLocation = Rand_ZeroFloat(3.999f) + 1.0f;
}
@@ -5104,9 +5107,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
}
if (D_8090CD08 == 0) {
- gSaveContext.save.unk_EE4 |= 0x1000;
+ gSaveContext.save.saveInfo.unk_EC0 |= 0x1000;
} else if (D_8090CD08 == 1) {
- gSaveContext.save.unk_EE4 &= ~0x1000;
+ gSaveContext.save.saveInfo.unk_EC0 &= ~0x1000;
}
if (D_8090CCFC != 0) {
@@ -5275,7 +5278,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
mainCam->at = sSubCamAt;
}
func_80169AFC(play, sSubCamId, 0);
- Cutscene_End(play, &play->csCtx);
+ Cutscene_StopManual(play, &play->csCtx);
D_8090CD4C = 0;
sSubCamId = SUB_CAM_ID_DONE;
func_800F6834(play, 0);
@@ -5285,7 +5288,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
break;
case 10:
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
sSubCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, sSubCamId, CAM_STATUS_ACTIVE);
@@ -5315,8 +5318,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
mainCam->at = sSubCamAt;
func_80169AFC(play, sSubCamId, 0);
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
D_8090CD4C = 0;
sSubCamId = SUB_CAM_ID_DONE;
D_8090CD50 = 30;
@@ -5326,7 +5329,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
break;
case 20:
- Cutscene_Start(play, &play->csCtx);
+ Cutscene_StartManual(play, &play->csCtx);
sSubCamId = Play_CreateSubCamera(play);
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT);
Play_ChangeCameraStatus(play, sSubCamId, CAM_STATUS_ACTIVE);
@@ -5416,9 +5419,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
mainCam->eyeNext = sSubCamEye;
mainCam->at = sSubCamAt;
func_80169AFC(play, sSubCamId, 0);
- Cutscene_End(play, &play->csCtx);
- func_800B7298(play, &this->actor,
- PLAYER_CSMODE_6); // arg2 changed from PLAYER_CSMODE_7 to PLAYER_CSMODE_6 in MM
+ Cutscene_StopManual(play, &play->csCtx);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
D_8090CD4C = 0;
sSubCamId = SUB_CAM_ID_DONE;
player->unk_B28 = -5;
@@ -5458,8 +5460,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
((play->gameplayFrames % 2) == 0)) {
Vec3f pos;
- pos.x = randPlusMinusPoint5Scaled(20.0f) + player->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled(20.0f) + player->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(20.0f) + player->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat(20.0f) + player->actor.world.pos.z;
pos.y = player->actor.floorHeight + 5.0f;
EnFishing_SpawnWaterDust(NULL, play->specialEffects, &pos, 0.5f);
}
@@ -5550,9 +5552,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
rot.z = (Camera_GetInputDirYaw(mainCam) * -(M_PI / 0x8000)) + rot.y;
for (i = 0; i < (u8)D_8090CCD0; i++) {
- pos.x = randPlusMinusPoint5Scaled(700.0f) + play->view.eye.x;
+ pos.x = Rand_CenteredFloat(700.0f) + play->view.eye.x;
pos.y = (Rand_ZeroFloat(100.0f) + 150.0f) - 170.0f;
- pos.z = randPlusMinusPoint5Scaled(700.0f) + play->view.eye.z;
+ pos.z = Rand_CenteredFloat(700.0f) + play->view.eye.z;
if (pos.z < 1160.0f) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &pos, &projectedPos, &sProjectedW);
@@ -5616,8 +5618,8 @@ void EnFishing_DrawOwner(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->actor.projectedPos.z < 1500.0f) &&
(fabsf(this->actor.projectedPos.x) < (100.0f + this->actor.projectedPos.z))) {
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 c99a1680c..3cf6385e0 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -176,7 +176,7 @@ void EnFloormas_Init(Actor* thisx, PlayState* play2) {
this->actor.parent = Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, ACTOR_EN_FLOORMAS, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, 0, 0, params + 0x10, -1, this->actor.halfDaysBits, NULL);
+ this->actor.world.pos.z, 0, 0, 0, params + 0x10, CS_ID_NONE, this->actor.halfDaysBits, NULL);
if (this->actor.parent == NULL) {
Actor_Kill(&this->actor);
return;
@@ -184,7 +184,7 @@ void EnFloormas_Init(Actor* thisx, PlayState* play2) {
this->actor.child = Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_FLOORMAS, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0,
- params + 0x10, -1, this->actor.halfDaysBits, NULL);
+ params + 0x10, CS_ID_NONE, this->actor.halfDaysBits, NULL);
if (this->actor.child == NULL) {
Actor_Kill(this->actor.parent);
Actor_Kill(&this->actor);
@@ -1104,7 +1104,9 @@ void EnFloormas_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, this->actor.scale.x * 3000.0f, 0.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, this->actor.scale.x * 3000.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
if (this->actionFunc == func_808D1650) {
this->actor.flags |= ACTOR_FLAG_1000000;
@@ -1186,7 +1188,7 @@ void EnFloormas_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->collider.base.colType == COLTYPE_HARD) {
func_800AE2A0(play, &D_808D3958, this->unk_190 % 40, 40);
}
@@ -1211,7 +1213,7 @@ void func_808D3754(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->collider.base.colType == COLTYPE_HARD) {
func_800AE5E4(play, &D_808D3958, this->unk_190 % 40, 40);
}
diff --git a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
index 002f9e67c..628cad4f6 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
@@ -11,12 +11,12 @@ typedef void (*EnFloormasActionFunc)(struct EnFloormas*, PlayState*);
#define ENFLOORMAS_GET_7FFF(thisx) ((thisx)->params & 0x7FFF)
#define ENFLOORMAS_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
+typedef enum {
/* 0x00 */ ENFLOORMAS_GET_7FFF_0,
/* 0x10 */ ENFLOORMAS_GET_7FFF_10 = 0x10,
/* 0x20 */ ENFLOORMAS_GET_7FFF_20 = 0x20,
- /* 0x40 */ ENFLOORMAS_GET_7FFF_40 = 0x40,
-};
+ /* 0x40 */ ENFLOORMAS_GET_7FFF_40 = 0x40
+} EnFloormasParam;
typedef struct EnFloormas {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
index c9844abb6..89bf08d7b 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -126,7 +126,7 @@ static Vec3f sShopItemPositions[3] = {
s32 EnFsn_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -138,13 +138,17 @@ u16 EnFsn_GetWelcome(PlayState* play) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_NONE:
return 0x29CC;
+
case PLAYER_MASK_DEKU:
return 0x29FC;
+
case PLAYER_MASK_GORON:
case PLAYER_MASK_ZORA:
return 0x29FD;
+
case PLAYER_MASK_KAFEIS_MASK:
return 0x2364;
+
default:
return 0x29FE;
}
@@ -153,64 +157,72 @@ u16 EnFsn_GetWelcome(PlayState* play) {
void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
switch (this->textId) {
case 0:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_10)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL)) {
this->textId = 0x29E0;
break;
} else {
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
- break;
}
+ break;
+
case 0x29E0:
if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_LETTER_TO_MAMA;
this->getItemId = GI_LETTER_TO_MAMA;
- SET_WEEKEVENTREG(WEEKEVENTREG_80_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL);
this->textId = 0x29F1;
break;
} else {
this->textId = 0x29E1;
- break;
}
+ break;
+
case 0x29E1:
this->textId = 0x29E2;
break;
+
case 0x29E2:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_KEATONS_MASK;
this->getItemId = GI_MASK_KEATON;
this->textId = 0x29E3;
break;
+
case 0x29E3:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_LETTER_TO_MAMA;
this->getItemId = GI_LETTER_TO_MAMA;
- SET_WEEKEVENTREG(WEEKEVENTREG_80_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL);
this->textId = 0x29F1;
break;
+
case 0x29F1:
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->textId, &this->actor);
if (this->flags & ENFSN_END_CONVERSATION) {
if (this->flags & ENFSN_GAVE_LETTER_TO_MAMA) {
this->flags &= ~ENFSN_GAVE_LETTER_TO_MAMA;
- func_80151BB4(play, 34);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL);
}
if (this->flags & ENFSN_GAVE_KEATONS_MASK) {
this->flags &= ~ENFSN_GAVE_KEATONS_MASK;
- func_80151BB4(play, 33);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK);
}
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
}
}
void EnFsn_HandleSetupResumeInteraction(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play) &&
- this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
+ (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED)) {
Actor_ProcessTalkRequest(&this->actor, &play->state);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
if (ENFSN_IS_SHOP(&this->actor)) {
@@ -228,21 +240,21 @@ void EnFsn_UpdateCollider(EnFsn* this, PlayState* play) {
}
void EnFsn_HandleLookToShopkeeperBuyingCutscene(EnFsn* this) {
- if ((this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) &&
- (this->lookToShopkeeperBuyingCutscene != this->cutscene) && (this->actor.textId == 0x29CE)) {
- ActorCutscene_Stop(this->cutscene);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if ((this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) && (this->lookToShopkeeperBuyingCsId != this->csId) &&
+ (this->actor.textId == 0x29CE)) {
+ CutsceneManager_Stop(this->csId);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperBuyingCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperBuyingCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENFSN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -301,7 +313,7 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
}
s16 EnFsn_GetThirdDayItemId(void) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && CURRENT_DAY == 3) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && (CURRENT_DAY == 3)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
return SI_BOMB_BAG_30_1;
}
@@ -314,16 +326,22 @@ s16 EnFsn_GetStolenItemId(u32 stolenItem) {
switch (stolenItem) {
case ITEM_BOTTLE:
return SI_BOTTLE;
+
case ITEM_SWORD_GREAT_FAIRY:
return SI_SWORD_GREAT_FAIRY;
+
case ITEM_SWORD_KOKIRI:
return SI_SWORD_KOKIRI;
+
case ITEM_SWORD_RAZOR:
return SI_SWORD_RAZOR;
+
case ITEM_SWORD_GILDED:
return SI_SWORD_GILDED;
+
+ default:
+ return SI_NONE;
}
- return SI_NONE;
}
s32 EnFsn_HasItemsToSell(void) {
@@ -387,7 +405,7 @@ void EnFsn_SpawnShopItems(EnFsn* this, PlayState* play) {
void EnFsn_EndInteraction(EnFsn* this, PlayState* play) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_STOPPED;
}
Actor_ProcessTalkRequest(&this->actor, &play->state);
@@ -407,7 +425,7 @@ s32 EnFsn_TestEndInteraction(EnFsn* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
return true;
}
@@ -450,15 +468,18 @@ s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
return true;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
return true;
+
+ default:
+ return false;
}
- return false;
}
s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, PlayState* play, Input* input) {
@@ -487,10 +508,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -503,10 +524,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -737,11 +758,11 @@ void EnFsn_Idle(EnFsn* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_WAITING;
}
this->actor.textId = EnFsn_GetWelcome(play);
@@ -765,7 +786,7 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
this->animIndex = FSN_ANIM_SLAM_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
} else {
- if (this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP && Animation_OnFrame(&this->skelAnime, 18.0f)) {
+ if ((this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP) && Animation_OnFrame(&this->skelAnime, 18.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
if (this->flags & ENFSN_CALM_DOWN) {
@@ -797,8 +818,8 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
void EnFsn_BeginInteraction(EnFsn* this, PlayState* play) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
if (Player_GetMask(play) == PLAYER_MASK_NONE) {
func_8011552C(play, DO_ACTION_NEXT);
@@ -812,7 +833,7 @@ void EnFsn_BeginInteraction(EnFsn* this, PlayState* play) {
this->actionFunc = EnFsn_SetupEndInteractionImmediately;
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -828,20 +849,26 @@ void EnFsn_StartBuying(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29CD;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CD:
this->actor.textId = 0x29CE;
EnFsn_HandleLookToShopkeeperBuyingCutscene(this);
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CE:
this->actor.textId = 0xFF;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 0x29CF:
player->exchangeItemId = PLAYER_IA_NONE;
this->actionFunc = EnFsn_SetupDeterminePrice;
break;
+
+ default:
+ break;
}
}
}
@@ -860,6 +887,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
this->actor.textId = 0x2A01;
@@ -870,6 +898,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D3:
case 0x29D4:
case 0x29FA:
@@ -877,6 +906,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29D5;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
+ default:
+ break;
}
}
} else if (talkState == TEXT_STATE_CHOICE) {
@@ -892,6 +924,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
break;
+
case 1:
func_8019F208();
this->isSelling = false;
@@ -900,6 +933,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
+ default:
+ break;
}
}
}
@@ -941,7 +977,7 @@ void EnFsn_DeterminePrice(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29D1;
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
}
}
@@ -958,28 +994,36 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_STOPPED;
}
switch (this->price) {
case 5:
this->getItemId = GI_RUPEE_BLUE;
break;
+
case 10:
this->getItemId = GI_RUPEE_10;
break;
+
case 20:
this->getItemId = GI_RUPEE_RED;
break;
+
case 50:
this->getItemId = GI_RUPEE_PURPLE;
break;
+
case 200:
this->getItemId = GI_RUPEE_HUGE;
break;
+
+ default:
+ break;
}
this->actionFunc = EnFsn_GiveItem;
break;
+
case 1:
func_8019F230();
player->exchangeItemId = PLAYER_IA_NONE;
@@ -992,12 +1036,12 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
if ((this->isSelling == true) && (this->items[this->cursorIndex]->getItemId == GI_MASK_ALL_NIGHT)) {
- func_80151BB4(play, 45);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
}
this->actor.parent = NULL;
if (ENFSN_IS_SHOP(&this->actor) && !this->isSelling) {
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
}
this->actionFunc = EnFsn_SetupResumeInteraction;
} else if (this->isSelling == true) {
@@ -1009,7 +1053,7 @@ void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
void EnFsn_SetupResumeInteraction(EnFsn* this, PlayState* play) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_HandleSetupResumeInteraction(this, play);
}
} else {
@@ -1021,17 +1065,17 @@ void EnFsn_ResumeInteraction(EnFsn* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (ENFSN_IS_SHOP(&this->actor)) {
if (!this->isSelling) {
- this->cutscene = this->lookToShopkeeperBuyingCutscene;
+ this->csId = this->lookToShopkeeperBuyingCsId;
this->actor.textId = 0x29D0;
} else {
- this->cutscene = this->lookToShopkeeperCutscene;
+ this->csId = this->lookToShopkeeperCsId;
this->actor.textId = (this->numSellingItems <= 0) ? 0x29DE : 0x29D6;
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = EnFsn_ResumeShoppingInteraction;
} else {
EnFsn_HandleConversationBackroom(this, play);
@@ -1044,8 +1088,8 @@ void EnFsn_ResumeInteraction(EnFsn* this, PlayState* play) {
void EnFsn_ResumeShoppingInteraction(EnFsn* this, PlayState* play) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
if (!this->isSelling) {
this->actionFunc = EnFsn_AskCanBuyMore;
@@ -1058,33 +1102,33 @@ void EnFsn_ResumeShoppingInteraction(EnFsn* this, PlayState* play) {
this->actionFunc = EnFsn_FaceShopkeeperSelling;
}
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = !this->isSelling ? this->lookToShopkeeperBuyingCutscene : this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = !this->isSelling ? this->lookToShopkeeperBuyingCsId : this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
}
void EnFsn_LookToShelf(EnFsn* this, PlayState* play) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ CutsceneManager_Stop(this->csId);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENFSN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene) != 0) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
EnFsn_UpdateCursorPos(this, play);
this->actionFunc = EnFsn_BrowseShelf;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1117,16 +1161,16 @@ void EnFsn_BrowseShelf(EnFsn* this, PlayState* play) {
void EnFsn_LookToShopkeeperFromShelf(EnFsn* this, PlayState* play) {
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ CutsceneManager_Stop(this->csId);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperFromShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperFromShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENFSN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
@@ -1134,7 +1178,7 @@ void EnFsn_LookToShopkeeperFromShelf(EnFsn* this, PlayState* play) {
Message_ContinueTextbox(play, this->actor.textId);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1146,9 +1190,10 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
SET_WEEKEVENTREG(WEEKEVENTREG_33_04);
+ // fallthrough
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENFSN_CUTSCENESTATE_STOPPED;
}
func_8019F208();
@@ -1171,16 +1216,21 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
this->itemIds[this->cursorIndex] = -1;
this->actionFunc = EnFsn_GiveItem;
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29F0);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29DD);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
+ default:
+ break;
}
}
@@ -1189,7 +1239,7 @@ void EnFsn_SetupEndInteraction(EnFsn* this, PlayState* play) {
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1211,10 +1261,15 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
case 0:
EnFsn_HandleCanPlayerBuyItem(this, play);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ break;
+
+ default:
+ break;
}
}
}
@@ -1231,15 +1286,15 @@ void EnFsn_AskCanBuyMore(EnFsn* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
if (talkState == TEXT_STATE_CHOICE) {
@@ -1251,17 +1306,21 @@ void EnFsn_AskCanBuyMore(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
+ break;
+
+ default:
break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1277,15 +1336,15 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENFSN_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
if (talkState == TEXT_STATE_CHOICE) {
@@ -1298,17 +1357,21 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
+ break;
+
+ default:
break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1341,6 +1404,7 @@ void EnFsn_FaceShopkeeperSelling(EnFsn* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.textId = 0x29D6;
Message_StartTextbox(play, this->actor.textId, &this->actor);
+ //! FAKE:
if (play) {}
}
}
@@ -1380,10 +1444,10 @@ void EnFsn_ConverseBackroom(EnFsn* this, PlayState* play) {
}
void EnFsn_GetCutscenes(EnFsn* this) {
- this->lookToShopkeeperCutscene = this->actor.cutscene;
- this->lookToShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperCutscene);
- this->lookToShopkeeperFromShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShelfCutscene);
- this->lookToShopkeeperBuyingCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperFromShelfCutscene);
+ this->lookToShopkeeperCsId = this->actor.csId;
+ this->lookToShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookToShopkeeperCsId);
+ this->lookToShopkeeperFromShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookToShelfCsId);
+ this->lookToShopkeeperBuyingCsId = CutsceneManager_GetAdditionalCsId(this->lookToShopkeeperFromShelfCsId);
}
void EnFsn_Blink(EnFsn* this) {
@@ -1470,7 +1534,7 @@ void EnFsn_DrawCursor(EnFsn* this, PlayState* play, f32 x, f32 y, f32 z, u8 draw
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1527,7 +1591,7 @@ void EnFsn_DrawStickDirectionPrompts(EnFsn* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1576,12 +1640,15 @@ s32 EnFsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
case FSN_LIMB_TORSO:
limbRotTableIdx = 0;
break;
+
case FSN_LIMB_LEFT_HAND:
limbRotTableIdx = 1;
break;
+
case FSN_LIMB_HEAD:
limbRotTableIdx = 2;
break;
+
default:
limbRotTableIdx = 9;
break;
@@ -1622,7 +1689,7 @@ void EnFsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
index 35b654c3d..f214dcbd9 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h
@@ -33,11 +33,11 @@ typedef struct EnFsn {
/* 0x364 */ s16 eyeTexIndex;
/* 0x366 */ s16 blinkTimer;
/* 0x368 */ s16 cutsceneState;
- /* 0x36A */ s16 cutscene;
- /* 0x36C */ s16 lookToShopkeeperCutscene;
- /* 0x36E */ s16 lookToShelfCutscene;
- /* 0x370 */ s16 lookToShopkeeperFromShelfCutscene;
- /* 0x372 */ s16 lookToShopkeeperBuyingCutscene;
+ /* 0x36A */ s16 csId;
+ /* 0x36C */ s16 lookToShopkeeperCsId;
+ /* 0x36E */ s16 lookToShelfCsId;
+ /* 0x370 */ s16 lookToShopkeeperFromShelfCsId;
+ /* 0x372 */ s16 lookToShopkeeperBuyingCsId;
/* 0x374 */ s16 price;
/* 0x376 */ u16 textId;
/* 0x378 */ u8 isSelling;
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 df3beb13b..bfc157fcb 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -171,7 +171,7 @@ void func_809619D0(EnFu* this, PlayState* play) {
}
for (i = 0; i < this->unk_542; i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->unk_520 = path->count;
@@ -426,23 +426,24 @@ void func_80962340(EnFu* this, PlayState* play) {
}
void func_80962588(EnFu* this, PlayState* play) {
- if (Message_ShouldAdvance(play) && (this->unk_552 == 0x2871)) {
- if (1) {}
- if (play->msgCtx.choiceIndex == 0) {
- if (gSaveContext.save.playerData.rupees >= 10) {
- func_8019F208();
- Rupees_ChangeBy(-10);
- func_80963DE4(this, play);
- } else {
- play_sound(NA_SE_SY_ERROR);
- Message_StartTextbox(play, 0x2873, &this->actor);
- this->unk_552 = 0x2873;
- }
+ if (!Message_ShouldAdvance(play) || (this->unk_552 != 0x2871)) {
+ return;
+ }
+
+ if (play->msgCtx.choiceIndex == 0) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
+ func_8019F208();
+ Rupees_ChangeBy(-10);
+ func_80963DE4(this, play);
} else {
- func_8019F230();
- Message_StartTextbox(play, 0x2872, &this->actor);
- this->unk_552 = 0x2872;
+ play_sound(NA_SE_SY_ERROR);
+ Message_StartTextbox(play, 0x2873, &this->actor);
+ this->unk_552 = 0x2873;
}
+ } else {
+ func_8019F230();
+ Message_StartTextbox(play, 0x2872, &this->actor);
+ this->unk_552 = 0x2872;
}
}
@@ -652,7 +653,7 @@ void func_80962A10(EnFu* this, PlayState* play) {
this->unk_546 = 1;
}
- if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.playerData.isMagicAcquired) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_DEKU) && gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
@@ -727,9 +728,9 @@ void func_80962D60(EnFu* this, PlayState* play) {
void func_80962EBC(EnFu* this, PlayState* play) {
if (this->unk_542 != 0) {
- if (this->actor.cutscene != -1) {
- Camera_ChangeDataIdx(play->cameraPtrs[CAM_ID_MAIN],
- ActorCutscene_GetCutscene(this->actor.cutscene)->csCamSceneDataId);
+ if (this->actor.csId != CS_ID_NONE) {
+ Camera_ChangeActorCsCamIndex(play->cameraPtrs[CAM_ID_MAIN],
+ CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
}
}
}
@@ -775,7 +776,7 @@ void func_80962F4C(EnFu* this, PlayState* play) {
Message_StartTextbox(play, 0x288B, &this->actor);
}
- if ((!DynaPolyActor_IsInRidingRotatingState((DynaPolyActor*)this->actor.child) &&
+ if ((!DynaPolyActor_IsPlayerAbove((DynaPolyActor*)this->actor.child) &&
(player->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) ||
(gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] <= SECONDS_TO_TIMER(0)) || (this->unk_548 == this->unk_54C)) {
player->stateFlags3 &= ~PLAYER_STATE3_400000;
@@ -1139,7 +1140,7 @@ void func_80963DE4(EnFu* this, PlayState* play) {
}
void func_80963EAC(EnFu* this, PlayState* play) {
- if (gSaveContext.save.playerData.isMagicAcquired) {
+ if (gSaveContext.save.saveInfo.playerData.isMagicAcquired) {
if (this->unk_540 == 1) {
Message_StartTextbox(play, 0x2847, &this->actor);
this->unk_552 = 0x2847;
@@ -1337,7 +1338,7 @@ void EnFu_Update(Actor* thisx, PlayState* play) {
func_809642E0(this, play);
Actor_MoveWithGravity(&this->actor);
func_8096209C(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
SkelAnime_Update(&this->skelAnime);
func_80961D7C(play);
func_809640D8(this, play);
@@ -1385,7 +1386,7 @@ void EnFu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 0, 50, 160, 0));
@@ -1449,7 +1450,7 @@ void func_80964950(PlayState* play, EnFuUnkStruct* ptr, s32 len) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < len; i++, ptr++) {
if (ptr->unk_36 == 1) {
diff --git a/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c b/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
index e79348366..576e307b2 100644
--- a/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
+++ b/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.c
@@ -86,7 +86,7 @@ void EnFuKago_Init(Actor* thisx, PlayState* play) {
CollisionHeader* sp34 = NULL;
Actor* npc = play->actorCtx.actorLists[ACTORCAT_NPC].first;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_fu_mato_Colheader_0015C0, &sp34);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, sp34);
Actor_SetScale(&this->dyna.actor, 0.1f);
@@ -228,7 +228,7 @@ void func_80ACFA78(EnFuKago* this, PlayState* play) {
this->unk_33A = 1;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOODBOX_BREAK);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = func_80AD0028;
}
@@ -364,7 +364,7 @@ void func_80AD0340(EnFuKago* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80AD061C); i++, ptr++) {
Matrix_Push();
@@ -390,7 +390,7 @@ void EnFuKago_Draw(Actor* thisx, PlayState* play) {
if (this->unk_33A == 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_0006A0);
diff --git a/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c b/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
index 88a2c63b2..52e947dbd 100644
--- a/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
+++ b/src/overlays/actors/ovl_En_Fu_Mato/z_en_fu_mato.c
@@ -75,7 +75,7 @@ void EnFuMato_Init(Actor* thisx, PlayState* play) {
Actor* actor = play->actorCtx.actorLists[ACTORCAT_NPC].first;
EnFu* fu;
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
CollisionHeader_GetVirtual(&object_fu_mato_Colheader_0023D4, &sp2C);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, sp2C);
Actor_SetScale(&this->dyna.actor, 0.1f);
@@ -185,7 +185,8 @@ void func_80ACE718(EnFuMato* this, PlayState* play) {
this->dyna.actor.velocity.y += this->dyna.actor.gravity;
Actor_UpdatePos(&this->dyna.actor);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 60.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if ((this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->dyna.actor.world.pos.y < -500.0f)) {
Vec3f sp3C = { 0.0f, 0.0f, 0.0f };
@@ -329,7 +330,8 @@ void func_80ACECFC(EnFuMato* this, PlayState* play) {
}
if (this->unk_302 == 1) {
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 60.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_80ACEB2C(this);
}
@@ -404,7 +406,7 @@ void func_80ACF1F4(EnFuMato* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < 2; i++) {
Matrix_Push();
@@ -447,7 +449,7 @@ void func_80ACF3F4(EnFuMato* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80ACF63C); i++, ptr++) {
Matrix_Push();
@@ -469,7 +471,7 @@ void EnFuMato_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
index f9ee51391..71f980d47 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -306,14 +306,14 @@ void func_809328F4(EnFz* this, PlayState* play, Vec3f* arg2, s32 arg3, f32 arg4)
sp88.b = 200;
for (i = 0; i < arg3; i++) {
- temp_f24 = randPlusMinusPoint5Scaled(0.3f) + 0.6f;
- temp_s1 = (s32)randPlusMinusPoint5Scaled(5.0f) + 12;
- spA8.x = randPlusMinusPoint5Scaled(arg4) + arg2->x;
+ temp_f24 = Rand_CenteredFloat(0.3f) + 0.6f;
+ temp_s1 = (s32)Rand_CenteredFloat(5.0f) + 12;
+ spA8.x = Rand_CenteredFloat(arg4) + arg2->x;
spA8.y = Rand_ZeroFloat(arg4) + arg2->y;
- spA8.z = randPlusMinusPoint5Scaled(arg4) + arg2->z;
- sp9C.x = randPlusMinusPoint5Scaled(10.0f);
+ spA8.z = Rand_CenteredFloat(arg4) + arg2->z;
+ sp9C.x = Rand_CenteredFloat(10.0f);
sp9C.y = Rand_ZeroFloat(10.0f) + 2.0f;
- sp9C.z = randPlusMinusPoint5Scaled(10.0f);
+ sp9C.z = Rand_CenteredFloat(10.0f);
EffectSsEnIce_Spawn(play, &spA8, temp_f24, &sp9C, &sp90, &sp8C, &sp88, temp_s1);
}
@@ -329,9 +329,9 @@ void func_80932AF4(EnFz* this) {
Vec3f sp2C;
if (!(this->unk_BC6 & 0xF)) {
- sp44.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
- sp44.y = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.y + 30.0f;
- sp44.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp44.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
+ sp44.y = Rand_CenteredFloat(40.0f) + this->actor.world.pos.y + 30.0f;
+ sp44.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
sp2C.x = sp2C.z = 0.0f;
sp2C.y = 0.1f;
sp38.x = sp38.y = sp38.z = 0.0f;
@@ -345,9 +345,9 @@ void func_80932BD4(EnFz* this) {
Vec3f sp2C;
if (!(this->unk_BC6 & 3)) {
- sp44.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
+ sp44.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
sp44.y = this->unk_BB4;
- sp44.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp44.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
sp2C.x = sp2C.z = 0.0f;
sp2C.y = 0.1f;
sp38.x = sp38.y = sp38.z = 0.0f;
@@ -824,7 +824,7 @@ void EnFz_Update(Actor* thisx, PlayState* play) {
Math_StepToF(&this->actor.speed, this->unk_BBC, 0.2f);
Actor_MoveWithGravity(&this->actor);
if (this->unk_BCC != 0) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
D_809347AC[this->unk_BD6](this);
@@ -846,7 +846,7 @@ void EnFz_Draw(Actor* thisx, PlayState* play) {
if (this->unk_BD7 != 0) {
func_800B8118(&this->actor, play, 0);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, play->state.frames % 128, 0x20, 0x20, 1, 0,
@@ -993,7 +993,7 @@ void func_80934464(EnFz* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_BAYER);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_PATTERN);
diff --git a/src/overlays/actors/ovl_En_Fz/z_en_fz.h b/src/overlays/actors/ovl_En_Fz/z_en_fz.h
index 539560c88..ac1cb0648 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.h
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.h
@@ -13,12 +13,12 @@ typedef void (*EnFzUnkFunc)(struct EnFz*);
#define ENFZ_GET_4000(thisx) ((thisx)->params & 0x4000)
#define ENFZ_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
+typedef enum {
/* 0 */ ENFZ_F_0,
/* 1 */ ENFZ_F_1,
/* 2 */ ENFZ_F_2,
- /* 3 */ ENFZ_F_3,
-};
+ /* 3 */ ENFZ_F_3
+} EnFzParam;
typedef struct {
/* 0x00 */ u8 unk_00;
diff --git a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c
index b4542956c..add0814bd 100644
--- a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c
+++ b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c
@@ -219,13 +219,13 @@ void EnGakufu_GiveReward(EnGakufu* this, PlayState* play) {
}
void EnGakufu_PlayRewardCutscene(EnGakufu* this, PlayState* play) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
EnGakufu_GiveReward(this, play);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
EnGakufu_GiveReward(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
diff --git a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
index 04d9c7159..5602a3b4f 100644
--- a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
+++ b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
@@ -10,8 +10,8 @@ typedef void (*EnGakufuActionFunc)(struct EnGakufu*, PlayState*);
#define GAKUFU_GET_TYPE(thisx) ((thisx)->params & 0xF)
typedef enum {
- /* 0x0 */ GAKUFU_TERMINA_FIELD,
- /* 0x1 */ GAKUFU_MILK_BAR
+ /* 0 */ GAKUFU_TERMINA_FIELD,
+ /* 1 */ GAKUFU_MILK_BAR
} GakufuType;
typedef struct EnGakufu {
diff --git a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
index 8882ab94e..b9936c53c 100644
--- a/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
+++ b/src/overlays/actors/ovl_En_Gamelupy/z_en_gamelupy.c
@@ -171,7 +171,7 @@ void EnGamelupy_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, 0xC);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8);
func_80AF6B40(this, play);
}
@@ -181,7 +181,7 @@ void EnGamelupy_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeTextures[this->rupeeIndex]));
diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
index 3d75c729c..11fa876d4 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c
@@ -163,7 +163,7 @@ u16 func_80B0F7FC(EnGb2* this) {
return 0x14E4;
}
- if (gSaveContext.save.playerData.health > 48) {
+ if (gSaveContext.save.saveInfo.playerData.health > 48) {
return 0x14D2;
}
@@ -171,7 +171,7 @@ u16 func_80B0F7FC(EnGb2* this) {
return 0x14D3;
case 0x14E4:
- if (gSaveContext.save.playerData.health > 48) {
+ if (gSaveContext.save.saveInfo.playerData.health > 48) {
return 0x14D2;
}
@@ -241,9 +241,9 @@ u16 func_80B0F97C(EnGb2* this) {
}
void func_80B0FA04(EnGb2* this) {
- this->unk_282[0] = this->actor.cutscene;
- this->unk_282[1] = ActorCutscene_GetAdditionalCutscene(this->unk_282[0]);
- this->unk_282[2] = ActorCutscene_GetAdditionalCutscene(this->unk_282[1]);
+ this->csIdList[0] = this->actor.csId;
+ this->csIdList[1] = CutsceneManager_GetAdditionalCsId(this->csIdList[0]);
+ this->csIdList[2] = CutsceneManager_GetAdditionalCsId(this->csIdList[1]);
}
s32 func_80B0FA48(EnGb2* this, PlayState* play) {
@@ -355,7 +355,7 @@ void func_80B0FD8C(EnGb2* this, PlayState* play) {
}
void func_80B0FE18(PlayState* play) {
- func_800FD750(0x38);
+ func_800FD750(NA_BGM_MINI_BOSS);
play->nextEntrance = ENTRANCE(GHOST_HUT, 1);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_64;
@@ -407,7 +407,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) {
if (this->unk_26E == 0x14D5) {
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < this->unk_288) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_288) {
play_sound(NA_SE_SY_ERROR);
this->unk_26E = 0x14D7;
this->unk_26C |= 2;
@@ -433,7 +433,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) {
Rupees_ChangeBy(-this->unk_288);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
this->actionFunc = func_80B11344;
break;
@@ -451,10 +451,10 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) {
void func_80B10240(EnGb2* this, PlayState* play) {
this->unk_27C = D_80B119B0[this->unk_280].unk_00;
this->unk_27E = D_80B119B0[this->unk_280].unk_10;
- this->unk_282[0] = this->actor.cutscene;
+ this->csIdList[0] = this->actor.csId;
this->unk_268 = NULL;
- if (ActorCutscene_GetCanPlayNext(this->unk_282[0])) {
- ActorCutscene_Start(this->unk_282[0], &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Start(this->csIdList[0], &this->actor);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, this->unk_27C, D_80B119B0[this->unk_280].unk_04.x,
D_80B119B0[this->unk_280].unk_04.y, D_80B119B0[this->unk_280].unk_04.z, 0, 0, 0,
this->unk_27E);
@@ -463,7 +463,7 @@ void func_80B10240(EnGb2* this, PlayState* play) {
}
this->actionFunc = func_80B10344;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_282[0]);
+ CutsceneManager_Queue(this->csIdList[0]);
}
}
@@ -505,7 +505,7 @@ void func_80B10344(EnGb2* this, PlayState* play) {
}
}
- if (gSaveContext.save.playerData.health < 49) {
+ if (gSaveContext.save.saveInfo.playerData.health < 49) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_1] = TIMER_STATE_STOP;
SET_EVENTINF(EVENTINF_46);
SET_EVENTINF(EVENTINF_45);
@@ -575,7 +575,7 @@ void func_80B10634(EnGb2* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < this->unk_288) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_288) {
play_sound(NA_SE_SY_ERROR);
this->unk_26E = 0x14D7;
this->unk_26C |= 2;
@@ -585,7 +585,7 @@ void func_80B10634(EnGb2* this, PlayState* play) {
Rupees_ChangeBy(-this->unk_288);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
this->actionFunc = func_80B11344;
}
break;
@@ -601,38 +601,38 @@ void func_80B10634(EnGb2* this, PlayState* play) {
}
void func_80B10868(EnGb2* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->unk_282[2]) {
- if (ActorCutscene_GetCanPlayNext(this->unk_282[this->unk_290])) {
+ if (CutsceneManager_GetCurrentCsId() != this->csIdList[2]) {
+ if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
this->actionFunc = func_80B10A48;
- ActorCutscene_StartAndSetFlag(this->unk_282[this->unk_290], &this->actor);
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csIdList[this->csIdIndex], &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_282[this->unk_290]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
} else {
- this->unk_290 = 1;
- ActorCutscene_SetIntentToPlay(this->unk_282[this->unk_290]);
+ this->csIdIndex = 1;
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
void func_80B10924(EnGb2* this, PlayState* play) {
- s32 sp24;
+ s32 getItemId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_54_40)) {
- sp24 = 5;
+ getItemId = GI_RUPEE_PURPLE;
} else {
- sp24 = 12;
+ getItemId = GI_HEART_PIECE;
}
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (sp24 == 12) {
+ if (getItemId == GI_HEART_PIECE) {
SET_WEEKEVENTREG(WEEKEVENTREG_54_40);
} else {
Rupees_ChangeBy(50);
}
this->actionFunc = func_80B109DC;
} else {
- Actor_OfferGetItem(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -656,12 +656,12 @@ void func_80B10A48(EnGb2* this, PlayState* play) {
break;
case ENGB2_7_1:
- ActorCutscene_Stop(this->unk_282[this->unk_290]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
Actor_Kill(&this->actor);
break;
case ENGB2_7_2:
- ActorCutscene_Stop(this->unk_282[this->unk_290]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
if (this->unk_26E == 0x14FB) {
Flags_SetSwitch(play, ENGB2_GET_7F8(&this->actor));
Actor_Kill(&this->actor);
@@ -694,7 +694,7 @@ void func_80B10B5C(EnGb2* this, PlayState* play) {
this->unk_26C |= 2;
}
Message_StartTextbox(play, this->unk_26E, &this->actor);
- this->unk_290 = 1;
+ this->csIdIndex = 1;
this->unk_26C &= ~0x40;
this->actionFunc = func_80B10DAC;
} else if ((this->actor.xzDistToPlayer < 300.0f) && this->actor.isTargeted) {
@@ -712,7 +712,7 @@ void func_80B10B5C(EnGb2* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_80_20);
}
this->unk_26C &= ~0x20;
- this->unk_290 = 0;
+ this->csIdIndex = 0;
this->unk_26C |= 0x80;
this->actionFunc = func_80B10DAC;
} else if (this->actor.xzDistToPlayer < 300.0f) {
@@ -726,9 +726,9 @@ void func_80B10B5C(EnGb2* this, PlayState* play) {
}
void func_80B10DAC(EnGb2* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_282[this->unk_290])) {
+ if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
if (ENGB2_GET_7(&this->actor) == ENGB2_7_1) {
- if (this->unk_290 != 2) {
+ if (this->csIdIndex != 2) {
this->actionFunc = func_80B10E98;
} else {
Flags_SetSwitch(play, ENGB2_GET_7F8(&this->actor));
@@ -737,12 +737,12 @@ void func_80B10DAC(EnGb2* this, PlayState* play) {
} else {
this->actionFunc = func_80B110F8;
}
- ActorCutscene_StartAndSetFlag(this->unk_282[this->unk_290], &this->actor);
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csIdList[this->csIdIndex], &this->actor);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_282[this->unk_290]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
@@ -753,14 +753,14 @@ void func_80B10E98(EnGb2* this, PlayState* play) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
if ((this->unk_26E != 0x14E8) && (this->unk_26E != 0x14EA)) {
- ActorCutscene_Stop(this->unk_282[this->unk_290]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->actionFunc = func_80B10B5C;
} else if (Flags_GetSwitch(play, ENGB2_GET_7F8(&this->actor))) {
this->actionFunc = func_80B10A48;
} else {
- ActorCutscene_Stop(this->unk_282[this->unk_290]);
- this->unk_290 = 2;
- ActorCutscene_SetIntentToPlay(this->unk_282[this->unk_290]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 2;
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
this->actionFunc = func_80B10DAC;
}
} else {
@@ -770,9 +770,9 @@ void func_80B10E98(EnGb2* this, PlayState* play) {
Message_StartTextbox(play, this->unk_26E, &this->actor);
temp = this->unk_26E;
if ((temp == 0x14E7) || (temp == 0x14E9) || (temp == 0x14EC) || (temp == 0x14F0)) {
- ActorCutscene_Stop(this->unk_282[this->unk_290]);
- this->unk_290 = 1;
- ActorCutscene_SetIntentToPlay(this->unk_282[this->unk_290]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 1;
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
this->actionFunc = func_80B10DAC;
}
}
@@ -839,8 +839,8 @@ void func_80B111AC(EnGb2* this, PlayState* play) {
void func_80B11268(EnGb2* this, PlayState* play) {
if (play->roomCtx.curRoom.num == 1) {
- this->unk_290 = 0;
- this->unk_282[0] = this->actor.cutscene;
+ this->csIdIndex = 0;
+ this->csIdList[0] = this->actor.csId;
if (Flags_GetClear(play, 2) && Flags_GetClear(play, 3) && Flags_GetClear(play, 4) && Flags_GetClear(play, 5)) {
this->unk_28A = 0xFF;
this->unk_26C &= ~0x100;
@@ -887,7 +887,7 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
case ENGB2_7_0:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_54_80)) {
Actor_Kill(&this->actor);
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
@@ -927,8 +927,8 @@ void EnGb2_Init(Actor* thisx, PlayState* play) {
break;
case ENGB2_7_2:
- this->unk_290 = 0;
- this->unk_282[0] = this->actor.cutscene;
+ this->csIdIndex = 0;
+ this->csIdList[0] = this->actor.csId;
if (Flags_GetSwitch(play, ENGB2_GET_7F8(thisx))) {
Actor_Kill(&this->actor);
return;
@@ -1007,7 +1007,7 @@ void EnGb2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_28A == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -1016,7 +1016,7 @@ void EnGb2_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGb2_OverrideLimbDraw, EnGb2_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, this->unk_28A);
diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
index ec3b379a1..a257ab3d4 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
@@ -10,11 +10,11 @@ typedef void (*EnGb2ActionFunc)(struct EnGb2*, PlayState*);
#define ENGB2_GET_7(thisx) ((thisx)->params & 7)
#define ENGB2_GET_7F8(thisx) (((thisx)->params & 0x7F8) >> 3)
-enum {
+typedef enum {
/* 0 */ ENGB2_7_0,
/* 1 */ ENGB2_7_1,
- /* 2 */ ENGB2_7_2,
-};
+ /* 2 */ ENGB2_7_2
+} EnGb2Param;
typedef struct EnGb2 {
/* 0x0000 */ Actor actor;
@@ -31,11 +31,11 @@ typedef struct EnGb2 {
/* 0x27C */ s16 unk_27C;
/* 0x27E */ s16 unk_27E;
/* 0x280 */ s16 unk_280;
- /* 0x282 */ s16 unk_282[3];
+ /* 0x282 */ s16 csIdList[3];
/* 0x288 */ s16 unk_288;
/* 0x28A */ u8 unk_28A;
/* 0x28C */ s32 unk_28C;
- /* 0x290 */ s16 unk_290;
+ /* 0x290 */ s16 csIdIndex;
} EnGb2; // size = 0x294
#endif // Z_EN_GB2_H
diff --git a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
index d94267b38..c78f14048 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
@@ -69,8 +69,8 @@ typedef enum {
/* 6 */ GERUDO_WHITE_ANIM_EXCITED_CLAPPING,
/* 7 */ GERUDO_WHITE_ANIM_SALUTE,
/* 8 */ GERUDO_WHITE_ANIM_LEADING_BOAT,
- /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY,
-} GerudoWhiteAnimations;
+ /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY
+} GerudoWhiteAnimation;
void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames);
void EnGe1_ShadowDraw(Actor* thisx, Lights* lights, PlayState* play);
@@ -88,7 +88,7 @@ void EnGe1_Init(Actor* thisx, PlayState* play) {
this->picto.actor.colChkInfo.mass = MASS_IMMOVABLE;
this->picto.actor.targetMode = 6;
Actor_SetScale(&this->picto.actor, 0.01f);
- this->animIndex = this->csAction = -1; // GERUDO_WHITE_ANIM_NONE
+ this->animIndex = this->cueId = -1; // GERUDO_WHITE_ANIM_NONE
this->stateFlags = 0;
EnGe1_ChangeAnim(this, GERUDO_WHITE_ANIM_ARMS_FOLDED, ANIMMODE_LOOP, 0.0f);
this->actionFunc = EnGe1_Wait;
@@ -191,8 +191,8 @@ void EnGe1_SetupPath(EnGe1* this, PlayState* play) {
this->curPointIndex = 0;
- if (GERUDO_WHITE_GET_PATH(&this->picto.actor) != 0x3F) {
- this->path = &play->setupPathList[GERUDO_WHITE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_WHITE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_WHITE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_WHITE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
point = Lib_SegmentedToVirtual(this->path->points);
Math_Vec3s_ToVec3f(&this->picto.actor.world.pos, point);
@@ -255,16 +255,16 @@ void EnGe1_Wait(EnGe1* this, PlayState* play) {
}
void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play) {
- s16 csAction;
+ s16 cueId;
- if (SkelAnime_Update(&this->skelAnime) && (this->csAction == 3)) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->cueId == 3)) {
EnGe1_ChangeAnim(this, GERUDO_WHITE_ANIM_STIFF_SHIVERING, ANIMMODE_LOOP, 0.0f);
}
- if (Cutscene_CheckActorAction(play, 121)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_121)) {
this->picto.actor.draw = EnGe1_Draw;
- csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 121)]->action;
- switch (csAction) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_121)]->id;
+ switch (cueId) {
case 8:
this->stateFlags &= ~GERUDO_WHITE_STATE_DISABLE_MOVEMENT;
break;
@@ -275,14 +275,15 @@ void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play) {
default:
this->stateFlags &= ~GERUDO_WHITE_STATE_DISABLE_MOVEMENT;
- Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetActorActionIndex(play, 0x79));
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play,
+ Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_121));
break;
}
- if (this->csAction != csAction) {
- this->csAction = csAction;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
- switch (this->csAction) {
+ switch (this->cueId) {
// Aveil cutscene
case 1:
EnGe1_ChangeAnim(this, GERUDO_WHITE_ANIM_ARMS_FOLDED, ANIMMODE_LOOP, 0.0f);
@@ -340,7 +341,7 @@ void EnGe1_PerformCutsceneActions(EnGe1* this, PlayState* play) {
this->picto.actor.draw = NULL;
}
- switch (this->csAction) {
+ switch (this->cueId) {
case 9:
if ((this->curPointIndex < this->path->count) && EnGe1_FollowPath(this)) {
this->curPointIndex++;
@@ -375,7 +376,8 @@ void EnGe1_Update(Actor* thisx, PlayState* play) {
if (!(this->stateFlags & GERUDO_WHITE_STATE_DISABLE_MOVEMENT)) {
Actor_MoveWithGravity(&this->picto.actor);
}
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 40.0f, 25.0f, 40.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 40.0f, 25.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
this->torsoRot.x = this->torsoRot.y = this->torsoRot.z = 0;
@@ -439,6 +441,9 @@ void EnGe1_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList(POLY_OPA_DISP++, sHairstyleDLs[this->hairstyle]);
Matrix_MultVec3f(&sInitialFocusPos, &this->picto.actor.focus.pos);
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -455,7 +460,7 @@ void EnGe1_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGe1_OverrideLimbDraw, EnGe1_PostLimbDraw, &this->picto.actor);
diff --git a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
index 1cf716b0f..f1684315b 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
@@ -6,7 +6,9 @@
#include "objects/object_ge1/object_ge1.h"
#define GERUDO_WHITE_GET_TYPE(thisx) (((thisx)->params) & 0xF)
-#define GERUDO_WHITE_GET_PATH(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+#define GERUDO_WHITE_GET_PATH_INDEX(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+
+#define GERUDO_WHITE_PATH_INDEX_NONE 0x3F
//! Only the first type is used
typedef enum {
@@ -34,7 +36,7 @@ typedef struct EnGe1 {
/* 0x2BA */ s16 blinkTimer;
/* 0x2BC */ u16 stateFlags;
/* 0x2BE */ s16 animIndex;
- /* 0x2C0 */ s16 csAction;
+ /* 0x2C0 */ s16 cueId;
/* 0x2C2 */ s16 screamTimer;
/* 0x2C4 */ u8 hairstyle;
/* 0x2C8 */ EnGe1ActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
index 54836f071..facc4def2 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
@@ -100,7 +100,7 @@ void EnGe2_Init(Actor* thisx, PlayState* play) {
this->picto.actor.targetMode = 6;
this->stateFlags = 0;
this->detectedStatus = GERUDO_PURPLE_DETECTION_UNDETECTED;
- this->csAction = -1;
+ this->cueId = -1;
this->picto.actor.terminalVelocity = -9.0f;
this->picto.actor.gravity = -1.0f;
@@ -200,8 +200,8 @@ s32 EnGe2_LookForPlayer(PlayState* play, Actor* actor, Vec3f* pos, s16 yaw, s16
* @return true if path is set up in reverse
*/
s32 EnGe2_SetupPath(EnGe2* this, PlayState* play) {
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
Path* path = this->path;
Vec3s* points = Lib_SegmentedToVirtual(path->points);
@@ -228,14 +228,14 @@ void EnGe2_GetNextPath(EnGe2* this, PlayState* play) {
Path* curPath;
Path* nextPath;
Vec3s* points;
- u8 unk1;
+ u8 nextPathIndex;
this->curPointIndex = 0;
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- curPath = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
- unk1 = curPath->unk1;
- nextPath = &play->setupPathList[unk1];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ curPath = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
+ nextPathIndex = curPath->additionalPathIndex;
+ nextPath = &play->setupPathList[nextPathIndex];
this->path = nextPath;
points = Lib_SegmentedToVirtual(nextPath->points);
this->picto.actor.world.pos.x = points[0].x;
@@ -252,8 +252,8 @@ void EnGe2_SetupBlownAwayPath(EnGe2* this, PlayState* play) {
this->curPointIndex = 0;
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
Math_Vec3s_ToVec3f(&this->picto.actor.world.pos, points);
@@ -592,33 +592,34 @@ void EnGe2_Walk(EnGe2* this, PlayState* play) {
void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Cutscene_CheckActorAction(play, 476)) {
- s16 csAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 476)]->action;
- if (this->csAction != csAction) {
- this->csAction = csAction;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_476)) {
+ s16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_476)]->id;
- switch (csAction) {
- case ENGE2_CSACTION_BEEHIVE_PATROL:
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+
+ switch (cueId) {
+ case ENGE2_CUEID_BEEHIVE_PATROL:
Animation_Change(&this->skelAnime, &gGerudoPurpleLookingAboutAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoPurpleLookingAboutAnim), 0, -8.0f);
EnGe2_GetNextPath(this, play);
break;
- case ENGE2_CSACTION_BEEHIVE_RUN_AWAY:
+ case ENGE2_CUEID_BEEHIVE_RUN_AWAY:
Animation_Change(&this->skelAnime, &gGerudoPurpleRunningAwayCutsceneAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoPurpleRunningAwayCutsceneAnim), 0, -5.0f);
this->screamTimer = (s32)(Rand_ZeroFloat(10.0f) + 20.0f);
break;
- case ENGE2_CSACTION_BEEHIVE_EXIT:
+ case ENGE2_CUEID_BEEHIVE_EXIT:
Actor_Kill(&this->picto.actor);
break;
- case ENGE2_CSACTION_GBT_ENTR_STAND_STILL:
+ case ENGE2_CUEID_GBT_ENTR_STAND_STILL:
Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 0.0f, 0.0f, 2, 0.0f);
break;
- case ENGE2_CSACTION_GBT_ENTR_BLOWN_AWAY:
+ case ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY:
Animation_Change(&this->skelAnime, &gGerudoPurpleGreatBayCutsceneAnim, 0.0f, 1.0f, 1.0f, 2, 0.0f);
EnGe2_SetupBlownAwayPath(this, play);
this->stateFlags |= GERUDO_PURPLE_STATE_DISABLE_MOVEMENT;
@@ -631,8 +632,8 @@ void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) {
}
}
- switch (this->csAction) {
- case ENGE2_CSACTION_BEEHIVE_RUN_AWAY:
+ switch (this->cueId) {
+ case ENGE2_CUEID_BEEHIVE_RUN_AWAY:
EnGe2_FollowPath(this);
this->picto.actor.speed = 5.0f;
@@ -648,7 +649,7 @@ void EnGe2_PerformCutsceneActions(EnGe2* this, PlayState* play) {
}
break;
- case ENGE2_CSACTION_GBT_ENTR_BLOWN_AWAY:
+ case ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY:
if ((this->curPointIndex < this->path->count) && EnGe2_FollowPathWithoutGravity(this)) {
this->curPointIndex++;
}
@@ -699,11 +700,12 @@ void EnGe2_Update(Actor* thisx, PlayState* play) {
if (!(this->stateFlags & GERUDO_PURPLE_STATE_DISABLE_MOVEMENT)) {
Actor_MoveWithGravity(&this->picto.actor);
}
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 40.0f, 25.0f, 40.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 40.0f, 25.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
Collider_UpdateCylinder(&this->picto.actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- if (Cutscene_CheckActorAction(play, 476)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_476)) {
this->actionFunc = EnGe2_PerformCutsceneActions;
this->stateFlags &= ~GERUDO_PURPLE_STATE_KO;
this->stateFlags &= ~GERUDO_PURPLE_STATE_PATH_REVERSE;
@@ -765,7 +767,7 @@ void EnGe2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
func_800B8050(&this->picto.actor, play, 0);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
index 739e94277..ee0d99d00 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
@@ -11,12 +11,12 @@ typedef void (*EnGe2ActionFunc)(struct EnGe2*, PlayState*);
#define GERUDO_PURPLE_GET_EXIT(thisx) (((thisx)->params) & 0x1F) //!< Exit to send Player to when caught
#define GERUDO_PURPLE_GET_TYPE(thisx) (((thisx)->params & 0xE0) >> 5)
-#define GERUDO_PURPLE_GET_PATH(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+#define GERUDO_PURPLE_GET_PATH_INDEX(thisx) ((((thisx)->params) & 0xFC00) >> 10)
-#define GERUDO_PURPLE_PARAMS(path, type, exit) (((path) & 0x1F) | (((type) & 7) << 5) | (((exit) & 0x3F) << 10))
+#define GERUDO_PURPLE_PARAMS(exit, type, pathIndex) (((exit) & 0x1F) | (((type) & 7) << 5) | (((pathIndex) & 0x3F) << 10))
#define GERUDO_PURPLE_EXIT_NONE 0x1F
-#define GERUDO_PURPLE_PATH_NONE 0x3F
+#define GERUDO_PRUPLE_PATH_INDEX_NONE 0x3F
typedef enum {
/* 0 */ GERUDO_PURPLE_TYPE_CUTSCENE,
@@ -27,11 +27,11 @@ typedef enum {
//! TODO: work out where to put this
typedef enum {
- /* 1 */ ENGE2_CSACTION_BEEHIVE_PATROL = 1,
- /* 2 */ ENGE2_CSACTION_BEEHIVE_RUN_AWAY,
- /* 3 */ ENGE2_CSACTION_BEEHIVE_EXIT,
- /* 4 */ ENGE2_CSACTION_GBT_ENTR_STAND_STILL,
- /* 5 */ ENGE2_CSACTION_GBT_ENTR_BLOWN_AWAY
+ /* 1 */ ENGE2_CUEID_BEEHIVE_PATROL = 1,
+ /* 2 */ ENGE2_CUEID_BEEHIVE_RUN_AWAY,
+ /* 3 */ ENGE2_CUEID_BEEHIVE_EXIT,
+ /* 4 */ ENGE2_CUEID_GBT_ENTR_STAND_STILL,
+ /* 5 */ ENGE2_CUEID_GBT_ENTR_BLOWN_AWAY
} EnGe2CsAction;
typedef struct EnGe2 {
@@ -51,7 +51,7 @@ typedef struct EnGe2 {
/* 0x2FC */ f32 verticalDetectRange; //!< vertical range to look for the player within
/* 0x300 */ u8 timer;
/* 0x301 */ u8 detectedStatus;
- /* 0x302 */ s16 csAction;
+ /* 0x302 */ s16 cueId;
/* 0x304 */ s16 unk304; // unused
/* 0x306 */ s16 screamTimer;
/* 0x308 */ EnGe2ActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.c b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
index 04353d954..6621ecc93 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
@@ -135,17 +135,17 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
@@ -217,7 +217,7 @@ void func_80BB178C(EnGeg* this, PlayState* play) {
if (collider != NULL) {
CollisionCheck_SetOC(play, &play->colChkCtx, collider);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -304,10 +304,10 @@ u8 func_80BB1B14(EnGeg* this, PlayState* play) {
void func_80BB1C1C(EnGeg* this) {
u16 i;
- this->unk_49C[0] = this->actor.cutscene;
+ this->csIdList[0] = this->actor.csId;
- for (i = 1; i < ARRAY_COUNT(this->unk_49C); i++) {
- this->unk_49C[i] = ActorCutscene_GetAdditionalCutscene(this->unk_49C[i - 1]);
+ for (i = 1; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = CutsceneManager_GetAdditionalCsId(this->csIdList[i - 1]);
}
}
@@ -432,15 +432,15 @@ void func_80BB221C(EnGeg* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state) && (this->unk_230 & 4)) {
if (sp27 == 1) {
this->unk_496 = 0xD66;
- this->unk_49A = this->unk_49C[3];
+ this->nextCsId = this->csIdList[3];
} else if (sp27 == 2) {
this->unk_496 = 0xD64;
- this->unk_49A = this->unk_49C[2];
+ this->nextCsId = this->csIdList[2];
this->unk_230 &= ~4;
} else if (sp27 == 3) {
this->unk_230 |= 0x200;
this->unk_496 = 0xD64;
- this->unk_49A = this->unk_49C[2];
+ this->nextCsId = this->csIdList[2];
this->unk_230 &= ~4;
}
Message_StartTextbox(play, this->unk_496, &this->actor);
@@ -466,7 +466,7 @@ void func_80BB221C(EnGeg* this, PlayState* play) {
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state) && (this->unk_230 & 8)) {
SET_WEEKEVENTREG(WEEKEVENTREG_35_40);
this->unk_496 = 0xD5E;
- this->unk_49A = this->unk_49C[0];
+ this->nextCsId = this->csIdList[0];
Message_StartTextbox(play, this->unk_496, &this->actor);
this->actionFunc = func_80BB2520;
this->unk_230 &= ~8;
@@ -481,18 +481,18 @@ void func_80BB221C(EnGeg* this, PlayState* play) {
void func_80BB2520(EnGeg* this, PlayState* play) {
if (this->unk_230 & 0x10) {
- ActorCutscene_Stop(this->unk_498);
+ CutsceneManager_Stop(this->csId);
this->unk_230 &= ~0x10;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->unk_498 = this->unk_49A;
- ActorCutscene_SetIntentToPlay(this->unk_498);
+ this->csId = this->nextCsId;
+ CutsceneManager_Queue(this->csId);
return;
}
- if (ActorCutscene_GetCanPlayNext(this->unk_498)) {
- ActorCutscene_StartAndSetFlag(this->unk_498, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->unk_230 |= 0x10;
switch (this->unk_496) {
@@ -517,7 +517,7 @@ void func_80BB2520(EnGeg* this, PlayState* play) {
break;
case 0xD67:
- this->unk_498 = this->unk_49C[5];
+ this->csId = this->csIdList[5];
this->actionFunc = func_80BB2B1C;
break;
@@ -534,11 +534,11 @@ void func_80BB2520(EnGeg* this, PlayState* play) {
break;
}
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->unk_498 = this->unk_49A;
- ActorCutscene_SetIntentToPlay(this->unk_498);
+ this->csId = this->nextCsId;
+ CutsceneManager_Queue(this->csId);
}
}
@@ -546,12 +546,12 @@ void func_80BB26EC(EnGeg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (this->unk_496) {
case 0xD5E:
- this->unk_49A = this->unk_49C[1];
+ this->nextCsId = this->csIdList[1];
this->actionFunc = func_80BB2520;
break;
case 0xD61:
- ActorCutscene_Stop(this->unk_498);
+ CutsceneManager_Stop(this->csId);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->unk_230 &= ~0x10;
@@ -574,7 +574,7 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
break;
case 0xD69:
- this->unk_49A = this->unk_49C[6];
+ this->nextCsId = this->csIdList[6];
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->actionFunc = func_80BB2520;
@@ -594,7 +594,7 @@ void func_80BB27D4(EnGeg* this, PlayState* play) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->unk_230 &= ~0x10;
- this->unk_49A = this->unk_49C[7];
+ this->nextCsId = this->csIdList[7];
this->actionFunc = func_80BB2520;
break;
@@ -620,7 +620,7 @@ void func_80BB2944(EnGeg* this, PlayState* play) {
if (this->unk_496 == 0xD67) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
- this->unk_49A = this->unk_49C[4];
+ this->nextCsId = this->csIdList[4];
this->actionFunc = func_80BB2520;
} else {
this->unk_496 = func_80BB16D0(this);
@@ -632,7 +632,7 @@ void func_80BB2944(EnGeg* this, PlayState* play) {
void func_80BB2A54(EnGeg* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_496 == 0xD65) {
- ActorCutscene_Stop(this->unk_498);
+ CutsceneManager_Stop(this->csId);
this->unk_230 &= ~0x10;
this->unk_244 = 65;
play->msgCtx.msgMode = 0x43;
@@ -654,14 +654,14 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) {
this->actor.child->world.pos = this->unk_4B4;
this->actor.child->shape.rot = this->actor.shape.rot;
- if (ActorCutscene_GetCurrentIndex() != this->unk_49C[4]) {
- if (ActorCutscene_GetCanPlayNext(this->unk_498)) {
+ if (CutsceneManager_GetCurrentCsId() != this->csIdList[4]) {
+ if (CutsceneManager_IsNext(this->csId)) {
SET_WEEKEVENTREG(WEEKEVENTREG_37_08);
if (this->actor.child != NULL) {
Actor_Kill(this->actor.child);
}
this->unk_230 |= 0x10;
- ActorCutscene_StartAndSetFlag(this->unk_498, &this->actor);
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->unk_496 = 0xD68;
Message_ContinueTextbox(play, this->unk_496);
this->unk_248 = Object_GetIndex(&play->objectCtx, OBJECT_TAISOU);
@@ -671,10 +671,10 @@ void func_80BB2B1C(EnGeg* this, PlayState* play) {
}
this->actionFunc = func_80BB27D4;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_498);
+ CutsceneManager_Queue(this->csId);
}
} else {
temp_f20 = this->unk_4E0 * 0.005f;
@@ -711,7 +711,7 @@ void func_80BB2E00(EnGeg* this, PlayState* play) {
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x1000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (sp2E == sp2C) {
- ActorCutscene_Stop(this->unk_498);
+ CutsceneManager_Stop(this->csId);
this->unk_4AC = 20;
func_80BB2020(this, play);
this->actionFunc = func_80BB30B4;
@@ -837,7 +837,7 @@ void func_80BB3318(EnGeg* this, PlayState* play) {
this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
}
- if (ActorCutscene_GetCurrentIndex() != this->unk_49C[7]) {
+ if (CutsceneManager_GetCurrentCsId() != this->csIdList[7]) {
func_800AEF44(Effect_GetByIndex(this->unk_4DC));
Actor_Kill(&this->actor);
} else {
@@ -951,7 +951,7 @@ void EnGeg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (limbIndex == 17) {
if (!(this->unk_230 & 0x40)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -1045,7 +1045,7 @@ void func_80BB3BE0(EnGeg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BB4088[this->unk_23E]));
gDPPipeSync(POLY_OPA_DISP++);
@@ -1062,7 +1062,7 @@ void func_80BB3CB4(EnGeg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Geg/z_en_geg.h b/src/overlays/actors/ovl_En_Geg/z_en_geg.h
index ea29fd6cf..71639bdac 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.h
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.h
@@ -33,9 +33,9 @@ typedef struct EnGeg {
/* 0x484 */ Vec3f unk_484;
/* 0x490 */ Vec3s unk_490;
/* 0x496 */ u16 unk_496;
- /* 0x498 */ s16 unk_498;
- /* 0x49A */ s16 unk_49A;
- /* 0x49C */ s16 unk_49C[8];
+ /* 0x498 */ s16 csId;
+ /* 0x49A */ s16 nextCsId;
+ /* 0x49C */ s16 csIdList[8];
/* 0x4AC */ s32 unk_4AC;
/* 0x4B0 */ s16 unk_4B0;
/* 0x4B4 */ Vec3f unk_4B4;
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 a2ece1010..e9e37ddb4 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.c
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.c
@@ -144,7 +144,8 @@ void func_80B35108(EnGg* this, PlayState* play) {
this->collider.dim.pos.z = this->actor.world.pos.z;
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 30.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
}
void func_80B351A4(EnGg* this) {
@@ -225,7 +226,7 @@ void func_80B352A4(EnGg* this, PlayState* play) {
}
void func_80B35450(EnGg* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_91_10) && (play->csCtx.state == 0)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_91_10) && (play->csCtx.state == CS_STATE_IDLE)) {
func_80B359DC(this, play);
}
@@ -264,15 +265,15 @@ void func_80B3556C(EnGg* this, PlayState* play) {
void func_80B35634(EnGg* this, PlayState* play) {
s32 pad;
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 119)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 119);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_119)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_119);
- if (this->unk_2DB != play->csCtx.actorActions[actionIndex]->action) {
- this->unk_2DB = play->csCtx.actorActions[actionIndex]->action;
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->unk_2DA = 0;
this->unk_2E6 = 0;
@@ -333,10 +334,10 @@ void func_80B35634(EnGg* this, PlayState* play) {
func_80B358D8(this, play);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
this->actor.shape.yOffset = 0.0f;
} else {
- this->unk_2DB = 99;
+ this->cueId = 99;
}
}
@@ -406,16 +407,16 @@ void func_80B359DC(EnGg* this, PlayState* play) {
this->unk_307 = true;
}
- if (ActorCutscene_GetCanPlayNext(this->unk_2DC)) {
- ActorCutscene_Start(this->unk_2DC, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
this->unk_307 = false;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
if (this->unk_307) {
- ActorCutscene_SetIntentToPlay(this->unk_2DC);
+ CutsceneManager_Queue(this->csId);
}
}
} else {
@@ -526,7 +527,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -550,7 +551,7 @@ void func_80B35C84(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -603,7 +604,7 @@ void func_80B3610C(EnGgStruct* ptr, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 150, 0, 255);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -665,7 +666,7 @@ void EnGg_Init(Actor* thisx, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_20_10);
this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
this->unk_310 = this->actor.home.pos.y;
- this->unk_2DC = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->actor.flags |= ACTOR_FLAG_2000000;
this->unk_308 = 0;
this->unk_309 = 0;
@@ -691,14 +692,14 @@ void EnGg_Update(Actor* thisx, PlayState* play) {
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
this->actor.flags |= ACTOR_FLAG_1;
} else {
this->actor.flags &= ~ACTOR_FLAG_1;
}
}
- if ((play->csCtx.state == 0) &&
+ if ((play->csCtx.state == CS_STATE_IDLE) &&
((this->unk_2DA != 14) && (this->unk_2DA != 11) && (this->unk_2DA != 12) && (this->unk_2DA != 13))) {
func_80B364D4(&this->unk_344, play);
}
@@ -722,7 +723,7 @@ void EnGg_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithoutGravity(&this->actor);
SkelAnime_Update(&this->skelAnime);
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
func_80B3584C(this);
} else {
this->unk_2E8 = 0;
@@ -790,7 +791,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_80)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B36DFC[this->unk_2E2]));
@@ -798,7 +799,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGg_OverrideLimbDraw, EnGg_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || (this->unk_308 == 1)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B36DFC[this->unk_2E2]));
@@ -806,7 +807,7 @@ void EnGg_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGg_OverrideLimbDraw, EnGg_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Gg/z_en_gg.h b/src/overlays/actors/ovl_En_Gg/z_en_gg.h
index cb9f9e7cb..802024897 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.h
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.h
@@ -21,7 +21,7 @@ typedef struct EnGgStruct {
/* 0x40 */ s32 unk_40;
/* 0x44 */ s32 unk_44;
/* 0x48 */ u8 unk_48;
-} EnGgStruct; // size == 0x4C
+} EnGgStruct; // size = 0x4C
typedef struct EnGg {
/* 0x000 */ Actor actor;
@@ -34,8 +34,8 @@ typedef struct EnGg {
/* 0x25C */ Vec3s morphTable[20];
/* 0x2D4 */ UNK_TYPE1 unk_2D4[0x6];
/* 0x2DA */ u8 unk_2DA;
- /* 0x2DB */ u8 unk_2DB;
- /* 0x2DC */ s16 unk_2DC;
+ /* 0x2DB */ u8 cueId;
+ /* 0x2DC */ s16 csId;
/* 0x2DE */ UNK_TYPE1 unk2DE[4];
/* 0x2E2 */ s16 unk_2E2;
/* 0x2E4 */ s16 unk_2E4;
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 d30dd6bd8..3540b1a24 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -183,14 +183,14 @@ void func_80B3B0A0(EnGg2* this, PlayState* play) {
void func_80B3B120(EnGg2* this, PlayState* play) {
Vec3s sp30;
- if (this->unk_1D8 != NULL) {
- func_80B3B7E4(this->unk_1D8, this->unk_1DC, &this->actor.world.pos, &sp30);
+ if (this->path != NULL) {
+ func_80B3B7E4(this->path, this->unk_1DC, &this->actor.world.pos, &sp30);
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
Math_SmoothStepToS(&this->actor.shape.rot.x, sp30.x, 4, 0x3E8, 1);
this->actor.world.rot.x = -this->actor.shape.rot.x;
- if (func_80B3B648(this, this->unk_1D8, this->unk_1DC) != 0) {
- if (this->unk_1DC >= (this->unk_1D8->count - 2)) {
+ if (func_80B3B648(this, this->path, this->unk_1DC) != 0) {
+ if (this->unk_1DC >= (this->path->count - 2)) {
this->actionFunc = func_80B3AE60;
this->actor.speed = 0.0f;
} else {
@@ -204,7 +204,7 @@ void func_80B3B120(EnGg2* this, PlayState* play) {
void func_80B3B21C(EnGg2* this, PlayState* play) {
this->actor.speed = 0.0f;
if ((this->actor.xzDistToPlayer < 100.0f) && CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
- this->unk_2E4 = ActorCutscene_GetAdditionalCutscene(this->unk_2E4);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
this->actionFunc = func_80B3B5D4;
}
}
@@ -227,15 +227,15 @@ void func_80B3B294(EnGg2* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_20_10);
}
- if (this->unk_1D8 != NULL) {
- func_80B3B7E4(this->unk_1D8, this->unk_1DC, &this->actor.world.pos, &sp30);
+ if (this->path != NULL) {
+ func_80B3B7E4(this->path, this->unk_1DC, &this->actor.world.pos, &sp30);
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
Math_SmoothStepToS(&this->actor.shape.rot.x, sp30.x, 4, 0x3E8, 1);
this->actor.world.rot.x = -this->actor.shape.rot.x;
- if (func_80B3B648(this, this->unk_1D8, this->unk_1DC)) {
- if (this->unk_1DC < (this->unk_1D8->count - 1)) {
+ if (func_80B3B648(this, this->path, this->unk_1DC)) {
+ if (this->unk_1DC < (this->path->count - 1)) {
this->unk_1DC++;
} else {
this->unk_2F1 = 1;
@@ -274,14 +274,14 @@ void func_80B3B4B0(EnGg2* this, PlayState* play) {
}
void func_80B3B5D4(EnGg2* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_2E4)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2E4, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->actionFunc = func_80B3AE60;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_2E4);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -310,7 +310,7 @@ s32 func_80B3B648(EnGg2* this, Path* path, s32 arg2_) {
phi_f14 = points[arg2 + 1].z - points[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -369,14 +369,14 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) {
this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
SkelAnime_InitFlex(play, &this->skelAnime, &object_gg_Skel_00F6C0, &object_gg_Anim_00F578, this->jointTable,
this->morphTable, 20);
- this->unk_1D8 = SubS_GetPathByIndex(play, ENGG2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENGG2_GET_PATH_INDEX(&this->actor), ENGG2_PATH_INDEX_NONE);
this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
this->unk_2F0 = 0;
this->unk_2F1 = 0;
this->unk_2F2 = 0;
this->unk_2F4 = 0;
this->unk_2F6 = 0;
- this->unk_2E4 = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->unk_2EC = 20;
this->unk_2EA = 0;
@@ -479,7 +479,7 @@ void EnGg2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS) || (this->unk_2F0 == 1)) {
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B3C0AC[this->unk_2EA]));
diff --git a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
index f91310775..83b4bad42 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
@@ -7,21 +7,23 @@ struct EnGg2;
typedef void (*EnGg2ActionFunc)(struct EnGg2*, PlayState*);
-#define ENGG2_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENGG2_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENGG2_PATH_INDEX_NONE 0x3F
typedef struct EnGg2 {
/* 0x000 */ Actor actor;
/* 0x144 */ UNK_TYPE1 unk144[0x4C];
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnGg2ActionFunc actionFunc;
- /* 0x1D8 */ Path* unk_1D8;
+ /* 0x1D8 */ Path* path;
/* 0x1DC */ s32 unk_1DC;
/* 0x1E0 */ Vec3s unk_1E0;
/* 0x1E6 */ Vec3s unk_1E6;
/* 0x1EC */ Vec3s jointTable[20];
/* 0x264 */ Vec3s morphTable[20];
/* 0x2DC */ UNK_TYPE1 unk2DC[0x8];
- /* 0x2E4 */ s16 unk_2E4;
+ /* 0x2E4 */ s16 csId;
/* 0x2E6 */ UNK_TYPE1 unk2E6[4];
/* 0x2EA */ s16 unk_2EA;
/* 0x2EC */ s16 unk_2EC;
diff --git a/src/overlays/actors/ovl_En_Giant/z_en_giant.c b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
index 078c136b9..29f7059a5 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
@@ -51,26 +51,26 @@ typedef enum {
} GiantAnimation;
/**
- * Used as values for csAction. The UNKNOWN ones are never used in-game.
+ * Used as values for cueId. The UNKNOWN ones are never used in-game.
*/
typedef enum {
- /* 0 */ GIANT_CS_ACTION_NONE,
- /* 1 */ GIANT_CS_ACTION_IDLE,
- /* 2 */ GIANT_CS_ACTION_WALKING,
- /* 3 */ GIANT_CS_ACTION_LOOKING_UP,
- /* 4 */ GIANT_CS_ACTION_RAISING_ARMS,
- /* 5 */ GIANT_CS_ACTION_STRUGGLING,
- /* 6 */ GIANT_CS_ACTION_FALLING_OVER,
- /* 7 */ GIANT_CS_ACTION_IDLE_FADE_IN,
- /* 8 */ GIANT_CS_ACTION_TALKING,
- /* 9 */ GIANT_CS_ACTION_DONE_TALKING,
- /* 10 */ GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER,
- /* 11 */ GIANT_CS_ACTION_PLAYER_LEARNED_OATH_TO_ORDER,
- /* 12 */ GIANT_CS_ACTION_UNKNOWN_12,
- /* 13 */ GIANT_CS_ACTION_UNKNOWN_13,
- /* 14 */ GIANT_CS_ACTION_UNKNOWN_14,
- /* 15 */ GIANT_CS_ACTION_HOLDING_UP_MOON_IN_CLOCK_TOWER
-} GiantCsActionIndex;
+ /* 0 */ GIANT_CUE_ID_NONE,
+ /* 1 */ GIANT_CUE_ID_IDLE,
+ /* 2 */ GIANT_CUE_ID_WALKING,
+ /* 3 */ GIANT_CUE_ID_LOOKING_UP,
+ /* 4 */ GIANT_CUE_ID_RAISING_ARMS,
+ /* 5 */ GIANT_CUE_ID_STRUGGLING,
+ /* 6 */ GIANT_CUE_ID_FALLING_OVER,
+ /* 7 */ GIANT_CUE_ID_IDLE_FADE_IN,
+ /* 8 */ GIANT_CUE_ID_TALKING,
+ /* 9 */ GIANT_CUE_ID_DONE_TALKING,
+ /* 10 */ GIANT_CUE_ID_TEACHING_OATH_TO_ORDER,
+ /* 11 */ GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER,
+ /* 12 */ GIANT_CUE_ID_UNKNOWN_12,
+ /* 13 */ GIANT_CUE_ID_UNKNOWN_13,
+ /* 14 */ GIANT_CUE_ID_UNKNOWN_14,
+ /* 15 */ GIANT_CUE_ID_HOLDING_UP_MOON_IN_CLOCK_TOWER
+} GiantCueId;
ActorInit En_Giant_InitVars = {
ACTOR_EN_GIANT,
@@ -114,6 +114,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_MOUNTAIN_TERMINA_FIELD:
case GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_MOUNTAIN_GIANTS_CHAMBER_AND_ENDING:
@@ -122,6 +123,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_OCEAN_TERMINA_FIELD:
case GIANT_TYPE_OCEAN_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_OCEAN_GIANTS_CHAMBER_AND_ENDING:
@@ -130,6 +132,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_CANYON_TERMINA_FIELD:
case GIANT_TYPE_CANYON_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_CANYON_GIANTS_CHAMBER_AND_ENDING:
@@ -138,6 +141,9 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
@@ -154,31 +160,35 @@ void EnGiant_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gGiantSkel, &gGiantLargeStrideAnim, this->jointTable, this->morphTable,
GIANT_LIMB_MAX);
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
- this->csAction = GIANT_CS_ACTION_NONE;
+ this->cueId = GIANT_CUE_ID_NONE;
this->actionFunc = EnGiant_PerformCutsceneActions;
this->actor.draw = NULL;
this->alpha = 0;
this->actor.velocity.y = -10.0f;
this->actor.terminalVelocity = -10.0f;
this->actor.gravity = -5.0f;
+
switch (type) {
case GIANT_TYPE_CANYON_TERMINA_FIELD:
case GIANT_TYPE_CANYON_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_CANYON_GIANTS_CHAMBER_AND_ENDING:
- this->actorActionCommand = 454;
+ this->cueType = CS_CMD_ACTOR_CUE_454;
break;
+
case GIANT_TYPE_SWAMP_TERMINA_FIELD:
case GIANT_TYPE_SWAMP_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_SWAMP_GIANTS_CHAMBER_AND_ENDING:
- this->actorActionCommand = 455;
+ this->cueType = CS_CMD_ACTOR_CUE_455;
break;
+
case GIANT_TYPE_OCEAN_TERMINA_FIELD:
case GIANT_TYPE_OCEAN_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_OCEAN_GIANTS_CHAMBER_AND_ENDING:
- this->actorActionCommand = 456;
+ this->cueType = CS_CMD_ACTOR_CUE_456;
break;
+
default:
- this->actorActionCommand = 453;
+ this->cueType = CS_CMD_ACTOR_CUE_453;
break;
}
@@ -188,7 +198,7 @@ void EnGiant_Init(Actor* thisx, PlayState* play) {
return;
}
- this->actorActionCommand = 0x1C5;
+ this->cueType = CS_CMD_ACTOR_CUE_453;
Actor_SetScale(&this->actor, 0.32f);
this->actionFunc = EnGiant_PerformClockTowerSuccessActions;
Animation_Change(&this->skelAnime, &gGiantRaisedArmsStartAnim, 0.0f,
@@ -225,11 +235,13 @@ void EnGiant_Init(Actor* thisx, PlayState* play) {
case 10:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE2 - SFX_FLAG;
break;
+
case 1:
case 2:
case 3:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE1 - SFX_FLAG;
break;
+
default:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE0 - SFX_FLAG;
break;
@@ -259,65 +271,80 @@ void EnGiant_ChangeToStartOrLoopAnimation(EnGiant* this, s16 requestedAnimIndex)
}
/**
- * Immediately switches to the specified animation for this cutscene action.
+ * Immediately switches to the specified animation for this cueId.
*/
-void EnGiant_ChangeAnimBasedOnCsAction(EnGiant* this) {
- switch (this->csAction) {
- case GIANT_CS_ACTION_IDLE:
+void EnGiant_ChangeAnimBasedOnCueId(EnGiant* this) {
+ switch (this->cueId) {
+ case GIANT_CUE_ID_IDLE:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_WALKING:
+
+ case GIANT_CUE_ID_WALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP);
break;
- case GIANT_CS_ACTION_STRUGGLING:
+
+ case GIANT_CUE_ID_STRUGGLING:
EnGiant_ChangeAnim(this, GIANT_ANIM_STRUGGLE_START);
break;
- case GIANT_CS_ACTION_FALLING_OVER:
+
+ case GIANT_CUE_ID_FALLING_OVER:
EnGiant_ChangeAnim(this, GIANT_ANIM_FALLING_OVER);
break;
- case GIANT_CS_ACTION_IDLE_FADE_IN:
+
+ case GIANT_CUE_ID_IDLE_FADE_IN:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
this->alpha = 0;
break;
- case GIANT_CS_ACTION_TALKING:
+
+ case GIANT_CUE_ID_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_START);
break;
- case GIANT_CS_ACTION_DONE_TALKING:
+
+ case GIANT_CUE_ID_DONE_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_END);
break;
- case GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER:
+
+ case GIANT_CUE_ID_TEACHING_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_START);
break;
- case GIANT_CS_ACTION_PLAYER_LEARNED_OATH_TO_ORDER:
+
+ case GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_END);
break;
- case GIANT_CS_ACTION_UNKNOWN_12:
+
+ case GIANT_CUE_ID_UNKNOWN_12:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_UNKNOWN_13:
+
+ case GIANT_CUE_ID_UNKNOWN_13:
EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP);
break;
- case GIANT_CS_ACTION_UNKNOWN_14:
+
+ case GIANT_CUE_ID_UNKNOWN_14:
if (this->animIndex != GIANT_ANIM_WALKING_LOOP) {
EnGiant_ChangeAnim(this, GIANT_ANIM_WALKING_LOOP);
}
break;
- case GIANT_CS_ACTION_HOLDING_UP_MOON_IN_CLOCK_TOWER:
+
+ case GIANT_CUE_ID_HOLDING_UP_MOON_IN_CLOCK_TOWER:
Animation_Change(&this->skelAnime, &gGiantRaisedArmsStartAnim, 0.0f,
Animation_GetLastFrame(&gGiantRaisedArmsStartAnim) - 1.0f,
Animation_GetLastFrame(&gGiantRaisedArmsStartAnim), ANIMMODE_ONCE, 0.0f);
break;
+
+ default:
+ break;
}
}
void EnGiant_UpdateAlpha(EnGiant* this) {
- switch (this->csAction) {
- case GIANT_CS_ACTION_FALLING_OVER:
+ switch (this->cueId) {
+ case GIANT_CUE_ID_FALLING_OVER:
if (this->skelAnime.curFrame >= 90.0f && this->alpha > 0) {
this->alpha -= 12;
}
break;
- case GIANT_CS_ACTION_UNKNOWN_14:
+ case GIANT_CUE_ID_UNKNOWN_14:
this->alpha -= 12;
break;
default:
@@ -336,82 +363,89 @@ void EnGiant_UpdateAlpha(EnGiant* this) {
*/
void EnGiant_PlayAndUpdateAnimation(EnGiant* this) {
if (SkelAnime_Update(&this->skelAnime) &&
- (this->animIndex != GIANT_ANIM_FALLING_OVER || this->csAction != GIANT_CS_ACTION_FALLING_OVER)) {
+ (this->animIndex != GIANT_ANIM_FALLING_OVER || this->cueId != GIANT_CUE_ID_FALLING_OVER)) {
EnGiant_ChangeAnim(this, this->animIndex);
- switch (this->csAction) {
- case GIANT_CS_ACTION_LOOKING_UP:
+ switch (this->cueId) {
+ case GIANT_CUE_ID_LOOKING_UP:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_LOOK_UP_START);
break;
- case GIANT_CS_ACTION_RAISING_ARMS:
+
+ case GIANT_CUE_ID_RAISING_ARMS:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_RAISED_ARMS_START);
break;
- case GIANT_CS_ACTION_STRUGGLING:
+
+ case GIANT_CUE_ID_STRUGGLING:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_STRUGGLE_START);
break;
- case GIANT_CS_ACTION_FALLING_OVER:
+
+ case GIANT_CUE_ID_FALLING_OVER:
// Unused
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_FALLING_OVER);
break;
- case GIANT_CS_ACTION_TALKING:
+
+ case GIANT_CUE_ID_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_LOOP);
break;
- case GIANT_CS_ACTION_DONE_TALKING:
- case GIANT_CS_ACTION_PLAYER_LEARNED_OATH_TO_ORDER:
+
+ case GIANT_CUE_ID_DONE_TALKING:
+ case GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
- case GIANT_CS_ACTION_TEACHING_OATH_TO_ORDER:
+
+ case GIANT_CUE_ID_TEACHING_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_LOOP);
break;
+
+ default:
+ break;
}
SkelAnime_Update(&this->skelAnime);
}
}
void EnGiant_PlaySound(EnGiant* this) {
- if (this->actor.draw != NULL && this->alpha > 0) {
- if (this->animIndex == GIANT_ANIM_WALKING_LOOP &&
+ if ((this->actor.draw != NULL) && (this->alpha > 0)) {
+ if ((this->animIndex == GIANT_ANIM_WALKING_LOOP) &&
(Animation_OnFrame(&this->skelAnime, 40.0f) || Animation_OnFrame(&this->skelAnime, 100.0f))) {
Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_WALK);
}
- if (this->animIndex == GIANT_ANIM_FALLING_OVER && Animation_OnFrame(&this->skelAnime, 40.0f)) {
+ if ((this->animIndex == GIANT_ANIM_FALLING_OVER) && Animation_OnFrame(&this->skelAnime, 40.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_VOICE_FAIL);
}
- if (this->sfxId != 0xFFFF &&
- ((this->animIndex == GIANT_ANIM_BIG_CALL_START && this->skelAnime.curFrame >= 18.0f) ||
- this->animIndex == GIANT_ANIM_BIG_CALL_LOOP)) {
+ if ((this->sfxId != 0xFFFF) &&
+ (((this->animIndex == GIANT_ANIM_BIG_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_BIG_CALL_LOOP))) {
func_800B9010(&this->actor, this->sfxId);
}
- if ((this->animIndex == GIANT_ANIM_SMALL_CALL_START && this->skelAnime.curFrame >= 18.0f) ||
- this->animIndex == GIANT_ANIM_SMALL_CALL_LOOP) {
+ if (((this->animIndex == GIANT_ANIM_SMALL_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_SMALL_CALL_LOOP)) {
func_800B9010(&this->actor, NA_SE_EV_KYOJIN_SIGN - SFX_FLAG);
}
}
}
-void EnGiant_UpdatePosition(EnGiant* this, PlayState* play, u32 actionIndex) {
- CsCmdActorAction* actorAction = play->csCtx.actorActions[actionIndex];
- f32 startPosY = actorAction->startPos.y;
+void EnGiant_UpdatePosition(EnGiant* this, PlayState* play, u32 cueChannel) {
+ CsCmdActorCue* cue = play->csCtx.actorCues[cueChannel];
+ f32 startPosY = cue->startPos.y;
s32 pad[2];
- f32 endPosY = actorAction->endPos.y;
- f32 scale = Environment_LerpWeight(actorAction->endFrame, actorAction->startFrame, play->csCtx.frames);
+ f32 endPosY = cue->endPos.y;
+ f32 scale = Environment_LerpWeight(cue->endFrame, cue->startFrame, play->csCtx.curFrame);
this->actor.world.pos.y = ((endPosY - startPosY) * scale) + startPosY;
}
void EnGiant_PerformClockTowerSuccessActions(EnGiant* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, this->actorActionCommand)) {
- EnGiant_UpdatePosition(this, play, Cutscene_GetActorActionIndex(play, this->actorActionCommand));
- if (this->csAction !=
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCommand)]->action) {
- this->csAction =
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCommand)]->action;
- EnGiant_ChangeAnimBasedOnCsAction(this);
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ EnGiant_UpdatePosition(this, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ EnGiant_ChangeAnimBasedOnCueId(this);
}
EnGiant_UpdateAlpha(this);
}
EnGiant_PlaySound(this);
- if (this->csAction == GIANT_CS_ACTION_STRUGGLING) {
+ if (this->cueId == GIANT_CUE_ID_STRUGGLING) {
func_800B9010(&this->actor, NA_SE_IT_KYOJIN_BEARING - SFX_FLAG);
}
EnGiant_PlayAndUpdateAnimation(this);
@@ -424,13 +458,11 @@ void EnGiant_PlayClockTowerFailureAnimation(EnGiant* this, PlayState* play) {
void EnGiant_PerformCutsceneActions(EnGiant* this, PlayState* play) {
this->actor.draw = EnGiant_Draw;
- if (Cutscene_CheckActorAction(play, this->actorActionCommand)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCommand));
- if (this->csAction !=
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCommand)]->action) {
- this->csAction =
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCommand)]->action;
- EnGiant_ChangeAnimBasedOnCsAction(this);
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ EnGiant_ChangeAnimBasedOnCueId(this);
}
EnGiant_UpdateAlpha(this);
}
@@ -449,7 +481,7 @@ void EnGiant_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->blinkTimer == 0) {
blinkTimerTemp = 0;
@@ -494,7 +526,7 @@ void EnGiant_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->alpha >= 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sFaceTextures[this->faceIndex]));
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
Scene_SetRenderModeXlu(play, 0, 1);
@@ -502,10 +534,10 @@ void EnGiant_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, NULL, EnGiant_PostLimbDrawOpa, thisx);
} else if (this->alpha > 0) {
if (this->alpha >= 129) {
- func_8012C2B4(POLY_XLU_DISP++);
+ Gfx_SetupDL71(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
}
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sFaceTextures[this->faceIndex]));
diff --git a/src/overlays/actors/ovl_En_Giant/z_en_giant.h b/src/overlays/actors/ovl_En_Giant/z_en_giant.h
index 9ce182a98..5842a62da 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.h
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.h
@@ -35,7 +35,7 @@ typedef enum {
/* 12 */ GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE,
/* 13 */ GIANT_TYPE_CANYON_CLOCK_TOWER_FAILURE,
/* 14 */ GIANT_TYPE_SWAMP_CLOCK_TOWER_FAILURE,
- /* 15 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE,
+ /* 15 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE
} GiantType;
struct EnGiant;
@@ -48,8 +48,8 @@ typedef struct EnGiant {
/* 0x188 */ Vec3s jointTable[GIANT_LIMB_MAX];
/* 0x1E8 */ Vec3s morphTable[GIANT_LIMB_MAX];
/* 0x248 */ s16 animIndex;
- /* 0x24A */ u16 actorActionCommand;
- /* 0x24C */ u16 csAction;
+ /* 0x24A */ u16 cueType;
+ /* 0x24C */ u16 cueId;
/* 0x24E */ s16 alpha;
/* 0x250 */ u16 sfxId;
/* 0x254 */ MtxF headDrawMtxF;
diff --git a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c
index 350ce734c..b40c2287a 100644
--- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c
+++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c
@@ -47,7 +47,7 @@ typedef enum {
/* 1 */ GINKO_ANIM_SITTING,
/* 2 */ GINKO_ANIM_REACHING,
/* 3 */ GINKO_ANIM_AMAZED,
- /* 4 */ GINKO_ANIM_ADVERTISING,
+ /* 4 */ GINKO_ANIM_ADVERTISING
} GinkoAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -89,7 +89,7 @@ void EnGinkoMan_Idle(EnGinkoMan* this, PlayState* play) {
EnGinkoMan_SwitchAnimation(this, play);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) == 0) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
Message_StartTextbox(play, 0x44C, &this->actor);
this->curTextId = 0x44C; // would you like to make an account
@@ -153,7 +153,7 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
}
- play->msgCtx.bankRupees = gSaveContext.save.bankRupees & 0xFFFF;
+ play->msgCtx.bankRupees = gSaveContext.save.saveInfo.bankRupees & 0xFFFF;
Message_StartTextbox(play, 0x45A, &this->actor);
this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
}
@@ -164,22 +164,22 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
this->curTextId = 0x44E; //" ...So, what'll it be? Deposit Rupees Don't deposit Rupees"
break;
case 0x45A: // "All right, little guy, now I've got a total of [rupees] from you!"
- if (((gSaveContext.save.bankRupees & 0xFFFF) >= 200) && (this->previousBankValue < 200) &&
+ if (((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) >= 200) && (this->previousBankValue < 200) &&
!CHECK_WEEKEVENTREG(WEEKEVENTREG_59_40)) {
SET_WEEKEVENTREG(WEEKEVENTREG_59_40);
Message_StartTextbox(play, 0x45B, &this->actor);
this->curTextId = 0x45B; // "What's this? You've already saved up 200 Rupees!?!
- } else if (((gSaveContext.save.bankRupees & 0xFFFF) >= 1000) && ((this->previousBankValue) < 1000) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_80)) {
+ } else if (((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) >= 1000) &&
+ ((this->previousBankValue) < 1000) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_80)) {
SET_WEEKEVENTREG(WEEKEVENTREG_59_80);
Message_StartTextbox(play, 0x45C, &this->actor);
this->curTextId = 0x45C; // "What's this? You've already saved up 1000 Rupees!?!
- } else if ((gSaveContext.save.bankRupees & 0xFFFF) >= 5000) {
+ } else if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) >= 5000) {
if ((this->previousBankValue < 5000) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_60_01)) {
SET_WEEKEVENTREG(WEEKEVENTREG_60_01);
Message_StartTextbox(play, 0x45D, &this->actor);
this->curTextId = 0x45D; // "What's this? You've already saved up 5000 Rupees?!
- } else if (this->previousBankValue < (s16)(gSaveContext.save.bankRupees & 0xFFFF)) {
+ } else if (this->previousBankValue < (s16)(gSaveContext.save.saveInfo.bankRupees & 0xFFFF)) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x45E, &this->actor);
this->curTextId =
@@ -221,7 +221,7 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
break;
case 0x465: // "There! Now I'll know you when I see you!"
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
- play->msgCtx.bankRupees = gSaveContext.save.bankRupees & 0xFFFF;
+ play->msgCtx.bankRupees = gSaveContext.save.saveInfo.bankRupees & 0xFFFF;
Message_StartTextbox(play, 0x45A, &this->actor);
this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
break;
@@ -237,10 +237,10 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
case 0x46C: // "Ah, yes...[Link], right? If I remember, you're the little guy who deposited [rupees]."
case 0x47E: // "Your deposits total [rupees]."
if (this->choiceDepositWithdrawl == GINKOMAN_CHOICE_DEPOSIT) {
- if ((u32)(gSaveContext.save.bankRupees & 0xFFFF) >= 5000) {
+ if ((u32)(gSaveContext.save.saveInfo.bankRupees & 0xFFFF) >= 5000) {
Message_StartTextbox(play, 0x45F, &this->actor);
this->curTextId = 0x45F; // "Excuuuse me! But I can't take anymore deposits!
- } else if (gSaveContext.save.playerData.rupees == 0) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees == 0) {
Message_StartTextbox(play, 0x458, &this->actor);
this->curTextId =
0x458; // "Hmm...You play mean jokes, little guy! You haven't even got a single Rupee!
@@ -288,12 +288,12 @@ void EnGinkoMan_DepositDialogue(EnGinkoMan* this, PlayState* play) {
case 0x473: // Use it wisely...
case 0x474: // "Aw, you're taking out all that? If you spend it like that, it'll all be gone before you know
// it!"
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) == 0) {
Message_StartTextbox(play, 0x478, &this->actor);
// "Look, little guy, all the Rupees you deposited are gone, so you can't use that stamp anymore."
this->curTextId = 0x478;
} else {
- play->msgCtx.bankRupees = gSaveContext.save.bankRupees & 0xFFFF;
+ play->msgCtx.bankRupees = gSaveContext.save.saveInfo.bankRupees & 0xFFFF;
Message_StartTextbox(play, 0x45A, &this->actor);
this->curTextId = 0x45A; // "All right, little guy, now I've got a total of [rupees] from you!"
}
@@ -319,12 +319,12 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
switch (this->curTextId) {
case 0x44E: // "...So, what'll it be?
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if ((gSaveContext.save.bankRupees & 0xFFFF) >= 5000) {
+ if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) >= 5000) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x45F, &this->actor);
this->curTextId = 0x45F; // bank full, cannot accept more
} else {
- if (gSaveContext.save.playerData.rupees > 0) {
+ if (gSaveContext.save.saveInfo.playerData.rupees > 0) {
func_8019F208();
Message_StartTextbox(play, 0x44F, &this->actor);
this->curTextId = 0x44F; // "All right! so..."
@@ -342,7 +342,7 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
break;
case 0x452: // Really? are you really depositing rupees?
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if (gSaveContext.save.playerData.rupees < play->msgCtx.bankRupeesSelected) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.bankRupeesSelected) {
play_sound(NA_SE_SY_ERROR);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
Message_StartTextbox(play, 0x459, &this->actor);
@@ -361,20 +361,20 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
this->curTextId = 0x453; // That's it? That aint nothing at all
}
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) == 0) {
this->isNewAccount = true;
}
Rupees_ChangeBy(-play->msgCtx.bankRupeesSelected);
- this->previousBankValue = gSaveContext.save.bankRupees & 0xFFFF;
- gSaveContext.save.bankRupees =
- ((gSaveContext.save.bankRupees & 0xFFFF) + play->msgCtx.bankRupeesSelected) |
- (gSaveContext.save.bankRupees & 0xFFFF0000);
+ this->previousBankValue = gSaveContext.save.saveInfo.bankRupees & 0xFFFF;
+ gSaveContext.save.saveInfo.bankRupees =
+ ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) + play->msgCtx.bankRupeesSelected) |
+ (gSaveContext.save.saveInfo.bankRupees & 0xFFFF0000);
}
} else { // GINKOMAN_CHOICE_NO
func_8019F230();
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
- if ((gSaveContext.save.bankRupees & 0xFFFF) == 0) {
+ if ((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) == 0) {
Message_StartTextbox(play, 0x456, &this->actor);
this->curTextId = 0x456; // Is that so? think about it
} else {
@@ -403,14 +403,14 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
break;
case 0x471: // Are you really withdrawling [selected rupees]?
if (play->msgCtx.choiceIndex == GINKOMAN_CHOICE_YES) {
- if ((s32)((gSaveContext.save.bankRupees & 0xFFFF)) <
+ if ((s32)((gSaveContext.save.saveInfo.bankRupees & 0xFFFF)) <
((s32)(play->msgCtx.bankRupeesSelected + this->serviceFee))) {
play_sound(NA_SE_SY_ERROR);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_LEGSMACKING);
Message_StartTextbox(play, 0x476, &this->actor);
this->curTextId = 0x476; // you dont have enough deposited to withdrawl
} else if (CUR_CAPACITY(UPG_WALLET) <
- (play->msgCtx.bankRupeesSelected + gSaveContext.save.playerData.rupees)) {
+ (play->msgCtx.bankRupeesSelected + gSaveContext.save.saveInfo.playerData.rupees)) {
// check if wallet is big enough
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x475, &this->actor);
@@ -428,11 +428,11 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, PlayState* play) {
this->curTextId = 0x472; // It's a waste to take out such a tiny bit
}
- this->previousBankValue = (s16)(gSaveContext.save.bankRupees & 0xFFFF);
- gSaveContext.save.bankRupees =
- (((gSaveContext.save.bankRupees & 0xFFFF) - play->msgCtx.bankRupeesSelected) -
+ this->previousBankValue = (s16)(gSaveContext.save.saveInfo.bankRupees & 0xFFFF);
+ gSaveContext.save.saveInfo.bankRupees =
+ (((gSaveContext.save.saveInfo.bankRupees & 0xFFFF) - play->msgCtx.bankRupeesSelected) -
this->serviceFee) |
- (gSaveContext.save.bankRupees & 0xFFFF0000);
+ (gSaveContext.save.saveInfo.bankRupees & 0xFFFF0000);
Rupees_ChangeBy(play->msgCtx.bankRupeesSelected);
}
} else {
@@ -591,7 +591,7 @@ void EnGinkoMan_Stamp(EnGinkoMan* this, PlayState* play) {
break;
case 0x469: // "Excuse me, but let me take a look at you..."
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, GINKO_ANIM_SITTING);
- play->msgCtx.bankRupees = (gSaveContext.save.bankRupees & 0xFFFF);
+ play->msgCtx.bankRupees = (gSaveContext.save.saveInfo.bankRupees & 0xFFFF);
if ((CURRENT_DAY == 3) && (gSaveContext.save.isNight == true)) {
Message_StartTextbox(play, 0x46C, &this->actor);
this->curTextId = 0x46C; // "Ah, yes...[Link], right?
@@ -668,7 +668,7 @@ void EnGinkoMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 50, 80, 0, 0));
diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
index 28267a485..1859cf83f 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
@@ -188,7 +188,7 @@ s32 EnGirlA_CanBuyPotionRed(PlayState* play, EnGirlA* this) {
if (!Inventory_HasEmptyBottle()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -198,7 +198,7 @@ s32 EnGirlA_CanBuyPotionGreen(PlayState* play, EnGirlA* this) {
if (!Inventory_HasEmptyBottle()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -214,7 +214,7 @@ s32 EnGirlA_CanBuyPotionBlue(PlayState* play, EnGirlA* this) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_53_10)) {
return CANBUY_RESULT_SUCCESS_2;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -227,17 +227,17 @@ s32 EnGirlA_CanBuyArrows(PlayState* play, EnGirlA* this) {
if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) {
return CANBUY_RESULT_NO_ROOM_2;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
}
s32 EnGirlA_CanBuyNuts(PlayState* play, EnGirlA* this) {
- if (CUR_CAPACITY(UPG_NUTS) != 0 && CUR_CAPACITY(UPG_NUTS) <= AMMO(ITEM_NUT)) {
+ if ((CUR_CAPACITY(UPG_NUTS) != 0) && (CUR_CAPACITY(UPG_NUTS) <= AMMO(ITEM_NUT))) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (Item_CheckObtainability(ITEM_NUT) == ITEM_NONE) {
@@ -250,17 +250,17 @@ s32 EnGirlA_CanBuyShieldHero(PlayState* play, EnGirlA* this) {
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
}
s32 EnGirlA_CanBuyStick(PlayState* play, EnGirlA* this) {
- if (CUR_CAPACITY(UPG_STICKS) != 0 && AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS)) {
+ if ((CUR_CAPACITY(UPG_STICKS) != 0) && (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS))) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (Item_CheckObtainability(ITEM_STICK) == ITEM_NONE) {
@@ -270,7 +270,7 @@ s32 EnGirlA_CanBuyStick(PlayState* play, EnGirlA* this) {
}
s32 EnGirlA_CanBuyMaskAllNight(PlayState* play, EnGirlA* this) {
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -280,7 +280,7 @@ s32 EnGirlA_CanBuyBombBagCuriosityShop(PlayState* play, EnGirlA* this) {
if (GET_CUR_UPG_VALUE(UPG_BOMB_BAG) >= 2) {
return CANBUY_RESULT_CANNOT_GET_NOW;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -293,7 +293,7 @@ s32 EnGirlA_CanBuyBombBag20BombShop(PlayState* play, EnGirlA* this) {
if (GET_CUR_UPG_VALUE(UPG_BOMB_BAG) >= 2) {
return CANBUY_RESULT_HAVE_BETTER;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
@@ -306,7 +306,7 @@ s32 EnGirlA_CanBuyBombBag30BombShop(PlayState* play, EnGirlA* this) {
if (GET_CUR_UPG_VALUE(UPG_BOMB_BAG) == 3) {
return CANBUY_RESULT_HAVE_BETTER;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
@@ -319,7 +319,7 @@ s32 EnGirlA_CanBuyBombchus(PlayState* play, EnGirlA* this) {
if (AMMO(ITEM_BOMBCHU) >= CUR_CAPACITY(UPG_BOMB_BAG)) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (Item_CheckObtainability(ITEM_BOMBCHU) == ITEM_NONE) {
@@ -335,21 +335,21 @@ s32 EnGirlA_CanBuyBombs(PlayState* play, EnGirlA* this) {
if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
}
s32 EnGirlA_CanBuyBottleStolen(PlayState* play, EnGirlA* this) {
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
}
s32 EnGirlA_CanBuySword(PlayState* play, EnGirlA* this) {
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
@@ -359,7 +359,7 @@ s32 EnGirlA_CanBuyShieldMirror(PlayState* play, EnGirlA* this) {
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE) {
return CANBUY_RESULT_NO_ROOM;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_1;
@@ -369,7 +369,7 @@ s32 EnGirlA_CanBuyFairy(PlayState* play, EnGirlA* this) {
if (!Inventory_HasEmptyBottle()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_2;
@@ -385,18 +385,24 @@ void EnGirlA_BuyBottleItem(PlayState* play, EnGirlA* this) {
case SI_POTION_RED_6:
Item_Give(play, ITEM_POTION_RED);
break;
+
case SI_POTION_GREEN_1:
case SI_POTION_GREEN_2:
case SI_POTION_GREEN_3:
Item_Give(play, ITEM_POTION_GREEN);
break;
+
case SI_POTION_BLUE:
Item_Give(play, ITEM_POTION_BLUE);
break;
+
case SI_FAIRY_1:
case SI_FAIRY_2:
Item_Give(play, ITEM_FAIRY);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -411,9 +417,13 @@ void EnGirlA_BuyNuts(PlayState* play, EnGirlA* this) {
case 5:
Item_Give(play, ITEM_NUTS_5);
break;
+
case 10:
Item_Give(play, ITEM_NUTS_10);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -439,12 +449,17 @@ void EnGirlA_BuyBombBag(PlayState* play, EnGirlA* this) {
case 20:
Item_Give(play, ITEM_BOMB_BAG_20);
break;
+
case 21:
Item_Give(play, ITEM_BOMB_BAG_30);
break;
+
case 22:
Item_Give(play, ITEM_BOMB_BAG_40);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -461,15 +476,21 @@ void EnGirlA_BuyBombs(PlayState* play, EnGirlA* this) {
case 5:
Item_Give(play, ITEM_BOMBS_5);
break;
+
case 10:
Item_Give(play, ITEM_BOMBS_10);
break;
+
case 20:
Item_Give(play, ITEM_BOMBS_20);
break;
+
case 30:
Item_Give(play, ITEM_BOMBS_30);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -484,15 +505,21 @@ void EnGirlA_BuySword(PlayState* play, EnGirlA* this) {
case 1:
Item_Give(play, ITEM_SWORD_KOKIRI);
break;
+
case 2:
Item_Give(play, ITEM_SWORD_RAZOR);
break;
+
case 3:
Item_Give(play, ITEM_SWORD_GILDED);
break;
+
case 4:
Item_Give(play, ITEM_SWORD_GREAT_FAIRY);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
index f61b50b5a..e155ef6df 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
@@ -48,16 +48,16 @@ typedef struct EnGirlA {
} EnGirlA; // size = 0x1CC
typedef enum {
- /* 0x0 */ CANBUY_RESULT_SUCCESS_1,
- /* 0x1 */ CANBUY_RESULT_SUCCESS_2,
- /* 0x2 */ CANBUY_RESULT_NO_ROOM,
- /* 0x3 */ CANBUY_RESULT_NEED_EMPTY_BOTTLE,
- /* 0x4 */ CANBUY_RESULT_NEED_RUPEES,
- /* 0x5 */ CANBUY_RESULT_CANNOT_GET_NOW,
- /* 0x6 */ CANBUY_RESULT_CANNOT_GET_NOW_2,
- /* 0x7 */ CANBUY_RESULT_NO_ROOM_2,
- /* 0x8 */ CANBUY_RESULT_ALREADY_HAVE,
- /* 0x9 */ CANBUY_RESULT_HAVE_BETTER
+ /* 0 */ CANBUY_RESULT_SUCCESS_1,
+ /* 1 */ CANBUY_RESULT_SUCCESS_2,
+ /* 2 */ CANBUY_RESULT_NO_ROOM,
+ /* 3 */ CANBUY_RESULT_NEED_EMPTY_BOTTLE,
+ /* 4 */ CANBUY_RESULT_NEED_RUPEES,
+ /* 5 */ CANBUY_RESULT_CANNOT_GET_NOW,
+ /* 6 */ CANBUY_RESULT_CANNOT_GET_NOW_2,
+ /* 7 */ CANBUY_RESULT_NO_ROOM_2,
+ /* 8 */ CANBUY_RESULT_ALREADY_HAVE,
+ /* 9 */ CANBUY_RESULT_HAVE_BETTER
} EnGirlACanBuyResult;
typedef enum {
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 3c4ea82f0..1db4d7c5b 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -240,7 +240,8 @@ void func_80B507A0(EnGk* this, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 30.0f, 30.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
}
s32 func_80B50854(EnGk* this, PlayState* play) {
@@ -373,7 +374,7 @@ s32 func_80B50C78(EnGk* this, Path* path, s32 arg2_) {
phi_f14 = sp5C[arg2 + 1].z - sp5C[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -510,19 +511,19 @@ void func_80B51410(EnGk* this, PlayState* play) {
this->unk_1E4 |= 0x20;
}
- if (ActorCutscene_GetCanPlayNext(this->unk_318)) {
+ if (CutsceneManager_IsNext(this->csId)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLONKID_SOB_TALK);
- ActorCutscene_Start(this->unk_318, &this->actor);
+ CutsceneManager_Start(this->csId, &this->actor);
this->unk_1E4 &= ~0x20;
return;
}
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
if (this->unk_1E4 & 0x20) {
- ActorCutscene_SetIntentToPlay(this->unk_318);
+ CutsceneManager_Queue(this->csId);
}
} else {
this->unk_1E4 &= ~0x20;
@@ -531,16 +532,16 @@ void func_80B51410(EnGk* this, PlayState* play) {
void func_80B51510(EnGk* this, PlayState* play) {
s32 pad;
- s32 actionIndex;
+ s32 cueChannel;
if (this) {}
- if (Cutscene_CheckActorAction(play, 479)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 479);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_479)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_479);
- if (play->csCtx.actorActions[actionIndex]->action != this->unk_31B) {
- this->unk_31B = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->unk_31A = 0;
this->unk_2E4 = 0;
@@ -584,10 +585,10 @@ void func_80B51510(EnGk* this, PlayState* play) {
func_80B51308(this, play);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
this->actor.shape.yOffset = 0.0f;
} else {
- this->unk_31B = 0x63;
+ this->cueId = 99;
}
}
@@ -661,9 +662,9 @@ void func_80B51970(EnGk* this, PlayState* play) {
if (((talkState == TEXT_STATE_DONE) || (talkState == TEXT_STATE_5)) && Message_ShouldAdvance(play)) {
if ((this->unk_31C == 0xE84) || (this->unk_31C == 0xE99)) {
- ActorCutscene_Stop(this->unk_318);
- this->unk_318 = ActorCutscene_GetAdditionalCutscene(this->unk_318);
- ActorCutscene_SetIntentToPlay(this->unk_318);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = func_80B51D9C;
return;
}
@@ -772,8 +773,8 @@ void func_80B51B40(EnGk* this, PlayState* play) {
void func_80B51D9C(EnGk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCanPlayNext(this->unk_318)) {
- ActorCutscene_StartAndSetFlag(this->unk_318, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
if (this->unk_1E4 & 4) {
this->unk_1E4 &= ~4;
this->unk_2E4 = 6;
@@ -790,10 +791,10 @@ void func_80B51D9C(EnGk* this, PlayState* play) {
this->actionFunc = func_80B51970;
}
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_318);
+ CutsceneManager_Queue(this->csId);
}
func_80B50954(this);
}
@@ -809,7 +810,7 @@ void func_80B51EA4(EnGk* this, PlayState* play) {
sp36 = this->actor.shape.rot.y - sp38.y;
if (func_80B50C78(this, this->path, this->unk_1EC)) {
if (this->unk_1EC >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->unk_318);
+ CutsceneManager_Stop(this->csId);
Actor_Kill(&this->actor);
} else {
this->unk_1EC++;
@@ -829,7 +830,7 @@ void func_80B51EA4(EnGk* this, PlayState* play) {
}
void func_80B51FD0(EnGk* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (this->unk_1E4 & 2) {
func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
} else {
@@ -841,7 +842,7 @@ void func_80B51FD0(EnGk* this, PlayState* play) {
void func_80B5202C(EnGk* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (play->csCtx.state == 0) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
func_80B51410(this, play);
}
@@ -859,7 +860,8 @@ void func_80B5202C(EnGk* this, PlayState* play) {
}
if (this->unk_1E4 & 2) {
- if ((play->msgCtx.ocarinaMode != 1) && (play->msgCtx.ocarinaMode != 3) && (play->csCtx.state == 0)) {
+ if ((play->msgCtx.ocarinaMode != 1) && (play->msgCtx.ocarinaMode != 3) &&
+ (play->csCtx.state == CS_STATE_IDLE)) {
func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
}
} else {
@@ -895,7 +897,7 @@ void func_80B5227C(EnGk* this, PlayState* play) {
func_800B14D4(play, 20.0f, &this->actor.home.pos);
this->unk_350 = 60;
if (!(this->unk_1E4 & 0x80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
this->unk_350 = 0x4000;
@@ -953,22 +955,22 @@ void func_80B52430(EnGk* this, PlayState* play) {
}
void func_80B5253C(EnGk* this, PlayState* play) {
- s32 sp24;
+ s32 getItemId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_41_08)) {
- sp24 = 0x93;
+ getItemId = GI_GOLD_DUST_2;
} else {
- sp24 = 0x6A;
+ getItemId = GI_GOLD_DUST;
}
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (sp24 == 0x6A) {
+ if (getItemId == GI_GOLD_DUST) {
SET_WEEKEVENTREG(WEEKEVENTREG_41_08);
}
this->actionFunc = func_80B525E0;
} else {
- Actor_OfferGetItem(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -984,8 +986,8 @@ void func_80B525E0(EnGk* this, PlayState* play) {
void func_80B52654(EnGk* this, PlayState* play) {
this->unk_350 += 0x400;
- if ((this->unk_1E4 & 0x80) && (play->csCtx.frames == 250)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ if ((this->unk_1E4 & 0x80) && (play->csCtx.curFrame == 250)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
this->unk_354 = Math_SinS(this->unk_350) * 0.006f * 0.06f;
@@ -1022,12 +1024,12 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
if (Flags_GetSwitch(play, ENGK_GET_3F00(&this->actor))) {
Actor_Kill(&this->actor);
} else {
- this->unk_318 = this->actor.cutscene;
- this->path = SubS_GetPathByIndex(play, ENGK_GET_F0(&this->actor), 0xF);
+ this->csId = this->actor.csId;
+ this->path = SubS_GetPathByIndex(play, ENGK_GET_PATH_INDEX(&this->actor), ENGK_PATH_INDEX_NONE);
this->actionFunc = func_80B51760;
}
} else if (play->sceneId == SCENE_GORONRACE) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
if (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) {
this->actionFunc = func_80B51760;
} else if (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 2)) {
@@ -1042,7 +1044,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
} else if (ENGK_GET_F(&this->actor) == ENGK_F_2) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFunc = func_80B51FD0;
this->actor.draw = NULL;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1050,9 +1052,9 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
} else {
Actor_Kill(&this->actor);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->unk_2E4 = 0;
- this->unk_318 = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
@@ -1074,7 +1076,7 @@ void EnGk_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((ENGK_GET_F(&this->actor) == ENGK_F_1) ||
- ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
func_80B507A0(this, play);
SkelAnime_Update(&this->skelAnime);
Actor_TrackPlayer(play, &this->actor, &this->unk_1D8, &this->unk_1DE, this->actor.focus.pos);
@@ -1231,16 +1233,16 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
- if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_gk_DL_006688);
gSPDisplayList(POLY_OPA_DISP++, object_gk_DL_006680);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.2f;
@@ -1256,7 +1258,7 @@ void EnGk_Draw(Actor* thisx, PlayState* play) {
EnGk_TransformLimbDraw, &this->actor);
if (ENGK_GET_F(&this->actor) != ENGK_F_2) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->unk_2E4 == 0) || (this->unk_2E4 == 1) || (this->unk_2E4 == 2) || (this->unk_2E4 == 3) ||
(this->unk_2E4 == 4)) {
pos.x = this->actor.world.pos.x - 15.0f;
diff --git a/src/overlays/actors/ovl_En_Gk/z_en_gk.h b/src/overlays/actors/ovl_En_Gk/z_en_gk.h
index bebe6c6c9..130b97675 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.h
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.h
@@ -8,17 +8,19 @@ struct EnGk;
typedef void (*EnGkActionFunc)(struct EnGk*, PlayState*);
#define ENGK_GET_F(thisx) ((thisx)->params & 0xF)
-#define ENGK_GET_F0(thisx) (((thisx)->params & 0xF0) >> 4)
+#define ENGK_GET_PATH_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
#define ENGK_GET_3F00(thisx) (((thisx)->params & 0x3F00) >> 8)
-enum {
+#define ENGK_PATH_INDEX_NONE 0xF
+
+typedef enum {
/* 0 */ ENGK_F_0,
/* 1 */ ENGK_F_1,
/* 2 */ ENGK_F_2,
/* 3 */ ENGK_F_3,
/* 4 */ ENGK_F_4,
- /* 5 */ ENGK_F_5,
-};
+ /* 5 */ ENGK_F_5
+} EnGkParam;
typedef struct EnGk {
/* 0x000 */ Actor actor;
@@ -39,9 +41,9 @@ typedef struct EnGk {
/* 0x2F4 */ Vec3f unk_2F4;
/* 0x300 */ Vec3f unk_300;
/* 0x30C */ Vec3f unk_30C;
- /* 0x318 */ s16 unk_318;
+ /* 0x318 */ s16 csId;
/* 0x31A */ u8 unk_31A;
- /* 0x31B */ u8 unk_31B;
+ /* 0x31B */ u8 cueId;
/* 0x31C */ u16 unk_31C;
/* 0x31E */ s16 unk_31E;
/* 0x320 */ s16 unk_320;
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
index 4c0dd92d9..bcdb20431 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -425,48 +425,48 @@ void func_8094E2D0(EnGm* this) {
}
}
-s32 func_8094E454(EnGm* this, s16 arg1) {
+s32 func_8094E454(EnGm* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(arg1);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_8094E4D0(EnGm* this, s32 arg1) {
+s16 func_8094E4D0(EnGm* this, s32 numCutscenes) {
s32 i;
- s16 cutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
- for (i = 0; i < arg1; i++) {
- cutscene = ActorCutscene_GetAdditionalCutscene(cutscene);
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
- return cutscene;
+ return csId;
}
s32 func_8094E52C(EnGm* this, PlayState* play) {
s32 pad;
- s16 sp2A = func_8094E4D0(this, 0);
+ s16 csId = func_8094E4D0(this, 0);
s32 ret = false;
switch (this->unk_3E0) {
case 0:
- if (!func_8094E454(this, sp2A)) {
+ if (!func_8094E454(this, csId)) {
break;
}
case 2:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_86_40) && (this->unk_3E0 == 2)) {
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
} else {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
}
this->unk_3E0++;
ret = true;
@@ -474,14 +474,15 @@ s32 func_8094E52C(EnGm* this, PlayState* play) {
case 1:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), this->actor.child);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
+ this->actor.child);
}
this->unk_3E0++;
ret = true;
break;
case 3:
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
this->unk_3E0++;
ret = true;
break;
@@ -492,7 +493,7 @@ s32 func_8094E52C(EnGm* this, PlayState* play) {
s32 func_8094E69C(EnGm* this, PlayState* play) {
Camera* subCam;
- s16 sp4A = func_8094E4D0(this, 0);
+ s16 csId = func_8094E4D0(this, 0);
s16 sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -530,10 +531,10 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
break;
case 2:
- if (func_8094E454(this, sp4A)) {
+ if (func_8094E454(this, csId)) {
case 4:
case 6:
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp4A));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId));
Camera_SetTargetActor(subCam, &this->actor);
this->unk_3E0++;
ret = true;
@@ -544,7 +545,7 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
case 5:
case 7:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp4A));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId));
Camera_SetTargetActor(subCam, this->actor.child);
}
this->unk_3E0++;
@@ -553,7 +554,7 @@ s32 func_8094E69C(EnGm* this, PlayState* play) {
case 8:
Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
- ActorCutscene_Stop(sp4A);
+ CutsceneManager_Stop(csId);
this->unk_3E2 = 0;
this->unk_3E0++;
break;
@@ -760,13 +761,13 @@ s32 func_8094EE84(EnGm* this, PlayState* play) {
s32 func_8094EFC4(EnGm* this, PlayState* play) {
s32 ret = false;
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk_3F8 == 0) {
if ((play->sceneId == SCENE_MILK_BAR) && (gSaveContext.sceneLayer == 2)) {
func_8094E054(this, play, 0);
this->unk_258 = 255;
}
- this->unk_259 = 255;
+ this->cueId = 255;
this->unk_3F8 = 1;
}
ret = true;
@@ -972,7 +973,7 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
}
s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 arg3, s16 arg4) {
- u8 sp4F = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -984,7 +985,7 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
actor = func_8094DEE0(this, play, arg3, arg4);
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if ((actor != NULL) && (actor->update != NULL)) {
@@ -1003,7 +1004,7 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -1015,10 +1016,10 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
door = func_8094DF90(play, scheduleOutput->result);
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != NULL) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -1028,7 +1029,7 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->dyna.actor.shape.rot.y)) <= 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->knobDoor.dyna.actor.shape.rot.y)) <= 0x4000) {
this->unk_261 = -75;
} else {
this->unk_261 = 75;
@@ -1050,14 +1051,14 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
this->timePath = NULL;
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -1151,7 +1152,7 @@ s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951D9C = { 64.0f, 0.0f, -122.0f };
- u8 sp4F = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -1161,7 +1162,7 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if (this->timePath != NULL) {
@@ -1449,7 +1450,7 @@ s32 func_80950804(EnGm* this, PlayState* play) {
door = func_8094DF90(play, this->unk_258);
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if ((this->unk_3BA / (f32)this->unk_3B8) <= 0.9f) {
door->unk_1A7 = this->unk_261;
} else {
@@ -1634,20 +1635,20 @@ void func_80950F2C(EnGm* this, PlayState* play) {
s32 pad;
Vec3f sp3C;
Vec3f sp30;
- s32 sp2C;
+ s32 cueId;
s16 yaw;
- if (Cutscene_CheckActorAction(play, 526)) {
- sp2C = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 526)]->action;
- if (this->unk_259 != (sp2C & 0xFF)) {
- if (sp2C == 3) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_526)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_526)]->id;
+ if (this->cueId != (u8)cueId) {
+ if (cueId == 3) {
Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIR_ROLL);
}
- this->unk_259 = sp2C;
- func_8094E054(this, play, sp50[sp2C]);
+ this->cueId = cueId;
+ func_8094E054(this, play, sp50[cueId]);
}
- if ((this->unk_259 == 3) && (this->unk_268 != NULL) && (this->unk_268->update != NULL)) {
+ if ((this->cueId == 3) && (this->unk_268 != NULL) && (this->unk_268->update != NULL)) {
Math_Vec3f_Copy(&sp3C, &player->actor.world.pos);
Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
yaw = Math_Vec3f_Yaw(&sp30, &sp3C);
@@ -1714,7 +1715,7 @@ void EnGm_Update(Actor* thisx, PlayState* play) {
func_8013C964(&this->actor, play, this->unk_3B4, 30.0f, PLAYER_IA_NONE, this->unk_3A4 & 7);
if ((this->unk_258 != 3) && (this->unk_258 != 5) && (this->unk_258 != 8)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
func_8094E1DC(this, play);
}
@@ -1763,7 +1764,7 @@ void EnGm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
Vec3f sp30;
s32 pad2;
- if ((ActorCutscene_GetCurrentIndex() == -1) && (limbIndex == 16)) {
+ if ((CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (limbIndex == 16)) {
Matrix_MultVec3f(&D_80951E24, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
@@ -1831,7 +1832,7 @@ void EnGm_Draw(Actor* thisx, PlayState* play) {
if ((this->unk_258 != 0) && (this->unk_262 >= 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80951E30[this->unk_3CE]));
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.h b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
index 3bed5335a..760c9d91c 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.h
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
@@ -9,7 +9,7 @@ typedef void (*EnGmActionFunc)(struct EnGm*, PlayState*);
typedef s32 (*EnGmUnkFunc)(struct EnGm*, PlayState*);
typedef void (*EnGmUnkFunc2)(struct EnGm*, PlayState*);
-#define ENGM_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define ENGM_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct EnGm {
/* 0x000 */ Actor actor;
@@ -26,7 +26,7 @@ typedef struct EnGm {
/* 0x250 */ s32 timePathWaypoint;
/* 0x254 */ s32 timePathElapsedTime;
/* 0x258 */ u8 unk_258;
- /* 0x259 */ u8 unk_259;
+ /* 0x259 */ u8 cueId;
/* 0x25C */ s32 unk_25C;
/* 0x260 */ s8 unk_260;
/* 0x261 */ s8 unk_261;
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c
index 3f6fee765..216d5c301 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -2,41 +2,208 @@
* File: z_en_go.c
* Overlay: ovl_En_Go
* Description: Goron
+ *
+ * This actor handles multiple (but not all) Gorons. The Gorons included are:
+ * - Athletics Goron: Gorons in the racetrack performing stretches before/after a race.
+ * - Spectator Goron: Gorons scattered throughout the racetrack watching the race.
+ * - Gatekeeper Goron: The Gatekeeper of the Goron Shrine.
+ * - Graveyard Goron: Both Gorons outside the Goron Graveyard (one of which is initially frozen).
+ * - Shrine Goron: Gorons in the Goron Shrine (specifically, one in the elders room, one outside the elder's room, and
+ * one outside the shop, not all Gorons in the Goron Shrine are covered by this actor).
+ * - Medigoron: The Powder Keg making Medigoron in Goron Village.
*/
-
#include "z_en_go.h"
#include "z64quake.h"
-#include "objects/object_oF1d_map/object_oF1d_map.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/object_hakugin_demo/object_hakugin_demo.h"
#include "objects/object_taisou/object_taisou.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+#include "overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
-
#define THIS ((EnGo*)thisx)
+#define ENGO_STANDING_Y_OFFSET 0.0f // Actor shape offset in use when a Goron is in any standing state.
+#define ENGO_ROLLEDUP_Y_OFFSET 14.0f // Actor shape offset in use when a Goron is "rolled up".
+#define ENGO_SNOWBALL_Y_OFFSET 46.0f // Actor shape offset in use when a Goron is in a snowball.
+
+#define ENGO_NORMAL_SCALE 0.01f // "Unit Scale" of a normal Goron.
+#define ENGO_MEDIGORON_SCALE_MULTIPLIER 5.0f // Scale factor for the Medigoron in the Powder Keg Shop.
+
+#define ENGO_POUND_INITIAL_RISE_VEL 10.0f // Velocity at which the Gatekeeper's pound surges into the air.
+#define ENGO_POUND_INITIAL_FALL_VEL -6.0f // Velocity at which the Gatekeeper's pound surges to the ground.
+
+#define ENGO_DUST_STEAM_LIFETIME 16 // Lifetime in frames of the Dust and Steam effects.
+
+#define ENGO_FLAG_ENGAGED (1 << 3)
+#define ENGO_FLAG_FACE_TARGET (1 << 4)
+#define ENGO_FLAG_EYES_OPEN (1 << 5)
+#define ENGO_FLAG_LOST_ATTENTION (1 << 6)
+#define ENGO_FLAG_STANDING (1 << 7)
+#define ENGO_FLAG_SNOWBALLED (1 << 8)
+#define ENGO_FLAG_ROLLED_UP (1 << 9)
+#define ENGO_FLAG_FROZEN (1 << 10)
+#define ENGO_FLAG_HIT_OTHER (1 << 11)
+#define ENGO_FLAG_HIT_BY_OTHER (1 << 12)
+#define ENGO_FLAG_HIT_OBJ (1 << 13)
+#define ENGO_FLAG_ROLLING_UP (1 << 14)
+#define ENGO_FLAG_UNROLLING (1 << 15)
+
void EnGo_Init(Actor* thisx, PlayState* play);
void EnGo_Destroy(Actor* thisx, PlayState* play);
void EnGo_Update(Actor* thisx, PlayState* play);
+void EnGo_Draw(Actor* thisx, PlayState* play);
-void func_80A14798(EnGo* this, PlayState* play);
-void func_80A149B0(EnGo* this, PlayState* play);
-void func_80A14B30(EnGo* this, PlayState* play);
-void func_80A14E14(EnGo* this, PlayState* play);
-void func_80A14E74(EnGo* this, PlayState* play);
-void func_80A14EB0(EnGo* this, PlayState* play);
-void func_80A14FC8(EnGo* this, PlayState* play);
-void func_80A153FC(EnGo* this, PlayState* play);
-void func_80A157C4(EnGo* this, PlayState* play);
-void func_80A15FEC(Actor* thisx, PlayState* play);
+typedef enum EnGoEyeTexture {
+ /* 0 */ ENGO_EYETEX_OPEN,
+ /* 1 */ ENGO_EYETEX_HALF,
+ /* 2 */ ENGO_EYETEX_CLOSED,
+ /* 3 */ ENGO_EYETEX_HALF2,
+ /* 4 */ ENGO_EYETEX_CLOSED2
+} EnGoEyeTexture;
-static s32 D_80A16100[] = {
+typedef enum EnGoSleepState {
+ /* -1 */ ENGO_ASLEEP_NEG = -1,
+ /* 0 */ ENGO_AWAKE,
+ /* 1 */ ENGO_ASLEEP_POS
+} EnGoSleepState;
+
+typedef enum EnGoEffectType {
+ /* 0 */ ENGO_EFFECT_NONE,
+ /* 1 */ ENGO_EFFECT_SNOW1,
+ /* 2 */ ENGO_EFFECT_SNOW2,
+ /* 3 */ ENGO_EFFECT_SNOW3,
+ /* 4 */ ENGO_EFFECT_DUST_MIN,
+ /* 4 */ ENGO_EFFECT_DUST1 = ENGO_EFFECT_DUST_MIN,
+ /* 5 */ ENGO_EFFECT_DUST2,
+ /* 6 */ ENGO_EFFECT_DUST3,
+ /* 7 */ ENGO_EFFECT_STEAM_MIN,
+ /* 7 */ ENGO_EFFECT_STEAM = ENGO_EFFECT_STEAM_MIN
+} EnGoEffectType;
+
+typedef enum EnGoAnimationIndex {
+ /* -1 */ ENGO_ANIM_INVALID = -1,
+ /* 0 */ ENGO_ANIM_GORON_MIN,
+ /* 0 */ ENGO_ANIM_LYINGDOWNIDLE = ENGO_ANIM_GORON_MIN,
+ /* 1 */ ENGO_ANIM_LYINGDOWNIDLE_IMM,
+ /* 2 */ ENGO_ANIM_UNROLL,
+ /* 3 */ ENGO_ANIM_UNROLL_IMM,
+ /* 4 */ ENGO_ANIM_ROLL,
+ /* 5 */ ENGO_ANIM_SHIVER,
+ /* 6 */ ENGO_ANIM_SHIVER_IMM,
+ /* 7 */ ENGO_ANIM_DROPKEG,
+ /* 8 */ ENGO_ANIM_COVEREARS,
+ /* 9 */ ENGO_ANIM_SHIVERINGSURPRISED,
+ /* 10 */ ENGO_ANIM_ATHLETICS_MIN,
+ /* 10 */ ENGO_ANIM_DOUBLE_ARM_SIDEBEND = ENGO_ANIM_ATHLETICS_MIN,
+ /* 11 */ ENGO_ANIM_SQUAT_SIDE_TO_SIDE,
+ /* 12 */ ENGO_ANIM_SHAKE_LIMBS,
+ /* 13 */ ENGO_ANIM_SINGLE_ARM_SIDEBEND,
+ /* 14 */ ENGO_ANIM_SITTING_STRETCH,
+ /* 15 */ ENGO_ANIM_CHEER,
+ /* 16 */ ENGO_ANIM_SHOUT,
+ /* 17 */ ENGO_ANIM_HELP_SITTING_STRETCH,
+ /* 18 */ ENGO_ANIM_SPRING_MIN,
+ /* 18 */ ENGO_ANIM_SHOW = ENGO_ANIM_SPRING_MIN,
+ /* 19 */ ENGO_ANIM_SHOW_LOOPED,
+ /* 20 */ ENGO_ANIM_LOOK_AROUND,
+ /* 21 */ ENGO_ANIM_LOOK_AROUND_LOOPED
+} EnGoAnimationIndex;
+
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f velocity, f32 scale, f32 deltaScale,
+ s32 maxFrames);
+void EnGo_DrawSteam(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitDust(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale, f32 deltaScale, s32 maxFrames,
+ EnGoEffectType parentEffectType);
+void EnGo_DrawDust(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitSnow(EnGoEffect effect[], Vec3f pos);
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight);
+void EnGo_DrawSnow(EnGoEffect effect[], PlayState* play, Gfx* material, Gfx* model, u8 effectType);
+
+void EnGo_UpdateEffects(EnGo* this);
+void EnGo_DrawEffects(EnGo* this, PlayState* play);
+
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play);
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateFocus(EnGo* this);
+
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateCollider(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play);
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play);
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex);
+void EnGo_UpdateEyes(EnGo* this);
+
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play);
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play);
+
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play);
+void EnGo_FrozenIdle(EnGo* this, PlayState* play);
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play);
+
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg);
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId);
+
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime);
+void EnGo_AddGatekeeperPoundQuake(PlayState* play, s16 speed, s16 verticalMag, s16 countdown);
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play);
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha);
+void EnGo_MakeSteam(EnGo* this);
+
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play);
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play);
+
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play);
+
+void EnGo_SetupAthletic(EnGo* this, PlayState* play);
+void EnGo_SetupSpectator(EnGo* this, PlayState* play);
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play);
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play);
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play);
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play);
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play);
+
+void EnGo_Idle(EnGo* this, PlayState* play);
+void EnGo_Sleep(EnGo* this, PlayState* play);
+void EnGo_Frozen(EnGo* this, PlayState* play);
+void EnGo_AwaitThaw(EnGo* this, PlayState* play);
+void EnGo_Thaw(EnGo* this, PlayState* play);
+
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play);
+
+void EnGo_Snowball(EnGo* this, PlayState* play);
+
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play);
+
+void EnGo_Talk(EnGo* this, PlayState* play);
+
+// MsgEvent script for the Goron who made Darmani's grave in the mountain village.
+static s32 sMsgScriptGoronGravemaker[] = {
0x00150800, 0x40010022, 0x00150200, 0x180E0E10, 0x0C0F0E11, 0x0C0F0E12, 0x0C0F0E13, 0x0C0F0E14, 0x0C111502,
0x100E0E15, 0x0C100015, 0x0400110E, 0x0E160C0F, 0x0E170C0F, 0x0E180C11, 0x15041610, 0x0E0E190C, 0x10001504,
0x000D0100, 0x050E0E31, 0x0C100E0E, 0x2F0C1001, 0x00050E0E, 0x2D0C100E, 0x0E2B0C10,
};
-static s32 D_80A16164[] = {
+// MsgEvent script for the frozen Goron aside the gravemaker in the mountain village.
+static s32 sMsgScriptGoronFrozen[] = {
0x00150800, 0x7E01004D, 0x00150400, 0x180E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C12, 0x16111508,
0x100E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C17, 0x0F0E260C, 0x180F0E27, 0x0C170F0E, 0x280C180F,
0x0E290C17, 0x0F0E2A0C, 0x16111508, 0x100E0E1A, 0x0C170F0E, 0x1B0C180F, 0x0E1C0C0F, 0x0E1D0C0F, 0x0E1E0C17,
@@ -44,19 +211,23 @@ static s32 D_80A16164[] = {
0x0E0E300C, 0x10010005, 0x0E0E2E0C, 0x100E0E2C, 0x0C100000,
};
-static s32 D_80A16208[2] = { 0xE0E520C, 0x10000000 };
+// MsgEvent script for the shrine Goron standing aside the store.
+static s32 sMsgScriptGoronAsideStore[] = { 0xE0E520C, 0x10000000 };
-static s32 D_80A16210[17] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's son.
+static s32 sMsgScriptGoronAsideEldersSon[] = {
0x160400, 0x38010010, 0xE0E430C, 0xF0E440C, 0xF0E450C, 0x11188010, 0x160800, 0x1B0E0E46, 0xC0F0E47,
0xC0F0E48, 0xC0F0E49, 0xC0F0E4A, 0xC111608, 0x11188010, 0xE0E4B0C, 0x100E0E42, 0xC100000,
};
-static s32 D_80A16254[11] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's room.
+static s32 sMsgScriptGoronAsideEldersRoom[] = {
0x160400, 0x22010009, 0xE0E4D0C, 0xF0E4E0C, 0x10001701, 0xC0E0E,
0x4F0C0F0E, 0x500C1117, 0x1100E0E, 0x510C100E, 0xE4C0C10,
};
-static s32 D_80A16280[52] = {
+// MsgEvent script for the Goron in Goron Village who sells Powder Kegs.
+static s32 sMsgScriptGoronMedigoron[] = {
0x1001200, 0x12200008, 0xE0C8E0C, 0x11122010, 0xE0C8F0C, 0x10001240, 0x1D0E0C, 0x800C1112, 0x40001280,
0x742500, 0xC006F00, 0x13010045, 0xF0C810C, 0x19001300, 0x1280005E, 0x25000C00, 0x59001301, 0x2F0E0C,
0x810C0F0C, 0x820C0500, 0x1A00, 0x1A300E0C, 0x830C1209, 0x700, 0xE0C84, 0x160C1113, 0x1100E0C,
@@ -65,18 +236,30 @@ static s32 D_80A16280[52] = {
0x14FF9C12, 0x6003400, 0x130034, 0x700000E, 0xC870C16, 0x100E0C8B, 0xC100000,
};
-static s32 D_80A16350[27] = {
+// MsgEvent script for the gatekeeper Goron in Goron Village who opens the shrine gate.
+static s32 sMsgScriptGoronGatekeeper[] = {
0x584000, 0x2903000E, 0x2001301, 0x180058, 0x80005119, 0x1E0059, 0x1004919, 0x160059, 0x2004119,
0xE0059, 0x4003919, 0x2F0E0D, 0x4D0C1210, 0xE0D480C, 0xF0D490C, 0xF0D4A0C, 0x5000000, 0xF000F30,
0xE0D4B0C, 0x15090000, 0xE0D4D0C, 0x1210310E, 0xD4C0C12, 0x100E0D4E, 0xC19FFD8, 0xE0D4F0C, 0x19FFD500,
};
-static s32 D_80A163BC[4] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
-static s32 D_80A163CC[4] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
-static s32 D_80A163DC[4] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
-static s32 D_80A163EC[4] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
-static s32 D_80A163FC[4] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
-static s32 D_80A1640C[2] = { 0xE023A0C, 0x12100000 };
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially stretching side to side while squatting).
+static s32 sMsgScriptGoronAthleticA[] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially doing sidebend stretches with one arm).
+static s32 sMsgScriptGoronAthleticB[] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially shaking out their limbs).
+static s32 sMsgScriptGoronAthleticC[] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers (Initially doing sidebend stretches with both arms).
+static s32 sMsgScriptGoronAthleticD[] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
+
+// MsgEvent script for the pair of Gorons stretching one Goron's hamstrings.
+static s32 sMsgScriptGoronAthleticHamstring[] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
+
+// MsgEvent script for any sleeping Goron.
+static s32 sMsgScriptGoronSleeping[] = { 0xE023A0C, 0x12100000 };
ActorInit En_Go_InitVars = {
ACTOR_EN_GO,
@@ -110,7 +293,8 @@ static ColliderSphereInit sSphereInit = {
{ 0, { { 0, 0, 0 }, 0 }, 100 },
};
-static ColliderCylinderInit sCylinderInit1 = {
+// Collider for the frozen solid Gorons.
+static ColliderCylinderInit sCylinderInitFrozen = {
{
COLTYPE_METAL,
AT_ON | AT_TYPE_ENEMY,
@@ -130,7 +314,8 @@ static ColliderCylinderInit sCylinderInit1 = {
{ 0, 0, 0, { 0, 0, 0 } },
};
-static ColliderCylinderInit sCylinderInit2 = {
+// Collider for normal Gorons.
+static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT1,
AT_NONE,
@@ -152,42 +337,55 @@ static ColliderCylinderInit sCylinderInit2 = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
+typedef enum {
+ /* 0x0 */ ENGO_DMGEFF_NONE,
+ /* 0x2 */ ENGO_DMGEFF_FIRE = 0x2,
+ /* 0xF */ ENGO_DMGEFF_BREAK = 0xF
+} EnGoDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(1, 0x0),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0x0),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(1, 0x0),
- /* Hookshot */ DMG_ENTRY(1, 0x0),
- /* Goron punch */ DMG_ENTRY(1, 0xF),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(1, 0xF),
- /* Fire arrow */ DMG_ENTRY(1, 0x2),
- /* Ice arrow */ DMG_ENTRY(1, 0x0),
- /* Light arrow */ DMG_ENTRY(1, 0x0),
- /* Goron spikes */ DMG_ENTRY(1, 0xF),
- /* Deku spin */ DMG_ENTRY(1, 0x0),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(1, 0x0),
- /* Zora barrier */ DMG_ENTRY(1, 0x0),
- /* Normal shield */ DMG_ENTRY(1, 0x0),
- /* Light ray */ DMG_ENTRY(1, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0x0),
- /* Sword beam */ DMG_ENTRY(1, 0x0),
- /* Normal Roll */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(1, 0x0),
- /* Unblockable */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(1, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0x0),
+ /* Deku Nut */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Sword */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Fire arrow */ DMG_ENTRY(1, ENGO_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron spikes */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Deku spin */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
};
+/**
+ * Animations used in the actor.
+ *
+ * @see EnGoAnimationIndex
+ */
static AnimationInfoS sAnimationInfo[] = {
+
+ /* Animations for generic Goron actions */
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 },
@@ -199,366 +397,453 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ /* Animations for stretching Gorons at the racetrack */
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_001420, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_001A4C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ /* Animations for the Goron during the spring arrival cutscene */
+ { &gGoronSpringShowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringShowLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
-EnGoStruct* func_80A10FD0(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6) {
+/**
+ * Initialize the latter section of the effects in 'effectTable' to be of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be between 'maxFrames / 3' and
+ * 'maxFrames'
+ */
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f velocity,
+ f32 scale, f32 deltaScale, s32 maxFrames) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = 7;
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Steam effects are from the end of the snow effects to the end of all effects
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
- }
- return ptr;
+ effect->type = ENGO_EFFECT_STEAM;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = velocity;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
+ }
+ return effect;
}
-void func_80A11144(EnGoStruct* ptr, PlayState* play) {
- s32 pad;
+/**
+ * Draw all effects of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawSteam(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
+ PlayState* play = play2;
s32 i;
- s32 flag = false;
- f32 temp;
+ s32 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C2DC(play->state.gfxCtx);
-
- for (i = 0; i < 32; i++, ptr++) {
-
- if (ptr->unk_00 == 7) {
- gDPPipeSync(POLY_XLU_DISP++);
-
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
- flag = true;
- }
-
- Matrix_Push();
-
- temp = ((f32)ptr->unk_02 / ptr->unk_01);
- temp *= 255;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)temp);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, (ptr->unk_02 + (i * 3)) * 3,
- (ptr->unk_02 + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
-
- Matrix_Pop();
- if (play->state.gfxCtx) {}
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_STEAM) {
+ continue;
}
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ alpha *= 255.0f;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)alpha);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, (effect->alphaNumer + (i * 3)) * 3,
+ (effect->alphaNumer + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A1143C(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6, s32 arg7) {
+/**
+ * Initialize the first available effect to be of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be 1/3 * maxFrames -> maxFrames
+ * @param parentEffectType Type of the parent effect, determines which of the possible dust effects correspond
+ */
+void EnGo_InitDust(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale,
+ f32 deltaScale, s32 maxFrames, EnGoEffectType parentEffectType) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = arg7 + 4;
-
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
-
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Dust effects are from the end of the snow effects to the end of all effects.
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->type = parentEffectType + ENGO_EFFECT_DUST_MIN;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = vel;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
}
}
-void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawDust(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
static TexturePtr sDustTextures[] = {
gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
- static Color_RGBA8 D_80A16664[] = {
- { 255, 255, 255, 0 },
- { 170, 130, 90, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustPrimColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 170, 130, 90, 0 }, // Light Brown
+ { 0, 0, 0, 0 }, // Black
};
- static Color_RGBA8 D_80A16670[] = {
- { 255, 255, 255, 0 },
- { 100, 60, 20, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustEnvColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 100, 60, 20, 0 }, // Dark Brown
+ { 0, 0, 0, 0 }, // Black
};
+ PlayState* play = play2;
s32 i;
- u8 flag = false;
- f32 temp;
+ u8 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C2DC(play->state.gfxCtx);
-
- for (i = 0; i < 32; i++, ptr++) {
- if ((ptr->unk_00 >= 4) && (ptr->unk_00 < 7)) {
- if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
- flag = true;
- }
- Matrix_Push();
-
- temp = (f32)ptr->unk_02 / ptr->unk_01;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A16664[(s32)ptr->unk_00 - 4].r,
- D_80A16664[(s32)ptr->unk_00 - 4].g, D_80A16664[(s32)ptr->unk_00 - 4].b, (u8)(temp * 255));
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A16670[(s32)ptr->unk_00 - 4].r, D_80A16670[(s32)ptr->unk_00 - 4].g,
- D_80A16670[(s32)ptr->unk_00 - 4].b, 0);
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(temp * 7.0f)]));
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
-
- Matrix_Pop();
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if ((effect->type < ENGO_EFFECT_DUST_MIN) || (effect->type >= ENGO_EFFECT_STEAM_MIN)) {
+ continue;
}
- if (play->state.gfxCtx) {}
+
+ if (!isMaterialSet) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, (u8)(alpha * UINT8_MAX));
+ gDPSetEnvColor(POLY_XLU_DISP++, sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, 0);
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(alpha * 7.0f)]));
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#ifdef NON_MATCHING
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1) {
- static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
+/**
+ * Initialize the snowball break effects.
+ *
+ * Half of the elements will be 'ENGO_EFFECT_SNOW1'/'2'/'3' randomly generated around the character. The second half
+ * will be dedicated 'ENGO_EFFECT_DUST1'/'2'/'3' paired with the snow.
+ *
+ * @param effect The EnGoEffect table
+ * @param pos Position around which the effects appear
+ */
+void EnGo_InitSnow(EnGoEffect effect[ENGO_EFFECT_COUNT], Vec3f pos) {
+ static u8 effectIndexToSnowEffectTable[] = {
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
};
- EnGoStruct* ptr2 = &ptr[16];
+
+ EnGoEffect* dustEffects = &effect[ENGO_SNOW_EFFECT_COUNT];
s32 i;
- Vec3f spB4;
- Vec3f spA8;
- f32 temp_f20;
+ Vec3f randRelativeToWorldPos;
+ Vec3f randYOneToFour;
+ f32 velMagnitude;
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_10 = arg1;
- ptr->unk_10.y += 56.0f;
-
- ptr->unk_04.x = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.y = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.z = (Rand_ZeroOne() - 0.5f) * 5460.0f;
-
- temp_f20 = (Rand_ZeroOne() * 4.0f) + 6.0f;
- ptr->unk_28.x = Math_SinS(i * 0x1000) * temp_f20;
- ptr->unk_28.z = Math_CosS(i * 0x1000) * temp_f20;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
-
- ptr->unk_1C = gZeroVec3f;
- ptr->unk_1C.y = -0.8f;
-
- ptr->unk_01 = ptr->unk_02 = 1;
- ptr->unk_00 = D_80A1667C[i];
-
- spB4.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.x;
- spB4.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + ptr->unk_10.y;
- spB4.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.z;
-
- spA8 = gZeroVec3f;
- spA8.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
-
- func_80A1143C(ptr2, spB4, gZeroVec3f, spA8, 0.6f, 0.2f, 16, 0);
+ // Snow effects consume the first part of the effects table, and are paired with dust effects in the latter part
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->pos = pos;
+ effect->pos.y += 56.0f;
+
+ // Generate a +-15 degree rotational velocity
+ effect->rotVelocity.x = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.y = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.z = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+
+ // Generate a radially outward velocity for each of the effects
+ velMagnitude = (Rand_ZeroOne() * 4.0f) + 6.0f;
+ effect->velocity.x = Math_SinS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.z = Math_CosS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
+
+ // No acceleration on the X,Z axis, negative acceleration on the Y axis
+ effect->accel = gZeroVec3f;
+ effect->accel.y = -0.8f;
+
+ // Full visibility (1/1)
+ effect->alphaDenom = effect->alphaNumer = 1;
+
+ // Assign a snow effect value of 'ENGO_EFFECT_SNOW1'/'2'/'3'
+ effect->type = effectIndexToSnowEffectTable[i];
+
+ // Initialize the parameters for the paired element
+ randRelativeToWorldPos.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.x;
+ randRelativeToWorldPos.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + effect->pos.y;
+ randRelativeToWorldPos.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.z;
+
+ randYOneToFour = gZeroVec3f;
+ randYOneToFour.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+
+ // Initialize the paired element.
+ EnGo_InitDust(dustEffects, randRelativeToWorldPos, gZeroVec3f, randYOneToFour, 0.6f, 0.2f,
+ ENGO_DUST_STEAM_LIFETIME, 0);
}
}
-#else
-static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
-};
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A118F8.s")
-#endif
-void func_80A11BF8(EnGoStruct* ptr, f32 arg1) {
- f32 test;
- f32 test2;
+/**
+ * Update the snow effect's movement.
+ *
+ * When the snow drops to the ground, it is converted to dust.
+ *
+ * @param effect Pointer to the effect to update
+ * @param dustConversionHeight Height above the ground at which to convert the effect to dust
+ */
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight) {
f32 x;
f32 z;
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_34 += ptr->unk_38;
+ effect->velocity.y += effect->accel.y;
+ effect->scaleXY += effect->scaleXYDelta;
- if (ptr->unk_10.y < arg1) {
- ptr->unk_10.y = arg1;
+ if (effect->pos.y < dustConversionHeight) {
+ effect->pos.y = dustConversionHeight;
- ptr->unk_00 = 4;
- ptr->unk_01 = (Rand_ZeroOne() * 8.0f) + 4.0f;
- ptr->unk_02 = ptr->unk_01;
+ effect->type = ENGO_EFFECT_DUST1;
+ effect->alphaDenom = (Rand_ZeroOne() * 8.0f) + 4.0f;
+ effect->alphaNumer = effect->alphaDenom;
- ptr->unk_28 = gZeroVec3f;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+ effect->velocity = gZeroVec3f;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
- ptr->unk_34 = 0.4f;
- ptr->unk_38 = 0.1f;
+ effect->scaleXY = 0.4f;
+ effect->scaleXYDelta = 0.1f;
return;
}
- if (ptr->unk_28.x != 0.0f) {
- x = ptr->unk_28.x / fabsf(ptr->unk_28.x);
- x *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.x, x, (sREG(14) + 40) * 0.01f);
+ if (effect->velocity.x != 0.0f) {
+ x = effect->velocity.x / fabsf(effect->velocity.x);
+ x *= (sREG(13) + 140) * 0.01f;
+ Math_StepToF(&effect->velocity.x, x, (sREG(14) + 40) * 0.01f);
}
- if (ptr->unk_28.z != 0.0f) {
- z = ptr->unk_28.z / fabsf(ptr->unk_28.z);
+ if (effect->velocity.z != 0.0f) {
+ z = effect->velocity.z / fabsf(effect->velocity.z);
z *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.z, z, (sREG(14) + 40) * 0.01f);
+ Math_StepToF(&effect->velocity.z, z, (sREG(14) + 40) * 0.01f);
}
- ptr->unk_0A.x += ptr->unk_04.x;
- ptr->unk_0A.y += ptr->unk_04.y;
- ptr->unk_0A.z += ptr->unk_04.z;
+ effect->rotAngle.x += effect->rotVelocity.x;
+ effect->rotAngle.y += effect->rotVelocity.y;
+ effect->rotAngle.z += effect->rotVelocity.z;
}
-#ifdef NON_MATCHING
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_SNOW1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ * @param material Snow Material
+ * @param model Snow Model
+ * @param type Snow Effect type to draw
+ */
+void EnGo_DrawSnow(EnGoEffect effect[ENGO_SNOW_EFFECT_COUNT], PlayState* play, Gfx* material, Gfx* model,
+ u8 effectType) {
s32 i;
- u8 flag = false;
+ u8 isMaterialSet = false;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C28C(play->state.gfxCtx);
-
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == arg4) {
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, arg2);
- flag = true;
- }
-
- Matrix_Push();
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
- Matrix_RotateZS(ptr->unk_0A.z, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_0A.x, MTXMODE_APPLY);
- Matrix_RotateYS(ptr->unk_0A.y, MTXMODE_APPLY);
-
- if (1) {
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, arg3);
- }
-
- Matrix_Pop();
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != effectType) {
+ continue;
}
+
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_OPA_DISP++, material);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rotAngle.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rotAngle.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rotAngle.y, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, model);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A11EC0.s")
-#endif
-void func_80A1203C(EnGo* this) {
- EnGoStruct* ptr = this->unk_3F8;
+/**
+ * Update all effects, potentially fading them away to nothing.
+ */
+void EnGo_UpdateEffects(EnGo* this) {
+ EnGoEffect* effect = this->effectTable;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
- if (ptr->unk_00 != 0) {
- if (ptr->unk_02 == 0) {
- ptr->unk_00 = 0;
- } else if ((ptr->unk_00 > 0) && (ptr->unk_00 < 4)) {
- func_80A11BF8(ptr, this->actor.world.pos.y);
- } else {
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == ENGO_EFFECT_NONE) {
+ continue;
+ }
- ptr->unk_28.x += ptr->unk_1C.x;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_28.z += ptr->unk_1C.z;
+ if (effect->alphaNumer == 0) {
+ // End usage of the effect
+ effect->type = ENGO_EFFECT_NONE;
+ } else if ((effect->type > ENGO_EFFECT_NONE) && (effect->type < ENGO_EFFECT_DUST_MIN)) {
+ // Snow rotates, and changes to dust upon dropping below the actor position
+ EnGo_UpdateSnow(effect, this->actor.world.pos.y);
+ } else {
+ // Dust and steam move according to their initial values
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_34 += ptr->unk_38;
- ptr->unk_02--;
- }
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
+
+ effect->scaleXY += effect->scaleXYDelta;
+ effect->alphaNumer--;
}
}
}
-void func_80A1213C(EnGo* this, PlayState* play) {
- func_80A11EC0(this->unk_3F8, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL, 1);
- func_80A11EC0(this->unk_3F8, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL, 2);
- func_80A11EC0(this->unk_3F8, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL, 3);
- func_80A11144(this->unk_3F8, play);
- func_80A115B4(this->unk_3F8, play);
+/**
+ * Draw all effects.
+ */
+void EnGo_DrawEffects(EnGo* this, PlayState* play) {
+ EnGo_DrawSnow(this->effectTable, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW1);
+ EnGo_DrawSnow(this->effectTable, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW2);
+ EnGo_DrawSnow(this->effectTable, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW3);
+ EnGo_DrawSteam(this->effectTable, play);
+ EnGo_DrawDust(this->effectTable, play);
}
-s32 func_80A121F4(PlayState* play) {
+/**
+ * Check if the Goron can hurt the player.
+ */
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->transformation == PLAYER_FORM_GORON) && (player->stateFlags3 & PLAYER_STATE3_2000000)) {
return false;
+ } else {
+ return true;
}
- return true;
}
-s32 func_80A1222C(EnGo* this, PlayState* play) {
+/**
+ * Check if the Goron is falling asleep.
+ */
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 ret = false;
+ s32 isFallingAsleep = false;
if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->unk_3EC == 0) &&
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->sleepState == ENGO_AWAKE) &&
(this->actor.xzDistToPlayer < 400.0f)) ||
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04) && (play->sceneId == SCENE_16GORON_HOUSE) &&
- (gSaveContext.sceneLayer == 0) && (this->unk_3EC == 0) && (play->csCtx.currentCsIndex == 1))) {
- ret = true;
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON) && (play->sceneId == SCENE_16GORON_HOUSE) &&
+ (gSaveContext.sceneLayer == 0) && (this->sleepState == ENGO_AWAKE) && (play->csCtx.scriptIndex == 1))) {
+ isFallingAsleep = true;
}
- return ret;
+ return isFallingAsleep;
}
-s32 func_80A122EC(EnGo* this) {
- static Vec3f D_80A1668C = { 0.0f, 100.0f, 160.0f };
+/**
+ * Update the actor's focus.
+ */
+s32 EnGo_UpdateFocus(EnGo* this) {
+ static Vec3f sMedigoronPos = { 0.0f, 100.0f, 160.0f };
s32 pad;
- f32 sp20 = 58.0f;
+ f32 yAxisOffsetToFocusPoint = 58.0f;
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A1668C,
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sMedigoronPos,
&this->actor.focus.pos);
} else {
- if ((this->unk_390 & 0x200) || (this->unk_390 & 0x100)) {
- sp20 = this->actor.shape.yOffset;
+ if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) || (this->actionFlags & ENGO_FLAG_SNOWBALLED)) {
+ yAxisOffsetToFocusPoint = this->actor.shape.yOffset;
}
Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
- this->actor.focus.pos.y += sp20;
+ this->actor.focus.pos.y += yAxisOffsetToFocusPoint;
}
this->actor.focus.rot.x = this->actor.world.rot.x;
@@ -567,21 +852,24 @@ s32 func_80A122EC(EnGo* this) {
return false;
}
-void func_80A123A0(EnGo* this, PlayState* play) {
- Vec3f sp2C;
+/**
+ * Update the collider for the snowball form of the Goron Shrine gatekeeper.
+ */
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp2C, &this->actor.world.pos);
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
- this->colliderSphere.dim.worldSphere.center.x = sp2C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp2C.y;
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp2C.z;
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 48;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
- if (func_80A121F4(play)) {
+ if (EnGo_CanSnowballHurtPlayer(play)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderSphere.base);
}
@@ -589,175 +877,203 @@ void func_80A123A0(EnGo* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124A0(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Medigoron in the Powder Keg Shop.
+ */
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play) {
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124FC(EnGo* this, PlayState* play) {
- Vec3f sp1C;
+/**
+ * Update the collider for the rolled up form of a Goron.
+ */
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp1C, &this->actor.world.pos);
-
- this->colliderSphere.dim.worldSphere.center.x = sp1C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp1C.y;
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp1C.z;
-
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 20;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
-
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A125BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the frozen form of a Goron.
+ */
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play) {
s32 pad;
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
-
this->colliderCylinder.dim.radius = 46;
this->colliderCylinder.dim.height = 78;
-
- if (this->unk_3C6 == 0) {
+ if (this->harmlessTimer == 0) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderCylinder.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderCylinder.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A12660(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for all standing forms of a Goron.
+ */
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play) {
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
this->colliderCylinder.dim.radius = 24;
this->colliderCylinder.dim.height = 62;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A126BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Goron.
+ *
+ * Both the rolling snowball and frozen forms can hurt Player on collision, others do not.
+ */
+void EnGo_UpdateCollider(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!(player->stateFlags2 & PLAYER_STATE2_4000)) {
- if (this->unk_3C6 != 0) {
- this->unk_3C6--;
- }
+ DECR(this->harmlessTimer);
}
-
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- func_80A124A0(this, play);
- } else if (this->unk_390 & 0x100) {
- func_80A123A0(this, play);
- } else if (this->unk_390 & 0x200) {
- func_80A124FC(this, play);
- } else if (this->unk_390 & 0x400) {
- func_80A125BC(this, play);
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ EnGo_UpdateMedigoronCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
+ EnGo_UpdateSnowballCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ EnGo_UpdateRolledUpCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_UpdateFrozenCollider(this, play);
} else {
- func_80A12660(this, play);
+ EnGo_UpdateStandingCollider(this, play);
}
}
-s32 func_80A12774(EnGo* this, PlayState* play) {
- if (!(this->unk_390 & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+/**
+ * Check if the actor is talking, and if so set the action function to handle it.
+ *
+ * @return True if talking
+ */
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play) {
+ if (!(this->actionFlags & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
return false;
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
- if (!(this->unk_390 & 0x200)) {
- this->unk_390 |= 8;
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
+ if (!(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
}
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_390 |= 0x20;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3C0 = 0;
- this->unk_3C4 = 0;
- this->unk_18C = this->actionFunc;
- this->actionFunc = func_80A157C4;
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->cutsceneState = 0;
+ this->gatekeeperAnimState = 0;
+ this->interruptedActionFunc = this->actionFunc;
+ this->actionFunc = EnGo_Talk;
return true;
}
-s32 func_80A12868(EnGo* this, PlayState* play) {
- this->unk_390 &= ~0x800;
- this->unk_390 &= ~0x1000;
- this->unk_390 &= ~0x2000;
+/**
+ * Detect any collisions, and convert detections to object specific 'actionFlags'.
+ */
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play) {
+ this->actionFlags &= ~ENGO_FLAG_HIT_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_BY_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_OBJ;
if ((this->colliderCylinder.base.atFlags & AT_HIT) || (this->colliderSphere.base.atFlags & AT_HIT)) {
this->colliderCylinder.base.atFlags &= ~AT_HIT;
this->colliderSphere.base.atFlags &= ~AT_HIT;
- this->unk_390 |= 0x800;
- this->unk_3C6 = 0x28;
+ this->actionFlags |= ENGO_FLAG_HIT_OTHER;
+ this->harmlessTimer = 40;
}
if ((this->colliderCylinder.base.acFlags & AC_HIT) || (this->colliderSphere.base.acFlags & AC_HIT)) {
this->colliderCylinder.base.acFlags &= ~AC_HIT;
this->colliderSphere.base.acFlags &= ~AC_HIT;
- this->unk_390 |= 0x1000;
+ this->actionFlags |= ENGO_FLAG_HIT_BY_OTHER;
}
if ((this->colliderCylinder.base.ocFlags1 & OC1_HIT) || (this->colliderSphere.base.ocFlags1 & OC1_HIT)) {
this->colliderCylinder.base.ocFlags1 &= ~OC1_HIT;
this->colliderSphere.base.ocFlags1 &= ~OC1_HIT;
- this->unk_390 |= 0x2000;
+ this->actionFlags |= ENGO_FLAG_HIT_OBJ;
}
return false;
}
-s32 func_80A12954(EnGo* this, PlayState* play) {
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (play->csCtx.state != 0) && (this->actor.draw != NULL) &&
- (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
- (play->csCtx.currentCsIndex == 0)) {
- if (this->unk_3F0 == 0) {
+/**
+ * Start, or finish, the cutscene for the arrival of springtime.
+ */
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) && (play->csCtx.state != CS_STATE_IDLE) &&
+ (this->actor.draw != NULL) && (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
+ (play->csCtx.scriptIndex == 0)) {
+ if (this->springArrivalCutsceneActive == false) {
this->actor.flags &= ~ACTOR_FLAG_1;
- this->unk_394 = 255;
- this->unk_3F0 = 1;
- this->unk_18C = this->actionFunc;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = true;
+ this->interruptedActionFunc = this->actionFunc;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->actionFunc = func_80A14FC8;
- } else if (this->unk_3F0 != 0) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->actionFunc = EnGo_HandleSpringArrivalCutscene;
+ } else if (this->springArrivalCutsceneActive) {
this->actor.flags |= ACTOR_FLAG_1;
- this->unk_394 = 255;
- this->unk_3F0 = 0;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->actionFunc = this->unk_18C;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = false;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFunc = this->interruptedActionFunc;
}
return false;
}
-s32 func_80A12A64(EnGo* this, PlayState* play) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
- s32 ret = 0;
+/**
+ * Update the animation to the actor's currently set value.
+ *
+ * @return True if non-repeating animation has finished
+ */
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
+ s32 ret = false;
- if ((this->unk_3DC >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((this->unk_3DC >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (this->unk_3DC < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((this->curAnimIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((this->curAnimIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (this->curAnimIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->skelAnime.playSpeed = this->unk_398;
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->skelAnime.playSpeed = this->curAnimPlaySpeed;
ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-s32 func_80A12B78(EnGo* this, PlayState* play) {
- if (play->csCtx.state == 0) {
- if (this->unk_3DC == 4) {
+/**
+ * Update sound effects based on animation.
+ */
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) {
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ if (this->curAnimIndex == ENGO_ANIM_ROLL) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
@@ -765,7 +1081,7 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
- } else if ((this->unk_3DC == 2) || (this->unk_3DC == 3)) {
+ } else if ((this->curAnimIndex == ENGO_ANIM_UNROLL) || (this->curAnimIndex == ENGO_ANIM_UNROLL_IMM)) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF);
}
@@ -778,189 +1094,231 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
return 0;
}
-s32 func_80A12C48(EnGo* this, PlayState* play, s32 arg2) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
+/**
+ * Change the Goron's animation.
+ *
+ * Goron animations come from one of three categories:
+ * - Basic Goron animations
+ * - Goron athletics like stretches, cheers, etc...
+ * - Spring arrival cutscene animations
+ * Changing animations with this function handles the transitions between the three categories.
+ *
+ * @return True if animation was changed
+ */
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
s32 ret = false;
- if ((arg2 >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((arg2 >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (arg2 < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((animIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (animIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->unk_3DC = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- this->unk_398 = this->skelAnime.playSpeed;
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->curAnimIndex = animIndex;
+ ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->curAnimPlaySpeed = this->skelAnime.playSpeed;
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-void func_80A12D6C(EnGo* this) {
- if ((this->unk_390 & 0x20) && (DECR(this->unk_3BC) == 0)) {
- this->unk_3BE++;
- if (this->unk_3BE >= 4) {
- this->unk_3BC = Rand_S16Offset(30, 30);
- this->unk_3BE = 0;
+/**
+ * Update the eye textures to blink.
+ */
+void EnGo_UpdateEyes(EnGo* this) {
+ if (this->actionFlags & ENGO_FLAG_EYES_OPEN) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= ENGO_EYETEX_CLOSED2) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ }
}
}
}
-void func_80A12DF4(EnGo* this, PlayState* play) {
- if (this->unk_3D4 == 0) {
- func_80A12C48(this, play, 9);
- this->unk_3D4++;
- } else if ((this->unk_3D4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 6);
- this->unk_3D4++;
+/**
+ * Play the surprise animation then return to shivering.
+ */
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play) {
+ if (this->surprisePhase == 0) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVERINGSURPRISED);
+ this->surprisePhase++;
+ } else if ((this->surprisePhase == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER_IMM);
+ this->surprisePhase++;
}
}
-s32 func_80A12E80(EnGo* this, PlayState* play) {
- u16 temp = play->msgCtx.currentTextId;
+/**
+ * Change the attention target, and dialog reactions of the Gorons outside Darmani's grave.
+ */
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ u16 textId = play->msgCtx.currentTextId;
Player* player = GET_PLAYER(play);
- if (ENGO_GET_F(&this->actor) != ENGO_F_4) {
+ if (ENGO_GET_TYPE(&this->actor) != ENGO_GRAVEYARD) {
return false;
}
if (player->stateFlags1 & PLAYER_STATE1_40) {
- if (this->unk_392 != temp) {
- switch (temp) {
- case 0xE1A:
- this->unk_390 |= 8;
- this->unk_38C = this->actor.child;
+ if (this->lastTextId != textId) {
+ switch (textId) {
+ case 0xE1A: // Awakening from frozen form, confused, turn to other Goron
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
+ this->attentionTarget = this->actor.child;
break;
- case 0xE1D:
- case 0xE25:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1D: // Turn to player (Goron form) while stating Darmani is dead
+ case 0xE25: // Turn to player (Other form) while thanking player
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
- case 0xE27:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = this->actor.child;
+ case 0xE27: // (spoken) "What's this?..."
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = this->actor.child;
}
- case 0xE16:
- case 0xE1E:
- this->unk_190 = func_80A12DF4;
+ case 0xE16: // Surprised, questioning if player is Darmani
+ case 0xE1E: // Surprised, seeing Darmani
+ this->graveyardDialogActionFunc = EnGo_UpdateShiverSurprisedAnimation;
break;
- case 0xE1F:
- if (ENGO_GET_70(&this->actor) == ENGO_70_0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1F: // Turn to player stating Darmani is not dead
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_GRAVEMAKER) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
+
+ default:
+ break;
}
}
- this->unk_3F4 = 1;
- this->unk_392 = temp;
- } else if (this->unk_3F4 != 0) {
- this->unk_3F4 = 0;
- this->unk_190 = NULL;
- this->unk_392 = 0;
- func_80A12C48(this, play, 5);
- this->unk_390 &= ~8;
+ this->changedText = true;
+ this->lastTextId = textId;
+ } else if (this->changedText) {
+ // If the player isn't talking, and the text has changed, its the last text.
+ // Set everything back to the "Idle" behavior.
+ this->changedText = false;
+ this->graveyardDialogActionFunc = NULL;
+ this->lastTextId = 0;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
}
- if (this->unk_190 != NULL) {
- this->unk_190(this, play);
+ if (this->graveyardDialogActionFunc != NULL) {
+ this->graveyardDialogActionFunc(this, play);
}
return false;
}
-s32 func_80A12FE8(EnGo* this, PlayState* play) {
+/**
+ * Update the actor's rotation to point towards the target.
+ */
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
- s16 sp32;
+ Vec3f targetPos;
+ Vec3f thisPos;
+ s16 desiredYaw;
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- sp32 = Math_Vec3f_Yaw(&sp34, &sp40);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ desiredYaw = Math_Vec3f_Yaw(&thisPos, &targetPos);
- Math_ApproachS(&this->unk_3B2, (sp32 - this->unk_3B6) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B2 = CLAMP(this->unk_3B2, -0x1FFE, 0x1FFE);
+ Math_ApproachS(&this->headRotY, (desiredYaw - this->bodyRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->headRotY = CLAMP(this->headRotY, -0x1FFE, 0x1FFE);
- Math_ApproachS(&this->unk_3B6, (sp32 - this->unk_3B2) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B6 = CLAMP(this->unk_3B6, -0x1C70, 0x1C70);
+ Math_ApproachS(&this->bodyRotY, (desiredYaw - this->headRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->bodyRotY = CLAMP(this->bodyRotY, -0x1C70, 0x1C70);
- Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
-
- if (this->unk_38C->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_38C)->bodyPartsPos[7].y + 3.0f;
+ Math_Vec3f_Copy(&thisPos, &this->actor.focus.pos);
+ if (this->attentionTarget->id == ACTOR_PLAYER) {
+ targetPos.y = ((Player*)this->attentionTarget)->bodyPartsPos[7].y + 3.0f;
} else {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->focus.pos);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->focus.pos);
}
- Math_ApproachS(&this->unk_3B0, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B4, 4, 0x2AA8);
- this->unk_3B0 = CLAMP(this->unk_3B0, -0x1554, 0x1554);
+ Math_ApproachS(&this->headRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->bodyRotZ, 4, 0x2AA8);
+ this->headRotZ = CLAMP(this->headRotZ, -0x1554, 0x1554);
- Math_ApproachS(&this->unk_3B4, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B0, 4, 0x2AA8);
- this->unk_3B4 = CLAMP(this->unk_3B4, -0xE38, 0xE38);
+ Math_ApproachS(&this->bodyRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->headRotZ, 4, 0x2AA8);
+ this->bodyRotZ = CLAMP(this->bodyRotZ, -0xE38, 0xE38);
return false;
}
-s32 func_80A131F8(EnGo* this, PlayState* play) {
- if (this->unk_3F4 == 0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+/**
+ * Handle updating of Goron's attention target, and reactions during dialog.
+ */
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ if (!this->changedText) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
- func_80A12E80(this, play);
+ EnGo_UpdateGraveyardAttentionTargetAndReactions(this, play);
- if (this->unk_390 & 8) {
- this->unk_390 &= ~0x40;
- this->unk_390 |= 0x10;
- func_80A12FE8(this, play);
- } else if (this->unk_390 & 0x10) {
- this->unk_390 &= ~0x10;
- this->unk_3B0 = 0;
- this->unk_3B2 = 0;
- this->unk_3B4 = 0;
- this->unk_3B6 = 0;
- this->unk_3BA = 0x14;
- } else if (DECR(this->unk_3BA) == 0) {
- this->unk_390 |= 0x40;
- this->unk_3BA = 0x14;
+ if (this->actionFlags & ENGO_FLAG_ENGAGED) {
+ this->actionFlags &= ~ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FACE_TARGET;
+ EnGo_UpdateRotationToTarget(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
+ this->actionFlags &= ~ENGO_FLAG_FACE_TARGET;
+ this->headRotZ = 0;
+ this->headRotY = 0;
+ this->bodyRotZ = 0;
+ this->bodyRotY = 0;
+ this->loseAttentionTimer = 20;
+ } else if (DECR(this->loseAttentionTimer) == 0) {
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->loseAttentionTimer = 20;
}
return true;
}
-void func_80A132C8(EnGo* this, PlayState* play) {
+/**
+ * Idle action function for the gravemaker at the Goron Graveyard.
+ */
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 temp_v1 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
+ s16 deltaYaw = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
if ((fabsf(this->actor.playerHeightRel) > 20.0f) || (this->actor.xzDistToPlayer > 300.0f)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(temp_v1) >= 0x1C70) ||
- CHECK_WEEKEVENTREG(WEEKEVENTREG_21_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(deltaYaw) >= 0x1C70) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-void func_80A133A8(EnGo* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+/**
+ * Idle action function for the Goron frozen at the Goron Graveyard
+ */
+void EnGo_FrozenIdle(EnGo* this, PlayState* play) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-Actor* func_80A13400(EnGo* this, PlayState* play) {
+/**
+ * Obtain a pointer to the gravemaker at the Goron Graveyard.
+ */
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play) {
Actor* actor;
Actor* retActor = NULL;
@@ -968,8 +1326,8 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
actor = SubS_FindActor(play, retActor, ACTORCAT_NPC, ACTOR_EN_GO);
retActor = actor;
- if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_F(actor) == ENGO_F_4) &&
- (ENGO_GET_70(actor) == ENGO_70_0)) {
+ if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_TYPE(actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(actor) == ENGO_GRAVEYARD_GRAVEMAKER)) {
return retActor;
}
@@ -987,102 +1345,142 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
return NULL;
}
-void func_80A134B0(EnGo* this, PlayState* play, s32 arg2) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_80) || (play->actorCtx.flags & ACTORCTX_FLAG_0) || arg2) {
+/**
+ * The Medigoron's collider radius is greater when it needs to be able to drop the Powder Keg in front of the player.
+ */
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES) ||
+ (play->actorCtx.flags & ACTORCTX_FLAG_0) // Same check occurs in Powder Keg ammo check MsgScript Command
+ || isGivenPowderKeg) {
this->colliderSphere.dim.modelSphere.radius = 300;
} else {
this->colliderSphere.dim.modelSphere.radius = 380;
}
}
-s32 func_80A134F4(EnGo* this, s16 arg1) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+/**
+ * Helper to change a cutscene.
+ *
+ * @returns Status of cutscene change
+ * @retval true Cutscene has started
+ * @retval false Cutscene is queued to start
+ */
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
return true;
}
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
return false;
}
-s32 func_80A13564(EnGo* this, f32 arg1, f32 arg2, s32 arg3) {
+/**
+ * Handle the animation of the "Goron Pound".
+ *
+ * There are Several Phases to the pound:
+ * - Phase 1: (Once in Rolled-Up form) the pound starts by leaping into the air.
+ * - The Goron rotates until its back faces the ground at its peak.
+ * - The Goron distorts shape until at its peak.
+ * - Transition: At the peak, all movement is halted.
+ * - Phase 2: While hanging, the Goron reverts back to normal shape.
+ * - Transition: At reaching maxHangTime, ENGO_POUND_INITIAL_FALL_VEL is applied.
+ * - Phase 3: The Goron falls to the ground.
+ * - Transition: At reaching the ground.
+ *
+ * @param initialVelocity Initial +Y velocity of the pound.
+ * @param maxDistortion Maximum distortion of the Goron's shape.
+ * @param maxHangtime Maximum hangtime at the peak of the pound.
+ * @returns True when pound finishes.
+ */
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime) {
s32 pad;
- f32 temp_f0 = 1.0f;
- f32 temp_f14 = this->actor.velocity.y + this->actor.gravity;
- s32 ret;
+ f32 rotAndDistortFactor = 1.0f;
+ f32 velocity = this->actor.velocity.y + this->actor.gravity;
+ s32 isFinished;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- ret = true;
+ // Transition 3->DONE
+ isFinished = true;
} else {
- if (temp_f14 > 0.0f) {
- temp_f0 = temp_f14 / arg1;
- this->actor.shape.rot.x += (s16)(9100.0f * temp_f0);
- this->unk_3AE = 0;
+ if (velocity > 0.0f) {
+ // PHASE 1: Goron is rising
+ rotAndDistortFactor = velocity / initialVelocity;
+ this->actor.shape.rot.x += (s16)(0x238C * rotAndDistortFactor);
+ this->elapsedHangtime = 0;
} else if ((s32)this->actor.velocity.y == 0) {
- if (arg3 >= this->unk_3AE) {
- temp_f0 = (f32)this->unk_3AE / arg3;
+ if (maxHangtime >= this->elapsedHangtime) {
+ // PHASE 2: Goron is hanging in the air
+ rotAndDistortFactor = (f32)this->elapsedHangtime / maxHangtime;
} else {
- this->actor.gravity = -6.0f;
+ // Transition 2->3: Hanging is complete
+ this->actor.gravity = ENGO_POUND_INITIAL_FALL_VEL;
}
- this->unk_3AE++;
- } else if (this->unk_3AE == 0) {
+ this->elapsedHangtime++;
+ } else if (this->elapsedHangtime == 0) {
+ // Transition 1->2: Goron has reached the peak
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
- temp_f0 = temp_f14 / arg1;
+ rotAndDistortFactor = velocity / initialVelocity;
+ } else {
+ // PHASE 3: Goron is falling (Just letting gravity take effect)
}
- ret = false;
+ isFinished = false;
}
- this->unk_3A8 = (1.0f - temp_f0) * arg2;
- this->actor.scale.x = this->unk_3A4 - this->unk_3A8;
- this->actor.scale.y = this->unk_3A4 + this->unk_3A8;
+ // Handle shape distortions
+ this->scaleFactorPoundDistortion = (1.0f - rotAndDistortFactor) * maxDistortion;
+ this->actor.scale.x = this->scaleFactor - this->scaleFactorPoundDistortion;
+ this->actor.scale.y = this->scaleFactor + this->scaleFactorPoundDistortion;
+ this->actor.scale.z = MAX(this->actor.scale.x, this->actor.scale.y);
- if (this->actor.scale.y < this->actor.scale.x) {
- this->actor.scale.z = this->actor.scale.x;
- } else {
- this->actor.scale.z = this->actor.scale.y;
- }
- return ret;
+ return isFinished;
}
-void func_80A136B8(PlayState* play, s16 speed, s16 verticalMag, s16 countdown) {
- s16 quakeIndex = Quake_Add(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+void EnGo_RequestQuake(PlayState* play, s16 speed, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
- Quake_SetCountdown(quakeIndex, countdown);
+ Quake_SetDuration(quakeIndex, duration);
Quake_SetSpeed(quakeIndex, speed);
- Quake_SetQuakeValues(quakeIndex, verticalMag, 0, 0, 0);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
}
-void func_80A13728(EnGo* this, PlayState* play) {
- func_80A136B8(play, 27767, 7, 20);
+/**
+ * Create the visual effects caused by the gatekeeper's pound.
+ */
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play) {
+ EnGo_RequestQuake(play, 27767, 7, 20);
play->actorCtx.unk2 = 4;
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, 0, 0, 0);
EffectSsBlast_SpawnWhiteShockwave(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f);
}
-void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
- u32 frames1;
- u32 frames2;
+/**
+ * Draw the ice encasing a frozen Goron.
+ */
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha) {
+ u32 y1;
+ u32 y2;
- if (this->unk_390 & 0x400) {
+ if (this->actionFlags & ENGO_FLAG_FROZEN) {
Matrix_Push();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
- Matrix_Scale(arg2 * 0.7f, arg2 * 0.8f, arg2, MTXMODE_APPLY);
+ Matrix_Scale(scale * 0.7f, scale * 0.8f, scale, MTXMODE_APPLY);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- frames1 = play->gameplayFrames % 256;
- frames2 = (play->gameplayFrames * 2) % 256;
+ y1 = play->gameplayFrames % 256;
+ y2 = (play->gameplayFrames * 2) % 256;
gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, frames1, 0x20, 0x10, 1, 0, frames2, 0x40, 0x20));
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)arg3);
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, y1, 0x20, 0x10, 1, 0, y2, 0x40, 0x20));
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)alpha);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
CLOSE_DISPS(play->state.gfxCtx);
@@ -1091,154 +1489,172 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
}
}
-void func_80A139E4(EnGo* this) {
- static Vec3f D_80A16698 = { 0.0f, 0.06f, 0.0f };
- Vec3f sp54;
- Vec3f sp48;
- s16 sp46 = Rand_ZeroOne() * 360.0f * 182.0f;
+/**
+ * Initialize the steam effect used for melting ice.
+ */
+void EnGo_MakeSteam(EnGo* this) {
+ static Vec3f sAccel = { 0.0f, 0.06f, 0.0f };
+ Vec3f tempPos;
+ Vec3f effectPos;
+ s16 rotAngle = Rand_ZeroOne() * 360.0f * 182.0f;
- Math_Vec3f_Copy(&sp54, &gZeroVec3f);
- sp54.z = 28.0f;
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, sp46, &sp54, &sp48);
- sp48.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
- sp48.y += this->actor.floorHeight;
- func_80A10FD0(&this->unk_3F8[16], sp48, D_80A16698, gZeroVec3f, 0.01f, 0.002f, 16);
+ Math_Vec3f_Copy(&tempPos, &gZeroVec3f);
+ tempPos.z = 28.0f;
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, rotAngle, &tempPos, &effectPos);
+ effectPos.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
+ effectPos.y += this->actor.floorHeight;
+ EnGo_InitSteam(&this->effectTable[ENGO_SNOW_EFFECT_COUNT], effectPos, sAccel, gZeroVec3f, ENGO_NORMAL_SCALE,
+ (0.2f * ENGO_NORMAL_SCALE), ENGO_DUST_STEAM_LIFETIME);
}
-s32 func_80A13B1C(EnGo* this, PlayState* play) {
+/**
+ * Transition through the cutscenes when the gatekeeper is opening the shrine.
+ *
+ * @return True when cutscenes end.
+ */
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 pad;
+ EnGo* this = THIS;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
- this->unk_3B8 = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- if (func_80A134F4(this, this->unk_3B8)) {
- this->unk_3C4 = 1;
- this->unk_3C0 = 1;
- } else {
+ this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->gatekeeperAnimState = 1;
+ this->cutsceneState = 1;
+ // fallthrough
case 1:
- if (ActorCutscene_GetCurrentIndex() != this->unk_3B8) {
- this->unk_3B8 = ActorCutscene_GetAdditionalCutscene(this->unk_3B8);
- this->unk_3C0 = 2;
- } else {
+ if (CutsceneManager_GetCurrentCsId() == this->csId) {
break;
}
-
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ this->cutsceneState = 2;
+ // fallthrough
case 2:
- if (func_80A134F4(this, this->unk_3B8)) {
- this->unk_3C0 = 3;
- } else {
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->cutsceneState = 3;
+ // fallthrough
case 3:
- if (ActorCutscene_GetCanPlayNext(0x7C)) {
- ActorCutscene_StartAndSetUnkLinkFields(0x7C, NULL);
- this->unk_3C0 = 4;
- } else if (ActorCutscene_GetCurrentIndex() == this->unk_3B8) {
- ActorCutscene_SetIntentToPlay(0x7C);
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_StartWithPlayerCs(CS_ID_GLOBAL_TALK, NULL);
+ this->cutsceneState = 4;
+ } else if (CutsceneManager_GetCurrentCsId() == this->csId) {
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
+ // fallthrough
+ default:
+ break;
}
- switch (this->unk_3C4) {
+ switch (this->gatekeeperAnimState) {
case 1:
- func_80A12C48(this, play, 4);
- this->unk_390 |= 0x4000;
- this->unk_3C4++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->gatekeeperAnimState++;
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 &= ~0x80;
- this->unk_390 |= 0x200;
- this->unk_3C4++;
- this->unk_3C2 = 0;
- this->actor.shape.yOffset = 14.0f;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
break;
case 3:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_JUMP);
- this->actor.velocity.y = 10.0f;
+ this->actor.velocity.y = ENGO_POUND_INITIAL_RISE_VEL;
this->actor.gravity = -1.0f;
- this->unk_3C4++;
+ this->gatekeeperAnimState++;
}
break;
case 4:
- if (func_80A13564(this, 10.0f, 0.004f, 6)) {
+ if (EnGo_HandleGatekeeperPoundCutscene(this, ENGO_POUND_INITIAL_RISE_VEL, (0.4f) * ENGO_NORMAL_SCALE, 6)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
- func_80A13728(this, play);
- this->unk_3C4++;
- this->unk_3C2 = 0;
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ EnGo_CreateGatekeeperPoundEffects(this, play);
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
}
break;
case 5:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
- func_80A12C48(this, play, 5);
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
this->actor.shape.rot.x = 0;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x80;
- this->unk_3C4++;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->gatekeeperAnimState++;
}
break;
case 6:
- this->unk_3C0++;
- if (this->unk_3C0 >= 65) {
+ this->cutsceneState++;
+ if (this->cutsceneState >= 65) {
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
- SET_WEEKEVENTREG(WEEKEVENTREG_88_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN);
break;
case PLAYER_FORM_GORON:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON);
break;
case PLAYER_FORM_ZORA:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_02);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA);
break;
case PLAYER_FORM_DEKU:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_01);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU);
+ break;
+
+ default:
break;
}
ret = true;
}
break;
+
+ default:
+ break;
}
Actor_MoveWithGravity(&this->actor);
return ret;
}
-s32 func_80A13E80(EnGo* this, PlayState* play) {
- static Vec3f D_80A166A4 = { 0.0f, 200.0f, 280.0f };
- s32 pad;
- Vec3f sp48;
+/**
+ * Medigoron's MsgEvent callback to give the Powder Keg for the test.
+ */
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play) {
+ static Vec3f sPowderKegSpawnOffset = { 0.0f, 200.0f, 280.0f };
+ EnGo* this = THIS;
+ Vec3f powderKegSpawnPos;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
- this->unk_3B8 = this->actor.cutscene;
- if (func_80A134F4(this, this->unk_3B8)) {
- this->unk_3C0++;
+ this->csId = this->actor.csId;
+ if (EnGo_ChangeCutscene(this, this->csId)) {
+ this->cutsceneState++;
}
break;
case 1:
- func_80A12C48(this, play, 7);
- this->unk_3C0++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_DROPKEG);
+ this->cutsceneState++;
case 2:
if (Animation_OnFrame(&this->skelAnime, 16.0f)) {
@@ -1246,262 +1662,349 @@ s32 func_80A13E80(EnGo* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 1);
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166A4, &sp48);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE_IMM);
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sPowderKegSpawnOffset,
+ &powderKegSpawnPos);
gSaveContext.powderKegTimer = 2400;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, sp48.x, sp48.y, sp48.z, 1, 0, 0, 0);
- func_80A134B0(this, play, 1);
- this->unk_3C2 = 0;
- this->unk_3C0++;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, powderKegSpawnPos.x, powderKegSpawnPos.y,
+ powderKegSpawnPos.z, BOMB_EXPLOSIVE_TYPE_POWDER_KEG, 0, 0, BOMB_TYPE_BODY);
+ EnGo_UpdateMedigoronColliderRadius(this, play, true);
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState++;
}
break;
case 3:
- if (this->unk_3C2 >= 60) {
- ActorCutscene_Stop(this->unk_3B8);
- this->unk_3C2 = 0;
- this->unk_3C0 = 0;
+ if (this->cutsceneDelayTimer >= 60) {
+ CutsceneManager_Stop(this->csId);
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState = 0;
ret = true;
} else {
- this->unk_3C2++;
+ this->cutsceneDelayTimer++;
}
break;
+
+ default:
+ break;
}
return ret;
}
-void func_80A14018(EnGo* this, PlayState* play) {
- static Vec3f D_80A166B0 = { 0.0f, 0.0f, 40.0f };
- static s32 D_80A166BC[] = { 11, 10, 12, 13, 14, 17 };
- Vec3f sp2C;
- s32 phi_v0 = ENGO_GET_70(&this->actor) % 6;
+/**
+ * Update the stretching racer's animation and actionFlags.
+ *
+ * 'ENGO_ATHLETIC_A' through 'ENGO_ATHLETIC_D' exchange animations before and after the race, while the hamstring
+ * stretchers have the same animation every time.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play) {
+ static Vec3f sStretchingGoronOffset = { 0.0f, 0.0f, 40.0f };
+ static s32 sSubtypeToAnimIndex[] = {
+ ENGO_ANIM_SQUAT_SIDE_TO_SIDE, ENGO_ANIM_DOUBLE_ARM_SIDEBEND, ENGO_ANIM_SHAKE_LIMBS,
+ ENGO_ANIM_SINGLE_ARM_SIDEBEND, ENGO_ANIM_SITTING_STRETCH, ENGO_ANIM_HELP_SITTING_STRETCH,
+ };
+ Vec3f newSittingStretcherPos;
- if (phi_v0 < 4) {
- phi_v0 = ((gSaveContext.eventInf[2] & 0xF) + phi_v0) % 4;
+ // The first four Racer Gorons have different stretches depending on context
+ // The last two remain the same (since they are dependent on one-another)
+ s32 subtypeLookup = ENGO_GET_SUBTYPE(&this->actor) % 6;
+
+ if (subtypeLookup < 4) {
+ subtypeLookup = ((gSaveContext.eventInf[2] & 0xF) + subtypeLookup) % 4;
}
- func_80A12C48(this, play, D_80A166BC[phi_v0]);
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[subtypeLookup]);
- if (this->unk_3DC == 14) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166B0, &sp2C);
- Math_Vec3f_Copy(&this->actor.world.pos, &sp2C);
+ // Move the sitting Goron forward, since their spawn location is the same as their standing counterpart.
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
+
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sStretchingGoronOffset,
+ &newSittingStretcherPos);
+ Math_Vec3f_Copy(&this->actor.world.pos, &newSittingStretcherPos);
}
+
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= (0x40 | 0x20);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= (ENGO_FLAG_LOST_ATTENTION | ENGO_FLAG_EYES_OPEN);
this->actor.gravity = 0.0f;
}
-void func_80A14104(EnGo* this, PlayState* play) {
- static s32 D_80A166D4[] = { 15, 16 };
- s16 temp;
+/**
+ * Update the Goron's animation and actionFlags to 'spectating'.
+ *
+ * Spectators engage in one of two cheering animations. Either cheering with their hands above their head, or
+ * cupping their hands infront of their face and shouting.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play) {
+ static s32 sSubtypeToAnimIndex[] = { ENGO_ANIM_CHEER, ENGO_ANIM_SHOUT };
+ s16 animFrame;
+
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[ENGO_GET_SUBTYPE(&this->actor) % 2]);
+ animFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
+ this->skelAnime.curFrame = animFrame;
- func_80A12C48(this, play, D_80A166D4[ENGO_GET_70(&this->actor) % 2]);
- temp = Rand_ZeroOne() * this->skelAnime.endFrame;
- this->skelAnime.curFrame = temp;
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
this->actor.gravity = 0.0f;
}
-void func_80A141D4(EnGo* this, PlayState* play) {
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit1);
+/**
+ * Update the Goron's animation and actionFlags to 'frozen'.
+ *
+ * The Goron will shiver upon awakening, but is otherwise encased in a block of ice which deals damage upon contact.
+ *
+ * @see EnGo_Frozen
+ */
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play) {
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInitFrozen);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 5);
- this->unk_3EC = 0;
- this->unk_39C = (this->unk_3A4 / 0.01f) * 0.9f;
- this->unk_3BE = 2;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x400;
- this->unk_3A0 = 100.0f;
+ this->curAnimIndex = -1;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->sleepState = ENGO_AWAKE;
+ this->iceBlockScale = (this->scaleFactor / 0.01f) * 0.9f;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FROZEN;
+ this->iceBlockAlpha = 100.0f;
}
-void func_80A1428C(EnGo* this, PlayState* play) {
- s16 temp;
- Vec3f sp30;
- Vec3f sp24;
+/**
+ * Update the Goron Gatekeeper's animation and actionFlags to 'snowball'.
+ *
+ * @see EnGo_Snowball
+ */
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play) {
+ s16 yawToPathPoint;
+ Vec3f currentPos;
+ Vec3f startingPathPoint;
- Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
- if (this->unk_284 != NULL) {
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ if (this->gatekeeperPath != NULL) {
this->actor.flags &= ~ACTOR_FLAG_2000000;
- SubS_CopyPointFromPathCheckBounds(this->unk_284, 0, &sp24);
- temp = Math_Vec3f_Yaw(&sp30, &sp24);
- this->actor.shape.rot.y = temp;
- this->actor.world.rot.y = temp;
+ SubS_CopyPointFromPathCheckBounds(this->gatekeeperPath, 0, &startingPathPoint);
+ yawToPathPoint = Math_Vec3f_Yaw(¤tPos, &startingPathPoint);
+ this->actor.shape.rot.y = yawToPathPoint;
+ this->actor.world.rot.y = yawToPathPoint;
}
- this->unk_390 = 0;
- this->unk_390 |= 0x100;
- this->actor.shape.yOffset = 46.0f;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_SNOWBALLED;
+ this->actor.shape.yOffset = ENGO_SNOWBALL_Y_OFFSET;
this->actor.gravity = -1.0f;
}
-void func_80A14324(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 8);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'covering ears'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_COVEREARS);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_3BC = 0;
- this->unk_3BE = 4;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A143A8(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 5);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'shivering'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A14430(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron stretching at the racetrack.
+ *
+ * Stretching Gorons placed in the starting area of the racetrack doing various stretches.
+ */
+void EnGo_SetupAthletic(EnGo* this, PlayState* play) {
if (((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 0)) ||
(gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 2))) &&
- (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80))) {
- func_80A14018(this, play);
- this->actionFunc = func_80A149B0;
+ (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE))) {
+ EnGo_ChangeToStretchingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A1449C(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron spectating at the racetrack.
+ *
+ * Spectators to the Goron races cannot be engaged, they simply stand idle and cheer.
+ */
+void EnGo_SetupSpectator(EnGo* this, PlayState* play) {
if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) ||
(gSaveContext.save.entrance == ENTRANCE(CUTSCENE, 0))) {
- func_80A14104(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToSpectatingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A144F4(EnGo* this, PlayState* play) {
+/**
+ * Setup the Goron Shrine's Gatekeeper.
+ *
+ * When spoken to, can open the Goron Shrine for the player.
+ * - On Day 1: Can be found in the open, shivering.
+ * - On Days 2,3: Can be found in a snowball.
+ */
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play) {
if (gSaveContext.save.day >= 2) {
- this->unk_284 = SubS_GetDayDependentPath(play, ENGO_GET_7F80(&this->actor), 0xFF, &this->unk_3E4);
- if (this->unk_284 != NULL) {
- this->unk_3E4 = 1;
+ this->gatekeeperPath = SubS_GetDayDependentPath(play, ENGO_GET_PATH_INDEX(&this->actor), ENGO_PATH_INDEX_NONE,
+ &this->indexPathPoint);
+ if (this->gatekeeperPath != NULL) {
+ this->indexPathPoint = 1;
}
- func_80A1428C(this, play);
- this->actionFunc = func_80A153FC;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToSnowballAnimation(this, play);
+ this->actionFunc = EnGo_Snowball;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
}
}
-void func_80A145AC(EnGo* this, PlayState* play) {
- if ((ENGO_GET_70(&this->actor) == ENGO_70_1) &&
+/**
+ * Setup a Goron at the graveyard
+ *
+ * The Gorons are together, one shivering from the cold, another frozen solid.
+ */
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) &&
(((play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
- (play->csCtx.currentCsIndex == 0)) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08))) {
- this->actor.child = func_80A13400(this, play);
+ (play->csCtx.scriptIndex == 0)) ||
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON))) {
+ this->actor.child = EnGo_FindGravemaker(this, play);
this->actor.child->child = &this->actor;
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14668(EnGo* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- func_80A14324(this, play);
- this->actionFunc = func_80A149B0;
+/**
+ * Setup a shrine Goron.
+ *
+ * There are three, but they all behave the same way aside from dialog.
+ */
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ EnGo_ChangeToCoveringEarsAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A146CC(EnGo* this, PlayState* play) {
- func_80A134B0(this, play, 0);
- func_80A12C48(this, play, 0);
- this->unk_3A4 *= 5.0f;
- Actor_SetScale(&this->actor, this->unk_3A4);
+/**
+ * Setup the Medigoron in the Powder Keg Shop.
+ *
+ * This Goron sells Powder Kegs, and gives the player a Powder Keg as part of a challenge to gain
+ * the privilege to buy them.
+ */
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play) {
+ EnGo_UpdateMedigoronColliderRadius(this, play, false);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE);
+ this->scaleFactor *= ENGO_MEDIGORON_SCALE_MULTIPLIER;
+ Actor_SetScale(&this->actor, this->scaleFactor);
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.targetMode = 3;
- this->unk_390 = 0;
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3D8 = func_80A13E80;
- this->actionFunc = func_80A149B0;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->msgEventFunc = EnGo_HandleGivePowderKegCutscene;
+ this->actionFunc = EnGo_Idle;
}
-void func_80A14798(EnGo* this, PlayState* play) {
- EffectTireMarkInit sp38 = {
- 0,
- 62,
- { 0, 0, 15, 100 },
- };
+/**
+ * Default setup function as the initial action function.
+ */
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play) {
+ EffectTireMarkInit tireMarkInit = { 0, 62, { 0, 0, 15, 100 } };
- if ((this->unk_288 < 0) || SubS_IsObjectLoaded(this->unk_288, play) || (this->unk_289 < 0) ||
- SubS_IsObjectLoaded(this->unk_289, play)) {
+ if (((this->taisouObjIndex < 0) || SubS_IsObjectLoaded(this->taisouObjIndex, play)) ||
+ ((this->hakuginDemoObjIndex < 0) || SubS_IsObjectLoaded(this->hakuginDemoObjIndex, play))) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable,
GORON_LIMB_MAX);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 2);
- this->actor.draw = func_80A15FEC;
+ this->curAnimIndex = ENGO_ANIM_INVALID;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL);
+ this->actor.draw = EnGo_Draw;
Collider_InitAndSetSphere(play, &this->colliderSphere, &this->actor, &sSphereInit);
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit2);
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- Effect_Add(play, &this->unk_3E8, EFFECT_TIRE_MARK, 0, 0, &sp38);
+ Effect_Add(play, &this->indexEffect, EFFECT_TIRE_MARK, 0, 0, &tireMarkInit);
this->actor.targetMode = 1;
- this->unk_3A4 = 0.01f;
- this->unk_3D8 = NULL;
+ this->scaleFactor = ENGO_NORMAL_SCALE;
+ this->msgEventFunc = NULL;
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_1:
- func_80A14430(this, play);
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_ATHLETIC:
+ EnGo_SetupAthletic(this, play);
break;
- case ENGO_F_2:
- func_80A1449C(this, play);
+ case ENGO_SPECTATOR:
+ EnGo_SetupSpectator(this, play);
break;
- case ENGO_F_3:
- func_80A144F4(this, play);
+ case ENGO_GATEKEEPER:
+ EnGo_SetupGatekeeper(this, play);
break;
- case ENGO_F_4:
- func_80A145AC(this, play);
+ case ENGO_GRAVEYARD:
+ EnGo_SetupGraveyardGoron(this, play);
break;
- case ENGO_F_5:
- case ENGO_F_6:
- case ENGO_F_7:
- func_80A14668(this, play);
+ case ENGO_ASIDE_STORE:
+ case ENGO_ASIDE_ELDERSROOM:
+ case ENGO_ASIDE_ELDERSSON:
+ EnGo_SetupShrineGoron(this, play);
break;
- case ENGO_F_8:
- func_80A146CC(this, play);
+ case ENGO_MEDIGORON:
+ EnGo_SetupMedigoron(this, play);
break;
default:
@@ -1511,203 +2014,256 @@ void func_80A14798(EnGo* this, PlayState* play) {
}
}
-void func_80A149B0(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Default action for the Gorons. Different types have different default actions.
+ *
+ * The default action possibilities include:
+ * - Shivering
+ * - Covering ears
+ * - Spectating (cheering or shouting)
+ * - Stretching (side-to-side squatting, two-arm side bend, limb shake, one-arm side bend, hamstring stretching while
+ * sitting, and helping the hamstring stretching Goron.)
+ */
+void EnGo_Idle(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_2) && (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_SPECTATOR) &&
+ (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ // Spectators only cheer. No other interactions
Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_CHEER - SFX_FLAG);
- } else if (ENGO_GET_F(&this->actor) != ENGO_F_8) {
- if (func_80A1222C(this, play)) {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3EC = 1;
- this->actionFunc = func_80A14B30;
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_4) {
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
- func_80A132C8(this, play);
+ } else if (ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) {
+ // All others besides the Medigoron in the Powder Keg Shop can fall asleep
+ if (EnGo_IsFallingAsleep(this, play)) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->sleepState = ENGO_ASLEEP_POS;
+ this->actionFunc = EnGo_Sleep;
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) {
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
+ EnGo_GravemakerIdle(this, play);
break;
- case ENGO_70_1:
- func_80A133A8(this, play);
+ case ENGO_GRAVEYARD_FROZEN:
+ EnGo_FrozenIdle(this, play);
+ break;
+
+ default:
break;
}
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
if (ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 0x3FFC) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
}
}
}
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14B30(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Handles falling asleep, as well as snoring while asleep.
+ */
+void EnGo_Sleep(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
u16 sfxId;
- if (func_80A1222C(this, play)) {
- this->unk_3EC = 1;
+ if (EnGo_IsFallingAsleep(this, play)) {
+ this->sleepState = ENGO_ASLEEP_POS;
}
- if (this->unk_390 & 0x4000) {
+ if (this->actionFlags & ENGO_FLAG_ROLLING_UP) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 |= 0x200;
- if (this->unk_3EC != 0) {
- this->unk_3AE = 0;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ if (this->sleepState != ENGO_AWAKE) {
+ this->snorePhase = 0;
}
- this->actor.shape.yOffset = 14.0f;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
- } else if (this->unk_390 & 0x8000) {
+ } else if (this->actionFlags & ENGO_FLAG_UNROLLING) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 |= 0x80;
- this->unk_390 &= ~0x8000;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_UNROLLING;
}
- } else if (this->unk_390 & 0x200) {
- if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) && (this->unk_3EC == 0)) {
- func_80A12C48(this, play, 3);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x8000;
- this->actor.shape.yOffset = 0.0f;
- } else if ((this->unk_3EC != 0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- this->actor.scale.x = this->unk_3A4 - (Math_SinS(this->unk_3AE) * 0.001f);
- this->actor.scale.y = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- this->actor.scale.z = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- if (this->unk_3AE == 0) {
- this->unk_3EC = -this->unk_3EC;
- if (this->unk_3EC > 0) {
- sfxId = NA_SE_EN_GOLON_SNORE1;
- } else {
- sfxId = NA_SE_EN_GOLON_SNORE2;
- }
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) &&
+ (this->sleepState == ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL_IMM);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_UNROLLING;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
+ } else if ((this->sleepState != ENGO_AWAKE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ // While asleep, rhythmicallly snore and change shape to show breathing.
+ this->actor.scale.x = this->scaleFactor - (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.y = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.z = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+
+ if (this->snorePhase == 0) {
+ this->sleepState = -this->sleepState;
+ sfxId = (this->sleepState > ENGO_AWAKE) ? NA_SE_EN_GOLON_SNORE1 : NA_SE_EN_GOLON_SNORE2;
Actor_PlaySfx(&this->actor, sfxId);
}
- this->unk_3AE += 0x400;
- this->actor.shape.yOffset = (this->actor.scale.y / this->unk_3A4) * 14.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ this->snorePhase += 0x400;
+ this->actor.shape.yOffset = (this->actor.scale.y / this->scaleFactor) * ENGO_ROLLEDUP_Y_OFFSET;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
}
} else if ((this->actor.xzDistToPlayer >= 240.0f) || (this->actor.playerHeightRel >= 20.0f) ||
- (this->unk_3EC != 0)) {
- func_80A12C48(this, play, 4);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x4000;
- this->actor.shape.yOffset = 0.0f;
+ (this->sleepState != ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14E14(EnGo* this, PlayState* play) {
- Actor* actor = this->colliderCylinder.base.ac;
+/**
+ * Action function for a frozen Goron.
+ *
+ * Transitions to the thawing cutscene when colliding with hot water or fire effect.
+ */
+void EnGo_Frozen(EnGo* this, PlayState* play) {
+ Actor* actorCollidedWith = this->colliderCylinder.base.ac;
- if ((this->unk_390 & 0x1000) && (((actor != NULL) && (actor->id == ACTOR_OBJ_AQUA) && (actor->params & 1)) ||
- (this->actor.colChkInfo.damageEffect == 2))) {
- this->actionFunc = func_80A14E74;
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) &&
+ (((actorCollidedWith != NULL) && (actorCollidedWith->id == ACTOR_OBJ_AQUA) && AQUA_HOT(actorCollidedWith)) ||
+ (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_FIRE))) {
+ this->actionFunc = EnGo_AwaitThaw;
}
}
-void func_80A14E74(EnGo* this, PlayState* play) {
- if (func_80A134F4(this, this->actor.cutscene)) {
- this->actionFunc = func_80A14EB0;
+/**
+ * Action function for transitioning to thawing.
+ */
+void EnGo_AwaitThaw(EnGo* this, PlayState* play) {
+ if (EnGo_ChangeCutscene(this, this->actor.csId)) {
+ this->actionFunc = EnGo_Thaw;
}
}
-void func_80A14EB0(EnGo* this, PlayState* play) {
- EnGo* sp24 = (EnGo*)this->actor.child;
+/**
+ * Action function for thawing of the Goron, melting sounds, and steam.
+ */
+void EnGo_Thaw(EnGo* this, PlayState* play) {
+ EnGo* otherGoron = (EnGo*)this->actor.child;
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
} else {
- ActorCutscene_Stop(this->actor.cutscene);
- func_80A143A8(this, play);
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (ENGO_GET_70(&this->actor) == ENGO_70_1)) {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
- func_80A143A8(sp24, play);
- sp24->actionFunc = func_80A149B0;
+ CutsceneManager_Stop(this->actor.csId);
+ EnGo_ChangeToShiveringAnimation(this, play);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN)) {
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
+ EnGo_ChangeToShiveringAnimation(otherGoron, play);
+ otherGoron->actionFunc = EnGo_Idle;
}
- this->actionFunc = func_80A149B0;
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14FC8(EnGo* this, PlayState* play) {
- s32 sp38[] = {
- 0, 2, 6, 20, 18, 5, 5, 15,
+/**
+ * Cutscene action function for the arrival of springtime.
+ *
+ * This cutscene consists of:
+ * - The gravemaker stops shivering and looks around.
+ * - The other Goron thaws and shivers briefly.
+ * - The gravemaker pats the other's back and gestures broadly.
+ * - They both look around.
+ * - They both cheer.
+ */
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ s32 animationIndices[] = {
+ ENGO_ANIM_LYINGDOWNIDLE, ENGO_ANIM_UNROLL, ENGO_ANIM_SHIVER_IMM, ENGO_ANIM_LOOK_AROUND,
+ ENGO_ANIM_SHOW, ENGO_ANIM_SHIVER, ENGO_ANIM_SHIVER, ENGO_ANIM_CHEER,
};
- u16 actorActionCmd = 0;
- s32 sp30;
- s32 actionIndex;
+ u16 cueType = 0;
+ s32 cueId;
+ s32 cueChannel;
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
- actorActionCmd = 128;
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
+ cueType = CS_CMD_ACTOR_CUE_128;
break;
- case ENGO_70_1:
- actorActionCmd = 129;
+ case ENGO_GRAVEYARD_FROZEN:
+ cueType = CS_CMD_ACTOR_CUE_129;
+ break;
+
+ default:
break;
}
- if ((actorActionCmd == 128) || (actorActionCmd == 129)) {
- if (Cutscene_CheckActorAction(play, actorActionCmd)) {
- actionIndex = Cutscene_GetActorActionIndex(play, actorActionCmd);
- sp30 = play->csCtx.actorActions[actionIndex]->action;
+ if ((cueType == CS_CMD_ACTOR_CUE_128) || (cueType == CS_CMD_ACTOR_CUE_129)) {
+ if (Cutscene_IsCueInChannel(play, cueType)) {
+ cueChannel = Cutscene_GetCueChannel(play, cueType);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
- if (this->unk_394 != (u8)sp30) {
- this->unk_394 = sp30;
- func_80A12C48(this, play, sp38[sp30]);
- this->unk_390 = 0;
- this->unk_390 |= 0x20;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ if (this->springArrivalCueId != (u8)cueId) {
+ this->springArrivalCueId = cueId;
+ EnGo_ChangeAnim(this, play, animationIndices[cueId]);
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
- switch (sp30) {
+ switch (cueId) {
case 1:
- this->unk_390 |= 0x80;
+ this->actionFlags |= ENGO_FLAG_STANDING;
this->skelAnime.curFrame = this->skelAnime.endFrame;
break;
case 5:
case 6:
- func_80A141D4(this, play);
+ EnGo_ChangeToFrozenAnimation(this, play);
+ break;
+
+ default:
break;
}
}
- switch (this->unk_394) {
+ switch (this->springArrivalCueId) {
case 3:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 20)) {
- func_80A12C48(this, play, 21);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_LOOK_AROUND)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LOOK_AROUND_LOOPED);
}
break;
case 4:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 18)) {
- func_80A12C48(this, play, 19);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_SHOW)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHOW_LOOPED);
}
break;
case 6:
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
- } else if (this->unk_390 & 0x400) {
- func_80A143A8(this, play);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_ChangeToShiveringAnimation(this, play);
}
break;
+
+ default:
+ break;
}
- if (actorActionCmd == 128) {
- switch (play->csCtx.frames) {
+ if (cueType == 128) {
+ switch (play->csCtx.curFrame) {
case 55:
case 100:
case 130:
@@ -1729,9 +2285,12 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 490:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
- } else if (actorActionCmd == 129) {
- switch (play->csCtx.frames) {
+ } else if (cueType == 129) {
+ switch (play->csCtx.curFrame) {
case 360:
case 390:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
@@ -1748,65 +2307,72 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 480:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
}
-void func_80A153FC(EnGo* this, PlayState* play) {
- Vec3s* sp5C;
- Vec3f sp50;
- Vec3f sp44;
+/**
+ * Action function for the Gatekeeper while they're in a snowball.
+ *
+ * On Day 2, they'll roll along a set path, and can be halted with certain attacks.
+ * On Day 3, they're frozen solid.
+ */
+void EnGo_Snowball(EnGo* this, PlayState* play) {
+ Vec3s* pathPoints;
+ Vec3f currentPos;
+ Vec3f currentPathPoint;
- if ((this->unk_390 & 0x1000) && (this->actor.colChkInfo.damageEffect == 0xF)) {
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) && (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_BREAK)) {
+ // Stop the Gatekeeper when hit by an appropriate effect
Actor_PlaySfx(&this->actor, NA_SE_EV_SNOWBALL_BROKEN);
-
this->actor.flags &= ~ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
-
- func_80A118F8(this->unk_3F8, this->actor.world.pos);
+ EnGo_InitSnow(this->effectTable, this->actor.world.pos);
this->actor.shape.rot.x = 0;
this->actor.speed = 0.0f;
-
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
if (gSaveContext.save.day == 3) {
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
- } else if (this->unk_284 != NULL) {
- if (this->unk_390 & 0x800) {
+ } else if (this->gatekeeperPath != NULL) {
+ if (this->actionFlags & ENGO_FLAG_HIT_OTHER) {
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
func_800B8D50(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
}
- sp5C = Lib_SegmentedToVirtual(this->unk_284->points);
- if (SubS_HasReachedPoint(&this->actor, this->unk_284, this->unk_3E4)) {
- if (this->unk_3E4 >= (this->unk_284->count - 1)) {
- this->unk_3E4 = 0;
+ pathPoints = Lib_SegmentedToVirtual(this->gatekeeperPath->points);
+ if (SubS_HasReachedPoint(&this->actor, this->gatekeeperPath, this->indexPathPoint)) {
+ if (this->indexPathPoint >= (this->gatekeeperPath->count - 1)) {
+ this->indexPathPoint = 0;
} else {
- this->unk_3E4++;
+ this->indexPathPoint++;
}
}
- Math_Vec3s_ToVec3f(&sp44, &sp5C[this->unk_3E4]);
- Math_Vec3f_Copy(&sp50, &this->actor.world.pos);
- Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&sp50, &sp44), 4, 0x38E);
+ Math_Vec3s_ToVec3f(¤tPathPoint, &pathPoints[this->indexPathPoint]);
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(¤tPos, ¤tPathPoint), 4, 0x38E);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BIGBALL_ROLL - SFX_FLAG);
- func_800AE930(&play->colCtx, Effect_GetByIndex(this->unk_3E8), &this->actor.world.pos, 18.0f,
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->indexEffect), &this->actor.world.pos, 18.0f,
this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
} else {
- func_800AEF44(Effect_GetByIndex(this->unk_3E8));
+ func_800AEF44(Effect_GetByIndex(this->indexEffect));
}
this->actor.speed = 4.0f;
@@ -1815,86 +2381,107 @@ void func_80A153FC(EnGo* this, PlayState* play) {
}
}
-s32* func_80A15684(EnGo* this, PlayState* play) {
- static s32* D_80A16704[] = {
- D_80A16100,
- D_80A16164,
+/**
+ * Return the MsgEvent script appropriate for the actor.
+ */
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play) {
+ static s32 sMsgScriptGraveyard[] = {
+ sMsgScriptGoronGravemaker,
+ sMsgScriptGoronFrozen,
};
- if (this->unk_3EC != 0) {
- return D_80A1640C;
+ if (this->sleepState != ENGO_AWAKE) {
+ return sMsgScriptGoronSleeping; // Lullaby hint
}
- if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
- switch (ENGO_GET_70(&this->actor) % 6) {
- case ENGO_70_0:
- return D_80A163BC;
- case ENGO_70_1:
- return D_80A163CC;
- case ENGO_70_2:
- return D_80A163DC;
- case ENGO_70_3:
- return D_80A163EC;
- case ENGO_70_4:
- return D_80A163FC;
- case ENGO_70_5:
- return D_80A163FC;
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
+ switch (ENGO_GET_SUBTYPE(&this->actor) % 6) {
+ case ENGO_ATHLETIC_A:
+ return sMsgScriptGoronAthleticA;
+
+ case ENGO_ATHLETIC_B: // Unused!
+ return sMsgScriptGoronAthleticB;
+
+ case ENGO_ATHLETIC_C:
+ return sMsgScriptGoronAthleticC;
+
+ case ENGO_ATHLETIC_D:
+ return sMsgScriptGoronAthleticD;
+
+ case ENGO_ATHLETIC_HAMSTRINGSIT:
+ return sMsgScriptGoronAthleticHamstring;
+
+ case ENGO_ATHLETIC_HAMSTRINGSTAND:
+ return sMsgScriptGoronAthleticHamstring;
+
+ default:
+ break;
}
}
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_3:
- return D_80A16350;
- case ENGO_F_4:
- return D_80A16704[ENGO_GET_70(&this->actor)];
- case ENGO_F_5:
- return D_80A16208;
- case ENGO_F_6:
- return D_80A16254;
- case ENGO_F_7:
- return D_80A16210;
- case ENGO_F_8:
- return D_80A16280;
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_GATEKEEPER:
+ return sMsgScriptGoronGatekeeper;
+
+ case ENGO_GRAVEYARD:
+ return sMsgScriptGraveyard[ENGO_GET_SUBTYPE(&this->actor)];
+
+ case ENGO_ASIDE_STORE:
+ return sMsgScriptGoronAsideStore;
+
+ case ENGO_ASIDE_ELDERSROOM:
+ return sMsgScriptGoronAsideEldersRoom;
+
+ case ENGO_ASIDE_ELDERSSON:
+ return sMsgScriptGoronAsideEldersSon;
+
+ case ENGO_MEDIGORON:
+ return sMsgScriptGoronMedigoron;
+
default:
- return D_80A16208;
+ return sMsgScriptGoronAsideStore;
}
}
-void func_80A157C4(EnGo* this, PlayState* play) {
+/**
+ * Action function for dialog, movement due to dialog, and ending dialog
+ */
+void EnGo_Talk(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
+ Vec3f targetPos;
+ Vec3f thisPos;
- if (!func_8010BF58(&this->actor, play, func_80A15684(this, play), this->unk_3D8, &this->unk_28C)) {
- if ((ENGO_GET_F(&this->actor) != ENGO_F_1) && !(this->unk_390 & 0x200)) {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp34, &sp40), 4, 0x2AA8);
+ if (!func_8010BF58(&this->actor, play, EnGo_GetMsgEventScript(this, play), this->msgEventFunc,
+ &this->msgScriptResumePos)) {
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&thisPos, &targetPos), 4, 0x2AA8);
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
return;
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_390 &= ~0x20;
- this->unk_3BE = 4;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->actionFlags &= ~ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
}
- this->unk_390 &= ~0x8;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_28C = 0;
- this->unk_390 |= 0x40;
- this->actionFunc = this->unk_18C;
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->msgScriptResumePos = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFunc = this->interruptedActionFunc;
}
void EnGo_Init(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- this->unk_288 = SubS_GetObjectIndex(OBJECT_TAISOU, play);
- this->unk_289 = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
- this->actionFunc = func_80A14798;
+ this->taisouObjIndex = SubS_GetObjectIndex(OBJECT_TAISOU, play);
+ this->hakuginDemoObjIndex = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
+ this->actionFunc = EnGo_SetupInitialAction;
}
void EnGo_Destroy(Actor* thisx, PlayState* play) {
@@ -1902,55 +2489,60 @@ void EnGo_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->colliderCylinder);
Collider_DestroySphere(play, &this->colliderSphere);
- Effect_Destroy(play, this->unk_3E8);
+ Effect_Destroy(play, this->indexEffect);
}
void EnGo_Update(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- f32 phi_f0;
+ f32 xzRange;
- func_80A12868(this, play);
- if (!func_80A12774(this, play)) {
- func_80A12954(this, play);
+ EnGo_DetectCollisions(this, play);
+
+ if (!EnGo_UpdateTalking(this, play)) {
+ EnGo_UpdateSpringArrivalCutscene(this, play);
}
this->actionFunc(this, play);
- if (!(this->unk_390 & 0x400)) {
- func_80A12D6C(this);
- func_80A12A64(this, play);
- func_80A131F8(this, play);
- func_80A12B78(this, play);
+ if (!(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ EnGo_UpdateEyes(this);
+ EnGo_UpdateAnimationToCurrent(this, play);
+ EnGo_UpdateAttentionTargetAndReactions(this, play);
+ EnGo_UpdateSfx(this, play);
}
- if (!(this->unk_390 & 0x100) && !(this->unk_390 & 0x200) && !(this->unk_390 & 0x400)) {
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- phi_f0 = this->colliderSphere.dim.worldSphere.radius + 60;
+ if (!(this->actionFlags & ENGO_FLAG_SNOWBALLED) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP) &&
+ !(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ xzRange = this->colliderSphere.dim.worldSphere.radius + 60;
} else {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
+ xzRange = this->colliderCylinder.dim.radius + 40;
}
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
- } else if ((this->unk_390 & 0x200) && (this->unk_3EC != 0)) {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
+ } else if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) && (this->sleepState != ENGO_AWAKE)) {
+ xzRange = this->colliderCylinder.dim.radius + 40;
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_2) &&
- (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_SPECTATOR) &&
+ (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
- func_80A122EC(this);
- func_80A126BC(this, play);
- func_80A1203C(this);
+ EnGo_UpdateFocus(this);
+ EnGo_UpdateCollider(this, play);
+ EnGo_UpdateEffects(this);
}
-void func_80A15B80(EnGo* this, PlayState* play) {
+/**
+ * Draw function for a snowballed or rolled up Goron (no need to draw limbs).
+ */
+void EnGo_Draw_NoSkeleton(EnGo* this, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
@@ -1959,7 +2551,7 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
Matrix_Translate(0.0f, this->actor.shape.yOffset, 0.0f, MTXMODE_APPLY);
- if (this->unk_390 & 0x100) {
+ if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
Matrix_Scale(this->actor.scale.x * 8.0f, this->actor.scale.y * 8.0f, this->actor.scale.z * 8.0f, MTXMODE_APPLY);
} else {
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
@@ -1968,60 +2560,59 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, (this->unk_390 & 0x100) ? gGoronSnowballDL : gGoronRolledUpDL);
+ gSPDisplayList(POLY_OPA_DISP++, (this->actionFlags & ENGO_FLAG_SNOWBALLED) ? gGoronSnowballDL : gGoronRolledUpDL);
CLOSE_DISPS(play->state.gfxCtx);
}
s32 EnGo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnGo* this = THIS;
- Vec3f sp30;
- s32 idx;
+ Vec3f worldPos;
+ s32 rotTableIndex;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_8) && (limbIndex == 10)) {
- Matrix_MultZero(&sp30);
- sp30.y = this->actor.world.pos.y;
- Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) && (limbIndex == GORON_LIMB_BODY)) {
+ Matrix_MultZero(&worldPos);
+ worldPos.y = this->actor.world.pos.y;
+ Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &worldPos);
}
switch (limbIndex) {
- case 10:
- idx = 0;
+ case GORON_LIMB_BODY:
+ rotTableIndex = 0;
break;
- case 11:
- idx = 1;
+ case GORON_LIMB_LEFT_UPPER_ARM:
+ rotTableIndex = 1;
break;
- case 14:
- idx = 2;
+ case GORON_LIMB_RIGHT_UPPER_ARM:
+ rotTableIndex = 2;
break;
default:
- idx = 9;
+ rotTableIndex = 9;
break;
}
- if ((this->unk_390 & 0x80) && (idx < 9)) {
- rot->y += (s16)(Math_SinS(this->unk_3CE[idx]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk_3C8[idx]) * 200.0f);
+ if ((this->actionFlags & ENGO_FLAG_STANDING) && (rotTableIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->limbRotTableY[rotTableIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->limbRotTableZ[rotTableIndex]) * 200.0f);
}
return false;
}
void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnGo* this = THIS;
- u16 temp_v0;
s32 stepRot;
s32 overrideRot;
- if (this->unk_390 & 0x40) {
+ if (this->actionFlags & ENGO_FLAG_LOST_ATTENTION) {
stepRot = false;
} else {
stepRot = true;
}
- if (this->unk_390 & 0x10) {
+ if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
overrideRot = true;
} else {
overrideRot = false;
@@ -2032,47 +2623,50 @@ void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
}
switch (limbIndex) {
- case 17:
- SubS_UpdateLimb(this->unk_3B0 + this->unk_3B4 + 0x4000,
- this->unk_3B2 + this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_290,
- &this->unk_2A8, stepRot, overrideRot);
+ case GORON_LIMB_HEAD:
+ SubS_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000,
+ this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->headPos,
+ &this->headRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_290.x, this->unk_290.y, this->unk_290.z, MTXMODE_NEW);
+ Matrix_Translate(this->headPos.x, this->headPos.y, this->headPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2A8.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2A8.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2A8.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
- case 10:
- SubS_UpdateLimb(this->unk_3B4 + 0x4000, this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_29C,
- &this->unk_2AE, stepRot, overrideRot);
+ case GORON_LIMB_BODY:
+ SubS_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->bodyPos,
+ &this->bodyRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_29C.x, this->unk_29C.y, this->unk_29C.z, MTXMODE_NEW);
+ Matrix_Translate(this->bodyPos.x, this->bodyPos.y, this->bodyPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2AE.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2AE.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2AE.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->bodyRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->bodyRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->bodyRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
+
+ default:
+ break;
}
}
-void func_80A15FEC(Actor* thisx, PlayState* play) {
- static TexturePtr D_80A1670C[] = {
+void EnGo_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
gGoronEyeOpenTex, gGoronEyeHalfTex, gGoronEyeClosedTex, gGoronEyeHalfTex, gGoronEyeClosed2Tex,
};
EnGo* this = THIS;
- if (!(this->unk_390 & 0x300)) {
+ if (!(this->actionFlags & (ENGO_FLAG_SNOWBALLED | ENGO_FLAG_ROLLED_UP))) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A1670C[this->unk_3BE]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
- if (this->unk_3DC == 14) {
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
Matrix_Translate(0.0f, 0.0f, -4000.0f, MTXMODE_APPLY);
}
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
@@ -2081,8 +2675,8 @@ void func_80A15FEC(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
} else {
- func_80A15B80(this, play);
+ EnGo_Draw_NoSkeleton(this, play);
}
- func_80A137C0(this, play, this->unk_39C, this->unk_3A0);
- func_80A1213C(this, play);
+ EnGo_DrawIceBlockWhenFrozen(this, play, this->iceBlockScale, this->iceBlockAlpha);
+ EnGo_DrawEffects(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.h b/src/overlays/actors/ovl_En_Go/z_en_go.h
index fd4876430..5162a4f77 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.h
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.h
@@ -2,103 +2,142 @@
#define Z_EN_GO_H
#include "global.h"
+#include "objects/object_oF1d_map/object_oF1d_map.h"
struct EnGo;
typedef void (*EnGoActionFunc)(struct EnGo*, PlayState*);
+typedef s32 (*MsgEventFunc)(Actor*, PlayState*);
-#define ENGO_GET_F(thisx) (((thisx)->params & 0xF) & 0xFF)
-#define ENGO_GET_70(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
-#define ENGO_GET_7F80(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+#define ENGO_GET_TYPE(thisx) (((thisx)->params & 0xF) & 0xFF)
+#define ENGO_GET_SUBTYPE(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
+#define ENGO_GET_PATH_INDEX(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
-enum {
+#define ENGO_PATH_INDEX_NONE 0xFF
+
+#define ENGO_SNOW_EFFECT_COUNT 16
+#define ENGO_OTHER_EFFECT_COUNT 16
+#define ENGO_EFFECT_COUNT (ENGO_SNOW_EFFECT_COUNT + ENGO_OTHER_EFFECT_COUNT)
+
+/**
+ * Struct to track the state of various visual effects.
+ *
+ * A Goron's 'effectTable' is comprised of a number of these effects, which depending on the context in which they are
+ * used, take on the form of snow, dust, or steam. The functions using these objects have an expectation that they are
+ * iterating through the full effectTable, or half of the effectTable. See individual functions containing 'EnGoEffect*'
+ * parameters for more details.
+ */
+typedef struct EnGoEffect {
+ /* 0x00 */ u8 type;
+ /* 0x01 */ u8 alphaDenom;
+ /* 0x02 */ u8 alphaNumer;
+ /* 0x04 */ Vec3s rotVelocity;
+ /* 0x0A */ Vec3s rotAngle;
+ /* 0x10 */ Vec3f pos;
+ /* 0x1C */ Vec3f accel;
+ /* 0x28 */ Vec3f velocity;
+ /* 0x34 */ f32 scaleXY;
+ /* 0x38 */ f32 scaleXYDelta;
+} EnGoEffect; // size = 0x3C;
+
+/**
+ * Goron Type, identified by bits [3..0] of the actor's params
+ *
+ * - The ENGO_ATHLETIC and ENGO_SPECTATOR types share the same subtype domain (EnGoRacetrackSubtype: [0,7])
+ * - ENGO_GRAVEYARD types have their own subtype domain (EnGoGraveyardSubtype: [0,1])
+ * - Others have no subtypes.
+ */
+typedef enum EnGoType {
/* 0 */ ENGO_F_0,
- /* 1 */ ENGO_F_1,
- /* 2 */ ENGO_F_2,
- /* 3 */ ENGO_F_3,
- /* 4 */ ENGO_F_4,
- /* 5 */ ENGO_F_5,
- /* 6 */ ENGO_F_6,
- /* 7 */ ENGO_F_7,
- /* 8 */ ENGO_F_8,
-};
+ /* 1 */ ENGO_ATHLETIC, // Racers stretching before the race
+ /* 2 */ ENGO_SPECTATOR, // Spectators to the race
+ /* 3 */ ENGO_GATEKEEPER, // Gatekeeper to the Goron Shrine
+ /* 4 */ ENGO_GRAVEYARD, // Gravemaker and other
+ /* 5 */ ENGO_ASIDE_STORE, // Shrine Goron outside store
+ /* 6 */ ENGO_ASIDE_ELDERSROOM, // Shrine Goron outside Elder's room
+ /* 7 */ ENGO_ASIDE_ELDERSSON, // Shrine Goron aside the Elder's Son
+ /* 8 */ ENGO_MEDIGORON // Medigoron selling Powder Kegs
+} EnGoType;
-enum {
- /* 0 */ ENGO_70_0,
- /* 1 */ ENGO_70_1,
- /* 2 */ ENGO_70_2,
- /* 3 */ ENGO_70_3,
- /* 4 */ ENGO_70_4,
- /* 5 */ ENGO_70_5,
-};
+/**
+ * Subtype for Gorons at the racetrack (ENGO_ATHLETIC and ENGO_SPECTATOR)
+ */
+typedef enum EnGoRacetrackSubtype {
+ /* 0 */ ENGO_ATHLETIC_A,
+ /* 1 */ ENGO_ATHLETIC_B,
+ /* 2 */ ENGO_ATHLETIC_C,
+ /* 3 */ ENGO_ATHLETIC_D,
+ /* 4 */ ENGO_ATHLETIC_HAMSTRINGSIT,
+ /* 5 */ ENGO_ATHLETIC_HAMSTRINGSTAND,
+ /* 6 */ ENGO_SPECTATOR_CHEER,
+ /* 7 */ ENGO_SPECTATOR_SHOUTING
+} EnGoRacetrackSubtype;
-typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
- /* 0x02 */ u8 unk_02;
- /* 0x04 */ Vec3s unk_04;
- /* 0x0A */ Vec3s unk_0A;
- /* 0x10 */ Vec3f unk_10;
- /* 0x1C */ Vec3f unk_1C;
- /* 0x28 */ Vec3f unk_28;
- /* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38;
-} EnGoStruct; // size = 0x3C;
+/**
+ * Subtype for Gorons outside the Goron Graveyard (ENGO_GRAVEYARD)
+ */
+typedef enum EnGoGraveyardSubtype {
+ /* 0 */ ENGO_GRAVEYARD_GRAVEMAKER,
+ /* 1 */ ENGO_GRAVEYARD_FROZEN
+} EnGoGraveyardSubtype;
typedef struct EnGo {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnGoActionFunc actionFunc;
- /* 0x18C */ EnGoActionFunc unk_18C;
- /* 0x190 */ EnGoActionFunc unk_190;
+ /* 0x18C */ EnGoActionFunc interruptedActionFunc;
+ /* 0x190 */ EnGoActionFunc graveyardDialogActionFunc;
/* 0x194 */ ColliderCylinder colliderCylinder;
- /* 0x1E0 */ UNK_TYPE1 unk1E0[0x4C];
+ /* 0x1E0 */ ColliderCylinder unusedCylinder;
/* 0x22C */ ColliderSphere colliderSphere;
- /* 0x284 */ Path* unk_284;
- /* 0x288 */ s8 unk_288;
- /* 0x289 */ s8 unk_289;
- /* 0x28C */ s32 unk_28C;
- /* 0x290 */ Vec3f unk_290;
- /* 0x29C */ Vec3f unk_29C;
- /* 0x2A8 */ Vec3s unk_2A8;
- /* 0x2AE */ Vec3s unk_2AE;
- /* 0x2B4 */ Vec3s jointTable[18];
- /* 0x320 */ Vec3s morphTable[18];
- /* 0x38C */ Actor* unk_38C;
- /* 0x390 */ u16 unk_390;
- /* 0x392 */ u16 unk_392;
- /* 0x394 */ u8 unk_394;
- /* 0x398 */ f32 unk_398;
- /* 0x39C */ f32 unk_39C;
- /* 0x3A0 */ f32 unk_3A0;
- /* 0x3A4 */ f32 unk_3A4;
- /* 0x3A8 */ f32 unk_3A8;
+ /* 0x284 */ Path* gatekeeperPath;
+ /* 0x288 */ s8 taisouObjIndex;
+ /* 0x289 */ s8 hakuginDemoObjIndex;
+ /* 0x28C */ s32 msgScriptResumePos;
+ /* 0x290 */ Vec3f headPos;
+ /* 0x29C */ Vec3f bodyPos;
+ /* 0x2A8 */ Vec3s headRot;
+ /* 0x2AE */ Vec3s bodyRot;
+ /* 0x2B4 */ Vec3s jointTable[GORON_LIMB_MAX];
+ /* 0x320 */ Vec3s morphTable[GORON_LIMB_MAX];
+ /* 0x38C */ Actor* attentionTarget;
+ /* 0x390 */ u16 actionFlags;
+ /* 0x392 */ u16 lastTextId;
+ /* 0x394 */ u8 springArrivalCueId;
+ /* 0x398 */ f32 curAnimPlaySpeed;
+ /* 0x39C */ f32 iceBlockScale;
+ /* 0x3A0 */ f32 iceBlockAlpha;
+ /* 0x3A4 */ f32 scaleFactor;
+ /* 0x3A8 */ f32 scaleFactorPoundDistortion;
/* 0x3AC */ UNK_TYPE1 unk3AC[0x2];
- /* 0x3AE */ s16 unk_3AE;
- /* 0x3B0 */ s16 unk_3B0;
- /* 0x3B2 */ s16 unk_3B2;
- /* 0x3B4 */ s16 unk_3B4;
- /* 0x3B6 */ s16 unk_3B6;
- /* 0x3B8 */ s16 unk_3B8;
- /* 0x3BA */ s16 unk_3BA;
- /* 0x3BC */ s16 unk_3BC;
- /* 0x3BE */ s16 unk_3BE;
- /* 0x3C0 */ s16 unk_3C0;
- /* 0x3C2 */ s16 unk_3C2;
- /* 0x3C4 */ s16 unk_3C4;
- /* 0x3C6 */ s16 unk_3C6;
- /* 0x3C8 */ s16 unk_3C8[3];
- /* 0x3CE */ s16 unk_3CE[3];
- /* 0x3D4 */ s16 unk_3D4;
- /* 0x3D8 */ void* unk_3D8;
- /* 0x3DC */ s32 unk_3DC;
+ /* 0x3AE */ union {
+ s16 snorePhase; // Used whilst a Goron is sleeping, +0x400 at a time
+ s16 elapsedHangtime; // Hangtime at the top of a pound.
+ };
+ /* 0x3B0 */ s16 headRotZ;
+ /* 0x3B2 */ s16 headRotY;
+ /* 0x3B4 */ s16 bodyRotZ;
+ /* 0x3B6 */ s16 bodyRotY;
+ /* 0x3B8 */ s16 csId;
+ /* 0x3BA */ s16 loseAttentionTimer;
+ /* 0x3BC */ s16 blinkTimer;
+ /* 0x3BE */ s16 eyeTexIndex;
+ /* 0x3C0 */ s16 cutsceneState;
+ /* 0x3C2 */ s16 cutsceneDelayTimer;
+ /* 0x3C4 */ s16 gatekeeperAnimState;
+ /* 0x3C6 */ s16 harmlessTimer;
+ /* 0x3C8 */ s16 limbRotTableZ[3];
+ /* 0x3CE */ s16 limbRotTableY[3];
+ /* 0x3D4 */ s16 surprisePhase;
+ /* 0x3D8 */ MsgEventFunc msgEventFunc;
+ /* 0x3DC */ s32 curAnimIndex;
/* 0x3E0 */ UNK_TYPE1 unk3E0[0x4];
- /* 0x3E4 */ s32 unk_3E4;
- /* 0x3E8 */ s32 unk_3E8;
- /* 0x3EC */ s32 unk_3EC;
- /* 0x3F0 */ s32 unk_3F0;
- /* 0x3F4 */ s32 unk_3F4;
- /* 0x3F8 */ EnGoStruct unk_3F8[32];
+ /* 0x3E4 */ s32 indexPathPoint;
+ /* 0x3E8 */ s32 indexEffect;
+ /* 0x3EC */ s32 sleepState;
+ /* 0x3F0 */ s32 springArrivalCutsceneActive;
+ /* 0x3F4 */ s32 changedText;
+ /* 0x3F8 */ EnGoEffect effectTable[ENGO_EFFECT_COUNT];
} EnGo; // size = 0xB78
#endif // Z_EN_GO_H
diff --git a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
index 312e1a9d9..148b2d116 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
@@ -451,11 +451,11 @@ s32 func_8093F6F8(EnGoroiwa* this, PlayState* play) {
if ((this->actor.velocity.y < 0.0f) && (this->actor.world.pos.y <= sp7C)) {
if (this->unk_1CA == 0) {
if (this->actor.xzDistToPlayer < 400.0f) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 3, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 3, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
}
this->unk_1C4 = 0.0f;
@@ -1431,7 +1431,7 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
Vec3f sp50;
f32 sp4C;
s32 sp48 = true;
- u32 temp_v0_2;
+ FloorType floorType;
CollisionPoly* tmp;
if (!(player->stateFlags1 &
@@ -1453,9 +1453,9 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
if (this->actor.flags & ACTOR_FLAG_40) {
tmp = this->actor.floorPoly;
if (tmp != NULL) {
- temp_v0_2 = func_800C99D4(&play->colCtx, tmp, this->actor.floorBgId);
+ floorType = SurfaceType_GetFloorType(&play->colCtx, tmp, this->actor.floorBgId);
- if ((temp_v0_2 == 14) || (temp_v0_2 == 15)) {
+ if ((floorType == FLOOR_TYPE_14) || (floorType == FLOOR_TYPE_15)) {
if (!(this->unk_1E5 & 0x40)) {
sp50.x = this->actor.world.pos.x;
sp50.y = this->actor.floorHeight;
@@ -1485,7 +1485,8 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
switch (ENGOROIWA_GET_400(&this->actor)) {
case ENGOROIWA_400_1:
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
break;
case ENGOROIWA_400_0:
@@ -1574,7 +1575,7 @@ void func_80942B1C(EnGoroiwa* this, PlayState* play) {
if ((ptr->unk_28 != 0) && (ptr->unk_2C > 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0,
0, COMBINED);
diff --git a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
index e672355e5..2ace5ff85 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
@@ -14,27 +14,27 @@ typedef s32 (*EnGoroiwaUnkFunc)(struct EnGoroiwa*);
#define ENGOROIWA_GET_300(thisx) (((thisx)->params >> 0x8) & 3)
#define ENGOROIWA_GET_FF(thisx) ((thisx)->params & 0xFF)
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_300_0,
/* 1 */ ENGOROIWA_300_1,
- /* 3 */ ENGOROIWA_300_3 = 3,
-};
+ /* 3 */ ENGOROIWA_300_3 = 3
+} EnGoroiwaParam300;
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_400_0,
- /* 1 */ ENGOROIWA_400_1,
-};
+ /* 1 */ ENGOROIWA_400_1
+} EnGoroiwaParam400;
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_3000_0,
/* 1 */ ENGOROIWA_3000_1,
- /* 2 */ ENGOROIWA_3000_2,
-};
+ /* 2 */ ENGOROIWA_3000_2
+} EnGoroiwaParam3000;
-enum {
+typedef enum {
/* 1 */ ENGOROIWA_C000_1 = 1,
- /* 2 */ ENGOROIWA_C000_2,
-};
+ /* 2 */ ENGOROIWA_C000_2
+} EnGoroiwaParamC000;
typedef struct {
/* 0x00 */ Vec3f unk_00;
diff --git a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
index a67c6475d..bfd2d19ab 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
@@ -52,18 +52,18 @@ typedef enum {
/* 7 */ EN_GRASSHOPPER_ACTION_WAIT_AFTER_ATTACK,
/* 8 */ EN_GRASSHOPPER_ACTION_DAMAGED,
/* 9 */ EN_GRASSHOPPER_ACTION_DEAD,
- /* 10 */ EN_GRASSHOPPER_ACTION_FALL,
+ /* 10 */ EN_GRASSHOPPER_ACTION_FALL
} EnGrasshopperAction;
typedef enum {
/* 0 */ EN_GRASSHOPPER_DECISION_ATTACK,
/* 1 */ EN_GRASSHOPPER_DECISION_FLY,
- /* 2 */ EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES, // Never used in the final game
+ /* 2 */ EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES // Never used in the final game
} EnGrasshopperNextAction;
typedef enum {
/* 0 */ EN_GRASSHOPPER_BANK_STATE_BANKING,
- /* 1 */ EN_GRASSHOPPER_BANK_STATE_DONE,
+ /* 1 */ EN_GRASSHOPPER_BANK_STATE_DONE
} EnGrasshopperBankState;
typedef enum {
@@ -74,7 +74,7 @@ typedef enum {
/* 4 */ EN_GRASSHOPPER_ANIM_HOVER,
/* 5 */ EN_GRASSHOPPER_ANIM_DAMAGE,
/* 6 */ EN_GRASSHOPPER_ANIM_DEAD,
- /* 7 */ EN_GRASSHOPPER_ANIM_FALL,
+ /* 7 */ EN_GRASSHOPPER_ANIM_FALL
} EnGrasshopperAnim;
static s32 sOccupiedIndices[] = {
@@ -99,7 +99,7 @@ typedef enum {
/* 0x3 */ EN_GRASSHOPPER_DMGEFF_FREEZE, // Damages and freezes the Dragonfly in ice
/* 0x4 */ EN_GRASSHOPPER_DMGEFF_LIGHT_ORB, // Damages and surrounds the Dragonfly with light orbs
/* 0xE */ EN_GRASSHOPPER_DMGEFF_HOOK = 0xE, // If hit by the Hookshot, it pulls the Dragonfly towards the player
- /* 0xF */ EN_GRASSHOPPER_DMGEFF_NONE, // Deals regular damage with no extra effect
+ /* 0xF */ EN_GRASSHOPPER_DMGEFF_NONE // Deals regular damage with no extra effect
} EnDragonflyDamageEffect;
static DamageTable sDamageTable = {
@@ -246,7 +246,7 @@ void EnGrasshopper_Init(Actor* thisx, PlayState* play) {
this->type;
}
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
EnGrasshopper_SetupFly(this);
}
@@ -343,7 +343,7 @@ void EnGrasshopper_DecideAction(EnGrasshopper* this, PlayState* play) {
void EnGrasshopper_SetupFly(EnGrasshopper* this) {
EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_FLY);
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
this->action = EN_GRASSHOPPER_ACTION_FLY;
this->actionFunc = EnGrasshopper_Fly;
}
@@ -384,7 +384,7 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
}
if (this->shouldTurn) {
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
this->targetRot.y = Math_Atan2S(diffX, diffZ);
this->timer = Rand_S16Offset(30, 30);
}
@@ -412,7 +412,7 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
this->targetRot.y = Math_Atan2S(diffX, diffZ);
this->timer = Rand_S16Offset(30, 70);
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
}
}
}
@@ -441,7 +441,7 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
this->baseFlyHeight = Math_SinS(this->bobPhase) * 10.0f;
if (this->timer == 0) {
- this->baseFlyHeight = randPlusMinusPoint5Scaled(10.0f);
+ this->baseFlyHeight = Rand_CenteredFloat(10.0f);
this->timer = Rand_S16Offset(30, 30);
}
@@ -583,8 +583,8 @@ void EnGrasshopper_ApproachPlayer(EnGrasshopper* this, PlayState* play) {
if ((this->splashCount < 3) || !(play->gameplayFrames % 8)) {
this->splashCount++;
Math_Vec3f_Copy(&splashPos, &this->tailTipPos);
- splashPos.x += randPlusMinusPoint5Scaled(20.0f);
- splashPos.z += randPlusMinusPoint5Scaled(20.0f);
+ splashPos.x += Rand_CenteredFloat(20.0f);
+ splashPos.z += Rand_CenteredFloat(20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (((s32)Rand_ZeroOne() * 100) + 400));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EV_BOMB_DROP_WATER);
}
@@ -633,8 +633,8 @@ void EnGrasshopper_Attack(EnGrasshopper* this, PlayState* play) {
if ((this->splashCount < 3) || !(play->gameplayFrames % 8)) {
this->splashCount++;
Math_Vec3f_Copy(&splashPos, &this->tailTipPos);
- splashPos.x += randPlusMinusPoint5Scaled(20.0f);
- splashPos.z += randPlusMinusPoint5Scaled(20.0f);
+ splashPos.x += Rand_CenteredFloat(20.0f);
+ splashPos.z += Rand_CenteredFloat(20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, ((s32)Rand_ZeroOne() * 100) + 400);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EV_BOMB_DROP_WATER);
}
@@ -796,8 +796,8 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
for (i = 0; i < 3; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled((i * 5.0f) + 20.0f);
- splashPos.z += randPlusMinusPoint5Scaled((i * 5.0f) + 20.0f);
+ splashPos.x += Rand_CenteredFloat((i * 5.0f) + 20.0f);
+ splashPos.z += Rand_CenteredFloat((i * 5.0f) + 20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (((s32)Rand_ZeroOne() * 100) + 400));
}
@@ -826,7 +826,7 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sFireVelocityAndAccel); i++) {
Math_Vec3f_Copy(&firePos, &this->actor.world.pos);
- firePos.x += randPlusMinusPoint5Scaled(30.0f);
+ firePos.x += Rand_CenteredFloat(30.0f);
if (!isUnderWater) {
firePos.y = this->actor.floorHeight;
} else if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
@@ -834,7 +834,7 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
firePos.y = waterSurface;
}
- firePos.z += randPlusMinusPoint5Scaled(30.0f);
+ firePos.z += Rand_CenteredFloat(30.0f);
func_800B3030(play, &firePos, &sFireVelocityAndAccel[i], &sFireVelocityAndAccel[i], 100, 0, 2);
}
@@ -920,7 +920,9 @@ void EnGrasshopper_Update(Actor* thisx, PlayState* play) {
Math_ApproachZeroF(&this->damagedVelocity.y, 1.0f, 2.0f);
Math_ApproachZeroF(&this->damagedVelocity.z, 1.0f, 2.0f);
if ((this->action != EN_GRASSHOPPER_ACTION_FALL) && (this->type != EN_GRASSHOPPER_TYPE_WOODFALL)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
this->actor.shape.rot.z = this->actor.world.rot.z;
@@ -1005,7 +1007,7 @@ void EnGrasshopper_Draw(Actor* thisx, PlayState* play) {
u8* shadowTex = GRAPH_ALLOC(play->state.gfxCtx, SUBS_SHADOW_TEX_SIZE);
u8* shadowTexIter;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, EnGrasshopper_PostLimbDraw,
&this->actor);
if ((this->type != EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM) &&
@@ -1060,10 +1062,10 @@ void EnGrasshopper_InitializeEffect(EnGrasshopper* this, Vec3f* pos) {
effect->isEnabled = true;
effect->pos = *pos;
effect->timer = 10;
- effect->velocity.x = randPlusMinusPoint5Scaled(20.0f);
- effect->velocity.y = randPlusMinusPoint5Scaled(20.0f);
- effect->velocity.z = randPlusMinusPoint5Scaled(20.0f);
- effect->yaw = randPlusMinusPoint5Scaled(30000.0f);
+ effect->velocity.x = Rand_CenteredFloat(20.0f);
+ effect->velocity.y = Rand_CenteredFloat(20.0f);
+ effect->velocity.z = Rand_CenteredFloat(20.0f);
+ effect->yaw = Rand_CenteredFloat(30000.0f);
return;
}
}
@@ -1132,7 +1134,7 @@ void EnGrasshopper_DrawEffects(EnGrasshopper* this, PlayState* play) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(play->state.gfxCtx);
+ Gfx_SetupDL61_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sLightningTextures[effect->lightningIndex]));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
index 8056253f6..049091393 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.h
@@ -6,6 +6,8 @@
#define EN_GRASSHOPPER_GET_TYPE(thisx) ((thisx)->params)
+#define EN_GRASSHOPPER_PARAMS(type) (type)
+
struct EnGrasshopper;
typedef void (*EnGrasshopperActionFunc)(struct EnGrasshopper*, PlayState*);
@@ -15,7 +17,7 @@ typedef enum EnGrasshopperType {
/* 0 */ EN_GRASSHOPPER_TYPE_NORMAL,
/* 1 */ EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED, // Spawned by EnEncount1
/* 2 */ EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM,
- /* 3 */ EN_GRASSHOPPER_TYPE_WOODFALL,
+ /* 3 */ EN_GRASSHOPPER_TYPE_WOODFALL
} EnGrasshopperType;
typedef struct EnGrasshopperEffect {
diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
index aea9d4ac3..6f6f2cad9 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c
@@ -5,6 +5,7 @@
*/
#include "z_en_gs.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/object_gs/object_gs.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -112,7 +113,7 @@ s8 func_80997A90(s16 arg0, s16 arg1) {
if ((arg0 == 0) || ((arg0 != 1) && (arg0 != 2) && (arg0 == 3))) {
phi_v1 = 0;
} else {
- phi_v1 = (gSaveContext.save.unk_EC4 >> (arg1 * 3)) & 7;
+ phi_v1 = (gSaveContext.save.saveInfo.unk_EA0 >> (arg1 * 3)) & 7;
}
return phi_v1;
}
@@ -156,7 +157,7 @@ void EnGs_Init(Actor* thisx, PlayState* play) {
this->unk_1F4 = this->unk_1FA;
Math_Vec3f_Copy(&this->unk_1B0[0], &gOneVec3f);
Math_Vec3f_Copy(&this->unk_1B0[1], &gOneVec3f);
- SubS_FillCutscenesList(&this->actor, this->unk_212, ARRAY_COUNT(this->unk_212));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
func_801A5080(0);
if (this->actor.params == ENGS_1) {
Actor_SetScale(&this->actor, 0.15f);
@@ -262,7 +263,8 @@ void func_80997E4C(EnGs* this, PlayState* play) {
}
void func_80997FF0(EnGs* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->actor, play->playerActorCsIds[0], -1, SUBS_CUTSCENE_NORMAL)) {
+ if (SubS_StartCutscene(&this->actor, play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA], CS_ID_NONE,
+ SUBS_CUTSCENE_NORMAL)) {
func_80998040(this, play);
}
}
@@ -338,8 +340,8 @@ void func_8099807C(EnGs* this, PlayState* play) {
}
void func_80998300(EnGs* this, PlayState* play) {
- if (this->actor.cutscene != -1) {
- ActorCutscene_Stop(play->playerActorCsIds[0]);
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
}
}
@@ -349,8 +351,8 @@ f32 func_80998334(EnGs* this, PlayState* play, f32* arg2, f32* arg3, s16* arg4,
if (arg9 == 0) {
sp2C = Math_SmoothStepToF(arg2, *arg3, arg5, arg6, arg7);
- this->unk_1B0[0].x = (sinf(DEGF_TO_RADF((*arg4 % arg8) * (1.0f / arg8) * 360.0f)) * *arg2) + 1.0f;
- this->unk_1B0[0].y = 1.0f - (sinf(DEGF_TO_RADF((*arg4 % arg8) * (1.0f / arg8) * 360.0f)) * *arg2);
+ this->unk_1B0[0].x = (sinf(DEG_TO_RAD((*arg4 % arg8) * (1.0f / arg8) * 360.0f)) * *arg2) + 1.0f;
+ this->unk_1B0[0].y = 1.0f - (sinf(DEG_TO_RAD((*arg4 % arg8) * (1.0f / arg8) * 360.0f)) * *arg2);
(*arg4)++;
}
return sp2C;
@@ -372,7 +374,7 @@ void func_809984F4(EnGs* this, PlayState* play) {
}
} while (gossipStone != NULL);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = func_809985B8;
}
@@ -380,7 +382,7 @@ void func_809985B8(EnGs* this, PlayState* play) {
EnGs* gossipStone;
Vec3f sp38;
- if (SubS_StartActorCutscene(&this->actor, this->unk_212[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
Player* player = GET_PLAYER(play);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
@@ -388,8 +390,8 @@ void func_809985B8(EnGs* this, PlayState* play) {
Math_Vec3f_Sum(&player->actor.world.pos, &sp38, &player->actor.world.pos);
Math_Vec3f_Copy(&player->actor.prevPos, &player->actor.world.pos);
this->unk_200 = 0.0f;
- gSaveContext.save.unk_EC4 = ((u32)gSaveContext.save.unk_EC4 & ~(7 << (this->unk_198 * 3))) |
- ((this->unk_194 & 7) << (this->unk_198 * 3));
+ gSaveContext.save.saveInfo.unk_EA0 = ((u32)gSaveContext.save.saveInfo.unk_EA0 & ~(7 << (this->unk_198 * 3))) |
+ ((this->unk_194 & 7) << (this->unk_198 * 3));
gossipStone = NULL;
do {
@@ -446,35 +448,35 @@ void func_8099874C(EnGs* this, PlayState* play) {
if ((this->unk_19C == 5) && (this->unk_194 != 0)) {
s32 i;
- ActorCutscene_Stop(this->unk_212[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
phi_v0 = 1;
for (i = 0; i < 4; i++) {
- if (((gSaveContext.save.unk_EC4 >> (i * 3)) & 7) != (u32)this->unk_194) {
+ if (((gSaveContext.save.saveInfo.unk_EA0 >> (i * 3)) & 7) != (u32)this->unk_194) {
phi_v0 = 0;
}
}
if (phi_v0 != 0) {
- this->unk_20C = -1;
+ this->getItemId = -1;
switch (this->unk_194) {
case 1:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_08)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_08);
}
break;
case 3:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_10)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_10);
}
break;
case 2:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_20)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_20);
}
break;
@@ -482,10 +484,10 @@ void func_8099874C(EnGs* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_90_10)) {
SET_WEEKEVENTREG(WEEKEVENTREG_90_10);
- this->unk_20C = 12;
+ this->getItemId = GI_HEART_PIECE;
}
- if (this->unk_20C > 0) {
+ if (this->getItemId > GI_NONE) {
func_809989B4(this, play);
} else {
func_80997D14(this, play);
@@ -500,7 +502,7 @@ void func_8099874C(EnGs* this, PlayState* play) {
}
void func_809989B4(EnGs* this, PlayState* play) {
- Actor_OfferGetItem(&this->actor, play, this->unk_20C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809989F4;
}
@@ -509,7 +511,8 @@ void func_809989F4(EnGs* this, PlayState* play) {
this->actor.parent = NULL;
func_80997D14(this, play);
} else {
- Actor_OfferGetItem(&this->actor, play, this->unk_20C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
}
}
@@ -522,8 +525,8 @@ s32 func_80998A48(EnGs* this, PlayState* play) {
this->unk_1D4 = 0;
this->unk_19A |= 1;
- this->unk_21C = 5;
- this->unk_21E = 40;
+ this->quakeY = 5;
+ this->quakeDuration = 40;
this->unk_197++;
this->unk_197 &= 0xF;
this->unk_19D = 1;
@@ -557,8 +560,8 @@ s32 func_80998BBC(EnGs* this, PlayState* play) {
this->unk_1D4 = 0;
this->unk_19A |= 1;
- this->unk_21C = 5;
- this->unk_21E = 40;
+ this->quakeY = 5;
+ this->quakeDuration = 40;
this->unk_197--;
this->unk_197 &= 0xF;
this->unk_19D = 1;
@@ -584,8 +587,8 @@ s32 func_80998D44(EnGs* this, PlayState* play) {
this->unk_1E0 = -0.8f;
Actor_PlaySfx(&this->actor, NA_SE_EV_G_STONE_CRUSH);
this->unk_19A |= 1;
- this->unk_21C = 40;
- this->unk_21E = 11;
+ this->quakeY = 40;
+ this->quakeDuration = 11;
this->unk_19D++;
} else if (this->unk_19D == 1) {
step = Math_SmoothStepToF(&this->unk_1DC, this->unk_1E0, 1.0f, 0.4f, 0.001f);
@@ -610,8 +613,8 @@ s32 func_80998D44(EnGs* this, PlayState* play) {
this->unk_216 = 0;
this->unk_1E0 = 0.0f;
this->unk_1D4 = 0;
- this->unk_21C = 10;
- this->unk_21E = 10;
+ this->quakeY = 10;
+ this->quakeDuration = 10;
this->unk_1DC = 0.5f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
this->unk_19D += 1;
@@ -640,15 +643,15 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
this->unk_1EC = 0.0f;
this->unk_19D = 1;
- this->unk_21C = 2;
- this->unk_21E = 40;
+ this->quakeY = 2;
+ this->quakeDuration = 40;
this->unk_216 = 200;
}
if (this->unk_19D == 1) {
Math_SmoothStepToF(&this->unk_1E4, this->unk_1E8, 1.0f, 0.1f, 0.001f);
sp48 = Math_SmoothStepToF(&this->unk_1DC, this->unk_1E0, 1.0f, this->unk_1E4, 0.001f);
- this->unk_19E[0].y += (s32)(this->unk_1DC * (0x10000 / 360.0f));
+ this->unk_19E[0].y += (s32)DEG_TO_BINANG_ALT3(this->unk_1DC);
if (sp48 == 0.0f) {
this->unk_1D4 = 0;
this->unk_19D = 2;
@@ -656,7 +659,7 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
}
if (this->unk_19D == 2) {
- this->unk_19E[0].y += (s32)(this->unk_1DC * (0x10000 / 360.0f));
+ this->unk_19E[0].y += (s32)DEG_TO_BINANG_ALT3(this->unk_1DC);
if (this->unk_1D4++ > 40) {
this->unk_1DC = this->unk_1B0[0].y - 1.0f;
this->unk_1E0 = 1.5f;
@@ -713,8 +716,8 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
this->unk_1F0 = 0.0f;
this->unk_1EC = 0.5f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKID_ATTACK);
- this->unk_21C = 20;
- this->unk_21E = 2;
+ this->quakeY = 20;
+ this->quakeDuration = 2;
this->unk_19D = 6;
}
}
@@ -725,8 +728,8 @@ s32 func_80998F9C(EnGs* this, PlayState* play) {
sp40 = Math_SmoothStepToF(&this->unk_1EC, this->unk_1F0, 0.8f, 0.02f, 0.001f);
this->unk_1B0[0].x = this->unk_1E4 + 1.0f;
this->unk_1B0[0].y = this->unk_1DC + 1.0f;
- this->unk_1B0[0].x += sinf(DEGF_TO_RADF((this->unk_1D4 % 10) * 0.1f * 360.0f)) * this->unk_1EC;
- this->unk_1B0[0].y += sinf(DEGF_TO_RADF((this->unk_1D4 % 10) * 0.1f * 360.0f)) * this->unk_1EC;
+ this->unk_1B0[0].x += sinf(DEG_TO_RAD((this->unk_1D4 % 10) * 0.1f * 360.0f)) * this->unk_1EC;
+ this->unk_1B0[0].y += sinf(DEG_TO_RAD((this->unk_1D4 % 10) * 0.1f * 360.0f)) * this->unk_1EC;
this->unk_1D4++;
if ((sp48 == 0.0f) && (sp44 == 0.0f) && (sp40 == 0.0f)) {
this->unk_216 = 0;
@@ -799,8 +802,8 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
if (this->unk_1D4 <= 0) {
this->unk_19A &= ~4;
- this->unk_21C = 3;
- this->unk_21E = 40;
+ this->quakeY = 3;
+ this->quakeDuration = 40;
this->unk_1D4 = 0;
this->unk_19D++;
}
@@ -812,9 +815,9 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
Vec3f sp60;
for (i = 0; i < 3; i++) {
- sp60.x = randPlusMinusPoint5Scaled(15.0f);
+ sp60.x = Rand_CenteredFloat(15.0f);
sp60.y = Rand_ZeroFloat(-1.0f);
- sp60.z = randPlusMinusPoint5Scaled(15.0f);
+ sp60.z = Rand_CenteredFloat(15.0f);
sp6C.x = this->actor.world.pos.x + (2.0f * sp60.x);
sp6C.y = this->actor.world.pos.y + 7.0f;
@@ -833,8 +836,8 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
this->unk_1DC = 0.0f;
this->unk_19D++;
- this->unk_21C = 5;
- this->unk_21E = 20;
+ this->quakeY = 5;
+ this->quakeDuration = 20;
this->unk_19A |= 1;
this->unk_216 = 200;
this->unk_1E0 = (this->unk_197 >> 2) * 0x444;
@@ -842,7 +845,7 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
}
if (this->unk_19D == 4) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 3);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2);
if (this->actor.bgCheckFlags & (BGCHECKFLAG_WALL | BGCHECKFLAG_CEILING)) {
Vec3f sp54;
@@ -870,7 +873,7 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
if (this->actor.playerHeightRel < -12000.0f) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
- this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 0);
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, this->actor.world.rot.y, 0, BOMB_TYPE_BODY);
Actor_Kill(&this->actor);
sp7C = 0;
}
@@ -1012,7 +1015,7 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
} else if (func_800B8718(&this->actor, &play->state)) {
this->unk_19A |= 0x200;
this->collider.base.acFlags &= ~AC_HIT;
- if (this->actor.cutscene != -1) {
+ if (this->actor.csId != CS_ID_NONE) {
this->actionFunc = func_80997FF0;
} else {
func_80998040(this, play);
@@ -1027,8 +1030,8 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
if ((this->actor.xyzDistToPlayerSq > SQ(400.0f)) || (sp2E < 0) || (sp2E > SCREEN_WIDTH) || (sp2C < 0) ||
(sp2C > SCREEN_HEIGHT)) {
this->unk_216 = 0;
- } else if (this->unk_21C > 0) {
- func_800BC848(&this->actor, play, this->unk_21C, this->unk_21E);
+ } else if (this->quakeY > 0) {
+ Actor_RequestQuakeAndRumble(&this->actor, play, this->quakeY, this->quakeDuration);
}
} else {
this->unk_216 = 0;
@@ -1047,8 +1050,8 @@ void EnGs_Update(Actor* thisx, PlayState* play) {
}
}
- if (this->unk_21C > 0) {
- this->unk_21C = 0;
+ if (this->quakeY > 0) {
+ this->quakeY = 0;
}
func_80999B34(this);
@@ -1068,7 +1071,7 @@ void EnGs_Draw(Actor* thisx, PlayState* play) {
frames = play->gameplayFrames;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
if (this->unk_19A & 1) {
@@ -1090,7 +1093,7 @@ void EnGs_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
if (this->unk_19A & 2) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(0.05f, -0.05f, 1.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.h b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
index 51e899fcc..b7af0c582 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.h
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
@@ -11,12 +11,12 @@ typedef void (*EnGsActionFunc)(struct EnGs*, PlayState*);
#define ENGS_GET_FE0(thisx) (((thisx)->params >> 5) & 0x7F)
#define ENGS_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF)
-enum {
+typedef enum {
/* 0 */ ENGS_0,
/* 1 */ ENGS_1,
/* 2 */ ENGS_2,
- /* 3 */ ENGS_3,
-};
+ /* 3 */ ENGS_3
+} EnGsParam;
typedef struct EnGs {
/* 0x000 */ Actor actor;
@@ -47,14 +47,14 @@ typedef struct EnGs {
/* 0x200 */ f32 unk_200;
/* 0x204 */ s32 unk_204;
/* 0x208 */ s32 unk_208;
- /* 0x20C */ s32 unk_20C;
+ /* 0x20C */ s32 getItemId;
/* 0x210 */ u16 unk_210;
- /* 0x212 */ s16 unk_212[2];
+ /* 0x212 */ s16 csIdList[2];
/* 0x216 */ s16 unk_216;
/* 0x218 */ s16 unk_218;
/* 0x21A */ s16 unk_21A;
- /* 0x21C */ s16 unk_21C;
- /* 0x21E */ s16 unk_21E;
+ /* 0x21C */ s16 quakeY;
+ /* 0x21E */ s16 quakeDuration;
} EnGs; // size = 0x220
#endif // Z_EN_GS_H
diff --git a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c
index 56ad07592..ea93d617f 100644
--- a/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c
+++ b/src/overlays/actors/ovl_En_Guard_Nuts/z_en_guard_nuts.c
@@ -84,7 +84,7 @@ typedef enum {
/* 0 */ WAIT_HEAD_TILT_ANIM,
/* 1 */ WALK_ANIM,
/* 2 */ DIG_ANIM,
- /* 3 */ WALK_ANIM_2,
+ /* 3 */ WALK_ANIM_2
} EnGuardNutsAnim;
typedef enum {
@@ -345,7 +345,9 @@ void EnGuardNuts_Update(Actor* thisx, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if ((this->state != GUARD_NUTS_BURROWED_STATE) && (this->state != GUARD_NUTS_UNK_STATE)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -368,7 +370,7 @@ void EnGuardNuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
diff --git a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
index d2aacf748..cb9545d7a 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
@@ -131,7 +131,7 @@ void func_80BC6E10(EnGuruguru* this) {
this->headZRotTarget = 0;
this->unk268 = 1;
this->actor.textId = textIDs[this->textIdIndex];
- if ((this->textIdIndex == 0 || this->textIdIndex == 1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04)) {
+ if (((this->textIdIndex == 0) || (this->textIdIndex == 1)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_88_04)) {
this->actor.textId = 0x295F;
} else {
@@ -175,7 +175,7 @@ void func_80BC701C(EnGuruguru* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((this->unk268 != 0) &&
- (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU)) {
+ ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU))) {
this->headZRotTarget = 5000;
}
@@ -211,7 +211,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
Message_CloseTextbox(play);
this->headZRotTarget = 0;
if ((this->textIdIndex == 13) || (this->textIdIndex == 14)) {
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
SET_WEEKEVENTREG(WEEKEVENTREG_79_04);
func_80BC6E10(this);
return;
@@ -223,7 +223,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
if (this->actor.textId == 0x292A) {
SET_WEEKEVENTREG(WEEKEVENTREG_38_10);
}
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
return;
}
@@ -234,8 +234,8 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
if (this->textIdIndex == 12) {
SET_WEEKEVENTREG(WEEKEVENTREG_38_40);
func_801A3B48(0);
- func_80151BB4(play, 0x36);
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
return;
}
@@ -275,7 +275,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
return;
}
func_801A3B48(0);
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
}
}
@@ -324,7 +324,7 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
- } else if (this->actor.params == 0 || this->actor.params == 2) {
+ } else if ((this->actor.params == 0) || (this->actor.params == 2)) {
Actor_Kill(&this->actor);
return;
}
@@ -352,10 +352,10 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
this->headXRotTarget = 0;
if (yaw < 0x2AF8) {
this->headXRotTarget = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
- if (this->headXRotTarget > 5000) {
- this->headXRotTarget = 5000;
- } else if (this->headXRotTarget < -5000) {
- this->headXRotTarget = -5000;
+ if (this->headXRotTarget > 0x1388) {
+ this->headXRotTarget = 0x1388;
+ } else if (this->headXRotTarget < -0x1388) {
+ this->headXRotTarget = -0x1388;
}
}
Actor_SetScale(&this->actor, 0.01f);
@@ -363,7 +363,9 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Math_SmoothStepToS(&this->headXRot, this->headXRotTarget, 1, 3000, 0);
Math_SmoothStepToS(&this->headZRot, this->headZRotTarget, 1, 1000, 0);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -383,11 +385,13 @@ void EnGuruguru_Draw(Actor* thisx, PlayState* play) {
EnGuruguru* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->texIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->texIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGuruguru_OverrideLimbDraw, NULL, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
index dc5610896..f5885b3cf 100644
--- a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
+++ b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
@@ -265,7 +265,7 @@ void func_80B22500(EnHakurock* this, PlayState* play) {
if (this->counter > 0) {
this->counter--;
if ((this->counter & 1) == 0) {
- this->actor.world.pos.y = (sin_rad(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
+ this->actor.world.pos.y = (Math_SinF(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
} else {
this->actor.world.pos.y = this->actor.floorHeight;
}
@@ -279,8 +279,8 @@ void func_80B22500(EnHakurock* this, PlayState* play) {
} else if ((&player->actor == this->collider.base.oc) &&
(player->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) &&
(player->linearVelocity > 8.0f)) {
- player->unk_B08[0] = player->linearVelocity = -5.0f;
- player->unk_B08[1] += (player->linearVelocity * 0.05f);
+ player->unk_B08 = player->linearVelocity = -5.0f;
+ player->unk_B0C += (player->linearVelocity * 0.05f);
player->actor.velocity.y = 5.0f;
player->currentYaw = player->actor.world.rot.y;
player->actor.home.rot.y = player->actor.world.rot.y;
@@ -323,7 +323,8 @@ void EnHakurock_Update(Actor* thisx, PlayState* play) {
rockParams = this->actor.params;
if ((rockParams == EN_HAKUROCK_TYPE_BOULDER) || (rockParams == EN_HAKUROCK_TYPE_UNK_2)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider.dim.radius, 0.0f, 0x85);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider.dim.radius, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_80);
if (this->actor.floorHeight == BGCHECK_Y_MIN) {
func_80B21FFC(this);
} else {
@@ -341,19 +342,23 @@ void EnHakurock_Update(Actor* thisx, PlayState* play) {
void func_80B228F4(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 185, 24, 255);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_06AB30);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void EnHakurock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(-100.0f, 0.0f, 0.0f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gGohtStalactiteMaterialDL);
gSPDisplayList(POLY_OPA_DISP++, gGohtStalactiteModelDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
index 8eaa6b444..4294a8320 100644
--- a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
+++ b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
@@ -107,9 +107,9 @@ void func_80B22E0C(EnHanabiStruct* arg0) {
arg0->unk_20.y *= arg0->unk_14.x;
arg0->unk_20.y -= 1.0f;
- arg0->unk_20.x += randPlusMinusPoint5Scaled(0.8f);
- arg0->unk_20.y += randPlusMinusPoint5Scaled(0.8f);
- arg0->unk_20.z += randPlusMinusPoint5Scaled(0.8f);
+ arg0->unk_20.x += Rand_CenteredFloat(0.8f);
+ arg0->unk_20.y += Rand_CenteredFloat(0.8f);
+ arg0->unk_20.z += Rand_CenteredFloat(0.8f);
if (arg0->unk_01 > 0) {
arg0->unk_01--;
@@ -141,9 +141,9 @@ void func_80B22FA8(EnHanabiStruct* arg0, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
@@ -286,10 +286,10 @@ void func_80B236C8(EnHanabi* this, PlayState* play) {
}
sp34.x += sp30 * Math_SinS(this->actor.home.rot.y);
- sp34.y += randPlusMinusPoint5Scaled(300.0f);
+ sp34.y += Rand_CenteredFloat(300.0f);
sp34.z += sp30 * Math_CosS(this->actor.home.rot.y);
- if (this->actor.home.rot.x >= 0x259) {
+ if (this->actor.home.rot.x > 0x258) {
sp28 = func_80B22C80(&sp34, this->unk_148, 2.0f);
} else {
sp28 = func_80B22C80(&sp34, this->unk_148, 1.0f);
@@ -324,14 +324,14 @@ void func_80B23910(EnHanabi* this, PlayState* play) {
void func_80B23934(EnHanabi* this, PlayState* play) {
if ((gSaveContext.save.entrance == ENTRANCE(TERMINA_FIELD, 1)) && (gSaveContext.sceneLayer == 7)) {
- if (play->csCtx.frames > 1650) {
+ if (play->csCtx.curFrame > 1650) {
func_80B236C8(this, play);
func_800B8FE8(&this->actor, NA_SE_EV_FIREWORKS_LAUNCH - SFX_FLAG);
}
}
- if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 7) && (play->csCtx.currentCsIndex == 0) &&
- (play->csCtx.frames == 610)) {
+ if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 7) && (play->csCtx.scriptIndex == 0) &&
+ (play->csCtx.curFrame == 610)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_GROAN);
}
}
diff --git a/src/overlays/actors/ovl_En_Hata/z_en_hata.c b/src/overlays/actors/ovl_En_Hata/z_en_hata.c
index 4a01b663e..e5b806b90 100644
--- a/src/overlays/actors/ovl_En_Hata/z_en_hata.c
+++ b/src/overlays/actors/ovl_En_Hata/z_en_hata.c
@@ -94,7 +94,7 @@ s32 EnHata_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnHata_Draw(Actor* thisx, PlayState* play) {
EnHata* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnHata_OverrideLimbDraw, NULL,
&this->dyna.actor);
}
diff --git a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
index f4e40b6c8..a335e39d2 100644
--- a/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
+++ b/src/overlays/actors/ovl_En_Heishi/z_en_heishi.c
@@ -156,7 +156,9 @@ void EnHeishi_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 29);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetScale(&this->actor, 0.01f);
if (this->shouldSetHeadRotation) {
EnHeishi_SetHeadRotation(this);
@@ -184,7 +186,7 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
void EnHeishi_Draw(Actor* thisx, PlayState* play) {
EnHeishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHeishi_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.c b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
index eb41fc045..180bf8cab 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
@@ -37,14 +37,14 @@ typedef enum {
/* 4 */ HG_ANIM_REACH_FORWARD,
/* 5 */ HG_ANIM_CURL_UP,
/* 6 */ HG_ANIM_CROUCHED_PANIC,
- /* 7 */ HG_ANIM_PANIC,
+ /* 7 */ HG_ANIM_PANIC
} HgAnimation;
typedef enum {
/* 0 */ HG_CS_FIRST_ENCOUNTER,
/* 1 */ HG_CS_GET_MASK,
/* 2 */ HG_CS_SUBSEQUENT_ENCOUNTER,
- /* 3 */ HG_CS_SONG_OF_HEALING,
+ /* 3 */ HG_CS_SONG_OF_HEALING
} HgCsIndex;
ActorInit En_Hg_InitVars = {
@@ -133,7 +133,7 @@ static u32 sHasSoundPlayed = false;
void EnHg_Init(Actor* thisx, PlayState* play) {
EnHg* this = THIS;
- s16 currentCutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
s32 i;
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 36.0f);
@@ -142,18 +142,18 @@ void EnHg_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
this->actor.targetMode = 1;
this->actor.colChkInfo.health = 0;
this->actor.gravity = -1.0f;
- for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
- if (currentCutscene == -1) {
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ if (csId == CS_ID_NONE) {
break;
}
- this->cutscenes[i] = currentCutscene;
- currentCutscene = ActorCutscene_GetAdditionalCutscene(currentCutscene);
+ this->csIdList[i] = csId;
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
EnHg_SetupWait(this);
}
@@ -171,12 +171,12 @@ void EnHg_SetupWait(EnHg* this) {
void EnHg_Wait(EnHg* this, PlayState* play) {
if (this->actor.colChkInfo.health == 1) {
- if ((this->actor.xzDistToPlayer < 200.0f && this->actor.playerHeightRel < 40.0f) &&
- !Cutscene_CheckActorAction(play, 0x1E3)) {
+ if (((this->actor.xzDistToPlayer < 200.0f) && (this->actor.playerHeightRel < 40.0f)) &&
+ !Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_483)) {
EnHg_SetupChasePlayer(this);
}
- if ((gSaveContext.sceneLayer == 0) && (play->csCtx.currentCsIndex == 0) &&
- ((play->csCtx.frames == 20) || (play->csCtx.frames == 60))) {
+ if ((gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 0) &&
+ ((play->csCtx.curFrame == 20) || (play->csCtx.curFrame == 60))) {
Actor_PlaySfx(&this->actor, NA_SE_EN_HALF_REDEAD_SURPRISE);
}
}
@@ -270,51 +270,51 @@ void EnHg_SetupCutscene(EnHg* this) {
}
void EnHg_PlayCutscene(EnHg* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscenes[this->cutsceneIndex])) {
- ActorCutscene_Start(this->cutscenes[this->cutsceneIndex], &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->actor);
EnHg_SetupCsAction(this);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
void EnHg_SetupCsAction(EnHg* this) {
- this->cutscenes[3] = 0x63;
- this->cutscenes[2] = 0;
+ this->csIdList[3] = 99;
+ this->csIdList[2] = 0;
this->actionFunc = EnHg_HandleCsAction;
}
void EnHg_HandleCsAction(EnHg* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 484)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 484);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_484)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_484);
- if (this->cutscenes[3] != play->csCtx.actorActions[actionIndex]->action) {
- this->cutscenes[3] = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (this->csIdList[3] != play->csCtx.actorCues[cueChannel]->id) {
+ this->csIdList[3] = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->animIndex = 0;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_IDLE);
break;
case 2:
- this->cutscenes[2] = 0;
+ this->csIdList[2] = 0;
this->animIndex = HG_ANIM_LEAN_FORWARD;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_LEAN_FORWARD);
break;
case 3:
- this->cutscenes[2] = 0;
+ this->csIdList[2] = 0;
this->animIndex = HG_ANIM_CURL_UP;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_CURL_UP);
break;
case 4:
- this->cutscenes[2] = 0;
+ this->csIdList[2] = 0;
this->animIndex = HG_ANIM_PANIC;
- if ((this->cutsceneIndex == HG_CS_GET_MASK) || (this->cutsceneIndex == HG_CS_SONG_OF_HEALING)) {
+ if ((this->csIdIndex == HG_CS_GET_MASK) || (this->csIdIndex == HG_CS_SONG_OF_HEALING)) {
func_8019F128(NA_SE_EN_HALF_REDEAD_TRANS);
}
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, HG_ANIM_PANIC);
@@ -356,21 +356,20 @@ void EnHg_HandleCsAction(EnHg* this, PlayState* play) {
break;
case HG_ANIM_PANIC:
- if ((this->cutsceneIndex == HG_CS_FIRST_ENCOUNTER) ||
- (this->cutsceneIndex == HG_CS_SUBSEQUENT_ENCOUNTER)) {
+ if ((this->csIdIndex == HG_CS_FIRST_ENCOUNTER) || (this->csIdIndex == HG_CS_SUBSEQUENT_ENCOUNTER)) {
func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG);
}
break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
return;
- } else if (play->csCtx.state == 0) {
+ } else if (play->csCtx.state == CS_STATE_IDLE) {
EnHg_SetupWait(this);
}
- this->cutscenes[3] = 0x63;
+ this->csIdList[3] = 99;
}
void EnHg_WaitForPlayerAction(EnHg* this, PlayState* play) {
@@ -394,9 +393,9 @@ void EnHg_WaitForPlayerAction(EnHg* this, PlayState* play) {
if ((play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
(gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
if (INV_CONTENT(ITEM_MASK_GIBDO) == ITEM_MASK_GIBDO) {
- this->cutsceneIndex = HG_CS_SONG_OF_HEALING;
+ this->csIdIndex = HG_CS_SONG_OF_HEALING;
} else {
- this->cutsceneIndex = HG_CS_GET_MASK;
+ this->csIdIndex = HG_CS_GET_MASK;
}
EnHg_SetupCutscene(this);
@@ -407,9 +406,9 @@ void EnHg_WaitForPlayerAction(EnHg* this, PlayState* play) {
if ((this->actionFunc != EnHg_PlayCutscene) && (this->actionFunc != EnHg_HandleCsAction)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_61_02)) {
SET_WEEKEVENTREG(WEEKEVENTREG_61_02);
- this->cutsceneIndex = HG_CS_FIRST_ENCOUNTER;
+ this->csIdIndex = HG_CS_FIRST_ENCOUNTER;
} else {
- this->cutsceneIndex = HG_CS_SUBSEQUENT_ENCOUNTER;
+ this->csIdIndex = HG_CS_SUBSEQUENT_ENCOUNTER;
}
EnHg_SetupCutscene(this);
@@ -428,7 +427,7 @@ void EnHg_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
EnHg_UpdateCollision(this, play);
EnHg_WaitForPlayerAction(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 25.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
EnHg_PlayRedeadSfx(this, play);
}
@@ -449,11 +448,13 @@ void EnHg_Draw(Actor* thisx, PlayState* play) {
EnHg* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHg_OverrideLimbDraw, EnHg_PostLimbDraw, &this->actor);
Matrix_Put(&this->mf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gPamelasFatherGibdoEyebrowsDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.h b/src/overlays/actors/ovl_En_Hg/z_en_hg.h
index 1211a4cf3..b79269e9b 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.h
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.h
@@ -15,12 +15,12 @@ typedef struct EnHg {
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnHgActionFunc actionFunc;
/* 0x1D8 */ MtxF mf;
- /* 0x218 */ s32 cutsceneIndex;
+ /* 0x218 */ s32 csIdIndex;
/* 0x21C */ s32 animIndex;
/* 0x220 */ Vec3s jointTable[PAMELAS_FATHER_GIBDO_LIMB_MAX];
/* 0x292 */ Vec3s morphTable[PAMELAS_FATHER_GIBDO_LIMB_MAX];
/* 0x304 */ UNK_TYPE1 pad304[0xC];
- /* 0x310 */ u16 cutscenes[4];
+ /* 0x310 */ u16 csIdList[4];
} EnHg; // size = 0x318
#endif // Z_EN_HG_H
diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
index af801ebd4..f6c90f6b4 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -45,7 +45,7 @@ typedef enum {
/* 3 */ HGO_ANIM_CONSOLE,
/* 4 */ HGO_ANIM_CONSOLE_HEAD_UP,
/* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT,
- /* 6 */ HGO_ANIM_TOSS,
+ /* 6 */ HGO_ANIM_TOSS
} HgoAnimation;
ActorInit En_Hgo_InitVars = {
@@ -109,7 +109,7 @@ void EnHgo_Init(Actor* thisx, PlayState* play) {
this->textId = 0;
this->talkFlags = TALK_FLAG_NONE;
this->isInCutscene = false;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
EnHgo_SetupTalk(this);
} else {
thisx->draw = NULL;
@@ -276,13 +276,13 @@ void EnHgo_HandlePlayerChoice(EnHgo* this, PlayState* play) {
}
s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 486)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 486);
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_486)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_486);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->animIndex = HGO_ANIM_ARMS_FOLDED;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
@@ -321,7 +321,7 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) {
(this->isInCutscene == false)) {
this->isInCutscene = true;
if ((gSaveContext.sceneLayer == 0) &&
- ((play->csCtx.currentCsIndex == 2) || (play->csCtx.currentCsIndex == 4))) {
+ ((play->csCtx.scriptIndex == 2) || (play->csCtx.scriptIndex == 4))) {
Actor_PlaySfx(&this->actor, NA_SE_VO_GBVO02);
}
}
@@ -338,11 +338,11 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
return true;
}
- if ((play->csCtx.state == CS_STATE_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) &&
+ if ((play->csCtx.state == CS_STATE_IDLE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) &&
(this->actionFunc == EnHgo_DoNothing)) {
this->actor.shape.rot.y = this->actor.world.rot.y;
Actor_Spawn(&play->actorCtx, play, ACTOR_ELF_MSG2, this->actor.focus.pos.x, this->actor.focus.pos.y,
@@ -350,7 +350,7 @@ s32 EnHgo_HandleCsAction(EnHgo* this, PlayState* play) {
EnHgo_SetupInitCollision(this);
}
- this->csAction = 0x63;
+ this->cueId = 99;
return false;
}
@@ -416,12 +416,14 @@ void EnHgo_Draw(Actor* thisx, PlayState* play) {
EnHgo* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHgo_OverrideLimbDraw, &EnHgo_PostLimbDraw, &this->actor);
Matrix_Put(&this->mf);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gPamelasFatherHumanEyebrowsDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
index 6882c1127..da7b7c40e 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.h
@@ -24,7 +24,7 @@ typedef struct EnHgo {
/* 0x310 */ s16 talkFlags;
/* 0x312 */ s16 isInCutscene;
/* 0x314 */ u16 textId;
- /* 0x316 */ u16 csAction;
+ /* 0x316 */ u16 cueId;
} EnHgo; // size = 0x318
#endif // Z_EN_HGO_H
diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
index fa14a3cdb..8ad694a11 100644
--- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
+++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.c
@@ -87,7 +87,7 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->unk_21E = ENHIDDENNUTS_GET_F80(&this->actor);
+ this->pathIndex = ENHIDDENNUTS_GET_PATH_INDEX(&this->actor);
this->switchFlag = ENHIDDENNUTS_GET_SWITCHFLAG(&this->actor);
if (this->switchFlag == 0x7F) {
@@ -99,13 +99,13 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
return;
}
- if (this->unk_21E == 0x1F) {
+ if (this->pathIndex == ENHIDDENNUTS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
- this->path = SubS_GetPathByIndex(play, this->unk_21E, 0x3F);
- this->unk_226 = this->actor.cutscene;
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENHIDDENNUTS_PATH_INDEX_NONE_ALT);
+ this->csId = this->actor.csId;
func_801A5080(2);
func_80BDB268(this);
}
@@ -156,7 +156,7 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
this->unk_20A = 0;
}
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BDB580(this);
return;
}
@@ -173,8 +173,8 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
Math_Vec3f_Copy(&sp74, &this->actor.world.pos);
- sp74.x += randPlusMinusPoint5Scaled(15.0f);
- sp74.z += randPlusMinusPoint5Scaled(15.0f);
+ sp74.x += Rand_CenteredFloat(15.0f);
+ sp74.z += Rand_CenteredFloat(15.0f);
EffectSsDtBubble_SpawnCustomColor(play, &sp74, &sp94, &sp88, &sp84, &sp80, Rand_S16Offset(120, 90), 30,
true);
@@ -216,8 +216,8 @@ void func_80BDB59C(EnHiddenNuts* this, PlayState* play) {
Math_Vec3f_Copy(&sp78, &this->actor.world.pos);
- sp78.x += randPlusMinusPoint5Scaled(15.0f);
- sp78.z += randPlusMinusPoint5Scaled(15.0f);
+ sp78.x += Rand_CenteredFloat(15.0f);
+ sp78.z += Rand_CenteredFloat(15.0f);
EffectSsDtBubble_SpawnCustomColor(play, &sp78, &sp98, &sp8C, &sp88, &sp84, Rand_S16Offset(120, 90), 30,
true);
@@ -243,18 +243,18 @@ void func_80BDB788(EnHiddenNuts* this) {
void func_80BDB7E8(EnHiddenNuts* this, PlayState* play) {
Vec3f sp3C;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_226);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
return;
}
- if (!ActorCutscene_GetCanPlayNext(this->unk_226)) {
- ActorCutscene_SetIntentToPlay(this->unk_226);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_226, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_228 = -1200.0f;
Math_Vec3f_Copy(&sp3C, &this->actor.world.pos);
@@ -423,7 +423,9 @@ void EnHiddenNuts_Update(Actor* thisx, PlayState* play) {
if (this->unk_21A >= 4) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 40.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -433,6 +435,6 @@ void EnHiddenNuts_Update(Actor* thisx, PlayState* play) {
void EnHiddenNuts_Draw(Actor* thisx, PlayState* play) {
EnHiddenNuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
index e40a89193..03a0a52b7 100644
--- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
+++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
@@ -8,7 +8,10 @@ struct EnHiddenNuts;
typedef void (*EnHiddenNutsActionFunc)(struct EnHiddenNuts*, PlayState*);
#define ENHIDDENNUTS_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
-#define ENHIDDENNUTS_GET_F80(thisx) (((thisx)->params >> 7) & 0x1F)
+#define ENHIDDENNUTS_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x1F)
+
+#define ENHIDDENNUTS_PATH_INDEX_NONE 0x1F
+#define ENHIDDENNUTS_PATH_INDEX_NONE_ALT 0x3F
typedef struct EnHiddenNuts {
/* 0x000 */ Actor actor;
@@ -23,10 +26,10 @@ typedef struct EnHiddenNuts {
/* 0x218 */ s16 unk_218;
/* 0x21A */ s16 unk_21A;
/* 0x21C */ s16 switchFlag;
- /* 0x21E */ s16 unk_21E;
+ /* 0x21E */ s16 pathIndex;
/* 0x220 */ s32 unk_220;
/* 0x224 */ s16 unk_224;
- /* 0x226 */ s16 unk_226;
+ /* 0x226 */ s16 csId;
/* 0x228 */ f32 unk_228;
/* 0x22C */ f32 unk_22C;
/* 0x230 */ UNK_TYPE1 unk230[4];
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 6e1f3b90c..1a0105788 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
@@ -814,11 +814,11 @@ void func_80C215E4(PlayState* play, EnHintSkb* this, Vec3f* arg2) {
s32 pad;
sp5C.y = this->actor.floorHeight;
- sp5C.x = (sin_rad(sp40) * 15.0f) + arg2->x;
- sp5C.z = (cos_rad(sp40) * 15.0f) + arg2->z;
+ sp5C.x = (Math_SinF(sp40) * 15.0f) + arg2->x;
+ sp5C.z = (Math_CosF(sp40) * 15.0f) + arg2->z;
- sp44.x = randPlusMinusPoint5Scaled(1.0f);
- sp44.z = randPlusMinusPoint5Scaled(1.0f);
+ sp44.x = Rand_CenteredFloat(1.0f);
+ sp44.z = Rand_CenteredFloat(1.0f);
sp50.y += (Rand_ZeroOne() - 0.5f) * 4.0f;
@@ -838,7 +838,9 @@ void EnHintSkb_Update(Actor* thisx, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
func_80C21250(this, play);
func_80C20D64(this, play);
func_80C21320(this, play);
@@ -903,7 +905,7 @@ void EnHintSkb_Draw(Actor* thisx, PlayState* play) {
EnHintSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnHintSkb_OverrideLimbDraw,
EnHintSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Holl/z_en_holl.c b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
index e2d4792ca..ed3fe65b9 100644
--- a/src/overlays/actors/ovl_En_Holl/z_en_holl.c
+++ b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
@@ -191,7 +191,7 @@ void EnHoll_VisibleIdle(EnHoll* this, PlayState* play) {
}
} else if (this->type == EN_HOLL_TYPE_SCENE_CHANGER) {
play->nextEntrance = play->setupExitList[EN_HOLL_GET_EXIT_LIST_INDEX(&this->actor)];
- gSaveContext.unk_3DBB = 1;
+ gSaveContext.retainWeatherMode = true;
Scene_SetExitFade(play);
play->transitionTrigger = TRANS_TRIGGER_START;
play->unk_1878C(play);
@@ -220,7 +220,7 @@ void EnHoll_VisibleIdle(EnHoll* this, PlayState* play) {
void EnHoll_TransparentIdle(EnHoll* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 useViewEye = gDbgCamEnabled || play->csCtx.state != 0;
+ s32 useViewEye = gDbgCamEnabled || (play->csCtx.state != CS_STATE_IDLE);
Vec3f transformedPlayerPos;
f32 enHollTop;
f32 playerDistFromCentralPlane;
@@ -319,30 +319,32 @@ void EnHoll_Update(Actor* thisx, PlayState* play) {
void EnHoll_Draw(Actor* thisx, PlayState* play) {
EnHoll* this = THIS;
- Gfx* dl;
- u32 dlIndex;
+ Gfx* dList;
+ u32 setupDListIndex;
if (this->alpha != 0) {
OPEN_DISPS(play->state.gfxCtx);
+
if (this->alpha == 255) {
- dl = POLY_OPA_DISP;
- dlIndex = 37;
+ dList = POLY_OPA_DISP;
+ setupDListIndex = SETUPDL_37;
} else {
- dl = POLY_XLU_DISP;
- dlIndex = 0;
+ dList = POLY_XLU_DISP;
+ setupDListIndex = SETUPDL_0;
}
- dl = Gfx_CallSetupDL(dl, dlIndex);
+ dList = Gfx_SetupDL(dList, setupDListIndex);
if (this->playerSide == EN_HOLL_BEHIND) {
Matrix_RotateYF(M_PI, MTXMODE_APPLY);
}
- gSPMatrix(dl++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetPrimColor(dl++, 0, 0, 0, 0, 0, this->alpha);
- gSPDisplayList(dl++, gEnHollCentralPlaneDL);
+ gSPMatrix(dList++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetPrimColor(dList++, 0, 0, 0, 0, 0, this->alpha);
+ gSPDisplayList(dList++, gEnHollCentralPlaneDL);
if (this->alpha == 255) {
- POLY_OPA_DISP = dl;
+ POLY_OPA_DISP = dList;
} else {
- POLY_XLU_DISP = dl;
+ POLY_XLU_DISP = dList;
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
index 6d3e01952..787a40da7 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse.h"
+#include "z64horse.h"
#include "z64rumble.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "overlays/actors/ovl_Obj_Um/z_obj_um.h"
@@ -50,40 +51,40 @@ void func_80881290(EnHorse* this, PlayState* play);
void func_8088159C(EnHorse* this, PlayState* play);
void func_80881634(EnHorse* this);
void func_8088168C(EnHorse* this);
-void EnHorse_CsMoveInit(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorAction* action);
+void EnHorse_CsMoveInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
void EnHorse_CsPlayHighJumpAnim(EnHorse* this, PlayState* play);
-void EnHorse_CsJumpInit(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_WarpMoveInit(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action);
+void EnHorse_CsJumpInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_WarpMoveInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
void EnHorse_InitCutscene(EnHorse* this, PlayState* play);
void EnHorse_InitHorsebackArchery(EnHorse* this);
void EnHorse_UpdateHbaAnim(EnHorse* this);
-void func_80883BEC(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883CB0(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883D64(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883DE0(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883E10(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883EA0(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883F18(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80883F98(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884010(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_808840C4(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884194(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_8088424C(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884314(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_808843B4(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884444(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_808844E0(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884564(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_80884604(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_808846B4(EnHorse* this, PlayState* play, CsCmdActorAction* action);
-void func_808846DC(EnHorse* this, PlayState* play, CsCmdActorAction* action);
+void func_80883BEC(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883CB0(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883D64(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883DE0(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883E10(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883EA0(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883F18(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80883F98(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884010(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_808840C4(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884194(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_8088424C(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884314(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_808843B4(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884444(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_808844E0(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884564(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_80884604(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_808846B4(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
+void func_808846DC(EnHorse* this, PlayState* play, CsCmdActorCue* cue);
void func_808846F0(EnHorse* this, PlayState* play);
void func_80884994(EnHorse* this);
void func_80884D04(EnHorse* this, PlayState* play);
@@ -91,34 +92,22 @@ void EnHorse_StickDirection(Vec2f* curStick, f32* stickMag, s16* angle);
s32 EnHorse_GetMountSide(EnHorse* this, PlayState* play);
typedef struct {
- s32 csAction;
- s32 csFuncIdx;
-} CsActionEntry;
+ /* 0x0 */ s32 cueId;
+ /* 0x4 */ s32 csFuncIdx;
+} CsActionEntry; // size = 0x8
typedef struct {
- s16 x;
- s16 y;
- s16 z;
- s16 speed;
- s16 angle;
-} RaceWaypoint;
+ /* 0x0 */ s16 x;
+ /* 0x2 */ s16 y;
+ /* 0x4 */ s16 z;
+ /* 0x6 */ s16 speed;
+ /* 0x8 */ s16 angle;
+} RaceWaypoint; // size = 0xA
typedef struct {
- s32 numWaypoints;
- RaceWaypoint* waypoints;
-} RaceInfo;
-
-typedef enum {
- /* 0 */ ENHORSE_ANIM_IDLE,
- /* 1 */ ENHORSE_ANIM_WHINNY,
- /* 2 */ ENHORSE_ANIM_STOPPING,
- /* 3 */ ENHORSE_ANIM_REARING,
- /* 4 */ ENHORSE_ANIM_WALK,
- /* 5 */ ENHORSE_ANIM_TROT,
- /* 6 */ ENHORSE_ANIM_GALLOP,
- /* 7 */ ENHORSE_ANIM_LOW_JUMP,
- /* 8 */ ENHORSE_ANIM_HIGH_JUMP
-} EnHorseAnimation;
+ /* 0x0 */ s32 numWaypoints;
+ /* 0x4 */ RaceWaypoint* waypoints;
+} RaceInfo; // size = 0x8
static AnimationHeader* sEponaAnimations[] = {
&object_horse_link_child_Anim_006D44, &object_horse_link_child_Anim_007468, &object_horse_link_child_Anim_005F64,
@@ -290,8 +279,8 @@ void EnHorse_RaceWaypointPos(RaceWaypoint* waypoints, s32 idx, Vec3f* pos) {
pos->z = waypoints[idx].z;
}
-void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnAmount) {
- func_800F415C(&this->actor, pos, turnAmount);
+void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnYaw) {
+ Horse_RotateToPoint(&this->actor, pos, turnYaw);
}
void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) {
@@ -594,15 +583,15 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) {
f32 minDist = 1.0e+38;
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
- s32 pathIdx = func_800F3940(play);
+ s32 pathIndex = Horse_GetJumpingFencePathIndex(play);
s32 pathCount;
Vec3s* pathPoints;
- if (pathIdx == -1) {
+ if (pathIndex == -1) {
return false;
}
- path = &play->setupPathList[pathIdx];
+ path = &play->setupPathList[pathIndex];
pathCount = path->count;
pathPoints = Lib_SegmentedToVirtual(path->points);
@@ -673,7 +662,7 @@ s32 EnHorse_PlayerCanMove(EnHorse* this, PlayState* play) {
(player->stateFlags1 & PLAYER_STATE1_100000) ||
(((this->stateFlags & ENHORSE_FLAG_19) || (this->stateFlags & ENHORSE_FLAG_29)) && !this->inRace) ||
(this->action == ENHORSE_ACTION_HBA) || (player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) ||
- (play->csCtx.state != CS_STATE_0) || (ActorCutscene_GetCurrentIndex() != -1) ||
+ (play->csCtx.state != CS_STATE_IDLE) || (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) ||
(player->stateFlags1 & PLAYER_STATE1_20) || (player->csMode != PLAYER_CSMODE_0)) {
return false;
}
@@ -703,7 +692,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
EnHorse_ClearDustFlags(&this->dustFlags);
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Skin_Setup(&this->skin);
this->riderPos = thisx->world.pos;
this->unk_52C = 0;
@@ -792,7 +781,8 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
this->stateFlags = 0;
}
- if (((play->sceneId == SCENE_KOEPONARACE) && (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_START)) ||
+ if (((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) ||
((gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) && (Cutscene_GetSceneLayer(play) != 0))) {
this->stateFlags |= ENHORSE_FLAG_25;
}
@@ -1001,7 +991,7 @@ void EnHorse_Frozen(EnHorse* this, PlayState* play) {
EnHorse_StartMountedIdleResetAnim(this);
} else if (this->actor.params == ENHORSE_11) {
this->actor.params = ENHORSE_7;
- if (play->csCtx.state != CS_STATE_0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
EnHorse_StartMountedIdle(this);
} else {
this->actor.speed = 8.0f;
@@ -1642,8 +1632,8 @@ void EnHorse_Reverse(EnHorse* this, PlayState* play) {
} else if (stickMag < 10.0f) {
stickAngle = -0x7FFF;
}
- } else if ((player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) || (play->csCtx.state != CS_STATE_0) ||
- (ActorCutscene_GetCurrentIndex() != -1) || (player->stateFlags1 & PLAYER_STATE1_20)) {
+ } else if ((player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) || (play->csCtx.state != CS_STATE_IDLE) ||
+ (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) || (player->stateFlags1 & PLAYER_STATE1_20)) {
EnHorse_StartMountedIdleResetAnim(this);
this->actor.speed = 0.0f;
return;
@@ -1885,8 +1875,8 @@ void EnHorse_InitInactive(EnHorse* this) {
}
void EnHorse_Inactive(EnHorse* this, PlayState* play) {
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -1965,8 +1955,8 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
this->actor.speed = 0.0f;
EnHorse_IdleAnimSounds(this, play);
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (!func_8087C38C(play, this, &this->actor.world.pos)) {
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
@@ -2061,7 +2051,7 @@ void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play) {
void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
f32 distToPlayer;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
if (((this->playerDir == PLAYER_DIR_BACK_R) || (this->playerDir == PLAYER_DIR_BACK_L)) && (distToPlayer > 300.0f) &&
@@ -2471,7 +2461,7 @@ void func_808819D8(EnHorse* this, PlayState* play) {
func_8088168C(this);
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) {
this->rider->unk488 = 7;
} else {
EnHorse_SetIngoAnimation(this->animIndex, this->skin.skelAnime.curFrame, this->unk_394 & 1,
@@ -2479,20 +2469,20 @@ void func_808819D8(EnHorse* this, PlayState* play) {
}
}
-void EnHorse_CsMoveInit(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsMoveInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
this->animIndex = ENHORSE_ANIM_GALLOP;
this->cutsceneAction = 1;
Animation_PlayOnceSetSpeed(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex],
this->actor.speed * 0.2f * 1.5f);
}
-void EnHorse_CsMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
Vec3f endPos;
s32 pad;
- endPos.x = action->endPos.x;
- endPos.y = action->endPos.y;
- endPos.z = action->endPos.z;
+ endPos.x = cue->endPos.x;
+ endPos.y = cue->endPos.y;
+ endPos.z = cue->endPos.z;
if (Math3D_Distance(&endPos, &this->actor.world.pos) > 8.0f) {
EnHorse_RotateToPoint(this, play, &endPos, 0x320);
@@ -2543,20 +2533,20 @@ void EnHorse_CsPlayHighJumpAnim(EnHorse* this, PlayState* play) {
Rumble_Request(0.0f, 170, 10, 10);
}
-void EnHorse_CsJumpInit(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsJumpInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
EnHorse_CsSetAnimHighJump(this, play);
this->cutsceneAction = 2;
this->cutsceneFlags &= ~1;
}
-void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
f32 curFrame;
f32 y;
Vec3s* jointTable;
s32 pad[2];
if (this->cutsceneFlags & 1) {
- EnHorse_CsMoveToPoint(this, play, action);
+ EnHorse_CsMoveToPoint(this, play, cue);
return;
}
@@ -2608,7 +2598,7 @@ void EnHorse_CsJump(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
}
}
-void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
this->animIndex = ENHORSE_ANIM_REARING;
this->cutsceneAction = 3;
this->cutsceneFlags &= ~4;
@@ -2624,7 +2614,7 @@ void EnHorse_CsRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* act
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, -3.0f);
}
-void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
this->actor.speed = 0.0f;
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
@@ -2652,13 +2642,13 @@ void EnHorse_CsRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action)
}
}
-void EnHorse_WarpMoveInit(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- this->actor.world.pos.x = action->startPos.x;
- this->actor.world.pos.y = action->startPos.y;
- this->actor.world.pos.z = action->startPos.z;
+void EnHorse_WarpMoveInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ this->actor.world.pos.x = cue->startPos.x;
+ this->actor.world.pos.y = cue->startPos.y;
+ this->actor.world.pos.z = cue->startPos.z;
this->actor.prevPos = this->actor.world.pos;
- this->actor.world.rot.y = action->urot.y;
+ this->actor.world.rot.y = cue->rot.y;
this->actor.shape.rot = this->actor.world.rot;
this->animIndex = ENHORSE_ANIM_GALLOP;
@@ -2667,13 +2657,13 @@ void EnHorse_WarpMoveInit(EnHorse* this, PlayState* play, CsCmdActorAction* acti
this->actor.speed * 0.3f);
}
-void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
Vec3f endPos;
s32 pad;
- endPos.x = action->endPos.x;
- endPos.y = action->endPos.y;
- endPos.z = action->endPos.z;
+ endPos.x = cue->endPos.x;
+ endPos.y = cue->endPos.y;
+ endPos.z = cue->endPos.z;
if (Math3D_Distance(&endPos, &this->actor.world.pos) > 8.0f) {
EnHorse_RotateToPoint(this, play, &endPos, 0x320);
@@ -2692,13 +2682,13 @@ void EnHorse_CsWarpMoveToPoint(EnHorse* this, PlayState* play, CsCmdActorAction*
}
}
-void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- this->actor.world.pos.x = action->startPos.x;
- this->actor.world.pos.y = action->startPos.y;
- this->actor.world.pos.z = action->startPos.z;
+void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ this->actor.world.pos.x = cue->startPos.x;
+ this->actor.world.pos.y = cue->startPos.y;
+ this->actor.world.pos.z = cue->startPos.z;
this->actor.prevPos = this->actor.world.pos;
- this->actor.world.rot.y = action->urot.y;
+ this->actor.world.rot.y = cue->rot.y;
this->actor.shape.rot = this->actor.world.rot;
this->animIndex = ENHORSE_ANIM_REARING;
@@ -2717,7 +2707,7 @@ void EnHorse_CsWarpRearingInit(EnHorse* this, PlayState* play, CsCmdActorAction*
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, -3.0f);
}
-void EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void EnHorse_CsWarpRearing(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
this->actor.speed = 0.0f;
if (this->curFrame > 25.0f) {
if (!(this->stateFlags & ENHORSE_LAND2_SOUND)) {
@@ -2752,16 +2742,16 @@ void EnHorse_InitCutscene(EnHorse* this, PlayState* play) {
this->actor.speed = 0.0f;
}
-s32 EnHorse_GetCutsceneFunctionIndex(s32 csAction) {
+s32 EnHorse_GetCutsceneFunctionIndex(s32 cueId) {
s32 numActions = ARRAY_COUNT(sCsActionTable); // prevents unrolling
s32 i;
for (i = 0; i < numActions; i++) {
- if (csAction == sCsActionTable[i].csAction) {
+ if (cueId == sCsActionTable[i].cueId) {
return sCsActionTable[i].csFuncIdx;
}
- if (csAction < sCsActionTable[i].csAction) {
+ if (cueId < sCsActionTable[i].cueId) {
return 0;
}
}
@@ -2770,9 +2760,9 @@ s32 EnHorse_GetCutsceneFunctionIndex(s32 csAction) {
void EnHorse_CutsceneUpdate(EnHorse* this, PlayState* play) {
s32 csFunctionIdx;
- CsCmdActorAction* playerAction = play->csCtx.playerAction;
+ CsCmdActorCue* playerCue = play->csCtx.playerCue;
- if (play->csCtx.state == CS_STATE_3) {
+ if (play->csCtx.state == CS_STATE_STOP) {
this->playerControlled = true;
this->actor.params = ENHORSE_12;
this->action = ENHORSE_ACTION_IDLE;
@@ -2780,23 +2770,23 @@ void EnHorse_CutsceneUpdate(EnHorse* this, PlayState* play) {
return;
}
- if (playerAction != NULL) {
- csFunctionIdx = EnHorse_GetCutsceneFunctionIndex(playerAction->action);
+ if (playerCue != NULL) {
+ csFunctionIdx = EnHorse_GetCutsceneFunctionIndex(playerCue->id);
if (csFunctionIdx != 0) {
if (csFunctionIdx != this->cutsceneAction) {
if (this->cutsceneAction == 0) {
- this->actor.world.pos.x = playerAction->startPos.x;
- this->actor.world.pos.y = playerAction->startPos.y;
- this->actor.world.pos.z = playerAction->startPos.z;
+ this->actor.world.pos.x = playerCue->startPos.x;
+ this->actor.world.pos.y = playerCue->startPos.y;
+ this->actor.world.pos.z = playerCue->startPos.z;
- this->actor.world.rot.y = playerAction->urot.y;
+ this->actor.world.rot.y = playerCue->rot.y;
this->actor.shape.rot = this->actor.world.rot;
this->actor.prevPos = this->actor.world.pos;
}
this->cutsceneAction = csFunctionIdx;
- sCutsceneInitFuncs[csFunctionIdx](this, play, playerAction);
+ sCutsceneInitFuncs[csFunctionIdx](this, play, playerCue);
}
- sCutsceneActionFuncs[this->cutsceneAction](this, play, playerAction);
+ sCutsceneActionFuncs[this->cutsceneAction](this, play, playerCue);
}
}
}
@@ -2925,7 +2915,7 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) {
if (((this->hbaFlags & 1) || (this->hbaTimer > 45)) && (sp28 != 1) &&
(gSaveContext.minigameStatus != MINIGAME_STATUS_END)) {
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_64;
}
@@ -2970,7 +2960,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
s32 animFinished;
s16 yaw;
- if ((D_801BDAA4 != 0) || (this->type == HORSE_TYPE_HNI)) {
+ if (gHorsePlayedEponasSong || (this->type == HORSE_TYPE_HNI)) {
EnHorse_StartIdleRidable(this);
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -3108,28 +3098,28 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
}
}
-void func_80883B70(EnHorse* this, CsCmdActorAction* action) {
- this->actor.world.pos.x = action->startPos.x;
- this->actor.world.pos.y = action->startPos.y;
- this->actor.world.pos.z = action->startPos.z;
+void func_80883B70(EnHorse* this, CsCmdActorCue* cue) {
+ this->actor.world.pos.x = cue->startPos.x;
+ this->actor.world.pos.y = cue->startPos.y;
+ this->actor.world.pos.z = cue->startPos.z;
- this->actor.world.rot.y = action->urot.y;
+ this->actor.world.rot.y = cue->rot.y;
this->actor.shape.rot = this->actor.world.rot;
this->actor.prevPos = this->actor.world.pos;
}
-void func_80883BEC(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
+void func_80883BEC(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
this->animIndex = ENHORSE_ANIM_IDLE;
- this->unk_3E0 = 1;
+ this->cueId = 1;
this->stateFlags &= ~ENHORSE_SANDDUST_SOUND;
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, 0.0f);
this->stateFlags |= ENHORSE_SANDDUST_SOUND;
}
-void func_80883CB0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80883CB0(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
EnHorse_IdleAnimSounds(this, play);
if (SkelAnime_Update(&this->skin.skelAnime)) {
this->animIndex = ENHORSE_ANIM_IDLE;
@@ -3138,74 +3128,74 @@ void func_80883CB0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
}
}
-void func_80883D64(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
- this->unk_3E0 = 2;
+void func_80883D64(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
+ this->cueId = 2;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00A8DC, 0.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00A8DC), ANIMMODE_ONCE, 0.0f);
}
-void func_80883DE0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80883DE0(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
SkelAnime_Update(&this->skin.skelAnime);
}
-void func_80883E10(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
- this->unk_3E0 = 3;
+void func_80883E10(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
+ this->cueId = 3;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00A8DC, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00A8DC), ANIMMODE_ONCE, -3.0f);
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
}
-void func_80883EA0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80883EA0(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
if (SkelAnime_Update(&this->skin.skelAnime)) {
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00B3E0, 1.0f, 11.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00B3E0), ANIMMODE_ONCE, 0.0f);
}
}
-void func_80883F18(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
- this->unk_3E0 = 4;
+void func_80883F18(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
+ this->cueId = 4;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00AD08, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00AD08), ANIMMODE_ONCE, -3.0f);
}
-void func_80883F98(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80883F98(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
if (Animation_OnFrame(&this->skin.skelAnime, Animation_GetLastFrame(&object_horse_link_child_Anim_00AD08) - 1.0f)) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_LAND2);
}
SkelAnime_Update(&this->skin.skelAnime);
}
-void func_80884010(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
- this->unk_3E0 = 5;
+void func_80884010(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
+ this->cueId = 5;
this->animIndex = ENHORSE_ANIM_WALK;
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, -3.0f);
}
-void func_808840C4(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_808840C4(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
EnHorse_PlayWalkingSound(this);
- Cutscene_ActorTranslateAndYaw(&this->actor, play, this->unk_530);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, this->cueChannel);
if (SkelAnime_Update(&this->skin.skelAnime)) {
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, 0.0f);
}
}
-void func_80884194(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- func_80883B70(this, action);
- this->unk_3E0 = 6;
+void func_80884194(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ func_80883B70(this, cue);
+ this->cueId = 6;
this->animIndex = ENHORSE_ANIM_GALLOP;
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, -3.0f);
func_8087C1C0(this);
}
-void func_8088424C(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, this->unk_530);
+void func_8088424C(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, this->cueChannel);
if (SkelAnime_Update(&this->skin.skelAnime)) {
Animation_Change(&this->skin.skelAnime, sAnimationHeaders[this->type][this->animIndex], 1.0f, 0.0f,
Animation_GetLastFrame(sAnimationHeaders[this->type][this->animIndex]), ANIMMODE_ONCE, 0.0f);
@@ -3213,36 +3203,36 @@ void func_8088424C(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
}
}
-void func_80884314(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80884314(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 20.0f);
- func_80883B70(this, action);
- this->unk_3E0 = 7;
+ func_80883B70(this, cue);
+ this->cueId = 7;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00D178, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00D178), ANIMMODE_ONCE, 0.0f);
Audio_PlaySfxAtPos(&this->unk_218, NA_SE_EV_KID_HORSE_NEIGH);
}
-void func_808843B4(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_808843B4(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
SkelAnime_Update(&this->skin.skelAnime);
if (this->curFrame > 42.0f) {
if (((s32)this->curFrame % 11) == 0) {
func_8087C1C0(this);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, this->unk_530);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, this->cueChannel);
}
}
-void func_80884444(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80884444(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 20.0f);
- func_80883B70(this, action);
+ func_80883B70(this, cue);
this->cutsceneAction = 8;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00D4E8, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00D4E8), ANIMMODE_ONCE, 0.0f);
func_8087C1C0(this);
}
-void func_808844E0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, this->unk_530);
+void func_808844E0(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, this->cueChannel);
if (SkelAnime_Update(&this->skin.skelAnime)) {
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00D4E8, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00D4E8), ANIMMODE_ONCE, 0.0f);
@@ -3250,17 +3240,17 @@ void func_808844E0(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
}
}
-void func_80884564(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_80884564(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 20.0f);
- func_80883B70(this, action);
+ func_80883B70(this, cue);
this->cutsceneAction = 8;
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00BDE0, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00BDE0), ANIMMODE_ONCE, -3.0f);
func_8087C1C0(this);
}
-void func_80884604(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, this->unk_530);
+void func_80884604(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, this->cueChannel);
if (SkelAnime_Update(&this->skin.skelAnime)) {
Animation_Change(&this->skin.skelAnime, &object_horse_link_child_Anim_00BDE0, 1.0f, 0.0f,
Animation_GetLastFrame(&object_horse_link_child_Anim_00BDE0), ANIMMODE_ONCE, 0.0f);
@@ -3271,48 +3261,48 @@ void func_80884604(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
}
}
-void func_808846B4(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_808846B4(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
Actor_Kill(&this->actor);
}
-void func_808846DC(EnHorse* this, PlayState* play, CsCmdActorAction* action) {
+void func_808846DC(EnHorse* this, PlayState* play, CsCmdActorCue* cue) {
}
void func_808846F0(EnHorse* this, PlayState* play) {
this->playerControlled = false;
this->action = ENHORSE_ACTION_21;
- this->unk_3E0 = -1;
+ this->cueId = -1;
this->actor.speed = 0.0f;
}
void func_80884718(EnHorse* this, PlayState* play) {
- CsCmdActorAction* action;
+ CsCmdActorCue* cue;
- if (Cutscene_CheckActorAction(play, 0x70)) {
- this->unk_530 = Cutscene_GetActorActionIndex(play, 0x70);
- action = play->csCtx.actorActions[this->unk_530];
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_112)) {
+ this->cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_112);
+ cue = play->csCtx.actorCues[this->cueChannel];
this->unk_1EC |= 0x20;
- if (this->unk_3E0 != action->action) {
- if (this->unk_3E0 == -1) {
- this->actor.world.pos.x = action->startPos.x;
- this->actor.world.pos.y = action->startPos.y;
- this->actor.world.pos.z = action->startPos.z;
+ if (this->cueId != cue->id) {
+ if (this->cueId == -1) {
+ this->actor.world.pos.x = cue->startPos.x;
+ this->actor.world.pos.y = cue->startPos.y;
+ this->actor.world.pos.z = cue->startPos.z;
- this->actor.world.rot.y = action->urot.y;
+ this->actor.world.rot.y = cue->rot.y;
this->actor.shape.rot = this->actor.world.rot;
this->actor.prevPos = this->actor.world.pos;
}
- this->unk_3E0 = action->action;
- if (D_808890F0[this->unk_3E0] != NULL) {
- D_808890F0[this->unk_3E0](this, play, action);
+ this->cueId = cue->id;
+ if (D_808890F0[this->cueId] != NULL) {
+ D_808890F0[this->cueId](this, play, cue);
}
}
- if (D_8088911C[this->unk_3E0] != NULL) {
- D_8088911C[this->unk_3E0](this, play, action);
+ if (D_8088911C[this->cueId] != NULL) {
+ D_8088911C[this->cueId](this, play, cue);
}
}
}
@@ -3329,7 +3319,7 @@ void func_808848C8(EnHorse* this, PlayState* play) {
EnHorse_PlayWalkingSound(this);
this->actor.speed = 4.0f;
- func_800F415C(&this->actor, &sp24, 2000);
+ Horse_RotateToPoint(&this->actor, &sp24, 0x7D0);
this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
SkelAnime_Update(&this->skin.skelAnime);
if (Math3D_Distance(&sp24, &this->actor.world.pos) < 30.0f) {
@@ -3472,7 +3462,7 @@ s32 EnHorse_CalcFloorHeight(EnHorse* this, PlayState* play, Vec3f* pos, Collisio
if ((COLPOLY_GET_NORMAL((*polyFloor)->normal.y) < 0.81915206f) ||
SurfaceType_IsHorseBlocked(&play->colCtx, *polyFloor, *bgId) ||
- (func_800C99D4(&play->colCtx, *polyFloor, *bgId) == 7)) {
+ (SurfaceType_GetFloorType(&play->colCtx, *polyFloor, *bgId) == FLOOR_TYPE_7)) {
return 3; // Horse blocked surface
}
@@ -3619,7 +3609,7 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
if ((ny < 0.81915206f) ||
SurfaceType_IsHorseBlocked(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) ||
- (func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 7)) {
+ (SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == FLOOR_TYPE_7)) {
if (this->actor.speed >= 0.0f) {
EnHorse_ObstructMovement(this, play, 4, galloping);
} else {
@@ -3739,9 +3729,12 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
if ((this->actor.params != ENHORSE_4) && (this->actor.params != ENHORSE_5) && (this->actor.params != ENHORSE_19) &&
(this->actor.params != ENHORSE_20) && (this->actor.params != ENHORSE_18)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 35.0f, 100.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 35.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 35.0f, 100.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 35.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
}
if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) &&
@@ -3888,7 +3881,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
temp_f0 = COLPOLY_GET_NORMAL(obstacleFloor->normal.y);
if ((temp_f0 < 0.81915206f) || SurfaceType_IsHorseBlocked(&play->colCtx, obstacleFloor, bgId) ||
- (func_800C99D4(&play->colCtx, obstacleFloor, bgId) == 7)) {
+ (SurfaceType_GetFloorType(&play->colCtx, obstacleFloor, bgId) == FLOOR_TYPE_7)) {
if ((Math_CosS(sp7E) < 0.9f) && (movingFast == true) && (this->playerControlled == true) &&
(this->action != ENHORSE_ACTION_STOPPING) && (play->sceneId != SCENE_KOEPONARACE)) {
this->stateFlags |= ENHORSE_FORCE_REVERSING;
@@ -3951,7 +3944,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) {
temp_f0 = COLPOLY_GET_NORMAL(obstacleFloor->normal.y);
if ((temp_f0 < 0.81915206f) || SurfaceType_IsHorseBlocked(&play->colCtx, obstacleFloor, bgId) ||
- (func_800C99D4(&play->colCtx, obstacleFloor, bgId) == 7)) {
+ (SurfaceType_GetFloorType(&play->colCtx, obstacleFloor, bgId) == FLOOR_TYPE_7)) {
if ((movingFast == true) && (this->playerControlled == true) && (this->action != ENHORSE_ACTION_STOPPING) &&
(play->sceneId != SCENE_KOEPONARACE)) {
this->stateFlags |= ENHORSE_FORCE_REVERSING;
@@ -4119,7 +4112,8 @@ s32 EnHorse_UpdateConveyors(EnHorse* this, PlayState* play) {
s16 conveyorDir;
if ((this->actor.floorPoly == NULL) || (&this->actor != player->rideActor) ||
- !SurfaceType_GetConveyorSpeed(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ (SurfaceType_GetConveyorSpeed(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) ==
+ CONVEYOR_SPEED_DISABLED)) {
return false;
}
@@ -4223,7 +4217,7 @@ void EnHorse_Update(Actor* thisx, PlayState* play2) {
EnHorse_RegenBoost(this, play);
}
- if (ActorCutscene_GetCurrentIndex() != -1) {
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
thisx->speed = 0.0f;
}
@@ -4678,7 +4672,7 @@ void EnHorse_Draw(Actor* thisx, PlayState* play) {
EnHorse* this = THIS;
if (!(this->stateFlags & ENHORSE_INACTIVE) && (this->actor.update != func_8087D540)) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
this->stateFlags |= ENHORSE_DRAW;
if (!(this->unk_1EC & 1)) {
if (this->stateFlags & ENHORSE_JUMPING) {
diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.h b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
index 97ab2c898..3cfc1fb54 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.h
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.h
@@ -11,7 +11,7 @@ struct EnIn;
typedef void (*EnHorseActionFunc)(struct EnHorse*, PlayState*);
typedef void (*EnHorsePostdrawFunc)(struct EnHorse*, PlayState*);
-typedef void (*EnHorseCsFunc)(struct EnHorse*, PlayState*, CsCmdActorAction*);
+typedef void (*EnHorseCsFunc)(struct EnHorse*, PlayState*, CsCmdActorCue*);
#define ENHORSE_BOOST (1 << 0) /* 0x1 */
#define ENHORSE_BOOST_DECEL (1 << 1) /* 0x2 */
@@ -75,7 +75,7 @@ typedef enum EnHorseAction {
/* 25 */ ENHORSE_ACTION_25
} EnHorseAction;
-typedef enum {
+typedef enum EnHorsePlayerDir {
/* 0 */ PLAYER_DIR_FRONT_R,
/* 1 */ PLAYER_DIR_FRONT_L,
/* 2 */ PLAYER_DIR_BACK_R,
@@ -84,7 +84,19 @@ typedef enum {
/* 5 */ PLAYER_DIR_SIDE_L
} EnHorsePlayerDir;
-typedef enum {
+typedef enum EnHorseAnimation {
+ /* 0 */ ENHORSE_ANIM_IDLE,
+ /* 1 */ ENHORSE_ANIM_WHINNY,
+ /* 2 */ ENHORSE_ANIM_STOPPING,
+ /* 3 */ ENHORSE_ANIM_REARING,
+ /* 4 */ ENHORSE_ANIM_WALK,
+ /* 5 */ ENHORSE_ANIM_TROT,
+ /* 6 */ ENHORSE_ANIM_GALLOP,
+ /* 7 */ ENHORSE_ANIM_LOW_JUMP,
+ /* 8 */ ENHORSE_ANIM_HIGH_JUMP
+} EnHorseAnimation;
+
+typedef enum HorseType {
/* 0 */ HORSE_TYPE_EPONA,
/* 1 */ HORSE_TYPE_HNI,
/* 2 */ HORSE_TYPE_2,
@@ -100,7 +112,7 @@ typedef enum {
#define ENHORSE_IS_4000_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_4000)
#define ENHORSE_IS_DONKEY_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_DONKEY)
-typedef enum {
+typedef enum EnHorseParam {
/* 0 */ ENHORSE_0,
/* 1 */ ENHORSE_1,
/* 2 */ ENHORSE_2,
@@ -121,7 +133,7 @@ typedef enum {
/* 17 */ ENHORSE_17,
/* 18 */ ENHORSE_18,
/* 19 */ ENHORSE_19,
- /* 20 */ ENHORSE_20,
+ /* 20 */ ENHORSE_20
} EnHorseParam;
/**
@@ -190,7 +202,7 @@ typedef struct EnHorse {
/* 0x3BC */ Vec3f frontLeftHoof;
/* 0x3C8 */ Vec3f backRightHoof;
/* 0x3D4 */ Vec3f backLeftHoof;
- /* 0x3E0 */ s32 unk_3E0;
+ /* 0x3E0 */ s32 cueId;
/* 0x3E4 */ UNK_TYPE1 unk_3E4[0x4];
/* 0x3E8 */ f32 unk_3E8;
/* 0x3EC */ s16 unk_3EC;
@@ -198,7 +210,7 @@ typedef struct EnHorse {
/* 0x48A */ Vec3s morphTable[OBJECT_HA_1_LIMB_MAX];
/* 0x528 */ f32 unk_528;
/* 0x52C */ s32 unk_52C;
- /* 0x530 */ s32 unk_530;
+ /* 0x530 */ s32 cueChannel;
/* 0x534 */ s32 unk_534;
/* 0x538 */ s32 unk_538;
/* 0x53C */ s32 unk_53C;
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
index 5e7619cd2..c7a2edaaa 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_game_check.h"
+#include "z64horse.h"
#include "objects/object_horse_game_check/object_horse_game_check.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -59,7 +60,7 @@ s32 func_808F8AA0(EnHorseGameCheck* this, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
Actor_Kill(&this->dyna.actor);
return false;
}
@@ -116,7 +117,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) {
this->unk_168 = 0;
this->unk_174 = 0;
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
Actor_Kill(&this->dyna.actor);
return false;
}
@@ -156,21 +157,21 @@ s32 func_808F8EB0(EnHorseGameCheck* this, PlayState* play) {
return false;
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) {
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- } else if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ } else if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
play->transitionType = TRANS_TYPE_80;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- } else if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_4) {
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ } else if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_4) {
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
}
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 2);
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -252,7 +253,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x40000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_4);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_4);
this->unk_174 = 60;
}
@@ -285,7 +286,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x40000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
this->unk_174 = 60;
}
@@ -318,7 +319,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x02000000;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_3);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_3);
this->unk_174 = 60;
}
@@ -347,7 +348,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) {
play_sound(NA_SE_SY_START_SHOT);
this->unk_164 |= 0x800;
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_6;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_2);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_2);
this->unk_174 = 60;
}
return true;
diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
index d43f1f90c..9033878a4 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
@@ -11,7 +11,7 @@ typedef s32 (*EnHorseGameCheckUnkFunc)(struct EnHorseGameCheck*, PlayState*);
#define ENHORSEGAMECHECK_GET_FF(thisx) ((thisx)->params & 0xFF)
#define ENHORSEGAMECHECK_GET_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
-enum {
+typedef enum {
/* 0 */ ENHORSEGAMECHECK_FF_0,
/* 1 */ ENHORSEGAMECHECK_FF_1,
/* 2 */ ENHORSEGAMECHECK_FF_2,
@@ -22,8 +22,8 @@ enum {
/* 7 */ ENHORSEGAMECHECK_FF_7,
/* 8 */ ENHORSEGAMECHECK_FF_8,
/* 9 */ ENHORSEGAMECHECK_FF_9,
- /* 10 */ ENHORSEGAMECHECK_FF_MAX,
-};
+ /* 10 */ ENHORSEGAMECHECK_FF_MAX
+} EnHorseGameCheckParam;
typedef struct EnHorseGameCheck {
/* 0x000 */ DynaPolyActor dyna;
diff --git a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
index 0335085bd..0217e8fa8 100644
--- a/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
+++ b/src/overlays/actors/ovl_En_Horse_Link_Child/z_en_horse_link_child.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_link_child.h"
+#include "z64horse.h"
#include "objects/object_horse_link_child/object_horse_link_child.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
@@ -417,7 +418,7 @@ void func_808DF560(EnHorseLinkChild* this) {
this->unk_148 = 1;
}
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, 0.0f);
}
@@ -425,8 +426,8 @@ void func_808DF560(EnHorseLinkChild* this) {
void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
s16 sp36;
- if (D_801BDAA4 != 0) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong) {
+ gHorsePlayedEponasSong = false;
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
func_808DF788(this);
return;
@@ -436,7 +437,7 @@ void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
sp36 = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
if ((Math_CosS(sp36) < 0.7071f) && (this->unk_148 == 2)) {
- func_800F415C(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
@@ -472,9 +473,9 @@ void func_808DF838(EnHorseLinkChild* this, PlayState* play) {
if ((this->unk_148 == 4) || (this->unk_148 == 3) || (this->unk_148 == 2)) {
if (this->unk_1E0 == 0) {
- func_800F415C(&this->actor, &player->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &player->actor.world.pos, 0x12C);
} else {
- func_800F415C(&this->actor, &this->actor.home.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &this->actor.home.pos, 0x12C);
}
}
@@ -529,7 +530,9 @@ void EnHorseLinkChild_Update(Actor* thisx, PlayState* play) {
D_808DFF30[this->unk_144](this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 55.0f, 100.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 55.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 70.0f;
@@ -591,7 +594,7 @@ s32 EnHorseLinkChild_OverrideSkinDraw(Actor* thisx, PlayState* play, s32 limbInd
void EnHorseLinkChild_Draw(Actor* thisx, PlayState* play) {
EnHorseLinkChild* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_80138258(&this->actor, play, &this->skin, EnHorseLinkChild_PostSkinDraw, EnHorseLinkChild_OverrideSkinDraw,
true);
}
diff --git a/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
index 6f3a192c2..648a13d46 100644
--- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c
+++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
@@ -99,9 +99,9 @@ void EnHs_Destroy(Actor* thisx, PlayState* play) {
void func_80952DFC(PlayState* play) {
if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
- func_80151BB4(play, 0x2E);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD);
}
- func_80151BB4(play, 0x10);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GROG);
}
void EnHs_UpdateChickPos(Vec3f* dst, Vec3f src, f32 offset) {
@@ -225,7 +225,7 @@ void EnHs_SceneTransitToBunnyHoodDialogue(EnHs* this, PlayState* play) {
void func_80953354(EnHs* this, PlayState* play) {
if (!Play_InCsMode(play)) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = EnHs_SceneTransitToBunnyHoodDialogue;
}
}
@@ -282,7 +282,7 @@ void EnHs_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (SkelAnime_Update(&this->skelAnime)) {
this->skelAnime.curFrame = 0.0f;
@@ -356,7 +356,7 @@ void EnHs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnHs_Draw(Actor* thisx, PlayState* play) {
EnHs* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnHs_OverrideLimbDraw, EnHs_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.c b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
index 43f39a4b9..abdf870b9 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
@@ -25,7 +25,7 @@ static u8 D_80BF3260[] = {
/* 0x05 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_TOWN, 0x57 - 0x09),
/* 0x09 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 25, 15, 45, 0x51 - 0x0F),
/* 0x0F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 45, 15, 50, 0x4B - 0x15),
- /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_75_10, 0x1A - 0x19),
+ /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x1A - 0x19),
/* 0x19 */ SCHEDULE_CMD_RET_NONE(),
/* 0x1A */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 50, 16, 55, 0x45 - 0x20),
/* 0x20 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 55, 17, 15, 0x3F - 0x26),
@@ -42,7 +42,7 @@ static u8 D_80BF3260[] = {
/* 0x5B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 45, 15, 50, 0xAF - 0x61),
/* 0x61 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 50, 16, 10, 0xA9 - 0x67),
/* 0x67 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 10, 16, 30, 0xA3 - 0x6D),
- /* 0x6D */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_75_10, 0x8A - 0x71),
+ /* 0x6D */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x8A - 0x71),
/* 0x71 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 30, 16, 50, 0x84 - 0x77),
/* 0x77 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 50, 16, 55, 0x7E - 0x7D),
/* 0x7D */ SCHEDULE_CMD_RET_NONE(),
@@ -320,49 +320,49 @@ void func_80BF15EC(EnIg* this) {
}
}
-s32 func_80BF16C8(EnIg* this, s16 arg1) {
+s32 func_80BF16C8(EnIg* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(arg1);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_80BF1744(EnIg* this, s32 arg1) {
- s16 cs = -1;
+s16 func_80BF1744(EnIg* this, s32 numCutscenes) {
+ s16 csId = CS_ID_NONE;
s32 i;
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- cs = this->actor.child->cutscene;
- for (i = 0; i < arg1; i++) {
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ csId = this->actor.child->csId;
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
}
- return cs;
+ return csId;
}
s32 func_80BF17BC(EnIg* this, PlayState* play) {
s32 pad;
- s16 sp2A;
+ s16 csId;
s32 ret;
- sp2A = func_80BF1744(this, 0);
+ csId = func_80BF1744(this, 0);
ret = false;
switch (this->unk_3F6) {
case 0:
- if (func_80BF16C8(this, sp2A)) {
+ if (func_80BF16C8(this, csId)) {
case 2:
case 4:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)),
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
this->actor.child);
}
this->unk_3F6++;
@@ -372,18 +372,18 @@ s32 func_80BF17BC(EnIg* this, PlayState* play) {
case 1:
case 3:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_10) && (this->unk_3F6 == 3)) {
- ActorCutscene_Stop(sp2A);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_ROOM_KEY) && (this->unk_3F6 == 3)) {
+ CutsceneManager_Stop(csId);
this->unk_3F6 = 5;
} else {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
}
this->unk_3F6++;
ret = true;
break;
case 5:
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
this->unk_3F6++;
ret = true;
break;
@@ -497,7 +497,7 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) {
}
s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput, s32 arg3, s32 arg4) {
- u8 sp4F = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -509,7 +509,7 @@ s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput, s
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((sp2C != NULL) && (sp2C->update != NULL)) {
@@ -541,7 +541,7 @@ s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -553,10 +553,10 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
door = func_80BF1200(play, scheduleOutput->result);
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != NULL) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -566,7 +566,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->dyna.actor.shape.rot.y)) <= 0x4000) {
+ if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->knobDoor.dyna.actor.shape.rot.y)) <= 0x4000) {
this->unk_2A4 = -75;
} else {
this->unk_2A4 = 75;
@@ -587,7 +587,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
@@ -595,7 +595,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -635,7 +635,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -645,7 +645,7 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -735,7 +735,7 @@ s32 func_80BF2470(EnIg* this, PlayState* play) {
s32 pad;
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (((f32)this->unk_3E2 / this->unk_3E0) <= 0.9f) {
door->unk_1A7 = this->unk_2A4;
} else {
@@ -952,7 +952,7 @@ void EnIg_Update(Actor* thisx, PlayState* play) {
func_80BF15EC(this);
func_8013C964(&this->actor, play, 60.0f, 30.0f, PLAYER_IA_NONE, this->unk_3D0 & 7);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_80BF1354(this, play);
}
}
@@ -1036,7 +1036,7 @@ void EnIg_Draw(Actor* thisx, PlayState* play) {
EnIg* this = THIS;
if (this->scheduleResult != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.h b/src/overlays/actors/ovl_En_Ig/z_en_ig.h
index c3fd0c3fb..274338a11 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.h
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.h
@@ -9,7 +9,7 @@ typedef void (*EnIgActionFunc)(struct EnIg*, PlayState*);
typedef s32 (*EnIgUnkFunc)(struct EnIg*, PlayState*);
typedef void (*EnIgUnkFunc2)(struct EnIg*, PlayState*);
-#define ENIG_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define ENIG_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct EnIg {
/* 0x000 */ Actor actor;
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 fb9267e8e..a116c323a 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -169,8 +169,7 @@ typedef enum {
/* 0x4 */ DMG_EFF_FIRE = 0x2,
/* 0x0 */ DMG_EFF_ICE,
/* 0x4 */ DMG_EFF_LIGHT_SPARKS,
- /* 0xF */ DMG_EFF_IMMUNE = 0xF,
-
+ /* 0xF */ DMG_EFF_IMMUNE = 0xF
} EnIkDmgEff;
static DamageTable sDamageTableArmor = {
@@ -488,7 +487,7 @@ void EnIk_VerticalAttack(EnIk* this, PlayState* play) {
if ((this->skelAnime.curFrame > 13.0f) && (this->skelAnime.curFrame < 23.0f)) {
this->colliderQuad.base.atFlags |= AT_ON;
if (this->drawArmorFlags) {
- this->actor.speed = sin_rad((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
+ this->actor.speed = Math_SinF((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
}
} else {
this->colliderQuad.base.atFlags &= ~AT_ON;
@@ -551,7 +550,7 @@ void EnIk_HorizontalDoubleAttack(EnIk* this, PlayState* play) {
} else {
phi_f2 = this->skelAnime.curFrame - 1.0f;
}
- this->actor.speed = sin_rad((M_PI / 8) * phi_f2) * 4.5f;
+ this->actor.speed = Math_SinF((M_PI / 8) * phi_f2) * 4.5f;
}
this->colliderQuad.base.atFlags |= AT_ON;
} else {
@@ -651,7 +650,7 @@ void EnIk_ReactToAttack(EnIk* this, PlayState* play) {
}
if (SkelAnime_Update(&this->skelAnime)) {
if (this->subCamId != SUB_CAM_ID_DONE) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
this->subCamId = SUB_CAM_ID_DONE;
EnIk_SetupIdle(this);
} else {
@@ -686,14 +685,14 @@ void EnIk_Die(EnIk* this, PlayState* play) {
if (this->timer != 0) {
this->timer--;
for (i = 6 - (this->timer >> 2); i >= 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.x;
- effectPos.z = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.z;
- effectPos.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ effectPos.x = Rand_CenteredFloat(80.0f) + this->actor.world.pos.x;
+ effectPos.z = Rand_CenteredFloat(80.0f) + this->actor.world.pos.z;
+ effectPos.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &effectPos, &sEffectVelAndAccel, &sEffectVelAndAccel, 100, 0, 2);
}
if (this->timer == 0) {
Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0xB0);
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
Actor_Kill(&this->actor);
}
}
@@ -723,7 +722,7 @@ void EnIk_Frozen(EnIk* this, PlayState* play) {
}
void EnIk_SetupCutscene(EnIk* this) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actor.speed = 0.0f;
if (this->actor.colChkInfo.health != 0) {
func_800BE504(&this->actor, &this->colliderCylinder);
@@ -735,10 +734,10 @@ void EnIk_PlayCutscene(EnIk* this, PlayState* play) {
Vec3f subCamEye;
this->invincibilityFrames = 12;
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- if (this->actor.cutscene != -1) {
- ActorCutscene_StartAndSetFlag(this->actor.cutscene, &this->actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->actor.csId, &this->actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
subCamEye.x = (Math_SinS((this->actor.shape.rot.y - 0x2000)) * 120.0f) + this->actor.focus.pos.x;
subCamEye.y = this->actor.focus.pos.y + 20.0f;
subCamEye.z = (Math_CosS((this->actor.shape.rot.y - 0x2000)) * 120.0f) + this->actor.focus.pos.z;
@@ -750,7 +749,7 @@ void EnIk_PlayCutscene(EnIk* this, PlayState* play) {
EnIk_SetupDie(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -846,9 +845,9 @@ void EnIk_UpdateArmor(EnIk* this, PlayState* play) {
ikEffect->pos.y = this->actor.floorHeight;
for (i = 0; i < 4; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(20.0f) + ikEffect->pos.x;
+ effectPos.x = Rand_CenteredFloat(20.0f) + ikEffect->pos.x;
effectPos.y = Rand_ZeroFloat(20.0f) + ikEffect->pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(20.0f) + ikEffect->pos.z;
+ effectPos.z = Rand_CenteredFloat(20.0f) + ikEffect->pos.z;
func_800B3030(play, &effectPos, &gZeroVec3f, &gZeroVec3f, 40, 7, 2);
}
@@ -870,7 +869,9 @@ void EnIk_Update(Actor* thisx, PlayState* play2) {
}
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 75.0f, 30.0f, 30.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 75.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.focus.rot.y = this->actor.shape.rot.y;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
if (this->invincibilityFrames == 0) {
@@ -1031,6 +1032,7 @@ void EnIk_UpdateArmorDraw(EnIk* this, PlayState* play) {
sp54 = 0;
OPEN_DISPS(play->state.gfxCtx);
+
gfxOpa = POLY_OPA_DISP;
gfxXlu = POLY_XLU_DISP;
@@ -1075,10 +1077,10 @@ void EnIk_Draw(Actor* thisx, PlayState* play) {
func_800B8050(&this->actor, play, 0);
func_800B8118(&this->actor, play, 0);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_XLU_DISP = &gfx[1];
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gfxArmorType = sIronKnuckleArmorType[this->actor.params];
gSPSegment(&gfx[1], 0x08, gfxArmorType[0]);
gSPSegment(&gfx[2], 0x09, gfxArmorType[1]);
diff --git a/src/overlays/actors/ovl_En_In/z_en_in.c b/src/overlays/actors/ovl_En_In/z_en_in.c
index bf7552947..ca764b134 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -5,6 +5,7 @@
*/
#include "z_en_in.h"
+#include "z64horse.h"
#include "objects/object_in/object_in.h"
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h"
@@ -150,7 +151,7 @@ s32 EnIn_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s16 frameCount;
s32 ret = false;
- if (animIndex >= 0 && animIndex < 18) {
+ if ((animIndex >= 0) && (animIndex < 18)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -169,12 +170,12 @@ s32 func_808F3178(EnIn* this, PlayState* play) {
u8 tmp;
this->unk260 = tmp = SubS_IsFloorAbove(play, &this->unk248, -6.0f);
- if (this->unk260 != 0 && prevUnk260 == 0 && tmp) {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_CONCRETE);
+ if ((this->unk260 != 0) && (prevUnk260 == 0) && tmp) {
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_STONE);
}
this->unk261 = tmp = SubS_IsFloorAbove(play, &this->unk254, -6.0f);
- if (this->unk261 != 0 && prevUnk261 == 0 && tmp) {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_CONCRETE);
+ if ((this->unk261 != 0) && (prevUnk261 == 0) && tmp) {
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_STONE);
}
return 0;
@@ -224,7 +225,7 @@ s32 func_808F33B8(void) {
s32 ret = (((gSaveContext.save.day == 1) &&
((gSaveContext.save.time >= CLOCK_TIME(5, 30)) && (gSaveContext.save.time <= CLOCK_TIME(6, 0)))) ||
(gSaveContext.save.day >= 2)) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01);
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM);
return ret;
}
@@ -273,10 +274,10 @@ void EnIn_DoNothing(EnIn* this, PlayState* play) {
}
void func_808F3618(EnIn* this, PlayState* play) {
- if (ENIN_GET_PATH(&this->actor) != 0x3F) {
+ if (ENIN_GET_PATH_INDEX(&this->actor) != ENIN_PATH_INDEX_NONE) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_9);
}
- if (ENIN_GET_PATH(&this->actor) != 0x3F) {
+ if (ENIN_GET_PATH_INDEX(&this->actor) != ENIN_PATH_INDEX_NONE) {
this->actionFunc = func_808F3690;
} else {
this->actionFunc = EnIn_DoNothing;
@@ -328,7 +329,7 @@ void func_808F38F8(EnIn* this, PlayState* play) {
while (true) {
//! @bug: Infinite loop if there is only one ACTOR_EN_IN
this->unk4A4 = (EnIn*)SubS_FindActor(play, &this->unk4A4->actor, ACTORCAT_NPC, ACTOR_EN_IN);
- if (this->unk4A4 != NULL && this->unk4A4 != this) {
+ if ((this->unk4A4 != NULL) && (this->unk4A4 != this)) {
break;
}
this->unk4A4 = (EnIn*)this->unk4A4->actor.next;
@@ -336,7 +337,7 @@ void func_808F38F8(EnIn* this, PlayState* play) {
}
void func_808F395C(EnIn* this, PlayState* play) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_END) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_END) {
this->actionFunc = func_808F5A94;
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -352,30 +353,38 @@ void func_808F39DC(EnIn* this, PlayState* play) {
u16 textId = 0;
if (gSaveContext.save.day != 3) {
- switch (GET_WEEKEVENTREG_RACE_FLAGS) {
- case WEEKEVENTREG_RACE_FLAG_2:
+ switch (GET_WEEKEVENTREG_HORSE_RACE_STATE) {
+ case WEEKEVENTREG_HORSE_RACE_STATE_2:
textId = 0x347A;
break;
- case WEEKEVENTREG_RACE_FLAG_3:
+
+ case WEEKEVENTREG_HORSE_RACE_STATE_3:
textId = 0x3476;
break;
+
+ default:
+ break;
}
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
} else {
- switch (GET_WEEKEVENTREG_RACE_FLAGS) {
- case WEEKEVENTREG_RACE_FLAG_2:
+ switch (GET_WEEKEVENTREG_HORSE_RACE_STATE) {
+ case WEEKEVENTREG_HORSE_RACE_STATE_2:
textId = 0x349D;
break;
- case WEEKEVENTREG_RACE_FLAG_3:
+
+ case WEEKEVENTREG_HORSE_RACE_STATE_3:
textId = 0x3499;
break;
+
+ default:
+ break;
}
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
}
this->actor.flags |= ACTOR_FLAG_10000;
this->actor.textId = textId;
this->actionFunc = func_808F395C;
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_2) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
@@ -481,6 +490,7 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x345B;
}
break;
+
case 1:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_15_10)) {
textId = 0x3463;
@@ -488,11 +498,12 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x346B;
}
break;
+
case 3:
if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x3485;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x3484;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_56_04)) {
textId = 0x346D;
@@ -500,8 +511,10 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3482;
}
break;
+
case 4:
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA || gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x348A;
} else if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x348B;
@@ -511,6 +524,7 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3489;
}
break;
+
case 5:
if (func_808F33B8()) {
textId = 0x34B3;
@@ -520,17 +534,22 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3493;
}
break;
+
case 7:
if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x34A8;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x34A7;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_16_04)) {
textId = 0x3495;
} else {
textId = 0x34A5;
}
+ break;
+
+ default:
+ break;
}
if (textId == 0) {
textId = 1;
@@ -539,12 +558,12 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
}
void func_808F4054(PlayState* play, EnIn* this, s32 arg2, u16 textId) {
- s32 unused;
+ s32 pad;
- if (textId == 0x34AE || textId == 0x34B0 || textId == 0x34B2) {
- unused = textId;
- func_80151BB4(play, 0x11);
+ if ((textId == 0x34AE) || (textId == 0x34B0) || (textId == 0x34B2)) {
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
}
+
switch (arg2) {
case 1:
case 5:
@@ -553,12 +572,15 @@ void func_808F4054(PlayState* play, EnIn* this, s32 arg2, u16 textId) {
func_808F35D8(this, play);
}
break;
+
case 2:
if (textId == 0x3473) {
func_808F35D8(this, play);
}
break;
+
case 0:
+ default:
break;
}
}
@@ -572,37 +594,37 @@ void func_808F4108(EnIn* this, PlayState* play, u16 textId) {
}
s32 func_808F4150(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx) {
- EnIn* this2 = this;
+ Actor* thisx = &this->actor;
if (msgCtx->choiceIndex == 0) {
func_8019F208();
- if (gSaveContext.save.playerData.rupees >= play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
Rupees_ChangeBy(-play->msgCtx.unk1206C);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_57_01)) {
func_808F4108(this, play, 0x3474);
} else if (this->unk4AC & 8) {
func_808F4108(this, play, 0x3475);
} else {
- Actor_ContinueText(play, &this->actor, 0x3475);
+ Actor_ContinueText(play, thisx, 0x3475);
}
} else {
play_sound(NA_SE_SY_ERROR);
- Actor_ContinueText(play, &this->actor, 0x3473);
+ Actor_ContinueText(play, thisx, 0x3473);
}
} else {
func_8019F230();
- Actor_ContinueText(play, &this->actor, 0x3472);
+ Actor_ContinueText(play, thisx, 0x3472);
}
return 0;
}
s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx, s32 arg4) {
s32 pad;
- s32 fee = play->msgCtx.unk1206C != 0xFFFF ? play->msgCtx.unk1206C : 10;
+ s32 fee = (play->msgCtx.unk1206C != 0xFFFF) ? play->msgCtx.unk1206C : 10;
if (msgCtx->choiceIndex == 0) {
func_8019F208();
- if (gSaveContext.save.playerData.rupees >= fee) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= fee) {
Rupees_ChangeBy(-fee);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_57_01)) {
if (arg4 != 0) {
@@ -635,7 +657,7 @@ s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx,
s32 func_808F43E0(EnIn* this) {
this->unk48C = 0;
this->actor.textId = 0;
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_END);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_END);
return 0;
}
@@ -650,31 +672,38 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x34B0);
ret = false;
break;
+
case 0x34A9:
func_808F4108(this, play, 0x34AA);
SET_WEEKEVENTREG(WEEKEVENTREG_63_40);
ret = false;
break;
+
case 0x34AA:
func_808F4108(this, play, 0x34AB);
ret = false;
break;
+
case 0x34AB:
func_808F4108(this, play, 0x34AC);
ret = false;
break;
+
case 0x34AC:
func_808F4108(this, play, 0x34AD);
ret = false;
break;
+
case 0x34AD:
Actor_ContinueText(play, &this->actor, 0x34AE);
ret = false;
break;
+
case 0x34B1:
Actor_ContinueText(play, &this->actor, 0x34B2);
ret = false;
break;
+
default:
break;
}
@@ -687,48 +716,62 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x3459);
ret = false;
break;
+
case 0x3459:
Actor_ContinueText(play, &this->actor, 0x345A);
ret = false;
break;
+
case 0x345A:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x345B:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x345C:
Actor_ContinueText(play, &this->actor, 0x345D);
ret = false;
break;
+
case 0x345D:
Actor_ContinueText(play, &this->actor, 0x345E);
ret = false;
break;
+
case 0x345E:
Actor_ContinueText(play, &this->actor, 0x345F);
ret = false;
break;
+
case 0x345F:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3460:
Actor_ContinueText(play, &this->actor, 0x3461);
ret = false;
break;
+
case 0x3461:
Actor_ContinueText(play, &this->actor, 0x3462);
ret = false;
break;
+
case 0x3462:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 1:
switch (textId) {
case 0x3463:
@@ -736,18 +779,21 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x3464);
ret = false;
break;
+
case 0x3464:
Actor_ContinueText(play, &this->actor, 0x3465);
ret = false;
break;
+
case 0x3465:
Actor_ContinueText(play, &this->actor, 0x3466);
ret = false;
break;
+
case 0x3466:
if (msgCtx->choiceIndex == 0) {
func_8019F208();
- if (gSaveContext.save.playerData.rupees >= play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
if (Inventory_HasEmptyBottle()) {
this->actionFunc = func_808F3C40;
Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
@@ -768,62 +814,74 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x3467:
case 0x3468:
case 0x3469:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x346B:
Actor_ContinueText(play, &this->actor, 0x346C);
ret = false;
break;
+
case 0x346C:
Actor_ContinueText(play, &this->actor, 0x3466);
ret = false;
break;
+
case 0x346A:
this->actionFunc = func_808F5A94;
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
}
break;
+
case 2:
switch (textId) {
case 0x346E:
func_808F4108(this, play, 0x346F);
ret = false;
break;
+
case 0x3470:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3483:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3471:
func_808F4150(play, this, arg2, msgCtx);
ret = false;
break;
+
case 0x3472:
func_808F43E0(this);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3473:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3475:
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_START);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 5);
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_57_01);
break;
+
case 0x3478:
if (msgCtx->choiceIndex == 0) {
func_808F4150(play, this, arg2, msgCtx);
@@ -835,13 +893,18 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x347B:
func_808F4108(this, play, 0x347C);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
+ default:
+ break;
}
break;
+
case 3:
switch (textId) {
case 0x346D:
@@ -850,36 +913,44 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x346F:
func_808F4108(this, play, 0x3470);
ret = false;
break;
+
case 0x3482:
func_808F4108(this, play, 0x3483);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3484:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3485:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3474:
func_808F4108(this, play, 0x3475);
ret = false;
break;
+
case 0x3476:
Actor_ContinueText(play, &this->actor, 0x3477);
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
ret = false;
break;
+
case 0x3477:
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
func_808F4108(this, play, 0x3478);
ret = false;
break;
+
case 0x347A:
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
@@ -903,42 +974,52 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x347F:
Actor_ContinueText(play, &this->actor, 0x3480);
ret = false;
break;
+
case 0x3480:
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3479:
func_808F43E0(this);
func_808F35D8(this, play);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x347C:
this->actionFunc = func_808F3D40;
Actor_OfferGetItem(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
func_808F35D8(this, play);
ret = true;
break;
+
case 0x3481:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x347D:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
- func_80151BB4(play, 0x2F);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 4:
switch (textId) {
case 0x3486:
@@ -946,60 +1027,75 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_16_01);
ret = false;
break;
+
case 0x3487:
Actor_ContinueText(play, &this->actor, 0x3488);
ret = false;
break;
+
case 0x3488:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3489:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348A:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348B:
Actor_ContinueText(play, &this->actor, 0x348C);
ret = false;
break;
+
case 0x348C:
Actor_ContinueText(play, &this->actor, 0x348D);
ret = false;
break;
+
case 0x348D:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 5:
switch (textId) {
case 0x3468:
case 0x3469:
case 0x3491:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348E:
case 0x34B3:
Actor_ContinueText(play, &this->actor, 0x348F);
SET_WEEKEVENTREG(WEEKEVENTREG_16_02);
ret = false;
break;
+
case 0x3493:
Actor_ContinueText(play, &this->actor, 0x3494);
ret = false;
break;
+
case 0x348F:
case 0x3494:
Actor_ContinueText(play, &this->actor, 0x3490);
ret = false;
break;
+
case 0x3490:
if (msgCtx->choiceIndex == 0) {
func_8019F208();
- if (gSaveContext.save.playerData.rupees >= play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
if (Inventory_HasEmptyBottle()) {
this->actionFunc = func_808F3C40;
Actor_OfferGetItem(&this->actor, play, GI_MILK, 500.0f, 100.0f);
@@ -1020,57 +1116,68 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x3492:
this->actionFunc = func_808F5A94;
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
}
break;
+
case 7:
switch (textId) {
case 0x34A8:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x34A7:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3495:
func_808F4108(this, play, 0x3496);
SET_WEEKEVENTREG(WEEKEVENTREG_16_04);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3497:
func_808F4108(this, play, 0x3498);
ret = false;
break;
+
case 0x34A4:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x34A5:
func_808F4108(this, play, 0x34A6);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3473:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3474:
Actor_ContinueText(play, &this->actor, 0x3475);
ret = false;
break;
+
case 0x3475:
- SET_WEEKEVENTREG_RACE_FLAGS(WEEKEVENTREG_RACE_FLAG_START);
+ SET_WEEKEVENTREG_HORSE_RACE_STATE(WEEKEVENTREG_HORSE_RACE_STATE_START);
func_800FD750(NA_BGM_HORSE);
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 5);
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_57_01);
break;
+
case 0x349D:
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
@@ -1083,19 +1190,22 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x349F:
this->actionFunc = func_808F3D40;
Actor_OfferGetItem(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
func_808F35D8(this, play);
ret = true;
break;
+
case 0x34A0:
this->actionFunc = func_808F5A34;
- func_80151BB4(play, 0x11);
- func_80151BB4(play, 0x2F);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK);
func_808F43E0(this);
ret = true;
break;
+
case 0x34A1:
func_808F35D8(this, play);
if (Inventory_HasEmptyBottle()) {
@@ -1107,25 +1217,30 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x34A2:
Actor_ContinueText(play, &this->actor, 0x34A3);
ret = false;
break;
+
case 0x34A3:
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3499:
Actor_ContinueText(play, &this->actor, 0x349A);
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
ret = false;
break;
+
case 0x349A:
Actor_ContinueText(play, &this->actor, 0x349B);
ret = false;
break;
+
case 0x349B:
if (msgCtx->choiceIndex == 0) {
func_808F4270(play, this, arg2, msgCtx, 1);
@@ -1136,42 +1251,57 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x349C:
func_808F43E0(this);
func_808F35D8(this, play);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 6:
switch (textId) {
case 0x3496:
func_808F4108(this, play, 0x3497);
ret = false;
break;
+
case 0x3498:
case 0x34A6:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3471:
func_808F4270(play, this, arg2, msgCtx, 0);
ret = false;
break;
+
case 0x3472:
func_808F43E0(this);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x349E:
func_808F4108(this, play, 0x349F);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1185,6 +1315,7 @@ s32 func_808F5674(PlayState* play, EnIn* this, s32 arg2) {
func_808F4054(play, this, arg2, this->actor.textId);
ret = true;
break;
+
case TEXT_STATE_CHOICE:
case TEXT_STATE_5:
if (Message_ShouldAdvance(play) && func_808F4414(play, this, arg2)) {
@@ -1192,6 +1323,9 @@ s32 func_808F5674(PlayState* play, EnIn* this, s32 arg2) {
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1286,7 +1420,7 @@ void func_808F5A34(EnIn* this, PlayState* play) {
}
void func_808F5A94(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if (gSaveContext.save.day == 3) {
func_808F5728(play, this, 7, &this->unk48C);
} else {
@@ -1302,7 +1436,7 @@ void func_808F5A94(EnIn* this, PlayState* play) {
}
void func_808F5B58(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) {
if (gSaveContext.save.day == 3) {
@@ -1322,7 +1456,7 @@ void func_808F5B58(EnIn* this, PlayState* play) {
}
void func_808F5C98(EnIn* this, PlayState* play) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_END) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_END) {
this->actionFunc = func_808F5B58;
}
if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
@@ -1334,7 +1468,7 @@ void func_808F5C98(EnIn* this, PlayState* play) {
}
}
if (this->unk4A8 == 2) {
- if (this->unk4B0 == WEEKEVENTREG_RACE_FLAG_2) {
+ if (this->unk4B0 == WEEKEVENTREG_HORSE_RACE_STATE_2) {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_LOST);
} else {
Actor_PlaySfx(&this->actor, NA_SE_VO_IN_JOY0);
@@ -1366,11 +1500,11 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->unk48C = 0;
this->unk4AC = 0;
type = ENIN_GET_TYPE(thisx);
- this->unk4B0 = GET_WEEKEVENTREG_RACE_FLAGS;
- if (type == ENIN_HORSE_RIDER_BLUE_SHIRT || type == ENIN_BLUE_SHIRT) {
+ this->unk4B0 = GET_WEEKEVENTREG_HORSE_RACE_STATE;
+ if ((type == ENIN_HORSE_RIDER_BLUE_SHIRT) || (type == ENIN_BLUE_SHIRT)) {
this->unk4AC |= 8;
}
- if (type == ENIN_HORSE_RIDER_YELLOW_SHIRT || type == ENIN_HORSE_RIDER_BLUE_SHIRT) {
+ if ((type == ENIN_HORSE_RIDER_YELLOW_SHIRT) || (type == ENIN_HORSE_RIDER_BLUE_SHIRT)) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
this->unk488 = 1;
Animation_Change(&this->skelAnime, &object_in_Anim_016A60, 1.0f, 0.0f,
@@ -1384,24 +1518,24 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
Collider_SetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, &this->colliderJntSphElement);
Actor_SetScale(&this->actor, 0.01f);
this->actor.gravity = -4.0f;
- this->path = SubS_GetPathByIndex(play, ENIN_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENIN_GET_PATH_INDEX(&this->actor), ENIN_PATH_INDEX_NONE);
this->unk23D = 0;
- if (type == ENIN_YELLOW_SHIRT || type == ENIN_BLUE_SHIRT) {
- if ((GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) ||
- (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_3)) {
+ if ((type == ENIN_YELLOW_SHIRT) || (type == ENIN_BLUE_SHIRT)) {
+ if ((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
this->unk4A8 = 0;
this->unk4AC |= 2;
func_808F35AC(this, play);
this->unk23C = 0;
- D_801BDAA0 = 0;
+ D_801BDAA0 = false;
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_6);
} else {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_4);
}
- if (GET_WEEKEVENTREG_RACE_FLAGS == WEEKEVENTREG_RACE_FLAG_2) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2) {
this->skelAnime.curFrame = ((Rand_ZeroOne() * 0.6f) + 0.2f) * this->skelAnime.endFrame;
}
if (this->unk4AC & 8) {
@@ -1410,7 +1544,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_808F5C98;
}
} else {
- if (GET_WEEKEVENTREG_RACE_FLAGS != WEEKEVENTREG_RACE_FLAG_START) {
+ if (GET_WEEKEVENTREG_HORSE_RACE_STATE != WEEKEVENTREG_HORSE_RACE_STATE_START) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
this->unk23C = 0;
this->unk4AC |= 2;
@@ -1419,7 +1553,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_0);
this->actionFunc = func_808F5A94;
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_KANBAN, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.shape.rot.x,
this->actor.shape.rot.y, this->actor.shape.rot.z, 0xF);
@@ -1430,7 +1564,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
}
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Kill(&this->actor);
} else {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_7);
@@ -1468,7 +1602,7 @@ void EnIn_Update(Actor* thisx, PlayState* play) {
this->unk4AC &= ~0x40;
}
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 0x4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_808F3414(this, play);
func_808F32A0(this, play);
}
@@ -1477,15 +1611,15 @@ void func_808F6334(EnIn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 talkState = Message_GetState(&play->msgCtx);
- this->unk4C4 += this->unk4C0 != 0.0f ? 40.0f : -40.0f;
+ this->unk4C4 += (this->unk4C0 != 0.0f) ? 40.0f : -40.0f;
this->unk4C4 = CLAMP(this->unk4C4, 0.0f, 80.0f);
Matrix_Translate(this->unk4C4, 0.0f, 0.0f, MTXMODE_APPLY);
if ((&this->actor == player->talkActor) &&
- !((play->msgCtx.currentTextId >= 0xFF) && (play->msgCtx.currentTextId <= 0x200)) &&
- (talkState == TEXT_STATE_3) && (this->prevTalkState == TEXT_STATE_3)) {
+ ((play->msgCtx.currentTextId < 0xFF) || (play->msgCtx.currentTextId > 0x200)) && (talkState == TEXT_STATE_3) &&
+ (this->prevTalkState == TEXT_STATE_3)) {
if (!(play->state.frames & 1)) {
- this->unk4C0 = this->unk4C0 != 0.0f ? 0.0f : 1.0f;
+ this->unk4C0 = (this->unk4C0 != 0.0f) ? 0.0f : 1.0f;
}
} else {
this->unk4C0 = 0.0f;
@@ -1519,16 +1653,17 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
object_in_DL_013440,
};
- if (this->unk23C != 0 && limbIndex != 16) {
+ if ((this->unk23C != 0) && (limbIndex != 16)) {
if (sp50[limbIndex] != NULL) {
*dList = sp50[limbIndex];
}
}
- if (this->unk4AC & 4 && limbIndex == 16) {
+ if ((this->unk4AC & 4) && (limbIndex == 16)) {
*dList = object_in_DL_01C528;
}
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 16) {
TexturePtr sp38[] = { object_in_Tex_0035E0, object_in_Tex_004820, object_in_Tex_004C20, object_in_Tex_0043E0 };
@@ -1537,6 +1672,7 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
} else {
AnimatedMat_DrawStep(play, Lib_SegmentedToVirtual(object_in_Matanimheader_001C30), this->unk4AC & 8 ? 1 : 0);
}
+
CLOSE_DISPS(play->state.gfxCtx);
if (limbIndex == 16) {
@@ -1550,7 +1686,7 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
Matrix_RotateYS(this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateXS(this->torsoRot.x, MTXMODE_APPLY);
}
- if (limbIndex == 9 || limbIndex == 10 || limbIndex == 13) {
+ if ((limbIndex == 9) || (limbIndex == 10) || (limbIndex == 13)) {
rot->y += (s16)(Math_SinS(this->unk376[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->unk39E[limbIndex]) * 200.0f);
}
@@ -1592,21 +1728,25 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (this->unk23C == 0) {
if (!(this->unk4AC & 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 12) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007A70);
}
if (limbIndex == 15) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
}
if (this->unk4AC & 0x20) {
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 12) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1615,9 +1755,11 @@ void EnIn_Draw(Actor* thisx, PlayState* play) {
EnIn* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnIn_OverrideLimbDraw, EnIn_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_In/z_en_in.h b/src/overlays/actors/ovl_En_In/z_en_in.h
index dd32ac9c6..6f4dd5d95 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.h
+++ b/src/overlays/actors/ovl_En_In/z_en_in.h
@@ -33,11 +33,13 @@ typedef enum {
/* 14 */ ENIN_ANIM_14,
/* 15 */ ENIN_ANIM_15,
/* 16 */ ENIN_ANIM_16,
- /* 17 */ ENIN_ANIM_17,
+ /* 17 */ ENIN_ANIM_17
} EnInAnimation;
#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF)
-#define ENIN_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+#define ENIN_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+
+#define ENIN_PATH_INDEX_NONE 0x3F
typedef struct EnIn {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Insect/z_en_insect.c b/src/overlays/actors/ovl_En_Insect/z_en_insect.c
index 65696795b..6a51e9486 100644
--- a/src/overlays/actors/ovl_En_Insect/z_en_insect.c
+++ b/src/overlays/actors/ovl_En_Insect/z_en_insect.c
@@ -442,7 +442,7 @@ void func_8091B984(EnInsect* this, PlayState* play) {
void EnInsect_Update(Actor* thisx, PlayState* play) {
EnInsect* this = THIS;
- s32 phi_v0;
+ s32 updBgCheckInfoFlags;
if ((this->actor.child != NULL) && (this->actor.child->update == NULL) && (&this->actor != this->actor.child)) {
this->actor.child = NULL;
@@ -470,14 +470,14 @@ void EnInsect_Update(Actor* thisx, PlayState* play) {
}
}
- phi_v0 = 0;
+ updBgCheckInfoFlags = 0;
if (this->unk_30C & 1) {
- phi_v0 = 4;
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4;
}
- if (phi_v0 != 0) {
- phi_v0 |= 0x40;
- Actor_UpdateBgCheckInfo(play, &this->actor, 8.0f, 5.0f, 0.0f, phi_v0);
+ if (updBgCheckInfoFlags != 0) {
+ updBgCheckInfoFlags |= UPDBGCHECKINFO_FLAG_40;
+ Actor_UpdateBgCheckInfo(play, &this->actor, 8.0f, 5.0f, 0.0f, updBgCheckInfoFlags);
}
if (Actor_HasParent(&this->actor, play)) {
@@ -506,7 +506,7 @@ void EnInsect_Update(Actor* thisx, PlayState* play) {
void EnInsect_Draw(Actor* thisx, PlayState* play) {
EnInsect* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
D_8091BD60 = 0;
}
diff --git a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c
index 489431bdf..d2aceba29 100644
--- a/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c
+++ b/src/overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.c
@@ -55,7 +55,7 @@ static ColliderCylinderInit sCylinderInit = {
void func_80C258A0(EnInvisibleRuppe* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void func_80C2590C(EnInvisibleRuppe* this, PlayState* play) {
diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
index 040081b5c..da813182e 100644
--- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
+++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c
@@ -354,7 +354,7 @@ void func_8095E204(EnIshi* this, PlayState* play) {
for (i = 0; i < 3; i++) {
if (Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 1,
- this->actor.cutscene, this->actor.halfDaysBits, NULL) == NULL) {
+ this->actor.csId, this->actor.halfDaysBits, NULL) == NULL) {
break;
}
}
@@ -386,7 +386,7 @@ void EnIshi_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain[sp34]);
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
this->actor.uncullZoneForward += 1000.0f;
}
@@ -541,7 +541,9 @@ void func_8095E95C(EnIshi* this, PlayState* play) {
func_8095E14C(this);
func_8095E180(&this->actor.velocity, D_8095F6C8[ENISHI_GET_1(&this->actor)]);
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
} else {
sp30.x = this->actor.world.pos.x;
sp30.y = this->actor.world.pos.y + 20.0f;
@@ -595,11 +597,11 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
}
if (sp70 == 1) {
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, 3, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 3, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
}
@@ -648,7 +650,9 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
Actor_UpdatePos(&this->actor);
this->actor.shape.rot.x += D_8095F690;
this->actor.shape.rot.y += D_8095F694;
- Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
@@ -656,7 +660,7 @@ void func_8095EBDC(EnIshi* this, PlayState* play) {
void func_8095F060(EnIshi* this) {
this->actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_8095F0A4;
}
@@ -664,15 +668,15 @@ void func_8095F0A4(EnIshi* this, PlayState* play) {
s32 pad;
s32 sp28 = ENISHI_GET_1(&this->actor);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, D_8095F6D4[sp28], D_8095F6D0[sp28]);
D_8095F6D8[sp28](&this->actor, play);
D_8095F6E0[sp28](this, play);
this->actor.draw = NULL;
func_8095F180(this);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -681,9 +685,9 @@ void func_8095F180(EnIshi* this) {
}
void func_8095F194(EnIshi* this, PlayState* play) {
- if (this->actor.cutscene < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
Actor_Kill(&this->actor);
- } else if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
+ } else if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
Actor_Kill(&this->actor);
}
}
@@ -706,7 +710,7 @@ void func_8095F210(EnIshi* this, PlayState* play) {
if (this->actor.projectedPos.z < 1300.0f) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
sp28 = (1300.0f - this->actor.projectedPos.z) * 2.55f;
@@ -726,7 +730,7 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
if ((this->actor.projectedPos.z <= 2150.0f) || ((this->unk_197 & 1) && (this->actor.projectedPos.z < 2250.0f))) {
this->actor.shape.shadowAlpha = 160;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -737,7 +741,7 @@ void func_8095F36C(EnIshi* this, PlayState* play) {
this->actor.shape.shadowAlpha = sp20 * 0.627451f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.c b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
index 39a28c4bd..fcbd26b2f 100644
--- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c
+++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c
@@ -389,7 +389,7 @@ void EnJa_Update(Actor* thisx, PlayState* play) {
if (this->unk_1D8.unk_00 != 2) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
func_80BC1984(this, play);
}
@@ -594,7 +594,7 @@ void EnJa_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1D8.unk_00 != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, D_80BC37AC[phi_t2].r, D_80BC37AC[phi_t2].g, D_80BC37AC[phi_t2].b,
diff --git a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c
index 05855bb20..314e94d1b 100644
--- a/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c
+++ b/src/overlays/actors/ovl_En_Jc_Mato/z_en_jc_mato.c
@@ -150,9 +150,11 @@ void EnJcMato_Draw(Actor* thisx, PlayState* play) {
EnJcMato* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gKoumeTargetDL);
Matrix_MultVec3f(&sOffset, &this->pos);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c
index f2f2569c4..449acf212 100644
--- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c
+++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c
@@ -54,14 +54,14 @@ typedef enum {
/* 16 */ EN_JG_ANIM_DEPRESSED,
/* 17 */ EN_JG_ANIM_CUTSCENE_IDLE,
/* 18 */ EN_JG_ANIM_CRADLE,
- /* 19 */ EN_JG_ANIM_MAX,
+ /* 19 */ EN_JG_ANIM_MAX
} EnJgAnimation;
typedef enum {
- /* 0x0 */ EN_JG_ACTION_FIRST_THAW,
- /* 0x1 */ EN_JG_ACTION_SPAWNING,
- /* 0x2 */ EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW,
- /* 0x3 */ EN_JG_ACTION_LULLABY_INTRO_CS,
+ /* 0 */ EN_JG_ACTION_FIRST_THAW,
+ /* 1 */ EN_JG_ACTION_SPAWNING,
+ /* 2 */ EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW,
+ /* 3 */ EN_JG_ACTION_LULLABY_INTRO_CS
} EnJgAction;
ActorInit En_Jg_InitVars = {
@@ -194,7 +194,8 @@ void EnJg_UpdateCollision(EnJg* this, PlayState* play) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 30.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 30.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
}
s16 EnJg_GetWalkingYRotation(Path* path, s32 pointIndex, Vec3f* pos, f32* distSQ) {
@@ -214,7 +215,7 @@ s16 EnJg_GetWalkingYRotation(Path* path, s32 pointIndex, Vec3f* pos, f32* distSQ
*distSQ = SQ(diffX) + SQ(diffZ);
- return RADF_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
+ return RAD_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
}
s32 EnJg_ReachedPoint(EnJg* this, Path* path, s32 pointIndex) {
@@ -241,7 +242,7 @@ s32 EnJg_ReachedPoint(EnJg* this, Path* path, s32 pointIndex) {
diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RADF_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
@@ -250,32 +251,32 @@ s32 EnJg_ReachedPoint(EnJg* this, Path* path, s32 pointIndex) {
return reached;
}
-s16 EnJg_GetCutsceneForTeachingLullabyIntro(EnJg* this) {
+s16 EnJg_GetCsIdForTeachingLullabyIntro(EnJg* this) {
s16 temp = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
if (temp > 0) {
- return this->actor.cutscene;
+ return this->actor.csId;
}
- return ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ return CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
void EnJg_SetupGoronShrineCheer(EnJg* this) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
if (this->focusedShrineGoronParam == 10) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
this->actionFunc = EnJg_GoronShrineTalk;
} else {
- this->cutscene = 0x7C;
+ this->csId = CS_ID_GLOBAL_TALK;
}
} else {
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = EnJg_GoronShrineCheer;
switch (this->textId) {
@@ -373,7 +374,7 @@ void EnJg_GoronShrineTalk(EnJg* this, PlayState* play) {
}
void EnJg_GoronShrineCheer(EnJg* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
+ if (CutsceneManager_IsNext(this->csId)) {
switch (this->textId) {
case 0xDD0: // The greatest Goron hero of all?
case 0xDD2: // The immortal Goron?
@@ -382,26 +383,26 @@ void EnJg_GoronShrineCheer(EnJg* this, PlayState* play) {
case 0xDD6: // Darmani, greatest in the world!
// Focus on a specifc Goron for these lines
this->shrineGoron = EnJg_GetShrineGoronToFocusOn(play, this->focusedShrineGoronParam);
- ActorCutscene_Start(this->cutscene, this->shrineGoron);
+ CutsceneManager_Start(this->csId, this->shrineGoron);
Camera_SetTargetActor(play->cameraPtrs[CAM_ID_MAIN], this->shrineGoron);
break;
default:
// Focus on the whole group for these lines
- ActorCutscene_Start(this->cutscene, &this->actor);
+ CutsceneManager_Start(this->csId, &this->actor);
Camera_SetTargetActor(play->cameraPtrs[CAM_ID_MAIN], this->shrineGoron);
break;
}
this->actionFunc = EnJg_GoronShrineTalk;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
if (this->focusedShrineGoronParam == 10) {
this->actionFunc = EnJg_GoronShrineTalk;
} else {
- ActorCutscene_Stop(0x7C);
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -513,11 +514,11 @@ void EnJg_Talk(EnJg* this, PlayState* play) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->flags &= ~FLAG_LOOKING_AT_PLAYER;
- this->cutscene = EnJg_GetCutsceneForTeachingLullabyIntro(this);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ this->csId = EnJg_GetCsIdForTeachingLullabyIntro(this);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = EnJg_TeachLullabyIntro;
}
} else {
@@ -608,27 +609,27 @@ void EnJg_EndFrozenInteraction(EnJg* this, PlayState* play) {
}
void EnJg_TeachLullabyIntro(EnJg* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
this->actionFunc = EnJg_LullabyIntroCutsceneAction;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) {
s32 pad;
- if (Cutscene_CheckActorAction(play, 470)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 470);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_470)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_470);
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->cutsceneAnimIndex = EN_JG_ANIM_CUTSCENE_IDLE;
if (this->drum != NULL) {
@@ -687,7 +688,7 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) {
this->drum = Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, ACTOR_OBJ_JG_GAKKI, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, this->actor.shape.rot.x, this->actor.shape.rot.y, this->actor.shape.rot.z,
- this->actor.params, this->actor.cutscene, this->actor.halfDaysBits, NULL);
+ this->actor.params, this->actor.csId, this->actor.halfDaysBits, NULL);
}
if (this->cutsceneAnimIndex == EN_JG_ANIM_TAKING_OUT_DRUM) {
@@ -698,7 +699,7 @@ void EnJg_LullabyIntroCutsceneAction(EnJg* this, PlayState* play) {
}
}
} else {
- this->csAction = 99;
+ this->cueId = 99;
this->freezeTimer = 1000;
SET_WEEKEVENTREG(WEEKEVENTREG_24_40);
this->actionFunc = EnJg_Idle;
@@ -757,10 +758,10 @@ s32 EnJg_GetNextTextId(EnJg* this) {
case 0xDCF: // Spring has come thanks to you
this->focusedShrineGoronParam = 3;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = EnJg_GoronShrineCheer;
return 0xDD0; // The greatest Goron hero of all?
@@ -948,7 +949,7 @@ void EnJg_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
if (!EN_JG_IS_IN_GORON_SHRINE(thisx)) {
- if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 7) && (play->csCtx.currentCsIndex == 0)) {
+ if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 7) && (play->csCtx.scriptIndex == 0)) {
// This is the elder that appears in the cutscene for learning the full Goron Lullaby.
this->animIndex = EN_JG_ANIM_IDLE;
this->action = EN_JG_ACTION_LULLABY_INTRO_CS;
@@ -956,7 +957,7 @@ void EnJg_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnJg_LullabyIntroCutsceneAction;
} else {
// This is the elder that appears in Mountain Village or the Path to Goron Village in winter.
- this->path = SubS_GetPathByIndex(play, EN_JG_GET_PATH(thisx), 0x3F);
+ this->path = SubS_GetPathByIndex(play, EN_JG_GET_PATH_INDEX(thisx), EN_JG_PATH_INDEX_NONE);
this->animIndex = EN_JG_ANIM_SURPRISE_START;
this->action = EN_JG_ACTION_SPAWNING;
this->freezeTimer = 1000;
@@ -967,7 +968,7 @@ void EnJg_Init(Actor* thisx, PlayState* play) {
} else {
// This is the elder that appears in Goron Shrine in spring.
this->animIndex = EN_JG_ANIM_IDLE;
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnJg_GoronShrineIdle;
}
diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.h b/src/overlays/actors/ovl_En_Jg/z_en_jg.h
index 757a8bd86..b63f34dce 100644
--- a/src/overlays/actors/ovl_En_Jg/z_en_jg.h
+++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.h
@@ -5,7 +5,9 @@
#include "objects/object_jg/object_jg.h"
#define EN_JG_IS_IN_GORON_SHRINE(thisx) ((thisx)->params & 0x1)
-#define EN_JG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define EN_JG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+
+#define EN_JG_PATH_INDEX_NONE 0x3F
struct EnJg;
@@ -32,9 +34,9 @@ typedef struct EnJg {
/* 0x3A4 */ Vec3f breathPos;
/* 0x3B0 */ Vec3f breathVelocity;
/* 0x3BC */ Vec3f breathAccel;
- /* 0x3C8 */ s16 cutscene;
+ /* 0x3C8 */ s16 csId;
/* 0x3CA */ u8 cutsceneAnimIndex;
- /* 0x3CB */ u8 csAction;
+ /* 0x3CB */ u8 cueId;
/* 0x3CC */ u16 flags;
/* 0x3CE */ u16 textId;
/* 0x3D0 */ u8 focusedShrineGoronParam;
diff --git a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c
index 8b3ec5956..b023bf688 100644
--- a/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c
+++ b/src/overlays/actors/ovl_En_Jgame_Tsn/z_en_jgame_tsn.c
@@ -119,7 +119,7 @@ void func_80C13A2C(EnJgameTsn* this, PlayState* play) {
this->unk_1D8[i].points = Lib_SegmentedToVirtual(path->points);
this->unk_1D8[i].count = path->count;
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
if (path == NULL) {
Actor_Kill(&this->actor);
}
@@ -128,7 +128,7 @@ void func_80C13A2C(EnJgameTsn* this, PlayState* play) {
this->unk_1F8.points = Lib_SegmentedToVirtual(path->points);
this->unk_1F8.count = path->count;
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
if (path == NULL) {
Actor_Kill(&this->actor);
}
@@ -231,15 +231,15 @@ void func_80C13F88(EnJgameTsn* this) {
}
void func_80C13F9C(EnJgameTsn* this, PlayState* play) {
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
func_80C14030(this);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
} else {
func_80C14030(this);
@@ -268,8 +268,8 @@ void func_80C14044(EnJgameTsn* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
func_80C13B74(this);
}
@@ -284,7 +284,7 @@ void func_80C1410C(EnJgameTsn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
player->stateFlags1 |= PLAYER_STATE1_20;
- Audio_PlaySubBgm(0x25);
+ Audio_PlaySubBgm(NA_BGM_TIMED_MINI_GAME);
play->interfaceCtx.minigameState = MINIGAME_STATE_COUNTDOWN_SETUP_3;
Interface_InitMinigame(play);
SET_WEEKEVENTREG(WEEKEVENTREG_90_20);
@@ -409,7 +409,7 @@ void func_80C14610(EnJgameTsn* this, PlayState* play) {
void func_80C14684(EnJgameTsn* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- if (gSaveContext.save.playerData.rupees >= 20) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 20) {
Message_StartTextbox(play, 0x109E, &this->actor);
this->unk_300 = 0x109E;
Rupees_ChangeBy(-20);
@@ -468,8 +468,8 @@ void func_80C147B4(EnJgameTsn* this, PlayState* play) {
break;
case 0x109E:
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
Message_CloseTextbox(play);
func_80C1476C(this, play);
@@ -636,7 +636,7 @@ void EnJgameTsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C150A4[this->unk_21C]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C150A4[this->unk_21C]));
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 371757e44..350f4ae82 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -76,7 +76,7 @@ Vec3f D_8096AC30 = { 500.0f, -500.0f, 0.0f };
void EnJs_Init(Actor* thisx, PlayState* play) {
s32 pad;
- s16 cs;
+ s16 csId;
s32 i;
EnJs* this = THIS;
@@ -92,17 +92,17 @@ void EnJs_Init(Actor* thisx, PlayState* play) {
this->actor.terminalVelocity = -9.0f;
this->actor.gravity = -1.0f;
- cs = this->actor.cutscene;
+ csId = this->actor.csId;
- 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);
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
- this->cutsceneIndex = -1;
+ this->csIdIndex = -1;
switch (ENJS_GET_TYPE(&this->actor)) {
case 0:
@@ -194,7 +194,7 @@ s32 func_80968B8C(EnJs* this, PlayState* play) {
f32 sp18 = 0.0f;
Vec3s* points;
- if (pathIndex != 0x3F) {
+ if (pathIndex != ENJS_PATH_INDEX_NONE) {
this->path = &play->setupPathList[pathIndex];
if (this->path != NULL) {
path = this->path;
@@ -377,7 +377,7 @@ void EnJs_TakeMask(s32 itemActions, s32 childType) {
s32 temp = 0;
if ((childType >= 0) && (childType < 9)) {
- itemActions -= PLAYER_IA_MASK_TRUTH;
+ itemActions -= PLAYER_IA_MASK_MIN;
childType *= 3;
if (itemActions < 8) {
masksGivenOnMoon[childType] |= 1 << itemActions;
@@ -511,17 +511,17 @@ s32 func_809695FC(EnJs* this, PlayState* play) {
}
void func_80969688(EnJs* this) {
- if (this->cutsceneIndex != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->cutscenes[this->cutsceneIndex]) {
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIndex]);
+ if (this->csIdIndex != -1) {
+ if (CutsceneManager_GetCurrentCsId() == this->csIdList[this->csIdIndex]) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
- this->cutsceneIndex = -1;
+ this->csIdIndex = -1;
}
}
-void func_809696EC(EnJs* this, s16 arg1) {
+void func_809696EC(EnJs* this, s16 csIdIndex) {
func_80969688(this);
- this->cutsceneIndex = arg1;
+ this->csIdIndex = csIdIndex;
}
void func_8096971C(EnJs* this, PlayState* play) {
@@ -543,7 +543,7 @@ void func_80969748(EnJs* this, PlayState* play) {
}
if (itemAction > PLAYER_IA_NONE) {
Message_CloseTextbox(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction < PLAYER_IA_MASK_TRANSFORMATION_MIN)) {
EnJs_TakeMask(itemAction, ENJS_GET_TYPE(&this->actor));
Inventory_UnequipItem(itemAction - 4);
if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
@@ -551,7 +551,7 @@ void func_80969748(EnJs* this, PlayState* play) {
} else {
player->actor.textId = 0x2213;
}
- } else if ((itemAction >= PLAYER_IA_MASK_FIERCE_DEITY) && (itemAction <= PLAYER_IA_MASK_DEKU)) {
+ } else if ((itemAction >= PLAYER_IA_MASK_TRANSFORMATION_MIN) && (itemAction <= PLAYER_IA_MASK_MAX)) {
player->actor.textId = 0x2211;
} else {
player->actor.textId = 0x2210;
@@ -692,7 +692,7 @@ void func_80969C54(EnJs* this, PlayState* play) {
if (itemAction > PLAYER_IA_NONE) {
Message_CloseTextbox(play);
- if ((itemAction >= PLAYER_IA_MASK_TRUTH) && (itemAction <= PLAYER_IA_MASK_GIANT)) {
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction < PLAYER_IA_MASK_TRANSFORMATION_MIN)) {
EnJs_TakeMask(itemAction, ENJS_GET_TYPE(&this->actor));
Inventory_UnequipItem(itemAction - 4);
if (!func_809692A8(ENJS_GET_TYPE(&this->actor))) {
@@ -700,7 +700,7 @@ void func_80969C54(EnJs* this, PlayState* play) {
} else {
player->actor.textId = 0x2222;
}
- } else if ((itemAction >= PLAYER_IA_MASK_FIERCE_DEITY) && (itemAction <= PLAYER_IA_MASK_DEKU)) {
+ } else if ((itemAction >= PLAYER_IA_MASK_TRANSFORMATION_MIN) && (itemAction <= PLAYER_IA_MASK_MAX)) {
player->actor.textId = 0x2220;
} else {
player->actor.textId = 0x221D;
@@ -1015,18 +1015,18 @@ void EnJs_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
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);
+ if ((this->csIdIndex != -1) && (CutsceneManager_GetCurrentCsId() != this->csIdList[this->csIdIndex])) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
}
@@ -1058,7 +1058,7 @@ void func_8096A9F4(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
void EnJs_Draw(Actor* thisx, PlayState* play) {
EnJs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(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 4508e4944..f673a97d6 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.h
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.h
@@ -8,6 +8,8 @@
#define ENJS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
#define ENJS_GET_EXIT_INDEX(thisx) (((thisx)->params & 0x3F0) >> 4)
+#define ENJS_PATH_INDEX_NONE 0x3F
+
struct EnJs;
typedef void (*EnJsActionFunc)(struct EnJs*, PlayState*);
@@ -24,8 +26,8 @@ typedef struct EnJs {
/* 0x2B8 */ u16 unk_2B8;
/* 0x2BA */ s16 maskType;
/* 0x2BC */ s16 unk_2BC;
- /* 0x2BE */ s16 cutscenes[2];
- /* 0x2C2 */ s16 cutsceneIndex;
+ /* 0x2BE */ s16 csIdList[2];
+ /* 0x2C2 */ s16 csIdIndex;
/* 0x2C4 */ EnJsActionFunc actionFunc;
} EnJs; // size = 0x2C8
diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
index fca1afc51..d572c1331 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
@@ -298,7 +298,7 @@ void EnKaizoku_Init(Actor* thisx, PlayState* play) {
this->bodyCollider.dim.radius = 20;
this->bodyCollider.dim.height = 65;
this->bodyCollider.dim.yShift = 0;
- this->unk_2D6 = this->picto.actor.cutscene;
+ this->csId = this->picto.actor.csId;
this->picto.actor.world.pos.y = player->actor.world.pos.y + 160.0f;
this->picto.validationFunc = EnKaizoku_ValidatePictograph;
this->picto.actor.flags |= ACTOR_FLAG_400;
@@ -321,15 +321,15 @@ s32 func_80B85858(EnKaizoku* this, PlayState* play) {
for (itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first; itemAction != NULL;
itemAction = itemAction->next) {
- //! FAKE:
- if (1) {}
- if (((itemAction->id == ACTOR_ARMS_HOOK) || (itemAction->id == ACTOR_EN_ARROW)) && (player->unk_D57)) {
- if (((itemAction->id != ACTOR_ARMS_HOOK) || (this->action != KAIZOKU_ACTION_13)) &&
- (this->action != KAIZOKU_ACTION_6)) {
- func_80B87C7C(this);
- }
- break;
+ if (((itemAction->id != ACTOR_ARMS_HOOK) && (itemAction->id != ACTOR_EN_ARROW)) || (player->unk_D57 == 0)) {
+ continue;
}
+
+ if (((itemAction->id != ACTOR_ARMS_HOOK) || (this->action != KAIZOKU_ACTION_13)) &&
+ (this->action != KAIZOKU_ACTION_6)) {
+ func_80B87C7C(this);
+ }
+ break;
}
if (prevAction != this->action) {
@@ -423,8 +423,8 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) {
func_80B87900(this);
} else {
sp2A = player->actor.shape.rot.y - this->picto.actor.shape.rot.y;
- if (this->picto.actor.xzDistToPlayer <= 65.0f && !Actor_OtherIsTargeted(play, &this->picto.actor) &&
- ABS_ALT(sp2A) < 0x5000) {
+ if ((this->picto.actor.xzDistToPlayer <= 65.0f) && !Actor_OtherIsTargeted(play, &this->picto.actor) &&
+ (ABS_ALT(sp2A) < 0x5000)) {
if (this->action != KAIZOKU_ACTION_9) {
func_80B87F70(this);
return 1;
@@ -474,14 +474,14 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
break;
}
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->picto.actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
func_800B7298(play, &this->picto.actor, 0x15);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
sp54 = (this->unk_2CA * 4) + this->unk_2C8;
@@ -508,7 +508,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
this->unk_598 = 0;
Audio_SetMainBgmVolume(0, 0xA);
this->unk_59C++;
-
+ // fallthrough
case 1:
player->actor.shape.rot.y = player->actor.world.rot.y =
Math_Vec3f_Yaw(&player->actor.world.pos, &this->picto.actor.world.pos);
@@ -609,9 +609,9 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
case 7:
if (this->unk_598 == 0) {
func_800B7298(play, &this->picto.actor, 6);
- ActorCutscene_Stop(this->unk_2D6);
+ CutsceneManager_Stop(this->csId);
this->unk_59C = 0;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags &= ~ACTOR_FLAG_100000;
this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
this->picto.actor.flags |= ACTOR_FLAG_1;
@@ -657,7 +657,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
Math_Vec3f_Copy(&this->subCamAt, &this->unk_5D4);
}
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
Play_SetCameraAtEyeUp(play, this->subCamId, &this->subCamAt, &this->subCamEye, &this->subCamUp);
@@ -665,16 +665,16 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
}
void func_80B86804(EnKaizoku* this, PlayState* play) {
- if (this->subCamId == 0) {
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (this->subCamId == SUB_CAM_ID_DONE) {
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->picto.actor);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
}
func_800B7298(play, &this->picto.actor, 0x60);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->unk_2B2 = 30;
this->picto.actor.flags &= ~ACTOR_FLAG_1;
this->unk_598 = 0;
@@ -724,8 +724,8 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
Message_CloseTextbox(play);
func_800B7298(play, &this->picto.actor, 6);
- ActorCutscene_Stop(this->unk_2D6);
- this->subCamId = 0;
+ CutsceneManager_Stop(this->csId);
+ this->subCamId = SUB_CAM_ID_DONE;
play->nextEntrance = play->setupExitList[this->exitIndex];
gSaveContext.nextCutsceneIndex = 0;
Scene_SetExitFade(play);
@@ -733,11 +733,13 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
this->unk_59C++;
this->action = KAIZOKU_ACTION_16;
}
+ break;
+ default:
break;
}
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
@@ -861,9 +863,9 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
play->envCtx.screenFillColor[3] = 0;
play->envCtx.fillScreen = false;
this->unk_59C = 0;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
func_800B7298(play, &this->picto.actor, 6);
- ActorCutscene_Stop(this->unk_2D6);
+ CutsceneManager_Stop(this->csId);
if (this->switchFlag >= 0) {
Flags_SetSwitch(play, this->switchFlag);
}
@@ -871,6 +873,9 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Math_ApproachF(&this->subCamEye.x, this->unk_5C8.x, 0.5f, this->unk_5E0);
Math_ApproachF(&this->subCamEye.y, this->unk_5C8.y, 0.5f, this->unk_5E0);
@@ -880,7 +885,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
Math_ApproachF(&this->subCamAt.z, this->unk_5D4.z, 0.5f, this->unk_5E0);
Math_ApproachF(&this->unk_5E0, 10.0f, 0.5f, 100.0f);
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.z = 0.0f;
this->subCamUp.y = 1.0f;
@@ -902,7 +907,8 @@ void func_80B872F4(EnKaizoku* this, PlayState* play) {
if ((this->lookTimer == 0) && !func_80B85858(this, play) && !func_80B85A00(this, play, false)) {
s16 yawDiff = this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y;
- if ((this->picto.actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != 0) && (yawDiff >= 0x1F40)) {
+ if ((this->picto.actor.xzDistToPlayer < 100.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (yawDiff >= 0x1F40)) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
func_80B88CD8(this);
} else if (Actor_IsFacingPlayer(&this->picto.actor, 0xBB8)) {
@@ -989,7 +995,8 @@ void func_80B8760C(EnKaizoku* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
temp_ft0 = this->skelAnime.curFrame - this->skelAnime.playSpeed;
temp_ft1 = this->skelAnime.curFrame + this->skelAnime.playSpeed;
- if (this->skelAnime.curFrame != 0.0f && ((temp_ft0 < 0 && temp_ft1 > 0) || (temp_ft0 < 5 && temp_ft1 >= 6))) {
+ if ((this->skelAnime.curFrame != 0.0f) &&
+ (((temp_ft0 < 0) && (temp_ft1 > 0)) || ((temp_ft0 < 5) && (temp_ft1 >= 6)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
@@ -1006,12 +1013,10 @@ void func_80B8760C(EnKaizoku* this, PlayState* play) {
func_80B87E28(this);
}
}
+ } else if (this->picto.actor.speed >= 0.0f) {
+ this->picto.actor.shape.rot.y += 0x4000;
} else {
- if (this->picto.actor.speed >= 0.0f) {
- this->picto.actor.shape.rot.y += 0x4000;
- } else {
- this->picto.actor.shape.rot.y -= 0x4000;
- }
+ this->picto.actor.shape.rot.y -= 0x4000;
}
}
@@ -1041,8 +1046,8 @@ void func_80B8798C(EnKaizoku* this, PlayState* play) {
if (this->lookTimer == 0) {
this->unk_2D8 = 0;
temp_v0 = this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y;
- if (ABS_ALT(temp_v0) <= 0x4000 && this->picto.actor.xzDistToPlayer < 40.0f &&
- fabsf(this->picto.actor.playerHeightRel) < 50.0f) {
+ if ((ABS_ALT(temp_v0) <= 0x4000) && (this->picto.actor.xzDistToPlayer < 40.0f) &&
+ (fabsf(this->picto.actor.playerHeightRel) < 50.0f)) {
if (func_800BE184(play, &this->picto.actor, 100.0f, 10000, 0x4000, this->picto.actor.shape.rot.y)) {
if (player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_START) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
@@ -1067,7 +1072,7 @@ void func_80B8798C(EnKaizoku* this, PlayState* play) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
func_80B88CD8(this);
}
- } else if (this->unk_2B2 == 0 &&
+ } else if ((this->unk_2B2 == 0) &&
func_800BE184(play, &this->picto.actor, 100.0f, 10000, 0x4000, this->picto.actor.shape.rot.y)) {
if (player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_START) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
@@ -1285,7 +1290,8 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
sp2A = ABS_ALT(player->actor.shape.rot.y - this->picto.actor.shape.rot.y);
- if (this->picto.actor.xzDistToPlayer < 150.0f && player->meleeWeaponState != 0 && sp2A >= 0x2000) {
+ if ((this->picto.actor.xzDistToPlayer < 150.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (sp2A >= 0x2000)) {
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer;
if (Rand_ZeroOne() > 0.7f) {
func_80B88CD8(this);
@@ -1312,7 +1318,7 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
}
if (!func_80B85A00(this, play, false)) {
- if (this->picto.actor.xzDistToPlayer < 210.0f && this->picto.actor.xzDistToPlayer > 150.0f &&
+ if ((this->picto.actor.xzDistToPlayer < 210.0f) && (this->picto.actor.xzDistToPlayer > 150.0f) &&
Actor_IsFacingPlayer(&this->picto.actor, 0x1388)) {
if (Actor_IsTargeted(play, &this->picto.actor)) {
if (Rand_ZeroOne() > 0.5f) {
@@ -1330,7 +1336,7 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
- if ((this->skelAnime.curFrame != 0.0f) && ((sp30 < 0 && sp2C > 0) || (sp30 < 4 && sp2C >= 5))) {
+ if ((this->skelAnime.curFrame != 0.0f) && (((sp30 < 0) && (sp2C > 0)) || ((sp30 < 4) && (sp2C >= 5)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
@@ -1412,7 +1418,7 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
}
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame && this->unk_2D0 < 2) {
+ if ((this->frameCount <= curFrame) && (this->unk_2D0 < 2)) {
if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) {
func_80B872A4(this);
this->unk_2B2 = Rand_ZeroOne() * 5.0f + 5.0f;
@@ -1455,7 +1461,7 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
void func_80B88CD8(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_3);
- this->picto.actor.speed = randPlusMinusPoint5Scaled(12.0f);
+ this->picto.actor.speed = Rand_CenteredFloat(12.0f);
this->skelAnime.playSpeed = 1.0f;
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
this->unk_2B2 = Rand_ZeroOne() * 30.0f + 30.0f;
@@ -1529,7 +1535,7 @@ void func_80B88D6C(EnKaizoku* this, PlayState* play) {
temp_ft4 = this->skelAnime.curFrame - this->skelAnime.playSpeed;
temp_ft5 = this->skelAnime.curFrame + this->skelAnime.playSpeed;
if (this->skelAnime.curFrame != 0.0f) {
- if (((temp_ft4 < 0 && temp_ft5 > 0) || (temp_ft4 < 5 && temp_ft5 > 5))) {
+ if ((((temp_ft4 < 0) && (temp_ft5 > 0)) || ((temp_ft4 < 5) && (temp_ft5 > 5)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
@@ -1582,7 +1588,7 @@ void func_80B891B8(EnKaizoku* this) {
// EnKaizoku_Stunned
void func_80B89280(EnKaizoku* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) {
- if (this->unk_2B8 != 0 && this->unk_2B8 < 60) {
+ if ((this->unk_2B8 != 0) && (this->unk_2B8 < 60)) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
}
}
@@ -1602,8 +1608,8 @@ void func_80B89280(EnKaizoku* this, PlayState* play) {
this->unk_2D8 = 0;
func_80B85A00(this, play, true);
- if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX ||
- this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
+ (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) {
Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2,
0.7f, 0.4f);
this->unk_2B8 = 0;
@@ -1653,7 +1659,7 @@ void func_80B894C0(EnKaizoku* this, PlayState* play) {
}
}
- if (this->picto.actor.xzDistToPlayer <= 65.0f && ((play->gameplayFrames % 8) != 0)) {
+ if ((this->picto.actor.xzDistToPlayer <= 65.0f) && ((play->gameplayFrames % 8) != 0)) {
this->swordCollider.info.elemType = ELEMTYPE_UNK2;
func_80B87F70(this);
} else {
@@ -1715,13 +1721,13 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
if (curFrame >= 25.0f) {
player = GET_PLAYER(play);
- if (this->subCamId == 0) {
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (this->subCamId == SUB_CAM_ID_DONE) {
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
}
Math_Vec3f_Copy(&this->unk_3C4, &gZeroVec3f);
@@ -1741,7 +1747,7 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
player->actor.shape.rot.y = player->actor.world.rot.y =
Math_Vec3f_Yaw(&player->actor.world.pos, &this->picto.actor.world.pos);
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
@@ -1764,42 +1770,42 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
Vec3f sp58;
s32 i;
- if (gSaveContext.save.playerData.health <= 0x10) {
+ if (gSaveContext.save.saveInfo.playerData.health <= 0x10) {
this->swordCollider.info.toucher.damage = 0;
} else {
this->swordCollider.info.toucher.damage = 4;
}
if (!(this->swordCollider.base.atFlags & AT_BOUNCED) && (this->swordCollider.base.atFlags & AT_HIT)) {
- if ((gSaveContext.save.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
+ if ((gSaveContext.save.saveInfo.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
this->unk_2D0 = 2;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags |= ACTOR_FLAG_100000;
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
this->actionFunc = func_80B86804;
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->actionFunc = func_80B86804;
}
return;
} else if ((this->action == KAIZOKU_ACTION_11) && (this->swordCollider.base.at == &GET_PLAYER(play)->actor)) {
func_800B8D98(play, &this->picto.actor, 3.0f, this->picto.actor.yawTowardsPlayer, 1.0f);
Health_ChangeBy(play, -0xC);
- if ((gSaveContext.save.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
+ if ((gSaveContext.save.saveInfo.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
Health_ChangeBy(play, 0x10);
this->unk_2D0 = 2;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags |= ACTOR_FLAG_100000;
- if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
- ActorCutscene_SetIntentToPlay(this->unk_2D6);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
this->actionFunc = func_80B86804;
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->actionFunc = func_80B86804;
}
return;
@@ -1831,7 +1837,7 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
this->unk_2B8 = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
}
- /* fallthrough */
+ // fallthrough
case KAIZOKU_DMGEFF_1:
if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) &&
(this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) ||
@@ -1906,6 +1912,9 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
sp64 = 1;
}
break;
+
+ default:
+ break;
}
if (sp64) {
@@ -1938,8 +1947,8 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
pos.z = this->bodyCollider.info.bumper.hitPos.z;
if (player->transformation != PLAYER_FORM_HUMAN) {
- player->unk_B84 = this->picto.actor.yawTowardsPlayer;
- player->unk_B80 = 15.0f;
+ player->pushedYaw = this->picto.actor.yawTowardsPlayer;
+ player->pushedSpeed = 15.0f;
}
this->bodyCollider.base.acFlags &= ~AC_HIT;
@@ -2028,7 +2037,9 @@ void EnKaizoku_Update(Actor* thisx, PlayState* play2) {
Math_ApproachZeroF(&this->unk_2F0, 1.0f, 5.0f);
}
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 35.0f, 40.0f, 35.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 35.0f, 40.0f, 35.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->picto.actor, &this->bodyCollider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->bodyCollider.base);
if ((this->unk_2D0 < 2) && (this->action != KAIZOKU_ACTION_0)) {
@@ -2100,11 +2111,11 @@ void EnKaizoku_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVec3f(&sFootOffset, &this->rightFootPos);
}
- if (limbIndex == KAIZOKU_LIMB_02 || limbIndex == KAIZOKU_LIMB_06 || limbIndex == KAIZOKU_LIMB_07 ||
- limbIndex == KAIZOKU_LIMB_08 || limbIndex == KAIZOKU_LIMB_0A || limbIndex == KAIZOKU_LIMB_0C ||
- limbIndex == KAIZOKU_LIMB_0D || limbIndex == KAIZOKU_LIMB_0F || limbIndex == KAIZOKU_LIMB_11 ||
- limbIndex == KAIZOKU_LIMB_12 || limbIndex == KAIZOKU_LIMB_L_FOOT || limbIndex == KAIZOKU_LIMB_14 ||
- limbIndex == KAIZOKU_LIMB_15 || limbIndex == KAIZOKU_LIMB_R_FOOT || limbIndex == KAIZOKU_LIMB_17) {
+ if ((limbIndex == KAIZOKU_LIMB_02) || (limbIndex == KAIZOKU_LIMB_06) || (limbIndex == KAIZOKU_LIMB_07) ||
+ (limbIndex == KAIZOKU_LIMB_08) || (limbIndex == KAIZOKU_LIMB_0A) || (limbIndex == KAIZOKU_LIMB_0C) ||
+ (limbIndex == KAIZOKU_LIMB_0D) || (limbIndex == KAIZOKU_LIMB_0F) || (limbIndex == KAIZOKU_LIMB_11) ||
+ (limbIndex == KAIZOKU_LIMB_12) || (limbIndex == KAIZOKU_LIMB_L_FOOT) || (limbIndex == KAIZOKU_LIMB_14) ||
+ (limbIndex == KAIZOKU_LIMB_15) || (limbIndex == KAIZOKU_LIMB_R_FOOT) || (limbIndex == KAIZOKU_LIMB_17)) {
Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
this->bodyPartsPosIndex++;
@@ -2130,8 +2141,8 @@ void EnKaizoku_Draw(Actor* thisx, PlayState* play) {
f32 drawDmgEffAlpha;
EnKaizoku* this = THIS;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h
index ad161088e..6366c4f7f 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.h
@@ -58,7 +58,7 @@ typedef struct EnKaizoku {
/* 0x2D0 */ s16 unk_2D0;
/* 0x2D2 */ s16 swordState;
/* 0x2D4 */ s16 exitIndex;
- /* 0x2D6 */ s16 unk_2D6;
+ /* 0x2D6 */ s16 csId;
/* 0x2D8 */ u8 unk_2D8;
/* 0x2D9 */ u8 unk_2D9;
/* 0x2DC */ f32 frameCount;
diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
index d35e767c0..fc8d3d201 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -113,15 +113,15 @@ Vec3f D_80972030 = { -3.0f, 50.0f, 90.0f };
Vec3f D_8097203C = { 10.0f, -15.0f, 2.0f };
typedef enum {
- /* 0x0 */ ENKAKASI_ANIM_ARMS_CROSSED_ROCKING, // arms crossed and rocking back and forth
- /* 0x1 */ ENKAKASI_ANIM_SIDEWAYS_SHAKING,
- /* 0x2 */ ENKAKASI_ANIM_HOPPING_REGULAR, // bounce bounce bounce (repeat)
- /* 0x3 */ ENKAKASI_ANIM_SPIN_REACH_OFFER, // spin and then reaching toward player
- /* 0x4 */ ENKAKASI_ANIM_TWIRL, // slower cinimatic twirl
- /* 0x5 */ ENKAKASI_ANIM_ARMS_CROSSED_STILL, // arms crossed but still, also some noise sfx
- /* 0x6 */ ENKAKASI_ANIM_WAVE, // "wave" short sideways shake, stops early, partial? unused?
- /* 0x7 */ ENKAKASI_ANIM_SLOWROLL, // partial bounch, ends looking left, OFFER anim takes over
- /* 0x8 */ ENKAKASI_ANIM_IDLE, // slow stretching wiggle, ends in regular position
+ /* 0 */ ENKAKASI_ANIM_ARMS_CROSSED_ROCKING, // arms crossed and rocking back and forth
+ /* 1 */ ENKAKASI_ANIM_SIDEWAYS_SHAKING,
+ /* 2 */ ENKAKASI_ANIM_HOPPING_REGULAR, // bounce bounce bounce (repeat)
+ /* 3 */ ENKAKASI_ANIM_SPIN_REACH_OFFER, // spin and then reaching toward player
+ /* 4 */ ENKAKASI_ANIM_TWIRL, // slower cinimatic twirl
+ /* 5 */ ENKAKASI_ANIM_ARMS_CROSSED_STILL, // arms crossed but still, also some noise sfx
+ /* 6 */ ENKAKASI_ANIM_WAVE, // "wave" short sideways shake, stops early, partial? unused?
+ /* 7 */ ENKAKASI_ANIM_SLOWROLL, // partial bounch, ends looking left, OFFER anim takes over
+ /* 8 */ ENKAKASI_ANIM_IDLE // slow stretching wiggle, ends in regular position
} EnKakasiAnimation;
static AnimationHeader* sAnimations[] = {
@@ -143,7 +143,7 @@ void EnKakasi_Destroy(Actor* thisx, PlayState* play) {
void EnKakasi_Init(Actor* thisx, PlayState* play) {
EnKakasi* this = THIS;
- s32 tempCutscene;
+ s32 csId;
s32 i;
Collider_InitAndSetCylinder(play, &this->collider, &this->picto.actor, &D_80971D80);
@@ -157,7 +157,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
this->unkHeight = (this->picto.actor.world.rot.z * 20.0f) + 60.0f;
this->picto.actor.world.rot.z = 0;
this->picto.actor.targetMode = 0;
- if (this->picto.actor.world.rot.x > 0 && this->picto.actor.world.rot.x < 8) {
+ if ((this->picto.actor.world.rot.x > 0) && (this->picto.actor.world.rot.x < 8)) {
this->picto.actor.targetMode = KAKASI_GET_TARGETMODE(thisx);
}
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y;
@@ -169,10 +169,10 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->picto.actor, 0.01f);
i = 0;
- tempCutscene = this->picto.actor.cutscene;
- while (tempCutscene != -1) {
+ csId = this->picto.actor.csId;
+ while (csId != CS_ID_NONE) {
//! FAKE:
- tempCutscene = ActorCutscene_GetAdditionalCutscene(this->actorCutscenes[i] = tempCutscene);
+ csId = CutsceneManager_GetAdditionalCsId(this->csIdList[i] = csId);
i++;
}
@@ -208,12 +208,12 @@ s32 EnKakasi_ValidatePictograph(PlayState* play, Actor* thisx) {
}
void EnKakasi_CheckAnimationSfx(EnKakasi* this) {
- if (this->animIndex == ENKAKASI_ANIM_SIDEWAYS_SHAKING || this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_STILL) {
+ if ((this->animIndex == ENKAKASI_ANIM_SIDEWAYS_SHAKING) || (this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_STILL)) {
if (Animation_OnFrame(&this->skelanime, 1.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
}
}
- if (this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR || this->animIndex == ENKAKASI_ANIM_SLOWROLL) {
+ if ((this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR) || (this->animIndex == ENKAKASI_ANIM_SLOWROLL)) {
if (Animation_OnFrame(&this->skelanime, 4.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
}
@@ -225,7 +225,7 @@ void EnKakasi_CheckAnimationSfx(EnKakasi* this) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_ROLL);
}
}
- if (this->animIndex == ENKAKASI_ANIM_SPIN_REACH_OFFER || this->animIndex == ENKAKASI_ANIM_TWIRL) {
+ if ((this->animIndex == ENKAKASI_ANIM_SPIN_REACH_OFFER) || (this->animIndex == ENKAKASI_ANIM_TWIRL)) {
if (Animation_OnFrame(&this->skelanime, 1.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASH_LONGI_ROLL);
}
@@ -274,12 +274,12 @@ void func_8096FAAC(EnKakasi* this, PlayState* play) {
* goes off every frame of song teach, but... doing what?
*/
void func_8096FBB8(EnKakasi* this, PlayState* play) {
- if (play->msgCtx.unk12048 == 0 || play->msgCtx.unk12048 == 1 || play->msgCtx.unk12048 == 2 ||
- play->msgCtx.unk12048 == 3 || play->msgCtx.unk12048 == 4) {
+ if ((play->msgCtx.unk12048 == 0) || (play->msgCtx.unk12048 == 1) || (play->msgCtx.unk12048 == 2) ||
+ (play->msgCtx.unk12048 == 3) || (play->msgCtx.unk12048 == 4)) {
// why not 0 < x < 4? fewer branches
this->unk190++;
}
- if (this->unk190 != 0 && this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
+ if ((this->unk190 != 0) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
if (this->unk190 > 8) {
@@ -299,8 +299,8 @@ void EnKakasi_InitTimeSkipDialogue(EnKakasi* this) {
void EnKakasi_TimeSkipDialogue(EnKakasi* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (gSaveContext.respawnFlag != -4 && gSaveContext.respawnFlag != -8) {
- if (gSaveContext.save.time != CLOCK_TIME(6, 0) && gSaveContext.save.time != CLOCK_TIME(18, 0) &&
+ if ((gSaveContext.respawnFlag != -4) && (gSaveContext.respawnFlag != -8)) {
+ if ((gSaveContext.save.time != CLOCK_TIME(6, 0)) && (gSaveContext.save.time != CLOCK_TIME(18, 0)) &&
!CHECK_EVENTINF(EVENTINF_17)) {
if (this->picto.actor.textId == 0) {
@@ -348,8 +348,8 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
}
if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
Actor_GetScreenPos(play, &this->picto.actor, &x, &y);
- if (this->picto.actor.projectedPos.z > -20.0f && x > 0 && x < SCREEN_WIDTH && y > 0 && y < SCREEN_HEIGHT &&
- this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
+ if ((this->picto.actor.projectedPos.z > -20.0f) && (x > 0) && (x < SCREEN_WIDTH) && (y > 0) &&
+ (y < SCREEN_HEIGHT) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) {
// faster shaking
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
this->skelanime.playSpeed = 2.0f;
@@ -359,7 +359,7 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
this->skelanime.playSpeed = 2.0f;
}
- } else if (saveContextDay == 3 && gSaveContext.save.isNight) {
+ } else if ((saveContextDay == 3) && gSaveContext.save.isNight) {
this->skelanime.playSpeed = 1.0f;
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
EnKakasi_ChangeAnim(this, 1);
@@ -391,16 +391,16 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 5, 2000, 0);
// if first dialogue
- if (this->picto.actor.textId != 0x1644 && this->animeFrameCount <= currentAnimeFrame &&
- this->animIndex == ENKAKASI_ANIM_SLOWROLL) {
+ if ((this->picto.actor.textId != 0x1644) && (this->animeFrameCount <= currentAnimeFrame) &&
+ (this->animIndex == ENKAKASI_ANIM_SLOWROLL)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
this->unkCounter1A4 = 0;
}
// if dialogue: oh sorry come back again
- if (this->picto.actor.textId == 0x1651 || this->picto.actor.textId == 0x1659) {
- if (this->animeFrameCount <= currentAnimeFrame && this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER) {
+ if ((this->picto.actor.textId == 0x1651) || (this->picto.actor.textId == 0x1659)) {
+ if ((this->animeFrameCount <= currentAnimeFrame) && (this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER)) {
if (++this->unkCounter1A4 >= 2) {
this->unkCounter1A4 = 0;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
@@ -408,7 +408,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
}
}
- if (this->unkState1A8 == 2 && this->unkState196 == 2) {
+ if ((this->unkState1A8 == 2) && (this->unkState196 == 2)) {
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_73);
this->unkState1A8 = 0;
}
@@ -417,8 +417,8 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Message_CloseTextbox(play);
if (this->talkState == TEXT_STATE_5) {
// bad song input
- if (this->unkState196 == 2 && this->picto.actor.textId == 0x1647) {
- func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_6);
+ if ((this->unkState196 == 2) && (this->picto.actor.textId == 0x1647)) {
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
}
// after timeskip
@@ -429,7 +429,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
- if (saveContextDay2 == 3 && gSaveContext.save.isNight) {
+ if ((saveContextDay2 == 3) && gSaveContext.save.isNight) {
// text: dangerous outside
this->picto.actor.textId = 0x164F;
} else if (gSaveContext.save.isNight) {
@@ -443,26 +443,26 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Message_ContinueTextbox(play, this->picto.actor.textId);
return;
- } else if (this->picto.actor.textId == 0x165D || this->picto.actor.textId == 0x165F ||
- this->picto.actor.textId == 0x1660 || this->picto.actor.textId == 0x1652) {
+ } else if ((this->picto.actor.textId == 0x165D) || (this->picto.actor.textId == 0x165F) ||
+ (this->picto.actor.textId == 0x1660) || (this->picto.actor.textId == 0x1652)) {
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_4);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
this->actionFunc = EnKakasi_DancingRemark;
} else {
- if (!ActorCutscene_GetCanPlayNext(this->actorCutscenes[0])) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
this->actionFunc = EnKakasi_DancingRemark;
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[0], &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
this->actionFunc = EnKakasi_DancingRemark;
}
}
return;
- } else if (this->picto.actor.textId == 0x1645 || this->picto.actor.textId == 0x164E) {
+ } else if ((this->picto.actor.textId == 0x1645) || (this->picto.actor.textId == 0x164E)) {
this->picto.actor.textId = 0x1650; // "Shall we dance? No Yes"
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
@@ -517,7 +517,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
this->picto.actor.textId = 0x1658;
} else if (this->picto.actor.textId == 0x165C) {
this->picto.actor.textId = 0x165E;
- } else if (saveContextDay == 3 && gSaveContext.save.isNight) {
+ } else if ((saveContextDay == 3) && gSaveContext.save.isNight) {
this->picto.actor.textId = 0x164F;
} else {
this->picto.actor.textId = 0x1652;
@@ -561,19 +561,19 @@ void EnKakasi_OcarinaRemark(EnKakasi* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
func_80152434(play, 0x35);
this->unkState1A8 = 0;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
this->actionFunc = EnKakasi_TeachingSong;
- } else if (ActorCutscene_GetCanPlayNext(this->actorCutscenes[0]) == 0) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ } else if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
this->actionFunc = EnKakasi_TeachingSong;
} else {
this->unkState1A8 = 1;
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[0], &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
Math_Vec3f_Copy(&this->unk22C, &this->picto.actor.home.pos);
this->actionFunc = EnKakasi_TeachingSong;
}
@@ -586,17 +586,17 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
EnKakasi_CheckPlayerPosition(this, play);
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.home.rot.y, 1, 3000, 0);
if (this->unkState1A8 == 0) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
return;
}
- if (ActorCutscene_GetCanPlayNext(this->actorCutscenes[0]) == 0) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
return;
}
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[0], &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
Math_Vec3f_Copy(&this->unk22C, &this->picto.actor.home.pos);
this->unkState1A8 = 1;
this->unkState1A8 = 1;
@@ -609,7 +609,7 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.z = D_80971DCC[this->unk190].z;
Math_Vec3f_Copy(&tempVec, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &tempVec, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &tempVec, &this->subCamEyeNext, OLIB_ADD_OFFSET);
Math_Vec3f_Copy(&this->subCamAtNext, &this->unk22C);
Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext);
Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext);
@@ -619,7 +619,7 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
if (play->msgCtx.ocarinaMode == 4) { // song failed
this->unk190 = 0;
this->unkCounter1A4 = 0;
- ActorCutscene_Stop(this->actorCutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_YASE_DEAD);
if (this) {}
this->unkState196 = 2;
@@ -642,17 +642,18 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
void EnKakasi_PostSongLearnTwirl(EnKakasi* this, PlayState* play) {
f32 animeFrame = this->skelanime.curFrame;
- if (this->postTeachTimer == 0 && this->animIndex != ENKAKASI_ANIM_TWIRL) {
+ if ((this->postTeachTimer == 0) && (this->animIndex != ENKAKASI_ANIM_TWIRL)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_TWIRL);
this->skelanime.playSpeed = 2.0f;
}
- if (this->postTeachTimer == 0 && this->animIndex == ENKAKASI_ANIM_TWIRL && this->animeFrameCount <= animeFrame) {
+ if ((this->postTeachTimer == 0) && (this->animIndex == ENKAKASI_ANIM_TWIRL) &&
+ (this->animeFrameCount <= animeFrame)) {
EnKakasi_SetupPostSongLearnDialogue(this, play);
}
}
void EnKakasi_SetupPostSongLearnDialogue(EnKakasi* this, PlayState* play) {
- ActorCutscene_Stop(this->actorCutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
play->msgCtx.ocarinaMode = 4;
this->unk190 = 0;
this->unkCounter1A4 = 0;
@@ -682,16 +683,16 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
this->unk190 = 1;
}
- if (this->picto.actor.textId == 0x1648 && this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR &&
- this->animeFrameCount <= tempAnimFrame) {
+ if ((this->picto.actor.textId == 0x1648) && (this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR) &&
+ (this->animeFrameCount <= tempAnimFrame)) {
this->unkCounter1A4++;
if (this->unkCounter1A4 >= 2) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING);
}
}
- if (this->picto.actor.textId == 0x164B && this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_ROCKING &&
- this->animeFrameCount <= tempAnimFrame) {
+ if ((this->picto.actor.textId == 0x164B) && (this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_ROCKING) &&
+ (this->animeFrameCount <= tempAnimFrame)) {
this->unkCounter1A4++;
if (this->unkCounter1A4 >= 2) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
@@ -699,18 +700,18 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
}
if (this->unkState1A8 == 0) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
return;
}
- if (ActorCutscene_GetCanPlayNext(this->actorCutscenes[0]) == 0) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
return;
}
Math_Vec3f_Copy(&this->unk22C, &this->picto.actor.home.pos);
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[0], &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_86);
this->unkState1A8 = 1;
}
@@ -722,7 +723,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.y = D_80971FA0[this->unk190].y;
this->subCamEyeNext.z = D_80971FA0[this->unk190].z;
Math_Vec3f_Copy(&vec3fCopy, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &vec3fCopy, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &vec3fCopy, &this->subCamEyeNext, OLIB_ADD_OFFSET);
this->subCamAtNext.x = D_80971FE8[this->unk190].x + this->unk22C.x;
this->subCamAtNext.y = D_80971FE8[this->unk190].y + this->unk22C.y;
this->subCamAtNext.z = D_80971FE8[this->unk190].z + this->unk22C.z;
@@ -744,7 +745,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
}
if (this->picto.actor.textId == 0x1648) {
- func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_WAIT);
this->picto.actor.textId = 0x1649;
if (this->animIndex != ENKAKASI_ANIM_ARMS_CROSSED_ROCKING) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING);
@@ -762,7 +763,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_TWIRL);
} else {
- if (this->picto.actor.textId == 0x164C || this->picto.actor.textId == 0x1661) {
+ if ((this->picto.actor.textId == 0x164C) || (this->picto.actor.textId == 0x1661)) {
EnKakasi_SetupDigAway(this);
return;
}
@@ -789,15 +790,15 @@ void EnKakasi_DancingRemark(EnKakasi* this, PlayState* play) {
u32 currentDay = gSaveContext.save.day;
this->unkState196 = 3;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
- } else if (ActorCutscene_GetCanPlayNext(this->actorCutscenes[0]) == 0) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[0]);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[0]);
+ } else if (!CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Queue(this->csIdList[0]);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[0], &this->picto.actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->picto.actor.cutscene);
- if (currentDay == 3 && gSaveContext.save.isNight) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
+ if ((currentDay == 3) && gSaveContext.save.isNight) {
EnKakasi_SetupDigAway(this);
} else {
Audio_PlaySubBgm(NA_BGM_SARIAS_SONG);
@@ -831,17 +832,16 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.y = D_80971E38[this->unk190].y;
this->subCamEyeNext.z = D_80971E38[this->unk190].z;
Math_Vec3f_Copy(&localVec3f, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &localVec3f, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &localVec3f, &this->subCamEyeNext, OLIB_ADD_OFFSET);
- if (1) {}
this->subCamAtNext.x = D_80971EEC[this->unk190].x + this->unk22C.x;
this->subCamAtNext.y = D_80971EEC[this->unk190].y + this->unk22C.y;
this->subCamAtNext.z = D_80971EEC[this->unk190].z + this->unk22C.z;
- if (this->unk190 != 6 && this->unk190 != 7) {
+ if ((this->unk190 != 6) && (this->unk190 != 7)) {
Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext);
Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext);
}
- if (this->unk190 >= 7 && this->unk190 != 0xE) {
+ if ((this->unk190 >= 7) && (this->unk190 != 0xE)) {
this->picto.actor.shape.rot.y += 0x800;
}
@@ -853,57 +853,64 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
// twirling
this->unk204 = 0x28;
this->unk190++;
- return;
+ break;
+
case 1:
// end of twirl, start shaking back and forth
- if (this->unk204 == 0 && this->animeFrameCount <= currentFrame) {
+ if ((this->unk204 == 0) && (this->animeFrameCount <= currentFrame)) {
this->unk204 = 0x14;
this->unk190++;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
- return;
+ break;
+
case 2:
// camera view on the left
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 3:
// camera view on the right
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 4:
// camera view close up front
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 5:
// camera view zoomed out front
if (this->unk204 == 0) {
this->unk204 = 0xF;
this->unk190++;
}
- return;
+ break;
+
case 6:
// zoom in and sweep down in from case 5
if (this->unk204 == 0) {
this->unk204 = 0xF;
this->unk190++;
}
- return;
+ break;
+
case 7:
// zoom in close from case 6
if (this->unk204 == 0) {
this->unk204 = 0xA;
this->unk190++;
}
- return;
+ break;
case 8:
case 9:
@@ -921,7 +928,8 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->unk204 = 0x14;
}
}
- return;
+ break;
+
case 14:
// goes off once for some camera changes,
// otherwise it's the end when camera is back to normal and Player is confused
@@ -933,10 +941,7 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0, player->unk_3CC);
func_80169EFC(&play->state);
- //! FAKE
- if (1) {}
-
- if (gSaveContext.save.time > CLOCK_TIME(18, 0) || gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(18, 0)) || (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
gSaveContext.save.time = CLOCK_TIME(6, 0);
gSaveContext.respawnFlag = -4;
SET_EVENTINF(EVENTINF_27);
@@ -948,6 +953,10 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->unk190 = 0;
this->actionFunc = EnKakasi_DoNothing;
}
+ break;
+
+ default:
+ break;
}
}
@@ -978,7 +987,7 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
this->subCamEyeNext.z = D_80972030.z;
Math_Vec3f_Copy(&tempunk238, &this->subCamEyeNext);
- OLib_DbCameraVec3fSum(&this->picto.actor.home, &tempunk238, &this->subCamEyeNext, 1);
+ OLib_Vec3fAdd(&this->picto.actor.home, &tempunk238, &this->subCamEyeNext, OLIB_ADD_OFFSET);
this->subCamAtNext.x = ((f32)D_8097203C.x) + this->unk22C.x; // cast req
this->subCamAtNext.y = ((f32)D_8097203C.y) + this->unk22C.y;
this->subCamAtNext.z = ((f32)D_8097203C.z) + this->unk22C.z;
@@ -997,11 +1006,11 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
if ((play->gameplayFrames % 4) == 0) {
Math_Vec3f_Copy(&tempWorldPos, &this->picto.actor.world.pos);
tempWorldPos.y = this->picto.actor.floorHeight;
- tempWorldPos.x += randPlusMinusPoint5Scaled(2.0f);
- tempWorldPos.z += randPlusMinusPoint5Scaled(2.0f);
+ tempWorldPos.x += Rand_CenteredFloat(2.0f);
+ tempWorldPos.z += Rand_CenteredFloat(2.0f);
if (play->sceneId == SCENE_8ITEMSHOP) {
- EffectSsGSplash_Spawn(play, &tempWorldPos, 0, 0, 0, randPlusMinusPoint5Scaled(100.0f) + 200.0f);
+ EffectSsGSplash_Spawn(play, &tempWorldPos, 0, 0, 0, Rand_CenteredFloat(100.0f) + 200.0f);
SoundSource_PlaySfxAtFixedWorldPos(play, &tempWorldPos, 0x32, NA_SE_EV_BOMB_DROP_WATER);
} else {
@@ -1014,8 +1023,8 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
Math_ApproachF(&this->picto.actor.shape.yOffset, -6000.0f, 0.5f, 200.0f);
if (fabsf(this->picto.actor.shape.yOffset + 6000.0f) < 10.0f) {
SET_WEEKEVENTREG(WEEKEVENTREG_79_08);
- func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_6);
- ActorCutscene_Stop(this->actorCutscenes[0]);
+ func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
+ CutsceneManager_Stop(this->csIdList[0]);
this->aboveGroundStatus = ENKAKASI_ABOVE_GROUND_TYPE;
this->songSummonDist = 80.0f;
EnKakasi_SetupIdleUnderground(this);
@@ -1031,8 +1040,8 @@ void EnKakasi_SetupIdleUnderground(EnKakasi* this) {
}
void EnKakasi_IdleUnderground(EnKakasi* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && this->picto.actor.xzDistToPlayer < this->songSummonDist &&
- (BREG(1) != 0 || play->msgCtx.ocarinaMode == 0xD)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && (this->picto.actor.xzDistToPlayer < this->songSummonDist) &&
+ ((BREG(1) != 0) || (play->msgCtx.ocarinaMode == 0xD))) {
this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
play->msgCtx.ocarinaMode = 4;
this->actionFunc = EnKakasi_SetupRiseOutOfGround;
@@ -1040,22 +1049,20 @@ void EnKakasi_IdleUnderground(EnKakasi* this, PlayState* play) {
}
void EnKakasi_SetupRiseOutOfGround(EnKakasi* this, PlayState* play) {
- s32 cutsceneIndex;
+ s32 csIdIndex;
- cutsceneIndex = 0;
+ csIdIndex = 0;
if (this->aboveGroundStatus == ENKAKASI_ABOVE_GROUND_TYPE) {
- cutsceneIndex = 1;
+ csIdIndex = 1;
}
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[cutsceneIndex]);
-
- } else if (ActorCutscene_GetCanPlayNext(this->actorCutscenes[cutsceneIndex]) == 0) {
- ActorCutscene_SetIntentToPlay(this->actorCutscenes[cutsceneIndex]);
-
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[csIdIndex]);
+ } else if (!CutsceneManager_IsNext(this->csIdList[csIdIndex])) {
+ CutsceneManager_Queue(this->csIdList[csIdIndex]);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actorCutscenes[cutsceneIndex], &this->picto.actor);
+ CutsceneManager_StartWithPlayerCs(this->csIdList[csIdIndex], &this->picto.actor);
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_AKINDONUTS_HIDE);
this->picto.actor.draw = EnKakasi_Draw;
this->unkState196 = 6;
@@ -1121,10 +1128,10 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
DECR(this->unk204);
if (this->unkState196 != 5) {
- if (this->unk1BC.x != 0.0f || this->unk1BC.z != 0.0f) {
+ if ((this->unk1BC.x != 0.0f) || (this->unk1BC.z != 0.0f)) {
Math_Vec3f_Copy(&this->picto.actor.focus.pos, &this->unk1BC);
this->picto.actor.focus.pos.y += 10.0f;
- if (this->subCamId == CAM_ID_MAIN) {
+ if (this->subCamId == SUB_CAM_ID_DONE) {
Math_Vec3s_Copy(&this->picto.actor.focus.rot, &this->picto.actor.world.rot);
} else {
Math_Vec3s_Copy(&this->picto.actor.focus.rot, &this->picto.actor.home.rot);
@@ -1136,7 +1143,8 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->picto.actor);
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 50.0f, 50.0f, 100.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 50.0f, 50.0f, 100.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (this->picto.actor.draw != NULL) {
Collider_UpdateCylinder(&this->picto.actor, &this->collider);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -1154,7 +1162,7 @@ void EnKakasi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
void EnKakasi_Draw(Actor* thisx, PlayState* play) {
EnKakasi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, NULL,
EnKakasi_PostLimbDraw, &this->picto.actor);
}
diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
index c278ef050..cff35d183 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.h
@@ -21,7 +21,7 @@ typedef struct EnKakasi {
/* 0x1A4 */ s32 unkCounter1A4; // counter, counts up to F while he digs away, reused elsewhere
/* 0x1A8 */ s32 unkState1A8;
/* 0x1AC */ s16 talkState;
- /* 0x1AE */ s16 actorCutscenes[3];
+ /* 0x1AE */ s16 csIdList[3];
/* 0x1B4 */ f32 animeFrameCount;
/* 0x1B8 */ f32 unkHeight;
/* 0x1BC */ Vec3f unk1BC; // set by post limbdraw func for one limb
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 b508adecf..820dd1f4e 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -289,11 +289,12 @@ void func_80AD75A8(EnKame* this, PlayState* play) {
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.speed >= 3.0f)) {
if ((play->gameplayFrames % 2) == 0) {
- u32 temp_v0 = func_800C9BB8(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ SurfaceMaterial surfaceMaterial =
+ SurfaceType_GetMaterial(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- if ((temp_v0 == 0) || (temp_v0 == 1)) {
+ if ((surfaceMaterial == SURFACE_MATERIAL_DIRT) || (surfaceMaterial == SURFACE_MATERIAL_SAND)) {
func_800B1210(play, &this->actor.world.pos, &D_80AD8E5C, &gZeroVec3f, 550, 100);
- } else if (temp_v0 == 14) {
+ } else if (surfaceMaterial == SURFACE_MATERIAL_SNOW) {
func_800B0DE0(play, &this->actor.world.pos, &D_80AD8E5C, &gZeroVec3f, &D_80AD8E54, &D_80AD8E58, 550,
100);
}
@@ -605,9 +606,9 @@ void func_80AD8388(EnKame* this, PlayState* play) {
this->actor.scale.y = this->actor.scale.x;
this->actor.scale.z = this->actor.scale.x;
}
- sp34.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
+ sp34.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y + 15.0f;
- sp34.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp34.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
func_800B3030(play, &sp34, &gZeroVec3f, &gZeroVec3f, 100, 0, 2);
}
}
@@ -716,7 +717,9 @@ void EnKame_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 60.0f, 40.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 60.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (this->actor.shape.shadowDraw != NULL) {
Actor_SetFocus(&this->actor, 25.0f);
@@ -802,7 +805,7 @@ void EnKame_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80AD8E34[this->unk_29C]);
@@ -837,7 +840,7 @@ s32 Enkame_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void func_80AD8D64(Actor* thisx, PlayState* play) {
EnKame* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime2.skeleton, this->skelAnime2.jointTable, this->skelAnime2.dListCount,
Enkame_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
index ba1cf165c..ff7e4bb08 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -135,8 +135,8 @@ void func_80954960(EnKanban* this) {
ny = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.y);
nz = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.z);
- this->floorRot.x = -func_80086B30(-nz * ny, 1.0f);
- this->floorRot.z = func_80086B30(-nx * ny, 1.0f);
+ this->floorRot.x = -Math_FAtan2F(-nz * ny, 1.0f);
+ this->floorRot.z = Math_FAtan2F(-nx * ny, 1.0f);
}
}
@@ -163,7 +163,7 @@ void EnKanban_Init(Actor* thisx, PlayState* play) {
this->bounceX = 1;
this->partFlags = 0xFFFF;
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, UPDBGCHECKINFO_FLAG_4);
func_80954960(this);
}
}
@@ -198,20 +198,16 @@ void func_80954BE8(EnKanban* this, PlayState* play) {
}
}
-#ifdef NON_MATCHING
-// Lots of branch likely stuff
void EnKanban_Update(Actor* thisx, PlayState* play) {
- // PlayState* play = play2;
u8 bounced = false;
- s32 pad;
EnKanban* this = THIS;
+ s32 pad;
+ FloorType floorType;
+ f32 phi_f0;
Player* player = GET_PLAYER(play);
Vec3f offset;
EnKanban* piece;
EnKanban* signpost;
- s32 temp_v0_18;
- f32 phi_f0;
- s32 pad2;
this->frameCount++;
@@ -354,7 +350,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
piece->actionState = ENKANBAN_AIR;
piece->actor.gravity = -1.0f;
piece->actor.world.rot.y =
- BINANG_ROT180((s32)randPlusMinusPoint5Scaled(0x4000) + this->actor.yawTowardsPlayer);
+ BINANG_ROT180((s32)Rand_CenteredFloat(0x4000) + this->actor.yawTowardsPlayer);
if ((hitItem->toucher.dmgFlags & 0x10) || (hitItem->toucher.dmgFlags & 8) ||
(hitItem->toucher.dmgFlags & 0x80000000)) {
@@ -373,7 +369,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
piece->bounceZ = Rand_ZeroFloat(7.0f) + 3.0f;
}
- piece->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ piece->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
piece->direction = 1;
@@ -423,8 +419,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
f32 tempY;
f32 tempZ;
f32 tempWaterDepth;
+ s32 pad2;
u16 bgCheckFlags;
- u8 onGround;
if (this->unk_198 != 0) {
this->actor.velocity.y = -2.0f;
@@ -433,7 +429,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 10.0f, 50.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 10.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
tempX = this->actor.world.pos.x;
tempY = this->actor.world.pos.y;
@@ -442,7 +439,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
tempWaterDepth = this->actor.depthInWater;
this->actor.world.pos.z += ((this->actor.world.pos.y - this->actor.floorHeight) * -50.0f) / 100.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, UPDBGCHECKINFO_FLAG_4);
func_80954960(this);
this->actor.world.pos.x = tempX;
@@ -451,103 +448,103 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.bgCheckFlags = bgCheckFlags;
this->actor.depthInWater = tempWaterDepth;
- if (1) {}
+ if (1) {
+ u8 onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
- onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
-
- if (this->spinXFlag != 0) {
- this->spinRot.x += this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x <= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- } else {
- this->spinRot.x -= this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x >= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- }
-
- if (this->spinVel.x < -0xC00) {
- this->spinVel.x = -0xC00;
- }
-
- if (this->spinZFlag != 0) {
- this->spinRot.z += this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z <= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- } else {
- this->spinRot.z -= this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z >= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- }
-
- if (this->spinVel.z < -0xC00) {
- this->spinVel.z = -0xC00;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- }
- this->actor.speed *= -0.5f;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
- this->actionState = ENKANBAN_WATER;
- Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
- this->bounceX = this->bounceZ = 0;
- this->actor.world.pos.y += this->actor.depthInWater;
- EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
- this->actor.velocity.y = 0.0f;
- this->actor.gravity = 0.0f;
- break;
- }
-
- if (onGround) {
- temp_v0_18 = func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
-
- if ((temp_v0_18 == 15) || (temp_v0_18 == 14)) {
- this->unk_197 = 1;
- } else if (temp_v0_18 == 5) {
- this->unk_197 = -1;
- }
-
- if (this->bounceCount <= 0) {
- this->bounceCount++;
- if (this->unk_197 != 0) {
- this->actor.velocity.y = 0.0f;
- } else {
- this->actor.velocity.y *= -0.3f;
- this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x4000);
+ if (this->spinXFlag != 0) {
+ this->spinRot.x += this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x <= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
}
- bounced = true;
} else {
- this->actor.velocity.y = 0.0f;
+ this->spinRot.x -= this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x >= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
+ }
}
- if (this->unk_197 != 0) {
- if (this->unk_197 > 0) {
- this->actor.speed = 0.0f;
- } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
- this->airTimer = 10;
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- this->actionState = ENKANBAN_GROUND;
- this->actor.speed = 0.0f;
- goto nextCase;
+ if (this->spinVel.x < -0xC00) {
+ this->spinVel.x = -0xC00;
+ }
+
+ if (this->spinZFlag != 0) {
+ this->spinRot.z += this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z <= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ } else {
+ this->spinRot.z -= this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z >= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ }
+
+ if (this->spinVel.z < -0xC00) {
+ this->spinVel.z = -0xC00;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
+ }
+ this->actor.speed *= -0.5f;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ this->actionState = ENKANBAN_WATER;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
+ this->bounceX = this->bounceZ = 0;
+ this->actor.world.pos.y += this->actor.depthInWater;
+ EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ break;
+ }
+
+ if (onGround) {
+ floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+
+ if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
+ this->unk_197 = 1;
+ } else if (floorType == FLOOR_TYPE_5) {
+ this->unk_197 = -1;
+ }
+
+ if (this->bounceCount <= 0) {
+ this->bounceCount++;
+ if (this->unk_197 != 0) {
+ this->actor.velocity.y = 0.0f;
} else {
- Vec3f spC8;
+ this->actor.velocity.y *= -0.3f;
+ this->actor.world.rot.y += (s16)(s32)Rand_CenteredFloat(0x4000);
+ }
+ bounced = true;
+ } else {
+ this->actor.velocity.y = 0.0f;
+ }
+
+ if (this->unk_197 != 0) {
+ Vec3f spC8;
+
+ if (this->unk_197 > 0) {
+ this->actor.speed = 0.0f;
+ } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
+ this->airTimer = 10;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actionState = ENKANBAN_GROUND;
+ this->actor.speed = 0.0f;
+ goto nextCase;
+ }
Matrix_RotateXFNew(this->floorRot.x);
Matrix_RotateZF(this->floorRot.z, MTXMODE_APPLY);
@@ -557,87 +554,88 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.world.rot.y = Math_Atan2S(spC8.x, spC8.z);
this->unk_198 = 1;
this->actor.speed = sqrtf(SQXZ(this->actor.velocity));
+ } else {
+ this->unk_198 = 0;
+ Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
}
} else {
- this->unk_198 = 0;
- Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
+ this->actor.speed *= 0.7f;
}
+
+ if (this->spinRot.x == 0) {
+ if (this->bounceX != 0) {
+ bounced = true;
+ if (this->unk_197 != 0) {
+ this->spinRot.x = 0;
+ this->bounceX = 0;
+ } else {
+ this->spinVel.x = this->bounceX << 9;
+ if (this->bounceX != 0) {
+ this->bounceX -= 5;
+ if (this->bounceX <= 0) {
+ this->bounceX = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinXFlag = 1;
+ } else {
+ this->spinXFlag = 0;
+ }
+ }
+ }
+ }
+
+ if (this->spinRot.z == 0) {
+ if (this->bounceZ != 0) {
+ bounced = 1;
+ if (this->unk_197 != 0) {
+ this->spinRot.z = 0;
+ this->bounceZ = 0;
+ } else {
+ this->spinVel.z = this->bounceZ << 9;
+ if (this->bounceZ != 0) {
+ this->bounceZ -= 5;
+ if (this->bounceZ <= 0) {
+ this->bounceZ = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinZFlag = 1;
+ } else {
+ this->spinZFlag = 0;
+ }
+ }
+ }
+ }
+
+ Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
} else {
- this->actor.speed *= 0.7f;
+ this->actor.shape.rot.y += this->spinVel.y;
+ this->actor.shape.rot.x += this->direction * 0x7D0;
}
-
- if (this->spinRot.x == 0) {
- if (this->bounceX != 0) {
- bounced = true;
- if (this->unk_197 != 0) {
- this->spinRot.x = 0;
- this->bounceX = 0;
- } else {
- this->spinVel.x = this->bounceX << 9;
- if (this->bounceX != 0) {
- this->bounceX -= 5;
- if (this->bounceX <= 0) {
- this->bounceX = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinXFlag = 1;
- } else {
- this->spinXFlag = 0;
- }
- }
- }
- }
-
- if (this->spinRot.z == 0) {
- if (this->bounceZ != 0) {
- bounced = 1;
- if (this->unk_197 != 0) {
- this->spinRot.z = 0;
- this->bounceZ = 0;
- } else {
- this->spinVel.z = this->bounceZ << 9;
- if (this->bounceZ != 0) {
- this->bounceZ -= 5;
- if (this->bounceZ <= 0) {
- this->bounceZ = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinZFlag = 1;
- } else {
- this->spinZFlag = 0;
- }
- }
- }
- }
-
- Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
- } else {
- this->actor.shape.rot.y += this->spinVel.y;
- this->actor.shape.rot.x += this->direction * 0x7D0;
}
if (bounced) {
if (this->unk_197 > 0) {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_SNOW);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_SNOW);
} else {
Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
}
}
if (bounced && (this->unk_197 >= 0)) {
+ static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
+ static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
s16 dustCount;
s16 j;
Vec3f velocity = { 0.0f, 0.0f, 0.0f };
- static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
- static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
Vec3f accel;
Vec3f pos;
Color_RGBA8 primColor;
Color_RGBA8 envColor;
+ s32 pad3;
if (this->unk_197 != 0) {
primColor = D_8095754C;
@@ -655,8 +653,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
dustCount = this->partCount * 0.5f;
for (j = 0; j < dustCount + 3; j++) {
- pos.x = randPlusMinusPoint5Scaled((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.z;
func_800B0F18(play, &pos, &velocity, &accel, &primColor, &envColor, 100, 5,
Rand_ZeroFloat(5.0f) + 14.0f);
}
@@ -666,10 +664,10 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actionState = ENKANBAN_GROUND;
}
}
-
+ nextCase:
+ // fallthrough
case ENKANBAN_GROUND:
case ENKANBAN_WATER:
- nextCase:
signpost = (EnKanban*)this->actor.parent;
if (signpost->partFlags == 0xFFFF) {
@@ -709,7 +707,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (this->actor.speed != 0.0f) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.speed *= -0.5f;
if (this->spinVel.y > 0) {
@@ -751,7 +750,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actionState = ENKANBAN_AIR;
this->actor.gravity = -1.0f;
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x10000);
if (this->partCount >= 4) {
this->bounceX = Rand_ZeroFloat(10.0f) + 6.0f;
this->bounceZ = Rand_ZeroFloat(10.0f) + 6.0f;
@@ -764,7 +763,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.speed = Rand_ZeroFloat(1.5f);
}
- this->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ this->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
this->direction = 1;
@@ -809,7 +808,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.speed = 4.0f + bombStrength;
}
- this->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ this->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
this->direction = 1;
@@ -837,6 +836,9 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
}
break;
+
+ default:
+ break;
}
break;
@@ -881,14 +883,11 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
break;
}
+
+ default:
+ break;
}
}
-#else
-static Vec3f D_8095753C = { 0.0f, 0.0f, 0.0f };
-static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
-static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kanban/EnKanban_Update.s")
-#endif
static Gfx* sDisplayLists[] = {
object_kanban_DL_000CB0, object_kanban_DL_000DB8, object_kanban_DL_000E78, object_kanban_DL_000F38,
@@ -921,8 +920,8 @@ void EnKanban_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, object_kanban_DL_000C30);
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 80e5ca0fc..34b3d6405 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -93,11 +93,11 @@ static ColliderCylinderInit sAttackCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 15, 80, MASS_HEAVY };
typedef enum {
- /* 0x0 */ KAREBABA_DMGEFF_NONE,
- /* 0x2 */ KAREBABA_DMGEFF_FIRE = 2,
- /* 0x3 */ KAREBABA_DMGEFF_ICE,
- /* 0x4 */ KAREBABA_DMGEFF_LIGHT,
- /* 0x5 */ KAREBABA_DMGEFF_ELECTRIC,
+ /* 0 */ KAREBABA_DMGEFF_NONE,
+ /* 2 */ KAREBABA_DMGEFF_FIRE = 2,
+ /* 3 */ KAREBABA_DMGEFF_ICE,
+ /* 4 */ KAREBABA_DMGEFF_LIGHT,
+ /* 5 */ KAREBABA_DMGEFF_ELECTRIC
} DekuBabaDamageEffect;
static DamageTable sDamageTable = {
@@ -602,9 +602,10 @@ void EnKarebaba_Update(Actor* thisx, PlayState* play2) {
if (this->actionFunc != EnKarebaba_Dead) {
if (this->actionFunc == EnKarebaba_Dying) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 15.0f, 10.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 15.0f, 10.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->boundFloor == 0) {
this->boundFloor = this->actor.floorPoly;
}
@@ -633,7 +634,7 @@ void EnKarebaba_DrawShadow(EnKarebaba* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
@@ -657,7 +658,7 @@ void EnKarebaba_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Math_Vec3f_Copy(this->bodyPartsPos, &this->actor.world.pos);
if (this->actionFunc == EnKarebaba_DeadItemDrop) {
diff --git a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
index aa05aec0a..045bef42a 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
@@ -11,7 +11,7 @@ typedef void (*EnKarebabaActionFunc)(struct EnKarebaba*, PlayState*);
typedef enum {
/* 0 */ ENKAREBABA_0, // Unused, always shrinks and drops a Deku Nut
/* 1 */ ENKAREBABA_1, // Drops sticks (Only type OoT has)
- /* 2 */ KAREBABA_MINI,
+ /* 2 */ KAREBABA_MINI
} KarebabaType;
typedef struct EnKarebaba {
diff --git a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
index d2847a39d..cfd27fbb0 100644
--- a/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
+++ b/src/overlays/actors/ovl_En_Kbt/z_en_kbt.c
@@ -71,12 +71,12 @@ void EnKbt_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80B33E64(PlayState* play) {
- return gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 1;
+ return gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 1;
}
s32 func_80B33E8C(PlayState* play) {
if ((CURRENT_DAY == 3) ||
- ((CURRENT_DAY == 2) && (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 2))) {
+ ((CURRENT_DAY == 2) && (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 2))) {
return true;
}
return false;
@@ -557,7 +557,7 @@ void EnKbt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
diff --git a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c
index efce38ad8..fbb8346e5 100644
--- a/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c
+++ b/src/overlays/actors/ovl_En_Kendo_Js/z_en_kendo_js.c
@@ -125,7 +125,7 @@ void EnKendoJs_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (ENKENDOJS_GET_FF(&this->actor) != ENKENDOJS_FF_1) {
Path* path = &play->setupPathList[ENKENDOJS_GET_FF00(&this->actor)];
@@ -159,7 +159,7 @@ void func_80B2654C(EnKendoJs* this, PlayState* play) {
s32 phi_v0;
s32 sp30;
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (CURRENT_DAY != 0) {
sp30 = CURRENT_DAY - 1;
} else {
@@ -224,7 +224,7 @@ void func_80B26758(EnKendoJs* this, PlayState* play) {
Message_StartTextbox(play, 0x272C, &this->actor);
this->unk_288 = 0x272C;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
- } else if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2718, &this->actor);
this->unk_288 = 0x2718;
@@ -242,7 +242,7 @@ void func_80B26758(EnKendoJs* this, PlayState* play) {
Message_StartTextbox(play, 0x272C, &this->actor);
this->unk_288 = 0x272C;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
- } else if (gSaveContext.save.playerData.rupees < play->msgCtx.unk12070) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk12070) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2718, &this->actor);
this->unk_288 = 0x2718;
@@ -359,8 +359,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags3 & PLAYER_STATE3_8000000) ||
- (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags3 & PLAYER_STATE3_8000000) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
break;
@@ -370,7 +370,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
break;
@@ -380,8 +381,8 @@ s32 func_80B26BF8(EnKendoJs* this, PlayState* play) {
return 0;
}
- if ((player->meleeWeaponState != 0) || (player->stateFlags3 & PLAYER_STATE3_8000000) ||
- (player->stateFlags2 & PLAYER_STATE2_80000)) {
+ if ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->stateFlags3 & PLAYER_STATE3_8000000) || (player->stateFlags2 & PLAYER_STATE2_80000)) {
return 1;
}
this->unk_28E = 0;
@@ -461,7 +462,7 @@ s32 func_80B26F6C(EnKendoJs* this, PlayState* play) {
switch (this->unk_288) {
case 0x271D:
- if (Player_GetMeleeWeaponHeld(player) != 0) {
+ if (Player_GetMeleeWeaponHeld(player) != PLAYER_MELEEWEAPON_NONE) {
Message_StartTextbox(play, 0x272A, &this->actor);
this->unk_288 = 0x272A;
return true;
@@ -680,9 +681,9 @@ void func_80B27774(EnKendoJs* this, PlayState* play) {
}
void func_80B2783C(EnKendoJs* this, PlayState* play) {
- if (this->actor.cutscene != -1) {
- Camera_ChangeDataIdx(play->cameraPtrs[CAM_ID_MAIN],
- ActorCutscene_GetCutscene(this->actor.cutscene)->csCamSceneDataId);
+ if (this->actor.csId != CS_ID_NONE) {
+ Camera_ChangeActorCsCamIndex(play->cameraPtrs[CAM_ID_MAIN],
+ CutsceneManager_GetCutsceneEntry(this->actor.csId)->csCamId);
}
}
@@ -774,7 +775,7 @@ void EnKendoJs_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnKendoJs_Draw(Actor* thisx, PlayState* play) {
EnKendoJs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnKendoJs_OverrideLimbDraw, EnKendoJs_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
index 356af73f7..e80807b08 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
@@ -45,7 +45,7 @@ ActorInit En_Kgy_InitVars = {
void EnKgy_Init(Actor* thisx, PlayState* play) {
EnKgy* this = THIS;
- s16 cs;
+ s16 csId;
s32 i;
Actor_SetScale(&this->actor, 0.01f);
@@ -58,7 +58,8 @@ void EnKgy_Init(Actor* thisx, PlayState* play) {
this->zubora = EnKgy_FindZubora(play);
this->iceBlock = EnKgy_FindIceBlock(play);
Flags_UnsetSwitch(play, ENKGY_GET_FE00(&this->actor) + 1);
- if (Flags_GetSwitch(play, ENKGY_GET_FE00(&this->actor)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (Flags_GetSwitch(play, ENKGY_GET_FE00(&this->actor)) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
Flags_SetSwitch(play, ENKGY_GET_FE00(&this->actor) + 1);
play->envCtx.lightSettingOverride = 1;
SET_WEEKEVENTREG(WEEKEVENTREG_21_01);
@@ -71,7 +72,7 @@ void EnKgy_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80B419B0;
this->actor.textId = 0xC4E;
this->unk_29C |= 1;
- this->unk_2EA = 3;
+ this->getItemId = GI_RUPEE_10;
} else {
EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0);
this->actionFunc = func_80B42714;
@@ -86,12 +87,12 @@ void EnKgy_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80B42D28;
}
- cs = this->actor.cutscene;
- for (i = 0; i < ARRAY_COUNT(this->unk_2D4); i++) {
- this->unk_2D4[i] = cs;
- if (cs != -1) {
- this->actor.cutscene = cs;
- cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ csId = this->actor.csId;
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
@@ -151,33 +152,33 @@ ObjIcePoly* EnKgy_FindIceBlock(PlayState* play) {
}
void func_80B40C74(PlayState* play) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= 1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= 1;
if (CURRENT_DAY == 1) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= 2;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= 2;
} else {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 &= ~2;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~2;
}
}
void func_80B40D00(PlayState* play) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= 4;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= 4;
}
void func_80B40D30(PlayState* play) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 &= ~7;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~7;
}
s32 func_80B40D64(PlayState* play) {
- return gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 1;
+ return gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 1;
}
s32 func_80B40D8C(PlayState* play) {
- return gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 4;
+ return gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 4;
}
s32 func_80B40DB4(PlayState* play) {
if ((CURRENT_DAY == 3) ||
- ((CURRENT_DAY == 2) && (gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 2))) {
+ ((CURRENT_DAY == 2) && (gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 2))) {
return true;
}
return false;
@@ -227,14 +228,14 @@ void func_80B40EE8(EnKgy* this, PlayState* play) {
}
}
- if ((this->unk_2E0 != -1) && (ActorCutscene_GetCurrentIndex() != this->unk_2D4[this->unk_2E0])) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_2D4[this->unk_2E0]);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_2D4[this->unk_2E0])) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D4[this->unk_2E0], &this->actor);
+ if ((this->csIdIndex != -1) && (CutsceneManager_GetCurrentCsId() != this->csIdList[this->csIdIndex])) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[this->csIdIndex], &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_2D4[this->unk_2E0]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
@@ -304,7 +305,7 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) {
case 0:
this->unk_2B4 = this->unk_2A8;
this->actor.focus.pos = this->unk_2A8;
- this->unk_2E0 = 0;
+ this->csIdIndex = 0;
break;
case 1:
@@ -312,7 +313,7 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) {
this->unk_2B4 = this->zubora->actor.focus.pos;
this->actor.focus.pos = this->zubora->actor.focus.pos;
}
- this->unk_2E0 = 1;
+ this->csIdIndex = 1;
break;
case 2:
@@ -320,7 +321,7 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) {
this->unk_2B4 = this->iceBlock->actor.world.pos;
this->actor.focus.pos = this->iceBlock->actor.focus.pos;
}
- this->unk_2E0 = 2;
+ this->csIdIndex = 2;
break;
case 3:
@@ -328,7 +329,7 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) {
if (this->zubora != NULL) {
this->actor.focus.pos = this->zubora->actor.focus.pos;
}
- this->unk_2E0 = 3;
+ this->csIdIndex = 3;
break;
case 4:
@@ -336,13 +337,13 @@ void func_80B411DC(EnKgy* this, PlayState* play, s32 arg2) {
this->unk_2B4 = this->zubora->actor.focus.pos;
this->actor.focus.pos = this->zubora->actor.focus.pos;
}
- this->unk_2E0 = 4;
+ this->csIdIndex = 4;
break;
}
}
void func_80B41368(EnKgy* this, PlayState* play, s32 arg2) {
- ActorCutscene_Stop(this->unk_2D4[this->unk_2E0]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
func_80B411DC(this, play, arg2);
this->unk_2E6 = 20;
this->unk_29C |= 2;
@@ -353,8 +354,8 @@ void func_80B413C8(EnKgy* this) {
this->unk_2B4 = sp1C;
this->actor.focus.pos = sp1C;
- ActorCutscene_Stop(this->unk_2D4[this->unk_2E0]);
- this->unk_2E0 = -1;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = -1;
this->unk_2E6 = 0;
this->unk_29C &= ~2;
}
@@ -419,12 +420,12 @@ void func_80B4163C(EnKgy* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->unk_2D2 == 6) {
- if (this->unk_2EA > 0) {
+ if (this->getItemId > GI_NONE) {
EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0.0f);
- this->unk_2EA--;
+ this->getItemId--;
} else {
EnKgy_ChangeAnim(this, 9, ANIMMODE_ONCE, -5.0f);
- this->unk_2EA = (s32)Rand_ZeroFloat(3.0f) + 2;
+ this->getItemId = (s32)Rand_ZeroFloat(GI_RUPEE_PURPLE - GI_RUPEE_BLUE) + GI_RUPEE_BLUE;
}
} else {
EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, -5.0f);
@@ -467,12 +468,12 @@ void func_80B417B8(EnKgy* this, PlayState* play) {
void func_80B41858(EnKgy* this, PlayState* play) {
func_80B4163C(this, play);
- if (ActorCutscene_GetCanPlayNext(this->unk_2D4[5])) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D4[5], &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[5])) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[5], &this->actor);
this->actionFunc = func_80B419B0;
func_80B40E18(this, 7);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_2D4[5]);
+ CutsceneManager_Queue(this->csIdList[5]);
}
}
@@ -484,7 +485,7 @@ void func_80B418C4(EnKgy* this, PlayState* play) {
Message_CloseTextbox(play);
this->actor.textId = 0xC4F;
func_80B413C8(this);
- ActorCutscene_SetIntentToPlay(this->unk_2D4[5]);
+ CutsceneManager_Queue(this->csIdList[5]);
this->actionFunc = func_80B41858;
this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
}
@@ -597,7 +598,7 @@ void func_80B41D64(EnKgy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_OfferGetItem(&this->actor, play, this->unk_2EA, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 2000.0f, 1000.0f);
}
func_80B40EE8(this, play);
}
@@ -621,7 +622,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC3B:
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
play_sound(NA_SE_SY_ERROR);
func_80B40E74(this, play, 0xC3F);
} else {
@@ -743,7 +744,7 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC46:
case 0xC55:
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
player->exchangeItemId = PLAYER_IA_NONE;
this->unk_29C &= ~0x8;
play->msgCtx.msgLength = 0;
@@ -789,16 +790,16 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC50:
if (func_80B40D8C(play)) {
- this->unk_2EA = 57;
+ this->getItemId = GI_SWORD_GILDED;
this->actor.textId = 0xC53;
} else {
- this->unk_2EA = 56;
+ this->getItemId = GI_SWORD_RAZOR;
this->actor.textId = 0xC51;
}
Message_CloseTextbox(play);
this->actionFunc = func_80B41D64;
func_80B413C8(this);
- Actor_OfferGetItem(&this->actor, play, this->unk_2EA, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 2000.0f, 1000.0f);
break;
case 0xC51:
@@ -1133,7 +1134,7 @@ void func_80B43074(EnKgy* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
Matrix_Push();
Matrix_Translate(-800.0f, 3100.0f, 8400.0f, MTXMODE_APPLY);
@@ -1165,7 +1166,7 @@ void func_80B43074(EnKgy* this, PlayState* play) {
void EnKgy_Draw(Actor* thisx, PlayState* play) {
EnKgy* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_29C & 1) {
func_80B43074(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
index d9423783d..94f2aabd5 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
@@ -25,13 +25,13 @@ typedef struct EnKgy {
/* 0x2C0 */ Vec3f unk_2C0;
/* 0x2CC */ Vec3s unk_2CC;
/* 0x2D2 */ s16 unk_2D2;
- /* 0x2D4 */ s16 unk_2D4[6];
- /* 0x2E0 */ s16 unk_2E0;
+ /* 0x2D4 */ s16 csIdList[6];
+ /* 0x2E0 */ s16 csIdIndex;
/* 0x2E2 */ s16 unk_2E2;
/* 0x2E4 */ s16 unk_2E4;
/* 0x2E6 */ s16 unk_2E6;
/* 0x2E8 */ s16 unk_2E8;
- /* 0x2EA */ s16 unk_2EA;
+ /* 0x2EA */ s16 getItemId;
/* 0x2EC */ LightInfo lightInfo;
/* 0x2FC */ LightNode* lightNode;
/* 0x300 */ s16 unk_300;
diff --git a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
index 1de7fc728..77c7e1dc9 100644
--- a/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
+++ b/src/overlays/actors/ovl_En_Kujiya/z_en_kujiya.c
@@ -46,13 +46,13 @@ ActorInit En_Kujiya_InitVars = {
(ActorFunc)EnKujiya_Draw,
};
-#define CHECK_LOTTERY_NUMBERS \
- (((u32)((void)0, gSaveContext.save.lotteryCodes[CURRENT_DAY - 1][0]) == \
- ((((void)0, gSaveContext.save.lotteryCodeGuess & 0xFFFF) & 0xF00) >> 8)) && \
- ((u32)((void)0, gSaveContext.save.lotteryCodes[CURRENT_DAY - 1][1]) == \
- ((((void)0, gSaveContext.save.lotteryCodeGuess & 0xFFFF) & 0xF0) >> 4)) && \
- ((u32)((void)0, gSaveContext.save.lotteryCodes[CURRENT_DAY - 1][2]) == \
- (((void)0, gSaveContext.save.lotteryCodeGuess & 0xFFFF) & 0xF)))
+#define CHECK_LOTTERY_NUMBERS \
+ (((u32)((void)0, gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0]) == \
+ ((((void)0, gSaveContext.save.saveInfo.lotteryCodeGuess & 0xFFFF) & 0xF00) >> 8)) && \
+ ((u32)((void)0, gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][1]) == \
+ ((((void)0, gSaveContext.save.saveInfo.lotteryCodeGuess & 0xFFFF) & 0xF0) >> 4)) && \
+ ((u32)((void)0, gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][2]) == \
+ (((void)0, gSaveContext.save.saveInfo.lotteryCodeGuess & 0xFFFF) & 0xF)))
void EnKujiya_Init(Actor* thisx, PlayState* play) {
EnKujiya* this = THIS;
@@ -111,7 +111,7 @@ void EnKujiya_Wait(EnKujiya* this, PlayState* play) {
void EnKujiya_HandlePlayerChoice(EnKujiya* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) { // Buy
- if (gSaveContext.save.playerData.rupees < 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x2B62, &this->actor);
this->textId = 0x2B62; // Not enough Rupees
@@ -296,18 +296,18 @@ void EnKujiya_SetupTurnToOpen(EnKujiya* this) {
}
void EnKujiya_TurnToOpen(EnKujiya* this, PlayState* play) {
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
if (!Math_SmoothStepToS(&this->actor.shape.rot.y, 0x7555, 0xA, 0x16C, 0x16C)) {
if (this->timer > 20) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
EnKujiya_SetupWait(this);
} else {
@@ -324,18 +324,18 @@ void EnKujiya_SetupTurnToClosed(EnKujiya* this) {
}
void EnKujiya_TurnToClosed(EnKujiya* this, PlayState* play) {
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
if (!Math_SmoothStepToS(&this->actor.shape.rot.y, 0, 0xA, 0x16C, 0x16C)) {
if (this->timer > 20) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
EnKujiya_SetupWait(this);
} else {
@@ -359,7 +359,7 @@ void EnKujiya_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gLotteryShopCylinderDL);
diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
index 1f411bd39..16ce97153 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -245,14 +245,14 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
s32 collectableParams;
if ((KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_GRASS) || (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_BUSH)) {
- if (!KUSA_GET_PARAMS_0C(&this->actor)) {
+ if (!KUSA_GET_PARAM_0C(&this->actor)) {
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos,
KUSA_GET_RAND_COLLECTIBLE_ID(&this->actor) * 0x10);
}
} else if (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_REGROWING_GRASS) {
Item_DropCollectible(play, &this->actor.world.pos, 3);
} else {
- collectible = func_800A8150(KUSA_GET_PARAMS_3F(&this->actor));
+ collectible = func_800A8150(KUSA_GET_PARAM_3F(&this->actor));
if (collectible >= 0) {
collectableParams = KUSA_GET_COLLECTIBLE_ID(&this->actor);
Item_DropCollectible(play, &this->actor.world.pos, (collectableParams << 8) | collectible);
@@ -329,7 +329,7 @@ void EnKusa_SpawnBugs(EnKusa* this, PlayState* play) {
for (numBugs = 0; numBugs < 3; numBugs++) {
Actor* bug = Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 1,
- this->actor.cutscene, this->actor.halfDaysBits, 0);
+ this->actor.csId, this->actor.halfDaysBits, 0);
if (bug == NULL) {
break;
@@ -366,7 +366,7 @@ void EnKusa_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
this->actor.uncullZoneForward += 1000.0f;
}
EnKusa_InitCollider(&this->actor, play);
@@ -519,7 +519,9 @@ void EnKusa_LiftedUp(EnKusa* this, PlayState* play) {
EnKusa_UpdateVelY(this);
EnKusa_RandScaleVecToZero(&this->actor.velocity, 0.005f);
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
this->actor.gravity = -3.2f;
} else {
pos.x = this->actor.world.pos.x;
@@ -604,7 +606,9 @@ void EnKusa_Fall(EnKusa* this, PlayState* play) {
this->actor.shape.rot.y += rotSpeedY;
EnKusa_RandScaleVecToZero(&this->actor.velocity, 0.05f);
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -711,7 +715,7 @@ void EnKusa_DrawBush(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
alpha = (1300.0f - this->actor.projectedPos.z) * 2.55f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
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, 255, alpha);
diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
index 56f55af3e..b231f3e0e 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
@@ -28,8 +28,8 @@ typedef struct EnKusa {
#define KUSA_GET_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0x7F)
#define KUSA_GET_RAND_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0xF)
#define KUSA_SHOULD_SPAWN_BUGS(thisx) (((thisx)->params >> 0x4) & 1)
-#define KUSA_GET_PARAMS_0C(thisx) (((thisx)->params >> 0xC) & 0x1)
-#define KUSA_GET_PARAMS_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
+#define KUSA_GET_PARAM_0C(thisx) (((thisx)->params >> 0xC) & 0x1)
+#define KUSA_GET_PARAM_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
#define KUSA_GET_TYPE(thisx)((thisx)->params & 0x3)
diff --git a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
index 49fa4a98a..cfc3efdc0 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -4,7 +4,6 @@
* Description: Keaton grass
*/
-#include "prevent_bss_reordering.h"
#include "z_en_kusa2.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -100,10 +99,9 @@ void func_80A5B160(EnKusa2* this, PlayState* play) {
if (this->unk_194[0] == NULL) {
ptr = this->unk_194;
- actor = (EnKusa2*)Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_KUSA2, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0,
- Rand_Next() >> 0x10, 0, 1, this->actor.cutscene,
- this->actor.halfDaysBits, NULL);
+ actor = (EnKusa2*)Actor_SpawnAsChildAndCutscene(
+ &play->actorCtx, play, ACTOR_EN_KUSA2, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, Rand_Next() >> 0x10, 0, 1, this->actor.csId, this->actor.halfDaysBits, NULL);
*ptr = actor;
if (*ptr != NULL) {
@@ -119,7 +117,7 @@ void func_80A5B160(EnKusa2* this, PlayState* play) {
actor = (EnKusa2*)Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, ACTOR_EN_KUSA2, (Math_SinS(temp_s1) * 80.0f) + this->actor.world.pos.x,
this->actor.world.pos.y, (Math_CosS(temp_s1) * 80.0f) + this->actor.world.pos.z, 0, Rand_Next() >> 0x10,
- 0, 1, this->actor.cutscene, this->actor.halfDaysBits, NULL);
+ 0, 1, this->actor.csId, this->actor.halfDaysBits, NULL);
*ptr = actor;
if (*ptr != NULL) {
(*ptr)->actor.room = this->actor.room;
@@ -160,7 +158,7 @@ void func_80A5B3BC(EnKusa2* this) {
void func_80A5B490(EnKusa2* this, PlayState* play) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_KITAN, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0,
- ENKUSA2_GET_7F00(&this->actor) << 9, this->actor.cutscene, this->actor.halfDaysBits,
+ ENKUSA2_GET_7F00(&this->actor) << 9, this->actor.csId, this->actor.halfDaysBits,
NULL);
}
@@ -271,7 +269,8 @@ s32 func_80A5BA58(EnKusa2* this, PlayState* play) {
}
void func_80A5BAFC(EnKusa2* this, PlayState* play) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 35.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
}
void func_80A5BB40(EnKusa2* this, PlayState* play, s32 arg2) {
@@ -961,14 +960,14 @@ void func_80A5D7A4(EnKusa2* this) {
}
void func_80A5D7C4(EnKusa2* this, PlayState* play) {
- EnKusa2* this2 = this;
+ Actor* thisx = &this->actor;
s16 sp2A;
if (Actor_HasParent(&this->actor, play)) {
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.shape.shadowAlpha = 60;
- this->actor.room = -1;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ thisx->shape.shadowAlpha = 60;
+ thisx->room = -1;
func_80A5BD94(this);
func_80A5D964(this);
return;
@@ -976,23 +975,23 @@ void func_80A5D7C4(EnKusa2* this, PlayState* play) {
if (!func_80A5BFD8(this, play)) {
if ((this->unk_1C0 != NULL) && (this->unk_1C0->unk_1BE != 0)) {
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- if (this2->unk_1C0 != NULL) {
- sp2A = Actor_WorldYawTowardActor(&this->unk_1C0->actor, &this->actor);
- this->actor.home.rot.y = Rand_S16Offset(-1500, 3000) + sp2A;
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ if (this->unk_1C0 != NULL) {
+ sp2A = Actor_WorldYawTowardActor(&this->unk_1C0->actor, thisx);
+ thisx->home.rot.y = Rand_S16Offset(-1500, 3000) + sp2A;
}
this->unk_1C8 = Rand_S16Offset(72, 16);
- this->actor.velocity.y = 8.8f;
- Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
+ thisx->velocity.y = 8.8f;
+ Actor_PlaySfx(thisx, NA_SE_EN_NUTS_WALK);
func_80A5DC70(this);
}
- if (this->actor.xzDistToPlayer < 600.0f) {
+ if (thisx->xzDistToPlayer < 600.0f) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- if (this->actor.xzDistToPlayer < 400.0f) {
+ if (thisx->xzDistToPlayer < 400.0f) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- if (this->actor.xzDistToPlayer < 100.0f) {
- Actor_OfferCarry(&this->actor, play);
+ if (thisx->xzDistToPlayer < 100.0f) {
+ Actor_OfferCarry(thisx, play);
}
}
}
@@ -1323,7 +1322,7 @@ void func_80A5E6F0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80A5F1C0.unk_0480); i++) {
EnKusa2UnkBssSubStruct2* s = &D_80A5F1C0.unk_0480[i];
@@ -1343,7 +1342,7 @@ void func_80A5E6F0(Actor* thisx, PlayState* play) {
void func_80A5E80C(PlayState* play, s32 arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
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, 255, arg1);
diff --git a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
index 38fc47610..fd7795f7c 100644
--- a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
+++ b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c
@@ -218,7 +218,7 @@ void EnLiftNuts_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->actor.floorBgId != BGCHECK_SCENE) {
DynaPolyActor* bgActor = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId);
@@ -316,7 +316,7 @@ void func_80AEA128(EnLiftNuts* this, PlayState* play) {
}
void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
- if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && this->unk_34E == 1) {
+ if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && (this->unk_34E == 1)) {
this->actor.flags |= ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer > 120.0f) {
func_80AE9FC8(this);
@@ -326,7 +326,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
if (func_80AE9B4C(0, 0)) {
switch (CURRENT_DAY) {
case 1:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10)) {
@@ -339,7 +340,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 2:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else {
@@ -360,7 +362,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 3:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_40)) {
@@ -383,7 +386,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Flags_UnsetSwitch(play, 0x40);
Inventory_SaveDekuPlaygroundHighScore(4);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) &&
- CURRENT_DAY == 3) {
+ (CURRENT_DAY == 3)) {
this->unk_354 = 0;
Message_StartTextbox(play, 0x27F4, &this->actor);
this->textId = 0x27F4;
@@ -393,8 +396,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
}
} else {
if (((void)0, gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2]) >=
- gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < 0x2EE0) {
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < SECONDS_TO_TIMER(120)) {
Message_StartTextbox(play, 0x27F9, &this->actor);
this->textId = 0x27F9;
} else {
@@ -428,6 +431,9 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
}
} else {
@@ -435,7 +441,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
this->textId = 0x27D8;
}
func_80AEABF0(this);
- } else if (func_80AE9AC4(this, 0) || this->unk_34E == 1) {
+ } else if (func_80AE9AC4(this, 0) || (this->unk_34E == 1)) {
if (this->unk_34E == 1) {
func_800B8614(&this->actor, play, 200.0f);
} else if (this->actor.playerHeightRel >= -13.0f) {
@@ -452,7 +458,7 @@ void func_80AEA7A4(EnLiftNuts* this, PlayState* play) {
switch (this->textId) {
case 0x27E2:
if (play->msgCtx.choiceIndex == 0) { // Yes
- if (gSaveContext.save.playerData.rupees >= 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
func_8019F208();
Message_StartTextbox(play, 0x27E5, &this->actor);
this->textId = 0x27E5;
@@ -533,6 +539,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
break;
@@ -589,6 +598,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27ED, &this->actor);
this->textId = 0x27ED;
break;
+
+ default:
+ break;
}
}
}
@@ -644,6 +656,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x2000, 0x500);
@@ -668,6 +683,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
this->unk_354++;
}
break;
+
+ default:
+ break;
}
}
func_80AEB974(this);
@@ -759,7 +777,7 @@ void func_80AEB1C8(EnLiftNuts* this) {
void func_80AEB230(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > 0) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > SECONDS_TO_TIMER(0)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
func_80AEB280(this);
}
@@ -773,8 +791,8 @@ void func_80AEB294(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (player->actor.floorBgId == BG_ACTOR_MAX) &&
- player->actor.world.pos.y < 20.0f) ||
- gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= 0x2EE0) {
+ (player->actor.world.pos.y < 20.0f)) ||
+ (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= SECONDS_TO_TIMER(120))) {
player->stateFlags1 |= PLAYER_STATE1_20;
Flags_SetSwitch(play, 0x41);
func_80AEB3E0(this, play);
@@ -784,7 +802,7 @@ void func_80AEB294(EnLiftNuts* this, PlayState* play) {
player->stateFlags1 |= PLAYER_STATE1_20;
if (((void)0, gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2]) <
- gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
Flags_SetSwitch(play, 0x40);
}
Flags_SetSwitch(play, 0x41);
@@ -804,7 +822,7 @@ void func_80AEB428(EnLiftNuts* this, PlayState* play) {
if (this->unk_354 == 10) {
if (((void)0, gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2]) >
- gSaveContext.save.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
+ gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
Message_StartTextbox(play, 0x27EA, &this->actor);
this->textId = 0x27EA;
} else if (*this->ptr_1EC == 300) {
@@ -975,7 +993,7 @@ void EnLiftNuts_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->actionFunc(this, play);
func_80AEBB30(this, play);
- Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_80AE9BCC(this, play);
if (func_80AE9B4C(0, 2)) {
@@ -986,9 +1004,9 @@ void EnLiftNuts_Update(Actor* thisx, PlayState* play) {
s32 EnLiftNuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnLiftNuts* this = THIS;
- if (limbIndex == OBJECT_DNT_LIMB_0F || limbIndex == OBJECT_DNT_LIMB_10 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_17 || limbIndex == OBJECT_DNT_LIMB_18 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_1B) {
+ if ((limbIndex == OBJECT_DNT_LIMB_0F) || (limbIndex == OBJECT_DNT_LIMB_10) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_17) || (limbIndex == OBJECT_DNT_LIMB_18) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_1B)) {
*dList = NULL;
}
@@ -1009,7 +1027,7 @@ void EnLiftNuts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnLiftNuts_Draw(Actor* thisx, PlayState* play) {
EnLiftNuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnLiftNuts_OverrideLimbDraw, EnLiftNuts_PostLimbDraw, thisx);
}
diff --git a/src/overlays/actors/ovl_En_Light/z_en_light.c b/src/overlays/actors/ovl_En_Light/z_en_light.c
index 830484996..f3c3f4705 100644
--- a/src/overlays/actors/ovl_En_Light/z_en_light.c
+++ b/src/overlays/actors/ovl_En_Light/z_en_light.c
@@ -31,9 +31,9 @@ ActorInit En_Light_InitVars = {
};
typedef struct {
- /* 0x00 */ Color_RGBA8 unk_00;
- /* 0x04 */ Color_RGB8 unk_04;
- /* 0x07 */ u8 unk_07;
+ /* 0x0 */ Color_RGBA8 unk_00;
+ /* 0x4 */ Color_RGB8 unk_04;
+ /* 0x7 */ u8 unk_07;
} EnLightStruct; // size = 0x8
EnLightStruct D_808666D0[] = {
@@ -168,7 +168,7 @@ void EnLight_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->actor.params >= 0) {
gSPSegment(
diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
index 7cd1c3369..908bbf374 100644
--- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
+++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
@@ -112,7 +112,7 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 1;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
- this->pathLocation = LOOKNUTS_GET_PATROL_LOCATION(&this->actor);
+ this->pathIndex = LOOKNUTS_GET_PATH_INDEX(&this->actor);
this->switchFlag = LOOKNUTS_GET_SCENE_FLAG(&this->actor);
this->spawnIndex = LOOKNUTS_GET_SPAWN_INDEX(&this->actor);
@@ -123,7 +123,7 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
- if (this->pathLocation == 0x1F) {
+ if (this->pathIndex == LOOKNUTS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
@@ -165,17 +165,17 @@ void EnLookNuts_Patrol(EnLookNuts* this, PlayState* play) {
return;
}
- this->path = SubS_GetPathByIndex(play, this->pathLocation, 0x1F);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, LOOKNUTS_PATH_INDEX_NONE);
if (this->path != NULL) {
- sp34 = SubS_GetDistSqAndOrientPath(this->path, this->currentPathIndex, &this->actor.world.pos, &sp30);
+ sp34 = SubS_GetDistSqAndOrientPath(this->path, this->waypointIndex, &this->actor.world.pos, &sp30);
}
//! @bug sp30 is uninitialised if path == NULL. Fix by enclosing everything in the path NULL check.
if (sp30 < 10.0f) {
if (this->path != NULL) {
- this->currentPathIndex++;
- if (this->currentPathIndex >= this->path->count) {
- this->currentPathIndex = 0;
+ this->waypointIndex++;
+ if (this->waypointIndex >= this->path->count) {
+ this->waypointIndex = 0;
}
if (Rand_ZeroOne() < 0.6f) {
EnLookNuts_SetupStandAndWait(this);
@@ -389,7 +389,7 @@ void EnLookNuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
index b72215ce6..92c24cfbd 100644
--- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
+++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
@@ -10,7 +10,9 @@ typedef void (*EnLookNutsActionFunc)(struct EnLookNuts*, PlayState*);
#define LOOKNUTS_GET_SPAWN_INDEX(thisx) (((thisx)->params >> 0xC) & 0xF)
#define LOOKNUTS_GET_SCENE_FLAG(thisx) ((thisx)->params & 0x7F)
-#define LOOKNUTS_GET_PATROL_LOCATION(thisx) (((thisx)->params >> 0x7) & 0x1F)
+#define LOOKNUTS_GET_PATH_INDEX(thisx) (((thisx)->params >> 0x7) & 0x1F)
+
+#define LOOKNUTS_PATH_INDEX_NONE 0x1F
typedef struct EnLookNuts {
/* 0x000 */ Actor actor;
@@ -19,13 +21,13 @@ typedef struct EnLookNuts {
/* 0x1CA */ Vec3s morphTable[DEKU_PALACE_GUARD_LIMB_MAX];
/* 0x20C */ EnLookNutsActionFunc actionFunc;
/* 0x210 */ Path *path;
- /* 0x214 */ s16 currentPathIndex; // Index for the point where the deku guard is in its path
+ /* 0x214 */ s16 waypointIndex; // Index for the point where the deku guard is in its path
/* 0x216 */ s16 eyeState;
/* 0x218 */ s16 blinkTimer;
/* 0x21A */ s16 eventTimer; // Timer to trigger when another event within the actor will happen
/* 0x21C */ s16 state;
/* 0x21E */ s16 switchFlag;
- /* 0x220 */ s16 pathLocation; // Determines path that a guard will patrol
+ /* 0x220 */ s16 pathIndex; // Determines path that a guard will patrol
/* 0x222 */ s16 isPlayerDetected;
/* 0x224 */ s16 waitTimer; // Timer for how long the deku guard will take a break for
/* 0x226 */ s16 spawnIndex;
diff --git a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c
index 3d97839a0..463c5b327 100644
--- a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c
+++ b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c
@@ -129,7 +129,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->isCharging = false;
if (player->stateFlags2 & PLAYER_STATE2_20000) {
- if (!gSaveContext.save.playerData.isMagicAcquired || (gSaveContext.magicState != MAGIC_STATE_IDLE) ||
+ if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired || (gSaveContext.magicState != MAGIC_STATE_IDLE) ||
((ENMTHUNDER_GET_MAGIC_COST(&this->actor) != 0) &&
!Magic_Consume(play, ENMTHUNDER_GET_MAGIC_COST(&this->actor), MAGIC_CONSUME_NOW))) {
AudioSfx_PlaySfx(NA_SE_IT_ROLLING_CUT, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
@@ -144,7 +144,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->isCharging = false;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) {
- player->unk_B08[0] = 1.0f;
+ player->unk_B08 = 1.0f;
this->collider.info.toucher.damage = sDamages[this->type + ENMTHUNDER_TYPE_MAX];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_GREAT;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -155,7 +155,7 @@ void EnMThunder_Init(Actor* thisx, PlayState* play) {
this->scaleTarget = 3;
}
} else {
- player->unk_B08[0] = 0.5f;
+ player->unk_B08 = 0.5f;
this->collider.info.toucher.damage = sDamages[this->type];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_REGULAR;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -229,11 +229,11 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Actor* child = this->actor.child;
- this->unk1B0 = player->unk_B08[0];
+ this->unk1B0 = player->unk_B08;
this->actor.world.pos = player->bodyPartsPos[0];
this->actor.shape.rot.y = player->actor.shape.rot.y + 0x8000;
- if (!this->isCharging && (player->unk_B08[0] >= 0.1f)) {
+ if (!this->isCharging && (player->unk_B08 >= 0.1f)) {
if ((gSaveContext.magicState != MAGIC_STATE_IDLE) ||
((ENMTHUNDER_GET_MAGIC_COST(&this->actor) != 0) &&
!Magic_Consume(play, ENMTHUNDER_GET_MAGIC_COST(&this->actor), MAGIC_CONSUME_WAIT_PREVIEW))) {
@@ -247,8 +247,8 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
this->isCharging = true;
}
- if (player->unk_B08[0] >= 0.1f) {
- Rumble_Request(0.0f, (s32)(player->unk_B08[0] * 150.0f), 2, (s32)(player->unk_B08[0] * 150.0f));
+ if (player->unk_B08 >= 0.1f) {
+ Rumble_Request(0.0f, (s32)(player->unk_B08 * 150.0f), 2, (s32)(player->unk_B08 * 150.0f));
}
if (player->stateFlags2 & PLAYER_STATE2_20000) {
@@ -256,8 +256,8 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
child->parent = NULL;
}
- if (player->unk_B08[0] <= 0.15f) {
- if ((player->unk_B08[0] >= 0.1f) && (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) {
+ if (player->unk_B08 <= 0.15f) {
+ if ((player->unk_B08 >= 0.1f) && (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) {
AudioSfx_PlaySfx(NA_SE_IT_ROLLING_CUT, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
AudioSfx_PlaySfx(NA_SE_IT_SWORD_SWING_HARD, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale,
@@ -273,7 +273,7 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
gSaveContext.magicState = MAGIC_STATE_CONSUME_SETUP;
}
- if (player->unk_B08[0] < 0.85f) {
+ if (player->unk_B08 < 0.85f) {
this->collider.info.toucher.damage = sDamages[this->type];
this->subtype = ENMTHUNDER_SUBTYPE_SPIN_REGULAR;
if (this->type == ENMTHUNDER_TYPE_GREAT_FAIRY_SWORD) {
@@ -320,26 +320,26 @@ void EnMThunder_Charge(EnMThunder* this, PlayState* play) {
return;
}
- if (player->unk_B08[0] > 0.15f) {
+ if (player->unk_B08 > 0.15f) {
this->chargingAlpha = 255;
if (this->actor.child == NULL) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_DUST, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
EFF_DUST_TYPE_SPIN_ATTACK_CHARGE);
}
- this->adjustLightsArg1 += (((player->unk_B08[0] - 0.15f) * 1.5f) - this->adjustLightsArg1) * 0.5f;
- } else if (player->unk_B08[0] > .1f) {
- this->chargingAlpha = (s32)((player->unk_B08[0] - .1f) * 255.0f * 20.0f);
- this->lightColorFrac = (player->unk_B08[0] - .1f) * 10.0f;
+ this->adjustLightsArg1 += (((player->unk_B08 - 0.15f) * 1.5f) - this->adjustLightsArg1) * 0.5f;
+ } else if (player->unk_B08 > .1f) {
+ this->chargingAlpha = (s32)((player->unk_B08 - .1f) * 255.0f * 20.0f);
+ this->lightColorFrac = (player->unk_B08 - .1f) * 10.0f;
} else {
this->chargingAlpha = 0;
}
- if (player->unk_B08[0] > 0.85f) {
+ if (player->unk_B08 > 0.85f) {
func_8019F900(&player->actor.projectedPos, 2);
- } else if (player->unk_B08[0] > 0.15f) {
+ } else if (player->unk_B08 > 0.15f) {
func_8019F900(&player->actor.projectedPos, 1);
- } else if (player->unk_B08[0] > 0.1f) {
+ } else if (player->unk_B08 > 0.1f) {
func_8019F900(&player->actor.projectedPos, 0);
}
@@ -487,7 +487,7 @@ void EnMThunder_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -540,7 +540,7 @@ void EnMThunder_Draw(Actor* thisx, PlayState* play2) {
break;
}
- Matrix_Mult(&player->mf_CC4, MTXMODE_NEW);
+ Matrix_Mult(&player->leftHandMf, MTXMODE_NEW);
if (this->type == ENMTHUNDER_TYPE_GILDED_SWORD) {
Matrix_Translate(0.0f, 220.0f, 0.0f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
index 69bcf41b3..29a09cd90 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
@@ -44,14 +44,14 @@ void EnMa4_InitFaceExpression(EnMa4* this);
typedef enum {
/* 0 */ MA4_TYPE_DAY1,
/* 1 */ MA4_TYPE_ALIENS_DEFEATED,
- /* 2 */ MA4_TYPE_ALIENS_WON,
+ /* 2 */ MA4_TYPE_ALIENS_WON
} EnMa4Type;
typedef enum {
/* 0 */ MA4_STATE_DEFAULT,
/* 1 */ MA4_STATE_HORSEBACKGAME,
/* 2 */ MA4_STATE_AFTERHORSEBACKGAME,
- /* 3 */ MA4_STATE_AFTERDESCRIBETHEMCS,
+ /* 3 */ MA4_STATE_AFTERDESCRIBETHEMCS
} EnMa4State;
ActorInit En_Ma4_InitVars = {
@@ -163,9 +163,9 @@ void EnMa4_InitPath(EnMa4* this, PlayState* play) {
Path* path;
Vec3f nextPoint;
- path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8];
+ path = &play->setupPathList[ENMA_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
+ this->waypointIndex = 0;
this->pathPointsCount = path->count;
this->actor.home.pos.x = this->pathPoints[0].x;
@@ -190,7 +190,7 @@ void EnMa4_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &D_80AC00DC);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Actor_SetScale(&this->actor, 0.01f);
this->actor.targetMode = 0;
@@ -202,7 +202,7 @@ void EnMa4_Init(Actor* thisx, PlayState* play) {
if (CURRENT_DAY == 1) {
this->type = MA4_TYPE_DAY1;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
this->type = MA4_TYPE_ALIENS_DEFEATED;
} else {
this->type = MA4_TYPE_ALIENS_WON;
@@ -252,7 +252,7 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
s32 pad;
s16 sp2E;
- if (sAnimIndex != 9 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if ((sAnimIndex != 9) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (sAnimIndex == 3) {
if (D_80AC0250 < 3) {
D_80AC0250++;
@@ -268,13 +268,13 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
}
}
- if (sAnimIndex == 13 && Animation_OnFrame(&this->skelAnime, 37.0f)) {
+ if ((sAnimIndex == 13) && Animation_OnFrame(&this->skelAnime, 37.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ROMANI_BOW_FLICK);
}
- sp34.x = this->pathPoints[this->pathIndex].x;
- sp34.y = this->pathPoints[this->pathIndex].y;
- sp34.z = this->pathPoints[this->pathIndex].z;
+ sp34.x = this->pathPoints[this->waypointIndex].x;
+ sp34.y = this->pathPoints[this->waypointIndex].y;
+ sp34.z = this->pathPoints[this->waypointIndex].z;
sp2E = Math_Vec3f_Yaw(&this->actor.world.pos, &sp34);
if (Math_Vec3f_DistXZ(&this->actor.world.pos, &sp34) > 50.0f) {
Math_SmoothStepToS(&this->actor.world.rot.y, sp2E, 10, 0x3000, 0x100);
@@ -291,14 +291,14 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
}
}
- if (this->pathIndex < this->pathPointsCount - 1) {
- this->pathIndex++;
+ if (this->waypointIndex < (this->pathPointsCount - 1)) {
+ this->waypointIndex++;
} else {
- this->pathIndex = 0;
+ this->waypointIndex = 0;
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Actor_MoveWithGravity(&this->actor);
if (this->skelAnime.animation == &gRomaniRunAnim) {
if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 4.0f)) {
@@ -345,7 +345,7 @@ void EnMa4_Wait(EnMa4* this, PlayState* play) {
}
}
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
EnMa4_StartDialogue(this, play);
EnMa4_SetupDialogueHandler(this);
} else if (this->type != MA4_TYPE_ALIENS_WON || ABS_ALT(yaw) < 0x4000) {
@@ -374,7 +374,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
case 0x3341:
if (play->msgCtx.choiceIndex == 0) {
func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_21_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
@@ -383,14 +383,14 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x3342, &this->actor);
this->textId = 0x3342;
this->state = MA4_STATE_DEFAULT;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
case 0x3346:
if (play->msgCtx.choiceIndex == 0) {
func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_21_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
@@ -410,7 +410,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
func_8019F230();
Message_StartTextbox(play, 0x3348, &this->actor);
this->textId = 0x3348;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
@@ -422,9 +422,9 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x334E, &this->actor);
this->textId = 0x334E;
if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
- func_80151BB4(play, 0x1C);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM);
}
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else { // No.
func_8019F230();
EnMa4_SetFaceExpression(this, 0, 0);
@@ -443,7 +443,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 1, 0);
Message_StartTextbox(play, 0x3355, &this->actor);
this->textId = 0x3355;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
@@ -459,13 +459,13 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3357, &this->actor);
this->textId = 0x3357;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
func_8019F230();
EnMa4_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x335B, &this->actor);
this->textId = 0x335B;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
}
break;
@@ -480,9 +480,12 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x335A, &this->actor);
this->textId = 0x335A;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
+
+ default:
+ break;
}
}
}
@@ -502,7 +505,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3336, &this->actor);
this->textId = 0x3336;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3338:
@@ -608,12 +611,15 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
if ((gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) || !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
Message_StartTextbox(play, 0x335C, &this->actor);
this->textId = 0x335C;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3359, &this->actor);
this->textId = 0x3359;
}
break;
+
+ default:
+ break;
}
}
}
@@ -629,9 +635,6 @@ void EnMa4_SetupDialogueHandler(EnMa4* this) {
void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
- default:
- break;
-
case TEXT_STATE_CHOICE: // Player answered a question
EnMa4_HandlePlayerChoice(this, play);
break;
@@ -642,7 +645,7 @@ void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
case TEXT_STATE_DONE: // End conversation
if (Message_ShouldAdvance(play)) {
- if ((play->msgCtx.unk120B1 == 0) || !CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) || !CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
EnMa4_SetupWait(this);
}
}
@@ -652,6 +655,9 @@ void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
case TEXT_STATE_CLOSING:
case TEXT_STATE_3:
break;
+
+ default:
+ break;
}
if (this->type != MA4_TYPE_ALIENS_WON) {
@@ -780,16 +786,16 @@ void EnMa4_SetupBeginEponasSongCs(EnMa4* this) {
// Epona's Song cutscene is an ActorCutscene
void EnMa4_BeginEponasSongCs(EnMa4* this, PlayState* play) {
- s16 cutsceneIndex = this->actor.cutscene;
+ s16 csId = this->actor.csId;
- if (ActorCutscene_GetCanPlayNext(cutsceneIndex) != 0) {
- ActorCutscene_Start(cutsceneIndex, &this->actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->actor);
EnMa4_SetupEponasSongCs(this);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(cutsceneIndex);
+ CutsceneManager_Queue(csId);
}
}
@@ -798,17 +804,17 @@ void EnMa4_SetupEponasSongCs(EnMa4* this) {
this->actionFunc = EnMa4_EponasSongCs;
}
-static u16 D_80AC0260 = 99;
+static u16 sCueId = 99;
void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 120)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 120);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_120)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_120);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- if (play->csCtx.actorActions[actionIndex]->action != D_80AC0260) {
- D_80AC0260 = play->csCtx.actorActions[actionIndex]->action;
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ if (sCueId != play->csCtx.actorCues[cueChannel]->id) {
+ sCueId = play->csCtx.actorCues[cueChannel]->id;
this->animTimer = 0;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->hasBow = true;
EnMa4_ChangeAnim(this, 1);
@@ -818,12 +824,15 @@ void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) {
this->hasBow = false;
EnMa4_ChangeAnim(this, 4);
break;
+
+ default:
+ break;
}
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
- if (D_80AC0260 == 2 && this->animTimer == 0 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
+ if ((sCueId == 2) && (this->animTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMa4_ChangeAnim(this, 7);
}
} else {
@@ -831,7 +840,7 @@ void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) {
player->stateFlags1 |= PLAYER_STATE1_20;
func_800B85E0(&this->actor, play, 200.0f, PLAYER_IA_MINUS1);
- D_80AC0260 = 99;
+ sCueId = 99;
this->hasBow = true;
EnMa4_SetupEndEponasSongCs(this);
}
@@ -845,7 +854,7 @@ void EnMa4_EndEponasSongCs(EnMa4* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->actor.flags |= ACTOR_FLAG_10000;
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
Message_StartTextbox(play, 0x334C, &this->actor);
this->textId = 0x334C;
@@ -879,7 +888,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3337, &this->actor);
this->textId = 0x3337;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3335, &this->actor);
this->textId = 0x3335;
@@ -887,7 +896,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
}
} else if (this->state == MA4_STATE_DEFAULT) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_40)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM)) {
Message_StartTextbox(play, 0x3346, &this->actor);
this->textId = 0x3346;
} else {
@@ -907,9 +916,9 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
this->textId = 0x336D;
} else {
time = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
- if ((s32)time < (s32)gSaveContext.save.horseBackBalloonHighScore) {
+ if ((s32)time < (s32)gSaveContext.save.saveInfo.horseBackBalloonHighScore) {
// [Score] New record!
- gSaveContext.save.horseBackBalloonHighScore = time;
+ gSaveContext.save.saveInfo.horseBackBalloonHighScore = time;
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3350, &this->actor);
this->textId = 0x3350;
@@ -935,7 +944,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3337, &this->actor);
this->textId = 0x3337;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3335, &this->actor);
this->textId = 0x3335;
@@ -951,8 +960,8 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
this->textId = 0x3356;
} else {
time = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
- if ((s32)time < (s32)gSaveContext.save.horseBackBalloonHighScore) {
- gSaveContext.save.horseBackBalloonHighScore = time;
+ if ((s32)time < (s32)gSaveContext.save.saveInfo.horseBackBalloonHighScore) {
+ gSaveContext.save.saveInfo.horseBackBalloonHighScore = time;
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3350, &this->actor);
this->textId = 0x3350;
@@ -978,9 +987,9 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
this->textId = 0x3356;
} else {
time = gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2];
- if ((s32)time < (s32)gSaveContext.save.horseBackBalloonHighScore) {
+ if ((s32)time < (s32)gSaveContext.save.saveInfo.horseBackBalloonHighScore) {
// New record
- gSaveContext.save.horseBackBalloonHighScore = time;
+ gSaveContext.save.saveInfo.horseBackBalloonHighScore = time;
Message_StartTextbox(play, 0x335D, &this->actor);
this->textId = 0x335D;
} else {
@@ -1054,7 +1063,9 @@ void EnMa4_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
} else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1064,12 +1075,13 @@ void EnMa4_Draw(Actor* thisx, PlayState* play) {
EnMa4* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->type == MA4_TYPE_ALIENS_WON) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gRomaniWoodenBoxDL);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->mouthTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
index 91876c938..dfedd3330 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
@@ -8,6 +8,8 @@ struct EnMa4;
typedef void (*EnMa4ActionFunc)(struct EnMa4*, PlayState*);
+#define ENMA_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
+
typedef struct EnMa4 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -19,7 +21,7 @@ typedef struct EnMa4 {
/* 0x28E */ UNK_TYPE1 unk28E[0x6];
/* 0x294 */ Vec3s morphTable[ROMANI_LIMB_MAX];
/* 0x31E */ UNK_TYPE1 unk31E[0x6];
- /* 0x324 */ s16 pathIndex;
+ /* 0x324 */ s16 waypointIndex;
/* 0x326 */ s16 pathPointsCount;
/* 0x328 */ UNK_TYPE1 unk_328[0x2];
/* 0x32A */ s16 blinkTimer;
diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
index 9117e55a3..5dd713019 100644
--- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
+++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c
@@ -153,7 +153,7 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
this->unk320 = 0;
this->eyeTexIndex = 0;
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_SetFaceExpression(this, 0, 1);
} else {
EnMaYto_SetFaceExpression(this, 5, 2);
@@ -174,7 +174,7 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit2);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (EnMaYto_TryFindRomani(this, play) == 1) {
EnMaYto_SetupKeepLookingForRomani(this);
@@ -186,38 +186,39 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
s32 EnMaYto_CheckValidSpawn(EnMaYto* this, PlayState* play) {
switch (this->type) {
case MA_YTO_TYPE_DEFAULT:
- if (CURRENT_DAY == 3 && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 3) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTO_TYPE_DINNER:
- if (CURRENT_DAY != 1 && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY != 1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (((this->actor.params & 0x0F00) >> 8) != 0) {
return false;
}
} else if (((this->actor.params & 0x0F00) >> 8) == 0) {
return false;
}
- if (gSaveContext.save.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) {
+ if ((gSaveContext.save.time >= CLOCK_TIME(20, 0)) && (CURRENT_DAY == 3)) {
return false;
}
break;
case MA_YTO_TYPE_AFTERMILKRUN:
- if ((!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) ||
+ if ((!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_14_01)) {
return false;
}
break;
case MA_YTO_TYPE_4:
+ default:
break;
}
@@ -239,7 +240,7 @@ void EnMaYto_InitAnimation(EnMaYto* this, PlayState* play) {
break;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_ChangeAnim(this, 12);
} else {
EnMaYto_ChangeAnim(this, 8);
@@ -277,8 +278,8 @@ void EnMaYto_ChooseAction(EnMaYto* this, PlayState* play) {
case MA_YTO_TYPE_AFTERMILKRUN:
this->unk310 = 0;
- if ((INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) && CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) &&
- (Rand_Next() & 0x80)) {
+ if ((INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && (Rand_Next() & 0x80)) {
EnMaYto_SetupBeginWarmFuzzyFeelingCs(this);
} else {
EnMaYto_SetupAfterMilkRunInit(this);
@@ -304,8 +305,8 @@ s32 EnMaYto_SearchRomani(EnMaYto* this, PlayState* play) {
EnMaYts* romani = (EnMaYts*)npcActor;
s16 romaniType = EN_MA_YTS_GET_TYPE(&romani->actor);
- if ((this->type == MA_YTO_TYPE_DINNER && romaniType == MA_YTS_TYPE_SITTING) ||
- (this->type == MA_YTO_TYPE_BARN && romaniType == MA_YTS_TYPE_BARN)) {
+ if (((this->type == MA_YTO_TYPE_DINNER) && (romaniType == MA_YTS_TYPE_SITTING)) ||
+ ((this->type == MA_YTO_TYPE_BARN) && (romaniType == MA_YTS_TYPE_BARN))) {
this->actor.child = &romani->actor;
romani->actor.parent = &this->actor;
return true;
@@ -332,7 +333,7 @@ s32 EnMaYto_TryFindRomani(EnMaYto* this, PlayState* play) {
return 0;
case MA_YTO_TYPE_DINNER:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) && (CURRENT_DAY == 2)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) && (CURRENT_DAY == 2)) {
return 0;
}
if (EnMaYto_SearchRomani(this, play)) {
@@ -341,7 +342,7 @@ s32 EnMaYto_TryFindRomani(EnMaYto* this, PlayState* play) {
return 1;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (EnMaYto_SearchRomani(this, play)) {
return 2;
}
@@ -394,8 +395,8 @@ void EnMaYto_DefaultWait(EnMaYto* this, PlayState* play) {
s16 direction;
direction = rotY - this->actor.yawTowardsPlayer;
- if (Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) == 0 &&
- this->animIndex == 1) {
+ if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) &&
+ (this->animIndex == 1)) {
this->animIndex = 11;
EnMaYto_ChangeAnim(this, 11);
}
@@ -439,7 +440,7 @@ void EnMaYto_DefaultDialogueHandler(EnMaYto* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3000, 0x100);
- if (this->textId == 0x3395 && this->skelAnime.animation == &gCremiaSpreadArmsStartAnim &&
+ if ((this->textId == 0x3395) && (this->skelAnime.animation == &gCremiaSpreadArmsStartAnim) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 4);
}
@@ -475,7 +476,7 @@ void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 3, 1);
Message_StartTextbox(play, 0x3393, &this->actor);
this->textId = 0x3393;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x3394:
@@ -488,14 +489,17 @@ void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_ChangeAnim(this, 1);
Message_StartTextbox(play, 0x3396, &this->actor);
this->textId = 0x3396;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ break;
+
+ default:
break;
}
}
}
void EnMaYto_SetupDinnerWait(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 0);
this->unk31E = 0;
} else {
@@ -516,7 +520,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
} else {
Actor* child = this->actor.child;
- if (child != NULL && Actor_ProcessTalkRequest(child, &play->state)) {
+ if ((child != NULL) && Actor_ProcessTalkRequest(child, &play->state)) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
EnMaYto_DinnerStartDialogue(this, play);
EnMaYto_SetupDinnerDialogueHandler(this);
@@ -524,7 +528,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
func_800B8614(&this->actor, play, 120.0f);
child = this->actor.child;
- if (child != NULL && CURRENT_DAY != 2) {
+ if ((child != NULL) && (CURRENT_DAY != 2)) {
s16 childDirection = child->shape.rot.y - child->yawTowardsPlayer;
if (ABS_ALT(childDirection) < 0x4000) {
@@ -536,7 +540,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupDinnerDialogueHandler(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 1);
} else {
func_80B90E50(this, 2);
@@ -631,8 +635,8 @@ void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetRomaniFaceExpression(this, 0, 1);
Message_StartTextbox(play, 0x339E, &this->actor);
this->textId = 0x339E;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x339F:
@@ -667,27 +671,30 @@ void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x33A4, &this->actor);
this->textId = 0x33A4;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33A5:
Message_StartTextbox(play, 0x33A6, &this->actor);
this->textId = 0x33A6;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x33A7:
Message_StartTextbox(play, 0x33A8, &this->actor);
this->textId = 0x33A8;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ break;
+
+ default:
break;
}
}
}
void EnMaYto_SetupBarnWait(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_ChangeAnim(this, 13);
func_80B90E50(this, 0);
this->unk31E = 0;
@@ -711,11 +718,11 @@ void EnMaYto_BarnWait(EnMaYto* this, PlayState* play) {
} else {
Actor* child = this->actor.child;
- if (child != NULL && Actor_ProcessTalkRequest(child, &play->state)) {
+ if ((child != NULL) && Actor_ProcessTalkRequest(child, &play->state)) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
EnMaYto_BarnStartDialogue(this, play);
EnMaYto_SetupBarnDialogueHandler(this);
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) || ABS_ALT(direction) < 0x2000) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) || (ABS_ALT(direction) < 0x2000)) {
func_800B8614(&this->actor, play, 100.0f);
child = this->actor.child;
@@ -727,7 +734,7 @@ void EnMaYto_BarnWait(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupBarnDialogueHandler(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 1);
} else {
func_80B90E50(this, 2);
@@ -789,8 +796,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
Message_StartTextbox(play, 0x33AD, &this->actor);
this->textId = 0x33AD;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33AE:
@@ -807,8 +814,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x33B0, &this->actor);
this->textId = 0x33B0;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33B1:
@@ -817,7 +824,7 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
// "I should had believed what Romani said"
Message_StartTextbox(play, 0x33B2, &this->actor);
this->textId = 0x33B2;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x33C6:
@@ -864,8 +871,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetRomaniFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x33CC, &this->actor);
this->textId = 0x33CC;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
default:
@@ -875,7 +882,7 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupAfterMilkRunInit(EnMaYto* this) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
EnMaYto_SetFaceExpression(this, 3, 1);
} else {
Audio_PlayFanfare(NA_BGM_FAILURE_1);
@@ -890,7 +897,7 @@ void EnMaYto_AfterMilkRunInit(EnMaYto* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Message_StartTextbox(play, 0x33C1, &this->actor);
this->textId = 0x33C1;
} else {
@@ -901,7 +908,7 @@ void EnMaYto_AfterMilkRunInit(EnMaYto* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 4;
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
return;
}
@@ -948,6 +955,9 @@ void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetupPostMilkRunGiveReward(this);
EnMaYto_PostMilkRunGiveReward(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -981,9 +991,9 @@ void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, PlayState* play) {
this->textId = 0x33C3;
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 3;
- func_80151BB4(play, 0x20);
- func_80151BB4(play, 0x1F);
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
} else {
// You already have the mask
@@ -992,7 +1002,7 @@ void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, PlayState* play) {
this->textId = 0x33D0;
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 3;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
}
} else {
@@ -1005,14 +1015,14 @@ void EnMaYto_SetupBeginWarmFuzzyFeelingCs(EnMaYto* this) {
}
void EnMaYto_BeginWarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
EnMaYto_SetupWarmFuzzyFeelingCs(this);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -1021,20 +1031,20 @@ void EnMaYto_SetupWarmFuzzyFeelingCs(EnMaYto* this) {
this->actionFunc = EnMaYto_WarmFuzzyFeelingCs;
}
-static u16 D_80B915F0 = 99;
+static u16 sCueId = 99;
void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 556)) {
- s32 csActionIndex = Cutscene_GetActorActionIndex(play, 556);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_556)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_556);
- if (play->csCtx.frames == play->csCtx.actorActions[csActionIndex]->startFrame) {
- u16 action = play->csCtx.actorActions[csActionIndex]->action;
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ u16 cueId = play->csCtx.actorCues[cueChannel]->id;
if (1) {}
- if (action != D_80B915F0) {
- D_80B915F0 = action;
- switch (action) {
+ if (cueId != sCueId) {
+ sCueId = cueId;
+ switch (cueId) {
case 1:
EnMaYto_ChangeAnim(this, 0);
break;
@@ -1047,17 +1057,20 @@ void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) {
case 3:
EnMaYto_ChangeAnim(this, 22);
break;
+
+ default:
+ break;
}
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, csActionIndex);
- if (D_80B915F0 == 2 && this->skelAnime.animation == &gCremiaHugStartAnim &&
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
+ if ((sCueId == 2) && (this->skelAnime.animation == &gCremiaHugStartAnim) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 20);
}
} else {
- D_80B915F0 = 99;
+ sCueId = 99;
}
}
@@ -1066,14 +1079,14 @@ void EnMaYto_SetupPostMilkRunWaitDialogueEnd(EnMaYto* this) {
}
void EnMaYto_PostMilkRunWaitDialogueEnd(EnMaYto* this, PlayState* play) {
- if (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE || Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
- if (Message_ShouldAdvance(play) && Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
+ if (Message_ShouldAdvance(play) && (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Message_CloseTextbox(play);
}
}
- if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE && play->msgCtx.unk120B1 == 0) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) && (play->msgCtx.bombersNotebookEventQueueCount == 0)) {
EnMaYto_SetupPostMilkRunEnd(this);
}
}
@@ -1096,7 +1109,7 @@ void EnMaYto_PostMilkRunEnd(EnMaYto* this, PlayState* play) {
void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
if (CURRENT_DAY == 1) {
- if (Player_GetMask(play) != PLAYER_MASK_NONE && gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((Player_GetMask(play) != PLAYER_MASK_NONE) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_ROMANI:
Message_StartTextbox(play, 0x235D, &this->actor);
@@ -1141,13 +1154,13 @@ void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x33C5, &this->actor);
this->textId = 0x33C5;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
EnMaYto_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x33C4, &this->actor);
this->textId = 0x33C4;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
}
}
}
@@ -1155,7 +1168,7 @@ void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
switch (CURRENT_DAY) {
case 1:
- if (Player_GetMask(play) != PLAYER_MASK_NONE && gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((Player_GetMask(play) != PLAYER_MASK_NONE) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_ROMANI:
Message_StartTextbox(play, 0x235D, &this->actor);
@@ -1198,7 +1211,7 @@ void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
if (EnMaYto_HasSpokenToPlayer()) {
Message_StartTextbox(play, 0x33A6, &this->actor);
this->textId = 0x33A6;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
Message_StartTextbox(play, 0x33A5, &this->actor);
@@ -1210,18 +1223,21 @@ void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
if (EnMaYto_HasSpokenToPlayer()) {
Message_StartTextbox(play, 0x33A8, &this->actor);
this->textId = 0x33A8;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
Message_StartTextbox(play, 0x33A7, &this->actor);
this->textId = 0x33A7;
}
break;
+
+ default:
+ break;
}
}
void EnMaYto_BarnStartDialogue(EnMaYto* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (CURRENT_DAY == 2) {
if (this->unk310 == 1) {
Message_StartTextbox(play, 0x33AE, &this->actor);
@@ -1250,7 +1266,7 @@ void EnMaYto_BarnStartDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 5, 3);
Message_StartTextbox(play, 0x33B3, &this->actor);
this->textId = 0x33B3;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
EnMaYto_SetFaceExpression(this, 5, 3);
@@ -1324,7 +1340,7 @@ void EnMaYto_UpdateEyes(EnMaYto* this) {
void func_80B90E50(EnMaYto* this, s16 arg1) {
EnMaYts* romani = (EnMaYts*)this->actor.child;
- if (romani != NULL && romani->actor.id == ACTOR_EN_MA_YTS) {
+ if ((romani != NULL) && (romani->actor.id == ACTOR_EN_MA_YTS)) {
romani->unk_32C = arg1;
}
}
@@ -1344,7 +1360,7 @@ void EnMaYto_SetFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouth
}
void EnMaYto_InitFaceExpression(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_SetFaceExpression(this, 0, 1);
EnMaYto_SetRomaniFaceExpression(this, 0, 0);
} else {
@@ -1372,27 +1388,33 @@ s32 EnMaYto_HasSpokenToPlayerToday(void) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
}
s32 EnMaYto_HasSpokenToPlayer(void) {
- // Please note no case here has a `break`.
switch (CURRENT_DAY) {
case 3:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_10)) {
return true;
}
-
+ // fallthrough
case 2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_08)) {
return true;
}
-
+ // fallthrough
case 1:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_04)) {
return true;
}
+ break;
+
+ default:
+ break;
}
return false;
}
@@ -1410,6 +1432,9 @@ void EnMaYto_SetTalkedFlag(void) {
case 3:
SET_WEEKEVENTREG(WEEKEVENTREG_13_10);
break;
+
+ default:
+ break;
}
}
@@ -1458,11 +1483,12 @@ void EnMaYto_Draw(Actor* thisx, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- if (this->type == MA_YTO_TYPE_BARN && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+
+ if ((this->type == MA_YTO_TYPE_BARN) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gCremiaWoodenBoxDL);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyesTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
index b52378a5a..bb9c9c926 100644
--- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
+++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c
@@ -123,7 +123,7 @@ void func_80B8D12C(EnMaYts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 trackingMode = (this->unk_32C == 2) ? NPC_TRACKING_NONE : NPC_TRACKING_PLAYER_AUTO_TURN;
- if (this->unk_32C == 0 || this->actor.parent == NULL) {
+ if ((this->unk_32C == 0) || (this->actor.parent == NULL)) {
this->interactInfo.trackPos = player->actor.world.pos;
this->interactInfo.trackPos.y -= -10.0f;
} else {
@@ -144,7 +144,7 @@ void EnMaYts_InitAnimation(EnMaYts* this, PlayState* play) {
case MA_YTS_TYPE_SITTING:
this->actor.targetMode = 6;
// Day 1 or "Winning" the alien invasion
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYts_ChangeAnim(this, 14);
} else {
EnMaYts_ChangeAnim(this, 18);
@@ -177,38 +177,44 @@ s32 EnMaYts_CheckValidSpawn(EnMaYts* this, PlayState* play) {
case 2:
// Failing the alien invasion
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case 3:
// "Winning" the alien invasion
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
+
+ default:
+ break;
}
break;
case MA_YTS_TYPE_BARN:
// Failing the alien invasion
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
- } else if (gSaveContext.save.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) {
+ } else if ((gSaveContext.save.time >= CLOCK_TIME(20, 0)) && (CURRENT_DAY == 3)) {
return false;
}
break;
case MA_YTS_TYPE_SLEEPING:
// "Winning" the alien invasion
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTS_TYPE_ENDCREDITS:
break;
+
+ default:
+ break;
}
return true;
@@ -235,7 +241,7 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
this->collider.dim.radius = 40;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 0x4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
Actor_SetScale(&this->actor, 0.01f);
this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
@@ -248,7 +254,7 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
this->hasBow = false;
}
- if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
this->overrideEyeTexIndex = 0;
this->eyeTexIndex = 0;
this->mouthTexIndex = 0;
@@ -266,7 +272,8 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
this->mouthTexIndex = 0;
this->unk_32C = 2;
EnMaYts_SetupEndCreditsHandler(this);
- } else if (CURRENT_DAY == 2 && gSaveContext.save.isNight == 1 && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if ((CURRENT_DAY == 2) && (gSaveContext.save.isNight == 1) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYts_SetupStartDialogue(this);
} else {
EnMaYts_SetupDoNothing(this);
@@ -307,7 +314,7 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3362, &this->actor);
this->textId = 0x3362;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
} else if (Player_GetMask(play) != PLAYER_MASK_NONE) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_40)) {
@@ -319,9 +326,9 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x3366, &this->actor);
this->textId = 0x3366;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM)) {
EnMaYts_SetFaceExpression(this, 0, 0);
Message_StartTextbox(play, 0x3367, &this->actor);
this->textId = 0x3367;
@@ -337,7 +344,7 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 0, 0);
Message_StartTextbox(play, 0x336C, &this->actor);
this->textId = 0x336C;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
}
EnMaYts_SetupDialogueHandler(this);
@@ -377,16 +384,16 @@ void EnMaYts_SetupEndCreditsHandler(EnMaYts* this) {
this->actionFunc = EnMaYts_EndCreditsHandler;
}
-static u16 D_80B8E32C = 99;
+static u16 sCueId = 99;
void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 120)) {
- s32 actionIndex = Cutscene_GetActorActionIndex(play, 120);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_120)) {
+ s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_120);
- if (play->csCtx.frames == play->csCtx.actorActions[actionIndex]->startFrame) {
- if (play->csCtx.actorActions[actionIndex]->action != D_80B8E32C) {
- D_80B8E32C = play->csCtx.actorActions[actionIndex]->action;
+ if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
+ if (sCueId != play->csCtx.actorCues[cueChannel]->id) {
+ sCueId = play->csCtx.actorCues[cueChannel]->id;
this->endCreditsFlag = 0;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->hasBow = true;
EnMaYts_ChangeAnim(this, 0);
@@ -406,18 +413,21 @@ void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) {
this->hasBow = true;
EnMaYts_ChangeAnim(this, 20);
break;
+
+ default:
+ break;
}
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
- if ((D_80B8E32C == 2) && (this->endCreditsFlag == 0) &&
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
+ if ((sCueId == 2) && (this->endCreditsFlag == 0) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->endCreditsFlag++;
EnMaYts_ChangeAnim(this, 5);
}
} else {
- D_80B8E32C = 99;
+ sCueId = 99;
this->hasBow = true;
}
}
@@ -436,7 +446,7 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3361, &this->actor);
this->textId = 0x3361;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3363:
@@ -449,14 +459,14 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x3365, &this->actor);
this->textId = 0x3365;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3367:
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3368, &this->actor);
this->textId = 0x3368;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3369:
@@ -469,7 +479,7 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x336B, &this->actor);
this->textId = 0x336B;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
default:
@@ -526,7 +536,9 @@ void EnMaYts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
} else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -536,7 +548,8 @@ void EnMaYts_Draw(Actor* thisx, PlayState* play) {
EnMaYts* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[this->mouthTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeTexIndex]));
@@ -550,7 +563,8 @@ void EnMaYts_Draw(Actor* thisx, PlayState* play) {
// Alternative draw function
void EnMaYts_DrawSleeping(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gRomaniSleepingDL);
diff --git a/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/src/overlays/actors/ovl_En_Mag/z_en_mag.c
index 513964338..0cce91c73 100644
--- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c
+++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c
@@ -239,7 +239,7 @@ void EnMag_Update(Actor* thisx, PlayState* play) {
CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_B)) {
- if (!EnvFlags_Get(play, 4)) {
+ if (!CutsceneFlags_Get(play, 4)) {
play_sound(NA_SE_SY_PIECE_OF_HEART);
this->state = MAG_STATE_CALLED;
this->unk11F00 = 0;
@@ -383,16 +383,16 @@ void EnMag_Update(Actor* thisx, PlayState* play) {
CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_B)) {
if (play->transitionTrigger != TRANS_TRIGGER_START) {
Audio_SetCutsceneFlag(false);
- D_801BB12C++;
- if (D_801BB12C >= 2) {
- D_801BB12C = 0;
+ gOpeningEntranceIndex++;
+ if (gOpeningEntranceIndex >= 2) {
+ gOpeningEntranceIndex = 0;
}
play_sound(NA_SE_SY_PIECE_OF_HEART);
gSaveContext.gameMode = GAMEMODE_FILE_SELECT;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
play->nextEntrance = ENTRANCE(CUTSCENE, 0);
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
gSaveContext.sceneLayer = 0;
}
this->unk11F54 = 15;
@@ -438,12 +438,12 @@ void EnMag_Update(Actor* thisx, PlayState* play) {
}
if (this->state == MAG_STATE_INITIAL) {
- if (EnvFlags_Get(play, 3)) {
+ if (CutsceneFlags_Get(play, 3)) {
this->unk11F02 = 40;
this->state = MAG_STATE_FADE_IN_MASK_EFFECTS;
}
} else if (this->state < MAG_STATE_FADE_OUT) {
- if (EnvFlags_Get(play, 4)) {
+ if (CutsceneFlags_Get(play, 4)) {
this->state = MAG_STATE_FADE_OUT;
}
}
@@ -554,7 +554,7 @@ void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, TexturePtr sour
s32 pad;
s32 i;
- func_8012CA0C(&gfx);
+ Gfx_SetupDL56_Ptr(&gfx);
curTexture = source;
rectLeft = centerX - (width / 2);
@@ -709,7 +709,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
// Set segment 6 to the object, since this will be read by OVERLAY_DISP where it is not set by default.
gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment);
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
// Mask appearing effects
gDPPipeSync(gfx++);
@@ -736,7 +736,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
}
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
if (this->majorasMaskAlpha != 0) {
gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
@@ -774,7 +774,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
}
if (this->subtitleAlpha != 0) {
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -792,7 +792,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
SUBTITLE_TEX_LEFT, SUBTITLE_TEX_TOP);
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -808,7 +808,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
EnMag_DrawTextureI8(&gfx, gTitleScreenMajorasMaskSubtitleTex, SUBTITLE_TEX_WIDTH, SUBTITLE_TEX_HEIGHT,
SUBTITLE_TEX_LEFT, SUBTITLE_TEX_TOP);
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
gDPSetAlphaCompare(gfx++, G_AC_NONE);
gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -833,7 +833,7 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp) {
THE_LEGEND_OF_TEX_LEFT, THE_LEGEND_OF_TEX_TOP);
}
- func_8012C680(&gfx);
+ Gfx_SetupDL39_Ptr(&gfx);
if (this->copyrightAlpha != 0) {
gDPSetAlphaCompare(gfx++, G_AC_NONE);
diff --git a/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c b/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
index 95890455c..659ef4cb3 100644
--- a/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
+++ b/src/overlays/actors/ovl_En_Maruta/z_en_maruta.c
@@ -491,11 +491,11 @@ s32 func_80B37B78(EnMaruta* this, PlayState* play) {
s16 temp_v1 = BINANG_SUB(this->actor.yawTowardsPlayer, 0x8000);
temp_v1 = BINANG_SUB(temp_v1, player->actor.shape.rot.y);
- if ((ABS_ALT(temp_v1) < 0x1555) ||
- ((player->meleeWeaponState != 0) && ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_COMBO_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_SPIN_ATTACK_1H) ||
- (player->meleeWeaponAnimation == PLAYER_MWA_BIG_SPIN_1H)))) {
+ if ((ABS_ALT(temp_v1) < 0x1555) || ((player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ ((player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_SLASH_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_RIGHT_COMBO_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_SPIN_ATTACK_1H) ||
+ (player->meleeWeaponAnimation == PLAYER_MWA_BIG_SPIN_1H)))) {
return true;
}
return false;
@@ -700,7 +700,7 @@ void EnMaruta_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_210 == 0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
index e5855004f..94590f5b6 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
@@ -233,9 +233,9 @@ void EnMinifrog_SpawnDust(EnMinifrog* this, PlayState* play) {
vec5.z = this->actor.world.pos.z - (5.0f * Math_CosS(yaw) * Math_CosS(pitch));
for (i = 0; i < 5; i++) {
- vel.x = randPlusMinusPoint5Scaled(4.0f);
- vel.y = randPlusMinusPoint5Scaled(4.0f);
- vel.z = randPlusMinusPoint5Scaled(4.0f);
+ vel.x = Rand_CenteredFloat(4.0f);
+ vel.y = Rand_CenteredFloat(4.0f);
+ vel.z = Rand_CenteredFloat(4.0f);
accel.x = -vel.x * 0.1f;
accel.y = -vel.y * 0.1f;
accel.z = -vel.z * 0.1f;
@@ -263,7 +263,7 @@ void EnMinifrog_ReturnFrogCutscene(EnMinifrog* this, PlayState* play) {
break;
case 0xD82:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
Message_ContinueTextbox(play, 0xD83);
} else {
Message_ContinueTextbox(play, 0xD86);
@@ -277,9 +277,9 @@ void EnMinifrog_ReturnFrogCutscene(EnMinifrog* this, PlayState* play) {
Message_CloseTextbox(play);
EnMinifrog_SpawnDust(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_NPC_FADEAWAY);
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -289,14 +289,14 @@ void EnMinifrog_ReturnFrogCutscene(EnMinifrog* this, PlayState* play) {
}
if (this->flags & 1) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
this->flags &= ~1;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -319,7 +319,7 @@ void EnMinifrog_Idle(EnMinifrog* this, PlayState* play) {
EnMinifrog_JumpTimer(this);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = EnMinifrog_ReturnFrogCutscene;
- if (this->actor.cutscene != -1) {
+ if (this->actor.csId != CS_ID_NONE) {
this->flags |= 1;
}
} else if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
@@ -366,19 +366,19 @@ void EnMinifrog_CheckChoirSuccess(EnMinifrog* this, PlayState* play) {
void EnMinifrog_ContinueChoirCutscene(EnMinifrog* this, PlayState* play) {
EnMinifrog_Jump(this);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
EnMinifrog_CheckChoirSuccess(this, play);
return; // necessary to match
- } else if (ActorCutscene_GetCanPlayNext(0x7C)) {
- ActorCutscene_Start(0x7C, NULL);
+ } else if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_Start(CS_ID_GLOBAL_TALK, NULL);
EnMinifrog_CheckChoirSuccess(this, play);
return; // necessary to match
- } else if (this->actor.cutscene != -1 && ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
- ActorCutscene_SetIntentToPlay(0x7C);
+ } else if ((this->actor.csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->actor.csId)) {
+ CutsceneManager_Stop(this->actor.csId);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
return; // necessary to match
} else {
- ActorCutscene_SetIntentToPlay(0x7C);
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
}
@@ -400,7 +400,7 @@ void EnMinifrog_NextFrogReturned(EnMinifrog* this, PlayState* play) {
this->actionFunc = EnMinifrog_ContinueChoirCutscene;
this->flags &= ~(0x2 << MINIFROG_YELLOW | 0x2 << MINIFROG_CYAN | 0x2 << MINIFROG_PINK | 0x2 << MINIFROG_BLUE |
0x2 << MINIFROG_WHITE);
- play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, 0);
+ play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, ANIMMODE_LOOP);
}
}
@@ -431,7 +431,7 @@ void EnMinifrog_SetupNextFrogChoir(EnMinifrog* this, PlayState* play) {
this->flags &= ~0x100;
this->flags &= ~(0x2 << MINIFROG_YELLOW | 0x2 << MINIFROG_CYAN | 0x2 << MINIFROG_PINK | 0x2 << MINIFROG_BLUE |
0x2 << MINIFROG_WHITE);
- play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, 0);
+ play->setPlayerTalkAnim(play, &gPlayerAnim_link_normal_talk_free_wait, ANIMMODE_LOOP);
} else if (this->timer <= 0) {
this->actionFunc = EnMinifrog_NextFrogReturned;
this->timer = 30;
@@ -440,20 +440,20 @@ void EnMinifrog_SetupNextFrogChoir(EnMinifrog* this, PlayState* play) {
void EnMinifrog_BeginChoirCutscene(EnMinifrog* this, PlayState* play) {
EnMinifrog_Jump(this);
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->actionFunc = EnMinifrog_SetupNextFrogChoir;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
this->actionFunc = EnMinifrog_SetupNextFrogChoir;
this->timer = 5;
func_801A1F00(3, NA_BGM_FROG_SONG);
this->flags |= 0x100;
- play->setPlayerTalkAnim(play, &gPlayerAnim_pn_gakkiplay, 0);
+ play->setPlayerTalkAnim(play, &gPlayerAnim_pn_gakkiplay, ANIMMODE_LOOP);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -573,7 +573,9 @@ void EnMinifrog_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 12.0f, 0.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 12.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
this->actor.focus.rot.y = this->actor.shape.rot.y;
@@ -606,9 +608,11 @@ void EnMinifrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
if ((limbIndex == 7) || (limbIndex == 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, *dList);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -626,12 +630,14 @@ void EnMinifrog_Draw(Actor* thisx, PlayState* play) {
Color_RGBA8* envColor;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
envColor = &sEnMinifrogColor[this->frogIndex];
gSPSegment(POLY_OPA_DISP++, 0x08, D_808A4D74[0]);
gSPSegment(POLY_OPA_DISP++, 0x09, D_808A4D74[0]);
gDPSetEnvColor(POLY_OPA_DISP++, envColor->r, envColor->g, envColor->b, envColor->a);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMinifrog_OverrideLimbDraw, EnMinifrog_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
index 9a3801d91..3e321cc56 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
@@ -19,9 +19,9 @@ typedef enum {
} MinifrogType;
typedef enum {
- /* 0x00 */ MINIFROG_STATE_JUMP,
- /* 0x01 */ MINIFROG_STATE_AIR,
- /* 0x02 */ MINIFROG_STATE_GROUND
+ /* 0 */ MINIFROG_STATE_JUMP,
+ /* 1 */ MINIFROG_STATE_AIR,
+ /* 2 */ MINIFROG_STATE_GROUND
} MinifrogJumpState;
typedef struct EnMinifrog {
diff --git a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
index 4aa052549..68d08b223 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
@@ -80,7 +80,7 @@ typedef enum {
/* 0x2 */ MINISLIME_DMGEFF_FIRE = 0x2,
/* 0x3 */ MINISLIME_DMGEFF_ICE,
/* 0xE */ MINISLIME_DMGEFF_HOOKSHOT = 0xE,
- /* 0xF */ MINISLIME_DMGEFF_BREAK_ICE,
+ /* 0xF */ MINISLIME_DMGEFF_BREAK_ICE
} MinislimeDamageEffect;
static DamageTable sDamageTable = {
@@ -174,20 +174,20 @@ void EnMinislime_CheckBackgroundCollision(EnMinislime* this) {
}
void EnMinislime_AddIceShardEffect(EnMinislime* this) {
+ s32 pad;
EnBigslime* bigslime = (EnBigslime*)this->actor.parent;
EnBigslimeIceShardEffect* iceShardEffect;
s32 i = 10 * this->id + BIGSLIME_NUM_VTX;
s32 i_end = i + 10;
- VecSph vecSph;
-
- vecSph.yaw = 0;
+ s16 pitch;
+ s16 yaw = 0;
for (; i < i_end; i++) {
iceShardEffect = &bigslime->iceShardEffect[i];
- vecSph.pitch = Rand_S16Offset(0x1000, 0x3000);
- iceShardEffect->velocity.x = Math_CosS(vecSph.pitch) * Math_SinS(vecSph.yaw);
- iceShardEffect->velocity.y = Math_SinS(vecSph.pitch);
- iceShardEffect->velocity.z = Math_CosS(vecSph.pitch) * Math_CosS(vecSph.yaw);
+ pitch = Rand_S16Offset(0x1000, 0x3000);
+ iceShardEffect->velocity.x = Math_CosS(pitch) * Math_SinS(yaw);
+ iceShardEffect->velocity.y = Math_SinS(pitch);
+ iceShardEffect->velocity.z = Math_CosS(pitch) * Math_CosS(yaw);
iceShardEffect->pos.x = this->actor.world.pos.x + (400.0f * this->actor.scale.x) * iceShardEffect->velocity.x;
iceShardEffect->pos.y =
this->actor.world.pos.y + (((iceShardEffect->velocity.y * 2.0f) - 1.0f) * 400.0f * this->actor.scale.y);
@@ -198,7 +198,7 @@ void EnMinislime_AddIceShardEffect(EnMinislime* this) {
iceShardEffect->isEnabled = true;
Math_Vec3f_ScaleAndStore(&iceShardEffect->velocity, Rand_ZeroFloat(3.0f) + 7.0f, &iceShardEffect->velocity);
iceShardEffect->scale = (Rand_ZeroFloat(6.0f) + 2.0f) * 0.001f;
- vecSph.yaw += 0x1999;
+ yaw += 0x1999;
}
this->frozenAlpha = 0;
@@ -209,11 +209,11 @@ void EnMinislime_AddIceSmokeEffect(EnMinislime* this, PlayState* play) {
Vec3f pos;
Vec3f vel;
- pos.x = (randPlusMinusPoint5Scaled(200.0f) * this->actor.scale.x) + this->actor.world.pos.x;
+ pos.x = (Rand_CenteredFloat(200.0f) * this->actor.scale.x) + this->actor.world.pos.x;
pos.y = CLAMP_MIN(this->actor.world.pos.y, GBT_ROOM_5_MIN_Y + 30.0f);
- pos.z = (randPlusMinusPoint5Scaled(200.0f) * this->actor.scale.z) + this->actor.world.pos.z;
- vel.x = randPlusMinusPoint5Scaled(1.5f);
- vel.z = randPlusMinusPoint5Scaled(1.5f);
+ pos.z = (Rand_CenteredFloat(200.0f) * this->actor.scale.z) + this->actor.world.pos.z;
+ vel.x = Rand_CenteredFloat(1.5f);
+ vel.z = Rand_CenteredFloat(1.5f);
vel.y = 2.0f;
EffectSsIceSmoke_Spawn(play, &pos, &vel, &gZeroVec3f, 500);
}
@@ -401,8 +401,8 @@ void EnMinislime_GrowAndShrink(EnMinislime* this, PlayState* play) {
this->growShrinkTimer--;
scaleFactor = (this->growShrinkTimer / 6) + 1.0f;
this->actor.scale.z = this->actor.scale.x =
- ((cos_rad(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * (2.0f / 30.0f))) + 1.5f) * 0.1f;
- this->actor.scale.y = ((sin_rad(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * 0.05f)) + 0.75f) * 0.1f;
+ ((Math_CosF(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * (2.0f / 30.0f))) + 1.5f) * 0.1f;
+ this->actor.scale.y = ((Math_SinF(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * 0.05f)) + 0.75f) * 0.1f;
if (this->actor.params == MINISLIME_SETUP_GEKKO_THROW) {
EnMinislime_SetupMoveToGekko(this);
} else if ((this->actor.xzDistToPlayer < 150.0f) && (this->growShrinkTimer < 38)) {
@@ -424,11 +424,12 @@ void EnMinislime_Idle(EnMinislime* this, PlayState* play) {
f32 speedXZ;
this->idleTimer--;
- speedXZ = sin_rad(this->idleTimer * (M_PI / 10));
+ speedXZ = Math_SinF(this->idleTimer * (M_PI / 10));
this->actor.speed = speedXZ * 1.5f;
this->actor.speed = CLAMP_MIN(this->actor.speed, 0.0f);
Math_StepToF(&this->actor.scale.x, ((0.14f * speedXZ) + 1.5f) * 0.1f, 0.010000001f);
- Math_StepToF(&this->actor.scale.y, ((cos_rad(this->idleTimer * (M_PI / 10)) * 0.07f) + 0.75f) * 0.1f, 0.010000001f);
+ Math_StepToF(&this->actor.scale.y, ((Math_CosF(this->idleTimer * (M_PI / 10)) * 0.07f) + 0.75f) * 0.1f,
+ 0.010000001f);
Math_StepToF(&this->actor.scale.z, 0.3f - this->actor.scale.x, 0.010000001f);
if (this->idleTimer == 0) {
if (this->actor.xzDistToPlayer < 300.0f) {
@@ -537,13 +538,13 @@ void EnMinislime_Knockback(EnMinislime* this, PlayState* play) {
this->knockbackTimer--;
Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
sqrtFrozenTimer = sqrtf(this->knockbackTimer);
- this->actor.scale.x = ((cos_rad(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.15f;
+ this->actor.scale.x = ((Math_CosF(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.15f;
this->actor.scale.z = this->actor.scale.x;
if (this->knockbackTimer == 15) {
this->collider.base.acFlags |= AC_ON;
}
- this->actor.scale.y = ((sin_rad(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.075f;
+ this->actor.scale.y = ((Math_SinF(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.075f;
if (this->actor.params == MINISLIME_SETUP_GEKKO_THROW) {
EnMinislime_SetupMoveToGekko(this);
} else if (this->knockbackTimer == 0) {
@@ -575,9 +576,10 @@ void EnMinislime_DefeatIdle(EnMinislime* this, PlayState* play) {
f32 xzScale;
this->idleTimer--;
- xzScale = sin_rad(this->idleTimer * (M_PI / 10));
+ xzScale = Math_SinF(this->idleTimer * (M_PI / 10));
Math_StepToF(&this->actor.scale.x, ((0.14f * xzScale) + 1.5f) * 0.1f, 0.010000001f);
- Math_StepToF(&this->actor.scale.y, ((0.07f * cos_rad(this->idleTimer * (M_PI / 10))) + 0.75f) * 0.1f, 0.010000001f);
+ Math_StepToF(&this->actor.scale.y, ((0.07f * Math_CosF(this->idleTimer * (M_PI / 10))) + 0.75f) * 0.1f,
+ 0.010000001f);
Math_StepToF(&this->actor.scale.z, 0.3f - this->actor.scale.x, 0.010000001f);
if (this->idleTimer == 0) {
this->idleTimer = 20;
@@ -670,9 +672,9 @@ void EnMinislime_GekkoThrow(EnMinislime* this, PlayState* play) {
f32 xzScale;
this->throwTimer--;
- xzScale = sin_rad(this->throwTimer * (M_PI / 5));
+ xzScale = Math_SinF(this->throwTimer * (M_PI / 5));
this->actor.scale.x = ((0.3f * xzScale) + 1.5f) * 0.1f;
- this->actor.scale.y = ((cos_rad(this->throwTimer * (M_PI / 5)) * 0.2f) + 0.75f) * 0.1f;
+ this->actor.scale.y = ((Math_CosF(this->throwTimer * (M_PI / 5)) * 0.2f) + 0.75f) * 0.1f;
this->actor.scale.z = 0.3f - this->actor.scale.x;
if (this->throwTimer == 0) {
this->throwTimer = 10;
diff --git a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
index 77cabe9b6..8d29f2b8a 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
@@ -21,13 +21,13 @@ typedef enum {
/* 0x8 */ MINISLIME_DEFEAT_MELT,
/* 0x9 */ MINISLIME_DESPAWN,
/* 0xA */ MINISLIME_SETUP_GEKKO_THROW,
- /* 0xB */ MINISLIME_GEKKO_THROW,
+ /* 0xB */ MINISLIME_GEKKO_THROW
} EnMinislimeState;
typedef enum {
- /* 0x0 */ MINISLIME_INACTIVE_STATE,
- /* 0x1 */ MINISLIME_ACTIVE_CONTINUE_STATE,
- /* 0x2 */ MINISLIME_ACTIVE_INIT_STATE,
+ /* 0 */ MINISLIME_INACTIVE_STATE,
+ /* 1 */ MINISLIME_ACTIVE_CONTINUE_STATE,
+ /* 2 */ MINISLIME_ACTIVE_INIT_STATE
} EnMinislimeActiveState;
typedef struct EnMinislime {
diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.c b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
index ced5f991b..92a3ff91e 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.c
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.c
@@ -76,7 +76,7 @@ s32 func_809592E0(EnMk* this, s16 index) {
void EnMk_Init(Actor* thisx, PlayState* play) {
EnMk* this = THIS;
- s16 cs;
+ s16 csId;
s32 i;
this->actor.terminalVelocity = -4.0f;
@@ -101,16 +101,16 @@ void EnMk_Init(Actor* thisx, PlayState* play) {
this->unk_27A |= 2;
}
- cs = this->actor.cutscene;
- for (i = 0; i < ARRAY_COUNT(this->unk_276); i++) {
- this->unk_276[i] = cs;
- if (cs != -1) {
- this->actor.cutscene = cs;
- cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ csId = this->actor.csId;
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
- this->actor.cutscene = this->unk_276[0];
+ this->actor.csId = this->csIdList[0];
}
void EnMk_Destroy(Actor* thisx, PlayState* play) {
@@ -120,20 +120,20 @@ void EnMk_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80959524(PlayState* play) {
- return gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 7;
+ return gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 7;
}
void func_8095954C(EnMk* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 0x7F)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 0x7F));
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_127)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_127));
- switch (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x7F)]->action) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_127)]->id) {
case 1:
case 2:
case 3:
case 4:
case 5:
- func_809592E0(this, play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x7F)]->action - 1);
+ func_809592E0(this, play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_127)]->id - 1);
break;
}
} else {
@@ -147,7 +147,7 @@ void func_80959624(EnMk* this, PlayState* play) {
if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
if (this->unk_27A & 4) {
textId = 0xFB9;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
textId = 0xFBC;
} else {
textId = 0xFBB;
@@ -212,7 +212,7 @@ void func_80959844(EnMk* this, PlayState* play) {
switch (gSaveContext.save.playerForm) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_10)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
textId = 0xFAF;
} else {
textId = 0xFAE;
@@ -224,7 +224,7 @@ void func_80959844(EnMk* this, PlayState* play) {
case PLAYER_FORM_GORON:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_08)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
textId = 0xFAB;
} else {
textId = 0xFAA;
@@ -239,7 +239,7 @@ void func_80959844(EnMk* this, PlayState* play) {
if (func_80959524(play) > 0) {
textId = 0xFA7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_19_04)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
textId = 0xFBF;
} else {
textId = 0xFA6;
@@ -283,7 +283,7 @@ void func_80959A24(EnMk* this, PlayState* play) {
break;
case 0xFA2:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Message_CloseTextbox(play);
this->actionFunc = func_80959E18;
} else {
@@ -314,7 +314,7 @@ void func_80959A24(EnMk* this, PlayState* play) {
case 0xFA8:
SET_WEEKEVENTREG(WEEKEVENTREG_19_08);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Message_ContinueTextbox(play, 0xFBD);
} else {
Message_ContinueTextbox(play, 0xFA9);
@@ -323,7 +323,7 @@ void func_80959A24(EnMk* this, PlayState* play) {
case 0xFAC:
SET_WEEKEVENTREG(WEEKEVENTREG_19_10);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Message_ContinueTextbox(play, 0xFBE);
} else {
Message_ContinueTextbox(play, 0xFAD);
@@ -372,7 +372,7 @@ void func_80959C94(EnMk* this, PlayState* play) {
void func_80959D28(EnMk* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if ((play->csCtx.state == 0) && (this->actor.cutscene == -1)) {
+ if ((play->csCtx.state == CS_STATE_IDLE) && (this->actor.csId == CS_ID_NONE)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_40)) {
this->unk_27A &= ~1;
this->actionFunc = func_80959774;
@@ -381,14 +381,14 @@ void func_80959D28(EnMk* this, PlayState* play) {
} else {
this->actionFunc = func_80959E18;
}
- this->actor.cutscene = this->unk_276[0];
+ this->actor.csId = this->csIdList[0];
} else {
- if (this->actor.cutscene != -1) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
- this->actor.cutscene = -1;
+ if (this->actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
+ this->actor.csId = CS_ID_NONE;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
func_8095954C(this, play);
@@ -412,13 +412,13 @@ void func_80959E18(EnMk* this, PlayState* play) {
play->msgCtx.ocarinaMode = 4;
this->actionFunc = func_80959D28;
if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
- this->actor.cutscene = this->unk_276[0];
+ this->actor.csId = this->csIdList[0];
SET_WEEKEVENTREG(WEEKEVENTREG_20_40);
Item_Give(play, ITEM_SONG_NOVA);
} else {
- this->actor.cutscene = this->unk_276[1];
+ this->actor.csId = this->csIdList[1];
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80959844(this, play);
this->actionFunc = func_80959A24;
@@ -445,11 +445,11 @@ void EnMk_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
- if ((this->unk_27A & 1) && !Cutscene_CheckActorAction(play, 0x7F)) {
+ if ((this->unk_27A & 1) && !Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_127)) {
Actor_TrackPlayer(play, &this->actor, &this->unk_270, &sp38, this->actor.focus.pos);
} else {
Math_SmoothStepToS(&this->unk_270.x, 0, 6, 0x1838, 0x64);
@@ -480,7 +480,7 @@ void EnMk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
void EnMk_Draw(Actor* thisx, PlayState* play) {
EnMk* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMk_OverrideLimbDraw, EnMk_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Mk/z_en_mk.h b/src/overlays/actors/ovl_En_Mk/z_en_mk.h
index bbf126f4e..518b0406d 100644
--- a/src/overlays/actors/ovl_En_Mk/z_en_mk.h
+++ b/src/overlays/actors/ovl_En_Mk/z_en_mk.h
@@ -15,7 +15,7 @@ typedef struct EnMk {
/* 0x1D4 */ Vec3s jointTable[OBJECT_MK_LIMB_MAX];
/* 0x222 */ Vec3s morphTable[OBJECT_MK_LIMB_MAX];
/* 0x270 */ Vec3s unk_270;
- /* 0x276 */ s16 unk_276[2];
+ /* 0x276 */ s16 csIdList[2];
/* 0x27A */ u16 unk_27A;
/* 0x27C */ s16 unk_27C;
/* 0x280 */ EnMkActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
index 7da0b46e3..4e9af5578 100644
--- a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
+++ b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
@@ -274,7 +274,7 @@ void func_80A4E2E8(EnMkk* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_150, this->actor.yawTowardsPlayer, 0x400);
}
this->actor.shape.rot.y =
- (s32)(sin_rad(this->unk_14E * ((2 * M_PI) / 15)) * (614.4f * this->actor.speed)) + this->unk_150;
+ (s32)(Math_SinF(this->unk_14E * ((2 * M_PI) / 15)) * (614.4f * this->actor.speed)) + this->unk_150;
func_800B9010(&this->actor, NA_SE_EN_KUROSUKE_MOVE - SFX_FLAG);
if (sp20) {
this->unk_14B &= ~2;
@@ -379,16 +379,16 @@ void func_80A4E84C(EnMkk* this) {
this->unk_154.y = this->actor.world.pos.y;
this->unk_154.x = this->actor.world.pos.x -
10.0f * Math_SinS(this->actor.shape.rot.y +
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_154.z = this->actor.world.pos.z -
10.0f * Math_CosS(this->actor.shape.rot.y +
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_160.x = this->unk_154.x -
12.0f * Math_SinS(this->actor.shape.rot.y -
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_160.z = this->unk_154.z -
12.0f * Math_CosS(this->actor.shape.rot.y -
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
}
}
@@ -415,7 +415,9 @@ void EnMkk_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
this->actor.world.rot.y = this->actor.shape.rot.y;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->actor.params == 0) {
func_80A4E84C(this);
}
@@ -522,7 +524,7 @@ void EnMkk_Draw(Actor* thisx, PlayState* play) {
if (this->alpha == 255) {
primColors = &D_80A4F7C4[this->primColorSelect];
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetPrimColor(&gfx[1], 0, 0xFF, primColors->r, primColors->g, primColors->b, primColors->a);
gSPSegment(&gfx[2], 0x08, D_801AEFA0);
gSPMatrix(&gfx[3], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -530,7 +532,7 @@ void EnMkk_Draw(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = &gfx[5];
}
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPDisplayList(&gfx[2], dLists->unk0);
Matrix_ReplaceRotation(&play->billboardMtxF);
@@ -574,7 +576,7 @@ void func_80A4F4C8(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->alpha);
gSPDisplayList(&gfx[2], dLists->unk0);
Matrix_ReplaceRotation(&play->billboardMtxF);
diff --git a/src/overlays/actors/ovl_En_Mm/z_en_mm.c b/src/overlays/actors/ovl_En_Mm/z_en_mm.c
index cc2e5803e..a0a308ef9 100644
--- a/src/overlays/actors/ovl_En_Mm/z_en_mm.c
+++ b/src/overlays/actors/ovl_En_Mm/z_en_mm.c
@@ -87,7 +87,7 @@ void EnMm_Init(Actor* thisx, PlayState* play) {
func_80965BBC(this);
return;
}
- if (this->actor.cutscene >= 0) {
+ if (this->actor.csId >= 0) {
action = func_80965D3C;
} else {
action = func_80965DB4;
@@ -102,13 +102,13 @@ void EnMm_Destroy(Actor* thisx, PlayState* play) {
}
void func_80965D3C(EnMm* this, PlayState* play) {
- s16 cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ s16 csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- if (ActorCutscene_GetCanPlayNext(cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(cutscene, &this->actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
EnMm_SetupAction(this, func_80965DB4);
} else {
- ActorCutscene_SetIntentToPlay(cutscene);
+ CutsceneManager_Queue(csId);
}
}
@@ -149,7 +149,8 @@ void func_80965DB4(EnMm* this, PlayState* play) {
temp_f2 = sqrtf(SQ(temp_f14) + SQ(temp_f12));
if ((temp_f2 < this->actor.speed) ||
- (SurfaceType_GetSlope(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 1)) {
+ (SurfaceType_GetFloorEffect(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) ==
+ FLOOR_EFFECT_1)) {
this->actor.speed = CLAMP_MAX(temp_f2, 16.0f);
this->actor.world.rot.y = Math_Atan2S_XY(temp_f12, temp_f14);
}
@@ -200,7 +201,9 @@ void EnMm_Update(Actor* thisx, PlayState* play) {
Collider_ResetCylinderAC(play, &this->collider.base);
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 20.0f, 31);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
Actor_SetFocus(&this->actor, 20.0f);
}
@@ -208,7 +211,8 @@ void EnMm_Draw(Actor* thisx, PlayState* play) {
EnMm* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_190 != 0) {
s16 rotY = this->actor.world.rot.y - this->actor.shape.rot.y;
@@ -218,5 +222,6 @@ void EnMm_Draw(Actor* thisx, PlayState* play) {
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_055628);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
index 48a379304..5c6adcd8a 100644
--- a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
+++ b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c
@@ -82,7 +82,7 @@ void EnMm2_Update(Actor* thisx, PlayState* play) {
void EnMm2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sEnMm2DL);
diff --git a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
index 1fc29eafc..ab387771c 100644
--- a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
+++ b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
@@ -92,7 +92,7 @@ void EnMm3_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.parent = NULL;
this->actor.targetMode = 0;
this->unk_1DC = 1;
@@ -148,7 +148,7 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
case 0x278E:
if (play->msgCtx.choiceIndex == 0) {
if (this->unk_2B2 & 0x20) {
- if (gSaveContext.save.playerData.rupees >= play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
func_8019F208();
Message_StartTextbox(play, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
@@ -157,7 +157,7 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
} else {
func_8019F208();
@@ -168,13 +168,13 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
func_8019F230();
Message_StartTextbox(play, 0x278F, &this->actor);
this->unk_2B4 = 0x278F;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
break;
case 0x279A:
if (play->msgCtx.choiceIndex == 0) {
- if (gSaveContext.save.playerData.rupees >= play->msgCtx.unk1206C) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= play->msgCtx.unk1206C) {
func_8019F208();
Message_StartTextbox(play, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
@@ -183,13 +183,13 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
} else {
func_8019F230();
Message_StartTextbox(play, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
break;
}
@@ -282,7 +282,7 @@ void func_80A6F5E4(EnMm3* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
Message_StartTextbox(play, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
} else {
Message_StartTextbox(play, 0x2798, &this->actor);
this->unk_2B4 = 0x2798;
@@ -448,8 +448,8 @@ void func_80A6FEEC(EnMm3* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
Message_StartTextbox(play, 0x2794, &this->actor);
this->unk_2B4 = 0x2794;
- func_80151BB4(play, 0xB);
- func_80151BB4(play, 0x2B);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP);
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80A6F9C8(this);
} else {
@@ -561,7 +561,7 @@ void EnMm3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A704FC[this->unk_1DC]));
gSPSegment(POLY_OPA_DISP++, 0x0C, sEnMm3DL);
diff --git a/src/overlays/actors/ovl_En_Ms/z_en_ms.c b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
index d7a4fff3d..732fc9b3b 100644
--- a/src/overlays/actors/ovl_En_Ms/z_en_ms.c
+++ b/src/overlays/actors/ovl_En_Ms/z_en_ms.c
@@ -83,7 +83,7 @@ void EnMs_Destroy(Actor* thisx, PlayState* play) {
void EnMs_Wait(EnMs* this, PlayState* play) {
s16 yawDiff = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
- if (gSaveContext.save.inventory.items[SLOT_MAGIC_BEANS] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_MAGIC_BEANS] == ITEM_NONE) {
this->actor.textId = 0x92E; // "[...] You're the first customer [...]"
} else {
this->actor.textId = 0x932; // "[...] So you liked my Magic Beans [...]"
@@ -118,7 +118,7 @@ void EnMs_Talk(EnMs* this, PlayState* play) {
switch (play->msgCtx.choiceIndex) {
case 0: // yes
Message_CloseTextbox(play);
- if (gSaveContext.save.playerData.rupees < 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x935); // "[...] You don't have enough Rupees."
} else if (AMMO(ITEM_MAGIC_BEANS) >= 20) {
@@ -181,7 +181,7 @@ void EnMs_Update(Actor* thisx, PlayState* play) {
void EnMs_Draw(Actor* thisx, PlayState* play) {
EnMs* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
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 e772e12fa..db05f0d61 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
@@ -23,9 +23,9 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play);
void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play);
typedef enum {
- GORON_RACE_CHEAT_NO_CHEATING,
- GORON_RACE_CHEAT_FALSE_START,
- GORON_RACE_CHEAT_TRYING_TO_REACH_GOAL_FROM_BEHIND,
+ /* 0 */ GORON_RACE_CHEAT_NO_CHEATING,
+ /* 1 */ GORON_RACE_CHEAT_FALSE_START,
+ /* 2 */ GORON_RACE_CHEAT_TRYING_TO_REACH_GOAL_FROM_BEHIND
} PlayerCheatStatus;
ActorInit En_Mt_tag_InitVars = {
@@ -235,7 +235,7 @@ s32 EnMttag_UpdateCheckpoints(EnMttag* this, PlayState* play) {
s32 EnMttag_ExitRace(PlayState* play, s32 transitionType, s32 nextTransitionType) {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = ITEM_SWORD_KOKIRI;
play->nextEntrance = ENTRANCE(GORON_RACETRACK, 2);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
// Spring
gSaveContext.nextCutsceneIndex = 0xFFF0;
} else {
@@ -256,7 +256,7 @@ s32 EnMttag_ExitRace(PlayState* play, s32 transitionType, s32 nextTransitionType
void EnMttag_ShowFalseStartMessage(EnMttag* this, PlayState* play) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_OFF;
Message_StartTextbox(play, 0xE95, NULL); // An entrant made a false start
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20);
this->actionFunc = EnMttag_PotentiallyRestartRace;
}
@@ -267,7 +267,7 @@ void EnMttag_ShowFalseStartMessage(EnMttag* this, PlayState* play) {
*/
void EnMttag_ShowCantWinMessage(EnMttag* this, PlayState* play) {
Message_StartTextbox(play, 0xE97, NULL); // You can't win now...
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = EnMttag_HandleCantWinChoice;
}
@@ -275,11 +275,11 @@ void EnMttag_ShowCantWinMessage(EnMttag* this, PlayState* play) {
* Shows the cutscene that pans over the race track and shows all five race entrants.
*/
void EnMttag_ShowIntroCutscene(EnMttag* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = EnMttag_WaitForIntroCutsceneToEnd;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -288,7 +288,7 @@ void EnMttag_ShowIntroCutscene(EnMttag* this, PlayState* play) {
* from showing again and starts the race.
*/
void EnMttag_WaitForIntroCutsceneToEnd(EnMttag* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
SET_WEEKEVENTREG(WEEKEVENTREG_12_02);
this->actionFunc = EnMttag_RaceStart;
}
@@ -421,7 +421,7 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) {
if (this->shouldRestartRace) {
play->nextEntrance = ENTRANCE(GORON_RACETRACK, 1);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
// Spring
gSaveContext.nextCutsceneIndex = 0xFFF0;
} else {
@@ -433,7 +433,7 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) {
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
Message_CloseTextbox(play);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
CLEAR_EVENTINF(EVENTINF_10);
@@ -468,7 +468,7 @@ void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play) {
// Keep racing
func_8019F208();
Message_CloseTextbox(play);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_END);
CLEAR_EVENTINF(EVENTINF_13);
this->timer = 100;
this->actionFunc = EnMttag_Race;
diff --git a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
index b5bc6610e..98b01d728 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
@@ -178,7 +178,7 @@ void func_80A68A78(EnMushi2* this, PlayState* play) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_MUSHI2, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.shape.rot.x,
this->actor.shape.rot.y + (D_80A6B998 + i)->unk_02, this->actor.shape.rot.z,
- (D_80A6B998 + i)->unk_00, this->actor.cutscene, this->actor.halfDaysBits, NULL);
+ (D_80A6B998 + i)->unk_00, this->actor.csId, this->actor.halfDaysBits, NULL);
}
}
@@ -439,7 +439,8 @@ void func_80A69388(EnMushi2* this) {
}
void func_80A69424(EnMushi2* this, PlayState* play) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 8.0f, 9.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 8.0f, 9.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
}
s32 func_80A69468(EnMushi2* this, PlayState* play) {
@@ -850,14 +851,14 @@ void func_80A6A508(Actor* thisx) {
}
void func_80A6A5C0(EnMushi2* this, PlayState* play) {
- EnMushi2* this2 = this;
+ Actor* thisx = &this->actor;
func_80A69D3C(this);
- Math_SmoothStepToF(&this->actor.speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
if (this->unk_354 < SQ(40.0f)) {
f32 temp = 1.0f - ((SQ(40.0f) - this->unk_354) * (1.0f / (10.0f * SQ(40.0f))));
- this->actor.speed *= temp;
+ thisx->speed *= temp;
}
func_80A68ED8(this);
@@ -866,8 +867,8 @@ void func_80A6A5C0(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = this->actor.speed * 1.6f;
- this2->skelAnime.playSpeed = CLAMP(this2->skelAnime.playSpeed, 0.1f, 1.9f);
+ this->skelAnime.playSpeed = thisx->speed * 1.6f;
+ this->skelAnime.playSpeed = CLAMP(this->skelAnime.playSpeed, 0.1f, 1.9f);
if ((this->unk_36A <= 0) || func_80A68BA0(this)) {
func_80A6B078(this);
@@ -894,9 +895,9 @@ void func_80A6A794(EnMushi2* this) {
}
void func_80A6A824(EnMushi2* this, PlayState* play) {
- EnMushi2* this2 = this;
+ Actor* thisx = &this->actor;
- Math_SmoothStepToF(&this->actor.speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
func_80A68ED8(this);
func_80A697C4(this, play);
@@ -904,8 +905,8 @@ void func_80A6A824(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = (Rand_ZeroOne() * 0.8f) + (this->actor.speed * 1.2f);
- this2->skelAnime.playSpeed = CLAMP(this2->skelAnime.playSpeed, 0.0f, 1.9f);
+ this->skelAnime.playSpeed = (Rand_ZeroOne() * 0.8f) + (thisx->speed * 1.2f);
+ this->skelAnime.playSpeed = CLAMP(this->skelAnime.playSpeed, 0.0f, 1.9f);
if ((this->unk_36A <= 0) || func_80A68BA0(this)) {
func_80A6B078(this);
@@ -1088,8 +1089,9 @@ void func_80A6B0D8(EnMushi2* this, PlayState* play) {
s32 sp44 = 0;
if (this->poly != NULL) {
- u32 temp_v0 = func_800C99D4(&play->colCtx, this->poly, this->polyBgId);
- if ((temp_v0 == 5) || (temp_v0 == 14) || (temp_v0 == 15)) {
+ FloorType floorType = SurfaceType_GetFloorType(&play->colCtx, this->poly, this->polyBgId);
+
+ if ((floorType == FLOOR_TYPE_5) || (floorType == FLOOR_TYPE_14) || (floorType == FLOOR_TYPE_15)) {
sp44 = 1;
}
}
@@ -1159,7 +1161,7 @@ void EnMushi2_Update(Actor* thisx, PlayState* play) {
if ((temp != BGCHECK_SCENE) &&
((this->actionFunc == func_80A6A5C0) || (this->actionFunc == func_80A6A824) ||
(this->actionFunc == func_80A6A9E4) || (this->actionFunc == func_80A6B0D8)) &&
- BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, temp, &this->actor)) {
+ DynaPolyActor_TransformCarriedActor(&play->colCtx, temp, &this->actor)) {
func_80A68F24(this);
}
@@ -1234,6 +1236,6 @@ void EnMushi2_Draw(Actor* thisx, PlayState* play) {
EnMushi2* this = THIS;
func_80A687A0(this);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, NULL);
}
diff --git a/src/overlays/actors/ovl_En_Muto/z_en_muto.c b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
index 49d37330b..6eceb89d6 100644
--- a/src/overlays/actors/ovl_En_Muto/z_en_muto.c
+++ b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
@@ -74,7 +74,7 @@ void EnMuto_Init(Actor* thisx, PlayState* play) {
this->textIdIndex = 3;
}
- if (gSaveContext.save.day != 3 || !gSaveContext.save.isNight) {
+ if ((gSaveContext.save.day != 3) || !gSaveContext.save.isNight) {
Actor_Kill(&this->actor);
}
} else {
@@ -113,7 +113,7 @@ void EnMuto_SetHeadRotation(EnMuto* this) {
s32 yawRotToTarget = ABS_ALT(BINANG_SUB(this->yawTowardsTarget, this->actor.world.rot.y));
this->headRotTarget.y = 0;
- if (this->actor.xzDistToPlayer < 200.0f && yawRotToTarget < 0x4E20) {
+ if ((this->actor.xzDistToPlayer < 200.0f) && (yawRotToTarget < 0x4E20)) {
this->headRotTarget.y = BINANG_SUB(this->yawTowardsTarget, this->actor.world.rot.y);
if (this->headRotTarget.y > 0x2710) {
this->headRotTarget.y = 0x2710;
@@ -146,7 +146,7 @@ void EnMuto_Idle(EnMuto* this, PlayState* play) {
if (1) {} // Needed to match
- if (!this->isInMayorsRoom && Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
+ if (!this->isInMayorsRoom && (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK)) {
this->actor.textId = 0x2363;
}
@@ -229,8 +229,8 @@ void EnMuto_InDialogue(EnMuto* this, PlayState* play) {
}
}
- if (play->msgCtx.currentTextId == 0x2AC6 || play->msgCtx.currentTextId == 0x2AC7 ||
- play->msgCtx.currentTextId == 0x2AC8) {
+ if ((play->msgCtx.currentTextId == 0x2AC6) || (play->msgCtx.currentTextId == 0x2AC7) ||
+ (play->msgCtx.currentTextId == 0x2AC8)) {
this->skelAnime.playSpeed = 0.0f;
this->yawTowardsTarget = this->actor.yawTowardsPlayer;
this->skelAnime.curFrame = 30.0f;
@@ -254,7 +254,7 @@ void EnMuto_Update(Actor* thisx, PlayState* play2) {
EnMuto_SetHeadRotation(this);
}
- if (this->isInMayorsRoom && gSaveContext.save.day == 3 && gSaveContext.save.isNight) {
+ if (this->isInMayorsRoom && (gSaveContext.save.day == 3) && gSaveContext.save.isNight) {
Actor_Kill(&this->actor);
return;
}
@@ -272,7 +272,9 @@ void EnMuto_Update(Actor* thisx, PlayState* play2) {
Math_SmoothStepToS(&this->headRot.x, this->headRotTarget.x, 1, 0x3E8, 0);
Math_SmoothStepToS(&this->waistRot.y, this->waistRotTarget.y, 1, 0xBB8, 0);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
this->actor.uncullZoneForward = 500.0f;
@@ -298,7 +300,7 @@ s32 EnMuto_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
void EnMuto_Draw(Actor* thisx, PlayState* play) {
EnMuto* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMuto_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Nb/z_en_nb.c b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
index b5d558a71..79c2e5cba 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
@@ -43,7 +43,7 @@ typedef enum EnNbScheduleResult {
/* 1 */ EN_NB_SCH_1,
/* 2 */ EN_NB_SCH_2,
/* 3 */ EN_NB_SCH_3,
- /* 4 */ EN_NB_SCH_4,
+ /* 4 */ EN_NB_SCH_4
} EnNbScheduleResult;
static u8 sScheduleScript[] = {
@@ -66,7 +66,7 @@ static u8 sScheduleScript[] = {
/* 0x3E */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
/* 0x41 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_2),
/* 0x44 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
- /* 0x47 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_50_20, 0x57 - 0x4B),
+ /* 0x47 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x57 - 0x4B),
/* 0x4B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(8, 0, 18, 0, 0x54 - 0x51),
/* 0x51 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_3),
/* 0x54 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
@@ -227,31 +227,31 @@ Actor* func_80BBFF90(EnNb* this, PlayState* play) {
return actor;
}
-s32 func_80BBFFD4(EnNb* this, s16 index) {
+s32 func_80BBFFD4(EnNb* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(index);
- } else if (ActorCutscene_GetCanPlayNext(index)) {
- ActorCutscene_StartAndSetUnkLinkFields(index, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(index);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_80BC0050(EnNb* this, s32 arg1) {
- s16 cutscene = this->actor.cutscene;
+s16 func_80BC0050(EnNb* this, s32 numCutscenes) {
+ s16 csId = this->actor.csId;
s32 i;
- for (i = 0; i < arg1; i++) {
- cutscene = ActorCutscene_GetAdditionalCutscene(cutscene);
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
- return cutscene;
+ return csId;
}
typedef enum EnNbBehaviour {
@@ -269,12 +269,12 @@ typedef enum EnNbBehaviour {
s32 func_80BC00AC(Actor* thisx, PlayState* play) {
EnNb* this = THIS;
- s16 cutscene = func_80BC0050(this, 0);
+ s16 csId = func_80BC0050(this, 0);
s32 ret = false;
switch (this->behaviour) {
case ENNB_BEHAVIOUR_0:
- if (!func_80BBFFD4(this, cutscene)) {
+ if (!func_80BBFFD4(this, csId)) {
break;
}
// fallthrough
@@ -282,7 +282,7 @@ s32 func_80BC00AC(Actor* thisx, PlayState* play) {
case ENNB_BEHAVIOUR_4:
case ENNB_BEHAVIOUR_6:
case ENNB_BEHAVIOUR_8:
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(cutscene)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
this->behaviour++;
ret = true;
break;
@@ -292,7 +292,7 @@ s32 func_80BC00AC(Actor* thisx, PlayState* play) {
case ENNB_BEHAVIOUR_5:
case ENNB_BEHAVIOUR_7:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(cutscene)),
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
this->actor.child);
}
this->behaviour++;
@@ -300,7 +300,7 @@ s32 func_80BC00AC(Actor* thisx, PlayState* play) {
break;
case ENNB_BEHAVIOUR_9:
- ActorCutscene_Stop(cutscene);
+ CutsceneManager_Stop(csId);
this->behaviour++;
ret = true;
break;
@@ -745,7 +745,7 @@ void EnNb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
EnNb* this = THIS;
Vec3f focusTarget;
- if ((ActorCutscene_GetCurrentIndex() == -1) && (limbIndex == NB_LIMB_HEAD)) {
+ if ((CutsceneManager_GetCurrentCsId() == CS_ID_NONE) && (limbIndex == NB_LIMB_HEAD)) {
Matrix_MultVec3f(&gZeroVec3f, &focusTarget);
Math_ApproachF(&thisx->focus.pos.x, focusTarget.x, 0.6f, 10000.0f);
Math_ApproachF(&thisx->focus.pos.y, focusTarget.y, 0.6f, 10000.0f);
@@ -789,7 +789,7 @@ void EnNb_Draw(Actor* thisx, PlayState* play) {
EnNb* this = THIS;
if (this->scheduleResult != EN_NB_SCH_NONE) {
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnNb_OverrideLimbDraw, EnNb_PostLimbDraw,
EnNb_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Nb/z_en_nb.h b/src/overlays/actors/ovl_En_Nb/z_en_nb.h
index f11464c79..2a784e096 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.h
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.h
@@ -17,7 +17,7 @@ typedef enum EnNbAnimation {
/* 2 */ EN_NB_ANIM_TALK_ONCE,
/* 3 */ EN_NB_ANIM_TALK_LOOP,
/* 4 */ EN_NB_ANIM_ANGRY,
- /* 5 */ EN_NB_ANIM_RELIEVED,
+ /* 5 */ EN_NB_ANIM_RELIEVED
} EnNbAnimation;
typedef struct EnNb {
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 562217efd..755385d00 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
@@ -57,7 +57,7 @@ typedef enum {
/* 0xC */ EN_NEO_REEBA_DMGEFF_HOOKSHOT = 0xC, // No damage, used only for hookshot
/* 0xD */ EN_NEO_REEBA_DMGEFF_ELECTRIC_STUN, // Electric effects, frozen in place
/* 0xE */ EN_NEO_REEBA_DMGEFF_NONE, // Normal hit
- /* 0xF */ EN_NEO_REEBA_DMGEFF_SHATTER, // Normal hit that can break ice if leever is frozen
+ /* 0xF */ EN_NEO_REEBA_DMGEFF_SHATTER // Normal hit that can break ice if leever is frozen
} EnNeoReebaDamageEffect;
static DamageTable sDamageTable = {
@@ -604,7 +604,7 @@ void EnNeoReeba_UpdatePosition(EnNeoReeba* this, PlayState* play) {
Math_ApproachZeroF(&this->velToTarget.x, 1.0f, 2.0f);
Math_ApproachZeroF(&this->velToTarget.z, 1.0f, 2.0f);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -729,11 +729,14 @@ s32 EnNeoReeba_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnNeoReeba_Draw(Actor* thisx, PlayState* play) {
EnNeoReeba* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnNeoReeba_OverrideLimbDraw, NULL,
&this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->stunTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
index 9c91d7092..472196ae9 100644
--- a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
+++ b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
@@ -53,7 +53,7 @@ static ColliderCylinderInit sCylinderInit = {
void EnNimotsu_UpdateCollision(EnNimotsu* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void EnNimotsu_Init(Actor* thisx, PlayState* play) {
@@ -87,9 +87,9 @@ void EnNimotsu_Update(Actor* thisx, PlayState* play) {
}
if ((play->state.frames % 3) == 0) {
- dustPosition.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(15.0f);
+ dustPosition.x = this->actor.world.pos.x + Rand_CenteredFloat(15.0f);
dustPosition.y = this->actor.world.pos.y;
- dustPosition.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(15.0f);
+ dustPosition.z = this->actor.world.pos.z + Rand_CenteredFloat(15.0f);
Actor_SpawnFloorDustRing(play, &this->actor, &dustPosition, 20.0f, 0, 2.0f, 0, 0, 0);
}
}
@@ -104,10 +104,11 @@ void EnNimotsu_Draw(Actor* thisx, PlayState* play) {
Vec3f scale;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, &gBombShopBagDL);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
position.x = this->actor.world.pos.x + 7.0f;
position.y = this->actor.world.pos.y;
@@ -118,5 +119,6 @@ void EnNimotsu_Draw(Actor* thisx, PlayState* play) {
scale.z = 0.2f;
func_800BC620(&position, &scale, 255, play);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Niw/z_en_niw.c b/src/overlays/actors/ovl_En_Niw/z_en_niw.c
index 274ddbc49..0e96590d5 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.c
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.c
@@ -36,7 +36,7 @@ void EnNiw_SpawnFeather(EnNiw* this, Vec3f* pos, Vec3f* vel, Vec3f* accel, f32 s
s16 sCuccoStormActive = false;
// why wouldnt they just use actionFunc?
-enum EnNiwState {
+typedef enum EnNiwState {
/* 0 */ NIW_STATE_IDLE,
/* 1 */ NIW_STATE_ANGRY1, // 1/2/3 are stages of summoning cucco storm
/* 2 */ NIW_STATE_ANGRY2,
@@ -45,8 +45,8 @@ enum EnNiwState {
/* 5 */ NIW_STATE_FALLING,
/* 6 */ NIW_STATE_SWIMMING,
/* 7 */ NIW_STATE_RUNNING,
- /* 8 */ NIW_STATE_HOPPING,
-};
+ /* 8 */ NIW_STATE_HOPPING
+} EnNiwState;
ActorInit En_Niw_InitVars = {
ACTOR_EN_NIW,
@@ -188,6 +188,7 @@ void EnNiw_AnimateWingHead(EnNiw* this, PlayState* play, s16 animationState) {
this->targetLimbRots[2] = 0.0f; // both wingRotZ
this->targetLimbRots[1] = 0.0f;
break;
+
case NIW_ANIM_HEAD_PECKING:
this->unkTimer24E = 3;
this->targetLimbRots[2] = 7000.0f * tempOne; // both wingRotZ
@@ -235,6 +236,9 @@ void EnNiw_AnimateWingHead(EnNiw* this, PlayState* play, s16 animationState) {
this->targetLimbRots[7] = 10000.0f;
}
break;
+
+ default:
+ break;
}
}
@@ -271,12 +275,12 @@ void EnNiw_SpawnAttackNiw(EnNiw* this, PlayState* play) {
Vec3f newNiwPos;
Actor* attackNiw;
- if (this->attackNiwSpawnTimer == 0 && this->attackNiwCount < 7) {
+ if ((this->attackNiwSpawnTimer == 0) && (this->attackNiwCount < 7)) {
xView = play->view.at.x - play->view.eye.x;
yView = play->view.at.y - play->view.eye.y;
zView = play->view.at.z - play->view.eye.z;
newNiwPos.x = ((Rand_ZeroOne() - 0.5f) * xView) + play->view.eye.x;
- newNiwPos.y = randPlusMinusPoint5Scaled(0.3f) + (play->view.eye.y + 50.0f + (yView * 0.5f));
+ newNiwPos.y = Rand_CenteredFloat(0.3f) + (play->view.eye.y + 50.0f + (yView * 0.5f));
newNiwPos.z = ((Rand_ZeroOne() - 0.5f) * zView) + play->view.eye.z;
attackNiw = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ATTACK_NIW, newNiwPos.x,
newNiwPos.y, newNiwPos.z, 0, 0, 0, ATTACK_NIW_REGULAR);
@@ -312,7 +316,7 @@ void EnNiw_UpdateRunning(EnNiw* this, PlayState* play, s32 isStormCucco) {
runningDirection = -runningAngles[isStormCucco];
}
- if (isStormCucco == true && (this->runAwayTimer == 0 || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
+ if ((isStormCucco == true) && ((this->runAwayTimer == 0) || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
this->runAwayTimer = 150;
if (this->yawTimer == 0) {
this->yawTimer = 70;
@@ -336,8 +340,8 @@ void EnNiw_SetupIdle(EnNiw* this) {
void EnNiw_Idle(EnNiw* this, PlayState* play) {
f32 posX2;
f32 posZ2;
- f32 posX1 = randPlusMinusPoint5Scaled(100.0f);
- f32 posZ1 = randPlusMinusPoint5Scaled(100.0f);
+ f32 posX1 = Rand_CenteredFloat(100.0f);
+ f32 posZ1 = Rand_CenteredFloat(100.0f);
s16 nextAnimIndex;
if (this->niwType == NIW_TYPE_REGULAR) {
@@ -367,7 +371,7 @@ void EnNiw_Idle(EnNiw* this, PlayState* play) {
Math_ApproachF(&this->targetLimbRots[9], sHeadRotations[this->headRotationToggle], 0.5f, 4000.0f); // head rot
}
- if (this->unkIdleTimer2 == 0 && this->unkIdleTimer == 0) {
+ if ((this->unkIdleTimer2 == 0) && (this->unkIdleTimer == 0)) {
this->unk298++;
if (this->unk298 > 7) {
this->unkIdleTimer2 = Rand_ZeroFloat(30.0f);
@@ -434,9 +438,9 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
this->heldTimer = (s32)(Rand_ZeroFloat(1.0f) * 10.0f) + 10;
}
- this->actor.shape.rot.x = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.x;
- this->actor.shape.rot.y = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.y;
- this->actor.shape.rot.z = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.z;
+ this->actor.shape.rot.x = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.x;
+ this->actor.shape.rot.y = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.y;
+ this->actor.shape.rot.z = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.z;
if (this->niwType == NIW_TYPE_REGULAR) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.shape.rot.z = 0;
@@ -469,14 +473,14 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
void EnNiw_Thrown(EnNiw* this, PlayState* play) {
if (this->unk2EC == 0) {
- if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
- this->unk2EC = 1;
- this->hoppingTimer = 80; // hop timer
- this->actor.speed = 0.0f;
- this->actor.velocity.y = 4.0f;
- } else {
- return; // wait until back on floor
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ // wait until back on floor
+ return;
}
+ this->unk2EC = 1;
+ this->hoppingTimer = 80;
+ this->actor.speed = 0.0f;
+ this->actor.velocity.y = 4.0f;
} else {
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->sfxTimer1 = 0;
@@ -683,10 +687,10 @@ void EnNiw_LandBeforeIdle(EnNiw* this, PlayState* play) {
}
void EnNiw_CheckRage(EnNiw* this, PlayState* play) {
- if (!this->isStormActive && this->iframeTimer == 0 && this->niwType == NIW_TYPE_REGULAR) {
+ if (!this->isStormActive && (this->iframeTimer == 0) && (this->niwType == NIW_TYPE_REGULAR)) {
// is this used? this is before we even know if we've been hit
- if (this->niwState != NIW_STATE_RUNNING && this->unk2BC.x != 90000.0f) {
+ if ((this->niwState != NIW_STATE_RUNNING) && (this->unk2BC.x != 90000.0f)) {
this->iframeTimer = 10;
this->sfxTimer1 = 30;
this->unk29E = 1;
@@ -703,7 +707,7 @@ void EnNiw_CheckRage(EnNiw* this, PlayState* play) {
this->actor.colChkInfo.health--;
}
- if (!sCuccoStormActive && this->actor.colChkInfo.health == 0) {
+ if (!sCuccoStormActive && (this->actor.colChkInfo.health == 0)) {
this->runAwayTimer = 100; // main cucco will run away after storm starts
sCuccoStormActive = true;
this->unk298 = 0;
@@ -769,21 +773,21 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
featherCount = 4;
}
for (i = 0; i < featherCount; i++) {
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.x;
- pos.y = randPlusMinusPoint5Scaled(10.0f) + (this->actor.world.pos.y + this->unk308);
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x;
+ pos.y = Rand_CenteredFloat(10.0f) + (this->actor.world.pos.y + this->unk308);
+ pos.z = Rand_CenteredFloat(10.0f) + this->actor.world.pos.z;
featherScale = Rand_ZeroFloat(6.0f) + 6.0f;
- if (this->unk29E == 2 && this->unk308 != 0) {
+ if ((this->unk29E == 2) && (this->unk308 != 0)) {
pos.y += 10.0f;
}
if (this->unk308 == 0) {
featherScale = Rand_ZeroFloat(2.0f) + 2.0f;
}
- vel.x = randPlusMinusPoint5Scaled(3.0f);
+ vel.x = Rand_CenteredFloat(3.0f);
vel.y = Rand_ZeroFloat(2.0f) * 0.5f + 2.0f;
- vel.z = randPlusMinusPoint5Scaled(3.0f);
+ vel.z = Rand_CenteredFloat(3.0f);
accel.z = accel.x = 0.0f;
accel.y = -0.15f;
@@ -812,10 +816,12 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, this->unk308);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
// if cucco is off the map
- if (this->actor.floorHeight <= BGCHECK_Y_MIN || this->actor.floorHeight >= BGCHECK_Y_MAX) {
+ if ((this->actor.floorHeight <= BGCHECK_Y_MIN) || (this->actor.floorHeight >= BGCHECK_Y_MAX)) {
Vec3f viewAtToEye;
// Direction vector for the direction the camera is facing
@@ -879,12 +885,12 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
return;
}
- if (this->isStormActive && (this->actor.xyzDistToPlayerSq < SQ(dist)) && player->invincibilityTimer == 0) {
+ if (this->isStormActive && (this->actor.xyzDistToPlayerSq < SQ(dist)) && (player->invincibilityTimer == 0)) {
func_800B8D50(play, &this->actor, 2.0f, this->actor.world.rot.y, 0.0f, 0x10);
}
EnNiw_CheckRage(this, play);
- if (this->flutterSfxTimer == 0 && this->niwState == NIW_STATE_HELD) {
+ if ((this->flutterSfxTimer == 0) && (this->niwState == NIW_STATE_HELD)) {
this->flutterSfxTimer = 7;
Actor_PlaySfx(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
}
@@ -899,13 +905,13 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
}
}
- if (!this->isStormActive && this->niwType == NIW_TYPE_REGULAR) {
+ if (!this->isStormActive && (this->niwType == NIW_TYPE_REGULAR)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
if (play) {}
- if (this->niwState != NIW_STATE_HELD && this->niwState != NIW_STATE_FALLING) {
+ if ((this->niwState != NIW_STATE_HELD) && (this->niwState != NIW_STATE_FALLING)) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -936,7 +942,7 @@ s32 EnNiw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnNiw_Draw(Actor* thisx, PlayState* play) {
EnNiw* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount,
EnNiw_OverrideLimbDraw, NULL, &this->actor);
EnNiw_DrawFeathers(this, play);
@@ -1000,7 +1006,8 @@ void EnNiw_DrawFeathers(EnNiw* this, PlayState* play) {
s16 i;
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->feathers); i++, feather++) {
if (feather->isEnabled == true) {
diff --git a/src/overlays/actors/ovl_En_Niw/z_en_niw.h b/src/overlays/actors/ovl_En_Niw/z_en_niw.h
index c60397535..06f487800 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.h
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.h
@@ -106,7 +106,7 @@ typedef enum {
/* 2 */ NIW_ANIM_PECKING_AND_WAVING, // wings move along their axis, like human hand waving
/* 3 */ NIW_ANIM_PECKING_AND_FORFLAPPING, // (unused) low (yaw based) flapping, forward and back
/* 4 */ NIW_ANIM_FREEZE, // used during Cucco Storm
- /* 5 */ NIW_ANIM_PECKING_SLOW_FORFLAPPING, // wing speed half that of 3
+ /* 5 */ NIW_ANIM_PECKING_SLOW_FORFLAPPING // wing speed half that of 3
} EnNiwHeadAndWingAnimationState;
diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
index 0187e1c88..3b2659d1e 100644
--- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
+++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c
@@ -107,7 +107,7 @@ void EnNnh_Draw(Actor* thisx, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 pad;
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gfxCtx->polyOpa.p++, gButlerSonMainBodyDL);
}
diff --git a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
index 193334ff1..bf3216fd5 100644
--- a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
+++ b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c
@@ -136,14 +136,16 @@ void EnNutsball_Update(Actor* thisx, PlayState* play2) {
Actor_MoveWithoutGravity(&this->actor);
Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 5.0f, 10.0f, 0x7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 5.0f, 10.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- if (func_800C9A4C(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId) & 0x30) {
+ if (SurfaceType_GetWallFlags(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId) &
+ (WALL_FLAG_4 | WALL_FLAG_5)) {
this->actor.bgCheckFlags &= ~BGCHECKFLAG_WALL;
if (BgCheck_EntityLineTest1(&play->colCtx, &this->actor.prevPos, &worldPos, &this->actor.world.pos,
&poly, true, false, false, true, &bgId)) {
- if (func_800C9A4C(&play->colCtx, poly, bgId) & 0x30) {
+ if (SurfaceType_GetWallFlags(&play->colCtx, poly, bgId) & (WALL_FLAG_4 | WALL_FLAG_5)) {
this->actor.world.pos.x += this->actor.velocity.x * 0.01f;
this->actor.world.pos.z += this->actor.velocity.z * 0.01f;
} else {
@@ -171,10 +173,12 @@ void EnNutsball_Draw(Actor* thisx, PlayState* play) {
EnNutsball* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(this->actor.home.rot.z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gameplay_keep_DL_058BA0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
index 8c1947267..2f8914edc 100644
--- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
+++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
@@ -32,14 +32,14 @@ void EnNwc_DrawAdultBody(Actor* thisx, PlayState* play);
s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
EnHs* EnNwc_FindGrog(PlayState* play);
-enum EnNiwState {
- /* -1 */ NWC_STATE_NIW_LOADED = -1, // set after loading object_niw
- /* 0 */ NWC_STATE_CHECK_BREMAN = 0, // checking for breman mask
- /* 1 */ NWC_STATE_TURNING, // turning to face a new direction to explore
- /* 2 */ NWC_STATE_HOPPING_FORWARD, // hopping to go explore
- /* 3 */ NWC_STATE_FOLLOWING, // following the player
- /* 4 */ NWC_STATE_RUNNING, // running from the player after failed breman march
-};
+typedef enum EnNwcState {
+ /* -1 */ NWC_STATE_NIW_LOADED = -1, // set after loading object_niw
+ /* 0 */ NWC_STATE_CHECK_BREMAN, // checking for breman mask
+ /* 1 */ NWC_STATE_TURNING, // turning to face a new direction to explore
+ /* 2 */ NWC_STATE_HOPPING_FORWARD, // hopping to go explore
+ /* 3 */ NWC_STATE_FOLLOWING, // following the player
+ /* 4 */ NWC_STATE_RUNNING // running from the player after failed breman march
+} EnNwcState;
ActorInit En_Nwc_InitVars = {
ACTOR_EN_NWC,
@@ -110,9 +110,9 @@ void EnNwc_SpawnDust(EnNwc* this, PlayState* play) {
vec5.z = this->actor.world.pos.z - 5.0f * Math_CosS(yaw) * Math_CosS(pitch);
for (i = 0; i < 5; i++) {
- vel.x = randPlusMinusPoint5Scaled(4.0f);
- vel.y = randPlusMinusPoint5Scaled(4.0f);
- vel.z = randPlusMinusPoint5Scaled(4.0f);
+ vel.x = Rand_CenteredFloat(4.0f);
+ vel.y = Rand_CenteredFloat(4.0f);
+ vel.z = Rand_CenteredFloat(4.0f);
accel.x = -vel.x * 0.1f;
accel.y = -vel.y * 0.1f;
accel.z = -vel.z * 0.1f;
@@ -164,7 +164,7 @@ s32 EnNwc_IsFound(EnNwc* this, PlayState* play) {
return false;
}
- if ((player->stateFlags3 & PLAYER_STATE3_20000000) && this->actor.xzDistToPlayer < 100.0f) {
+ if ((player->stateFlags3 & PLAYER_STATE3_20000000) && (this->actor.xzDistToPlayer < 100.0f)) {
return true;
}
@@ -178,26 +178,34 @@ void EnNwc_ChangeState(EnNwc* this, s16 newState) {
this->stateTimer = 10;
this->actionFunc = EnNwc_CheckForBreman;
break;
+
case NWC_STATE_TURNING:
this->stateTimer = Rand_ZeroFloat(20.0f) + 15.0f;
this->actionFunc = EnNwc_Turn;
- this->fallingRotY = (s16)(s32)randPlusMinusPoint5Scaled(65536.0f);
+ this->fallingRotY = (s16)(s32)Rand_CenteredFloat(0x10000);
break;
+
case NWC_STATE_HOPPING_FORWARD:
this->stateTimer = Rand_ZeroFloat(20.0f) + 15.0f;
this->actionFunc = EnNwc_HopForward;
break;
+
case NWC_STATE_FOLLOWING:
this->actionFunc = EnNwc_Follow;
this->transformTimer = 0;
- this->randomRot = (s16)(s32)randPlusMinusPoint5Scaled(10000.0f);
+ this->randomRot = (s16)(s32)Rand_CenteredFloat(0x2710);
break;
+
case NWC_STATE_RUNNING:
- this->actor.world.rot.y = this->actor.home.rot.z * 0x3000 & 0xFFFF; // Fake Match?: & 0xFFFF
+ //! FAKE: & 0xFFFF
+ this->actor.world.rot.y = this->actor.home.rot.z * 0x3000 & 0xFFFF;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->stateTimer = Rand_ZeroFloat(40.0f) + 120.0f;
this->actionFunc = EnNwc_RunAway;
break;
+
+ default:
+ break;
}
this->state = newState;
@@ -289,7 +297,7 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
Math_SmoothStepToS(&this->upperBodyRotY, targetUpperBodyRot, 2, 0x1B58, 0x3E8);
} else { // NOT grown up
- if ((this->stateTimer & 3) == 3 && this->stateTimer & 20) {
+ if (((this->stateTimer & 3) == 3) && ((this->stateTimer & 0x14) != 0)) {
this->actor.velocity.y = 2.0f; // hop up and down
}
if ((this->stateTimer & 0x1B) == 24) {
@@ -323,7 +331,7 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
}
} else { // not too close: keep moving
- this->randomRot += (s16)randPlusMinusPoint5Scaled(1500.0f);
+ this->randomRot += (s16)(s32)Rand_CenteredFloat(0x5DC);
if (this->randomRot > 0x1388) {
this->randomRot = 0x1388;
} else if (this->randomRot < -0x1388) {
@@ -457,7 +465,7 @@ void EnNwc_Update(Actor* thisx, PlayState* play) {
EnNwc* this = THIS;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
if (this->hasGrownUp & 1) {
this->actor.objBankIndex = this->niwObjectIndex;
@@ -473,7 +481,7 @@ void EnNwc_Update(Actor* thisx, PlayState* play) {
this->blinkTimer = Rand_S16Offset(0x3C, 0x3C);
}
- if (this->blinkTimer == 1 || this->blinkTimer == 3) {
+ if ((this->blinkTimer == 1) || (this->blinkTimer == 3)) {
this->blinkState = true;
} else {
this->blinkState = false;
@@ -487,7 +495,7 @@ void EnNwc_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
dispHead = POLY_OPA_DISP;
@@ -508,7 +516,7 @@ s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
if (limbIndex == NIW_LIMB_UPPER_BODY) {
rot->y += this->upperBodyRotY;
}
- if (limbIndex == NIW_LIMB_RIGHT_WING_ROOT || limbIndex == NIW_LIMB_LEFT_WING_ROOT) {
+ if ((limbIndex == NIW_LIMB_RIGHT_WING_ROOT) || (limbIndex == NIW_LIMB_LEFT_WING_ROOT)) {
rot->y += this->footRotY;
rot->z += this->footRotZ;
}
@@ -519,7 +527,7 @@ s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
void EnNwc_DrawAdultBody(Actor* thisx, PlayState* play) {
EnNwc* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->niwSkeleton.skeleton, this->niwSkeleton.jointTable, this->niwSkeleton.dListCount,
EnNwc_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
index c53a29232..01cbb5dda 100644
--- a/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
+++ b/src/overlays/actors/ovl_En_Okarina_Tag/z_en_okarina_tag.c
@@ -81,7 +81,7 @@ void func_8093E518(EnOkarinaTag* this, PlayState* play) {
var_v1 = this->unk14A;
if (var_v1 == 6) {
var_v1 = 0xA;
- if (gSaveContext.save.unk_F65 == 0) {
+ if (gSaveContext.save.saveInfo.unk_F41 == 0) {
return;
}
}
diff --git a/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c b/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c
index 0518e9457..cd20f489c 100644
--- a/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c
+++ b/src/overlays/actors/ovl_En_Onpuman/z_en_onpuman.c
@@ -86,14 +86,14 @@ Actor* func_80B11F44(PlayState* play) {
void func_80B11F78(EnOnpuman* this, PlayState* play) {
if (play->msgCtx.ocarinaMode == 4) {
this->actionFunc = func_80B121D8;
- if (this->actor.cutscene != -1) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_Stop(this->actor.csId);
}
} else if (play->msgCtx.ocarinaMode == 3) {
play_sound(NA_SE_SY_CORRECT_CHIME);
play->msgCtx.ocarinaMode = 4;
- if (this->actor.cutscene != -1) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_Stop(this->actor.csId);
}
this->actionFunc = func_80B121D8;
}
@@ -126,13 +126,13 @@ void func_80B1202C(EnOnpuman* this, PlayState* play2) {
}
}
if (this->unk_2A4 & 1) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->unk_2A4 &= ~1;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
this->unk_2A4 &= ~1;
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -172,6 +172,6 @@ void EnOnpuman_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Osk/z_en_osk.c b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
index 2b938a35f..c1ce34949 100644
--- a/src/overlays/actors/ovl_En_Osk/z_en_osk.c
+++ b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
@@ -66,7 +66,7 @@ void EnOsk_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BF5F60;
this->unk_254 = -1;
- this->unk_256 = -1;
+ this->cueId = -1;
this->actor.flags &= ~ACTOR_FLAG_1;
switch (ENOSK_GET_F(&this->actor)) {
@@ -75,7 +75,7 @@ void EnOsk_Init(Actor* thisx, PlayState* play) {
this->jointTable, this->morphTable, 7);
Animation_PlayLoop(&this->skelAnime, &object_ikn_demo_Anim_006808);
this->actionFunc = func_80BF656C;
- this->unk_258 = 0x210;
+ this->cueType = CS_CMD_ACTOR_CUE_528;
break;
case ENOSK_2:
@@ -83,7 +83,7 @@ void EnOsk_Init(Actor* thisx, PlayState* play) {
this->jointTable, this->morphTable, 7);
Animation_PlayLoop(&this->skelAnime, &object_ikn_demo_Anim_006808);
this->actionFunc = func_80BF6A20;
- this->unk_258 = 0x211;
+ this->cueType = CS_CMD_ACTOR_CUE_529;
break;
default:
@@ -92,7 +92,7 @@ void EnOsk_Init(Actor* thisx, PlayState* play) {
this->jointTable, this->morphTable, 17);
Animation_PlayLoop(&this->skelAnime, &object_ikn_demo_Anim_0000B8);
this->actionFunc = func_80BF61EC;
- this->unk_258 = 0x212;
+ this->cueType = CS_CMD_ACTOR_CUE_530;
this->actor.home.rot.z = 0;
this->unk_25C = 0.0f;
break;
@@ -118,9 +118,9 @@ void func_80BF5E68(EnOsk* this, AnimationHeader** animations, s16 index, f32 pla
void func_80BF5EBC(EnOsk* this, PlayState* play) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.x;
- sp2C.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.z;
- sp2C.y = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.y;
+ sp2C.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x;
+ sp2C.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z;
+ sp2C.y = Rand_CenteredFloat(30.0f) + this->actor.world.pos.y;
func_800B3030(play, &sp2C, &D_80BF7018, &D_80BF7018, 100, 0, 2);
}
@@ -129,12 +129,12 @@ void func_80BF5F60(EnOsk* this, PlayState* play) {
}
void func_80BF5F70(EnOsk* this) {
- if ((this->unk_256 != 1) && (this->unk_256 != 6)) {
+ if ((this->cueId != 1) && (this->cueId != 6)) {
this->actor.draw = EnOsk_Draw;
Actor_SetScale(&this->actor, 0.017f);
}
- switch (this->unk_256) {
+ switch (this->cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -205,10 +205,10 @@ void func_80BF609C(EnOsk* this, PlayState* play) {
void func_80BF61EC(EnOsk* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Cutscene_CheckActorAction(play, this->unk_258)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->unk_258));
- if (this->unk_256 != play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action) {
- this->unk_256 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action;
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
func_80BF5F70(this);
}
func_80BF609C(this, play);
@@ -216,7 +216,7 @@ void func_80BF61EC(EnOsk* this, PlayState* play) {
this->actor.draw = NULL;
}
- if (this->unk_256 == 6) {
+ if (this->cueId == 6) {
if (this->actor.scale.x > 0.85f * 0.001f) {
this->actor.scale.x -= 0.85f * 0.001f;
Actor_SetScale(&this->actor, this->actor.scale.x);
@@ -229,12 +229,12 @@ void func_80BF61EC(EnOsk* this, PlayState* play) {
}
void func_80BF6314(EnOsk* this) {
- if ((this->unk_256 != 1) && (this->unk_256 != 9)) {
+ if ((this->cueId != 1) && (this->cueId != 9)) {
this->actor.draw = EnOsk_Draw;
Actor_SetScale(&this->actor, 0.013f);
}
- switch (this->unk_256) {
+ switch (this->cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -329,10 +329,10 @@ void func_80BF656C(EnOsk* this, PlayState* play) {
}
}
- if (Cutscene_CheckActorAction(play, this->unk_258)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->unk_258));
- if (this->unk_256 != play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action) {
- this->unk_256 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action;
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
func_80BF6314(this);
}
func_80BF6478(this);
@@ -340,12 +340,12 @@ void func_80BF656C(EnOsk* this, PlayState* play) {
this->actor.draw = NULL;
}
- if ((this->unk_256 == 2) && (this->actor.scale.x < 13.0f * 0.001f)) {
+ if ((this->cueId == 2) && (this->actor.scale.x < 13.0f * 0.001f)) {
this->actor.scale.x += 0.65f * 0.001f;
Actor_SetScale(&this->actor, this->actor.scale.x);
}
- if (this->unk_256 == 9) {
+ if (this->cueId == 9) {
if (this->actor.scale.x > 0.65f * 0.001f) {
this->actor.scale.x -= 0.65f * 0.001f;
Actor_SetScale(&this->actor, this->actor.scale.x);
@@ -358,12 +358,12 @@ void func_80BF656C(EnOsk* this, PlayState* play) {
}
void func_80BF67A8(EnOsk* this) {
- if ((this->unk_256 != 1) && (this->unk_256 != 8)) {
+ if ((this->cueId != 1) && (this->cueId != 8)) {
this->actor.draw = EnOsk_Draw;
Actor_SetScale(&this->actor, 0.013f);
}
- switch (this->unk_256) {
+ switch (this->cueId) {
case 1:
this->actor.draw = NULL;
break;
@@ -466,10 +466,10 @@ void func_80BF6A20(EnOsk* this, PlayState* play) {
}
}
- if (Cutscene_CheckActorAction(play, this->unk_258)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->unk_258));
- if (this->unk_256 != play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action) {
- this->unk_256 = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->unk_258)]->action;
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id) {
+ this->cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
func_80BF67A8(this);
}
func_80BF68E0(this);
@@ -477,7 +477,7 @@ void func_80BF6A20(EnOsk* this, PlayState* play) {
this->actor.draw = NULL;
}
- if (this->unk_256 == 8) {
+ if (this->cueId == 8) {
if (this->actor.scale.x > 0.65f * 0.001f) {
this->actor.scale.x -= 0.65f * 0.001f;
Actor_SetScale(&this->actor, this->actor.scale.x);
@@ -512,7 +512,7 @@ void EnOsk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_PrimColor(play->state.gfxCtx, 0x80, 255, 255, 255, 255));
@@ -542,7 +542,7 @@ void EnOsk_Draw(Actor* thisx, PlayState* play) {
MTXMODE_APPLY);
}
- gfx = func_8012C868(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL20_NoCD(POLY_XLU_DISP);
gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
if (1) {}
diff --git a/src/overlays/actors/ovl_En_Osk/z_en_osk.h b/src/overlays/actors/ovl_En_Osk/z_en_osk.h
index 0358911d3..c83cc5d91 100644
--- a/src/overlays/actors/ovl_En_Osk/z_en_osk.h
+++ b/src/overlays/actors/ovl_En_Osk/z_en_osk.h
@@ -18,8 +18,8 @@ typedef struct EnOsk {
/* 0x188 */ Vec3s jointTable[17];
/* 0x1EE */ Vec3s morphTable[17];
/* 0x254 */ s16 unk_254;
- /* 0x256 */ s16 unk_256;
- /* 0x258 */ u16 unk_258;
+ /* 0x256 */ s16 cueId;
+ /* 0x258 */ u16 cueType;
/* 0x25C */ f32 unk_25C;
/* 0x260 */ EnOskActionFunc actionFunc;
} EnOsk; // size = 0x264
diff --git a/src/overlays/actors/ovl_En_Osn/z_en_osn.c b/src/overlays/actors/ovl_En_Osn/z_en_osn.c
index e9e12e311..0631922be 100644
--- a/src/overlays/actors/ovl_En_Osn/z_en_osn.c
+++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.c
@@ -443,10 +443,11 @@ s32 EnOsn_GetInitialMaskText(EnOsn* this, PlayState* play) {
s32 EnOsn_GetInitialText(EnOsn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) && CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) {
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] != ITEM_NONE) &&
+ CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) {
if (this->stateFlags & OSN_STATE_SPECIAL_CONVERSTATION) {
this->stateFlags |= OSN_STATE_END_CONVERSATION;
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) &&
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] != ITEM_NONE) &&
(INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU)) {
if ((gSaveContext.save.day == 3) && (gSaveContext.save.time >= CLOCK_TIME(5, 0)) &&
(gSaveContext.save.time < CLOCK_TIME(6, 0))) {
@@ -691,14 +692,14 @@ void EnOsn_HandleConversation(EnOsn* this, PlayState* play) {
}
void EnOsn_InitCutscene(EnOsn* this) {
- this->cutscene = this->actor.cutscene;
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) ||
+ this->csId = this->actor.csId;
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) ||
(INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU)) {
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) ||
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] != ITEM_NONE) ||
(INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU)) {
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
}
}
}
@@ -706,7 +707,7 @@ void EnOsn_InitCutscene(EnOsn* this) {
void EnOsn_ChooseAction(EnOsn* this, PlayState* play) {
u32 isFlagSet = Flags_GetSwitch(play, 0);
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_IDLE);
if (!isFlagSet) {
@@ -719,7 +720,8 @@ void EnOsn_ChooseAction(EnOsn* this, PlayState* play) {
void EnOsn_Idle(EnOsn* this, PlayState* play) {
s16 yaw = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
- if ((gSaveContext.save.inventory.items[SLOT_OCARINA] != ITEM_NONE) && !CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) {
+ if ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] != ITEM_NONE) &&
+ !CHECK_QUEST_ITEM(QUEST_SONG_HEALING)) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = EnOsn_StartCutscene;
} else if (((this->actor.xzDistToPlayer < 100.0f) || this->actor.isTargeted) && (yaw < 0x4000) &&
@@ -737,27 +739,27 @@ void EnOsn_Idle(EnOsn* this, PlayState* play) {
}
void EnOsn_StartCutscene(EnOsn* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
this->actionFunc = EnOsn_HandleCsAction;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
u8 pad;
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 130)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 130);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_130)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_130);
this->shouldRotateHead = false;
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->animIndex = OSN_ANIM_BOWING;
break;
@@ -850,7 +852,7 @@ void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
}
if ((this->animIndex == OSN_ANIM_BELIEVE) && (play->sceneId == SCENE_SPOT00) &&
- (gSaveContext.sceneLayer == 0xB) && (play->csCtx.frames == 400)) {
+ (gSaveContext.sceneLayer == 0xB) && (play->csCtx.curFrame == 400)) {
Actor_PlaySfx(&this->actor, NA_SE_VO_OMVO00);
}
@@ -872,10 +874,10 @@ void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
(Animation_OnFrame(&this->skelAnime, 57.0f)) || (Animation_OnFrame(&this->skelAnime, 67.0f)))) {
Actor_PlaySfx(&this->actor, NA_SE_EV_OMENYA_WALK);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
} else {
this->shouldRotateHead = true;
- this->csAction = 0x63;
+ this->cueId = 99;
EnOsn_ChooseAction(this, play);
}
}
@@ -1035,7 +1037,7 @@ void EnOsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->alpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->animIndex == OSN_ANIM_CHOKE) || (this->animIndex == OSN_ANIM_DESPAIR) ||
(this->animIndex == OSN_ANIM_HAND_OUT_2) || (play->msgCtx.currentTextId == 0x1FCA)) {
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeOpenTex));
@@ -1054,7 +1056,7 @@ void EnOsn_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOsn_OverrideLimbDraw, EnOsn_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeClosedHappyTex));
gSPSegment(POLY_XLU_DISP++, 0x09, Lib_SegmentedToVirtual(sSmileTex));
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->alpha);
diff --git a/src/overlays/actors/ovl_En_Osn/z_en_osn.h b/src/overlays/actors/ovl_En_Osn/z_en_osn.h
index 638f31e4e..906c0b6c9 100644
--- a/src/overlays/actors/ovl_En_Osn/z_en_osn.h
+++ b/src/overlays/actors/ovl_En_Osn/z_en_osn.h
@@ -26,8 +26,8 @@ typedef struct EnOsn {
/* 0x1E4 */ UNK_TYPE1 unk_1E4[0x6];
/* 0x1EA */ u16 stateFlags;
/* 0x1EC */ u8 animIndex;
- /* 0x1ED */ u8 csAction;
- /* 0x1EE */ s16 cutscene;
+ /* 0x1ED */ u8 cueId;
+ /* 0x1EE */ s16 csId;
/* 0x1F0 */ u8 shouldRotateHead;
/* 0x1F1 */ UNK_TYPE1 unk_1F1[0x3];
/* 0x1F4 */ u16 textId;
diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
index c26a1a2c7..7ada3a223 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -198,7 +198,7 @@ void EnOssan_SetupAction(EnOssan* this, EnOssanActionFunc action) {
s32 EnOssan_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -210,7 +210,7 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
switch (gSaveContext.save.day) {
case 1:
case 2:
- if (gSaveContext.save.time <= CLOCK_TIME(21, 30) && gSaveContext.save.time > CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.time <= CLOCK_TIME(21, 30)) && (gSaveContext.save.time > CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
@@ -218,16 +218,20 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
Actor_Kill(&this->actor);
}
break;
+
case 3:
if (this->actor.params == ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
- if (!(gSaveContext.save.time <= CLOCK_TIME(22, 00) && gSaveContext.save.time >= CLOCK_TIME(6, 00))) {
+ if ((gSaveContext.save.time > CLOCK_TIME(22, 00)) || (gSaveContext.save.time < CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
}
break;
+
+ default:
+ break;
}
}
@@ -310,7 +314,7 @@ void EnOssan_EndInteraction(PlayState* play, EnOssan* this) {
play->interfaceCtx.unk_222 = 0;
play->interfaceCtx.unk_224 = 0;
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
}
if (this->actor.params == ENOSSAN_CURIOSITY_SHOP_MAN) {
@@ -369,17 +373,17 @@ void EnOssan_Idle(EnOssan* this, PlayState* play) {
player->stateFlags2 |= PLAYER_STATE2_20000000;
EnOssan_SetupAction(this, EnOssan_BeginInteraction);
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
}
} else {
- if (this->actor.xzDistToPlayer < 100.0f &&
- (player->actor.world.pos.x >= -40.0f && player->actor.world.pos.x <= 40.0f) &&
- (player->actor.world.pos.z >= -91.0f && player->actor.world.pos.z <= -60.0f)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && (player->actor.world.pos.x >= -40.0f) &&
+ (player->actor.world.pos.x <= 40.0f) && (player->actor.world.pos.z >= -91.0f) &&
+ (player->actor.world.pos.z <= -60.0f)) {
func_800B8614(&this->actor, play, 100.0f);
}
if (this->actor.params == ENOSSAN_PART_TIME_WORKER) {
@@ -397,11 +401,11 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
frameCount = 0;
}
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if (this->actor.params == ENOSSAN_CURIOSITY_SHOP_MAN) {
@@ -411,11 +415,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_FORWARD;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_FORWARD);
break;
+
case FSN_ANIM_TURN_AROUND_FORWARD:
EnOssan_SetHaveMet(this);
this->textId = EnOssan_CuriosityShopMan_GetWelcome(this, play);
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, this->animIndex);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_START:
case FSN_ANIM_HAND_ON_FACE_START:
case FSN_ANIM_LEAN_FORWARD_START:
@@ -425,6 +431,7 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, false);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_LOOP:
case FSN_ANIM_HAND_ON_FACE_LOOP:
case FSN_ANIM_LEAN_FORWARD_LOOP:
@@ -432,11 +439,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_REVERSE;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_REVERSE);
break;
+
case FSN_ANIM_TURN_AROUND_REVERSE:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
EnOssan_SetupAction(this, EnOssan_Idle);
break;
+
default:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
@@ -459,11 +468,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
this->moveHorizontal = this->moveVertical = false;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
this->moveHorizontal = true;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -477,11 +486,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
this->moveVertical = true;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -533,9 +542,9 @@ u8 EnOssan_SetCursorIndexFromNeutral(EnOssan* this, u8 shelfOffset) {
u8 EnOssan_CursorRight(EnOssan* this, u8 cursorIndex, u8 shelfSlotMin) {
u8 end = shelfSlotMin + 4;
- while (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ while ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
cursorIndex -= 2;
- if (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ if ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
if (this->items[cursorIndex] != NULL) {
return cursorIndex;
}
@@ -607,12 +616,15 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, PlayState* play) {
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
return true;
+
case 1:
func_8019F230();
EnOssan_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
@@ -622,11 +634,11 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
u8 cursorIndex;
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
} else {
if (talkState == TEXT_STATE_CHOICE) {
@@ -656,7 +668,7 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
return;
}
}
- if (this->actor.params == ENOSSAN_PART_TIME_WORKER && player->transformation != PLAYER_FORM_ZORA) {
+ if ((this->actor.params == ENOSSAN_PART_TIME_WORKER) && (player->transformation != PLAYER_FORM_ZORA)) {
Math_SmoothStepToS(&this->partTimerHeadRot.y, 8000, 3, 2000, 0);
}
}
@@ -676,26 +688,26 @@ void EnOssan_TalkToShopkeeper(EnOssan* this, PlayState* play) {
void EnOssan_LookToLeftShelf(EnOssan* this, PlayState* play) {
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToLeftShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToLeftShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
} else {
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
EnOssan_UpdateCursorPos(play, this);
EnOssan_SetupAction(this, EnOssan_BrowseLeftShelf);
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
this->stickAccumX = 0;
@@ -704,26 +716,26 @@ void EnOssan_LookToLeftShelf(EnOssan* this, PlayState* play) {
void EnOssan_LookToRightShelf(EnOssan* this, PlayState* play) {
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToRightShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToRightShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
} else {
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
EnOssan_UpdateCursorPos(play, this);
EnOssan_SetupAction(this, EnOssan_BrowseRightShelf);
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
this->stickAccumX = 0;
@@ -871,7 +883,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -879,7 +891,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ } else if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 8);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -929,7 +941,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -937,7 +949,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ } else if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -956,24 +968,24 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
void EnOssan_LookToShopkeeperFromShelf(EnOssan* this, PlayState* play) {
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopKeeperFromShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopKeeperFromShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
EnOssan_UpdateCursorPos(play, this);
EnOssan_StartShopping(play, this);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1006,7 +1018,7 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
}
func_8019F208();
@@ -1016,6 +1028,7 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -1024,27 +1037,35 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
case CANBUY_RESULT_NO_ROOM_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sCannotGetNowTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
+ default:
+ break;
}
}
@@ -1058,11 +1079,15 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
case 0:
EnOssan_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
break;
+
+ default:
+ break;
}
}
}
@@ -1103,11 +1128,11 @@ void EnOssan_SetupItemPurchased(EnOssan* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
EnOssan_SetupAction(this, EnOssan_ItemPurchased);
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
@@ -1134,6 +1159,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
EnOssan_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
@@ -1142,7 +1168,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
}
}
}
- } else if (talkState == TEXT_STATE_5 && Message_ShouldAdvance(play)) {
+ } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
EnOssan_ResetItemPosition(this);
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
@@ -1158,17 +1184,17 @@ void EnOssan_ItemPurchased(EnOssan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENOSSAN_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
player->stateFlags2 |= PLAYER_STATE2_20000000;
EnOssan_SetupAction(this, EnOssan_ContinueShopping);
this->cutsceneState = ENOSSAN_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -1241,11 +1267,11 @@ void EnOssan_UpdateItemSelectedProperty(EnOssan* this) {
for (i = 0; i < ARRAY_COUNT(this->items); i++, items++) {
item = *items;
if (item != NULL) {
- if (this->actionFunc != EnOssan_SelectItem && this->actionFunc != EnOssan_CannotBuy &&
- this->drawCursor == 0) {
+ if ((this->actionFunc != EnOssan_SelectItem) && (this->actionFunc != EnOssan_CannotBuy) &&
+ (this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIndex == i ? true : false;
+ item->isSelected = (this->cursorIndex == i) ? true : false;
}
}
}
@@ -1383,6 +1409,7 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
this->animIndex = FSN_ANIM_SLAM_COUNTER_START;
@@ -1390,21 +1417,25 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
return sWelcomeDekuTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_ZORA:
this->animIndex = FSN_ANIM_LEAN_FORWARD_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_08)) {
return sWelcomeZoraTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_GORON:
this->animIndex = FSN_ANIM_HAND_ON_FACE_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_04)) {
return sWelcomeGoronTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
+ default:
+ this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
+ return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
- this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
- return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
@@ -1415,24 +1446,29 @@ u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_10)) {
return sWelcomeDekuTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_ZORA:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_08)) {
return sWelcomeZoraTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_GORON:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_04)) {
return sWelcomeGoronTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
+ default:
+ return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
- return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
void EnOssan_SetHaveMet(EnOssan* this) {
@@ -1440,21 +1476,29 @@ void EnOssan_SetHaveMet(EnOssan* this) {
case 0x06A9:
SET_WEEKEVENTREG(WEEKEVENTREG_18_10);
break;
+
case 0x06C6:
SET_WEEKEVENTREG(WEEKEVENTREG_55_10);
break;
+
case 0x06A7:
SET_WEEKEVENTREG(WEEKEVENTREG_18_08);
break;
+
case 0x06C4:
SET_WEEKEVENTREG(WEEKEVENTREG_55_08);
break;
+
case 0x06A5:
SET_WEEKEVENTREG(WEEKEVENTREG_18_04);
break;
+
case 0x06C2:
SET_WEEKEVENTREG(WEEKEVENTREG_55_04);
break;
+
+ default:
+ break;
}
}
@@ -1474,7 +1518,7 @@ void EnOssan_InitShop(EnOssan* this, PlayState* play) {
this->cursorPos.y = this->cursorPos.x = 100.0f;
this->cutsceneState = ENOSSAN_CUTSCENESTATE_STOPPED;
- this->cutscene = this->lookToShopkeeperCutscene;
+ this->csId = this->lookToShopkeeperCsId;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.colChkInfo.cylRadius = 50;
this->stickAccumX = this->stickAccumY = 0;
@@ -1538,10 +1582,10 @@ void EnOssan_InitShop(EnOssan* this, PlayState* play) {
}
void EnOssan_GetCutscenes(EnOssan* this, PlayState* play) {
- this->lookToShopkeeperCutscene = this->actor.cutscene;
- this->lookToLeftShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperCutscene);
- this->lookToRightShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToLeftShelfCutscene);
- this->lookToShopKeeperFromShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToRightShelfCutscene);
+ this->lookToShopkeeperCsId = this->actor.csId;
+ this->lookToLeftShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookToShopkeeperCsId);
+ this->lookToRightShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookToLeftShelfCsId);
+ this->lookToShopKeeperFromShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookToRightShelfCsId);
}
void EnOssan_Update(Actor* thisx, PlayState* play) {
@@ -1575,7 +1619,7 @@ void EnOssan_DrawCursor(PlayState* play, EnOssan* this, f32 x, f32 y, f32 z, u8
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1637,7 +1681,7 @@ void EnOssan_DrawStickDirectionPrompts(PlayState* play, EnOssan* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1698,7 +1742,8 @@ s32 EnOssan_PartTimer_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
void EnOssan_CuriosityShopMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnOssan* this = THIS;
- if (limbIndex == FSN_LIMB_PELVIS || limbIndex == FSN_LIMB_LEFT_UPPER_ARM || limbIndex == FSN_LIMB_RIGHT_UPPER_ARM) {
+ if ((limbIndex == FSN_LIMB_PELVIS) || (limbIndex == FSN_LIMB_LEFT_UPPER_ARM) ||
+ (limbIndex == FSN_LIMB_RIGHT_UPPER_ARM)) {
rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
}
@@ -1720,7 +1765,7 @@ void EnOssan_CuriosityShopMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOssan_CuriosityShopMan_OverrideLimbDraw, EnOssan_CuriosityShopMan_PostLimbDraw,
@@ -1738,7 +1783,7 @@ void EnOssan_PartTimer_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnOssan_PartTimer_OverrideLimbDraw, EnOssan_PartTimer_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
index a4787cc14..c5de183d5 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h
@@ -43,11 +43,11 @@ typedef struct EnOssan {
/* 0x2B0 */ u8 arrowAnimState;
/* 0x2B1 */ u8 stickAnimState;
/* 0x2B4 */ f32 shopItemSelectedTween;
- /* 0x2B8 */ s16 lookToShopkeeperCutscene;
- /* 0x2BA */ s16 lookToLeftShelfCutscene;
- /* 0x2BC */ s16 lookToRightShelfCutscene;
- /* 0x2BE */ s16 lookToShopKeeperFromShelfCutscene;
- /* 0x2C0 */ s16 cutscene;
+ /* 0x2B8 */ s16 lookToShopkeeperCsId;
+ /* 0x2BA */ s16 lookToLeftShelfCsId;
+ /* 0x2BC */ s16 lookToRightShelfCsId;
+ /* 0x2BE */ s16 lookToShopKeeperFromShelfCsId;
+ /* 0x2C0 */ s16 csId;
/* 0x2C2 */ s16 cutsceneState;
/* 0x2C4 */ u16 textId;
/* 0x2C6 */ Vec3s headRot;
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.c b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
index ed5078864..df6d3708f 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.c
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.c
@@ -4,6 +4,7 @@
* Description: Seahorse
*/
+#include "prevent_bss_reordering.h"
#include "z_en_ot.h"
#include "objects/object_ot/object_ot.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -161,7 +162,7 @@ void EnOt_Init(Actor* thisx, PlayState* play) {
this->actor.shape.rot.z = 0;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.gravity = 0.0f;
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, 0, &this->animIndex);
this->skelAnime.curFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
@@ -300,20 +301,20 @@ void func_80B5BB38(Color_RGB8* arg0, Color_RGB8* arg1, f32 arg2) {
void func_80B5BDA8(EnOt* this, PlayState* play) {
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, sAnimations, 1, &this->animIndex);
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
this->actionFunc = func_80B5BE04;
}
void func_80B5BE04(EnOt* this, PlayState* play) {
switch (this->unk_388) {
case 0:
- if (SubS_StartActorCutscene(&this->actor, this->cutscenes[2], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->actor, this->csIdList[2], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
func_80B5BF60(this, play);
}
break;
case 1:
- if (SubS_StartActorCutscene(&this->actor, this->cutscenes[3], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->actor, this->csIdList[3], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
func_80B5BF60(this, play);
}
break;
@@ -508,11 +509,11 @@ void func_80B5C6DC(EnOt* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_84_10);
switch (this->unk_388) {
case 0:
- ActorCutscene_Stop(this->cutscenes[2]);
+ CutsceneManager_Stop(this->csIdList[2]);
break;
case 1:
- ActorCutscene_Stop(this->cutscenes[3]);
+ CutsceneManager_Stop(this->csIdList[3]);
break;
}
this->unk_73C = -1;
@@ -591,7 +592,7 @@ void func_80B5CA30(EnOt* this, PlayState* play) {
}
void func_80B5CAD0(EnOt* this, PlayState* play) {
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes) / 2);
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList) / 2);
this->actionFunc = func_80B5CB0C;
}
@@ -626,7 +627,7 @@ void func_80B5CC88(EnOt* this, PlayState* play) {
}
void func_80B5CCA0(EnOt* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->actor, this->cutscenes[0], 0x7C, SUBS_CUTSCENE_NORMAL)) {
+ if (SubS_StartCutscene(&this->actor, this->csIdList[0], CS_ID_GLOBAL_TALK, SUBS_CUTSCENE_NORMAL)) {
Player* player = GET_PLAYER(play);
player->stateFlags2 |= PLAYER_STATE2_20000000;
@@ -665,11 +666,14 @@ void func_80B5CD40(EnOt* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1069)) {
this->unk_32C |= 4;
- ActorCutscene_Stop(this->cutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
player->stateFlags2 &= ~PLAYER_STATE2_20000000;
func_80B5CE6C(this, play);
}
break;
+
+ default:
+ break;
}
}
@@ -948,7 +952,7 @@ void EnOt_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 10.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->actor.world.pos.y <= this->actor.floorHeight + 50.0f) {
this->actor.world.pos.y = this->actor.floorHeight + 50.0f;
@@ -993,7 +997,7 @@ void func_80B5DB6C(Actor* thisx, PlayState* play) {
func_80B5B2E0(play, &this->actor.world.pos, ENOT_GET_7F(&this->actor), &sp50, &this->unk_340);
if (Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_OT, sp50.x, sp50.y, sp50.z, 0,
this->actor.shape.rot.y, 1, ENOT_GET_3FFF(&this->actor) | 0x8000,
- this->actor.cutscene, this->actor.halfDaysBits, NULL) != NULL) {
+ this->actor.csId, this->actor.halfDaysBits, NULL) != NULL) {
this->unk_32C |= 8;
}
} else if (D_80B5E888 != NULL) {
@@ -1011,7 +1015,7 @@ void func_80B5DB6C(Actor* thisx, PlayState* play) {
temp->unk_32C |= 8;
temp->unk_346 = ENOT_GET_7F(&this->actor);
temp->actor.params = this->actor.params;
- temp->actor.cutscene = this->actor.cutscene;
+ temp->actor.csId = this->actor.csId;
this->unk_32C |= 8;
}
} else if (SurfaceType_IsHorseBlocked(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId)) {
@@ -1031,8 +1035,8 @@ void EnOt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 25);
- POLY_XLU_DISP = func_8012C2B4(POLY_XLU_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
+ POLY_XLU_DISP = Gfx_SetupDL71(POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
@@ -1044,7 +1048,7 @@ void EnOt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- gfx = func_8012C7FC(POLY_XLU_DISP);
+ gfx = Gfx_SetupDL65_NoCD(POLY_XLU_DISP);
gDPSetDither(&gfx[0], G_CD_NOISE);
gDPSetCombineLERP(&gfx[1], 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
@@ -1139,7 +1143,7 @@ void func_80B5E1D8(PlayState* play, EnOtUnkStruct* arg1, s32 arg2) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < arg2; i++, arg1++) {
if (arg1->unk_00) {
diff --git a/src/overlays/actors/ovl_En_Ot/z_en_ot.h b/src/overlays/actors/ovl_En_Ot/z_en_ot.h
index 7e8d7f651..8b01c6654 100644
--- a/src/overlays/actors/ovl_En_Ot/z_en_ot.h
+++ b/src/overlays/actors/ovl_En_Ot/z_en_ot.h
@@ -45,7 +45,7 @@ typedef struct EnOt {
/* 0x346 */ s16 unk_346;
/* 0x348 */ Vec3f unk_348;
/* 0x354 */ s16 unk_354;
- /* 0x356 */ s16 cutscenes[4];
+ /* 0x356 */ s16 csIdList[4];
/* 0x360 */ struct EnOt* unk_360;
/* 0x364 */ LightNode* lightNode;
/* 0x368 */ LightInfo lightInfo;
diff --git a/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
index 52287f317..e5b4cabe3 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.c
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
@@ -44,8 +44,8 @@ void EnOwl_ChangeMode(EnOwl* this, EnOwlActionFunc actionFunc, EnOwlFunc unkFunc
AnimationHeader* animation, f32 morphFrames);
typedef enum {
- /* 0x00 */ OWL_REPEAT,
- /* 0x01 */ OWL_OK
+ /* 0 */ OWL_REPEAT,
+ /* 1 */ OWL_OK
} EnOwlMessageChoice;
ActorInit En_Owl_InitVars = {
@@ -102,19 +102,19 @@ void EnOwl_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnOwl* this = THIS;
s32 i;
- s16 cutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
s32 owlType;
s32 switchFlag;
- for (i = 0; i < ARRAY_COUNT(this->unk_400); i++) {
- this->unk_400[i] = cutscene;
- if (cutscene != -1) {
- this->actor.cutscene = cutscene;
- cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
- this->actor.cutscene = this->unk_400[0];
+ this->actor.csId = this->csIdList[0];
Actor_ProcessInitChain(&this->actor, sInitChain);
if (ENOWL_GET_TYPE(&this->actor) == ENOWL_GET_TYPE_30) {
Actor_SetScale(&this->actor, 0.1f);
@@ -144,7 +144,7 @@ void EnOwl_Init(Actor* thisx, PlayState* play) {
this->unk_409 = 4;
this->unk_40B = this->unk_408 = 0;
this->unk_40C = 4;
- this->unk_406 = -1;
+ this->csIdIndex = -1;
owlType = ENOWL_GET_TYPE(&this->actor);
switchFlag = ENOWL_GET_SWITCHFLAG(&this->actor);
@@ -157,7 +157,7 @@ void EnOwl_Init(Actor* thisx, PlayState* play) {
break;
case ENOWL_GET_TYPE_2:
- if (gSaveContext.save.inventory.items[ITEM_LENS] == ITEM_LENS) {
+ if (gSaveContext.save.saveInfo.inventory.items[ITEM_LENS] == ITEM_LENS) {
Actor_Kill(&this->actor);
return;
}
@@ -271,7 +271,7 @@ void func_8095AB1C(EnOwl* this, PlayState* play) {
}
void func_8095AB4C(EnOwl* this) {
- if (randPlusMinusPoint5Scaled(1.0f) < 0.0f) {
+ if (Rand_CenteredFloat(1.0f) < 0.0f) {
this->actionFlags |= 0x20;
} else {
this->actionFlags &= ~0x20;
@@ -315,11 +315,11 @@ void func_8095AC50(EnOwl* this, PlayState* play) {
void func_8095ACEC(EnOwl* this) {
this->actionFlags &= ~0x40;
- if (this->unk_406 >= 0) {
- if (ActorCutscene_GetCurrentIndex() == this->unk_400[this->unk_406]) {
- ActorCutscene_Stop(this->unk_400[this->unk_406]);
+ if (this->csIdIndex >= 0) {
+ if (CutsceneManager_GetCurrentCsId() == this->csIdList[this->csIdIndex]) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
- this->unk_406 = -1;
+ this->csIdIndex = -1;
}
}
@@ -387,7 +387,7 @@ void func_8095AFEC(EnOwl* this, PlayState* play) {
if (func_8095A978(this, play, 0xBF6, 200.0f, 100.0f)) {
Audio_PlayFanfare(NA_BGM_OWL);
this->actionFunc = func_8095AF2C;
- this->unk_406 = 0;
+ this->csIdIndex = 0;
this->actionFlags |= 0x40;
}
}
@@ -502,7 +502,7 @@ void func_8095B574(EnOwl* this, PlayState* play) {
this->actionFunc = func_8095BA84;
Audio_PlayFanfare(NA_BGM_OWL);
this->actionFlags |= 0x40;
- this->unk_406 = 2;
+ this->csIdIndex = 2;
} else if (this->actor.xzDistToPlayer < 200.0f) {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8500(&this->actor, play, 200.0f, 400.0f, PLAYER_IA_NONE);
@@ -674,7 +674,7 @@ void func_8095BA84(EnOwl* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
this->actor.home.rot.x = 0;
func_8095ACEC(this);
- this->unk_406 = 0;
+ this->csIdIndex = 0;
this->actionFlags |= 0x40;
break;
@@ -714,7 +714,7 @@ void func_8095BE0C(EnOwl* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_8095BA84;
Audio_PlayFanfare(NA_BGM_OWL);
- this->unk_406 = 1;
+ this->csIdIndex = 1;
this->actionFlags |= 0x40;
} else if (this->actor.textId == 0xBF0) {
if (this->actor.isTargeted) {
@@ -865,16 +865,16 @@ s32 func_8095C510(EnOwl* this) {
void func_8095C568(EnOwl* this) {
if (this->actionFlags & 0x40) {
- if ((this->unk_406 < 0) || (this->unk_400[this->unk_406] < 0)) {
+ if ((this->csIdIndex < 0) || (this->csIdList[this->csIdIndex] < 0)) {
this->actionFlags &= ~0x40;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_400[this->unk_406]);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_400[this->unk_406])) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_400[this->unk_406], &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[this->csIdIndex], &this->actor);
this->actionFlags &= ~0x40;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_400[this->unk_406]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
}
@@ -894,7 +894,7 @@ void EnOwl_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
func_8095C568(this);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if (this->actor.update != NULL) {
@@ -1077,7 +1077,7 @@ void func_8095CCF4(Actor* thisx, PlayState* play) {
}
this->actor.world.pos.y -= 1.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->unk_3DA = (this->unk_3DA >> 3) * 7;
if (this->unk_3DC > 0) {
@@ -1151,7 +1151,7 @@ void EnOwl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
@@ -1172,7 +1172,7 @@ void func_8095D074(Actor* thisx, PlayState* play) {
if (this->unk_3DC >= 0x20) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -1180,7 +1180,7 @@ void func_8095D074(Actor* thisx, PlayState* play) {
} else {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_XLU_SURF2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)(this->unk_3DC * 8));
diff --git a/src/overlays/actors/ovl_En_Owl/z_en_owl.h b/src/overlays/actors/ovl_En_Owl/z_en_owl.h
index 033857886..095434fa0 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.h
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.h
@@ -17,7 +17,7 @@ typedef enum {
/* 0x002 */ ENOWL_GET_TYPE_2,
/* 0x003 */ ENOWL_GET_TYPE_3,
/* 0x01E */ ENOWL_GET_TYPE_30 = 30,
- /* 0x3E8 */ ENOWL_GET_TYPE_1000 = 1000,
+ /* 0x3E8 */ ENOWL_GET_TYPE_1000 = 1000
} EnOwlType;
typedef struct EnOwl {
@@ -44,8 +44,8 @@ typedef struct EnOwl {
/* 0x3F4 */ Path* path;
/* 0x3F8 */ s32 unk_3F8;
/* 0x3FC */ s32 unk_3FC;
- /* 0x400 */ s16 unk_400[3];
- /* 0x406 */ s16 unk_406;
+ /* 0x400 */ s16 csIdList[3];
+ /* 0x406 */ s16 csIdIndex;
/* 0x408 */ u8 unk_408;
/* 0x409 */ u8 unk_409;
/* 0x40A */ u8 unk_40A;
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
index 36605afcb..e47515c5d 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -154,9 +154,7 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
func_80BD8588(this, play);
func_80BD8658(this);
- if (1) {}
-
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) ||
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || (gSaveContext.save.entrance == ENTRANCE(IKANA_CANYON, 9))) {
Actor_Kill(&this->actor);
}
@@ -169,9 +167,9 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
}
func_80BD8700(this);
} else {
- this->pathIndex = this->pathPointsCount - 1;
- Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathIndex]);
- Math_Vec3s_ToVec3f(&sp44, &this->pathPoints[this->pathIndex - 1]);
+ this->waypointIndex = this->pathCount - 1;
+ Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->waypointIndex]);
+ Math_Vec3s_ToVec3f(&sp44, &this->pathPoints[this->waypointIndex - 1]);
this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&sp44, &this->actor.world.pos);
func_80BD8CCC(this);
}
@@ -197,33 +195,33 @@ s32 func_80BD84F0(EnPamera* this, PlayState* play) {
}
void func_80BD8588(EnPamera* this, PlayState* play) {
- Path* path = &play->setupPathList[((this->actor.params & 0xFF0) >> 4)];
+ Path* path = &play->setupPathList[ENPAMERA_GET_PATH_INDEX(&this->actor)];
Vec3f sp28;
if (path == NULL) {
Actor_Kill(&this->actor);
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_61_04)) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
- this->pathPointsCount = path->count;
- this->pathId = path->unk1;
+ this->waypointIndex = 0;
+ this->pathCount = path->count;
+ this->additionalPathIndex = path->additionalPathIndex;
Math_Vec3s_ToVec3f(&sp28, this->pathPoints);
this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &sp28);
}
void func_80BD8658(EnPamera* this) {
s32 i;
- s16 nextCutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
- for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
- if (nextCutscene == -1) {
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ if (csId == CS_ID_NONE) {
break;
}
- this->cutscenes[i] = nextCutscene;
- nextCutscene = ActorCutscene_GetAdditionalCutscene(nextCutscene);
+ this->csIdList[i] = csId;
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
}
@@ -242,18 +240,18 @@ void func_80BD8700(EnPamera* this) {
void func_80BD8758(EnPamera* this, PlayState* play) {
if (this->hideInisdeTimer++ > 1800) {
- if (ActorCutscene_GetCanPlayNext(this->cutscenes[0]) && (this->cutscenes[0] != -1)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscenes[0], &this->actor);
- Camera_SetToTrackActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(this->cutscenes[0])),
- &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[0]) && (this->csIdList[0] != -1)) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[0])),
+ &this->actor);
this->actor.speed = 1.5f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
this->actor.shape.rot.y = this->actor.home.rot.y;
this->actor.world.rot.y = this->actor.home.rot.y;
func_80BD9338(this, play);
func_80BD8908(this);
- } else if ((this->cutscenes[0] != -1) && (this->actor.xzDistToPlayer < 1000.0f)) {
- ActorCutscene_SetIntentToPlay(this->cutscenes[0]);
+ } else if ((this->csIdList[0] != -1) && (this->actor.xzDistToPlayer < 1000.0f)) {
+ CutsceneManager_Queue(this->csIdList[0]);
} else {
this->actor.speed = 1.5f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
@@ -325,20 +323,20 @@ void func_80BD8B70(EnPamera* this, PlayState* play) {
Vec3f vec;
s16 sp32;
- vec.x = this->pathPoints[this->pathIndex].x;
- vec.y = this->pathPoints[this->pathIndex].y;
- vec.z = this->pathPoints[this->pathIndex].z;
+ vec.x = this->pathPoints[this->waypointIndex].x;
+ vec.y = this->pathPoints[this->waypointIndex].y;
+ vec.z = this->pathPoints[this->waypointIndex].z;
sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &vec);
if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &vec, this->actor.speed) > 10.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp32, 0xA, 0x3000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (this->pathIndex < (this->pathPointsCount - 1)) {
- this->pathIndex++;
+ } else if (this->waypointIndex < (this->pathCount - 1)) {
+ this->waypointIndex++;
} else {
func_80BD8CCC(this);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y += this->actor.gravity;
}
@@ -358,8 +356,8 @@ void func_80BD8D1C(EnPamera* this, PlayState* play) {
}
void func_80BD8D80(EnPamera* this) {
- if (this->pathIndex > 0) {
- this->pathIndex--;
+ if (this->waypointIndex > 0) {
+ this->waypointIndex--;
}
this->actor.gravity = -2.0f;
this->actionFunc = func_80BD8DB0;
@@ -369,20 +367,20 @@ void func_80BD8DB0(EnPamera* this, PlayState* play) {
Vec3f vec;
s16 sp32;
- vec.x = this->pathPoints[this->pathIndex].x;
- vec.y = this->pathPoints[this->pathIndex].y;
- vec.z = this->pathPoints[this->pathIndex].z;
+ vec.x = this->pathPoints[this->waypointIndex].x;
+ vec.y = this->pathPoints[this->waypointIndex].y;
+ vec.z = this->pathPoints[this->waypointIndex].z;
sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &vec);
if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &vec, this->actor.speed) > 10.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp32, 0xA, 0x3000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (this->pathIndex > 0) {
- this->pathIndex--;
+ } else if (this->waypointIndex > 0) {
+ this->waypointIndex--;
} else {
func_80BD9338(this, play);
func_80BD8A38(this);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y += this->actor.gravity;
}
@@ -406,9 +404,9 @@ void func_80BD8FF0(EnPamera* this) {
Vec3f pameraPos;
s16 pameraYaw;
- this->pathIndex = this->pathPointsCount - 1;
- Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathPointsCount - 1]);
- Math_Vec3s_ToVec3f(&pameraPos, &this->pathPoints[this->pathPointsCount - 2]);
+ this->waypointIndex = this->pathCount - 1;
+ Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathCount - 1]);
+ Math_Vec3s_ToVec3f(&pameraPos, &this->pathPoints[this->pathCount - 2]);
pameraYaw = Math_Vec3f_Yaw(&pameraPos, &this->actor.world.pos);
this->actor.shape.rot.y = pameraYaw;
this->actor.world.rot.y = pameraYaw;
@@ -424,18 +422,18 @@ void func_80BD90AC(EnPamera* this, PlayState* play) {
if (Player_GetMask(play) != PLAYER_MASK_STONE && (this->actionFunc != func_80BD8758) &&
(this->actionFunc != func_80BD8964) && (this->actionFunc != func_80BD8A7C) &&
- (this->actionFunc != func_80BD8F60) && ((this->actionFunc != func_80BD8B70) || (this->pathIndex != 0)) &&
+ (this->actionFunc != func_80BD8F60) && ((this->actionFunc != func_80BD8B70) || (this->waypointIndex != 0)) &&
((this->actionFunc != func_80BD8DB0) || (this->actor.speed != 3.0f)) &&
((this->actor.xzDistToPlayer < 150.0f) ||
((this->actionFunc == func_80BD909C) &&
(Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos) < 200.0f)))) {
- if ((ActorCutscene_GetCanPlayNext(this->cutscenes[1])) && ((this->cutscenes[1] != -1))) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscenes[1], &this->actor);
- Camera_SetToTrackActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(this->cutscenes[1])),
- &this->actor);
+ if ((CutsceneManager_IsNext(this->csIdList[1])) && ((this->csIdList[1] != -1))) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[1], &this->actor);
+ Camera_SetFocalActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csIdList[1])),
+ &this->actor);
EnPamera_LookDownWell(this);
- } else if (this->cutscenes[1] != -1) {
- ActorCutscene_SetIntentToPlay(this->cutscenes[1]);
+ } else if (this->csIdList[1] != -1) {
+ CutsceneManager_Queue(this->csIdList[1]);
} else {
EnPamera_LookDownWell(this);
}
@@ -458,14 +456,14 @@ s32 func_80BD9234(EnPamera* this, PlayState* play) {
void func_80BD92D0(EnPamera* this, PlayState* play) {
Path* path;
- s32 pathId = this->pathId;
+ s32 pathIndex = this->additionalPathIndex;
- path = &play->setupPathList[pathId];
- if (pathId >= 0) {
+ path = &play->setupPathList[pathIndex];
+ if (pathIndex >= 0) {
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
- this->pathPointsCount = path->count;
- this->pathId = path->unk1;
+ this->waypointIndex = 0;
+ this->pathCount = path->count;
+ this->additionalPathIndex = path->additionalPathIndex;
}
}
@@ -556,12 +554,14 @@ void EnPamera_Draw(Actor* thisx, PlayState* play) {
EnPamera* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_80BDA604[this->unk_312]));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(D_80BDA610[this->unk_314]));
gSPSegment(POLY_OPA_DISP++, 0x0A, SEGMENTED_TO_VIRTUAL(D_80BDA5FC[this->unk_310]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPamera_OverrideLimbDraw, EnPamera_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -569,7 +569,7 @@ void func_80BD9840(EnPamera* this, PlayState* play) {
this->actor.update = func_80BDA344;
this->actor.flags |= ACTOR_FLAG_2000000;
this->actor.flags |= ACTOR_FLAG_100000;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
func_80BD9E60(this);
func_80BD9938(this);
} else {
@@ -599,13 +599,13 @@ void func_80BD9938(EnPamera* this) {
void func_80BD994C(EnPamera* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
- if (1) {}
func_80BD93CC(this, 0, 1);
Message_StartTextbox(play, 0x15A8, &this->actor);
this->unk_324 = 0x15A8;
} else if ((gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) ||
- (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20))) {
+ (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) &&
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20))) {
func_80BD93CC(this, 1, 0);
Message_StartTextbox(play, 0x158E, &this->actor);
this->unk_324 = 0x158E;
@@ -695,14 +695,14 @@ void func_80BD9C70(EnPamera* this, PlayState* play) {
}
s32 func_80BD9CB8(EnPamera* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 0x1E5)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 0x1E5);
- if (this->unk_326 != play->csCtx.actorActions[actionIndex]->action) {
- this->unk_326 = play->csCtx.actorActions[actionIndex]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_485)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_485);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
func_80BD9E88(this);
break;
@@ -727,18 +727,18 @@ s32 func_80BD9CB8(EnPamera* this, PlayState* play) {
break;
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
this->setupFunc(this, play);
return 1;
}
- if ((play->csCtx.state == 0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20)) {
+ if ((play->csCtx.state == CS_STATE_IDLE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20)) {
if ((this->actionFunc != func_80BD994C) && (this->actionFunc != EnPamera_HandleDialogue)) {
this->actor.shape.rot.y = this->actor.world.rot.y;
func_80BD9904(this);
func_80BD9E60(this);
}
}
- this->unk_326 = 0x63;
+ this->cueId = 99;
return 0;
}
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
index 34f18e815..4fa3e4f5f 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
@@ -9,6 +9,8 @@ struct EnPamera;
typedef void (*EnPameraActionFunc)(struct EnPamera*, PlayState*);
typedef void (*EnPameraSetupFunc)(struct EnPamera*, PlayState*);
+#define ENPAMERA_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF0) >> 4)
+
typedef struct EnPamera {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
@@ -16,9 +18,9 @@ typedef struct EnPamera {
/* 0x1D4 */ EnPameraActionFunc actionFunc;
/* 0x1D8 */ EnPameraSetupFunc setupFunc;
/* 0x1DC */ Vec3s* pathPoints;
- /* 0x1E0 */ s32 pathIndex;
- /* 0x1E4 */ s32 pathPointsCount;
- /* 0x1E8 */ s32 pathId;
+ /* 0x1E0 */ s32 waypointIndex;
+ /* 0x1E4 */ s32 pathCount;
+ /* 0x1E8 */ s32 additionalPathIndex;
/* 0x1EC */ s32 unk_1EC;
/* 0x1F0 */ Vec3s jointTable[PAMELA_LIMB_MAX];
/* 0x27A */ Vec3s morphTable[PAMELA_LIMB_MAX];
@@ -28,13 +30,13 @@ typedef struct EnPamera {
/* 0x312 */ s16 unk_312;
/* 0x314 */ s16 unk_314;
/* 0x316 */ s16 unk_316;
- /* 0x318 */ s16 cutscenes[2];
+ /* 0x318 */ s16 csIdList[2];
/* 0x31C */ s16 hideInisdeTimer;
/* 0x31E */ s16 unk_31E;
/* 0x320 */ UNK_TYPE1 unk_320[0x2];
/* 0x322 */ s16 unk_322;
/* 0x324 */ u16 unk_324;
- /* 0x326 */ u16 unk_326;
+ /* 0x326 */ u16 cueId;
} EnPamera; // size = 0x328
#endif // Z_EN_PAMERA_H
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 50cae4844..4c75fac65 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -80,12 +80,12 @@ ActorInit En_Pametfrog_InitVars = {
};
typedef enum {
- /* 0x0 */ GEKKO_DMGEFF_NONE,
- /* 0x1 */ GEKKO_DMGEFF_STUN,
- /* 0x2 */ GEKKO_DMGEFF_FIRE,
- /* 0x3 */ GEKKO_DMGEFF_ICE,
- /* 0x4 */ GEKKO_DMGEFF_LIGHT,
- /* 0x5 */ GEKKO_DMGEFF_ZORA_BARRIER,
+ /* 0 */ GEKKO_DMGEFF_NONE,
+ /* 1 */ GEKKO_DMGEFF_STUN,
+ /* 2 */ GEKKO_DMGEFF_FIRE,
+ /* 3 */ GEKKO_DMGEFF_ICE,
+ /* 4 */ GEKKO_DMGEFF_LIGHT,
+ /* 5 */ GEKKO_DMGEFF_ZORA_BARRIER
} EnPametfrogDamageEffect;
static DamageTable sDamageTable = {
@@ -306,7 +306,7 @@ s32 func_8086A2CC(EnPametfrog* this, CollisionPoly* floorPoly) {
return false;
}
- rotation = func_80086C48(arg0);
+ rotation = Math_FAcosF(arg0);
if (rotation < 0.0001f) {
return false;
}
@@ -341,8 +341,8 @@ void EnPametfrog_StopCutscene(EnPametfrog* this, PlayState* play) {
subCam = Play_GetCamera(play, this->subCamId);
Play_SetCameraAtEye(play, CAM_ID_MAIN, &subCam->at, &subCam->eye);
this->subCamId = SUB_CAM_ID_DONE;
- ActorCutscene_Stop(this->cutscene);
- func_800B724C(play, &this->actor, PLAYER_CSMODE_6);
+ CutsceneManager_Stop(this->csId);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_END);
}
}
@@ -523,7 +523,7 @@ void EnPametfrog_FallOffSnapper(EnPametfrog* this, PlayState* play) {
this->timer--;
}
- sin = sin_rad(this->timer * (M_PI / 3)) * ((0.02f * (this->timer * (1.0f / 6.0f))) + 0.005f) + 1.0f;
+ sin = Math_SinF(this->timer * (M_PI / 3)) * ((0.02f * (this->timer * (1.0f / 6.0f))) + 0.005f) + 1.0f;
EnPametfrog_ShakeCamera(this, play, 300.0f * sin, 100.0f * sin);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnPametfrog_StopCutscene(this, play);
@@ -966,9 +966,9 @@ void EnPametfrog_SetupSpawnFrog(EnPametfrog* this, PlayState* play) {
Flags_SetClearTemp(play, play->roomCtx.curRoom.num);
for (i = 0; i < 25; i++) {
- vel.x = randPlusMinusPoint5Scaled(5.0f);
+ vel.x = Rand_CenteredFloat(5.0f);
vel.y = Rand_ZeroFloat(3.0f) + 4.0f;
- vel.z = randPlusMinusPoint5Scaled(5.0f);
+ vel.z = Rand_CenteredFloat(5.0f);
EffectSsHahen_Spawn(play, &this->actor.world.pos, &vel, &sAccel, 0, Rand_S16Offset(12, 3), HAHEN_OBJECT_DEFAULT,
10, 0);
}
@@ -981,7 +981,7 @@ void EnPametfrog_SpawnFrog(EnPametfrog* this, PlayState* play) {
f32 magShake;
this->timer--;
- magShake = (sin_rad(this->timer * (M_PI / 5)) * ((0.04f * (this->timer * 0.1f)) + 0.02f)) + 1.0f;
+ magShake = (Math_SinF(this->timer * (M_PI / 5)) * ((0.04f * (this->timer * 0.1f)) + 0.02f)) + 1.0f;
EnPametfrog_ShakeCamera(this, play, 75.0f * magShake, 10.0f * magShake);
if (this->timer == 0) {
EnPametfrog_StopCutscene(this, play);
@@ -991,22 +991,22 @@ void EnPametfrog_SpawnFrog(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupCutscene(EnPametfrog* this) {
if (this->actor.colChkInfo.health == 0) {
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
} else {
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
this->actionFunc = EnPametfrog_PlayCutscene;
this->actor.speed = 0.0f;
this->actor.velocity.y = 0.0f;
}
void EnPametfrog_PlayCutscene(EnPametfrog* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->cutscene);
- func_800B724C(play, &this->actor, PLAYER_CSMODE_7);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->csId);
+ func_800B724C(play, &this->actor, PLAYER_CSMODE_WAIT);
if (this->actor.colChkInfo.health == 0) {
if (this->actor.params == GEKKO_PRE_SNAPPER) {
EnPametfrog_SetupCallSnapper(this, play);
@@ -1017,7 +1017,7 @@ void EnPametfrog_PlayCutscene(EnPametfrog* this, PlayState* play) {
EnPametfrog_SetupFallOffSnapper(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -1224,10 +1224,10 @@ void EnPametfrog_SetupSnapperSpawn(EnPametfrog* this, PlayState* play) {
// Zooms in on Snapper spawn point
Play_SetCameraAtEye(play, this->subCamId, &subCamAt, &subCamEye);
- this->quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
+ this->quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(this->quakeIndex, 18000);
- Quake_SetQuakeValues(this->quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(this->quakeIndex, 15);
+ Quake_SetPerturbations(this->quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(this->quakeIndex, 15);
Rumble_Request(this->actor.xyzDistToPlayerSq, 120, 20, 10);
@@ -1249,12 +1249,12 @@ void EnPametfrog_SnapperSpawn(EnPametfrog* this, PlayState* play) {
void EnPametfrog_SetupTransitionGekkoSnapper(EnPametfrog* this, PlayState* play) {
this->actor.params = GEKKO_GET_SNAPPER;
- Quake_Remove(this->quakeIndex);
+ Quake_RemoveRequest(this->quakeIndex);
- this->quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ this->quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(this->quakeIndex, 20000);
- Quake_SetQuakeValues(this->quakeIndex, 17, 0, 0, 0);
- Quake_SetCountdown(this->quakeIndex, 12);
+ Quake_SetPerturbations(this->quakeIndex, 17, 0, 0, 0);
+ Quake_SetDuration(this->quakeIndex, 12);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
@@ -1343,7 +1343,9 @@ void EnPametfrog_Update(Actor* thisx, PlayState* play) {
if (this->actor.gravity < -0.1f) {
Actor_MoveWithGravity(&this->actor);
arg3 = this->actionFunc == EnPametfrog_FallInAir ? 3.0f : 15.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, arg3, 3.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, arg3, 3.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
} else if (this->freezeTimer == 0) {
Actor_MoveWithoutGravity(&this->actor);
this->actor.floorHeight = this->actor.world.pos.y;
@@ -1422,7 +1424,7 @@ void EnPametfrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
void EnPametfrog_Draw(Actor* thisx, PlayState* play) {
EnPametfrog* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateYS(this->spinYaw, MTXMODE_APPLY);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnPametfrog_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
index 9ae2f76df..31a3be14b 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
@@ -9,16 +9,16 @@ struct EnPametfrog;
typedef void (*EnPametfrogActionFunc)(struct EnPametfrog*, PlayState*);
typedef enum {
- /* 0x0 */ GEKKO_PRE_SNAPPER,
- /* 0x1 */ GEKKO_GET_SNAPPER,
- /* 0x2 */ GEKKO_INIT_SNAPPER,
- /* 0x3 */ GEKKO_ON_SNAPPER,
- /* 0x4 */ GEKKO_REAR_ON_SNAPPER,
- /* 0x5 */ GEKKO_CUTSCENE,
- /* 0x6 */ GEKKO_FALL_OFF_SNAPPER,
- /* 0x7 */ GEKKO_RETURN_TO_SNAPPER,
- /* 0x8 */ GEKKO_JUMP_ON_SNAPPER,
- /* 0x9 */ GEKKO_DEFEAT,
+ /* 0 */ GEKKO_PRE_SNAPPER,
+ /* 1 */ GEKKO_GET_SNAPPER,
+ /* 2 */ GEKKO_INIT_SNAPPER,
+ /* 3 */ GEKKO_ON_SNAPPER,
+ /* 4 */ GEKKO_REAR_ON_SNAPPER,
+ /* 5 */ GEKKO_CUTSCENE,
+ /* 6 */ GEKKO_FALL_OFF_SNAPPER,
+ /* 7 */ GEKKO_RETURN_TO_SNAPPER,
+ /* 8 */ GEKKO_JUMP_ON_SNAPPER,
+ /* 9 */ GEKKO_DEFEAT
} EnPametfrogState;
typedef struct EnPametfrog {
@@ -30,7 +30,7 @@ typedef struct EnPametfrog {
/* 0x2AC */ u8 drawDmgEffType;
/* 0x2AD */ u8 wallPauseTimer; // Gekko stops 10 times along wall/ceiling after being blown off of Snapper
/* 0x2AE */ u8 unk_2AE; // True/False
- /* 0x2B0 */ s16 cutscene;
+ /* 0x2B0 */ s16 csId;
/* 0x2B2 */ s16 params;
/* 0x2B4 */ s16 quakeIndex;
/* 0x2B6 */ s16 timer;
diff --git a/src/overlays/actors/ovl_En_Paper/z_en_paper.c b/src/overlays/actors/ovl_En_Paper/z_en_paper.c
index a3f158cbd..b2b3b5669 100644
--- a/src/overlays/actors/ovl_En_Paper/z_en_paper.c
+++ b/src/overlays/actors/ovl_En_Paper/z_en_paper.c
@@ -47,7 +47,7 @@ void EnPaper_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
this->timer = 70;
this->windForce = sUnitVecZ;
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnPaper_SetupSpreadConfettiGroup(this);
}
@@ -213,7 +213,7 @@ void EnPaper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, SHADE, 0, 0, 0, SHADE, PRIMITIVE, 0, COMBINED, 0, 0, 0, 0, COMBINED);
diff --git a/src/overlays/actors/ovl_En_Part/z_en_part.c b/src/overlays/actors/ovl_En_Part/z_en_part.c
index 2a12b9af8..e56970e10 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -90,10 +90,10 @@ void func_808654C4(EnPart* this, PlayState* play) {
break;
case ENPART_TYPE_4:
for (i = 7; i >= 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- effectPos.y = randPlusMinusPoint5Scaled(50.0f) +
+ effectPos.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ effectPos.y = Rand_CenteredFloat(50.0f) +
(this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y));
- effectPos.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
effectVelocity.y = Rand_ZeroOne() + 1.0f;
effectScale = Rand_S16Offset(80, 100);
EffectSsDtBubble_SpawnColorProfile(play, &effectPos, &effectVelocity, &gZeroVec3f, effectScale, 25,
@@ -125,7 +125,7 @@ void EnPart_Draw(Actor* thisx, PlayState* play) {
if (this->actor.params > ENPART_TYPE_0) {
Matrix_RotateZF(this->zRot, MTXMODE_APPLY);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
if (this->actor.params == ENPART_TYPE_15) {
gSPSegment(POLY_OPA_DISP++, 0x0C, gEmptyDL);
diff --git a/src/overlays/actors/ovl_En_Part/z_en_part.h b/src/overlays/actors/ovl_En_Part/z_en_part.h
index 662e8574e..5bd4de503 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.h
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.h
@@ -8,11 +8,11 @@ struct EnPart;
typedef void (*EnPartActionFunc)(struct EnPart*, PlayState*);
typedef enum {
- ENPART_TYPE_0 = 0,
- ENPART_TYPE_1 = 1,
- ENPART_TYPE_4 = 4,
- ENPART_TYPE_15 = 15
-} EnPartParams;
+ /* 0x0 */ ENPART_TYPE_0,
+ /* 0x1 */ ENPART_TYPE_1,
+ /* 0x4 */ ENPART_TYPE_4 = 4,
+ /* 0xF */ ENPART_TYPE_15 = 15
+} EnPartParam;
typedef struct EnPart {
/* 0x000 */ Actor actor;
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 6b4d3269b..645b7edf5 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -257,9 +257,9 @@ void func_80897258(PlayState* play, EnPeehat* this, Vec3f* arg2, f32 arg3, f32 a
sp44.x = (Math_SinS(sp42) * arg3) + arg2->x;
sp44.z = (Math_CosS(sp42) * arg3) + arg2->z;
- D_80899564.x = randPlusMinusPoint5Scaled(1.05f);
- D_80899564.z = randPlusMinusPoint5Scaled(1.05f);
- D_80899558.y = randPlusMinusPoint5Scaled(4.0f) + 8.0f;
+ D_80899564.x = Rand_CenteredFloat(1.05f);
+ D_80899564.z = Rand_CenteredFloat(1.05f);
+ D_80899558.y = Rand_CenteredFloat(4.0f) + 8.0f;
EffectSsHahen_Spawn(play, &sp44, &D_80899558, &D_80899564, 0, (Rand_ZeroFloat(5.0f) + 12.0f) * arg4,
HAHEN_OBJECT_DEFAULT, 10, NULL);
@@ -506,7 +506,7 @@ void func_80897F44(EnPeehat* this, PlayState* play) {
this->actor.world.pos.y -= 1.0f;
}
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->actor.world.pos.y += cos * 1.4f;
this->unk_2B8 += fabsf(cos * 0.18f) + 0.07f;
this->unk_2B0--;
@@ -514,7 +514,7 @@ void func_80897F44(EnPeehat* this, PlayState* play) {
if (this->unk_2B0 <= 0) {
this->actor.speed = Rand_ZeroFloat(0.5f) + 2.5f;
this->unk_2B0 = Rand_ZeroFloat(10.0f) + 10.0f;
- this->unk_2B6 = randPlusMinusPoint5Scaled(1000.0f);
+ this->unk_2B6 = Rand_CenteredFloat(1000.0f);
}
SkelAnime_Update(&this->skelAnime);
@@ -549,10 +549,10 @@ void func_80898144(EnPeehat* this, PlayState* play) {
} else {
this->actor.world.pos.y += 1.0f;
}
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->actor.world.pos.y += cos * 1.4f;
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->unk_2B8 += fabsf(cos * 0.18f) + 0.07f;
step = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos);
@@ -660,8 +660,9 @@ void func_80898654(EnPeehat* this) {
void func_808986A4(EnPeehat* this, PlayState* play) {
if (this->unk_2B0 == 5) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0x602, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0x602, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -750,7 +751,7 @@ void EnPeehat_Update(Actor* thisx, PlayState* play2) {
func_8089874C(this, play);
}
Actor_MoveWithGravity(thisx);
- Actor_UpdateBgCheckInfo(play, thisx, 25.0f, 30.0f, 30.0f, 5);
+ Actor_UpdateBgCheckInfo(play, thisx, 25.0f, 30.0f, 30.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
@@ -900,6 +901,7 @@ void EnPeehat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVecX(-400.0f, vec2);
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
Matrix_Translate(-1000.0f, 0.0f, 0.0f, MTXMODE_APPLY);
@@ -925,7 +927,7 @@ void EnPeehat_Draw(Actor* thisx, PlayState* play) {
Vec3f sp40;
s32 i;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnPeehat_OverrideLimbDraw,
(this->actor.params == 0) ? EnPeehat_PostLimbDraw : NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.c b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
index f1f34b6be..072f6d6ac 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -789,43 +789,43 @@ Actor* func_80AF8040(EnPm* this, PlayState* play) {
return actor;
}
-s32 func_80AF80F4(EnPm* this, s16 arg1) {
+s32 func_80AF80F4(EnPm* this, s16 csId) {
s32 ret = false;
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(arg1);
- } else if (ActorCutscene_GetCanPlayNext(arg1)) {
- ActorCutscene_StartAndSetUnkLinkFields(arg1, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(csId);
+ } else if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->actor);
ret = true;
} else {
- ActorCutscene_SetIntentToPlay(arg1);
+ CutsceneManager_Queue(csId);
}
return ret;
}
-s16 func_80AF8170(EnPm* this, s32 arg1) {
+s16 func_80AF8170(EnPm* this, s32 numCutscenes) {
s32 i;
- s16 cs = -1;
+ s16 csId = CS_ID_NONE;
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- cs = this->actor.child->cutscene;
+ csId = this->actor.child->csId;
- for (i = 0; i < arg1; i++) {
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ for (i = 0; i < numCutscenes; i++) {
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
}
- return cs;
+ return csId;
}
s32 func_80AF81E8(EnPm* this, PlayState* play) {
s32 pad;
- s16 sp2A = func_80AF8170(this, 0);
+ s16 csId = func_80AF8170(this, 0);
s32 ret = false;
switch (this->unk_378) {
case 0:
- if (!func_80AF80F4(this, sp2A)) {
+ if (!func_80AF80F4(this, csId)) {
break;
}
@@ -833,7 +833,8 @@ s32 func_80AF81E8(EnPm* this, PlayState* play) {
case 4:
case 6:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), this->actor.child);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
+ this->actor.child);
}
this->unk_378++;
ret = true;
@@ -843,16 +844,16 @@ s32 func_80AF81E8(EnPm* this, PlayState* play) {
case 3:
case 5:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_86_08) && (this->unk_378 == 3)) {
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
} else {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
}
this->unk_378++;
ret = true;
break;
case 7:
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
this->unk_378++;
ret = true;
break;
@@ -862,12 +863,12 @@ s32 func_80AF81E8(EnPm* this, PlayState* play) {
s32 func_80AF8348(EnPm* this, PlayState* play) {
s32 pad;
- s16 sp2A = func_80AF8170(this, 0);
+ s16 csId = func_80AF8170(this, 0);
s32 ret = false;
switch (this->unk_378) {
case 0:
- if (!func_80AF80F4(this, sp2A)) {
+ if (!func_80AF80F4(this, csId)) {
break;
}
@@ -875,7 +876,7 @@ s32 func_80AF8348(EnPm* this, PlayState* play) {
case 4:
case 6:
case 8:
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), &this->actor);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor);
this->unk_378++;
ret = true;
break;
@@ -885,14 +886,15 @@ s32 func_80AF8348(EnPm* this, PlayState* play) {
case 5:
case 7:
if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
- Camera_SetTargetActor(Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(sp2A)), this->actor.child);
+ Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)),
+ this->actor.child);
}
this->unk_378++;
ret = true;
break;
case 9:
- ActorCutscene_Stop(sp2A);
+ CutsceneManager_Stop(csId);
this->unk_378++;
ret = true;
break;
@@ -1017,7 +1019,7 @@ s32 func_80AF86F0(EnPm* this, PlayState* play) {
s32 func_80AF87C4(EnPm* this, PlayState* play) {
s32 ret = false;
- if ((play->csCtx.state != 0) && (play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 9) &&
+ if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 9) &&
(play->curSpawn == 1)) {
if (!this->unk_380) {
func_80AF7E98(this, 0);
@@ -1103,7 +1105,11 @@ void func_80AF8AC8(EnPm* this) {
void func_80AF8BA8(s32 arg0) {
static u16 D_80AFB8D4[] = {
- WEEKEVENTREG_27_02, WEEKEVENTREG_27_04, WEEKEVENTREG_27_08, WEEKEVENTREG_27_10, WEEKEVENTREG_27_20,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN,
};
static u16 D_80AFB8E0[] = {
WEEKEVENTREG_27_40, WEEKEVENTREG_27_80, WEEKEVENTREG_28_01, WEEKEVENTREG_28_02, WEEKEVENTREG_28_04,
@@ -1195,7 +1201,7 @@ s32 func_80AF8DD4(EnPm* this, PlayState* play) {
}
s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 actorCat, s16 actorId) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -1206,7 +1212,7 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
this->timePath = NULL;
sp2C = func_80AF7CB0(this, play, actorCat, actorId);
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((sp2C != NULL) && (sp2C->update != NULL)) {
@@ -1226,7 +1232,7 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -1237,10 +1243,10 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
door = func_80AF7D60(play, scheduleOutput->result);
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (this->timePath != 0) {
sp4C = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp40, &sp4C[0]);
@@ -1249,7 +1255,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
Math_Vec3f_Copy(&this->unk_278, &sp34);
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp40, &sp34);
Math_Vec3f_Copy(&this->actor.world.pos, &sp40);
- temp = this->actor.world.rot.y - door->dyna.actor.shape.rot.y;
+ temp = this->actor.world.rot.y - door->knobDoor.dyna.actor.shape.rot.y;
if (ABS_ALT(temp) <= 0x4000) {
this->unk_260 = -0x4B;
} else {
@@ -1275,7 +1281,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
@@ -1283,7 +1289,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -1355,7 +1361,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -1364,7 +1370,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -1388,7 +1394,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -1417,7 +1423,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
phi_a3 = D_80AFB430[scheduleOutput->result];
if (phi_a3 >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, phi_a3);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, phi_a3);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -1702,7 +1708,7 @@ s32 func_80AF9D04(EnPm* this, PlayState* play) {
f32 temp;
if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) {
- if ((door != NULL) && (door->dyna.actor.update != NULL)) {
+ if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) {
if (((f32)this->unk_36E / this->unk_36C) <= 0.9f) {
door->unk_1A7 = this->unk_260;
} else {
@@ -2042,7 +2048,7 @@ void func_80AFA5FC(EnPm* this, PlayState* play) {
void func_80AFA724(EnPm* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 8.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK);
}
@@ -2089,7 +2095,7 @@ void EnPm_Update(Actor* thisx, PlayState* play) {
func_80AF8AC8(this);
func_8013C964(&this->actor, play, this->unk_368, 30.0f, this->unk_394, this->unk_356 & 7);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_80AF7F68(this, play);
}
}
@@ -2112,7 +2118,7 @@ void EnPm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
switch (limbIndex) {
case 15:
- if (ActorCutscene_GetCurrentIndex() == -1) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
Matrix_MultVec3f(&gZeroVec3f, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
@@ -2179,7 +2185,7 @@ void EnPm_Draw(Actor* thisx, PlayState* play) {
s32 pad;
if (this->unk_258 != 0) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.h b/src/overlays/actors/ovl_En_Pm/z_en_pm.h
index c7bf76e37..bf7bbe859 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.h
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.h
@@ -9,6 +9,8 @@ typedef void (*EnPmActionFunc)(struct EnPm*, PlayState*);
typedef s32 (*EnPmFunc)(struct EnPm*, PlayState*);
typedef s32 (*EnPmFunc2)(struct EnPm*, PlayState*);
+#define ENPM_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
+
typedef struct EnPm {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
diff --git a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
index ac717641b..24517f8aa 100644
--- a/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
+++ b/src/overlays/actors/ovl_En_Po_Fusen/z_en_po_fusen.c
@@ -58,7 +58,7 @@ static ColliderSphereInit sSphereInit = {
typedef enum {
/* 0x0 */ POE_BALLOON_DMGEFF_NONE,
- /* 0xF */ POE_BALLOON_DMGEFF_POP = 0xF,
+ /* 0xF */ POE_BALLOON_DMGEFF_POP = 0xF
} PoeBalloonDamageEffect;
static DamageTable sDamageTable = {
@@ -111,7 +111,7 @@ void EnPoFusen_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->anime, &gPoeBalloonSkel, &gPoeBalloonEmptyAnim, this->jointTable, this->morphTable,
POE_BALLOON_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 25.0f);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 0x4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (!EnPoFusen_CheckParent(this, play)) {
Actor_Kill(&this->actor);
@@ -316,7 +316,7 @@ void EnPoFusen_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnPoFusen_Draw(Actor* thisx, PlayState* play) {
EnPoFusen* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->anime.skeleton, this->anime.jointTable, this->anime.dListCount,
EnPoFusen_OverrideLimbDraw, EnPoFusen_PostLimbDraw, EnPoFusen_TransformLimbDraw,
&this->actor);
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 3545d2f8c..357b08bdd 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
@@ -7,7 +7,7 @@
#include "z_en_po_sisters.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_1000 | ACTOR_FLAG_4000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_4000)
#define THIS ((EnPoSisters*)thisx)
@@ -101,7 +101,7 @@ typedef enum {
/* 0x1 */ POE_SISTERS_DMGEFF_UNKDMG12, // set in DamageTable, but unused
/* 0x4 */ POE_SISTERS_DMGEFF_LIGHTARROWS = 0x4,
/* 0xE */ POE_SISTERS_DMGEFF_SPINATTACK = 0xE,
- /* 0xF */ POE_SISTERS_DMGEFF_DEKUNUT = 0xF,
+ /* 0xF */ POE_SISTERS_DMGEFF_DEKUNUT
} PoeSisterDamageEffect;
static DamageTable sDamageTable = {
@@ -242,8 +242,9 @@ void EnPoSisters_MatchPlayerXZ(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 dist;
- if (this->megCloneId == POE_SISTERS_MEG_REAL || this->actionFunc != EnPoSisters_DamageFlinch) {
- if ((player->meleeWeaponState == 0 || player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) &&
+ if ((this->megCloneId == POE_SISTERS_MEG_REAL) || (this->actionFunc != EnPoSisters_DamageFlinch)) {
+ if (((player->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) ||
+ (player->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H)) &&
((player->actor.world.pos.y - player->actor.floorHeight) < 1.0f)) {
Math_StepToF(&this->megDistToPlayer, 110.0f, 3.0f);
} else {
@@ -276,7 +277,8 @@ void EnPoSisters_MatchPlayerY(EnPoSisters* this, PlayState* play) {
this->actor.world.pos.y += (2.0f + (0.5f * Rand_ZeroOne())) * Math_SinS(this->floatingBobbingTimer * 0x800);
// fully opaque
- if (this->color.a == 255 && this->actionFunc != EnPoSisters_SpinAttack && this->actionFunc != EnPoSisters_SpinUp) {
+ if ((this->color.a == 255) && (this->actionFunc != EnPoSisters_SpinAttack) &&
+ (this->actionFunc != EnPoSisters_SpinUp)) {
if (this->actionFunc == EnPoSisters_Flee) {
func_800B9010(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
} else {
@@ -578,7 +580,7 @@ void EnPoSisters_Flee(EnPoSisters* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->poSisterFlags |= POE_SISTERS_FLAG_UPDATE_SHAPE_ROT;
EnPoSisters_SetupSpinToInvis(this);
- } else if (this->fleeTimer == 0 && this->actor.xzDistToPlayer > 480.0f) {
+ } else if ((this->fleeTimer == 0) && (this->actor.xzDistToPlayer > 480.0f)) {
this->actor.world.rot.y = this->actor.shape.rot.y;
EnPoSisters_SetupAimlessIdleFlying(this);
}
@@ -817,7 +819,7 @@ void EnPoSisters_MegSurroundPlayer(EnPoSisters* this, PlayState* play) {
DECR(this->megSurroundTimer);
- if (this->megClonesRemaining > 0 && this->megSurroundTimer >= 16) {
+ if ((this->megClonesRemaining > 0) && (this->megSurroundTimer >= 16)) {
SkelAnime_Update(&this->skelAnime);
if (this->megCloneId == POE_SISTERS_MEG_REAL) {
if (ABS_ALT(16 - this->floatingBobbingTimer) < 14) {
@@ -978,7 +980,7 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (this->poSisterFlags & POE_SISTERS_FLAG_UPDATE_BGCHECK_INFO) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else {
checkPos.x = this->actor.world.pos.x;
checkPos.y = this->actor.world.pos.y + 10.0f;
@@ -1091,7 +1093,7 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
};
EnPoSisters* this = THIS;
- if (limbIndex == POE_SISTERS_LIMB_ROOT && (this->poSisterFlags & POE_SISTERS_FLAG_REAL_MEG_ROTATION)) {
+ if ((limbIndex == POE_SISTERS_LIMB_ROOT) && (this->poSisterFlags & POE_SISTERS_FLAG_REAL_MEG_ROTATION)) {
if (this->megSurroundTimer >= 284) {
rot->x += (this->megSurroundTimer - 284) * 0x1000;
} else {
@@ -1152,8 +1154,8 @@ void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
Matrix_MultVecX(3000.0f, &this->limbPos[7]);
}
- if (this->actionFunc == EnPoSisters_DeathStage1 && this->deathTimer >= 8 &&
- limbIndex == POE_SISTERS_LIMB_MAIN_BODY) {
+ if ((this->actionFunc == EnPoSisters_DeathStage1) && (this->deathTimer >= 8) &&
+ (limbIndex == POE_SISTERS_LIMB_MAIN_BODY)) {
gSPMatrix((*gfx)++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList((*gfx)++, gPoeSistersBurnBodyDL);
}
@@ -1204,8 +1206,8 @@ void EnPoSisters_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
EnPoSisters_UpdateColors(this);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->color.a == 255) || (this->color.a == 0)) {
gDPSetEnvColor(POLY_OPA_DISP++, this->color.r, this->color.g, this->color.b, this->color.a);
diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
index cfb8a1697..f800788c7 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
@@ -15,17 +15,17 @@ typedef void (*EnPoSistersActionFunc)(struct EnPoSisters*, PlayState*);
#define POE_SISTERS_PARAMS(observerFlag, megClone, type) (((observerFlag) << 0xC) | ((megClone & 3) << 0xA) | ((type & 3) << 8))
typedef enum {
- /* 0 */ POE_SISTERS_TYPE_MEG, // purple
- /* 1 */ POE_SISTERS_TYPE_JO, // red
- /* 2 */ POE_SISTERS_TYPE_BETH, // blue
- /* 3 */ POE_SISTERS_TYPE_AMY, // green
+ /* 0 */ POE_SISTERS_TYPE_MEG, // purple
+ /* 1 */ POE_SISTERS_TYPE_JO, // red
+ /* 2 */ POE_SISTERS_TYPE_BETH, // blue
+ /* 3 */ POE_SISTERS_TYPE_AMY // green
} EnPoSisterType;
typedef enum {
/* 0 */ POE_SISTERS_MEG_REAL,
/* 1 */ POE_SISTERS_MEG_CLONE1,
/* 2 */ POE_SISTERS_MEG_CLONE2,
- /* 3 */ POE_SISTERS_MEG_CLONE3,
+ /* 3 */ POE_SISTERS_MEG_CLONE3
} EnPoSisterMegCloneID;
typedef struct EnPoSisters {
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 997e91e8a..4669b1916 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -4,10 +4,11 @@
* Description: Poe
*/
+#include "prevent_bss_reordering.h"
#include "z_en_poh.h"
#include "objects/object_po/object_po.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_1000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE)
#define THIS ((EnPoh*)thisx)
@@ -588,7 +589,7 @@ void func_80B2DD2C(EnPoh* this, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
}
void func_80B2DDF8(EnPoh* this, s32 arg1) {
@@ -925,7 +926,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
if ((this->unk_197 == 255) || (this->unk_197 == 0)) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], this->unk_194, this->unk_195, this->unk_196, this->unk_197);
gSPSegment(&gfx[2], 0x08, D_801AEFA0);
@@ -936,7 +937,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
} else {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], 255, 255, 255, this->unk_197);
gSPSegment(&gfx[2], 0x08, D_801AEF88);
@@ -944,7 +945,7 @@ void EnPoh_Draw(Actor* thisx, PlayState* play) {
EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, &gfx[3]);
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
}
gDPPipeSync(&gfx[0]);
@@ -985,7 +986,7 @@ void func_80B2F37C(Actor* thisx, PlayState* play) {
if (this->actionFunc == func_80B2DD2C) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gDPSetEnvColor(&gfx[1], this->unk_198, this->unk_199, this->unk_19A, 255);
func_80B2C910(&sp7C, play);
@@ -997,7 +998,7 @@ void func_80B2F37C(Actor* thisx, PlayState* play) {
POLY_OPA_DISP = &gfx[4];
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(
POLY_XLU_DISP++, 0x08,
@@ -1005,7 +1006,7 @@ void func_80B2F37C(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 170, 255, this->unk_197);
gDPSetEnvColor(POLY_XLU_DISP++, this->unk_194, this->unk_195, this->unk_196, 255);
- Matrix_RotateYF((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000) * (M_PI / 32768), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), 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_po_DL_003850);
diff --git a/src/overlays/actors/ovl_En_Pp/z_en_pp.c b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
index 20c0dc1d8..48c8cd5ab 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.c
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
@@ -39,7 +39,7 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play);
typedef enum {
/* 0 */ EN_PP_COLLISION_RESULT_OK,
/* 1 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_INTO_WALL,
- /* 2 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE,
+ /* 2 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE
} EnPpCollisionResult;
typedef enum {
@@ -56,13 +56,13 @@ typedef enum {
/* 10 */ EN_PP_ACTION_MASK_DEAD,
/* 11 */ EN_PP_ACTION_SPAWN_BODY_PARTS,
/* 12 */ EN_PP_ACTION_DONE_SPAWNING_BODY_PARTS,
- /* 13 */ EN_PP_ACTION_BODY_PART_MOVE,
+ /* 13 */ EN_PP_ACTION_BODY_PART_MOVE
} EnPpAction;
typedef enum {
/* 0 */ EN_PP_MASK_DETACH_STATE_START,
/* 1 */ EN_PP_MASK_DETACH_STATE_FALL,
- /* 2 */ EN_PP_MASK_DETACH_STATE_DIE,
+ /* 2 */ EN_PP_MASK_DETACH_STATE_DIE
} EnPpMaskDetachState;
static s32 sCurrentDeadBodyPartIndex = 0;
@@ -77,7 +77,7 @@ typedef enum {
/* 0xC */ EN_PP_DMGEFF_KNOCK_OFF_MASK = 0xC, // Knocks off the Hiploop's mask or deals regular damage
/* 0xD */ EN_PP_DMGEFF_HOOKSHOT, // Pulls the Hiploop's mask to the player or deals regular damage
/* 0xE */ EN_PP_DMGEFF_GORON_POUND, // Knocks off the Hiploop's mask or forces it to jump
- /* 0xF */ EN_PP_DMGEFF_DAMAGE, // Deals regular damage
+ /* 0xF */ EN_PP_DMGEFF_DAMAGE // Deals regular damage
} EnPpDamageEffect;
static DamageTable sDamageTable = {
@@ -397,17 +397,17 @@ void EnPp_SpawnDust(EnPp* this, PlayState* play) {
Vec3f accel;
for (i = 0; i < ARRAY_COUNT(this->backFootPos); i++) {
- velocity.x = randPlusMinusPoint5Scaled(2.0f);
+ velocity.x = Rand_CenteredFloat(2.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 1.0f;
- velocity.z = randPlusMinusPoint5Scaled(2.0f);
+ velocity.z = Rand_CenteredFloat(2.0f);
accel.y = -0.1f;
accel.z = 0.0f;
accel.x = 0.0f;
- pos.x = this->backFootPos[i].x + randPlusMinusPoint5Scaled(10.0f);
+ pos.x = this->backFootPos[i].x + Rand_CenteredFloat(10.0f);
pos.y = Rand_ZeroFloat(3.0f) + this->actor.floorHeight + 1.0f;
- pos.z = this->backFootPos[i].z + randPlusMinusPoint5Scaled(10.0f);
+ pos.z = this->backFootPos[i].z + Rand_CenteredFloat(10.0f);
func_800B0EB0(play, &pos, &velocity, &accel, &sDustPrimColor, &sDustEnvColor, (Rand_ZeroFloat(50.0f) + 60.0f),
30, (Rand_ZeroFloat(5.0f) + 20.0f));
@@ -534,8 +534,8 @@ void EnPp_Idle(EnPp* this, PlayState* play) {
if ((this->timer == 0) && (this->secondaryTimer == 0)) {
this->secondaryTimer = Rand_ZeroFloat(20.0f) + 20.0f;
Math_Vec3f_Copy(&posToLookAt, &this->actor.home.pos);
- posToLookAt.x += randPlusMinusPoint5Scaled(50.0f);
- posToLookAt.z += randPlusMinusPoint5Scaled(50.0f);
+ posToLookAt.x += Rand_CenteredFloat(50.0f);
+ posToLookAt.z += Rand_CenteredFloat(50.0f);
this->targetRotY = Math_Vec3f_Yaw(&this->actor.world.pos, &posToLookAt);
this->actor.speed = 0.0f;
if (this->animIndex != EN_PP_ANIM_IDLE) {
@@ -1046,8 +1046,8 @@ void EnPp_Dead(EnPp* this, PlayState* play) {
if (this->actor.world.pos.y < waterSurface) {
for (i = 0; i < 5; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled(10 + (5 * i));
- splashPos.z += randPlusMinusPoint5Scaled(40 + (5 * i));
+ splashPos.x += Rand_CenteredFloat(10 + (5 * i));
+ splashPos.z += Rand_CenteredFloat(40 + (5 * i));
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (Rand_ZeroOne() * 100.0f) + 400.0f);
}
@@ -1143,9 +1143,9 @@ void EnPp_Mask_Detach(EnPp* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sMaskFireVelocityAndAccel); i++) {
Math_Vec3f_Copy(&maskFirePos, &this->maskFlamesBasePos);
- maskFirePos.x += randPlusMinusPoint5Scaled(20.0f);
+ maskFirePos.x += Rand_CenteredFloat(20.0f);
maskFirePos.y = this->actor.floorHeight;
- maskFirePos.z += randPlusMinusPoint5Scaled(20.0f);
+ maskFirePos.z += Rand_CenteredFloat(20.0f);
func_800B3030(play, &maskFirePos, &sMaskFireVelocityAndAccel[i],
&sMaskFireVelocityAndAccel[i], 70, 0, 2);
}
@@ -1173,7 +1173,7 @@ void EnPp_BodyPart_SetupMove(EnPp* this) {
this->deadBodyPartRotationalVelocity.z = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_BODY_PART_BODY) {
this->actor.speed = Rand_ZeroFloat(4.0f) + 4.0f;
- this->actor.world.rot.y = ((s32)randPlusMinusPoint5Scaled(223.0f) + 0x1999) * this->deadBodyPartIndex;
+ this->actor.world.rot.y = ((s32)Rand_CenteredFloat(223.0f) + 0x1999) * this->deadBodyPartIndex;
}
this->action = EN_PP_ACTION_BODY_PART_MOVE;
@@ -1213,8 +1213,8 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
for (i = 0; i < 6; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled(10 + (5 * i));
- splashPos.z += randPlusMinusPoint5Scaled(40 + (5 * i));
+ splashPos.x += Rand_CenteredFloat(10 + (5 * i));
+ splashPos.z += Rand_CenteredFloat(40 + (5 * i));
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (Rand_ZeroOne() * 100.0f) + 400.0f);
}
} else {
@@ -1424,7 +1424,9 @@ void EnPp_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 40.0f, 40.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 40.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (this->action != EN_PP_ACTION_BODY_PART_MOVE) {
this->actor.shape.rot.y = this->actor.world.rot.y;
}
@@ -1571,8 +1573,8 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
f32 scale;
f32 alpha;
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPp_OverrideLimbDraw, EnPp_PostLimbDraw, &this->actor);
@@ -1609,7 +1611,7 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
if ((this->action != EN_PP_ACTION_MASK_DETACH) && (this->action < EN_PP_ACTION_DEAD)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 255);
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
diff --git a/src/overlays/actors/ovl_En_Pp/z_en_pp.h b/src/overlays/actors/ovl_En_Pp/z_en_pp.h
index aabbd9e2e..2409487be 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.h
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.h
@@ -22,7 +22,7 @@ typedef enum {
/* 13 */ EN_PP_TYPE_BODY_PART_FRONT_RIGHT_LOWER_LEG = 13,
/* 17 */ EN_PP_TYPE_BODY_PART_LEFT_WING_MIDDLE = 17,
/* 23 */ EN_PP_TYPE_BODY_PART_RIGHT_WING_MIDDLE = 23,
- /* 26 */ EN_PP_TYPE_BODY_PART_CENTER_WING_MIDDLE = 26,
+ /* 26 */ EN_PP_TYPE_BODY_PART_CENTER_WING_MIDDLE = 26
} EnPpType;
typedef struct EnPp {
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 388388c53..98762c907 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -319,7 +319,7 @@ void func_80A32A40(EnPr* this, PlayState* play) {
WaterBox* sp30;
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- sp34.y = randPlusMinusPoint5Scaled(50.0f) + this->actor.home.pos.y;
+ sp34.y = Rand_CenteredFloat(50.0f) + this->actor.home.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &this->unk_2B4,
&sp30)) {
@@ -536,7 +536,9 @@ void EnPr_Update(Actor* thisx, PlayState* play) {
}
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 20.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 30.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
if (this->unk_206 != 7) {
@@ -549,9 +551,9 @@ void EnPr_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp40, &this->unk_2D4);
this->unk_204 = 0;
- sp40.x += randPlusMinusPoint5Scaled(20.0f);
- sp40.y += randPlusMinusPoint5Scaled(5.0f);
- sp40.z += randPlusMinusPoint5Scaled(20.0f);
+ sp40.x += Rand_CenteredFloat(20.0f);
+ sp40.y += Rand_CenteredFloat(5.0f);
+ sp40.z += Rand_CenteredFloat(20.0f);
for (i = 0; i < (s32)Rand_ZeroFloat(5.0f) + 5; i++) {
EffectSsBubble_Spawn(play, &sp40, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
@@ -593,8 +595,8 @@ void EnPr_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->unk_2D2 == 0) {
gDPPipeSync(POLY_OPA_DISP++);
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 2328ba87c..a4dd96d4b 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -151,8 +151,8 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
Actor* parent = this->actor.parent;
if (parent->update != NULL) {
- this->unk_1C8 = ((EnEncount1*)parent)->unk_15A;
- this->path = SubS_GetPathByIndex(play, this->unk_1C8, 0x3F);
+ this->pathIndex = ((EnEncount1*)parent)->pathIndex;
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENPR2_PATH_INDEX_NONE);
this->unk_208 = parent->world.rot.z * 20.0f;
if (this->unk_208 < 20.0f) {
this->unk_208 = 20.0f;
@@ -171,7 +171,9 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
func_80A751B4(this);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 20.0f, 20.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 20.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (!(this->actor.bgCheckFlags & (BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH))) {
Actor_Kill(&this->actor);
@@ -188,8 +190,8 @@ void EnPr2_Destroy(Actor* thisx, PlayState* play) {
if (this->actor.parent != NULL) {
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
- if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
- encount1->unk_14E--;
+ if ((encount1->actor.update != NULL) && (encount1->spawnActiveCount > 0)) {
+ encount1->spawnActiveCount--;
}
}
}
@@ -270,7 +272,7 @@ void func_80A745FC(EnPr2* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_EXIST - SFX_FLAG);
Math_ApproachF(&this->unk_204, 0.02f, 0.1f, 0.005f);
- if (this->path->unk2 < this->unk_1D0) {
+ if (this->path->customValue < this->unk_1D0) {
Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 1.0f);
} else {
Math_ApproachF(&this->actor.speed, 10.0f, 0.3f, 1.0f);
@@ -388,8 +390,8 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
if (this->unk_1DA == 1) {
this->unk_1D8 = Rand_S16Offset(100, 100);
Math_Vec3f_Copy(&sp3C, &this->unk_228);
- sp3C.x += randPlusMinusPoint5Scaled(300.0f);
- sp3C.z += randPlusMinusPoint5Scaled(300.0f);
+ sp3C.x += Rand_CenteredFloat(300.0f);
+ sp3C.z += Rand_CenteredFloat(300.0f);
Math_Vec3f_Copy(&this->unk_21C, &sp3C);
}
} else {
@@ -534,7 +536,7 @@ void func_80A751B4(EnPr2* this) {
this->actor.shape.rot.z = this->actor.world.rot.z;
this->unk_1D8 = 30;
this->actor.speed = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
}
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 10);
this->unk_1D4 = 3;
@@ -594,9 +596,9 @@ void func_80A75310(EnPr2* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp64, &this->actor.world.pos);
- sp64.x += randPlusMinusPoint5Scaled(20.0f);
- sp64.y += randPlusMinusPoint5Scaled(5.0f);
- sp64.z += randPlusMinusPoint5Scaled(20.0f);
+ sp64.x += Rand_CenteredFloat(20.0f);
+ sp64.y += Rand_CenteredFloat(5.0f);
+ sp64.z += Rand_CenteredFloat(20.0f);
frame = Rand_ZeroFloat(0.03f) + 0.07f;
EffectSsBubble_Spawn(play, &sp64, 0.0f, 5.0f, 5.0f, frame);
@@ -661,7 +663,9 @@ void EnPr2_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, 10.0f);
func_80A755D8(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0, 10.0f, 20.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0, 10.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (this->unk_1D6) {
s32 i;
@@ -671,9 +675,9 @@ void EnPr2_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp58, &this->unk_270);
this->unk_1D6 = false;
- sp58.x += randPlusMinusPoint5Scaled(20.0f);
- sp58.y += randPlusMinusPoint5Scaled(5.0f);
- sp58.z += randPlusMinusPoint5Scaled(20.0f);
+ sp58.x += Rand_CenteredFloat(20.0f);
+ sp58.y += Rand_CenteredFloat(5.0f);
+ sp58.z += Rand_CenteredFloat(20.0f);
for (i = 0; i < 2; i++) {
rand = Rand_ZeroFloat(0.03f) + 0.07f;
@@ -737,7 +741,7 @@ void EnPr2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1F4 == 255) {
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
index 617a5cc73..94fb7e033 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
@@ -10,13 +10,16 @@ typedef void (*EnPr2ActionFunc)(struct EnPr2*, PlayState*);
#define ENPR2_GET_F(thisx) ((thisx)->params & 0xF)
#define ENPR2_GET_FF0(thisx) (((thisx)->params >> 4) & 0xFF)
+#define ENPR2_PATH_INDEX_NONE 0x3F
+#define ENPR2_PARAMS(paramF, paramFF0) (((paramF) & 0xF) | (((paramFF0) << 4) & 0xFF0))
+
typedef struct EnPr2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[5];
/* 0x1A6 */ Vec3s morphtable[5];
/* 0x1C4 */ EnPr2ActionFunc actionFunc;
- /* 0x1C8 */ s16 unk_1C8;
+ /* 0x1C8 */ s16 pathIndex;
/* 0x1CC */ Path* path;
/* 0x1D0 */ s32 unk_1D0;
/* 0x1D4 */ s16 unk_1D4;
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 d4a48cfd2..ef37cf9f0 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -127,7 +127,7 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
this->unk_220 = &this->actor;
this->unk_1EC = 255;
- this->unk_202 = randPlusMinusPoint5Scaled((this->unk_1E6 * 100.0f) + 1000.0f);
+ this->unk_202 = Rand_CenteredFloat((this->unk_1E6 * 100.0f) + 1000.0f);
func_80A76388(this);
}
@@ -176,7 +176,7 @@ void func_80A76070(EnPrz* this, s16 arg1, PlayState* play) {
temp_s0 = -100;
}
- if (fabsf(this->actor.world.rot.y - (f32)arg1) < (randPlusMinusPoint5Scaled(20.0f) + 100.0f)) {
+ if (fabsf(this->actor.world.rot.y - (f32)arg1) < (Rand_CenteredFloat(20.0f) + 100.0f)) {
Math_ApproachZeroF(&this->unk_218, 0.5f, 20.0f);
} else {
Math_ApproachF(&this->unk_218, temp_s0, 0.5f, 5.0f);
@@ -218,7 +218,7 @@ s32 func_80A762C0(EnPrz* this, PlayState* play) {
}
void func_80A76388(EnPrz* this) {
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 4.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 4.0f;
func_80A75F18(this, 0);
this->unk_1EA = 1;
this->actionFunc = func_80A763E8;
@@ -251,11 +251,11 @@ void func_80A763E8(EnPrz* this, PlayState* play) {
if ((this->unk_1EE == 0) && (this->unk_1F2 == 0)) {
s16 rot;
- this->unk_214 = randPlusMinusPoint5Scaled(40.0f);
+ this->unk_214 = Rand_CenteredFloat(40.0f);
rot = BINANG_ROT180(this->unk_220->world.rot.y);
this->unk_1D8.x += Math_SinS(rot) * this->unk_214;
- this->unk_1D8.y = randPlusMinusPoint5Scaled(40.0f) + (this->unk_220->world.pos.y + 40.0f);
+ this->unk_1D8.y = Rand_CenteredFloat(40.0f) + (this->unk_220->world.pos.y + 40.0f);
rot = BINANG_ROT180(this->unk_220->world.rot.y);
this->unk_1D8.z += Math_CosS(rot) * this->unk_214;
@@ -302,7 +302,7 @@ void func_80A76634(EnPrz* this, PlayState* play) {
}
void func_80A76748(EnPrz* this) {
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 3.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 3.0f;
this->unk_1EE = 0;
this->unk_1EA = 3;
this->skelAnime.playSpeed = 2.0f;
@@ -317,7 +317,7 @@ void func_80A767A8(EnPrz* this, PlayState* play) {
if (func_80A762C0(this, play)) {
func_80A75F18(this, 0);
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 4.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 4.0f;
func_80A76604(this, play);
return;
}
@@ -353,8 +353,8 @@ void func_80A767A8(EnPrz* this, PlayState* play) {
this->unk_1C8 = 1;
}
- this->unk_1D8.y = (player->actor.world.pos.y + D_80A771E0[GET_PLAYER_FORM]) +
- randPlusMinusPoint5Scaled((2.0f * this->unk_1E6) + 1.0f);
+ this->unk_1D8.y =
+ (player->actor.world.pos.y + D_80A771E0[GET_PLAYER_FORM]) + Rand_CenteredFloat((2.0f * this->unk_1E6) + 1.0f);
func_80A76070(this, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_1D8), play);
}
@@ -374,7 +374,7 @@ void func_80A76A1C(EnPrz* this) {
this->unk_1FE = this->actor.world.rot.y;
this->actor.speed = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 30);
this->unk_1EE = 50;
@@ -409,9 +409,9 @@ void func_80A76B14(EnPrz* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp6C, &this->actor.world.pos);
- sp6C.x += randPlusMinusPoint5Scaled(20.0f);
- sp6C.y += randPlusMinusPoint5Scaled(5.0f);
- sp6C.z += randPlusMinusPoint5Scaled(20.0f);
+ sp6C.x += Rand_CenteredFloat(20.0f);
+ sp6C.y += Rand_CenteredFloat(5.0f);
+ sp6C.z += Rand_CenteredFloat(20.0f);
EffectSsBubble_Spawn(play, &sp6C, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
}
@@ -441,7 +441,9 @@ void EnPrz_Update(Actor* thisx, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 10.0f, 10.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 10.0f, 10.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->unk_1EA != 7) {
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
@@ -471,9 +473,9 @@ void EnPrz_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp38, &this->unk_1CC);
this->unk_1C8 = 0;
- sp38.x += randPlusMinusPoint5Scaled(20.0f);
- sp38.y += randPlusMinusPoint5Scaled(5.0f);
- sp38.z += randPlusMinusPoint5Scaled(20.0f);
+ sp38.x += Rand_CenteredFloat(20.0f);
+ sp38.y += Rand_CenteredFloat(5.0f);
+ sp38.z += Rand_CenteredFloat(20.0f);
EffectSsBubble_Spawn(play, &sp38, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
}
@@ -504,7 +506,7 @@ void EnPrz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1EC == 255) {
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Pst/z_en_pst.c b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
index c49852746..7a507e0ef 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.c
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
@@ -26,7 +26,7 @@ typedef enum {
typedef enum {
/* 0 */ POSTBOX_BEHAVIOUR_WAIT_FOR_ITEM,
- /* 1 */ POSTBOX_BEHAVIOUR_TAKE_ITEM,
+ /* 1 */ POSTBOX_BEHAVIOUR_TAKE_ITEM
} PostboxBehaviour;
static u8 D_80B2C200[] = {
@@ -162,15 +162,15 @@ void EnPst_UpdateCollision(EnPst* this, PlayState* play) {
s32 EnPst_HandleLetterDay1(EnPst* this) {
switch (this->actor.params) {
case POSTBOX_SOUTH_UPPER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_02);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN);
case POSTBOX_NORTH_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_04);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN);
case POSTBOX_EAST_UPPER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_08);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN);
case POSTBOX_EAST_LOWER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_10);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN);
case POSTBOX_SOUTH_LOWER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_20);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN);
default:
return false;
}
@@ -393,7 +393,7 @@ void EnPst_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 0;
Actor_SetScale(&this->actor, 0.02f);
this->actionFunc = EnPst_FollowSchedule;
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void EnPst_Destroy(Actor* thisx, PlayState* play) {
@@ -436,7 +436,7 @@ void EnPst_Draw(Actor* thisx, PlayState* play) {
EnPst* this = THIS;
if (this->scheduleResult != POSTBOX_SCH_NONE) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPst_OverrideLimbDraw, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Pst/z_en_pst.h b/src/overlays/actors/ovl_En_Pst/z_en_pst.h
index 6051924da..c3ebd58a8 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.h
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.h
@@ -9,7 +9,7 @@ typedef enum {
/* 1 */ POSTBOX_NORTH_CLOCKTOWN,
/* 2 */ POSTBOX_EAST_UPPER_CLOCKTOWN,
/* 3 */ POSTBOX_EAST_LOWER_CLOCKTOWN,
- /* 4 */ POSTBOX_SOUTH_LOWER_CLOCKTOWN,
+ /* 4 */ POSTBOX_SOUTH_LOWER_CLOCKTOWN
} PostboxType;
struct EnPst;
diff --git a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
index c356a318b..d4e83a388 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.c
@@ -9,14 +9,13 @@
*/
#include "z_en_racedog.h"
+#include "overlays/actors/ovl_En_Aob_01/z_en_aob_01.h"
#include "overlays/actors/ovl_En_Dg/z_en_dg.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80000000)
#define THIS ((EnRacedog*)thisx)
-//! TODO: this file require macros for its uses of weekEventReg
-
void EnRacedog_Init(Actor* thisx, PlayState* play);
void EnRacedog_Destroy(Actor* thisx, PlayState* play);
void EnRacedog_Update(Actor* thisx, PlayState* play);
@@ -63,13 +62,13 @@ void EnRacedog_PlaySfxWalk(EnRacedog* this);
* Stores various information for each dog in the race, mostly related to speed.
*/
typedef struct {
- f32 sprintSpeedMultiplier; // Target speed is multiplied by this when the dog is in the last 1/4 of the race
- f32 goodConditionSpeedMultiplier; // Target speed is multiplied by this if the dog is in good condition
- s16 color; // The dog's color, which is used as an index into sBaseSpeeds
- s16 index; // The dog's index within sDogInfo
- s16 pointToUseSecondBaseSpeed; // When the dog is at or after this point, the second value in sBaseSpeeds is used
- s16 textId; // Used to determine the dog's condition
-} RaceDogInfo;
+ /* 0x0 */ f32 sprintSpeedMultiplier; // Multiplies target speed when the dog is in the last 1/4 of the race
+ /* 0x4 */ f32 goodConditionSpeedMultiplier; // Multiplies target speed if the dog is in good condition
+ /* 0x8 */ s16 color; // The dog's color, which is used as an index into sBaseSpeeds
+ /* 0xA */ s16 index; // The dog's index within sDogInfo
+ /* 0xC */ s16 pointToUseSecondBaseSpeed; // When the dog is at or after this point, use the second sBaseSpeeds value
+ /* 0xE */ s16 textId; // Used to determine the dog's condition
+} RaceDogInfo; // size = 0x10
ActorInit En_Racedog_InitVars = {
ACTOR_EN_RACEDOG,
@@ -259,7 +258,7 @@ void EnRacedog_UpdateCollision(EnRacedog* this, PlayState* play) {
this->collider.dim.pos.y = this->actor.world.pos.y;
this->collider.dim.pos.z = this->actor.world.pos.z;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
/**
@@ -276,8 +275,8 @@ s16 EnRacedog_GetYRotation(Path* path, s32 pointIndex, Vec3f* pos, f32* distSQ)
if (path != NULL) {
point = Lib_SegmentedToVirtual(path->points);
point = &point[pointIndex];
- diffXRand = (randPlusMinusPoint5Scaled(100.0f) + point->x) - pos->x;
- diffZRand = (randPlusMinusPoint5Scaled(100.0f) + point->z) - pos->z;
+ diffXRand = (Rand_CenteredFloat(100.0f) + point->x) - pos->x;
+ diffZRand = (Rand_CenteredFloat(100.0f) + point->z) - pos->z;
diffX = point->x - pos->x;
diffZ = point->z - pos->z;
} else {
@@ -288,7 +287,7 @@ s16 EnRacedog_GetYRotation(Path* path, s32 pointIndex, Vec3f* pos, f32* distSQ)
}
*distSQ = SQ(diffX) + SQ(diffZ);
- return RADF_TO_BINANG(Math_Atan2F_XY(diffZRand, diffXRand));
+ return RAD_TO_BINANG(Math_Atan2F_XY(diffZRand, diffXRand));
}
void EnRacedog_GetFloorRot(EnRacedog* this, Vec3f* floorRot) {
@@ -314,10 +313,10 @@ void EnRacedog_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->path = SubS_GetPathByIndex(play, ENRACEDOG_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENRACEDOG_GET_PATH_INDEX(&this->actor), ENRACEDOG_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.0075f);
this->actor.gravity = -3.0f;
- if (ENRACEDOG_GET_INDEX(&this->actor) < 14) {
+ if (ENRACEDOG_GET_INDEX(&this->actor) < RACEDOG_COUNT) {
this->index = ENRACEDOG_GET_INDEX(&this->actor);
} else {
Actor_Kill(&this->actor);
@@ -353,7 +352,7 @@ void EnRacedog_Init(Actor* thisx, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_20;
- sSelectedDogInfo = sDogInfo[(s16)((gSaveContext.eventInf[0] & 0xF8) >> 3)];
+ sSelectedDogInfo = sDogInfo[(s16)GET_EVENTINF_DOG_RACE_SELECTED_DOG_INDEX];
this->selectedDogIndex = sSelectedDogInfo.index;
EnRacedog_ChangeAnim(&this->skelAnime, sAnimationInfo, RACEDOG_ANIM_IDLE);
@@ -439,14 +438,8 @@ void EnRacedog_Race(EnRacedog* this, PlayState* play) {
* or an intentional choice to introduce a bit of extra variance to the race.
*/
void EnRacedog_UpdateTextId(EnRacedog* this) {
- // Assuming that the weekEventRegs haven't been tampered with, then this will produce a text ID in the
- // range of 0x3539 to 0x3546.
- if (this->index % 2) {
- sDogInfo[this->index].textId =
- (((gSaveContext.save.weekEventReg[42 + (this->index / 2)]) & 0xF0) >> 4) + 0x3539;
- } else {
- sDogInfo[this->index].textId = ((gSaveContext.save.weekEventReg[42 + (this->index / 2)]) & 0x0F) + 0x3539;
- }
+ // This will produce a text ID in the range of 0x3539 to 0x3546.
+ sDogInfo[this->index].textId = GET_WEEKEVENTREG_DOG_RACE_TEXT(this->index, 0x3539);
// As a sanity check, this makes sure the text ID is something in the expected range of 0x3539 to 0x3546.
if ((sDogInfo[this->index].textId > 0x3546) || (sDogInfo[this->index].textId < 0x3539)) {
@@ -481,9 +474,9 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
// The dog is past the very start, but is still less than 1/4th of the way through the race track.
// This code will give the blue dog a higher base speed than any other dog (6.0 instead of 5.0).
if (sDogInfo[this->index].color == DOG_COLOR_BLUE) {
- this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][0] + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][0] + Rand_CenteredFloat(1.0f);
} else {
- this->targetSpeed = 5.0f + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = 5.0f + Rand_CenteredFloat(1.0f);
}
if (DOG_IS_IN_GOOD_CONDITION(this) && (this->index != sFirstPlaceIndex)) {
@@ -492,9 +485,9 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
} else if (this->currentPoint < (quarterPathCount * 3)) {
// The dog is between 1/4th and 3/4ths of the way through the race track.
if (this->currentPoint < sDogInfo[this->index].pointToUseSecondBaseSpeed) {
- this->targetSpeed = 5.0f + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = 5.0f + Rand_CenteredFloat(1.0f);
} else {
- this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][1] + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][1] + Rand_CenteredFloat(1.0f);
if (DOG_IS_IN_GOOD_CONDITION(this) && (this->index != sFirstPlaceIndex)) {
this->targetSpeed *= sDogInfo[this->index].goodConditionSpeedMultiplier;
@@ -504,7 +497,7 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
// The dog is more than 3/4ths of the way through the race track.
EnRacedog_CalculateFinalStretchTargetSpeed(this);
} else {
- this->targetSpeed = randPlusMinusPoint5Scaled(1.0f) + 5.0f;
+ this->targetSpeed = Rand_CenteredFloat(1.0f) + 5.0f;
}
}
}
@@ -592,7 +585,7 @@ void EnRacedog_CheckForFinish(EnRacedog* this) {
this->raceStatus = RACEDOG_RACE_STATUS_FINISHED;
if (this->index == this->selectedDogIndex) {
- gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & 7) | (sNumberOfDogsFinished * 8);
+ SET_EVENTINF_DOG_RACE_RACE_STANDING(sNumberOfDogsFinished);
}
}
}
@@ -664,9 +657,9 @@ void EnRacedog_SpawnFloorDustRing(EnRacedog* this, PlayState* play) {
Vec3f pos;
if (((this->index + curFrame) % mod) == 0) {
- pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(15.0f);
+ pos.x = this->actor.world.pos.x + Rand_CenteredFloat(15.0f);
pos.y = this->actor.world.pos.y;
- pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(15.0f);
+ pos.z = this->actor.world.pos.z + Rand_CenteredFloat(15.0f);
Actor_SpawnFloorDustRing(play, &this->actor, &pos, 10.0f, 0, 2.0f, 300, 0, true);
}
}
@@ -732,7 +725,7 @@ void EnRacedog_DrawSelectionArrow(EnRacedog* this, PlayState* play) {
if (shouldDrawSelectionArrow) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
EnRacedog_UpdateSelectionArrow(this);
Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x, this->actor.world.pos.y + 40.0f, this->actor.world.pos.z,
&rotation);
@@ -773,7 +766,7 @@ void EnRacedog_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
index 9d49ea4c2..a3d9afee5 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
@@ -5,7 +5,11 @@
#include "objects/object_dog/object_dog.h"
#define ENRACEDOG_GET_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENRACEDOG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENRACEDOG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+
+#define ENRACEDOG_PATH_INDEX_NONE 0x3F
+
+#define ENRACEDOG_PARAMS(index, path) ((index << 5) | (path))
/**
* The main point of this seems to be some very light anti-cheat detection. The dog
diff --git a/src/overlays/actors/ovl_En_Raf/z_en_raf.c b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
index b89aa26f3..1a4024f51 100644
--- a/src/overlays/actors/ovl_En_Raf/z_en_raf.c
+++ b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
@@ -40,7 +40,7 @@ typedef enum {
/* 2 */ EN_RAF_ANIM_CHEW,
/* 3 */ EN_RAF_ANIM_SPIT,
/* 4 */ EN_RAF_ANIM_CONVULSE,
- /* 5 */ EN_RAF_ANIM_DEATH,
+ /* 5 */ EN_RAF_ANIM_DEATH
} EnRafAnimation;
typedef enum {
@@ -51,7 +51,7 @@ typedef enum {
/* 4 */ EN_RAF_ACTION_EXPLODE,
/* 5 */ EN_RAF_ACTION_CONVULSE,
/* 6 */ EN_RAF_ACTION_DISSOLVE,
- /* 7 */ EN_RAF_ACTION_DORMANT,
+ /* 7 */ EN_RAF_ACTION_DORMANT
} EnRafAction;
typedef enum {
@@ -310,7 +310,7 @@ void EnRaf_Idle(EnRaf* this, PlayState* play) {
if (this->timer == 0) {
if ((player->transformation != PLAYER_FORM_DEKU) &&
(this->dyna.actor.xzDistToPlayer < (BREG(48) + 80.0f) && (player->invincibilityTimer == 0) &&
- DynaPolyActor_IsInRidingMovingState(&this->dyna) && !(player->stateFlags1 & PLAYER_STATE1_8000000) &&
+ DynaPolyActor_IsPlayerOnTop(&this->dyna) && !(player->stateFlags1 & PLAYER_STATE1_8000000) &&
play->grabPlayer(play, player))) {
player->actor.parent = &this->dyna.actor;
this->grabTarget = EN_RAF_GRAB_TARGET_PLAYER;
@@ -710,7 +710,7 @@ void EnRaf_Update(Actor* thisx, PlayState* play) {
return;
}
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if ((this->heightDiffFromPlayer > -0.1f) && !this->isCurrentlyInRidingMovingState) {
this->heightDiffFromPlayer = -20.0f;
this->isCurrentlyInRidingMovingState = true;
@@ -873,8 +873,8 @@ void EnRaf_TransformLimbDraw(PlayState* play2, s32 limbIndex, Actor* thisx) {
void EnRaf_Draw(Actor* thisx, PlayState* play) {
EnRaf* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, EnRaf_TransformLimbDraw, &this->dyna.actor);
@@ -895,9 +895,9 @@ void EnRaf_InitializeEffect(EnRaf* this, Vec3f* pos, Vec3f* velocity, Vec3f* acc
effect->accel = *accel;
effect->scale = scale;
effect->timer = timer;
- effect->rotation.x = randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.y = randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.z = randPlusMinusPoint5Scaled(30000.0f);
+ effect->rotation.x = Rand_CenteredFloat(30000.0f);
+ effect->rotation.y = Rand_CenteredFloat(30000.0f);
+ effect->rotation.z = Rand_CenteredFloat(30000.0f);
return;
}
}
@@ -948,7 +948,7 @@ void EnRaf_DrawEffects(EnRaf* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
if (effect->isEnabled) {
Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
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 dd0225f0c..a280e9bfa 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
@@ -296,7 +296,7 @@ void EnRailSkb_Init(Actor* thisx, PlayState* play) {
this->unk_3F8 = 0;
}
- if ((play->sceneId == SCENE_BOTI) && (gSaveContext.sceneLayer == 1) && (play->csCtx.currentCsIndex == 0)) {
+ if ((play->sceneId == SCENE_BOTI) && (gSaveContext.sceneLayer == 1) && (play->csCtx.scriptIndex == 0)) {
this->actor.flags |= ACTOR_FLAG_100000;
}
@@ -1071,7 +1071,7 @@ void EnRailSkb_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
func_80B72190(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
func_80B72970(this, play);
if ((this->actionFunc != func_80B710E4) && (this->actionFunc != func_80B7114C) &&
@@ -1143,7 +1143,7 @@ void EnRailSkb_Draw(Actor* thisx, PlayState* play) {
EnRailSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnRailSkb_OverrideLimbDraw,
EnRailSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
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 27da7017c..9a0e1864e 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -44,7 +44,7 @@ s32 EnRailgibud_MoveToIdealGrabPositionAndRotation(EnRailgibud* this, PlayState*
void EnRailgibud_CheckIfTalkingToPlayer(EnRailgibud* this, PlayState* play);
void EnRailgibud_MainGibdo_DeadUpdate(Actor* thisx, PlayState* play);
void EnRailgibud_InitCutsceneGibdo(EnRailgibud* this, PlayState* play);
-void EnRailgibud_InitActorActionCommand(EnRailgibud* this);
+void EnRailgibud_InitCueType(EnRailgibud* this);
void EnRailgibud_SetupDoNothing(EnRailgibud* this);
void EnRailgibud_DoNothing(EnRailgibud* this, PlayState* play);
void EnRailgibud_SinkIntoGround(EnRailgibud* this, PlayState* play);
@@ -70,18 +70,18 @@ typedef enum {
/* 16 */ EN_RAILGIBUD_ANIM_SLUMP_LOOP,
/* 17 */ EN_RAILGIBUD_ANIM_CONVULSION,
/* 18 */ EN_RAILGIBUD_ANIM_ARMS_UP_START,
- /* 19 */ EN_RAILGIBUD_ANIM_ARMS_UP_LOOP,
+ /* 19 */ EN_RAILGIBUD_ANIM_ARMS_UP_LOOP
} EnRailgibudAnimation;
typedef enum {
/* 0 */ EN_RAILGIBUD_TYPE_GIBDO,
- /* 1 */ EN_RAILGIBUD_TYPE_REDEAD,
+ /* 1 */ EN_RAILGIBUD_TYPE_REDEAD
} EnRailgibudType;
typedef enum {
/* 0 */ EN_RAILGIBUD_GRAB_START,
/* 1 */ EN_RAILGIBUD_GRAB_ATTACK,
- /* 2 */ EN_RAILGIBUD_GRAB_RELEASE,
+ /* 2 */ EN_RAILGIBUD_GRAB_RELEASE
} EnRailgibudGrabState;
ActorInit En_Railgibud_InitVars = {
@@ -147,7 +147,7 @@ typedef enum {
/* 0xC */ EN_RAILGIBUD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_RAILGIBUD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_RAILGIBUD_DMGEFF_LIGHT_RAY, // Instantly kills a Redead on contact
- /* 0xF */ EN_RAILGIBUD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_RAILGIBUD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnRailgibudDamageEffect;
static DamageTable sDamageTable = {
@@ -196,7 +196,7 @@ void EnRailgibud_SpawnOtherGibdosAndSetPositionAndRotation(EnRailgibud* this, Pl
static s32 currentGibdoIndex = 0;
s32 nextPoint;
Vec3f targetPos;
- Path* path = &play->setupPathList[ENRAILGIBUD_GET_PATH(&this->actor)];
+ Path* path = &play->setupPathList[ENRAILGIBUD_GET_PATH_INDEX(&this->actor)];
this->points = Lib_SegmentedToVirtual(path->points);
this->currentPoint = currentGibdoIndex;
@@ -901,9 +901,11 @@ void EnRailgibud_MoveGrabbedPlayerAwayFromWall(EnRailgibud* this, PlayState* pla
Vec3f targetPos;
if ((this->actionFunc == EnRailgibud_Grab) && (this->grabState != EN_RAILGIBUD_GRAB_RELEASE)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, 1);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, UPDBGCHECKINFO_FLAG_1);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
if ((this->actionFunc == EnRailgibud_Grab) && (this->grabState == EN_RAILGIBUD_GRAB_START) &&
@@ -1074,7 +1076,7 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->actor.shape.shadowAlpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1083,7 +1085,7 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRailgibud_OverrideLimbDraw, EnRailgibud_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
@@ -1104,8 +1106,8 @@ void EnRailgibud_Draw(Actor* thisx, PlayState* play) {
void EnRailgibud_InitCutsceneGibdo(EnRailgibud* this, PlayState* play) {
s32 pad[2];
- EnRailgibud_InitActorActionCommand(this);
- this->csAction = 99;
+ EnRailgibud_InitCueType(this);
+ this->cueId = 99;
this->actor.flags |= ACTOR_FLAG_100000;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1124,30 +1126,30 @@ void EnRailgibud_InitCutsceneGibdo(EnRailgibud* this, PlayState* play) {
this->actor.update = EnRailgibud_Cutscene_Update;
}
-void EnRailgibud_InitActorActionCommand(EnRailgibud* this) {
+void EnRailgibud_InitCueType(EnRailgibud* this) {
switch (ENRAILGIBUD_GET_CUTSCENE_TYPE(&this->actor)) {
case 1:
- this->actorActionCommand = 519;
+ this->cueType = CS_CMD_ACTOR_CUE_519;
break;
case 2:
- this->actorActionCommand = 520;
+ this->cueType = CS_CMD_ACTOR_CUE_520;
break;
case 3:
- this->actorActionCommand = 521;
+ this->cueType = CS_CMD_ACTOR_CUE_521;
break;
case 4:
- this->actorActionCommand = 522;
+ this->cueType = CS_CMD_ACTOR_CUE_522;
break;
case 5:
- this->actorActionCommand = 523;
+ this->cueType = CS_CMD_ACTOR_CUE_523;
break;
default:
- this->actorActionCommand = 519;
+ this->cueType = CS_CMD_ACTOR_CUE_519;
break;
}
}
@@ -1175,13 +1177,13 @@ void EnRailgibud_SinkIntoGround(EnRailgibud* this, PlayState* play) {
}
s32 EnRailgibud_PerformCutsceneActions(EnRailgibud* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, this->actorActionCommand)) {
- actionIndex = Cutscene_GetActorActionIndex(play, this->actorActionCommand);
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ cueChannel = Cutscene_GetCueChannel(play, this->cueType);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
this->cutsceneAnimIndex = EN_RAILGIBUD_ANIM_IDLE;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_RAILGIBUD_ANIM_IDLE);
@@ -1219,7 +1221,7 @@ s32 EnRailgibud_PerformCutsceneActions(EnRailgibud* this, PlayState* play) {
}
}
- switch (this->csAction) {
+ switch (this->cueId) {
case 3:
case 4:
if (this->actionFunc == EnRailgibud_SinkIntoGround) {
@@ -1231,7 +1233,7 @@ s32 EnRailgibud_PerformCutsceneActions(EnRailgibud* this, PlayState* play) {
case 5:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- if (play->csCtx.frames < 280) {
+ if (play->csCtx.curFrame < 280) {
Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_CRY);
} else {
Actor_PlaySfx(&this->actor, NA_SE_EN_REDEAD_WEAKENED1);
@@ -1240,11 +1242,11 @@ s32 EnRailgibud_PerformCutsceneActions(EnRailgibud* this, PlayState* play) {
break;
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex);
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
return true;
}
- this->csAction = 99;
+ this->cueId = 99;
return false;
}
diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
index cf06d1996..f9d3922c8 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
@@ -10,7 +10,7 @@ typedef void (*EnRailgibudActionFunc)(struct EnRailgibud*, PlayState*);
#define ENRAILGIBUD_GET_CUTSCENE_TYPE(thisx) ((thisx)->params & 0x7F)
#define ENRAILGIBUD_IS_CUTSCENE_TYPE(thisx) ((thisx)->params & 0x80)
-#define ENRAILGIBUD_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define ENRAILGIBUD_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef struct EnRailgibud {
/* 0x000 */ Actor actor;
@@ -47,8 +47,8 @@ typedef struct EnRailgibud {
/* 0x3F6 */ s16 drawDmgEffTimer;
/* 0x3F8 */ s16 type;
/* 0x3FA */ s16 isInvincible;
- /* 0x3FC */ u16 actorActionCommand;
- /* 0x3FE */ u16 csAction;
+ /* 0x3FC */ u16 cueType;
+ /* 0x3FE */ u16 cueId;
/* 0x400 */ u16 textId;
/* 0x402 */ s16 timeInitialized; // unused other than setting it
/* 0x404 */ u8 drawDmgEffType;
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 63ef35aab..e08cb5574 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -32,7 +32,7 @@ void EnRat_PostDetonation(EnRat* this, PlayState* play);
typedef enum {
/* -2 */ EN_RAT_HOOK_STARTED = -2,
- /* -1 */ EN_RAT_HOOKED,
+ /* -1 */ EN_RAT_HOOKED
} EnRatHookedState;
ActorInit En_Rat_InitVars = {
@@ -70,7 +70,7 @@ static ColliderSphereInit sSphereInit = {
typedef enum {
/* 0x0 */ EN_RAT_DMGEFF_NONE,
/* 0x1 */ EN_RAT_DMGEFF_STUN,
- /* 0xF */ EN_RAT_DMGEFF_HOOKSHOT = 0xF, // Pulls the Real Bombchu towards the player
+ /* 0xF */ EN_RAT_DMGEFF_HOOKSHOT = 0xF // Pulls the Real Bombchu towards the player
} EnRatDamageEffect;
static DamageTable sDamageTable = {
@@ -230,7 +230,7 @@ s32 EnRat_UpdateFloorPoly(EnRat* this, CollisionPoly* floorPoly, PlayState* play
return false;
}
- angle = func_80086C48(normDotUp);
+ angle = Math_FAcosF(normDotUp);
if (angle < 0.001f) {
return false;
}
@@ -324,14 +324,14 @@ void EnRat_ChooseDirection(EnRat* this) {
angle -= 0x8000;
}
- angle += (s16)randPlusMinusPoint5Scaled(0x800);
+ angle += (s16)(s32)Rand_CenteredFloat(0x800);
} else {
- angle = (Rand_ZeroOne() < 0.1f) ? (s16)randPlusMinusPoint5Scaled(0x800) : 0;
+ angle = (Rand_ZeroOne() < 0.1f) ? (s16)(s32)Rand_CenteredFloat(0x800) : 0;
}
}
angle = CLAMP(angle, -0x800, 0x800);
- Matrix_RotateAxisF(angle * (M_PI / 0x8000), &this->axisUp, MTXMODE_NEW);
+ Matrix_RotateAxisF(BINANG_TO_RAD(angle), &this->axisUp, MTXMODE_NEW);
Matrix_MultVec3f(&this->axisForwards, &newAxisForwards);
Math_Vec3f_Copy(&this->axisForwards, &newAxisForwards);
Math3D_CrossProduct(&this->axisUp, &this->axisForwards, &this->axisLeft);
@@ -355,7 +355,8 @@ s32 EnRat_IsOnCollisionPoly(PlayState* play, Vec3f* posA, Vec3f* posB, Vec3f* po
}
if (BgCheck_EntityLineTest1(&play->colCtx, posA, posB, posResult, poly, 1, 1, 1, 1, bgId)) {
- if (!(func_800C9A4C(&play->colCtx, *poly, *bgId) & 0x30) && (!isOnWater || (waterSurface <= posResult->y))) {
+ if (!(SurfaceType_GetWallFlags(&play->colCtx, *poly, *bgId) & (WALL_FLAG_4 | WALL_FLAG_5)) &&
+ (!isOnWater || (waterSurface <= posResult->y))) {
return true;
}
}
@@ -494,7 +495,7 @@ void EnRat_HandleNonSceneCollision(EnRat* this, PlayState* play) {
f32 cos;
f32 tempX;
- BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, this->actor.floorBgId, &this->actor);
+ DynaPolyActor_TransformCarriedActor(&play->colCtx, this->actor.floorBgId, &this->actor);
if (yaw != this->actor.shape.rot.y) {
yaw = this->actor.shape.rot.y - yaw;
@@ -632,9 +633,9 @@ void EnRat_UpdateSparkOffsets(EnRat* this) {
for (i = 0; i < ARRAY_COUNT(this->sparkOffsets); i++) {
ptr = &this->sparkOffsets[i];
- ptr->x = randPlusMinusPoint5Scaled(6.0f);
- ptr->y = randPlusMinusPoint5Scaled(6.0f);
- ptr->z = randPlusMinusPoint5Scaled(6.0f);
+ ptr->x = Rand_CenteredFloat(6.0f);
+ ptr->y = Rand_CenteredFloat(6.0f);
+ ptr->z = Rand_CenteredFloat(6.0f);
}
}
@@ -739,8 +740,9 @@ void EnRat_Bounced(EnRat* this, PlayState* play) {
}
void EnRat_Explode(EnRat* this, PlayState* play) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, BOMB_TYPE_BODY);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -853,7 +855,8 @@ void EnRat_Update(Actor* thisx, PlayState* play) {
this->actor.floorHeight = this->actor.world.pos.y;
} else {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 30.0f, 60.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
}
if (SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
@@ -934,14 +937,14 @@ void EnRat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gBombCapDL);
if (EN_RAT_GET_TYPE(&this->actor) == EN_RAT_TYPE_DUNGEON) {
- redModifier = fabsf(cos_rad(this->timer * (M_PI / 30.f)));
+ redModifier = fabsf(Math_CosF(this->timer * (M_PI / 30.f)));
} else {
if (this->timer >= 120) {
- redModifier = fabsf(cos_rad((this->timer % 30) * (M_PI / 30.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 30) * (M_PI / 30.0f)));
} else if (this->timer >= 30) {
- redModifier = fabsf(cos_rad((this->timer % 6) * (M_PI / 6.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 6) * (M_PI / 6.0f)));
} else {
- redModifier = fabsf(cos_rad((this->timer % 3) * (M_PI / 3.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 3) * (M_PI / 3.0f)));
}
}
@@ -958,8 +961,8 @@ void EnRat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
void EnRat_Draw(Actor* thisx, PlayState* play) {
EnRat* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRat_OverrideLimbDraw, EnRat_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Rat/z_en_rat.h b/src/overlays/actors/ovl_En_Rat/z_en_rat.h
index 9472e8c31..28c880a92 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.h
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.h
@@ -21,7 +21,7 @@
*/
typedef enum {
/* 0 */ EN_RAT_TYPE_DUNGEON,
- /* 1 */ EN_RAT_TYPE_OVERWORLD,
+ /* 1 */ EN_RAT_TYPE_OVERWORLD
} EnRatType;
struct EnRat;
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 dacfb6e2b..34fc41192 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -94,7 +94,7 @@ typedef enum {
/* 1 */ EN_RD_GRAB_INITIAL_DAMAGE,
/* 2 */ EN_RD_GRAB_ATTACK,
/* 3 */ EN_RD_GRAB_RELEASE,
- /* 4 */ EN_RD_GRAB_END,
+ /* 4 */ EN_RD_GRAB_END
} EnRdGrabState;
ActorInit En_Rd_InitVars = {
@@ -139,7 +139,7 @@ typedef enum {
/* 0xC */ EN_RD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_RD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_RD_DMGEFF_LIGHT_RAY, // Instantly kills on contact
- /* 0xF */ EN_RD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_RD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnRdDamageEffect;
static DamageTable sDamageTable = {
@@ -1280,7 +1280,9 @@ void EnRd_Update(Actor* thisx, PlayState* play) {
}
if ((this->actor.shape.rot.x == 0) && (this->action != EN_RD_ACTION_GRABBING) && (this->actor.speed != 0.0f)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
if (this->action == EN_RD_ACTION_ATTEMPTING_PLAYER_STUN) {
@@ -1336,7 +1338,7 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->alpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1347,7 +1349,7 @@ void EnRd_Draw(Actor* thisx, PlayState* play) {
func_800BC620(&pos, &sScale, 255, play);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
diff --git a/src/overlays/actors/ovl_En_Rd/z_en_rd.h b/src/overlays/actors/ovl_En_Rd/z_en_rd.h
index f5fbf82cb..fced38e75 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.h
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.h
@@ -27,7 +27,7 @@ typedef enum {
/* 4 */ EN_RD_TYPE_FROZEN, // Unused in the final game
/* 5 */ EN_RD_TYPE_SQUATTING_DANCE,
/* 6 */ EN_RD_TYPE_CLAPPING_DANCE,
- /* 7 */ EN_RD_TYPE_PIROUETTE,
+ /* 7 */ EN_RD_TYPE_PIROUETTE
} EnRdType;
typedef struct EnRd {
diff --git a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
index 64313c4be..3632efa2a 100644
--- a/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
+++ b/src/overlays/actors/ovl_En_Recepgirl/z_en_recepgirl.c
@@ -205,7 +205,7 @@ void EnRecepgirl_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, sEyeTextures[this->eyeTexIndex]);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
diff --git a/src/overlays/actors/ovl_En_Rg/z_en_rg.c b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
index 190af1a8a..b6407d24b 100644
--- a/src/overlays/actors/ovl_En_Rg/z_en_rg.c
+++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.c
@@ -164,12 +164,12 @@ void func_80BF3920(EnRgStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 32; i++, ptr++) {
if ((ptr->unk_00 >= 4) && (ptr->unk_00 < 7)) {
if (!phi_fp) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
phi_fp = true;
}
@@ -283,7 +283,7 @@ void func_80BF3FF8(EnRg* this) {
}
s32 func_80BF4024(EnRg* this, PlayState* play) {
- if ((play->csCtx.state == 0) && (this->unk_334 == 1)) {
+ if ((play->csCtx.state == CS_STATE_IDLE) && (this->unk_334 == 1)) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
@@ -373,11 +373,11 @@ s32 func_80BF43FC(EnRg* this) {
f32 sp88;
f32 sp84;
f32 phi_f20 = 0.0f;
- s32 temp_s7 = ENRG_GET_7F80(&this->actor);
+ s32 pathIndex = ENRG_GET_PATH_INDEX(&this->actor);
s32 phi_s4 = -1;
s32 temp_s5 = this->unk_344;
s16 phi_s6 = 0;
- s32 phi_s0 = D_80BF57E4[this->unk_344][temp_s7];
+ s32 phi_s0 = D_80BF57E4[this->unk_344][pathIndex];
do {
SubS_CopyPointFromPathCheckBounds(this->path, phi_s0 - 1, &sp9C);
@@ -390,7 +390,7 @@ s32 func_80BF43FC(EnRg* this) {
phi_s4 = phi_s0;
}
phi_s0++;
- } while ((temp_s5 != 18) && (phi_s0 < D_80BF57E4[temp_s5 + 1][temp_s7]));
+ } while ((temp_s5 != 18) && (phi_s0 < D_80BF57E4[temp_s5 + 1][pathIndex]));
return phi_s4;
}
@@ -589,8 +589,8 @@ void func_80BF4AB8(EnRg* this, PlayState* play) {
this->unk_326 = 0x28;
if (player->stateFlags3 & PLAYER_STATE3_1000) {
player->linearVelocity *= 0.5f;
- player->unk_B08[0] = player->linearVelocity;
- player->unk_B08[1] += player->linearVelocity * 0.05f;
+ player->unk_B08 = player->linearVelocity;
+ player->unk_B0C += player->linearVelocity * 0.05f;
if (BINANG_SUB(this->actor.yawTowardsPlayer, player->currentYaw) > 0) {
player->currentYaw += 0x2000;
} else {
@@ -741,7 +741,8 @@ void EnRg_Init(Actor* thisx, PlayState* play) {
Effect_Add(play, &this->unk_340, EFFECT_TIRE_MARK, 0, 0, &D_80BF59F0);
- this->path = SubS_GetDayDependentPath(play, ENRG_GET_7F80(&this->actor), 255, &this->unk_33C);
+ this->path =
+ SubS_GetDayDependentPath(play, ENRG_GET_PATH_INDEX(&this->actor), ENRG_PATH_INDEX_NONE, &this->unk_33C);
if (this->path != NULL) {
this->unk_33C = 1;
}
@@ -786,7 +787,9 @@ void EnRg_Update(Actor* thisx, PlayState* play) {
func_80BF4024(this, play);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 0.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if (this->actor.floorHeight <= BGCHECK_Y_MIN) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
@@ -802,7 +805,7 @@ void EnRg_Update(Actor* thisx, PlayState* play) {
void func_80BF547C(EnRg* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
@@ -854,7 +857,7 @@ void EnRg_Draw(Actor* thisx, PlayState* play) {
if (!(this->unk_310 & 0x10)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BF59F8[this->unk_31E]));
diff --git a/src/overlays/actors/ovl_En_Rg/z_en_rg.h b/src/overlays/actors/ovl_En_Rg/z_en_rg.h
index 4db0b58e0..14f8e3882 100644
--- a/src/overlays/actors/ovl_En_Rg/z_en_rg.h
+++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.h
@@ -7,7 +7,9 @@ struct EnRg;
typedef void (*EnRgActionFunc)(struct EnRg*, PlayState*);
-#define ENRG_GET_7F80(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+#define ENRG_GET_PATH_INDEX(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+
+#define ENRG_PATH_INDEX_NONE 0xFF
typedef struct {
/* 0x00 */ u8 unk_00;
diff --git a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
index ae7da7d1b..6ea51586a 100644
--- a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
+++ b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
@@ -35,7 +35,7 @@ void EnRiverSound_Init(Actor* thisx, PlayState* play) {
this->playSound = false;
pathIndex = RS_GET_PATH_INDEX(&this->actor);
this->actor.params = RS_GET_TYPE(&this->actor);
- if (pathIndex == 0xFF) {
+ if (pathIndex == RS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
diff --git a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
index eff4fbb47..ceef56fbe 100644
--- a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
+++ b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
@@ -8,6 +8,8 @@ struct EnRiverSound;
#define RS_GET_TYPE(thisx) ((thisx)->params & 0xFF);
#define RS_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF);
+#define RS_PATH_INDEX_NONE 0xFF
+
// Any param not as one of these values will result in UB
typedef enum {
/* 0x00 */ RS_RIVER_STREAM,
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 3e193ce79..cb16e5f39 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -807,7 +807,9 @@ void EnRr_Update(Actor* thisx, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider1.dim.radius, 0.0f, 0x5D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider1.dim.radius, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_40);
func_808FB794(this, play);
if (this->unk_1FC > 0) {
@@ -883,7 +885,7 @@ void EnRr_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0C, mtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
diff --git a/src/overlays/actors/ovl_En_Rr/z_en_rr.h b/src/overlays/actors/ovl_En_Rr/z_en_rr.h
index e996cfb12..6f4178dd9 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.h
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.h
@@ -7,12 +7,12 @@ struct EnRr;
typedef void (*EnRrActionFunc)(struct EnRr*, PlayState*);
-enum {
+typedef enum {
/* 0 */ ENRR_0,
/* 1 */ ENRR_1,
/* 2 */ ENRR_2,
- /* 3 */ ENRR_3,
-};
+ /* 3 */ ENRR_3
+} EnRrParam;
typedef struct {
/* 0x00 */ f32 unk_00;
diff --git a/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c b/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
index 4f6dd1dc1..0d9ada5e0 100644
--- a/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
+++ b/src/overlays/actors/ovl_En_Rsn/z_en_rsn.c
@@ -86,9 +86,11 @@ void EnRsn_Draw(Actor* thisx, PlayState* play) {
EnRsn* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBombShopkeeperEyeTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnRsn_OverrideLimbDraw, EnRsn_PostLimbDraw, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Ru/z_en_ru.c b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
index 0f8c45872..3a4d30516 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.c
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
@@ -138,7 +138,7 @@ s32 EnRu_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s32 EnRu_PlayWalkingSound(EnRu* this, PlayState* play) {
u8 leftWasGrounded;
u8 rightWasGrounded;
- s32 waterSfxId;
+ SurfaceSfxOffset surfaceSfxOffset;
s16 sfxId;
u8 isFootGrounded;
@@ -147,15 +147,16 @@ s32 EnRu_PlayWalkingSound(EnRu* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
if (this->actor.depthInWater < 20.0f) {
- waterSfxId = NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_SHALLOW;
} else {
- waterSfxId = NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_DEEP;
}
- sfxId = waterSfxId + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND + surfaceSfxOffset;
} else {
- sfxId = SurfaceType_GetSfx(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND +
+ SurfaceType_GetSfxOffset(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
}
this->isLeftFootGrounded = isFootGrounded = SubS_IsFloorAbove(play, &this->leftFootPos, -6.0f);
@@ -234,7 +235,7 @@ void EnRu_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, RU_GET_PATH(thisx), 0x3F);
+ this->path = SubS_GetPathByIndex(play, RU_GET_PATH_INDEX(thisx), RU_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = EnRu_DoNothing;
this->actor.gravity = -4.0f;
@@ -250,7 +251,7 @@ void EnRu_Update(Actor* thisx, PlayState* play) {
EnRu* this = THIS;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnRu_UpdateModel(this, play);
EnRu_UpdateCollider(this, play);
}
@@ -319,7 +320,7 @@ void EnRu_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/src/overlays/actors/ovl_En_Ru/z_en_ru.h b/src/overlays/actors/ovl_En_Ru/z_en_ru.h
index 081f3bbd8..7aeaea044 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.h
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.h
@@ -4,7 +4,9 @@
#include "global.h"
#include "objects/object_ru2/object_ru2.h"
-#define RU_GET_PATH(thisx) ((thisx->params & 0x7E00) >> 9)
+#define RU_GET_PATH_INDEX(thisx) ((thisx->params & 0x7E00) >> 9)
+
+#define RU_PATH_INDEX_NONE 0x3F
struct EnRu;
diff --git a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
index cf62faf71..dfff2735c 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
@@ -11,11 +11,11 @@
#define THIS ((EnRuppecrow*)thisx)
-enum {
- ENRUPPECROW_EFFECT_NONE = 0,
- ENRUPPECROW_EFFECT_ICE = 10,
- ENRUPPECROW_EFFECT_LIGHT = 20,
-};
+typedef enum {
+ /* 0x00 */ ENRUPPECROW_EFFECT_NONE = 0,
+ /* 0x0A */ ENRUPPECROW_EFFECT_ICE = 10,
+ /* 0x14 */ ENRUPPECROW_EFFECT_LIGHT = 20
+} EnRuppecrowEffect;
void EnRuppecrow_Init(Actor* thisx, PlayState* play2);
void EnRuppecrow_Destroy(Actor* thisx, PlayState* play);
@@ -130,7 +130,8 @@ s32 EnRuppecrow_UpdateCollision(EnRuppecrow* this, PlayState* play) {
this->collider.elements->dim.worldSphere.center.z = this->actor.world.pos.z;
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 25.0f, 50.0f, 0x07);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 25.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
return true;
}
@@ -152,17 +153,15 @@ s32 EnRuppecrow_ReachedPointClockwise(EnRuppecrow* this, Path* path, s32 pointIn
if (currentPoint == 0) {
diffX = points[1].x - points[0].x;
diffZ = points[1].z - points[0].z;
+ } else if (currentPoint == (pathCount - 1)) {
+ diffX = points[pathCount - 1].x - points[pathCount - 2].x;
+ diffZ = points[pathCount - 1].z - points[pathCount - 2].z;
} else {
- if (currentPoint == (pathCount - 1)) {
- diffX = points[pathCount - 1].x - points[pathCount - 2].x;
- diffZ = points[pathCount - 1].z - points[pathCount - 2].z;
- } else {
- diffX = points[currentPoint + 1].x - points[currentPoint - 1].x;
- diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
- }
+ diffX = points[currentPoint + 1].x - points[currentPoint - 1].x;
+ diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RADF_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -187,17 +186,15 @@ s32 EnRuppecrow_ReachedPointCounterClockwise(EnRuppecrow* this, Path* path, s32
if (currentPoint == 0) {
diffX = points[0].x - points[1].x;
diffZ = points[0].z - points[1].z;
+ } else if (currentPoint == (pathCount - 1)) {
+ diffX = points[pathCount - 2].x - points[pathCount - 1].x;
+ diffZ = points[pathCount - 2].z - points[pathCount - 1].z;
} else {
- if (currentPoint == (pathCount - 1)) {
- diffX = points[pathCount - 2].x - points[pathCount - 1].x;
- diffZ = points[pathCount - 2].z - points[pathCount - 1].z;
- } else {
- diffX = points[currentPoint - 1].x - points[currentPoint + 1].x;
- diffZ = points[currentPoint - 1].z - points[currentPoint + 1].z;
- }
+ diffX = points[currentPoint - 1].x - points[currentPoint + 1].x;
+ diffZ = points[currentPoint - 1].z - points[currentPoint + 1].z;
}
- func_8017B7F8(&point, RADF_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -235,19 +232,23 @@ s32 EnRuppecrow_CanSpawnBlueRupees(PlayState* play) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
return false;
+
case PLAYER_FORM_GORON:
return true;
+
case PLAYER_FORM_ZORA:
return false;
+
case PLAYER_FORM_HUMAN:
if (player->stateFlags1 & PLAYER_STATE1_800000) {
return true;
} else {
return false;
}
- }
- return false;
+ default:
+ return false;
+ }
}
void EnRuppecrow_UpdateRupees(EnRuppecrow* this) {
@@ -256,7 +257,7 @@ void EnRuppecrow_UpdateRupees(EnRuppecrow* this) {
for (rupeeIndex = 0; rupeeIndex < ENRUPPECROW_RUPEE_COUNT; rupeeIndex++) {
rupee = this->rupees[rupeeIndex];
- if (rupee != NULL && rupee->unk152 == 0) {
+ if ((rupee != NULL) && (rupee->unk152 == 0)) {
Actor_Kill(&rupee->actor);
}
}
@@ -374,16 +375,19 @@ s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
return true;
}
break;
+
case PLAYER_FORM_GORON:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) {
return true;
}
break;
+
case PLAYER_FORM_ZORA:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE) {
return true;
}
break;
+
case PLAYER_FORM_HUMAN:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) {
return true;
@@ -393,6 +397,9 @@ s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
return true;
}
break;
+
+ default:
+ break;
}
}
@@ -406,6 +413,7 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
case PLAYER_FORM_DEKU:
this->speedModifier = 7.0f;
break;
+
case PLAYER_FORM_GORON:
if (player->stateFlags3 & PLAYER_STATE3_1000) { // Goron Link is curled
this->speedModifier = 19.0f;
@@ -413,9 +421,11 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
this->speedModifier = 7.0f;
}
break;
+
case PLAYER_FORM_ZORA:
this->speedModifier = 7.0f;
break;
+
case PLAYER_FORM_HUMAN:
if (player->stateFlags1 & PLAYER_STATE1_800000) {
this->speedModifier = 16.0f;
@@ -423,6 +433,9 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
this->speedModifier = 7.0f;
}
break;
+
+ default:
+ break;
}
this->skelAnime.playSpeed = this->speedModifier / 6.0f;
@@ -503,7 +516,7 @@ void EnRuppecrow_HandleSong(EnRuppecrow* this, PlayState* play) {
}
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = EnRuppecrow_HandleSongCutscene;
}
@@ -525,12 +538,12 @@ void EnRuppecrow_HandleSong(EnRuppecrow* this, PlayState* play) {
void EnRuppecrow_HandleSongCutscene(EnRuppecrow* this, PlayState* play) {
EnRuppecrow_UpdatePosition(this, play);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
EnRuppecrow_UpdateSpeed(this, play);
this->actionFunc = EnRuppecrow_FlyWhileDroppingRupees;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
Actor_MoveWithoutGravity(&this->actor);
@@ -553,7 +566,7 @@ void EnRuppecrow_FlyWhileDroppingRupees(EnRuppecrow* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
Actor_MoveWithGravity(&this->actor);
} else {
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
EnRuppecrow_UpdateSpeed(this, play);
Math_ApproachF(&this->actor.speed, this->speedModifier, 0.2f, 0.5f);
}
@@ -639,7 +652,7 @@ void EnRuppecrow_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.flags |= ACTOR_FLAG_2000000;
- this->path = SubS_GetPathByIndex(play, ENRUPPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENRUPPECROW_GET_PATH_INDEX(&this->actor), ENRUPPECROW_PATH_INDEX_NONE);
if (this->path != NULL) {
this->actionFunc = EnRuppecrow_HandleSong;
} else {
@@ -667,7 +680,7 @@ void EnRuppecrow_Update(Actor* thisx, PlayState* play) {
void EnRuppecrow_Draw(Actor* thisx, PlayState* play) {
EnRuppecrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
index 887cd8c6b..5d591258b 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
@@ -4,7 +4,9 @@
#include "global.h"
#include "objects/object_crow/object_crow.h"
-#define ENRUPPECROW_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENRUPPECROW_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENRUPPECROW_PATH_INDEX_NONE 0x3F
#define ENRUPPECROW_RUPEE_COUNT 20
#define ENRUPPECROW_LIMB_POS_COUNT 4
diff --git a/src/overlays/actors/ovl_En_Rz/z_en_rz.c b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
index 23b6419ab..e980d1cb5 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.c
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
@@ -87,14 +87,14 @@ static ColliderCylinderInit sCylinderInit = {
void EnRz_Init(Actor* thisx, PlayState* play) {
EnRz* this = THIS;
- s16 tempCutscene = this->actor.cutscene;
+ s16 csId = this->actor.csId;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
- this->cutscenes[i] = tempCutscene;
- if (tempCutscene != -1) {
- this->actor.cutscene = tempCutscene;
- tempCutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
@@ -156,12 +156,12 @@ void EnRz_Init(Actor* thisx, PlayState* play) {
}
if (EN_RZ_GET_SISTER(&this->actor) == EN_RZ_JUDO) {
- this->csAction = 0x226;
+ this->cueType = CS_CMD_ACTOR_CUE_550;
} else { // EN_RZ_MARILLA
- this->csAction = 0x227;
+ this->cueType = CS_CMD_ACTOR_CUE_551;
}
- this->actionIndex = 0;
+ this->cueId = 0;
}
/**
@@ -203,7 +203,7 @@ void EnRz_ChangeAnim(PlayState* play, EnRz* this, s16 animIndex, u8 animMode, f3
&gRosaSistersStandingAnim, &gRosaSistersStandingAnim, &gRosaSistersWalkingAnim, &gRosaSistersSittingAnim,
&gRosaSistersApplaudingAnim, &gRosaSistersOnKneesAnim, &gRosaSistersDancingAnim,
};
- static LinkAnimationHeader* sLinkAnimations[] = {
+ static PlayerAnimationHeader* sPlayerAnimations[] = {
&gPlayerAnim_link_normal_wait_free,
&gPlayerAnim_alink_dance_loop,
};
@@ -219,13 +219,15 @@ void EnRz_ChangeAnim(PlayState* play, EnRz* this, s16 animIndex, u8 animMode, f3
if ((animIndex >= EN_RZ_ANIM_THINKING) && (animIndex < EN_RZ_ANIM_MAX) &&
((animIndex != this->animIndex) || (animMode != ANIMMODE_LOOP))) {
if (animIndex >= ARRAY_COUNT(sJudoAnimations)) {
- endFrame = Animation_GetLastFrame(sLinkAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)]);
+ endFrame = Animation_GetLastFrame(sPlayerAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)]);
if (animMode == ANIMMODE_LOOP) {
- LinkAnimation_Change(play, &this->skelAnime, sLinkAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)],
- 2.0f / 3.0f, 0.0f, endFrame, ANIMMODE_LOOP, morphFrames);
+ PlayerAnimation_Change(play, &this->skelAnime,
+ sPlayerAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)], 2.0f / 3.0f, 0.0f,
+ endFrame, ANIMMODE_LOOP, morphFrames);
} else {
- LinkAnimation_Change(play, &this->skelAnime, sLinkAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)],
- 2.0f / 3.0f, 0.0f, endFrame, ANIMMODE_LOOP, morphFrames);
+ PlayerAnimation_Change(play, &this->skelAnime,
+ sPlayerAnimations[animIndex - ARRAY_COUNT(sJudoAnimations)], 2.0f / 3.0f, 0.0f,
+ endFrame, ANIMMODE_LOOP, morphFrames);
}
} else {
Animation_Change(&this->skelAnime, animationPtr[animIndex], 1.0f, 0.0f,
@@ -245,8 +247,8 @@ void func_80BFBA1C(PlayState* play, EnRz* this, s16 animIndex) {
}
s32 EnRz_SetupPath(EnRz* this, PlayState* play) {
- if (EN_RZ_GET_PATH(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[EN_RZ_GET_PATH(&this->actor)];
+ if (EN_RZ_GET_PATH_INDEX(&this->actor) != EN_RZ_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[EN_RZ_GET_PATH_INDEX(&this->actor)];
if (this->path != NULL) {
Path* path = this->path;
Vec3s* points = (Vec3s*)Lib_SegmentedToVirtual(path->points);
@@ -325,7 +327,7 @@ s32 EnRz_UpdateSkelAnime(EnRz* this, PlayState* play) {
if (this->animIndex < EN_RZ_ANIM_LINK_NORMAL_WAIT_FREE) {
return SkelAnime_Update(&this->skelAnime);
} else {
- return LinkAnimation_Update(play, &this->skelAnime);
+ return PlayerAnimation_Update(play, &this->skelAnime);
}
}
@@ -345,9 +347,9 @@ EnRz* EnRz_FindSister(EnRz* this, PlayState* play) {
void func_80BFBDFC(PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_80)) {
- func_80151BB4(play, 0x27);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP);
}
- func_80151BB4(play, 0xC);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS);
}
void EnRz_Destroy(Actor* thisx, PlayState* play) {
@@ -357,18 +359,18 @@ void EnRz_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80BFBE70(EnRz* this, PlayState* play) {
- u16 action;
+ u16 cueId;
if ((EN_RZ_GET_SISTER(&this->actor) == EN_RZ_JUDO) && (this->animIndex == EN_RZ_ANIM_APPLAUDING)) {
func_800B9010(&this->actor, NA_SE_EV_CLAPPING_2P - SFX_FLAG);
}
- if (Cutscene_CheckActorAction(play, this->csAction)) {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->csAction));
- action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action;
- if (this->actionIndex != action) {
- this->actionIndex = action;
- switch (this->actionIndex) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
case 1:
func_80BFBA1C(play, this, EN_RZ_ANIM_STANDING);
break;
@@ -393,18 +395,18 @@ s32 func_80BFBE70(EnRz* this, PlayState* play) {
}
s32 func_80BFBFAC(EnRz* this, PlayState* play) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
Message_StartTextbox(play, 0x2925, &this->actor);
this->actionFunc = func_80BFC078;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
return false;
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
return true;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
return false;
}
@@ -444,7 +446,7 @@ void func_80BFC078(EnRz* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, NA_BGM_ROSA_SISTERS, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_ROSA_SISTERS, 900.0f);
}
}
@@ -496,7 +498,7 @@ void func_80BFC36C(EnRz* this, PlayState* play) {
this->actionFunc = func_80BFC2F4;
SET_WEEKEVENTREG(WEEKEVENTREG_75_80);
}
- this->actor.cutscene = this->cutscenes[1];
+ this->actor.csId = this->csIdList[1];
}
}
@@ -516,7 +518,7 @@ void func_80BFC3F8(EnRz* this, PlayState* play) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_10000)) {
this->actionFunc = func_80BFC36C;
- this->actor.cutscene = this->cutscenes[0];
+ this->actor.csId = this->csIdList[0];
this->actor.flags &= ~ACTOR_FLAG_10000;
} else if (Player_GetMask(play) == PLAYER_MASK_KAMARO) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04)) {
@@ -545,7 +547,7 @@ void func_80BFC3F8(EnRz* this, PlayState* play) {
bgmPos.x = this->actor.projectedPos.x;
bgmPos.y = this->actor.projectedPos.y;
bgmPos.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &bgmPos, NA_BGM_ROSA_SISTERS, 900.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &bgmPos, NA_BGM_ROSA_SISTERS, 900.0f);
}
}
}
@@ -653,7 +655,7 @@ void EnRz_Update(Actor* thisx, PlayState* play) {
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);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
@@ -684,7 +686,7 @@ void EnRz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (EN_RZ_GET_SISTER(&this->actor) == EN_RZ_JUDO) {
AnimatedMat_DrawStepOpa(play, Lib_SegmentedToVirtual(&object_rz_Matanimheader_00D768), 0);
diff --git a/src/overlays/actors/ovl_En_Rz/z_en_rz.h b/src/overlays/actors/ovl_En_Rz/z_en_rz.h
index 38a7088e8..a29f6d5c2 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.h
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.h
@@ -6,7 +6,9 @@
#define EN_RZ_GET_SISTER(thisx) ((thisx)->params & 0x8000)
#define EN_RZ_GET_TYPE(thisx) ((thisx)->params & 0xF)
-#define EN_RZ_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define EN_RZ_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define EN_RZ_PATH_INDEX_NONE 0x3F
typedef enum {
/* 0 */ EN_RZ_JUDO, // in red
@@ -40,9 +42,9 @@ typedef struct EnRz {
/* 0x420 */ u16 stateFlags;
/* 0x422 */ s16 animIndex;
/* 0x424 */ s16 timer;
- /* 0x426 */ u16 csAction;
- /* 0x428 */ u16 actionIndex;
- /* 0x42A */ s16 cutscenes[2];
+ /* 0x426 */ u16 cueType;
+ /* 0x428 */ u16 cueId;
+ /* 0x42A */ s16 csIdList[2];
/* 0x430 */ EnRzActionFunc actionFunc;
} EnRz; // size = 0x434
diff --git a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
index f3af8a510..54fe2698d 100644
--- a/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
+++ b/src/overlays/actors/ovl_En_S_Goro/z_en_s_goro.c
@@ -171,12 +171,12 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronStandingHandTappingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronSleepyAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
@@ -235,7 +235,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
switch (EN_S_GORO_GET_MAIN_TYPE(&this->actor)) {
case EN_S_GORO_TYPE_SHRINE_WINTER_A:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_02)) {
switch (this->textId) {
@@ -302,7 +302,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_B:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_40)) {
switch (this->textId) {
@@ -367,7 +367,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_C:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_37_02)) {
switch (this->textId) {
@@ -701,7 +701,7 @@ u16 EnSGoro_BombshopGoron_NextTextId(EnSGoro* this, PlayState* play) {
return 0x673;
}
this->powderKegPrice = play->msgCtx.unk1206C;
- if (gSaveContext.save.playerData.rupees < this->powderKegPrice) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->powderKegPrice) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_LASTMESSAGE;
this->actionFlags |= EN_S_GORO_ACTIONFLAG_TIRED;
play_sound(NA_SE_SY_ERROR);
@@ -771,7 +771,7 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE1);
}
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_SUPPRESS_SNORE;
}
@@ -842,7 +842,7 @@ s32 EnSGoro_CheckGKBehavior(EnSGoro* this, PlayState* play) {
return false;
}
if ((!(this->actionFlags & EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED)) &&
- ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->animInfoIndex = EN_S_GORO_ANIM_ROLLUP;
@@ -1026,7 +1026,7 @@ void EnSGoro_SetupAction(EnSGoro* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->loadedObjIndex)) {
this->actionFlags = 0;
if (EN_S_GORO_OFTYPE_WSHRINE) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->actionFlags |= EN_S_GORO_ACTIONFLAG_EYESOPEN;
this->animInfoIndex = EN_S_GORO_ANIM_SHIVER_A;
@@ -1328,7 +1328,7 @@ void EnSGoro_Update(Actor* thisx, PlayState* play) {
EnSGoro* this = (EnSGoro*)thisx;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->loadedObjIndex].segment);
SkelAnime_Update(&this->skelAnime);
if (this->animInfoIndex != EN_S_GORO_ANIM_SLEEPY) {
@@ -1435,9 +1435,10 @@ void EnSGoro_DrawUnrolled(EnSGoro* this, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x8, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gDPPipeSync(POLY_OPA_DISP++);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
@@ -1449,7 +1450,8 @@ void EnSGoro_DrawUnrolled(EnSGoro* this, PlayState* play) {
void EnSGoro_DrawRolledUp(EnSGoro* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + this->actor.shape.yOffset,
this->actor.world.pos.z, MTXMODE_NEW);
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 6b2304b19..17ad656a4 100644
--- a/src/overlays/actors/ovl_En_Sb/z_en_sb.c
+++ b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
@@ -375,7 +375,7 @@ void EnSb_Update(Actor* thisx, PlayState* play) {
Actor_SetFocus(&this->actor, 20.0f);
Actor_MoveWithGravity(&this->actor);
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
EnSb_UpdateDamage(this, play);
if (player->stateFlags1 & PLAYER_STATE1_8000000) {
Collider_UpdateCylinder(&this->actor, &this->collider);
@@ -417,9 +417,9 @@ void EnSb_Draw(Actor* thisx, PlayState* play) {
fireDecr = this->fireCount - 1;
if (!(fireDecr & 1)) {
offset = &sFlamePosOffsets[fireDecr & 3];
- flamePos.x = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.x + offset->x);
- flamePos.y = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.y + offset->y);
- flamePos.z = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.z + offset->z);
+ flamePos.x = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.x + offset->x);
+ flamePos.y = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.y + offset->y);
+ flamePos.z = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.z + offset->z);
EffectSsEnFire_SpawnVec3f(play, &this->actor, &flamePos, 100, 0, 0, -1);
}
}
diff --git a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
index da7c85f63..5a3dc440a 100644
--- a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
+++ b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.c
@@ -21,7 +21,7 @@ void func_80BD6B18(EnScRuppe* this, PlayState* play);
typedef struct {
/* 0x0 */ TexturePtr tex;
/* 0x4 */ s16 amount;
-} RuppeInfo;
+} RuppeInfo; // size = 0x8
ActorInit En_Sc_Ruppe_InitVars = {
ACTOR_EN_SC_RUPPE,
@@ -67,7 +67,7 @@ static ColliderCylinderInit sCylinderInit = {
void EnScRuppe_UpdateCollision(EnScRuppe* this, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
s32 func_80BD697C(s16 ruppeIndex) {
@@ -181,7 +181,7 @@ void EnScRuppe_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sRupeeInfo[this->ruppeIndex].tex));
diff --git a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
index 8ef0f4c56..afc955985 100644
--- a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
+++ b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
@@ -23,7 +23,7 @@ typedef enum {
/* 2 */ RUPEE_RED,
/* 3 */ RUPEE_ORANGE,
/* 4 */ RUPEE_PURPLE,
- /* 5 */ RUPEE_UNUSED,
+ /* 5 */ RUPEE_UNUSED
} RupeeType;
#endif // Z_EN_SC_RUPPE_H
diff --git a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
index d2a9d525e..4ef4fdd46 100644
--- a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
+++ b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c
@@ -90,7 +90,7 @@ void EnScopecoin_Draw(Actor* thisx, PlayState* play) {
EnScopecoin* this = THIS;
GraphicsContext* gfxCtx = play->state.gfxCtx;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
func_800B8050(&this->actor, play, 0);
OPEN_DISPS(gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
index da4614d24..448683376 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
@@ -166,7 +166,7 @@ void func_80BCD2BC(EnScopecrow* this, PlayState* play) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_SC_RUPPE, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.shape.rot.x,
this->actor.shape.rot.y, this->actor.shape.rot.z, this->actor.params,
- this->actor.cutscene, this->actor.halfDaysBits, NULL);
+ this->actor.csId, this->actor.halfDaysBits, NULL);
}
s32 func_80BCD334(EnScopecrow* this, Path* path, s32 pointIndex) {
@@ -192,7 +192,7 @@ s32 func_80BCD334(EnScopecrow* this, Path* path, s32 pointIndex) {
phi_fa1 = points[index + 1].z - points[index - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_fa0, phi_fa1)), &sp3C.z, &sp3C.y, &sp3C.x);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_fa0, phi_fa1)), &sp3C.z, &sp3C.y, &sp3C.x);
if (((this->actor.world.pos.x * sp3C.z) + (sp3C.y * this->actor.world.pos.z) + sp3C.x) > 0.0f) {
ret = true;
@@ -276,7 +276,7 @@ void EnScopecrow_Init(Actor* thisx, PlayState* play) {
}
if (func_80BCD09C(this->unk_260)) {
- this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH_INDEX(&this->actor), ENSCOPECROW_PATH_INDEX_NONE);
this->unk_262 = ENSCOPECROW_GET_3E0(&this->actor);
if (this->path != NULL) {
@@ -316,7 +316,7 @@ void EnScopecrow_Init(Actor* thisx, PlayState* play) {
this->collider.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
Actor_SetScale(&this->actor, 0.03f);
- this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH_INDEX(&this->actor), ENSCOPECROW_PATH_INDEX_NONE);
this->unk_262 = ENSCOPECROW_GET_3E0(&this->actor);
if (this->path != NULL) {
@@ -354,7 +354,7 @@ void EnScopecrow_Update(Actor* thisx, PlayState* play) {
void EnScopecrow_Draw(Actor* thisx, PlayState* play) {
EnScopecrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
index 30f002fb5..523d28804 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
@@ -10,7 +10,9 @@ typedef void (*EnScopecrowActionFunc)(struct EnScopecrow*, PlayState*);
#define ENSCOPECROW_GET_1F(thisx) ((thisx)->params & 0x1F)
#define ENSCOPECROW_GET_3E0(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENSCOPECROW_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSCOPECROW_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSCOPECROW_PATH_INDEX_NONE 0x3F
typedef struct EnScopecrow {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
index 63a713358..cf634321e 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
@@ -163,7 +163,7 @@ void func_80BCAE78(EnScopenuts* this, PlayState* play) {
}
if (this->unk_328 & 2) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -334,7 +334,7 @@ void func_80BCB6D0(EnScopenuts* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) {
case 0:
- if (gSaveContext.save.playerData.rupees < this->unk_358) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < this->unk_358) {
play_sound(NA_SE_SY_ERROR);
this->unk_33C = 0x1636;
this->unk_328 |= 1;
@@ -448,14 +448,14 @@ void func_80BCBA00(EnScopenuts* this, PlayState* play) {
}
if (this->unk_36C == 0) {
- if (ActorCutscene_GetCanPlayNext(this->unk_338)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_338, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_36C = 1;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_338);
+ CutsceneManager_Queue(this->csId);
return;
}
}
@@ -593,7 +593,7 @@ void func_80BCBFFC(EnScopenuts* this, PlayState* play) {
if (sp32 == 3) {
if (this->unk_334 >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->unk_338);
+ CutsceneManager_Stop(this->csId);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_52_40);
this->actionFunc = func_80BCC288;
} else {
@@ -601,7 +601,7 @@ void func_80BCBFFC(EnScopenuts* this, PlayState* play) {
}
}
} else if (this->actor.playerHeightRel > 500.0f) {
- ActorCutscene_Stop(this->unk_338);
+ CutsceneManager_Stop(this->csId);
this->actionFunc = func_80BCC288;
}
@@ -609,17 +609,17 @@ void func_80BCBFFC(EnScopenuts* this, PlayState* play) {
func_80BCAD64(this, sp32);
if (this->unk_36C == 2) {
- if (ActorCutscene_GetCanPlayNext(this->unk_338)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_338, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_36C = 3;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_338);
+ CutsceneManager_Queue(this->csId);
return;
}
} else if ((this->unk_36C == 1) && (this->unk_36E == 20)) {
- ActorCutscene_Stop(this->unk_338);
- this->unk_338 = ActorCutscene_GetAdditionalCutscene(this->unk_338);
- ActorCutscene_SetIntentToPlay(this->unk_338);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->unk_36C = 2;
}
this->unk_36E++;
@@ -654,7 +654,7 @@ s32 func_80BCC2AC(EnScopenuts* this, Path* path, s32 arg2_) {
phi_f14 = sp5C[arg2 + 1].z - sp5C[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
@@ -684,7 +684,8 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnScopenuts* this = THIS;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_74_40) && (gSaveContext.save.inventory.items[ITEM_OCARINA] == ITEM_NONE)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_74_40) &&
+ (gSaveContext.save.saveInfo.inventory.items[ITEM_OCARINA] == ITEM_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -707,7 +708,8 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_40)) {
Actor_Kill(&this->actor);
} else if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- this->path = SubS_GetPathByIndex(play, ENSCOPENUTS_GET_FC00(&this->actor), 0x3F);
+ this->path =
+ SubS_GetPathByIndex(play, ENSCOPENUTS_GET_PATH_INDEX(&this->actor), ENSCOPENUTS_PATH_INDEX_NONE);
this->actor.draw = NULL;
this->actionFunc = func_80BCAFA8;
this->actor.gravity = 0.0f;
@@ -716,13 +718,14 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
}
} else if (ENSCOPENUTS_GET_3E0(&this->actor) == ENSCOPENUTS_3E0_1) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_40)) {
- this->path = SubS_GetPathByIndex(play, ENSCOPENUTS_GET_FC00(&this->actor), 0x3F);
+ this->path =
+ SubS_GetPathByIndex(play, ENSCOPENUTS_GET_PATH_INDEX(&this->actor), ENSCOPENUTS_PATH_INDEX_NONE);
if (this->path == NULL) {
Actor_Kill(&this->actor);
} else {
this->actor.gravity = -1.0f;
this->actor.draw = EnScopenuts_Draw;
- this->unk_338 = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->unk_33C = 0;
this->unk_358 = 150;
this->unk_348 = 4;
@@ -822,7 +825,7 @@ void EnScopenuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx)
void EnScopenuts_Draw(Actor* thisx, PlayState* play) {
EnScopenuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnScopenuts_OverrideLimbDraw, EnScopenuts_PostLimbDraw,
EnScopenuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
index 5ea0d15eb..3f1b8b84e 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
@@ -8,7 +8,9 @@ struct EnScopenuts;
typedef void (*EnScopenutsActionFunc)(struct EnScopenuts*, PlayState*);
#define ENSCOPENUTS_GET_3E0(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENSCOPENUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSCOPENUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSCOPENUTS_PATH_INDEX_NONE 0x3F
#define ENSCOPENUTS_3E0_0 0
#define ENSCOPENUTS_3E0_1 1
@@ -24,7 +26,7 @@ typedef struct EnScopenuts {
/* 0x32C */ f32 unk_32C;
/* 0x330 */ Path* path;
/* 0x334 */ s32 unk_334;
- /* 0x338 */ s16 unk_338;
+ /* 0x338 */ s16 csId;
/* 0x33A */ UNK_TYPE1 unk33A[2];
/* 0x33C */ u16 unk_33C;
/* 0x33E */ s16 unk_33E;
diff --git a/src/overlays/actors/ovl_En_Sda/z_en_sda.c b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
index 8835d92da..909510329 100644
--- a/src/overlays/actors/ovl_En_Sda/z_en_sda.c
+++ b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
@@ -228,7 +228,8 @@ void func_8094702C(EnSda* this, u8* shadowTexture, Player* player, PlayState* pl
if (BREG(57) != 0) {
for (shadowTextureTemp = shadowTexture, i = 0; i < 0x1000; i++, shadowTextureTemp++) {
- if ((i >= 0 && i < 0x40) || (i >= 0xFC0 && i < 0x1000) || ((i & 0x3F) == 0) || ((i & 0x3F) == 0x3F)) {
+ if (((i >= 0) && (i < 0x40)) || ((i >= 0xFC0) && (i < 0x1000)) || ((i & 0x3F) == 0) ||
+ ((i & 0x3F) == 0x3F)) {
*shadowTextureTemp = 255;
} else {
*shadowTextureTemp = 0;
@@ -323,7 +324,7 @@ void func_80947668(u8* shadowTexture, Player* player, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x00, 0, 0, 0, (BREG(52) + 50));
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
@@ -352,6 +353,4 @@ void func_80947668(u8* shadowTexture, Player* player, PlayState* play) {
}
CLOSE_DISPS(gfxCtx);
-
- if (1) {}
}
diff --git a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
index ff12d798f..1e1f19d70 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
@@ -59,7 +59,8 @@ void EnSekihi_Init(Actor* thisx, PlayState* play) {
return;
}
- if ((params == SEKIHI_TYPE_4) && (((gSaveContext.save.skullTokenCount & 0xFFFF)) >= SPIDER_HOUSE_TOKENS_REQUIRED)) {
+ if ((params == SEKIHI_TYPE_4) &&
+ ((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF) >= SPIDER_HOUSE_TOKENS_REQUIRED)) {
// For some reason the mikau grave sets the flag instead of something in the spider house on exit.
SET_WEEKEVENTREG(WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_BUYER_MOVED_IN);
}
@@ -176,12 +177,12 @@ void EnSekihi_Draw(Actor* thisx, PlayState* play) {
if (this->xluDList != NULL) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
index 03aa4ab19..73edc4267 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
@@ -118,7 +118,7 @@ void func_80ADADD0(EnSellnuts* this, PlayState* play) {
}
if (this->unk_338 & 1) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
}
@@ -532,14 +532,14 @@ void func_80ADBE80(EnSellnuts* this, PlayState* play) {
func_80ADAE64(this);
if (this->unk_366 == 0) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_366 = 1;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return;
}
}
@@ -659,31 +659,31 @@ void func_80ADC37C(EnSellnuts* this, PlayState* play) {
this->actor.world.rot.x = -sp30.x;
if (func_80ADCE4C(this, this->path, this->unk_334) && (sp2C < 500.0f)) {
if (this->unk_334 >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->actionFunc = func_80ADC580;
} else {
this->unk_334++;
}
}
} else if (this->actor.playerHeightRel > 500.0f) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->actionFunc = func_80ADC580;
}
Math_ApproachF(&this->actor.speed, 2.0f, 0.2f, 1.0f);
Actor_MoveWithoutGravity(&this->actor);
if (this->unk_366 == 2) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_366 = 3;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return;
}
} else if ((this->unk_366 == 1) && (this->unk_368 == 20)) {
- ActorCutscene_Stop(this->cutscene);
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->unk_366 = 2;
}
@@ -741,22 +741,22 @@ void func_80ADC7B4(EnSellnuts* this, PlayState* play) {
s32 talkState = Message_GetState(&play->msgCtx);
if (this->unk_366 == 0) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_366 = 1;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
} else if ((this->unk_366 == 1) && (talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->unk_366 = 0;
- ActorCutscene_Stop(this->cutscene);
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->unk_338 |= 8;
this->actionFunc = func_80ADC8C4;
}
@@ -766,14 +766,14 @@ void func_80ADC8C4(EnSellnuts* this, PlayState* play) {
Vec3s sp30;
if (this->unk_366 == 0) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_366 = 1;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return;
}
}
@@ -816,7 +816,7 @@ void func_80ADCA64(EnSellnuts* this, PlayState* play) {
this->actor.shape.rot.y += 0x4000;
this->unk_360 *= 0.93f;
if (this->actor.world.pos.y < -50.0f) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->unk_338 &= ~8;
this->unk_34E = 20;
this->unk_350 = 4;
@@ -835,7 +835,7 @@ void func_80ADCA64(EnSellnuts* this, PlayState* play) {
this->collider.dim.height = 0;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, 17);
} else if (this->unk_34C == 17) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
SET_WEEKEVENTREG(WEEKEVENTREG_73_04);
Actor_Kill(&this->actor);
}
@@ -916,7 +916,7 @@ s32 func_80ADCE4C(EnSellnuts* this, Path* path, s32 arg2) {
pointY = points[var + 1].z - points[var - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(pointX, pointY)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(pointX, pointY)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -958,8 +958,8 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
- this->path = SubS_GetPathByIndex(play, ENSELLNUTS_GET_FC00(&this->actor), 0x3F);
- this->cutscene = this->actor.cutscene;
+ this->path = SubS_GetPathByIndex(play, ENSELLNUTS_GET_PATH_INDEX(&this->actor), ENSELLNUTS_PATH_INDEX_NONE);
+ this->csId = this->actor.csId;
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.cylRadius = 0;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -1138,7 +1138,7 @@ void EnSellnuts_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx)
void EnSellnuts_Draw(Actor* thisx, PlayState* play) {
EnSellnuts* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnSellnuts_OverrideLimbDraw, EnSellnuts_PostLimbDraw,
EnSellnuts_TransformLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
index b9793a6d3..d56c04f9e 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
@@ -8,7 +8,9 @@ struct EnSellnuts;
typedef void (*EnSellnutsActionFunc)(struct EnSellnuts*, PlayState*);
#define ENSELLNUTS_GET_1(thisx) ((thisx)->params & 1)
-#define ENSELLNUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSELLNUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSELLNUTS_PATH_INDEX_NONE 0x3F
typedef struct EnSellnuts {
/* 0x000 */ Actor actor;
@@ -23,7 +25,7 @@ typedef struct EnSellnuts {
/* 0x334 */ s32 unk_334;
/* 0x338 */ u16 unk_338;
/* 0x33A */ u16 unk_33A;
- /* 0x33C */ s16 cutscene;
+ /* 0x33C */ s16 csId;
/* 0x33E */ UNK_TYPE1 unk33E[0x2];
/* 0x340 */ u16 unk_340;
/* 0x342 */ u16 unk_342;
diff --git a/src/overlays/actors/ovl_En_Shn/z_en_shn.c b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
index 0e1b182e6..643509515 100644
--- a/src/overlays/actors/ovl_En_Shn/z_en_shn.c
+++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.c
@@ -259,7 +259,7 @@ s32 func_80AE6704(Actor* thisx, PlayState* play) {
case 6:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_POISONED, 6);
gSaveContext.nextCutsceneIndex = 0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -436,7 +436,7 @@ void EnShn_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
void EnShn_Draw(Actor* thisx, PlayState* play) {
EnShn* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnShn_OverrideLimbDraw, EnShn_PostLimbDraw,
EnShn_TransformLimbDraw, &this->actor);
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 09cee41f2..a8167009c 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -165,10 +165,10 @@ void func_809947B0(PlayState* play, EnSkb* this, Vec3f* inPos) {
s32 pad;
pos.y = this->actor.floorHeight;
- pos.x = (sin_rad(sp40) * 15.0f) + inPos->x;
- pos.z = (cos_rad(sp40) * 15.0f) + inPos->z;
- accel.x = randPlusMinusPoint5Scaled(1.0f);
- accel.z = randPlusMinusPoint5Scaled(1.0f);
+ pos.x = (Math_SinF(sp40) * 15.0f) + inPos->x;
+ pos.z = (Math_CosF(sp40) * 15.0f) + inPos->z;
+ accel.x = Rand_CenteredFloat(1.0f);
+ accel.z = Rand_CenteredFloat(1.0f);
velocity.y += (Rand_ZeroOne() - 0.5f) * 4.0f;
EffectSsHahen_Spawn(play, &pos, &velocity, &accel, 0, ((Rand_ZeroOne() * 5.0f) + 12.0f) * 0.8f,
HAHEN_OBJECT_DEFAULT, 10, NULL);
@@ -230,7 +230,7 @@ void EnSkb_Init(Actor* thisx, PlayState* play) {
this->unk_3D6 = ENSKB_GET_F0(&this->actor);
this->actor.floorHeight = this->actor.world.pos.y;
- if ((play->sceneId == SCENE_BOTI) && (gSaveContext.sceneLayer == 1) && (play->csCtx.currentCsIndex == 0)) {
+ if ((play->sceneId == SCENE_BOTI) && (gSaveContext.sceneLayer == 1) && (play->csCtx.scriptIndex == 0)) {
this->actor.flags |= ACTOR_FLAG_100000;
}
@@ -579,7 +579,7 @@ void func_80995A8C(EnSkb* this, PlayState* play) {
}
if ((this->unk_3D8 != 0) && ((play->gameplayFrames % 16) == 0)) {
- this->unk_3DA = randPlusMinusPoint5Scaled(50000.0f);
+ this->unk_3DA = Rand_CenteredFloat(50000.0f);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer + this->unk_3DA, 1, 0x2EE, 0);
@@ -742,11 +742,11 @@ void func_809961E4(EnSkb* this, PlayState* play) {
}
void func_80996284(EnSkb* this, PlayState* play) {
- if (this->unk_3D8 & 0x80) {
- if (1) {}
- Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
- func_80996474(this);
+ if (!(this->unk_3D8 & 0x80)) {
+ return;
}
+ Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
+ func_80996474(this);
}
void func_809962D4(EnSkb* this) {
@@ -982,22 +982,22 @@ void func_8099672C(EnSkb* this, PlayState* play) {
}
void func_80996AD0(EnSkb* this, PlayState* play) {
- if (1) {}
+ if ((this->actionFunc == func_80996284) || (this->unk_3E2 == 1)) {
+ return;
+ }
- if ((this->actionFunc != func_80996284) && (this->unk_3E2 != 1)) {
- if (this->unk_3E4 != 0) {
- CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
- }
+ if (this->unk_3E4 != 0) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+ }
- if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
- (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
- ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
+ (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
+ ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
- if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -1062,7 +1062,9 @@ void EnSkb_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
func_809964DC(this, play);
func_80996AD0(this, play);
func_80996D68(this, play);
@@ -1129,7 +1131,7 @@ void EnSkb_Draw(Actor* thisx, PlayState* play) {
EnSkb* this = THIS;
this->limbCount = 0;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSkb_OverrideLimbDraw,
EnSkb_PostLimbDraw, &this->actor);
if (this->drawDmgEffTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Skb/z_en_skb.h b/src/overlays/actors/ovl_En_Skb/z_en_skb.h
index 1fbf441ea..1970ebf8c 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.h
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.h
@@ -10,8 +10,8 @@ typedef void (*EnSkbActionFunc)(struct EnSkb*, PlayState*);
#define ENSKB_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
typedef enum {
- /* 0 */ ENSKB_PARAMS_0,
-} EnSkbParams;
+ /* 0 */ ENSKB_PARAM_0
+} EnSkbParam;
typedef struct EnSkb {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Slime/z_en_slime.c b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
index 2b8e5f4c6..5e71d1a54 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.c
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
@@ -10,30 +10,62 @@
#define THIS ((EnSlime*)thisx)
+#define ICE_BLOCK_TIMER_MAX 254
+#define ICE_BLOCK_UNUSED (ICE_BLOCK_TIMER_MAX + 1)
+
+typedef enum EnSlimeEyeTexture {
+ /* 0 */ EN_SLIME_EYETEX_OPEN,
+ /* 1 */ EN_SLIME_EYETEX_HALF,
+ /* 2 */ EN_SLIME_EYETEX_CLOSED,
+ /* 3 */ EN_SLIME_EYETEX_HALF2,
+ /* 4 */ EN_SLIME_EYETEX_MAX
+} EnSlimeEyeTexture;
+
+typedef enum EnSlimeDamageEffect {
+ /* 0x0 */ EN_SLIME_DMGEFF_NORMAL,
+ /* 0x1 */ EN_SLIME_DMGEFF_STUN,
+ /* 0x3 */ EN_SLIME_DMGEFF_FREEZE = 0x3,
+ /* 0x4 */ EN_SLIME_DMGEFF_LIGHT,
+ /* 0x5 */ EN_SLIME_DMGEFF_ELECTRIC,
+ /* 0xE */ EN_SLIME_DMGEFF_HOOKSHOT = 0xE,
+ /* 0xF */ EN_SLIME_DMGEFF_BLUNT
+} EnSlimeDamageEffect;
+
void EnSlime_Init(Actor* thisx, PlayState* play);
void EnSlime_Destroy(Actor* thisx, PlayState* play);
void EnSlime_Update(Actor* thisx, PlayState* play);
void EnSlime_Draw(Actor* thisx, PlayState* play);
-void func_80A2F140(EnSlime* this, PlayState* play);
-void func_80A2F1A4(EnSlime* this, PlayState* play);
-void func_80A2F418(EnSlime* this, PlayState* play);
-void func_80A2F6CC(EnSlime* this, PlayState* play);
-void func_80A2F8E0(EnSlime* this, PlayState* play);
-void func_80A2FA88(EnSlime* this, PlayState* play);
-void func_80A2FBA0(EnSlime* this, PlayState* play);
-void func_80A2FE38(EnSlime* this, PlayState* play);
-void func_80A30344(EnSlime* this, PlayState* play);
-void func_80A304B8(EnSlime* this, PlayState* play);
-void func_80A30820(EnSlime* this, PlayState* play);
-void func_80A30944(EnSlime* this, PlayState* play);
-void func_80A30A20(EnSlime* this, PlayState* play);
-void func_80A30AE4(EnSlime* this, PlayState* play);
-void func_80A30C2C(EnSlime* this, PlayState* play);
-void func_80A30CEC(EnSlime* this, PlayState* play);
+void EnSlime_SetupInitializeIdle(EnSlime* this);
+void EnSlime_InitializeIdle(EnSlime* this, PlayState* play);
+void EnSlime_SetupIdle(EnSlime* this);
+void EnSlime_Idle(EnSlime* this, PlayState* play);
+void EnSlime_SetupMoveInDirection(EnSlime* this);
+void EnSlime_MoveInDirection(EnSlime* this, PlayState* play);
+void EnSlime_SetupMoveToHome(EnSlime* this);
+void EnSlime_MoveToHome(EnSlime* this, PlayState* play);
+void EnSlime_SetupTurnToPlayer(EnSlime* this);
+void EnSlime_TurnToPlayer(EnSlime* this, PlayState* play);
+void EnSlime_SetupJump(EnSlime* this);
+void EnSlime_Jump(EnSlime* this, PlayState* play);
+void EnSlime_SetupLand(EnSlime* this);
+void EnSlime_Land(EnSlime* this, PlayState* play);
+void EnSlime_ReactToBluntHit(EnSlime* this, PlayState* play);
+void EnSlime_Damaged(EnSlime* this, PlayState* play);
+void EnSlime_SetupDead(EnSlime* this);
+void EnSlime_Dead(EnSlime* this, PlayState* play);
+void EnSlime_SpawnIceBlock(EnSlime* this, PlayState* play);
+void EnSlime_SetupIceBlock(EnSlime* this);
+void EnSlime_IceBlock(EnSlime* this, PlayState* play);
+void EnSlime_Stun(EnSlime* this, PlayState* play);
+void EnSlime_SetupIceBlockThaw(EnSlime* this);
+void EnSlime_IceBlockThaw(EnSlime* this, PlayState* play);
+void EnSlime_SetupWaitForRevive(EnSlime* this);
+void EnSlime_WaitForRevive(EnSlime* this, PlayState* play);
+void EnSlime_SetupRevive(EnSlime* this);
+void EnSlime_Revive(EnSlime* this, PlayState* play);
-#if 0
-ActorInit En_Slime_InitVars = {
+const ActorInit En_Slime_InitVars = {
ACTOR_EN_SLIME,
ACTORCAT_ENEMY,
FLAGS,
@@ -45,146 +77,1171 @@ ActorInit En_Slime_InitVars = {
(ActorFunc)EnSlime_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80A31AF0 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x04 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_HARD, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x04 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_HARD,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 22, 35, 0, { 0, 0, 0 } },
};
-// static DamageTable sDamageTable = {
-static DamageTable D_80A31B1C = {
- /* Deku Nut */ DMG_ENTRY(0, 0x1),
- /* Deku Stick */ DMG_ENTRY(3, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0x0),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(0, 0xE),
- /* Goron punch */ DMG_ENTRY(0, 0xF),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(0, 0xF),
- /* Fire arrow */ DMG_ENTRY(2, 0x0),
- /* Ice arrow */ DMG_ENTRY(2, 0x3),
- /* Light arrow */ DMG_ENTRY(2, 0x4),
- /* Goron spikes */ DMG_ENTRY(1, 0x0),
- /* Deku spin */ DMG_ENTRY(1, 0x0),
- /* Deku bubble */ DMG_ENTRY(0, 0xF),
- /* Deku launch */ DMG_ENTRY(2, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
- /* Zora barrier */ DMG_ENTRY(1, 0x5),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(0, 0xF),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0x0),
- /* Sword beam */ DMG_ENTRY(0, 0x0),
- /* Normal Roll */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
- /* Unblockable */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0x0),
+static DamageTable sDamageTable = {
+ /* Deku Nut */ DMG_ENTRY(0, EN_SLIME_DMGEFF_STUN),
+ /* Deku Stick */ DMG_ENTRY(3, EN_SLIME_DMGEFF_NORMAL),
+ /* Horse trample */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Explosives */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Zora boomerang */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Normal arrow */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Hookshot */ DMG_ENTRY(0, EN_SLIME_DMGEFF_HOOKSHOT),
+ /* Goron punch */ DMG_ENTRY(0, EN_SLIME_DMGEFF_BLUNT),
+ /* Sword */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Goron pound */ DMG_ENTRY(0, EN_SLIME_DMGEFF_BLUNT),
+ /* Fire arrow */ DMG_ENTRY(2, EN_SLIME_DMGEFF_NORMAL),
+ /* Ice arrow */ DMG_ENTRY(2, EN_SLIME_DMGEFF_FREEZE),
+ /* Light arrow */ DMG_ENTRY(2, EN_SLIME_DMGEFF_LIGHT),
+ /* Goron spikes */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Deku spin */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Deku bubble */ DMG_ENTRY(0, EN_SLIME_DMGEFF_BLUNT),
+ /* Deku launch */ DMG_ENTRY(2, EN_SLIME_DMGEFF_NORMAL),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, EN_SLIME_DMGEFF_STUN),
+ /* Zora barrier */ DMG_ENTRY(1, EN_SLIME_DMGEFF_ELECTRIC),
+ /* Normal shield */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Light ray */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Thrown object */ DMG_ENTRY(0, EN_SLIME_DMGEFF_BLUNT),
+ /* Zora punch */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Spin attack */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
+ /* Sword beam */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Normal Roll */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Unblockable */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, EN_SLIME_DMGEFF_NORMAL),
+ /* Powder Keg */ DMG_ENTRY(1, EN_SLIME_DMGEFF_NORMAL),
};
-// sColChkInfoInit
-static CollisionCheckInfoInit D_80A31B3C = { 1, 22, 35, 60 };
+static CollisionCheckInfoInit sColChkInfoInit = { 1, 22, 35, 60 };
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80A31B54[] = {
+static TexturePtr sEyeTextures[] = {
+ gChuchuEyeOpenTex,
+ gChuchuEyeHalfTex,
+ gChuchuEyeClosedTex,
+ gChuchuEyeHalfTex,
+};
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(gravity, -2, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 6000, ICHAIN_STOP),
};
-#endif
+static s32 sTexturesDesegmented = false;
-extern ColliderCylinderInit D_80A31AF0;
-extern DamageTable D_80A31B1C;
-extern CollisionCheckInfoInit D_80A31B3C;
-extern InitChainEntry D_80A31B54[];
+static Color_RGBA8 sBubblePrimColor = { 255, 255, 255, 255 };
+static Color_RGBA8 sBubbleEnvColor = { 150, 150, 150, 0 };
+static Vec3f sBubbleAccel = { 0.0f, -0.8f, 0.0f };
-extern UNK_TYPE D_060004C0;
-extern UNK_TYPE D_06000828;
+static Color_RGBA8 sPrimColors[] = {
+ { 255, 255, 255, 255 },
+ { 255, 255, 0, 255 },
+ { 255, 255, 200, 255 },
+ { 225, 200, 255, 255 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Init.s")
+static Color_RGBA8 sEnvColors[] = {
+ { 140, 255, 195, 255 },
+ { 50, 255, 0, 255 },
+ { 255, 180, 0, 255 },
+ { 255, 50, 155, 255 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Destroy.s")
+static Vec3f sLimbPosOffsets[EN_SLIME_LIMBPOS_COUNT] = {
+ { 2000.0f, 2000.0f, 0.0f }, { -1500.0f, 2500.0f, -500.0f }, { -500.0f, 1000.0f, 2500.0f },
+ { 0.0f, 4000.0f, 0.0f }, { 0.0f, 2000.0f, -2000.0f },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2EFAC.s")
+AnimatedMaterial* sSlimeTexAnim;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F028.s")
+void EnSlime_Init(Actor* thisx, PlayState* play) {
+ EnSlime* this = THIS;
+ s32 reviveTimeSeconds;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F0A8.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
+ CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 38.0f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F110.s")
+ this->iceBlockTimer = ICE_BLOCK_UNUSED;
+ this->eyeTexIndex = EN_SLIME_EYETEX_OPEN;
+ this->wobbleRot.y = 0.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F140.s")
+ // Sets maximum distance chuchu will move from its home before turning around.
+ if (this->actor.shape.rot.x <= 0) {
+ this->distLimit = 30000.0f;
+ } else {
+ this->distLimit = this->actor.shape.rot.x * 40.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F180.s")
+ this->actor.shape.rot.x = 0;
+ reviveTimeSeconds = EN_SLIME_GET_REVIVE_TIME(&this->actor);
+ this->actor.shape.rot.z = 0;
+ this->actor.params &= 0xFF;
+ if (reviveTimeSeconds == 0xFF) {
+ reviveTimeSeconds = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F1A4.s")
+ // Upper byte of actorParams at init is # of seconds past 10s to revive.
+ this->reviveTime = (reviveTimeSeconds * 20) + 200;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F354.s")
+ // Update addresses of texture assets (if another instance hasn't already)
+ if (!sTexturesDesegmented) {
+ for (i = 0; i < EN_SLIME_EYETEX_MAX; i++) {
+ sEyeTextures[i] = Lib_SegmentedToVirtual(sEyeTextures[i]);
+ }
+ sSlimeTexAnim = Lib_SegmentedToVirtual(gChuchuSlimeFlowTexAnim);
+ sTexturesDesegmented = true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F418.s")
+ // Set hint IDs and drop item icon depending on chuchu color
+ if (EN_SLIME_GET_TYPE(&this->actor) == EN_SLIME_TYPE_YELLOW) {
+ this->itemDropTex = Lib_SegmentedToVirtual(gDropArrows1Tex);
+ this->actor.hintId = TATL_HINT_ID_YELLOW_CHUCHU;
+ } else if (EN_SLIME_GET_TYPE(&this->actor) == EN_SLIME_TYPE_GREEN) {
+ this->itemDropTex = Lib_SegmentedToVirtual(gDropMagicSmallTex);
+ this->actor.hintId = TATL_HINT_ID_GREEN_CHUCHU;
+ } else if (EN_SLIME_GET_TYPE(&this->actor) == EN_SLIME_TYPE_RED) {
+ this->itemDropTex = Lib_SegmentedToVirtual(gDropRecoveryHeartTex);
+ this->actor.hintId = TATL_HINT_ID_RED_CHUCHU;
+ } else {
+ this->actor.hintId = TATL_HINT_ID_BLUE_CHUCHU;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F684.s")
+ // Sets actor scale and initial action func
+ EnSlime_SetupInitializeIdle(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F6CC.s")
+void EnSlime_Destroy(Actor* thisx, PlayState* play) {
+ EnSlime* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F8B4.s")
+ Collider_DestroyCylinder(play, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F8E0.s")
+/**
+ * Upon immobilization via ice arrow (for chuchu types outside of blue),
+ * initialize ice visual effects before chuchu enters immobile state.
+ */
+void EnSlime_Freeze(EnSlime* this) {
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
+ this->drawDmgEffScale = 0.4f;
+ this->collider.base.colType = COLTYPE_HIT3;
+ this->drawDmgEffFrozenSteamScale = 0.6f;
+ this->drawDmgEffAlpha = 1.0f;
+ this->timer = 80;
+ this->actor.flags &= ~ACTOR_FLAG_400;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_XLU, 80);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2F9A0.s")
+/**
+ * If stunned ice effect is active (ie. non-blue chuchu was frozen by ice arrow),
+ * initialize thaw and spawn thawing effect.
+ */
+void EnSlime_Thaw(EnSlime* this, PlayState* play) {
+ if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ this->drawDmgEffType = 0; // So it's not triggered again until Freeze has been called again.
+ this->collider.base.colType = COLTYPE_NONE;
+ this->drawDmgEffAlpha = 0.0f;
+ Actor_SpawnIceEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.2f, 0.2f);
+ this->actor.flags |= ACTOR_FLAG_200;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2FA88.s")
+/**
+ * If blink animation is in progress, advance to next frame.
+ * If eyes are open, randomly (5% chance) initialize new blink cycle.
+ */
+void EnSlime_Blink(EnSlime* this) {
+ if (this->eyeTexIndex != EN_SLIME_EYETEX_OPEN) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex == EN_SLIME_EYETEX_MAX) {
+ this->eyeTexIndex = EN_SLIME_EYETEX_OPEN;
+ }
+ } else if (Rand_ZeroOne() < 0.05f) {
+ this->eyeTexIndex = EN_SLIME_EYETEX_HALF;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2FB60.s")
+/**
+ * Set the actor's initial scale and action function.
+ */
+void EnSlime_SetupInitializeIdle(EnSlime* this) {
+ this->actor.scale.x = 0.008f;
+ this->actor.scale.z = 0.008f;
+ this->actor.scale.y = 0.011f;
+ this->actionFunc = EnSlime_InitializeIdle;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2FBA0.s")
+/**
+ * Once actor touches the ground, it starts its idle behavior.
+ * This function is only called right after the actor is first initialized.
+ * It is not set as the action function again.
+ */
+void EnSlime_InitializeIdle(EnSlime* this, PlayState* play) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->actor.flags &= ~ACTOR_FLAG_10;
+ EnSlime_SetupIdle(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2FD94.s")
+/**
+ * Set or restore idle action state.
+ * Sets timer to 25 and cycles to SitIdle action.
+ */
+void EnSlime_SetupIdle(EnSlime* this) {
+ this->timer = 25;
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnSlime_Idle;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A2FE38.s")
+/**
+ * Sit idle for one frame, updating rotation and scale to give
+ * the actor an amorphous, oozing effect.
+ * Chuchu will engage player if player is visible and
+ * close enough to it.
+ */
+void EnSlime_Idle(EnSlime* this, PlayState* play) {
+ f32 timerFactor;
+ f32 scale;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30018.s")
+ this->timer--;
+ timerFactor = sqrtf(this->timer) * 0.2f;
+ EnSlime_Blink(this);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30344.s")
+ scale = ((Math_SinF(this->timer * (2.0f * M_PI / 5.0f)) * (0.13f * timerFactor)) + 1.0f) * 0.01f;
+ this->actor.scale.x = scale;
+ this->actor.scale.z = scale;
+ if (this->timer < 24) {
+ this->actor.scale.y = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * timerFactor)) + 1.0f) * 0.01f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30454.s")
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * timerFactor;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * timerFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A304B8.s")
+ // If player is not wearing the stone mask, is within 280 units of the chuchu,
+ // and the chuchu is facing the player, initialize chase/attack cycle.
+ if ((Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.xzDistToPlayer < 280.0f) &&
+ Actor_IsFacingPlayer(&this->actor, 0x5000)) {
+ EnSlime_SetupTurnToPlayer(this);
+ } else if (this->timer == 0) {
+ // Start moving (remaining idle)
+ EnSlime_SetupMoveInDirection(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A3072C.s")
+/**
+ * Reset the action timer (to 120), then select a new direction for
+ * chuchu to move.
+ */
+void EnSlime_SetupMoveInDirection(EnSlime* this) {
+ this->timer = 120;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30778.s")
+ // If actor is more than 120 units from its home, set the new direction to be towards its home.
+ // Otherwise, the new direction to move is pretty much random.
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 120.0f) {
+ this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ } else if (Rand_ZeroOne() < 0.7f) {
+ this->idleRotY = (s32)Rand_CenteredFloat(0x4000) + this->actor.shape.rot.y;
+ }
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ this->actionFunc = EnSlime_MoveInDirection;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30820.s")
+/**
+ * While moving idle, update rotation, speed, scale in a sinusoidal fashion to
+ * give oozing effect.
+ * If actor has hit a wall or is too far from home, turn around.
+ * Chuchu will engage player during idle movement if player is visible and
+ * close enough to it.
+ */
+void EnSlime_MoveInDirection(EnSlime* this, PlayState* play) {
+ f32 sinFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30924.s")
+ EnSlime_Blink(this);
+ this->timer--;
+ Math_ApproachS(&this->actor.shape.rot.y, this->idleRotY, 4, 0x100);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30944.s")
+ // If actor is touching a wall, set target rotation to match wall where it is touching.
+ // If actor is more than 120 units from its home, turn around to face home.
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->idleRotY = this->actor.wallYaw;
+ } else if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 120.0f) {
+ this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A309C8.s")
+ // Update actor scale, xz speed, and rotation to provide amorphous effect
+ sinFactor = fabsf(Math_SinF(this->timer * (M_PI / 24)));
+ Math_StepToF(&this->actor.scale.z, ((0.15f * sinFactor) + 1.0f) * 0.01f, 0.0002f);
+ Math_StepToF(&this->actor.scale.x, (1.0f - (0.2f * sinFactor)) * 0.01f, 0.0002f);
+ Math_StepToF(&this->actor.scale.y, (1.0f - (0.1f * sinFactor)) * 0.01f, 0.0002f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30A20.s")
+ this->actor.speed = (0.8f * sinFactor) + 0.2f;
+ this->actor.shape.rot.x = 0x800 * sinFactor;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30A90.s")
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > this->distLimit) {
+ // If actor is too far from home, start return home cycle
+ EnSlime_SetupMoveToHome(this);
+ } else if ((Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.xzDistToPlayer < 280.0f) &&
+ (Actor_IsFacingPlayer(&this->actor, 0x5000))) {
+ // If player is close enough to chuchu while not wearing the stone mask, and the chuchu is facing player,
+ // initialize attack cycle
+ EnSlime_SetupTurnToPlayer(this);
+ } else if (this->timer == 0) {
+ // If move timer runs out, restart idle cycle (sit in place for 25 frames)
+ EnSlime_SetupIdle(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30AE4.s")
+/**
+ * Reset the action timer (to 24), then set the target y angle to face home.
+ */
+void EnSlime_SetupMoveToHome(EnSlime* this) {
+ this->timer = 24;
+ this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ this->actionFunc = EnSlime_MoveToHome;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30BE0.s")
+/**
+ * While moving towards home point, update rotation, speed, scale
+ * in a sinusoidal fashion to give oozing effect.
+ * If actor has hit a wall, turn around.
+ * Once it is close enough to home point, return to idle cycle.
+ * Chuchu will not engage player while the return home cycle is active.
+ */
+void EnSlime_MoveToHome(EnSlime* this, PlayState* play) {
+ f32 timerFactor;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30C2C.s")
+ EnSlime_Blink(this);
+ this->timer--;
+ Math_ApproachS(&this->actor.shape.rot.y, this->idleRotY, 4, 0x400);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ // If hit wall, turn around.
+ this->idleRotY = this->actor.wallYaw;
+ } else {
+ this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30C68.s")
+ timerFactor = fabsf(Math_SinF(this->timer * (M_PI / 24)));
+ Math_StepToF(&this->actor.scale.z, ((0.15f * timerFactor) + 1.0f) * 0.01f, 0.0002f);
+ Math_StepToF(&this->actor.scale.x, (1.0f - (0.2f * timerFactor)) * 0.01f, 0.0002f);
+ Math_StepToF(&this->actor.scale.y, (1.0f - (0.1f * timerFactor)) * 0.01f, 0.0002f);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30CEC.s")
+ this->actor.speed = (0.8f * timerFactor) + 0.2f;
+ this->actor.shape.rot.x = 0x800 * timerFactor;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/func_80A30F98.s")
+ // Reset timer for use calculating wobble/ooze amount for frame
+ if (this->timer == 0) {
+ this->timer = 24;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Update.s")
+ // Only return to idle once actor is close enough to home point.
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) < (this->distLimit * 0.8f)) {
+ EnSlime_SetupIdle(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Slime/EnSlime_Draw.s")
+void EnSlime_SetupTurnToPlayer(EnSlime* this) {
+ this->actor.shape.rot.x = 0;
+ this->actor.shape.rot.z = 0;
+ this->timer = 8;
+ this->actionFunc = EnSlime_TurnToPlayer;
+ this->actor.speed = 0.0f;
+}
+
+/**
+ * Update actor angle and ooze effect as chuchu initially
+ * turns to face player.
+ */
+void EnSlime_TurnToPlayer(EnSlime* this, PlayState* play) {
+ f32 factorY;
+ f32 scaleXZ;
+
+ this->timer--;
+ EnSlime_Blink(this);
+ Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0x1000);
+ if (this->timer >= 0) {
+ factorY = 8 - this->timer;
+ scaleXZ = ((factorY * 0.04f) + 1.0f) * 0.01f;
+ this->actor.scale.x = scaleXZ;
+ this->actor.scale.y = (1.0f - (factorY * 0.05f)) * 0.01f;
+ this->actor.scale.z = scaleXZ;
+ }
+ if (this->timer < -2) {
+ EnSlime_SetupJump(this);
+ }
+}
+
+/**
+ * If fewer than 120 units from the player, start a larger attack lunge.
+ * Otherwise, hop forward.
+ */
+void EnSlime_SetupJump(EnSlime* this) {
+ if (this->actor.xzDistToPlayer > 120.0f) {
+ this->actor.velocity.y = 11.0f;
+ this->actor.speed = 5.0f;
+ this->actor.gravity = -2.0f;
+ } else {
+ this->actor.velocity.y = 18.0f;
+ this->actor.speed = 7.0f;
+ this->actor.gravity = -3.5f;
+ }
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ this->timer = 12;
+ this->eyeTexIndex = EN_SLIME_EYETEX_OPEN;
+ Math_StepToF(&this->actor.scale.x, 0.008f, 0.0025f);
+ Math_StepToF(&this->actor.scale.y, 0.011f, 0.0025f);
+ this->actor.scale.z = this->actor.scale.x;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_JUMP);
+ this->actionFunc = EnSlime_Jump;
+}
+
+/**
+ * Check for collision and whether actor has stopped falling.
+ * Update actor scale for slime effect.
+ * If collision, knockback actor. If actor has stopped moving
+ * in Y direction, initialize landing action.
+ */
+void EnSlime_Jump(EnSlime* this, PlayState* play) {
+ this->timer--;
+ if (this->collider.base.atFlags & AT_HIT) {
+ if (this->actor.speed > 0.0f) {
+ this->actor.speed *= -1.2f;
+ this->collider.base.atFlags &= ~AT_HIT;
+ }
+ }
+ Math_StepToF(&this->actor.scale.x, 0.008f, 0.0025f);
+ Math_StepToF(&this->actor.scale.y, 0.011f, 0.0025f);
+ this->actor.scale.z = this->actor.scale.x;
+ if ((this->actor.velocity.y < 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ EnSlime_SetupLand(this);
+ }
+}
+
+void EnSlime_SetupLand(EnSlime* this) {
+ this->timer = 15;
+ this->actor.scale.x = 0.0132f;
+ this->actor.scale.y = 0.0074399994f;
+ this->actor.scale.z = 0.0132f;
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnSlime_Land;
+}
+
+/**
+ * Update scale/rot for ooze jiggle effect (XZ), update Y scale
+ * to make it appear as though chuchu is compressing.
+ * If > 12 frames have passed since jump start, check again if player
+ * is in range and restart engage/jump cycle if so.
+ * If too far from home, initialize return home cycle
+ * (takes priority over player engage check).
+ * Otherwise if timer is up, return to idle.
+ */
+void EnSlime_Land(EnSlime* this, PlayState* play) {
+ f32 scaleY;
+ f32 rotXZ;
+ f32 scaleXZ;
+
+ EnSlime_Blink(this);
+ this->timer--;
+ scaleY = ((this->timer / 5) + 1) * 1.6f;
+ rotXZ = sqrtf(this->timer) * 0.2f;
+ scaleXZ = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * scaleY)) + 1.0f) * 0.01f;
+ this->actor.scale.x = scaleXZ;
+ this->actor.scale.z = scaleXZ;
+ if (this->timer < 15) {
+ this->actor.scale.y = (1.0f - (Math_SinF(this->timer * (2.0f * M_PI / 5.0f)) * (0.04f * scaleY))) * 0.01f;
+ }
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * rotXZ;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * rotXZ;
+
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > this->distLimit) {
+ EnSlime_SetupMoveToHome(this);
+ } else if ((Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.xzDistToPlayer < 280.0f) &&
+ (this->timer < 12)) {
+ EnSlime_SetupTurnToPlayer(this);
+ } else if (this->timer == 0) {
+ EnSlime_SetupIdle(this);
+ }
+}
+
+/**
+ * Initialize reaction to receiving a blunt hit (such as with Goron Punch etc.)
+ * Chuchu does not take damage, but appears slide backwards.
+ */
+void EnSlime_SetupReactToBluntHit(EnSlime* this) {
+ this->actor.speed = 10.0f;
+ if (this->actor.velocity.y > 0.0f) {
+ this->actor.velocity.y = 0.0f;
+ }
+ this->collider.base.acFlags &= ~AC_ON;
+ this->timer = 30;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_DEFENCE);
+ if (this->collider.base.ac != NULL) {
+ this->actor.world.rot.y = Actor_WorldYawTowardActor(&this->actor, this->collider.base.ac) + 0x8000;
+ } else {
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer + 0x8000;
+ }
+ this->actionFunc = EnSlime_ReactToBluntHit;
+}
+
+/**
+ * Update reaction to receiving a blunt hit (such as with Goron Punch etc.)
+ * Update XZ speed and jiggle effect
+ * AC_ON flag is off until 15 frames of reaction remain.
+ * When timer is up, chuchu will choose whether to engage player, return home,
+ * or return to idle.
+ * If chuchu is too far from home, returning home will take precedence.
+ */
+void EnSlime_ReactToBluntHit(EnSlime* this, PlayState* play) {
+ f32 timerFactor;
+ f32 scale;
+
+ EnSlime_Blink(this);
+ this->timer--;
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
+ timerFactor = sqrtf(this->timer);
+ if (this->timer < 30) {
+ scale = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.08f * timerFactor)) + 1.0f) * 0.01f;
+ this->actor.scale.x = scale;
+ this->actor.scale.z = scale;
+ }
+ if (this->timer == 15) {
+ this->collider.base.acFlags |= AC_ON;
+ }
+ this->actor.scale.y = ((Math_SinF((f32)this->timer * (2.0f * M_PI / 5.0f)) * (0.07f * timerFactor)) + 1.0f) * 0.01f;
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * timerFactor;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * timerFactor;
+
+ if (this->timer == 0) {
+ if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > this->distLimit) {
+ EnSlime_SetupMoveToHome(this);
+ } else if ((this->actor.xzDistToPlayer < 280.0f) && (Player_GetMask(play) != PLAYER_MASK_STONE)) {
+ EnSlime_SetupTurnToPlayer(this);
+ } else {
+ EnSlime_SetupIdle(this);
+ }
+ }
+}
+
+/**
+ * Spawn bubbles & splash, start actor rebuff wobble,
+ * push actor, and play sfx.
+ */
+void EnSlime_SetupDamaged(EnSlime* this, PlayState* play, s32 arg2) {
+ s32 i;
+ Vec3f effectVelocity;
+ Vec3f effectPos;
+ f32 ySin;
+ f32 yCos;
+
+ this->collider.base.acFlags &= ~AC_ON;
+ if (this->actor.velocity.y > 0.0f) {
+ this->actor.velocity.y = 0.0f;
+ }
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_XLU, 20);
+ this->timer = 20;
+ this->actor.speed = 10.0f;
+ if (arg2 == true) {
+ // This function changes actor's world Y rotation?
+ func_800BE504(&this->actor, &this->collider);
+ }
+
+ this->eyeTexIndex = EN_SLIME_EYETEX_OPEN;
+ Actor_SetScale(&this->actor, 0.01f);
+ this->wobbleRot.x = Rand_ZeroOne() * (M_PI * 2.0f);
+ this->wobbleRot.z = Rand_ZeroOne() * (M_PI * 2.0f);
+ ySin = Math_SinS(this->actor.world.rot.y) * 10.0f;
+ yCos = Math_CosS(this->actor.world.rot.y) * 10.0f;
+ effectPos.x = this->actor.world.pos.x + ySin;
+ effectPos.y = this->actor.world.pos.y + 20.0f;
+ effectPos.z = this->actor.world.pos.z + yCos;
+ EffectSsGSplash_Spawn(play, &effectPos, NULL, NULL, 1, 550);
+
+ for (i = 0; i < 10; i++) {
+ effectPos.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x + ySin;
+ effectPos.y = Rand_CenteredFloat(10.0f) + this->actor.world.pos.y + 40.0f;
+ effectPos.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z + yCos;
+
+ effectVelocity.x = ((Rand_ZeroOne() * 3.5f) + 1.0f) * -Math_SinS(this->actor.world.rot.y);
+ effectVelocity.z = ((Rand_ZeroOne() * 3.5f) + 1.0f) * -Math_CosS(this->actor.world.rot.y);
+
+ effectVelocity.y = (Rand_ZeroOne() * 6.0f) + 2.0f;
+ EffectSsDtBubble_SpawnCustomColor(play, &effectPos, &effectVelocity, &sBubbleAccel, &sBubblePrimColor,
+ &sBubbleEnvColor, Rand_S16Offset(40, 20), 20, 0);
+ }
+
+ if (this->actor.colChkInfo.health == 0) {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_DEAD);
+ } else {
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_DAMAGE);
+ }
+ this->actionFunc = EnSlime_Damaged;
+}
+
+/**
+ * Update reaction to taking damage.
+ * Updates the rebuff wobble.
+ * Once timer drops to 0, actor initializes death cycle, re-engages player, or returns to idle.
+ */
+void EnSlime_Damaged(EnSlime* this, PlayState* play) {
+ this->timer--;
+ Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
+ if ((this->timer % 5) == 0) {
+ this->wobbleRot.x = Rand_ZeroOne() * (M_PI * 2.0f);
+ this->wobbleRot.z = Rand_ZeroOne() * (M_PI * 2.0f);
+ }
+ if (this->timer == 0) {
+ if (this->actor.colChkInfo.health != 0) {
+ this->collider.base.acFlags |= AC_ON;
+ if ((this->actor.xzDistToPlayer < 280.0f) && (Player_GetMask(play) != PLAYER_MASK_STONE)) {
+ EnSlime_SetupTurnToPlayer(this);
+ } else {
+ EnSlime_SetupIdle(this);
+ }
+ } else {
+ SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EN_SLIME_BREAK);
+ EnSlime_SetupDead(this);
+ }
+ }
+}
+
+/**
+ * Disable AC_ON flag, make actor stop moving, and shrink the actor.
+ */
+void EnSlime_SetupDead(EnSlime* this) {
+ this->collider.base.acFlags &= ~AC_ON;
+ if (this->actor.velocity.y > 0.0f) {
+ this->actor.velocity.y = 0.0f;
+ }
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actor.speed = 0.0f;
+ this->actionFunc = EnSlime_Dead;
+}
+
+/**
+ * Spawn random effects (bubbles, splash) for death sequence.
+ * If chuchu is red, green, or yellow, spawn item drop.
+ * Shrink actor scale to 0.
+ * Call SetupWaitForRevive function for cleanup.
+ */
+void EnSlime_Dead(EnSlime* this, PlayState* play) {
+ s32 i;
+ Vec3f velocity;
+ Vec3f effectPos;
+ f32 randFloat;
+ s32 randSign;
+
+ if (Math_StepToF(&this->actor.scale.x, 0.0f, 0.002f)) {
+ effectPos.x = this->actor.world.pos.x;
+ effectPos.y = this->actor.world.pos.y + 20.0f;
+ effectPos.z = this->actor.world.pos.z;
+ EffectSsGSplash_Spawn(play, &effectPos, NULL, NULL, 1, 800);
+
+ for (i = 0; i < 15; i++) {
+ randFloat = Rand_ZeroOne();
+ randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
+ velocity.x = randSign * ((randFloat * 2.5f) + 2.0f);
+
+ randFloat = Rand_ZeroOne();
+ randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
+ velocity.z = randSign * ((randFloat * 2.5f) + 2.0f);
+
+ velocity.y = (Rand_ZeroOne() * 6.0f) + 2.0f;
+ EffectSsDtBubble_SpawnCustomColor(play, &effectPos, &velocity, &sBubbleAccel, &sBubblePrimColor,
+ &sBubbleEnvColor, Rand_S16Offset(40, 20), 20, 0);
+ }
+
+ if (this->actor.params == EN_SLIME_TYPE_YELLOW) {
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_ARROWS_10);
+ } else if (this->actor.params == EN_SLIME_TYPE_GREEN) {
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_MAGIC_SMALL);
+ } else if (this->actor.params == EN_SLIME_TYPE_RED) {
+ Item_DropCollectible(play, &this->actor.world.pos, ITEM00_RECOVERY_HEART);
+ }
+ EnSlime_SetupWaitForRevive(this);
+ }
+ this->actor.scale.y = this->actor.scale.x;
+ this->actor.scale.z = this->actor.scale.x;
+}
+
+/**
+ * Calculate a new "current" position value that is a multiple of 60
+ * away from the "home" position.
+ * This is for use by blue chuchus frozen into an ice block so that
+ * their position is a multiple of the ice block size.
+ */
+f32 EnSlime_SnapIceBlockPosition(f32 currentPosition, f32 homePosition) {
+ s32 dist = currentPosition - homePosition;
+
+ if (dist > 0) {
+ dist += 30;
+ } else {
+ dist -= 30;
+ }
+
+ return ((dist / 60) * 60.0f) + homePosition;
+}
+
+/**
+ * Prepare actor for ice block to spawn around it.
+ * The actor will stop moving, have AC_ON cleared,
+ * and target position will be snapped to
+ * a multiple of the size of an ice block.
+ */
+void EnSlime_SetupSpawnIceBlock(EnSlime* this) {
+ this->collider.base.acFlags &= ~AC_ON;
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ this->drawDmgEffAlpha = 0.0f;
+ this->actor.speed = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ this->iceBlockSnapPos.x = EnSlime_SnapIceBlockPosition(this->actor.world.pos.x, this->actor.home.pos.x);
+ this->iceBlockSnapPos.z = EnSlime_SnapIceBlockPosition(this->actor.world.pos.z, this->actor.home.pos.z);
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, COLORFILTER_INTENSITY_FLAG | 255,
+ COLORFILTER_BUFFLAG_XLU, 10);
+ this->eyeTexIndex = EN_SLIME_EYETEX_OPEN;
+ this->iceBlockTimer = ICE_BLOCK_TIMER_MAX;
+ this->actionFunc = EnSlime_SpawnIceBlock;
+}
+
+/**
+ * Attempt to move the chuchu to snapped position and
+ * spawn an ice block actor as a child of the chuchu actor.
+ * If ice block spawn fails, chuchu returns to idle.
+ */
+void EnSlime_SpawnIceBlock(EnSlime* this, PlayState* play) {
+ s32 stepCheck;
+
+ stepCheck = Math_StepToF(&this->actor.world.pos.x, this->iceBlockSnapPos.x, 10.0f);
+ stepCheck &= Math_StepToF(&this->actor.world.pos.z, this->iceBlockSnapPos.z, 10.0f);
+
+ this->actor.colorFilterTimer = 10;
+ if (stepCheck) {
+ this->actor.child =
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_OBJ_ICEBLOCK, this->actor.world.pos.x,
+ this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, 0, 0, 0);
+ if (this->actor.child != NULL) {
+ this->actor.child->csId = this->actor.csId;
+ EnSlime_SetupIceBlock(this);
+ } else {
+ this->actor.colorFilterTimer = 0;
+ this->collider.base.acFlags |= AC_ON;
+ this->iceBlockTimer = ICE_BLOCK_UNUSED;
+ this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.gravity = -2.0f;
+ EnSlime_SetupIdle(this);
+ }
+ }
+}
+
+void EnSlime_SetupIceBlock(EnSlime* this) {
+ this->actor.flags |= ACTOR_FLAG_10;
+ this->actionFunc = EnSlime_IceBlock;
+}
+
+/**
+ * Decrement the ice block timer, or if it has hit zero,
+ * check to see if the ice block child actor link has been broken
+ * or if the block has shrunk sufficiently.
+ * If timer is up and ice block is sufficiently "gone", init thaw.
+ */
+void EnSlime_IceBlock(EnSlime* this, PlayState* play) {
+ if (this->iceBlockTimer == 0) {
+ if ((this->actor.child == NULL) || (this->actor.child->update == NULL) ||
+ !(this->actor.child->scale.y >= 0.1f)) {
+ EnSlime_SetupIceBlockThaw(this);
+ }
+ } else {
+ this->actor.colorFilterTimer = 10;
+ if ((this->iceBlockTimer - 5) < 0) {
+ this->iceBlockTimer = 0;
+ } else {
+ this->iceBlockTimer -= 5;
+ }
+ }
+}
+
+void EnSlime_SetupStun(EnSlime* this) {
+ this->actor.speed = 0.0f;
+ func_800BE504(&this->actor, &this->collider);
+ if (this->actor.velocity.y > 0.0f) {
+ this->actor.velocity.y = 0.0f;
+ }
+ this->actionFunc = EnSlime_Stun;
+}
+
+/**
+ * Check the actor's timer to see whether stun has worn off.
+ * If so, either react to damage and initialize death, or start
+ * idly wobbling in a new direction.
+ */
+void EnSlime_Stun(EnSlime* this, PlayState* play) {
+ this->timer--;
+ if (this->timer == 0) {
+ EnSlime_Thaw(this, play);
+ if (this->actor.colChkInfo.health == 0) {
+ EnSlime_SetupDamaged(this, play, false);
+ } else {
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+ EnSlime_SetupMoveInDirection(this);
+ }
+ }
+}
+
+void EnSlime_SetupIceBlockThaw(EnSlime* this) {
+ this->actor.colorFilterTimer = 0;
+ this->actor.gravity = -2.0f;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_GRAY, COLORFILTER_INTENSITY_FLAG | 255,
+ COLORFILTER_BUFFLAG_XLU, 10);
+ this->actionFunc = EnSlime_IceBlockThaw;
+}
+
+/**
+ * Update the actor's ice block timer to match state of ice block.
+ * When it reaches the "unset" value (255), return actor to idle.
+ */
+void EnSlime_IceBlockThaw(EnSlime* this, PlayState* play) {
+ s32 iceBlockTimerAdj;
+
+ this->actor.colorFilterTimer = 10;
+ if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) {
+ iceBlockTimerAdj = (0.1f - this->actor.child->scale.y) * 10.0f * 255.0f;
+ this->iceBlockTimer = CLAMP(iceBlockTimerAdj, 0, ICE_BLOCK_UNUSED);
+ } else {
+ this->actor.child = NULL;
+ iceBlockTimerAdj = this->iceBlockTimer + 10;
+ this->iceBlockTimer = CLAMP_MAX(iceBlockTimerAdj, ICE_BLOCK_UNUSED);
+ }
+
+ if (this->iceBlockTimer == ICE_BLOCK_UNUSED) {
+ this->collider.base.acFlags |= AC_ON;
+ this->actor.flags |= ACTOR_FLAG_1;
+ this->actor.flags &= ~ACTOR_FLAG_10;
+ EnSlime_SetupIdle(this);
+ }
+}
+
+/**
+ * Set speed to zero, and make undrawable.
+ * Initialize revive timer.
+ */
+void EnSlime_SetupWaitForRevive(EnSlime* this) {
+ this->actor.draw = NULL;
+ this->actor.flags |= ACTOR_FLAG_10;
+ this->drawDmgEffAlpha = 0.0f;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.speed = 0.0f;
+ this->collider.base.ocFlags1 &= ~OC1_ON;
+ this->timer = this->reviveTime;
+ this->actionFunc = EnSlime_WaitForRevive;
+}
+
+/**
+ * Decrement the revival timer, or if it is zero,
+ * initialize revive.
+ */
+void EnSlime_WaitForRevive(EnSlime* this, PlayState* play) {
+ if (this->timer == 0) {
+ EnSlime_SetupRevive(this);
+ } else {
+ this->timer--;
+ }
+}
+
+/**
+ * Re-enable drawing, reset the actor's health and home,
+ * and setup and initialize revive action.
+ */
+void EnSlime_SetupRevive(EnSlime* this) {
+ this->actor.draw = EnSlime_Draw;
+ this->actor.colChkInfo.health = sColChkInfoInit.health;
+ this->iceBlockTimer = ICE_BLOCK_UNUSED;
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
+ this->timer = 0;
+ this->actor.colorFilterTimer = 0;
+ this->actor.home.rot.y = this->actor.yawTowardsPlayer;
+ Actor_PlaySfx(&this->actor, NA_SE_EN_SLIME_SURFACE);
+ this->actor.gravity = -2.0f;
+ this->actionFunc = EnSlime_Revive;
+}
+
+/**
+ * Update bubbling back up effect. After 21 frames, OC1_ON is set.
+ * After 28 frames, AC_ON is set and actor returns to idle movement.
+ */
+void EnSlime_Revive(EnSlime* this, PlayState* play) {
+ f32 rescaleFactor1;
+ f32 rescaleFactor2;
+
+ this->timer++;
+ if (this->timer == 28) {
+ this->actor.flags &= ~ACTOR_FLAG_10;
+ this->actor.flags |= ACTOR_FLAG_1;
+ this->collider.base.acFlags |= AC_ON;
+ this->actor.shape.rot.y = this->actor.home.rot.y;
+ EnSlime_SetupMoveInDirection(this);
+ } else {
+ if (this->timer < 12) {
+ rescaleFactor1 = this->timer * 0.0008333333f; // This is about 1/1200, but (1.0f/1200.0f) does not match
+ this->reviveScale.x = rescaleFactor1;
+ this->reviveScale.z = rescaleFactor1;
+ this->reviveScale.y = 2.0f * rescaleFactor1;
+ this->reviveRotY = this->timer * (0x4000 / 10.0f);
+ } else if (this->timer < 20) {
+ rescaleFactor1 = (this->timer - 12) * (1.0f / 1600.0f);
+ rescaleFactor2 = 0.01f + rescaleFactor1;
+ this->reviveScale.x = rescaleFactor2;
+ this->reviveScale.z = rescaleFactor2;
+ this->reviveScale.y = 2.0f * (0.01f - rescaleFactor1);
+ this->reviveRotY = this->timer * (0x4000 / 10.0f);
+ } else if (this->timer < 24) {
+ rescaleFactor1 = (this->timer - 20) * 0.0033333332f; // This is about 1/300
+ rescaleFactor2 = 0.015f - rescaleFactor1;
+ this->reviveScale.x = rescaleFactor2;
+ this->reviveScale.z = rescaleFactor2;
+ this->reviveScale.y = (2.0f * rescaleFactor1) + 0.01f;
+ Actor_SetScale(&this->actor, 1.5f * rescaleFactor1);
+ this->reviveRotY = ((23 - this->timer) * 7281.778f) + 10922.667f;
+ this->actor.shape.rot.y = (28 - this->timer) * (f32)0x1000;
+ } else {
+ Actor_SetScale(&this->actor, (((28 - this->timer) * 0.1f) + 1.0f) * 0.01f);
+ Math_Vec3f_Copy(&this->reviveScale, &gZeroVec3f);
+ this->actor.shape.rot.y = (28 - this->timer) * (f32)0x1000;
+ }
+
+ if (this->timer == 21) {
+ this->collider.base.ocFlags1 |= OC1_ON;
+ }
+
+ this->reviveRotY += this->actor.home.rot.y;
+ this->actor.shape.rot.y += this->actor.home.rot.y;
+ }
+}
+
+/**
+ * Check actor AC hit since last update. If hit, initialize appropriate action cycle.
+ */
+void EnSlime_UpdateDamage(EnSlime* this, PlayState* play) {
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
+
+ if ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) ||
+ !(this->collider.info.acHitInfo->toucher.dmgFlags & 0xDB0B3)) {
+
+ EnSlime_Thaw(this, play);
+ if ((this->actor.params == EN_SLIME_TYPE_BLUE) &&
+ (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_FREEZE)) {
+ // Blue chuchus take no damage from ice arrows.
+ this->actor.colChkInfo.damage = 0;
+ }
+
+ if (Actor_ApplyDamage(&this->actor) == 0) {
+ Actor_SetDropFlag(&this->actor, &this->collider.info);
+ Enemy_StartFinishingBlow(play, &this->actor);
+ this->actor.flags &= ~ACTOR_FLAG_1;
+ }
+
+ if (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_BLUNT) {
+ EnSlime_SetupReactToBluntHit(this);
+ } else if (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_STUN) {
+ this->timer = 40;
+ Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_XLU, 40);
+ Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ EnSlime_SetupStun(this);
+ } else if (this->actor.colChkInfo.damageEffect != EN_SLIME_DMGEFF_HOOKSHOT) {
+ if (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_FREEZE) {
+ if (this->actor.params == EN_SLIME_TYPE_BLUE) {
+ EnSlime_SetupSpawnIceBlock(this);
+ } else {
+ EnSlime_Freeze(this);
+ if (this->actor.colChkInfo.health == 0) {
+ this->timer = 3;
+ this->collider.base.acFlags &= ~AC_ON;
+ }
+ EnSlime_SetupStun(this);
+ }
+ } else {
+ if (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_LIGHT) {
+ this->drawDmgEffAlpha = 4.0f;
+ this->drawDmgEffScale = 0.4f;
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->collider.info.bumper.hitPos.x,
+ this->collider.info.bumper.hitPos.y, this->collider.info.bumper.hitPos.z, 0, 0, 0,
+ CLEAR_TAG_LARGE_LIGHT_RAYS);
+ } else if (this->actor.colChkInfo.damageEffect == EN_SLIME_DMGEFF_ELECTRIC) {
+ this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE;
+ this->drawDmgEffAlpha = 4.0f;
+ this->drawDmgEffScale = 0.4f;
+ }
+ EnSlime_SetupDamaged(this, play, true);
+ }
+ }
+ }
+ }
+}
+
+void EnSlime_Update(Actor* thisx, PlayState* play) {
+ EnSlime* this = THIS;
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ EnSlime_UpdateDamage(this, play);
+ this->actionFunc(this, play);
+
+ // Note: Does not match if you use this->actor instead of thisx
+ thisx->shape.shadowAlpha = this->iceBlockTimer;
+ if (this->iceBlockTimer == ICE_BLOCK_UNUSED) {
+ if (thisx->scale.y > 0.0001f) {
+ thisx->targetArrowOffset = 60.0f / thisx->scale.y;
+ }
+
+ if (this->collider.base.ocFlags1 & OC1_ON) {
+ Actor_MoveWithGravity(thisx);
+ Actor_UpdateBgCheckInfo(play, thisx, 20.0f, 35.0f, 40.0f, 0x1D);
+ }
+
+ Collider_UpdateCylinder(thisx, &this->collider);
+ this->collider.dim.radius = sCylinderInit.dim.radius * (100.0f * thisx->scale.z);
+ this->collider.dim.height = sCylinderInit.dim.height * (100.0f * thisx->scale.y);
+
+ if (this->actionFunc == EnSlime_Jump) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ if (this->collider.base.acFlags & AC_ON) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ if (player->stateFlags3 & PLAYER_STATE3_100) {
+ this->collider.base.ocFlags1 &= ~OC1_TYPE_PLAYER;
+ } else {
+ this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER;
+ }
+
+ if (this->collider.base.ocFlags1 & OC1_ON) {
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
+ }
+
+ Actor_SetFocus(thisx, 15.0f);
+ if (this->drawDmgEffAlpha > 0.0f) {
+ if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ Math_StepToF(&this->drawDmgEffAlpha, 0.0f, 0.05f);
+ this->drawDmgEffScale = (this->drawDmgEffAlpha + 1.0f) * 0.2f;
+ this->drawDmgEffScale = CLAMP_MAX(this->drawDmgEffScale, 0.4f);
+ } else if (!Math_StepToF(&this->drawDmgEffFrozenSteamScale, 0.4f, 0.01f)) {
+ func_800B9010(thisx, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ }
+ }
+ }
+}
+
+void EnSlime_Draw(Actor* thisx, PlayState* play) {
+ s32 i;
+ EnSlime* this = THIS;
+ Vec3f wobbleScale;
+ Color_RGBA8* primColor;
+ Color_RGBA8* envColor;
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ func_800B8118(&this->actor, play, 0);
+ if (this->iceBlockTimer != ICE_BLOCK_UNUSED) {
+ gSPSegment(POLY_XLU_DISP++, 10, D_801AEFA0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 170, 255, 255, 255, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 150, 255, 255, this->iceBlockTimer);
+ } else {
+ primColor = &sPrimColors[this->actor.params];
+ envColor = &sEnvColors[this->actor.params];
+ AnimatedMat_Draw(play, sSlimeTexAnim);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 100, primColor->r, primColor->g, primColor->b, primColor->a);
+ gDPSetEnvColor(POLY_XLU_DISP++, envColor->r, envColor->g, envColor->b, 255);
+ }
+
+ if (this->actionFunc == EnSlime_Damaged) {
+ wobbleScale.x = 1.0f - (Math_SinF((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
+ wobbleScale.y = (Math_SinF((f32)this->timer * (M_PI / 2.0f)) * 0.3f) + 1.0f;
+ wobbleScale.z = 1.0f - (Math_CosF((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
+
+ Matrix_RotateXFApply(this->wobbleRot.x);
+ Matrix_RotateZF(this->wobbleRot.z, MTXMODE_APPLY);
+ Matrix_Scale(wobbleScale.x, wobbleScale.y, wobbleScale.z, MTXMODE_APPLY);
+ Matrix_RotateZF(-this->wobbleRot.z, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-this->wobbleRot.x);
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gChuchuBodyDL);
+
+ if (this->iceBlockTimer == ICE_BLOCK_UNUSED) {
+ // Ice block is not active
+ Scene_SetRenderModeXlu(play, 0, 1);
+
+ gSPSegment(POLY_OPA_DISP++, 9, (u32)sEyeTextures[this->eyeTexIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 30, 70, 255);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gChuchuEyesDL);
+
+ } else {
+ Scene_SetRenderModeXlu(play, 1, 2);
+ gSPSegment(POLY_XLU_DISP++, 9, (u32)sEyeTextures[this->eyeTexIndex]);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gChuchuEyesDL);
+ }
+
+ for (i = 0; i < EN_SLIME_LIMBPOS_COUNT; i++) {
+ Matrix_MultVec3f(&sLimbPosOffsets[i], &this->limbPos[i]);
+ }
+
+ if (this->actionFunc == EnSlime_Revive) {
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
+ Matrix_RotateYS(this->reviveRotY, MTXMODE_APPLY);
+ Matrix_Scale(this->reviveScale.x, this->reviveScale.y, this->reviveScale.z, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gChuchuPuddleDL);
+ }
+
+ if ((this->actor.params != EN_SLIME_TYPE_BLUE) && (this->actor.scale.x > 0.0f)) {
+ POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
+
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (2000.0f * this->actor.scale.y),
+ this->actor.world.pos.z, MTXMODE_NEW);
+ Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY);
+
+ gSPSegment(POLY_OPA_DISP++, 8, (u32)this->itemDropTex);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gItemDropDL);
+ }
+
+ Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
+ this->drawDmgEffFrozenSteamScale, this->drawDmgEffAlpha, this->drawDmgEffType);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Slime/z_en_slime.h b/src/overlays/actors/ovl_En_Slime/z_en_slime.h
index 0381a592a..130c442de 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.h
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.h
@@ -2,6 +2,13 @@
#define Z_EN_SLIME_H
#include "global.h"
+#include "objects/object_slime/object_slime.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define EN_SLIME_LIMBPOS_COUNT 5
+
+#define EN_SLIME_GET_TYPE(thisx) ((thisx)->params)
+#define EN_SLIME_GET_REVIVE_TIME(thisx) ((((thisx)->params) >> 8) & 0xFF)
struct EnSlime;
@@ -10,7 +17,32 @@ typedef void (*EnSlimeActionFunc)(struct EnSlime*, PlayState*);
typedef struct EnSlime {
/* 0x000 */ Actor actor;
/* 0x144 */ EnSlimeActionFunc actionFunc;
- /* 0x148 */ char unk_148[0xC0];
+ /* 0x148 */ u8 iceBlockTimer;
+ /* 0x149 */ u8 eyeTexIndex;
+ /* 0x14A */ u8 drawDmgEffType;
+ /* 0x14C */ s16 timer;
+ /* 0x14E */ s16 idleRotY;
+ /* 0x150 */ s16 reviveRotY;
+ /* 0x152 */ s16 reviveTime;
+ /* 0x154 */ union {
+ Vec3f iceBlockSnapPos;
+ Vec3f wobbleRot;
+ };
+ /* 0x160 */ TexturePtr itemDropTex;
+ /* 0x164 */ f32 drawDmgEffAlpha;
+ /* 0x168 */ f32 drawDmgEffScale;
+ /* 0x16C */ f32 drawDmgEffFrozenSteamScale;
+ /* 0x170 */ f32 distLimit;
+ /* 0x174 */ Vec3f reviveScale;
+ /* 0x180 */ Vec3f limbPos[EN_SLIME_LIMBPOS_COUNT];
+ /* 0x1BC */ ColliderCylinder collider;
} EnSlime; // size = 0x208
+typedef enum EnSlimeType {
+ /* 0 */ EN_SLIME_TYPE_BLUE,
+ /* 1 */ EN_SLIME_TYPE_GREEN,
+ /* 2 */ EN_SLIME_TYPE_YELLOW,
+ /* 3 */ EN_SLIME_TYPE_RED
+} EnSlimeType;
+
#endif // Z_EN_SLIME_H
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 640bd2a26..e22a5a73b 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -58,7 +58,7 @@ typedef enum {
// Indicates that either this Eeno is shrinking having been absorbed by another Eeno, or that
// this Eeno is a fully-combined large Eeno and is done trying to combine with other split
// Eenos. In both cases, this Eeno cannot be absorbed by any other Eeno.
- /* 3 */ EN_SNOWMAN_COMBINE_STATE_BEING_ABSORBED_OR_DONE,
+ /* 3 */ EN_SNOWMAN_COMBINE_STATE_BEING_ABSORBED_OR_DONE
} EnSnowmanCombineState;
ActorInit En_Snowman_InitVars = {
@@ -119,7 +119,7 @@ typedef enum {
/* 0x2 */ EN_SNOWMAN_DMGEFF_MELT,
/* 0x4 */ EN_SNOWMAN_DMGEFF_LIGHT_ORB = 0x4,
/* 0x5 */ EN_SNOWMAN_DMGEFF_ELECTRIC_STUN,
- /* 0xF */ EN_SNOWMAN_DMGEFF_HOOKSHOT = 0xF, // Damages small Eenos, pulls the player towards large Eenos
+ /* 0xF */ EN_SNOWMAN_DMGEFF_HOOKSHOT = 0xF // Damages small Eenos, pulls the player towards large Eenos
} EnTalkGibudDamageEffect;
static DamageTable sDamageTable = {
@@ -208,7 +208,7 @@ void EnSnowman_Init(Actor* thisx, PlayState* play) {
thisx->world.pos.z, 0, 0, 0, EN_SNOWMAN_TYPE_SPLIT);
thisx->parent = Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_SNOWMAN, thisx->world.pos.x,
thisx->world.pos.y, thisx->world.pos.z, 0, 0, 0,
- EN_SNOWMAN_TYPE_SPLIT, -1, thisx->halfDaysBits, NULL);
+ EN_SNOWMAN_TYPE_SPLIT, CS_ID_NONE, thisx->halfDaysBits, NULL);
if ((thisx->child == NULL) || (thisx->parent == NULL)) {
if (thisx->child != NULL) {
Actor_Kill(thisx->child);
@@ -475,18 +475,18 @@ void EnSnowman_ReadySnowball(EnSnowman* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x1000);
if ((EN_SNOWMAN_GET_TYPE(&this->actor) != EN_SNOWMAN_TYPE_LARGE) && this->isHoldingSnowball &&
((play->gameplayFrames % 2) != 0)) {
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.x;
- pos.y = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.y;
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->snowballPos.x;
+ pos.y = Rand_CenteredFloat(10.0f) + this->snowballPos.y;
+ pos.z = Rand_CenteredFloat(10.0f) + this->snowballPos.z;
func_800B0DE0(play, &pos, &sDustVelocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 500, 30);
} else if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
if ((this->skelAnime.curFrame > 3.0f) && (this->skelAnime.curFrame < 14.0f) &&
((play->gameplayFrames % 2) != 0)) {
- pos.x = (this->actor.world.pos.x + (70.0f * Math_SinS(this->actor.shape.rot.y))) +
- randPlusMinusPoint5Scaled(40.0f);
- pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(20.0f);
- pos.z = (this->actor.world.pos.z + (70.0f * Math_CosS(this->actor.shape.rot.y))) +
- randPlusMinusPoint5Scaled(40.0f);
+ pos.x =
+ (this->actor.world.pos.x + (70.0f * Math_SinS(this->actor.shape.rot.y))) + Rand_CenteredFloat(40.0f);
+ pos.y = this->actor.world.pos.y + Rand_CenteredFloat(20.0f);
+ pos.z =
+ (this->actor.world.pos.z + (70.0f * Math_CosS(this->actor.shape.rot.y))) + Rand_CenteredFloat(40.0f);
func_800B0DE0(play, &pos, &sDustVelocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 1000, 150);
}
}
@@ -619,8 +619,8 @@ void EnSnowman_Melt(EnSnowman* this, PlayState* play) {
this->work.timer--;
if ((this->work.timer >= 38) && (!(this->work.timer & 1))) {
smokeVelocity.y = (this->work.timer - 38) * (1.0f / 12.0f);
- smokeVelocity.x = randPlusMinusPoint5Scaled(1.5f) * smokeVelocity.y;
- smokeVelocity.z = randPlusMinusPoint5Scaled(1.5f) * smokeVelocity.y;
+ smokeVelocity.x = Rand_CenteredFloat(1.5f) * smokeVelocity.y;
+ smokeVelocity.z = Rand_CenteredFloat(1.5f) * smokeVelocity.y;
smokeVelocity.y += 0.8f;
smokePos.x = ((smokeVelocity.x >= 0.0f ? 1.0f : -1.0f) * Rand_ZeroFloat(20.0f) * this->eenoScale) +
this->actor.world.pos.x;
@@ -1037,7 +1037,9 @@ void EnSnowman_Update(Actor* thisx, PlayState* play) {
wallCheckRadius = this->collider.dim.radius;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, wallCheckRadius, 0.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, wallCheckRadius, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if ((this->actor.floorPoly != NULL) && ((this->actor.floorPoly->normal.y * SHT_MINV) < 0.7f)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
if (!this->turningOnSteepSlope) {
@@ -1111,7 +1113,9 @@ void EnSnowman_UpdateSnowball(Actor* thisx, PlayState* play) {
this->actor.shape.rot.x += 0xF00;
Actor_MoveWithGravity(&this->actor);
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider.dim.radius * 0.6f,
- this->collider.dim.height - this->collider.dim.yShift, 0x1F);
+ this->collider.dim.height - this->collider.dim.yShift,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -1178,7 +1182,7 @@ void EnSnowman_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
void EnSnowman_Draw(Actor* thisx, PlayState* play) {
EnSnowman* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
EnSnowman_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos),
@@ -1188,7 +1192,7 @@ void EnSnowman_Draw(Actor* thisx, PlayState* play) {
void EnSnowman_DrawSnowPile(Actor* thisx, PlayState* play) {
EnSnowman* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->snowPileSkelAnime.skeleton, this->snowPileSkelAnime.jointTable,
this->snowPileSkelAnime.dListCount, NULL, NULL, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
index da0c0a30a..55285fec8 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
@@ -12,7 +12,7 @@ typedef enum {
/* 1 */ EN_SNOWMAN_TYPE_LARGE,
/* 2 */ EN_SNOWMAN_TYPE_SPLIT,
/* 3 */ EN_SNOWMAN_TYPE_SMALL_SNOWBALL,
- /* 4 */ EN_SNOWMAN_TYPE_LARGE_SNOWBALL,
+ /* 4 */ EN_SNOWMAN_TYPE_LARGE_SNOWBALL
} EnSnowmanType;
struct EnSnowman;
diff --git a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
index e1ebc505c..3cd33653b 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -176,7 +176,7 @@ void EnSob1_SetupAction(EnSob1* this, EnSob1ActionFunc action) {
s32 EnSob1_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -188,7 +188,7 @@ u16 EnSob1_GetTalkOption(EnSob1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->shopType == BOMB_SHOP) {
- if (gSaveContext.save.day == 1 && gSaveContext.save.time >= CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.day == 1) && (gSaveContext.save.time >= CLOCK_TIME(6, 00))) {
return 0x648;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
return 0x649;
@@ -199,10 +199,13 @@ u16 EnSob1_GetTalkOption(EnSob1* this, PlayState* play) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
return 0x12D8;
+
case PLAYER_FORM_GORON:
return 0x12D9;
+
case PLAYER_FORM_ZORA:
return 0x12DA;
+
default:
return 0x12D7;
}
@@ -405,16 +408,19 @@ void EnSob1_Init(Actor* thisx, PlayState* play) {
case ZORA_SHOP:
this->shopType = ZORA_SHOP;
break;
+
case GORON_SHOP:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
this->shopType = GORON_SHOP_SPRING;
} else {
this->shopType = GORON_SHOP;
}
break;
+
case BOMB_SHOP:
this->shopType = BOMB_SHOP;
break;
+
default:
Actor_Kill(&this->actor);
return;
@@ -456,7 +462,7 @@ void EnSob1_EndInteraction(PlayState* play, EnSob1* this) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED;
}
Actor_ProcessTalkRequest(&this->actor, &play->state);
@@ -546,11 +552,11 @@ void EnSob1_Idle(EnSob1* this, PlayState* play) {
this->headRotTarget = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookFowardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookFowardCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_WAITING;
}
player->stateFlags2 |= PLAYER_STATE2_20000000;
@@ -579,10 +585,10 @@ void EnSob1_UpdateJoystickInputState(PlayState* play, EnSob1* this) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -595,10 +601,10 @@ void EnSob1_UpdateJoystickInputState(PlayState* play, EnSob1* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -623,11 +629,11 @@ void EnSob1_Hello(EnSob1* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play) &&
@@ -646,6 +652,7 @@ s32 EnSob1_FacingShopkeeperDialogResult(EnSob1* this, PlayState* play) {
func_8019F208();
EnSob1_TalkToShopkeeper(play, this);
return true;
+
case 1:
func_8019F230();
if (this->shopType == BOMB_SHOP) {
@@ -664,19 +671,19 @@ void EnSob1_FaceShopkeeper(EnSob1* this, PlayState* play) {
u8 cursorIndex;
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookFowardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookFowardCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_WAITING;
} else {
if (talkState == TEXT_STATE_CHOICE) {
@@ -707,23 +714,23 @@ void EnSob1_TalkingToShopkeeper(EnSob1* this, PlayState* play) {
void EnSob1_LookToShopkeeperFromShelf(EnSob1* this, PlayState* play) {
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
EnSob1_StartShopping(play, this);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -765,11 +772,11 @@ void EnSob1_Walk(EnSob1* this, PlayState* play) {
f32 distSq;
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if (this->path != NULL) {
@@ -794,20 +801,20 @@ void EnSob1_Walking(EnSob1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookFowardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookFowardCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_WAITING;
}
player->stateFlags2 |= PLAYER_STATE2_20000000;
@@ -828,17 +835,17 @@ void EnSob1_ItemPurchased(EnSob1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
player->stateFlags2 |= PLAYER_STATE2_20000000;
EnSob1_SetupAction(this, EnSob1_ContinueShopping);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -850,25 +857,25 @@ void EnSob1_ItemPurchased(EnSob1* this, PlayState* play) {
void EnSob1_LookToShelf(EnSob1* this, PlayState* play) {
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENSOB1_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene) != 0) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENSOB1_CUTSCENESTATE_PLAYING;
EnSob1_UpdateCursorPos(play, this);
EnSob1_SetupAction(this, EnSob1_BrowseShelf);
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -975,7 +982,7 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED;
}
func_8019F208();
@@ -986,6 +993,7 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -1002,38 +1010,49 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoomTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sCannotGetNowTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW_2:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sCannotGetNow2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NO_ROOM_2:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoom2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_ALREADY_HAVE:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x658);
break;
+
case CANBUY_RESULT_HAVE_BETTER:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x659);
break;
+
+ default:
+ break;
}
}
@@ -1047,6 +1066,7 @@ void EnSob1_SelectItem(EnSob1* this, PlayState* play) {
case 0:
EnSob1_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
@@ -1094,11 +1114,11 @@ void EnSob1_SetupItemPurchased(EnSob1* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
EnSob1_SetupAction(this, EnSob1_ItemPurchased);
if (this->cutsceneState == ENSOB1_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
@@ -1179,11 +1199,11 @@ void EnSob1_UpdateItemSelectedProperty(EnSob1* this) {
for (i = 0; i < ARRAY_COUNT(this->items); i++, items++) {
item = *items;
if (item != NULL) {
- if (this->actionFunc != EnSob1_SelectItem && this->actionFunc != EnSob1_CannotBuy &&
- this->drawCursor == 0) {
+ if ((this->actionFunc != EnSob1_SelectItem) && (this->actionFunc != EnSob1_CannotBuy) &&
+ (this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIndex == i ? true : false;
+ item->isSelected = (this->cursorIndex == i) ? true : false;
}
}
}
@@ -1286,13 +1306,13 @@ s16 EnSob1_GetDistSqAndOrient(Path* path, s32 pointIndex, Vec3f* pos, f32* distS
diffZ = 0.0f;
}
*distSq = SQ(diffX) + SQ(diffZ);
- return RADF_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
+ return RAD_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
}
void EnSob1_GetCutscenes(EnSob1* this) {
- this->lookFowardCutscene = this->actor.cutscene;
- this->lookToShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookFowardCutscene);
- this->lookToShopkeeperCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShelfCutscene);
+ this->lookFowardCsId = this->actor.csId;
+ this->lookToShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookFowardCsId);
+ this->lookToShopkeeperCsId = CutsceneManager_GetAdditionalCsId(this->lookToShelfCsId);
}
void EnSob1_WaitForBlink(EnSob1* this) {
@@ -1330,10 +1350,10 @@ void EnSob1_ChangeObject(EnSob1* this, PlayState* play) {
s32 EnSob1_AreObjectsLoaded(EnSob1* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->mainObjIndex)) {
- if (this->unusedObjIndex >= 0 && !Object_IsLoaded(&play->objectCtx, this->unusedObjIndex)) {
+ if ((this->unusedObjIndex >= 0) && !Object_IsLoaded(&play->objectCtx, this->unusedObjIndex)) {
return false;
}
- if (this->shopkeeperAnimObjIndex >= 0 && !Object_IsLoaded(&play->objectCtx, this->shopkeeperAnimObjIndex)) {
+ if ((this->shopkeeperAnimObjIndex >= 0) && !Object_IsLoaded(&play->objectCtx, this->shopkeeperAnimObjIndex)) {
return false;
}
return true;
@@ -1387,7 +1407,7 @@ void EnSob1_InitShop(EnSob1* this, PlayState* play) {
this->cutsceneState = ENSOB1_CUTSCENESTATE_STOPPED;
EnSob1_GetCutscenes(this);
- this->cutscene = this->lookFowardCutscene;
+ this->csId = this->lookFowardCsId;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
sInitFuncs[this->shopType](this, play);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -1396,7 +1416,7 @@ void EnSob1_InitShop(EnSob1* this, PlayState* play) {
this->waypoint = 0;
if (this->shopType == BOMB_SHOP) {
- this->path = SubS_GetPathByIndex(play, ENSOB1_GET_PATH(&this->actor), 0x1F);
+ this->path = SubS_GetPathByIndex(play, ENSOB1_GET_PATH_INDEX(&this->actor), ENSOB1_PATH_INDEX_NONE);
}
if (this->shopType == BOMB_SHOP) {
EnSob1_SetupAction(this, EnSob1_SetupWalk);
@@ -1501,7 +1521,7 @@ void EnSob1_DrawCursor(PlayState* play, EnSob1* this, f32 x, f32 y, f32 z, u8 dr
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1563,7 +1583,7 @@ void EnSob1_DrawStickDirectionPrompt(PlayState* play, EnSob1* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1647,7 +1667,7 @@ void EnSob1_ZoraShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x0C, EnSob1_EndDList(play->state.gfxCtx));
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sZoraShopkeeperEyeTextures[this->eyeTexIndex]));
@@ -1672,7 +1692,7 @@ void EnSob1_GoronShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sGoronShopkeeperEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
@@ -1695,7 +1715,7 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(gBombShopkeeperEyeTex));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSob1_BombShopkeeper_OverrideLimbDraw, EnSob1_BombShopkeeper_PostLimbDraw, &this->actor);
@@ -1707,7 +1727,7 @@ void EnSob1_BombShopkeeper_Draw(Actor* thisx, PlayState* play) {
EnSob1_DrawCursor(play, this, this->cursorPos.x, this->cursorPos.y, this->cursorPos.z, this->drawCursor);
EnSob1_DrawStickDirectionPrompt(play, this);
frames = play->gameplayFrames;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
index eee86c112..12c14301b 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
@@ -15,7 +15,9 @@ typedef void (*EnSob1ActionFunc)(struct EnSob1*, PlayState*);
typedef void (*EnSob1BlinkFunc)(struct EnSob1*);
#define ENSOB1_GET_SHOPTYPE(thisx) ((thisx)->params & 0x1F)
-#define ENSOB1_GET_PATH(thisx) (((thisx)->params & 0x3E0) >> 5)
+#define ENSOB1_GET_PATH_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
+
+#define ENSOB1_PATH_INDEX_NONE 0x1F
typedef struct EnSob1XZRange {
/* 0x0 */ f32 xMin;
@@ -60,10 +62,10 @@ typedef struct EnSob1 {
/* 0x39C */ u8 arrowAnimState;
/* 0x39D */ u8 stickAnimState;
/* 0x39E */ s16 cutsceneState;
- /* 0x3A0 */ s16 cutscene;
- /* 0x3A2 */ s16 lookFowardCutscene;
- /* 0x3A4 */ s16 lookToShelfCutscene;
- /* 0x3A6 */ s16 lookToShopkeeperCutscene;
+ /* 0x3A0 */ s16 csId;
+ /* 0x3A2 */ s16 lookFowardCsId;
+ /* 0x3A4 */ s16 lookToShelfCsId;
+ /* 0x3A6 */ s16 lookToShopkeeperCsId;
/* 0x3A8 */ UNK_TYPE1 pad3A8[0x4];
/* 0x3AC */ f32 shopItemSelectedTween;
/* 0x3B0 */ UNK_TYPE1 pad3B0[0x4];
diff --git a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
index 18031242c..358a8eeec 100644
--- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
+++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c
@@ -419,7 +419,7 @@ void EnSsh_Sway(EnSsh* this) {
}
temp_f20 = (this->swayTimer * (1.0f / 6));
- swayAngle = Math_SinS(this->swayAngle) * (temp_f20 * (0x10000 / 360.0f));
+ swayAngle = (f32)DEG_TO_BINANG_ALT3(temp_f20) * Math_SinS(this->swayAngle);
temp_f20 = this->actor.world.pos.y - this->ceilingPos.y;
swayVecBase.x = Math_SinS(swayAngle) * temp_f20;
@@ -428,7 +428,7 @@ void EnSsh_Sway(EnSsh* this) {
Matrix_Push();
Matrix_Translate(this->ceilingPos.x, this->ceilingPos.y, this->ceilingPos.z, MTXMODE_NEW);
- Matrix_RotateYF(this->actor.world.rot.y * (M_PI / 0x8000), MTXMODE_APPLY);
+ Matrix_RotateYF(BINANG_TO_RAD(this->actor.world.rot.y), MTXMODE_APPLY);
Matrix_MultVec3f(&swayVecBase, &swayVec);
Matrix_Pop();
@@ -708,11 +708,11 @@ void EnSsh_Talk(EnSsh* this, PlayState* play) {
void func_809756D0(EnSsh* this, PlayState* play) {
u16 nextTextId;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
nextTextId = 0x914; // In here, cursed spiders, defeat them to make me normal
} else {
nextTextId = 0x910; // Help me! I am not a monster, I was cursed this way
- SET_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
}
Message_StartTextbox(play, nextTextId, &this->actor);
}
@@ -849,7 +849,7 @@ void EnSsh_Update(Actor* thisx, PlayState* play) {
} else {
SkelAnime_Update(&this->skelAnime);
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
}
@@ -926,7 +926,7 @@ void EnSsh_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(D_80976178[this->blinkState]));
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 987558e3f..f4cc458cb 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -246,7 +246,7 @@ void func_808A54B0(EnSt* this, PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->unk_2C0].segment);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
Matrix_Scale(0.06f, 0.12f, 0.06f, MTXMODE_APPLY);
@@ -546,7 +546,7 @@ void func_808A650C(EnSt* this) {
}
s32 func_808A6580(EnSt* this, PlayState* play) {
- Player* sp3C = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
s32 ret = false;
s32 i;
@@ -666,7 +666,7 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
if ((this->unk_316 == 0) && (this->unk_314 == 0) && (this->unk_312 == 0) &&
!(this->collider1.base.atFlags & AT_BOUNCED) && (this->actor.colChkInfo.health != 0)) {
play->damagePlayer(play, -8);
- Actor_PlaySfx(&sp3C->actor, NA_SE_PL_BODY_HIT);
+ Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
func_800B8D98(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f);
this->unk_316 = 10;
this->unk_18C |= 1;
@@ -878,7 +878,7 @@ void EnSt_Update(Actor* thisx, PlayState* play) {
if (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
SkelAnime_Update(&this->skelAnime);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else if (this->unk_312 < 20) {
s16 idx = (this->unk_312 % 2) ? -1 : 1;
@@ -924,11 +924,11 @@ void func_808A7478(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (func_808A6A3C(this)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSt_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSt_OverrideLimbDraw, NULL, &this->actor, POLY_OPA_DISP);
}
diff --git a/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
index 9048a1d0f..7e3b9ead6 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -70,7 +70,7 @@ typedef enum {
/* 5 */ STH_ANIM_LOOK_AROUND, // checking out Oceanside Spider House
/* 6 */ STH_ANIM_PLEAD, // wants to buy Oceanside Spider House
/* 7 */ STH_ANIM_PANIC, // after buying Oceanside Spider House, can be found at bottom of slide,
- /* 8 */ STH_ANIM_START, // set in init, not an actual index to the array
+ /* 8 */ STH_ANIM_START // set in init, not an actual index to the array
} EnSthAnimation;
static AnimationHeader* sAnimationInfo[] = {
@@ -148,13 +148,13 @@ void EnSth_Init(Actor* thisx, PlayState* play) {
}
this->actor.textId = 0;
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
this->sthFlags |= STH_FLAG_DRAW_MASK_OF_TRUTH;
}
break;
case STH_TYPE_MOON_LOOKING: // South Clock Town
- if ((gSaveContext.save.skullTokenCount & 0xFFFF) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
+ if ((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF) >= SPIDER_HOUSE_TOKENS_REQUIRED) {
Actor_Kill(&this->actor);
return;
}
@@ -479,7 +479,7 @@ void EnSth_GetInitialSwampSpiderHouseText(EnSth* this, PlayState* play) {
nextTextId = 0x90F; // (does not exist)
EnSth_ChangeAnim(this, STH_ANIM_TALK);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN)) {
nextTextId = 0x91B; // As soon as I calm down, getting rid of it
} else {
nextTextId = 0x918; // I've had enough of this, going home
@@ -525,7 +525,7 @@ void EnSth_SwampSpiderHouseGiveMask(EnSth* this, PlayState* play) {
} else {
this->sthFlags &= ~STH_FLAG_DRAW_MASK_OF_TRUTH;
// This flag is used to keep track if the player has already spoken to the actor, triggering secondary dialogue.
- SET_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ SET_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
Actor_OfferGetItem(&this->actor, play, GI_MASK_TRUTH, 10000.0f, 50.0f);
}
}
@@ -566,7 +566,7 @@ void EnSth_HandleSwampSpiderHouseConversation(EnSth* this, PlayState* play) {
case 0x91A: // Someone gave me this mask and said it would make me rich, getting rid of it
SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN);
case 0x902: // (does not exist)
case 0x903: // (does not exist)
@@ -677,7 +677,7 @@ void EnSth_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
@@ -758,7 +758,7 @@ void EnSth_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, sShirtColors[1].r, sShirtColors[1].g, sShirtColors[1].b, 255));
diff --git a/src/overlays/actors/ovl_En_Sth/z_en_sth.h b/src/overlays/actors/ovl_En_Sth/z_en_sth.h
index 1c8c92852..dbc459ce1 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.h
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.h
@@ -16,9 +16,9 @@ typedef enum {
/* 2 */ STH_TYPE_SWAMP_SPIDER_HOUSE_CURED, // cursed is EnSsh
/* 3 */ STH_TYPE_MOON_LOOKING, // South Clock Town, looking up at the moon
/* 4 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_GREET, // looking for shelter
- /* 5 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC, // shelter was not enough
+ /* 5 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC // shelter was not enough
// Other values: Actor will spawn and animate with arm waving, no further interaction.
-} EnSthTypes;
+} EnSthType;
// Note: Vanilla types usually have 0xFEXX typing, but this upper section is unused by the code, reason unknown
#define STH_GET_TYPE(thisx) ((thisx)->params & 0xF)
diff --git a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
index ba6d72cb6..723f7634f 100644
--- a/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
+++ b/src/overlays/actors/ovl_En_Sth2/z_en_sth2.c
@@ -114,7 +114,7 @@ void EnSth2_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, sEnvColors[1].r, sEnvColors[1].g, sEnvColors[1].b, 255));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 90, 110, 130, 255));
diff --git a/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c b/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
index 93e68a83f..3a32031d3 100644
--- a/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
+++ b/src/overlays/actors/ovl_En_Stone_heishi/z_en_stone_heishi.c
@@ -90,7 +90,7 @@ typedef enum {
/* 0 */ EN_STONE_BOTTLE_NONE,
/* 1 */ EN_STONE_BOTTLE_RED_POTION,
/* 2 */ EN_STONE_BOTTLE_EMPTY,
- /* 3 */ EN_STONE_BOTTLE_BLUE_POTION,
+ /* 3 */ EN_STONE_BOTTLE_BLUE_POTION
} EnStoneHeishiBottle;
typedef enum {
@@ -100,8 +100,8 @@ typedef enum {
/* 3 */ EN_STONE_HEISHI_ANIM_WAVE,
/* 4 */ EN_STONE_HEISHI_ANIM_SIT_AND_REACH,
/* 5 */ EN_STONE_HEISHI_ANIM_DRINK_2,
- /* 6 */ EN_STONE_HEISHI_ANIM_STAND_UP,
-} EnStoneHeishiAnimations;
+ /* 6 */ EN_STONE_HEISHI_ANIM_STAND_UP
+} EnStoneHeishiAnimation;
void EnStoneheishi_Init(Actor* thisx, PlayState* play) {
EnStoneheishi* this = THIS;
@@ -230,7 +230,7 @@ void func_80BC9680(EnStoneheishi* this, PlayState* play) {
player->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
}
}
@@ -250,7 +250,7 @@ void func_80BC9680(EnStoneheishi* this, PlayState* play) {
if (this->textIdIndex < 7) {
this->textIdIndex++;
} else {
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
func_80BC94B0(this);
return;
}
@@ -293,7 +293,7 @@ void EnStoneheishi_CheckGivenItem(EnStoneheishi* this, PlayState* play) {
}
} else if (itemAction <= PLAYER_IA_MINUS1) {
Message_CloseTextbox(play);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
func_80BC94B0(this);
}
}
@@ -347,7 +347,7 @@ void EnStoneheishi_DrinkBottleProcess(EnStoneheishi* this, PlayState* play) {
if ((this->timer < 10) && (this->bottleDisplay != EN_STONE_BOTTLE_EMPTY)) {
this->bottleDisplay = EN_STONE_BOTTLE_EMPTY;
Actor_PlaySfx(&this->actor, NA_SE_VO_NP_DRINK);
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
}
} else {
this->drinkBottleState++;
@@ -411,8 +411,8 @@ void func_80BC9E50(EnStoneheishi* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80151BB4(play, 0x35);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
this->action = EN_STONE_ACTION_1;
this->actionFunc = func_80BC9680;
} else {
@@ -433,7 +433,9 @@ void EnStoneheishi_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetScale(&this->actor, 0.01f);
if ((CHECK_WEEKEVENTREG(WEEKEVENTREG_41_40) || (play->actorCtx.lensMaskSize == 100)) &&
@@ -481,7 +483,7 @@ void EnStoneheishi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
Gfx* gfx;
if ((limbIndex == SOLDIER_LIMB_LEFT_HAND) && (this->bottleDisplay != EN_STONE_BOTTLE_NONE)) {
- gfx = func_8012C2B4(*gfxp);
+ gfx = Gfx_SetupDL71(*gfxp);
sLeftHandPos.x = 320.0f;
sLeftHandPos.y = 210.0f;
@@ -518,13 +520,13 @@ void EnStoneheishi_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_41_40)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnStoneheishi_OverrideLimbDraw, EnStoneheishi_PostLimbDraw, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
POLY_OPA_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
diff --git a/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
index edbf581f9..43ddae02a 100644
--- a/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
+++ b/src/overlays/actors/ovl_En_Stop_heishi/z_en_stop_heishi.c
@@ -31,7 +31,7 @@ typedef enum {
/* 5 */ SOLDIER_ANIM_5,
/* 6 */ SOLDIER_ANIM_6,
/* 7 */ SOLDIER_ANIM_STAND_HAND_ON_CHEST,
- /* 8 */ SOLDIER_ANIM_MAX,
+ /* 8 */ SOLDIER_ANIM_MAX
} SoldierAnimation;
ActorInit En_Stop_heishi_InitVars = {
@@ -195,7 +195,7 @@ void EnStopHeishi_UpdateHeadThirdDay(EnStopheishi* this) {
this->headTurnTimer1 = 50;
}
}
- } else if ((this->headTurnTimer1 == 0) && (Quake_NumActiveQuakes() != 0) && (this->headTurnTimer2 >= 6)) {
+ } else if ((this->headTurnTimer1 == 0) && (Quake_GetNumActiveQuakes() != 0) && (this->headTurnTimer2 >= 6)) {
this->headTurnTimer2 = 0;
}
}
@@ -545,7 +545,9 @@ void EnStopheishi_Update(Actor* thisx, PlayState* play) {
Math_SmoothStepToS(&this->headRotZ, this->pitchToPlayer, 1, 0x7D0, 0);
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
Actor_SetScale(&this->actor, 0.01f);
this->actor.uncullZoneForward = 500.0f;
Math_Vec3f_Copy(&this->actor.focus.pos, &this->headWorldPos);
@@ -577,7 +579,7 @@ void EnStopheishi_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
void EnStopheishi_Draw(Actor* thisx, PlayState* play) {
EnStopheishi* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnStopheishi_OverrideLimbDraw, EnStopheishi_PostLimbDraw, &this->actor);
}
diff --git a/src/overlays/actors/ovl_En_Stream/z_en_stream.c b/src/overlays/actors/ovl_En_Stream/z_en_stream.c
index 11e5ce7d6..3bc1f55fd 100644
--- a/src/overlays/actors/ovl_En_Stream/z_en_stream.c
+++ b/src/overlays/actors/ovl_En_Stream/z_en_stream.c
@@ -93,11 +93,11 @@ void EnStream_SuckPlayer(EnStream* this, PlayState* play) {
this->actor.scale.y) != EN_STREAM_PLAYER_OUTSIDE_RANGE) {
xzDist = sqrtf(SQ(posDifference.x) + SQ(posDifference.z));
yDistWithOffset = player->actor.world.pos.y - (this->actor.world.pos.y - 90.0f);
- player->unk_B84 = Math_Atan2S(-posDifference.x, -posDifference.z);
+ player->pushedYaw = Math_Atan2S(-posDifference.x, -posDifference.z);
if (xzDist > 3.0f) {
- Math_SmoothStepToF(&player->unk_B80, 3.0f, 0.5f, xzDist, 0.0f);
+ Math_SmoothStepToF(&player->pushedSpeed, 3.0f, 0.5f, xzDist, 0.0f);
} else {
- player->unk_B80 = 0.0f;
+ player->pushedSpeed = 0.0f;
Math_SmoothStepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 0.5f, 3.0f, 0.0f);
Math_SmoothStepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 0.5f, 3.0f, 0.0f);
}
@@ -136,7 +136,8 @@ void EnStream_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
gSPMatrix(&gfx[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
multipliedFrames = frames * 20;
@@ -145,5 +146,6 @@ void EnStream_Draw(Actor* thisx, PlayState* play) {
-multipliedFrames, 64, 64));
gSPDisplayList(&gfx[2], gWaterVortexDL);
POLY_XLU_DISP = &gfx[3];
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Stream/z_en_stream.h b/src/overlays/actors/ovl_En_Stream/z_en_stream.h
index 88856c3dd..c5aa3c9e2 100644
--- a/src/overlays/actors/ovl_En_Stream/z_en_stream.h
+++ b/src/overlays/actors/ovl_En_Stream/z_en_stream.h
@@ -12,13 +12,13 @@
typedef enum {
/* 0 */ EN_STREAM_SIZE_NORMAL,
- /* 1 */ EN_STREAM_SIZE_SMALL,
+ /* 1 */ EN_STREAM_SIZE_SMALL
} EnStreamSize;
typedef enum {
/* 0 */ EN_STREAM_PLAYER_OUTSIDE_RANGE,
/* 1 */ EN_STREAM_PLAYER_WITHIN_RANGE_INSIDE_VORTEX,
- /* 2 */ EN_STREAM_PLAYER_WITHIN_RANGE_BELOW_VORTEX,
+ /* 2 */ EN_STREAM_PLAYER_WITHIN_RANGE_BELOW_VORTEX
} EnStreamPlayerLocation;
struct EnStream;
diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
index 5bffa0d83..12d8d22a8 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -205,9 +205,9 @@ void EnSuttari_UpdateCollider(EnSuttari* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
if ((this->flags1 & 1) && (this->actionFunc != func_80BADE14)) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 30.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 30.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 30.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 30.0f, 30.0f, UPDBGCHECKINFO_FLAG_4);
}
}
@@ -230,7 +230,7 @@ void EnSuttari_TriggerTransition(PlayState* play, u16 entrance) {
play->transitionTrigger = TRANS_TRIGGER_START;
}
-void EnSuttari_UpdateTime(void) {
+void EnSuttari_AdvanceTime(void) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)((void)0, gSaveContext.save.timeSpeedOffset);
}
@@ -267,6 +267,7 @@ void func_80BAA9B4(EnSuttari* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
break;
+
default:
if ((this->animIndex != 1) && (curFrame == frameCount)) {
this->animIndex = 1;
@@ -281,23 +282,31 @@ void func_80BAAA94(EnSuttari* this) {
this->animIndex = 1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
case 0x29E9:
this->enFsn->flags |= ENFSN_ANGRY;
break;
+
case 0x29EA:
this->enFsn->flags |= ENFSN_CALM_DOWN;
break;
+
case 0x29EB:
this->enFsn->flags |= ENFSN_OFFER_FINAL_PRICE;
break;
+
case 0x29EC:
this->animIndex = 7;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
case 0x29ED:
this->animIndex = 1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
+ default:
+ break;
}
}
@@ -306,60 +315,72 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
switch (this->textId) {
case 0:
this->flags1 |= 0x20;
- this->cutsceneIdx = 0;
+ this->csIdIndex = 0;
this->textId = 0x29E5;
break;
+
case 0x29E5:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 1;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 1;
this->textId = 0x29E6;
break;
+
case 0x29E6:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 0;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 0;
this->textId = 0x29E7;
break;
+
case 0x29E7:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 1;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 1;
this->textId = 0x29E8;
break;
+
case 0x29E8:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 0;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 0;
this->textId = 0x29E9;
break;
+
case 0x29E9:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 1;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 1;
this->textId = 0x29EA;
break;
+
case 0x29EA:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 0;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 0;
this->textId = 0x29EB;
break;
+
case 0x29EB:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 1;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 1;
this->textId = 0x29EC;
break;
+
case 0x29EC:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
- this->cutsceneIdx = 0;
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
+ this->csIdIndex = 0;
this->textId = 0x29ED;
break;
+
case 0x29ED:
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->flags1 |= 0x400;
- this->cutsceneIdx = 1;
+ this->csIdIndex = 1;
this->textId = 0x29EE;
break;
+
+ default:
+ break;
}
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIdx]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
this->actionFunc = func_80BADD0C;
} else if (this->flags1 & 1) {
switch (this->textId) {
@@ -372,9 +393,11 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
this->textId = 0x1450;
}
break;
+
case 0x1450:
this->textId = 0x1451;
break;
+
case 0x1451:
if (this->flags1 & 0x800) {
this->flags1 &= ~0x800;
@@ -385,6 +408,7 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_01);
}
break;
+
case 0x1453:
this->flags1 |= 0x400;
SET_WEEKEVENTREG(WEEKEVENTREG_81_01);
@@ -392,25 +416,34 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
this->flags2 |= 1;
this->textId = 0x1454;
break;
+
case 0x1455:
this->textId = 0x1456;
break;
+
case 0x1456:
this->textId = 0x1457;
break;
+
case 0x1457:
this->textId = 0x1458;
break;
+
case 0x1458:
this->textId = 0x1459;
break;
+
case 0x1459:
this->textId = 0x145A;
break;
+
case 0x145A:
this->flags1 |= 0x400;
this->textId = 0x145B;
break;
+
+ default:
+ break;
}
}
Message_StartTextbox(play, this->textId, &this->actor);
@@ -503,9 +536,9 @@ void func_80BAB374(EnSuttari* this, PlayState* play) {
Vec3f sp38;
if ((curFrame % 3) == 0) {
- sp38.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ sp38.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
sp38.y = this->actor.world.pos.y;
- sp38.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ sp38.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &sp38, 10.0f, 0, 2.0f, 0, 0, 0);
}
}
@@ -516,8 +549,9 @@ void func_80BAB434(EnSuttari* this) {
}
void EnSuttari_GetPaths(EnSuttari* this, PlayState* play) {
- this->paths[0] = SubS_GetPathByIndex(play, ENSUTTARI_GET_PATH(&this->actor), 0x3F);
- this->paths[1] = SubS_GetPathByIndex(play, this->paths[0]->unk1, 0x3F);
+ this->paths[0] = SubS_GetPathByIndex(play, ENSUTTARI_GET_PATH_INDEX(&this->actor), ENSUTTARI_PATH_INDEX_NONE);
+ //! @bug: the additional path shouldn't use `ENSUTTARI_PATH_INDEX_NONE`, but `ADDITIONAL_PATH_INDEX_NONE`
+ this->paths[1] = SubS_GetPathByIndex(play, this->paths[0]->additionalPathIndex, ENSUTTARI_PATH_INDEX_NONE);
}
void func_80BAB4F0(EnSuttari* this, PlayState* play) {
@@ -563,7 +597,7 @@ s16 EnSuttari_GetDistSqAndOrient(Path* path, s32 index, Vec3f* pos, f32* distSq)
}
*distSq = SQ(diffX) + SQ(diffZ);
- return RADF_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
+ return RAD_TO_BINANG(Math_Atan2F_XY(diffZ, diffX));
}
s32 func_80BAB758(EnSuttari* this, Path* path, s32 arg2) {
@@ -589,7 +623,7 @@ s32 func_80BAB758(EnSuttari* this, Path* path, s32 arg2) {
sp54 = sp5C[index + 1].x - sp5C[index - 1].x;
sp48 = sp5C[index + 1].z - sp5C[index - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(sp54, sp48)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(sp54, sp48)), &sp44, &sp40, &sp3C);
if (((sp44 * this->actor.world.pos.x) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -619,7 +653,7 @@ s32 func_80BAB8F4(EnSuttari* this, Path* path, s32 arg2) {
sp54 = sp5C[index - 1].x - sp5C[index + 1].x;
sp48 = sp5C[index - 1].z - sp5C[index + 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(sp54, sp48)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(sp54, sp48)), &sp44, &sp40, &sp3C);
if (((sp44 * this->actor.world.pos.x) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -679,16 +713,16 @@ void func_80BABB90(EnSuttari* this, s32 arg1) {
s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp26 = SCHEDULE_TIME_NOW;
u16 phi_a0;
- u8 sp23 = ENSUTTARI_GET_PATH(&this->actor);
+ u8 pathIndex = ENSUTTARI_GET_PATH_INDEX(&this->actor);
u16 tmp;
if (D_80BAE8F8[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp23, D_80BAE8F8[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BAE8F8[scheduleOutput->result]);
}
if (this->timePath == NULL) {
return 0;
}
- if ((this->unk428 != 0 && this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) {
+ if ((this->unk428 != 0) && (this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) {
phi_a0 = sp26;
} else {
phi_a0 = scheduleOutput->time0;
@@ -710,37 +744,37 @@ s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad;
EnDoor* sp48;
- u8 sp47 = ENSUTTARI_GET_PATH(&this->actor);
+ u8 pathIndex = ENSUTTARI_GET_PATH_INDEX(&this->actor);
u16 sp44 = SCHEDULE_TIME_NOW;
Vec3f sp38;
Vec3f sp2C;
Vec3s* sp28;
s32 sp24;
- if (this->unk428 == 10 || this->unk428 == 11 || this->unk428 == 2) {
- return 0;
+ if ((this->unk428 == 10) || (this->unk428 == 11) || (this->unk428 == 2)) {
+ return false;
}
sp48 = (EnDoor*)SubS_FindNearestActor(&this->actor, play, ACTORCAT_DOOR, ACTOR_EN_DOOR);
sp24 = D_80BAE8F8[scheduleOutput->result];
if ((sp48 != NULL) && (sp24 >= 0)) {
- this->timePath = SubS_GetAdditionalPath(play, sp47, sp24);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, sp24);
}
if ((sp48 == NULL) || (this->timePath == NULL)) {
- return 0;
+ return false;
}
sp28 = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp38, &sp28[0]);
Math_Vec3s_ToVec3f(&sp2C, &sp28[1]);
this->unk434 = sp44 - scheduleOutput->time0;
this->unk436 = scheduleOutput->time1 - scheduleOutput->time0;
- if (scheduleOutput->result != 10 && scheduleOutput->result != 11) {
+ if ((scheduleOutput->result != 10) && (scheduleOutput->result != 11)) {
sp48->unk_1A7 = 0x4B;
}
Math_Vec3f_Copy(&this->unk438, &sp38);
Math_Vec3f_Copy(&this->unk444, &sp2C);
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp38, &sp2C);
this->actor.world.pos = sp38;
- return 1;
+ return true;
}
s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
@@ -753,6 +787,7 @@ s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
case 12:
ret = func_80BABC48(this, play, scheduleOutput);
break;
+
case 11:
case 10:
case 9:
@@ -761,15 +796,17 @@ s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
case 6:
ret = func_80BABDD8(this, play, scheduleOutput);
break;
+
case 5:
case 4:
case 3:
case 2:
case 1:
- ret = 1;
+ ret = true;
break;
+
default:
- ret = 0;
+ ret = false;
break;
}
return ret;
@@ -853,14 +890,15 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->flags1 |= 0x80;
func_80BABFD4(this, play);
break;
+
case 15:
if ((this->animIndex == 1) && (curFrame == frameCount)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_83_04) && !(this->flags1 & 0x1000)) {
- if (ActorCutscene_GetCanPlayNext(this->cutscenes[0])) {
- ActorCutscene_Start(this->cutscenes[0], &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[0])) {
+ CutsceneManager_Start(this->csIdList[0], &this->actor);
if (!(player->stateFlags1 & PLAYER_STATE1_10000000)) {
this->flags2 |= 0x10;
player->stateFlags1 |= PLAYER_STATE1_10000000;
@@ -868,20 +906,23 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->flags1 |= 0x1000;
this->flags2 |= 2;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscenes[0]);
+ CutsceneManager_Queue(this->csIdList[0]);
}
}
func_80BABFD4(this, play);
break;
+
case 6:
case 8:
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 10:
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 9:
case 11:
this->flags1 |= 0x80;
@@ -893,19 +934,23 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
}
func_80BAC220(this, play);
break;
+
case 7:
this->flags1 |= 0x20;
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 14:
this->flags1 |= 0x20;
this->flags1 |= 0x80;
func_80BABFD4(this, play);
break;
+
case 1:
Actor_Kill(&this->actor);
break;
+
case 2:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_81_04)) {
this->flags1 |= 0x80;
@@ -916,9 +961,10 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BADA08;
}
break;
+
case 4:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
- if (this->animIndex == 2 || this->animIndex == 1) {
+ if ((this->animIndex == 2) || (this->animIndex == 1)) {
this->animIndex = 5;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
@@ -935,6 +981,9 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BAD2B4;
}
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 4, 0x1554);
}
@@ -947,7 +996,7 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
if (play->sceneId == SCENE_IKANA) {
this->flags1 |= 1;
- if (gSaveContext.save.day == 1 || gSaveContext.save.day == 2) {
+ if ((gSaveContext.save.day == 1) || (gSaveContext.save.day == 2)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->flags1 |= 0x80;
@@ -962,15 +1011,15 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
return;
}
} else if (play->sceneId == SCENE_BACKTOWN) {
- if (gSaveContext.save.time >= CLOCK_TIME(0, 20) && gSaveContext.save.time < CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.time >= CLOCK_TIME(0, 20)) && (gSaveContext.save.time < CLOCK_TIME(6, 00))) {
Actor_Kill(&this->actor);
}
if ((gSaveContext.save.entrance == ENTRANCE(NORTH_CLOCK_TOWN, 7)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_58_40)) {
Actor_Kill(&this->actor);
}
- this->cutscenes[0] = this->actor.cutscene;
- this->cutscenes[1] = ActorCutscene_GetAdditionalCutscene(this->cutscenes[0]);
+ this->csIdList[0] = this->actor.csId;
+ this->csIdList[1] = CutsceneManager_GetAdditionalCsId(this->csIdList[0]);
this->flags1 |= 0x80;
this->flags1 |= 8;
this->animIndex = 1;
@@ -994,8 +1043,8 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
}
this->animIndex = 0;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
- this->cutscenes[0] = this->actor.cutscene;
- this->cutscenes[1] = ActorCutscene_GetAdditionalCutscene(this->cutscenes[0]);
+ this->csIdList[0] = this->actor.csId;
+ this->csIdList[1] = CutsceneManager_GetAdditionalCsId(this->csIdList[0]);
this->flags1 |= 4;
this->actionFunc = func_80BAD7F8;
return;
@@ -1011,14 +1060,14 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
void func_80BACA14(EnSuttari* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->animIndex == 1 || this->animIndex == 8) {
+ if ((this->animIndex == 1) || (this->animIndex == 8)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
func_80BABA90(this, 0, 0);
func_80BAB434(this);
- if (player->transformation == PLAYER_FORM_GORON || player->transformation == PLAYER_FORM_ZORA) {
- if (this->actor.playerHeightRel < 60.0f && this->actor.xzDistToPlayer < 500.0f) {
+ if ((player->transformation == PLAYER_FORM_GORON) || (player->transformation == PLAYER_FORM_ZORA)) {
+ if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
this->unk3F2 = this->headRot.y;
this->actionFunc = func_80BACBB0;
}
@@ -1041,7 +1090,7 @@ void func_80BACBB0(EnSuttari* this, PlayState* play) {
s16 target;
this->unk3F2 = this->headRot.y;
- if (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU) {
+ if ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU)) {
this->actionFunc = func_80BACA14;
}
if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
@@ -1071,7 +1120,7 @@ void func_80BACD2C(EnSuttari* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->unk3F2 = this->headRot.y;
- if (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU) {
+ if ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU)) {
this->actionFunc = func_80BACA14;
}
if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
@@ -1168,26 +1217,26 @@ void func_80BAD130(EnSuttari* this, PlayState* play) {
}
void func_80BAD230(EnSuttari* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscenes[1])) {
- ActorCutscene_Start(this->cutscenes[1], &this->actor);
+ if (CutsceneManager_IsNext(this->csIdList[1])) {
+ CutsceneManager_Start(this->csIdList[1], &this->actor);
this->textId = 0x2A31;
Message_StartTextbox(play, this->textId, &this->actor);
this->flags1 |= 0x4000;
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_CHASE | SEQ_FLAG_ASYNC);
this->actionFunc = func_80BAD380;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscenes[1]);
+ CutsceneManager_Queue(this->csIdList[1]);
}
}
void func_80BAD2B4(EnSuttari* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->textId == 0x2A30) {
- ActorCutscene_Stop(this->cutscenes[0]);
- ActorCutscene_SetIntentToPlay(this->cutscenes[1]);
+ CutsceneManager_Stop(this->csIdList[0]);
+ CutsceneManager_Queue(this->csIdList[1]);
this->actionFunc = func_80BAD230;
} else {
- ActorCutscene_Stop(this->cutscenes[1]);
+ CutsceneManager_Stop(this->csIdList[1]);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->flags1 |= 0x40;
@@ -1211,7 +1260,7 @@ void func_80BAD380(EnSuttari* this, PlayState* play) {
this->flags2 &= ~0x10;
player->stateFlags1 &= ~PLAYER_STATE1_10000000;
this->flags1 &= ~0x4000;
- ActorCutscene_Stop(this->cutscenes[1]);
+ CutsceneManager_Stop(this->csIdList[1]);
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->flags1 |= 0x40;
@@ -1265,7 +1314,7 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
- if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
+ if ((this->unk430 == 1) && (this->timePath->additionalPathIndex == ADDITIONAL_PATH_INDEX_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -1303,7 +1352,7 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
- if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
+ if ((this->unk430 == 1) && (this->timePath->additionalPathIndex == ADDITIONAL_PATH_INDEX_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -1346,7 +1395,7 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) {
if (Message_ShouldAdvance(play)) {
if (this->flags1 & 0x400) {
if (this->textId == 0x29EE) {
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIdx]);
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
this->flags1 &= ~0x400;
if (this->flags2 & 1) {
@@ -1372,10 +1421,14 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) {
this->flags1 |= 0x800;
func_80BAAB78(this, play);
break;
+
case 1:
func_8019F230();
func_80BAAB78(this, play);
break;
+
+ default:
+ break;
}
}
if (!(this->flags1 & 4)) {
@@ -1385,16 +1438,16 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) {
}
void func_80BADD0C(EnSuttari* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscenes[this->cutsceneIdx])) {
- if (this->cutsceneIdx == 0) {
- ActorCutscene_Start(this->cutscenes[this->cutsceneIdx], &this->enFsn->actor);
+ if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ if (this->csIdIndex == 0) {
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->enFsn->actor);
} else {
- ActorCutscene_Start(this->cutscenes[this->cutsceneIdx], &this->actor);
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->actor);
}
func_80BAAA94(this);
this->actionFunc = func_80BADA9C;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIdx]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
@@ -1483,14 +1536,14 @@ void EnSuttari_Update(Actor* thisx, PlayState* play) {
func_80BAB4F0(this, play);
}
if (this->flags2 & 2) {
- EnSuttari_UpdateTime();
+ EnSuttari_AdvanceTime();
}
if (this->unk428 != 0) {
- if (this->animIndex == 2 || this->animIndex == 6) {
+ if ((this->animIndex == 2) || (this->animIndex == 6)) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 16.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
- } else if (this->animIndex == 0 || this->animIndex == 5) {
+ } else if ((this->animIndex == 0) || (this->animIndex == 5)) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 17.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
@@ -1514,7 +1567,7 @@ s32 EnSuttari_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
Matrix_RotateXS(-this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->torsoRot.x, MTXMODE_APPLY);
}
- if (limbIndex == 8 || limbIndex == 9 || limbIndex == 0xC) {
+ if ((limbIndex == 8) || (limbIndex == 9) || (limbIndex == 0xC)) {
rot->y += (s16)(Math_SinS(this->unk2FA[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->unk31A[limbIndex]) * 200.0f);
}
@@ -1543,9 +1596,12 @@ void EnSuttari_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MtxFToYXZRot(curState, &bombBag->shape.rot, false);
}
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gBombShopBagDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1568,7 +1624,7 @@ void EnSuttari_Draw(Actor* thisx, PlayState* play) {
if (this->flags1 & 0x80) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 255, 255, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(play->state.gfxCtx, 55, 55, 255, 0));
gDPPipeSync(POLY_OPA_DISP++);
@@ -1576,7 +1632,7 @@ void EnSuttari_Draw(Actor* thisx, PlayState* play) {
this->skelAnime.dListCount, EnSuttari_OverrideLimbDraw, EnSuttari_PostLimbDraw,
EnSuttari_TransformLimbDraw, &this->actor);
if (this->flags1 & 0x80) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
pos = this->actor.world.pos;
scale.x = 0.2f;
scale.y = 0.2f;
diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
index 669cf549e..8da01b67e 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
@@ -8,7 +8,9 @@ struct EnSuttari;
typedef void (*EnSuttariActionFunc)(struct EnSuttari*, PlayState*);
-#define ENSUTTARI_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENSUTTARI_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENSUTTARI_PATH_INDEX_NONE 0x3F
typedef struct EnSuttari {
/* 0x000 */ Actor actor;
@@ -56,8 +58,8 @@ typedef struct EnSuttari {
/* 0x444 */ Vec3f unk444;
/* 0x450 */ s32 animIndex;
/* 0x454 */ UNK_TYPE1 unk_454[0x2];
- /* 0x456 */ s16 cutscenes[2];
- /* 0x45A */ s16 cutsceneIdx;
+ /* 0x456 */ s16 csIdList[2];
+ /* 0x45A */ s16 csIdIndex;
} EnSuttari; // size = 0x45C
#endif // Z_EN_SUTTARI_H
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 e76bc85a5..4937125dc 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -304,7 +304,7 @@ s32 func_808D91C4(EnSw* this, CollisionPoly* arg1) {
return false;
}
- sp4C = func_80086C48(temp_f12);
+ sp4C = Math_FAcosF(temp_f12);
if (sp4C < 0.001f) {
return false;
}
@@ -352,7 +352,7 @@ s32 func_808D9440(PlayState* play, Vec3f* posA, Vec3f* posB, Vec3f* posResult, C
s32 ret = false;
if (BgCheck_EntityLineTest1(&play->colCtx, posA, posB, posResult, outPoly, true, true, true, true, bgId) &&
- !(func_800C9A4C(&play->colCtx, *outPoly, *bgId) & 0x30)) {
+ !(SurfaceType_GetWallFlags(&play->colCtx, *outPoly, *bgId) & (WALL_FLAG_4 | WALL_FLAG_5))) {
ret = true;
}
return ret;
@@ -504,8 +504,8 @@ s32 func_808D99C8(EnSw* this, PlayState* play) {
return false;
}
- if ((this->actor.xyzDistToPlayerSq < ((sREG(16) * 10) + 60000)) && (play->actorCtx.unk_1F4.timer != 0) &&
- (play->actorCtx.unk_1F4.unk_00 == 0)) {
+ if ((this->actor.xyzDistToPlayerSq < ((sREG(16) * 10) + 60000)) && (play->actorCtx.playerImpact.timer != 0) &&
+ (play->actorCtx.playerImpact.type == PLAYER_IMPACT_GORON_GROUND_POUND)) {
this->actor.colChkInfo.damage = 4;
phi_v1 = true;
}
@@ -896,18 +896,18 @@ void func_808DA89C(EnSw* this, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
}
void func_808DAA60(EnSw* this, PlayState* play) {
- Vec3s* sp44;
+ Vec3s* points;
s16 temp_v0;
s16 sp40;
Vec3f sp34;
f32 temp_f16;
- sp44 = Lib_SegmentedToVirtual(this->unk_1E4->points);
+ points = Lib_SegmentedToVirtual(this->path->points);
sp40 = 0;
if (DECR(this->unk_454) == 0) {
@@ -915,13 +915,13 @@ void func_808DAA60(EnSw* this, PlayState* play) {
temp_f16 = this->skelAnime.endFrame - this->skelAnime.curFrame;
sp40 = 80.0f * temp_f16;
if (this->unk_45E == 0) {
- Math_Vec3s_ToVec3f(&sp34, &sp44[this->unk_4A0]);
+ Math_Vec3s_ToVec3f(&sp34, &points[this->unk_4A0]);
func_808D9894(this, &sp34);
temp_v0 = Math_Atan2S_XY(sp34.z, sp34.x);
if (ABS_ALT(temp_v0) < sp40) {
this->skelAnime.curFrame = 0.0f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
- Math_Vec3s_ToVec3f(&this->unk_374, &sp44[this->unk_4A0]);
+ Math_Vec3s_ToVec3f(&this->unk_374, &points[this->unk_4A0]);
this->actionFunc = func_808DACF4;
this->unk_414 = 0.0f;
sp40 = ABS_ALT(temp_v0);
@@ -981,7 +981,7 @@ void func_808DACF4(EnSw* this, PlayState* play) {
if (((s32)this->unk_414 != 0) && ((s32)this->unk_414 < (s32)sp4C)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_374);
this->unk_4A0 += this->unk_49C;
- if ((this->unk_4A0 >= this->unk_1E4->count) || (this->unk_4A0 < 0)) {
+ if ((this->unk_4A0 >= this->path->count) || (this->unk_4A0 < 0)) {
this->unk_49C = -this->unk_49C;
this->unk_4A0 += this->unk_49C * 2;
}
@@ -1090,14 +1090,14 @@ void func_808DB100(EnSw* this, PlayState* play) {
}
void func_808DB25C(EnSw* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
func_808D9C18(this);
this->actionFunc = func_808DB2E0;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -1130,7 +1130,7 @@ void func_808DB2E0(EnSw* this, PlayState* play) {
Actor_SetScale(&this->actor, this->actor.scale.x);
this->actor.velocity.y += this->actor.gravity;
Actor_UpdatePos(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void EnSw_Init(Actor* thisx, PlayState* play) {
@@ -1154,8 +1154,9 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
this->collider.info.toucher.damage = 16;
}
- this->unk_1E4 = SubS_GetDayDependentPath(play, ENSW_GET_FF00(&this->actor), 255, &this->unk_4A0);
- if (this->unk_1E4 != NULL) {
+ this->path =
+ SubS_GetDayDependentPath(play, ENSW_GET_PATH_INDEX(&this->actor), ENSW_PATH_INDEX_NONE, &this->unk_4A0);
+ if (this->path != NULL) {
this->unk_4A0 = 1;
}
@@ -1201,7 +1202,7 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
}
func_808D9F78(this, play, 1);
- if (this->unk_1E4 != NULL) {
+ if (this->path != NULL) {
this->unk_49C = 1;
func_808D9F08(this);
this->actionFunc = func_808DAA60;
@@ -1296,7 +1297,7 @@ void EnSw_Draw(Actor* thisx, PlayState* play) {
if (ENSW_GET_3(&this->actor)) {
func_800B8050(&this->actor, play, MTXMODE_NEW);
}
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_RotateXS(-0x3C72, MTXMODE_APPLY);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSw_OverrideLimbDraw, NULL,
&this->actor);
diff --git a/src/overlays/actors/ovl_En_Sw/z_en_sw.h b/src/overlays/actors/ovl_En_Sw/z_en_sw.h
index 4544346a0..f77d12267 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.h
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.h
@@ -11,14 +11,16 @@ typedef void (*EnSwActionFunc)(struct EnSw*, PlayState*);
#define ENSW_GET_3(thisx) (ENSW_GETS_3((thisx)->params))
#define ENSW_GETS_3FC(params) (((params & 0x3FC) >> 2) & 0xFF)
#define ENSW_GET_3FC(thisx) (ENSW_GETS_3FC((thisx)->params))
-#define ENSW_GET_FF00(thisx) ((((thisx)->params & 0xFF00) >> 8) & 0xFF)
+#define ENSW_GET_PATH_INDEX(thisx) ((((thisx)->params & 0xFF00) >> 8) & 0xFF)
+
+#define ENSW_PATH_INDEX_NONE 0xFF
typedef struct EnSw {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSwActionFunc actionFunc;
/* 0x18C */ ColliderSphere collider;
- /* 0x1E4 */ Path* unk_1E4;
+ /* 0x1E4 */ Path* path;
/* 0x1E8 */ Vec3s jointTable[30];
/* 0x29C */ Vec3s morphTable[30];
/* 0x350 */ Vec3f unk_350;
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 abc773637..af419ba23 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
@@ -79,12 +79,12 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
s32 i;
path = syatekiMan->path;
- while (path->unk2 != 0) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != SG_PATH_TYPE_CROW) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_CROW_GET_INDEX(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
Actor_ProcessInitChain(&this->actor, sInitChain);
@@ -292,9 +292,9 @@ s32 EnSyatekiCrow_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
EnSyatekiCrow* this = THIS;
if (limbIndex == OBJECT_CROW_LIMB_UPPER_TAIL) {
- rot->y += (s16)(0xC00 * sin_rad(this->skelAnime.curFrame * (M_PI / 4)));
+ rot->y += (s16)(0xC00 * Math_SinF(this->skelAnime.curFrame * (M_PI / 4)));
} else if (limbIndex == OBJECT_CROW_LIMB_TAIL) {
- rot->y += (s16)(0x1400 * sin_rad((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
+ rot->y += (s16)(0x1400 * Math_SinF((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
}
return false;
@@ -320,7 +320,7 @@ void EnSyatekiCrow_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
void EnSyatekiCrow_Draw(Actor* thisx, PlayState* play) {
EnSyatekiCrow* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSyatekiCrow_OverrideLimbDraw, EnSyatekiCrow_PostLimbDraw, &this->actor);
}
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 20abd71e4..ee9c63536 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
@@ -36,7 +36,7 @@ void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play);
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL,
- /* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP,
+ /* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP
} EnSyatekiDekunutsHeaddressType;
ActorInit En_Syateki_Dekunuts_InitVars = {
@@ -80,7 +80,7 @@ typedef enum {
/* 3 */ EN_SYATEKI_DEKUNUTS_ANIM_LOOK_AROUND,
/* 4 */ EN_SYATEKI_DEKUNUTS_ANIM_DAMAGE,
/* 5 */ EN_SYATEKI_DEKUNUTS_ANIM_DIE,
- /* 6 */ EN_SYATEKI_DEKUNUTS_ANIM_UNBURROW, // unused
+ /* 6 */ EN_SYATEKI_DEKUNUTS_ANIM_UNBURROW // unused
} EnSyatekiDekunutsAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -103,7 +103,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers.
EnSyatekiDekunuts* this = THIS;
PlayState* play = play2;
- s32 unkPathComparison;
+ s32 pathType;
Path* path;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
s32 i;
@@ -115,18 +115,18 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
Actor_SetScale(&this->actor, 0.01f);
this->collider.dim = sBonusDekuScrubColliderDimensions[0];
- unkPathComparison = 3;
+ pathType = SG_PATH_TYPE_SCRUB_BONUS;
} else {
Actor_SetScale(&this->actor, 0.02f);
- unkPathComparison = 1;
+ pathType = SG_PATH_TYPE_SCRUB_NORMAL;
}
- while (path->unk2 != unkPathComparison) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != pathType) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (sDrawFlowers == true) {
@@ -476,7 +476,7 @@ void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(flowerPos.x, flowerPos.y, flowerPos.z, MTXMODE_NEW);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
index 2ceb0b32d..ce3e9ba90 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
@@ -11,7 +11,7 @@
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_TYPE_NORMAL, // Worth 30 points
- /* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS, // Worth 100 points
+ /* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS // Worth 100 points
} EnSyatekiDekunutsType;
struct EnSyatekiDekunuts;
diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
index b0c052b5c..f5910a06d 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c
@@ -74,7 +74,7 @@ ActorInit En_Syateki_Man_InitVars = {
typedef enum {
/* 0 */ EN_SYATEKI_MAN_ANIM_HANDS_ON_TABLE,
/* 1 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_LOOP,
- /* 2 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_END,
+ /* 2 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_END
} EnSyatekiManAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -183,7 +183,7 @@ void EnSyatekiMan_Swamp_SpawnTargetActors(EnSyatekiMan* this, PlayState* play2,
void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
EnSyatekiMan* this = THIS;
s32 pad;
- Path* path = &play->setupPathList[EN_SYATEKI_MAN_GET_PATH(&this->actor)];
+ Path* path = &play->setupPathList[EN_SYATEKI_MAN_GET_PATH_INDEX(&this->actor)];
s32 actorListLength = sSwampTargetActorListLengths[this->swampTargetActorListIndex];
this->actor.targetMode = 1;
@@ -327,7 +327,7 @@ void EnSyatekiMan_Swamp_HandleChoice(EnSyatekiMan* this, PlayState* play) {
// You don't have a bow!
Message_StartTextbox(play, 0xA30, &this->actor);
this->prevTextId = 0xA30;
- } else if (gSaveContext.save.playerData.rupees < 20) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < 20) {
play_sound(NA_SE_SY_ERROR);
// You don't have enough rupees!
@@ -627,7 +627,7 @@ void EnSyatekiMan_Town_HandleChoice(EnSyatekiMan* this, PlayState* play) {
Message_StartTextbox(play, 0x3FA, &this->actor);
this->prevTextId = 0x3FA;
}
- } else if (gSaveContext.save.playerData.rupees < 20) {
+ } else if (gSaveContext.save.saveInfo.playerData.rupees < 20) {
play_sound(NA_SE_SY_ERROR);
if (CURRENT_DAY != 3) {
// You don't have a enough rupees!
@@ -1502,7 +1502,7 @@ void EnSyatekiMan_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
index 0b637fecf..468cb981c 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
@@ -8,7 +8,7 @@ struct EnSyatekiMan;
typedef void (*EnSyatekiManActionFunc)(struct EnSyatekiMan*, PlayState*);
-#define EN_SYATEKI_MAN_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_MAN_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef enum {
/* 0 */ SG_GAME_STATE_NONE, // None of the states below apply.
@@ -18,22 +18,29 @@ typedef enum {
/* 4 */ SG_GAME_STATE_ONE_MORE_GAME, // The player failed to get a new high score (Town) and/or perfect score (Swamp and Town).
/* 5 */ SG_GAME_STATE_GIVING_BONUS, // The player gets bonus points at the end of the Swamp game if they get a perfect score.
/* 6 */ SG_GAME_STATE_ENDED, // The player got a new high score and/or perfect score (Town), or the game is over (Swamp).
- /* 7 */ SG_GAME_STATE_MOVING_PLAYER, // The player is automatically moving towards the spot to play the game.
+ /* 7 */ SG_GAME_STATE_MOVING_PLAYER // The player is automatically moving towards the spot to play the game.
} ShootingGalleryGameState;
typedef enum {
/* 0 */ SG_OCTO_STATE_SPAWNING,
/* 1 */ SG_OCTO_STATE_SPAWNED,
/* 70 */ SG_OCTO_STATE_INITIAL = 70,
- /* 80 */ SG_OCTO_STATE_HIDING = 80,
+ /* 80 */ SG_OCTO_STATE_HIDING = 80
} ShootingGalleryOctorokState;
typedef enum {
/* 0 */ SG_OCTO_HIT_TYPE_NONE,
/* 1 */ SG_OCTO_HIT_TYPE_RED,
- /* 2 */ SG_OCTO_HIT_TYPE_BLUE,
+ /* 2 */ SG_OCTO_HIT_TYPE_BLUE
} ShootingGalleryoctorokHitType;
+typedef enum {
+ /* 0 */ SG_PATH_TYPE_CROW,
+ /* 1 */ SG_PATH_TYPE_SCRUB_NORMAL,
+ /* 2 */ SG_PATH_TYPE_WOLFOS,
+ /* 3 */ SG_PATH_TYPE_SCRUB_BONUS
+} ShootingGalleryPathType;
+
typedef struct EnSyatekiMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
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 401bc34ff..91ed08140 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
@@ -404,7 +404,7 @@ void func_80A36CB0(EnSyatekiOkuta* this) {
}
} else if (this->actionFunc == func_80A36488) {
this->unk_1D8.x = this->unk_1D8.z = 1.0f;
- this->unk_1D8.y = (sin_rad((M_PI / 16) * curFrame) * 0.2f) + 1.0f;
+ this->unk_1D8.y = (Math_SinF((M_PI / 16) * curFrame) * 0.2f) + 1.0f;
} else if (this->actionFunc == func_80A36504) {
if (curFrame < 3.0f) {
this->unk_1D8.y = 1.0f;
@@ -440,7 +440,7 @@ s32 func_80A370EC(EnSyatekiOkuta* this, f32 arg1, Vec3f* arg2) {
if (this->actionFunc == func_80A363B4) {
arg2->y = 1.0f;
arg2->z = 1.0f;
- arg2->x = (sin_rad((M_PI / 16) * arg1) * 0.4f) + 1.0f;
+ arg2->x = (Math_SinF((M_PI / 16) * arg1) * 0.4f) + 1.0f;
} else if (this->actionFunc == func_80A365EC) {
if ((arg1 >= 35.0f) || (arg1 < 25.0f)) {
return false;
@@ -489,7 +489,7 @@ void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2A6 == 1) {
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
} else {
@@ -498,7 +498,7 @@ void EnSyatekiOkuta_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, EnSyatekiOkuta_OverrideLimbDraw, NULL,
&this->actor);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->actionFunc == func_80A365EC) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + 30.0f, this->actor.world.pos.z + 20.0f,
MTXMODE_NEW);
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 a4407dcc2..347d78088 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
@@ -120,7 +120,7 @@ typedef enum {
/* 3 */ EN_SYATEKI_WF_ANIM_LAND,
/* 4 */ EN_SYATEKI_WF_ANIM_BACKFLIP, // unused
/* 5 */ EN_SYATEKI_WF_ANIM_DAMAGED,
- /* 6 */ EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER,
+ /* 6 */ EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER
} EnSyatekiWfAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -146,12 +146,12 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
s32 i;
path = syatekiMan->path;
- while (path->unk2 != 2) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != SG_PATH_TYPE_WOLFOS) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_WF_GET_INDEX(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (path == NULL) {
@@ -408,9 +408,9 @@ void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play) {
s32 i;
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i--) {
- firePos.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- firePos.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- firePos.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ firePos.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ firePos.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ firePos.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &firePos, &sFireVelocityAndAccel, &sFireVelocityAndAccel, 100, 0, 2);
}
}
@@ -425,7 +425,7 @@ void EnSyatekiWf_Update(Actor* thisx, PlayState* play2) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 60.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 60.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
@@ -505,7 +505,7 @@ void EnSyatekiWf_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnSyatekiWf_OverrideLimbDraw, EnSyatekiWf_PostLimbDraw, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Tab/z_en_tab.c b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
index abd7c100c..1f97e5c57 100644
--- a/src/overlays/actors/ovl_En_Tab/z_en_tab.c
+++ b/src/overlays/actors/ovl_En_Tab/z_en_tab.c
@@ -323,9 +323,9 @@ s32 func_80BE0D60(EnTab* this, PlayState* play) {
this->unk_320++;
if (this->unk_320 == 1) {
- play->setPlayerTalkAnim(play, &gPlayerAnim_link_demo_bikkuri, 2);
+ play->setPlayerTalkAnim(play, &gPlayerAnim_link_demo_bikkuri, ANIMMODE_ONCE);
} else if (this->unk_320 > 20) {
- play->setPlayerTalkAnim(play, NULL, 0);
+ play->setPlayerTalkAnim(play, NULL, ANIMMODE_LOOP);
this->unk_320 = 0;
ret = true;
}
@@ -553,7 +553,7 @@ void EnTab_Update(Actor* thisx, PlayState* play) {
func_8013C964(&this->actor, play, radius, height, PLAYER_IA_NONE, this->unk_2FC & 7);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_80BE0620(this, play);
}
}
@@ -617,7 +617,7 @@ void EnTab_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1D8 != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BE1B24[this->unk_31E]));
diff --git a/src/overlays/actors/ovl_En_Talk/z_en_talk.c b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
index 4f9b2a53d..7c639c44a 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.c
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
@@ -32,7 +32,7 @@ void EnTalk_Init(Actor* thisx, PlayState* play) {
EnTalk* this = THIS;
s8 targetMode = this->actor.home.rot.x - 0x1;
- if (targetMode >= 0 && targetMode < 7) {
+ if ((targetMode >= 0) && (targetMode < 7)) {
this->actor.targetMode = targetMode;
}
@@ -56,7 +56,7 @@ void func_80BDE090(EnTalk* this, PlayState* play) {
return;
}
- if ((this->actor.xzDistToPlayer < 40.0f && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
+ if (((this->actor.xzDistToPlayer < 40.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
this->actor.isTargeted) {
func_800B8614(&this->actor, play, 120.0f);
}
diff --git a/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c b/src/overlays/actors/ovl_En_Talk_Gibud/z_en_talk_gibud.c
index 386e80a1f..84d0b7dd1 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
@@ -53,12 +53,12 @@ typedef struct {
/* 0x4 */ ItemId item;
/* 0x8 */ s32 amount;
/* 0xC */ s16 isBottledItem;
-} EnTalkGibudRequestedItem;
+} EnTalkGibudRequestedItem; // size = 0x10
typedef enum {
/* 0 */ EN_TALK_GIBUD_REQUESTED_ITEM_MET,
/* 1 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_ENOUGH_AMMO,
- /* 2 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_MET,
+ /* 2 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_MET
} EnTalkGibudRequestedItemState;
typedef enum {
@@ -71,7 +71,7 @@ typedef enum {
/* 6 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_BOMBS,
/* 7 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_HOT_SPRING_WATER,
/* 8 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_BIG_POE,
- /* 9 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_MILK,
+ /* 9 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_MILK
} EnTalkGibudRequestedItemIndex;
typedef enum {
@@ -88,18 +88,18 @@ typedef enum {
/* 10 */ EN_TALK_GIBUD_ANIM_WALK,
/* 11 */ EN_TALK_GIBUD_ANIM_DANCE_SQUAT,
/* 12 */ EN_TALK_GIBUD_ANIM_DANCE_PIROUETTE,
- /* 13 */ EN_TALK_GIBUD_ANIM_DANCE_CLAP,
+ /* 13 */ EN_TALK_GIBUD_ANIM_DANCE_CLAP
} EnTalkGibudAnimation;
typedef enum {
/* 0 */ EN_TALK_GIBUD_TYPE_GIBDO,
- /* 1 */ EN_TALK_GIBUD_TYPE_REDEAD,
+ /* 1 */ EN_TALK_GIBUD_TYPE_REDEAD
} EnTalkGibudType;
typedef enum {
/* 0 */ EN_TALK_GIBUD_GRAB_START,
/* 1 */ EN_TALK_GIBUD_GRAB_ATTACK,
- /* 2 */ EN_TALK_GIBUD_GRAB_RELEASE,
+ /* 2 */ EN_TALK_GIBUD_GRAB_RELEASE
} EnTalkGibudGrabState;
ActorInit En_Talk_Gibud_InitVars = {
@@ -159,7 +159,7 @@ typedef enum {
/* 0xC */ EN_TALK_GIBUD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_TALK_GIBUD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_TALK_GIBUD_DMGEFF_LIGHT_RAY, // Instantly kills a Redead on contact
- /* 0xF */ EN_TALK_GIBUD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_TALK_GIBUD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnTalkGibudDamageEffect;
static DamageTable sDamageTable = {
@@ -268,7 +268,7 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
this->switchFlag = -1;
}
- if (this->switchFlag != -1 && Flags_GetSwitch(play, this->switchFlag)) {
+ if ((this->switchFlag != -1) && Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->actor);
}
@@ -291,7 +291,7 @@ void EnTalkGibud_SetupIdle(EnTalkGibud* this) {
* Gibdo will attack the player if they get too close.
*/
void EnTalkGibud_Idle(EnTalkGibud* this, PlayState* play) {
- if (this->actor.xzDistToPlayer <= 150.0f && func_800B715C(play)) {
+ if ((this->actor.xzDistToPlayer <= 150.0f) && func_800B715C(play)) {
EnTalkGibud_SetupAttemptPlayerFreeze(this);
}
@@ -345,7 +345,8 @@ void EnTalkGibud_WalkToPlayer(EnTalkGibud* this, PlayState* play) {
if (EnTalkGibud_PlayerInRangeWithCorrectState(this, play) && Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
if ((this->grabWaitTimer == 0) && (this->actor.xzDistToPlayer <= 45.0f)) {
player->actor.freezeTimer = 0;
- if (gSaveContext.save.playerForm == PLAYER_FORM_GORON || gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_GORON) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_DEKU)) {
// If the Gibdo/Redead tries to grab Goron or Deku Link, it will fail to
// do so. It will appear to take damage and shake its head side-to-side.
EnTalkGibud_SetupGrabFail(this);
@@ -442,6 +443,9 @@ void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 1.0f, 400.0f, 0.0f);
}
break;
+
+ default:
+ break;
}
}
@@ -512,7 +516,7 @@ void EnTalkGibud_WalkToHome(EnTalkGibud* this, PlayState* play) {
this->actor.world.rot = this->actor.shape.rot;
}
if (EnTalkGibud_PlayerInRangeWithCorrectState(this, play)) {
- if (gSaveContext.save.playerForm != PLAYER_FORM_GORON && gSaveContext.save.playerForm != PLAYER_FORM_DEKU &&
+ if ((gSaveContext.save.playerForm != PLAYER_FORM_GORON) && (gSaveContext.save.playerForm != PLAYER_FORM_DEKU) &&
Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
EnTalkGibud_SetupWalkToPlayer(this);
}
@@ -676,6 +680,9 @@ void EnTalkGibud_GetTextIdForRequestedItem(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0x1395, &this->actor);
this->textId = 0x1395;
break;
+
+ default:
+ break;
}
}
@@ -700,6 +707,9 @@ void EnTalkGibud_GetNextTextBoxId(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0xFF, &this->actor);
this->textId = 0xFF;
break;
+
+ default:
+ break;
}
}
}
@@ -824,7 +834,7 @@ void EnTalkGibud_Talk(EnTalkGibud* this, PlayState* play) {
if (!requestedItem->isBottledItem) {
Inventory_ChangeAmmo(requestedItem->item, -requestedItem->amount);
} else {
- Player_UpdateBottleHeld(play, player, ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, player, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
}
player->stateFlags1 |= PLAYER_STATE1_20;
player->stateFlags1 |= PLAYER_STATE1_20000000;
@@ -1063,8 +1073,8 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_ZORA_MAGIC:
- if (this->actionFunc != EnTalkGibud_Grab &&
- (this->actionFunc != EnTalkGibud_Stunned || this->stunTimer == 0)) {
+ if ((this->actionFunc != EnTalkGibud_Grab) &&
+ ((this->actionFunc != EnTalkGibud_Stunned) || (this->stunTimer == 0))) {
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
@@ -1073,10 +1083,13 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_STUN:
- if ((this->actionFunc != EnTalkGibud_Stunned) || this->stunTimer == 0) {
+ if ((this->actionFunc != EnTalkGibud_Stunned) || (this->stunTimer == 0)) {
EnTalkGibud_SetupStunned(this);
}
break;
+
+ default:
+ break;
}
}
}
@@ -1111,8 +1124,10 @@ void EnTalkGibud_MoveGrabbedPlayerAwayFromWall(EnTalkGibud* this, PlayState* pla
Player* player = GET_PLAYER(play);
Vec3f targetPos;
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f, 29);
- if (this->actionFunc == EnTalkGibud_Grab && this->grabState == EN_TALK_GIBUD_GRAB_START &&
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
+ if ((this->actionFunc == EnTalkGibud_Grab) && (this->grabState == EN_TALK_GIBUD_GRAB_START) &&
(this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
targetPos = player->actor.world.pos;
targetPos.x += 10.0f * Math_SinS(this->actor.wallYaw);
@@ -1188,7 +1203,7 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
this->limbIndex = 0;
if (this->actor.shape.shadowAlpha == 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
@@ -1197,7 +1212,7 @@ void EnTalkGibud_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnTalkGibud_OverrideLimbDraw, EnTalkGibud_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->actor.shape.shadowAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
diff --git a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
index fec6a2d3b..c71676061 100644
--- a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
+++ b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
@@ -248,9 +248,9 @@ void func_80BB5318(EnTanron1* this, PlayState* play) {
ptr->unk_20 = Math_Atan2S(temp.x, temp.z);
ptr->unk_1E = Math_Atan2S(temp.y, sqrtf(SQXZ(temp)));
if ((ptr->unk_26 & 0xF) == 0) {
- ptr->unk_30 = randPlusMinusPoint5Scaled(temp_f30);
- ptr->unk_34 = randPlusMinusPoint5Scaled(temp_f30 * 0.5f);
- ptr->unk_38 = randPlusMinusPoint5Scaled(temp_f30);
+ ptr->unk_30 = Rand_CenteredFloat(temp_f30);
+ ptr->unk_34 = Rand_CenteredFloat(temp_f30 * 0.5f);
+ ptr->unk_38 = Rand_CenteredFloat(temp_f30);
}
temp.x = player->actor.world.pos.x - ptr->unk_00.x;
@@ -336,7 +336,7 @@ void func_80BB5318(EnTanron1* this, PlayState* play) {
Math_ApproachF(&ptr->unk_30, ptr->unk_34, 1.0f, 0.5f);
if ((ptr->unk_26 & 0xF) == 0) {
if (Rand_ZeroOne() < 0.5f) {
- ptr->unk_34 = randPlusMinusPoint5Scaled(12.0f);
+ ptr->unk_34 = Rand_CenteredFloat(12.0f);
}
ptr->unk_3C = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp98, &ptr->unk_00);
sp9C = ptr->unk_00.y;
@@ -369,7 +369,7 @@ void func_80BB5AAC(EnTanron1* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < this->actor.params; i++, ptr++) {
if (ptr->unk_24 == 1) {
@@ -390,26 +390,23 @@ void func_80BB5AAC(EnTanron1* this, PlayState* play) {
flag = 0;
ptr = ptrBase;
for (i = 0; i < this->actor.params; i++, ptr++) {
- if (ptr->unk_24 != 2) {
- continue;
+ if (ptr->unk_24 == 2) {
+ if (!flag) {
+ gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD,
+ G_TX_NOLOD);
+ flag++;
+ }
+
+ Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
+ Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
+ Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, ptr->unk_2C, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001900);
}
-
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
- gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
- G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD, G_TX_NOLOD);
- flag++;
- }
-
- Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
- Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
- Matrix_Scale(1.0f, ptr->unk_2C, 1.0f, MTXMODE_APPLY);
-
- if (1) {}
-
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001900);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
index 56384193e..785308dad 100644
--- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
+++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
@@ -155,7 +155,7 @@ void EnTanron2_Init(Actor* thisx, PlayState* play) {
this->unk_14C = -this->unk_14C;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.floorHeight += 20.0f;
this->unk_148 = Rand_ZeroFloat(32.0f);
}
@@ -236,7 +236,7 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) {
switch (this->unk_158) {
case 0:
if (Rand_ZeroOne() > 0.2f) {
- sp32 = Rand_ZeroFloat(65536.0f);
+ sp32 = Rand_ZeroFloat(0x10000);
} else {
sp32 = Math_Atan2S(sp2C, sp28);
}
@@ -592,7 +592,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gWartBubbleMaterialDL);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 150);
@@ -637,7 +637,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
}
}
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 150);
gSPDisplayList(POLY_XLU_DISP++, gWartShadowMaterialDL);
@@ -654,7 +654,7 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
tanron2 = tanron2->next;
}
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
index bc8fee2fd..81a4ac2af 100644
--- a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
+++ b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
@@ -100,8 +100,8 @@ void EnTanron3_CreateEffect(PlayState* play, Vec3f* effectPos) {
effectPtr->unk_34.y = 0.0f;
effectPtr->unk_34.z = Rand_ZeroFloat(2 * M_PI);
effectPtr->unk_02 = Rand_ZeroFloat(100.0f);
- effectPtr->velocity.x = randPlusMinusPoint5Scaled(25.0f);
- effectPtr->velocity.z = randPlusMinusPoint5Scaled(25.0f);
+ effectPtr->velocity.x = Rand_CenteredFloat(25.0f);
+ effectPtr->velocity.z = Rand_CenteredFloat(25.0f);
break;
}
}
@@ -155,9 +155,9 @@ void EnTanron3_SetupLive(EnTanron3* this, PlayState* play) {
this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] = 50;
this->actor.speed = 5.0f;
this->speedMaxStep = 0.5f;
- this->deviation.x = randPlusMinusPoint5Scaled(500.0f);
- this->deviation.y = randPlusMinusPoint5Scaled(100.0f);
- this->deviation.z = randPlusMinusPoint5Scaled(500.0f);
+ this->deviation.x = Rand_CenteredFloat(500.0f);
+ this->deviation.y = Rand_CenteredFloat(100.0f);
+ this->deviation.z = Rand_CenteredFloat(500.0f);
Math_Vec3f_Copy(&this->targetPos, &this->actor.world.pos);
this->timer = Rand_ZeroFloat(100.0f);
}
@@ -180,10 +180,10 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->skelAnime.curFrame = 4.0f;
- if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && player->actor.shape.feetPos[0].y >= 438.0f) {
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (player->actor.shape.feetPos[0].y >= 438.0f)) {
// Player is standing on the central platform, so stop chasing them
this->isNonHostile = true;
- } else if (this->isNonHostile && this->workTimer[WORK_TIMER_WAIT] == 0 && !(this->timer & 0x1F)) {
+ } else if (this->isNonHostile && (this->workTimer[WORK_TIMER_WAIT] == 0) && !(this->timer & 0x1F)) {
xDistance = this->targetPos.x - player->actor.world.pos.x;
zDistance = this->targetPos.z - player->actor.world.pos.z;
if (sqrtf(SQ(xDistance) + SQ(zDistance)) < 500.0f) {
@@ -204,20 +204,21 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
Math_Vec3f_Copy(&this->targetPos, &player->actor.world.pos);
if (!(this->timer & 0xF)) {
- if (Rand_ZeroOne() < 0.5f && this->actor.xzDistToPlayer <= 200.0f) {
+ if ((Rand_ZeroOne() < 0.5f) && (this->actor.xzDistToPlayer <= 200.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_ATTACK);
}
}
// If the player gets eaten by Gyorg, or if the attack timer ran out,
// stop chasing the player for a little bit.
- if (this->workTimer[WORK_TIMER_ATTACK] == 0 || (player->stateFlags2 & PLAYER_STATE2_80)) {
+ if ((this->workTimer[WORK_TIMER_ATTACK] == 0) || (player->stateFlags2 & PLAYER_STATE2_80)) {
this->workTimer[WORK_TIMER_WAIT] = 150;
this->isNonHostile = true;
}
break;
+
case true:
- if (sGyorg->unk_324 != 0 && !(this->timer & 0x7)) {
+ if ((sGyorg->unk_324 != 0) && !(this->timer & 0x7)) {
this->nextRotationAngle = 0x4E20;
this->actor.speed = 6.0f;
} else {
@@ -242,11 +243,11 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
}
if (this->workTimer[WORK_TIMER_OUT_OF_WATER] == 0) {
- if (this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] == 0 && this->actor.speed > 1.0f) {
+ if ((this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] == 0) && (this->actor.speed > 1.0f)) {
this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] = Rand_ZeroFloat(20.0f);
- this->deviation.x = randPlusMinusPoint5Scaled(100.0f);
- this->deviation.y = randPlusMinusPoint5Scaled(50.0f + extraScaleY);
- this->deviation.z = randPlusMinusPoint5Scaled(100.0f);
+ this->deviation.x = Rand_CenteredFloat(100.0f);
+ this->deviation.y = Rand_CenteredFloat(50.0f + extraScaleY);
+ this->deviation.z = Rand_CenteredFloat(100.0f);
}
this->targetPosWithDeviation.y = this->targetPos.y + this->deviation.y + 50.0f;
}
@@ -286,6 +287,7 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
this->isBeached = true;
}
break;
+
case true:
this->nextRotationAngle = 0x3A98;
this->actor.gravity = -1.5f;
@@ -295,17 +297,17 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
this->actor.speed = Rand_ZeroFloat(2.0f) + 2.0f;
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.x =
- (s16)randPlusMinusPoint5Scaled(500.0f) + this->targetShapeRotation.x + 0x8000;
+ (s16)(s32)Rand_CenteredFloat(0x1F4) + this->targetShapeRotation.x + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.z =
- (s16)randPlusMinusPoint5Scaled(500.0f) + this->targetShapeRotation.z + 0x8000;
+ (s16)(s32)Rand_CenteredFloat(0x1F4) + this->targetShapeRotation.z + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.y = (s16)Rand_ZeroFloat(0x10000);
}
this->actor.world.rot.y = Math_Atan2S_XY(this->actor.world.pos.z, this->actor.world.pos.x) +
- (s16)randPlusMinusPoint5Scaled(0xCE20);
+ (s16)(s32)Rand_CenteredFloat(0xCE20);
}
Math_ApproachS(&this->actor.shape.rot.y, this->targetShapeRotation.y, 3, 0x500);
@@ -314,9 +316,9 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
if ((Rand_ZeroOne() < 0.5f) & !(this->timer & 0x3)) {
Vec3f effectPos;
- effectPos.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.x;
+ effectPos.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x;
effectPos.y = this->actor.world.pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z;
EnTanron3_CreateEffect(play, &effectPos);
}
break;
@@ -404,7 +406,7 @@ void EnTanron3_Update(Actor* thisx, PlayState* play) {
}
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 20.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 20.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
// The fish has either just entered or just exited the water, so create a splash effect
if (((this->actor.prevPos.y < this->waterSurfaceYPos) && (this->waterSurfaceYPos <= this->actor.world.pos.y)) ||
@@ -423,7 +425,7 @@ void EnTanron3_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->atCollider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->acCollider.base);
- if ((s8)sGyorg->actor.colChkInfo.health <= 0 && this->actionFunc != EnTanron3_Die) {
+ if (((s8)sGyorg->actor.colChkInfo.health <= 0) && (this->actionFunc != EnTanron3_Die)) {
EnTanron3_SetupDie(this, play);
this->workTimer[WORK_TIMER_DIE] = 0;
}
@@ -452,7 +454,7 @@ void EnTanron3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if ((this->fogTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
diff --git a/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
index 1eaf1d128..074eaec79 100644
--- a/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
+++ b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
@@ -23,13 +23,13 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play);
typedef enum {
/* 0 */ SEAGULL_FLY_FLAP,
- /* 1 */ SEAGULL_FLY_GLIDE,
+ /* 1 */ SEAGULL_FLY_GLIDE
} SeagullFlyState;
typedef enum {
/* 0 */ SEAGULL_TIMER_FLY_STATE,
- /* 1 */ SEAGULL_TIMER_CHOOSE_TARGET,
-} SeagullTimers;
+ /* 1 */ SEAGULL_TIMER_CHOOSE_TARGET
+} SeagullTimer;
ActorInit En_Tanron4_InitVars = {
ACTOR_EN_TANRON4,
@@ -65,10 +65,9 @@ void EnTanron4_Init(Actor* thisx, PlayState* play2) {
s32 i;
for (i = 0; i < thisx->params; i++) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON4,
- thisx->world.pos.x + randPlusMinusPoint5Scaled(500.0f),
- thisx->world.pos.y + randPlusMinusPoint5Scaled(100.0f),
- thisx->world.pos.z + randPlusMinusPoint5Scaled(500.0f), 0, Rand_ZeroFloat(65536.0f), 0,
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON4, thisx->world.pos.x + Rand_CenteredFloat(500.0f),
+ thisx->world.pos.y + Rand_CenteredFloat(100.0f),
+ thisx->world.pos.z + Rand_CenteredFloat(500.0f), 0, Rand_ZeroFloat(0x10000), 0,
SEAGULL_CLONE);
}
}
@@ -112,9 +111,9 @@ void EnTanron4_FlyNearHome(EnTanron4* this, PlayState* play) {
distToTarget = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timers[SEAGULL_TIMER_CHOOSE_TARGET] == 0) || (distToTarget < 100.0f)) {
- this->targetPos.x = this->actor.home.pos.x + randPlusMinusPoint5Scaled(500.0f);
- this->targetPos.y = this->actor.home.pos.y + randPlusMinusPoint5Scaled(100.0f);
- this->targetPos.z = this->actor.home.pos.z + randPlusMinusPoint5Scaled(500.0f);
+ this->targetPos.x = this->actor.home.pos.x + Rand_CenteredFloat(500.0f);
+ this->targetPos.y = this->actor.home.pos.y + Rand_CenteredFloat(100.0f);
+ this->targetPos.z = this->actor.home.pos.z + Rand_CenteredFloat(500.0f);
this->timers[SEAGULL_TIMER_CHOOSE_TARGET] = Rand_ZeroFloat(100.0f) + 60.0f;
this->step = 0;
@@ -151,7 +150,7 @@ void EnTanron4_FlyNearHome(EnTanron4* this, PlayState* play) {
case SEAGULL_FLY_GLIDE:
if (((this->randRollTimer % 8) == 0) && (Rand_ZeroOne() < 0.5f)) {
- this->rollTarget = randPlusMinusPoint5Scaled(3000.0f + KREG(44));
+ this->rollTarget = Rand_CenteredFloat(3000.0f + KREG(44));
}
if (this->timers[SEAGULL_TIMER_FLY_STATE] == 0) {
@@ -192,9 +191,9 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play) {
distToTarget = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timers[SEAGULL_TIMER_CHOOSE_TARGET] == 0) || (distToTarget < 100.0f)) {
- this->targetPos.x = targetActor->world.pos.x + randPlusMinusPoint5Scaled(200.0f + KREG(82));
- this->targetPos.y = targetActor->world.pos.y + KREG(80) + 100.0f + randPlusMinusPoint5Scaled(100.0f + KREG(81));
- this->targetPos.z = targetActor->world.pos.z + randPlusMinusPoint5Scaled(200.0f + KREG(82));
+ this->targetPos.x = targetActor->world.pos.x + Rand_CenteredFloat(200.0f + KREG(82));
+ this->targetPos.y = targetActor->world.pos.y + KREG(80) + 100.0f + Rand_CenteredFloat(100.0f + KREG(81));
+ this->targetPos.z = targetActor->world.pos.z + Rand_CenteredFloat(200.0f + KREG(82));
this->timers[SEAGULL_TIMER_CHOOSE_TARGET] = Rand_ZeroFloat(100.0f) + 60.0f;
this->step = 0;
@@ -230,7 +229,7 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play) {
case SEAGULL_FLY_GLIDE:
if (((this->randRollTimer % 8) == 0) && (Rand_ZeroOne() < 0.5f)) {
- this->rollTarget = randPlusMinusPoint5Scaled(3000.0f + KREG(44));
+ this->rollTarget = Rand_CenteredFloat(3000.0f + KREG(44));
}
if (this->timers[SEAGULL_TIMER_FLY_STATE] == 0) {
diff --git a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
index e285869a5..a56b01c3b 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
@@ -101,9 +101,9 @@ void func_80BE4930(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
effect->unk_00 = *arg1;
- effect->unk_0C = randPlusMinusPoint5Scaled(10.0f);
+ effect->unk_0C = Rand_CenteredFloat(10.0f);
effect->unk_10 = Rand_ZeroFloat(2.0f) + 3.0f;
- effect->unk_14 = randPlusMinusPoint5Scaled(10.0f);
+ effect->unk_14 = Rand_CenteredFloat(10.0f);
effect->unk_18.y = -0.15f;
effect->unk_18.x = 0.0f;
@@ -127,9 +127,9 @@ void func_80BE4A2C(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
effect->unk_00 = *arg1;
- effect->unk_0C = randPlusMinusPoint5Scaled(30.0f);
+ effect->unk_0C = Rand_CenteredFloat(30.0f);
effect->unk_10 = Rand_ZeroFloat(7.0f);
- effect->unk_14 = randPlusMinusPoint5Scaled(30.0f);
+ effect->unk_14 = Rand_CenteredFloat(30.0f);
effect->unk_18.y = -0.3f;
effect->unk_18.x = 0.0f;
@@ -154,8 +154,8 @@ void EnTanron5_Init(Actor* thisx, PlayState* play) {
return;
}
- this->unk_198 = randPlusMinusPoint5Scaled(0x2000);
- this->unk_19A = randPlusMinusPoint5Scaled(0x2000);
+ this->unk_198 = Rand_CenteredFloat(0x2000);
+ this->unk_19A = Rand_CenteredFloat(0x2000);
if (ENTANRON5_GET(&this->actor) < ENTANRON5_107) {
Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.025f) + 0.085f) * D_80BE5DD0);
@@ -203,7 +203,7 @@ void EnTanron5_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
} else {
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.world.pos.y = this->actor.floorHeight + -20.0f;
}
}
@@ -327,8 +327,8 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
spAC = 50.0f;
}
- sp9C.x = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.x;
- sp9C.z = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.z;
+ sp9C.x = (Rand_CenteredFloat(spA8) * D_80BE5DD0) + spB8.x;
+ sp9C.z = (Rand_CenteredFloat(spA8) * D_80BE5DD0) + spB8.z;
sp9C.y = this->actor.floorHeight + (spAC * D_80BE5DD0);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, sp9C.x, sp9C.y, sp9C.z,
@@ -350,7 +350,7 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
this->actor.shape.rot.y += phi_v0;
Actor_PlaySfx(&this->actor, NA_SE_IT_BIG_BOMB_EXPLOSION);
- func_800BC848(&this->actor, play, 4, 4);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 4, 4);
this->unk_1A0++;
} else {
Vec3f sp90;
@@ -417,7 +417,7 @@ void func_80BE5818(Actor* thisx, PlayState* play2) {
if (this->actor.speed > 0.02f) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 50.0f, 150.0f, 100.0f, UPDBGCHECKINFO_FLAG_4);
}
if (ENTANRON5_GET(&this->actor) < ENTANRON5_110) {
@@ -483,7 +483,7 @@ void EnTanron5_Draw(Actor* thisx, PlayState* play) {
if ((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, this->unk_148);
@@ -506,14 +506,14 @@ void func_80BE5C10(Actor* thisx, PlayState* play) {
if (((-500.0f * D_80BE5DD0) < this->actor.projectedPos.z) && phi_v0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_1A0 == 0) {
texture = gDropArrows1Tex;
} else {
texture = gDropMagicLargeTex;
}
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(texture));
diff --git a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
index 4faa072f9..875f36a61 100644
--- a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
+++ b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c
@@ -91,7 +91,9 @@ void EnTanron6_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 40.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
void EnTanron6_Draw(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_En_Test/z_en_test.c b/src/overlays/actors/ovl_En_Test/z_en_test.c
index 7f0a3e971..1372d8791 100644
--- a/src/overlays/actors/ovl_En_Test/z_en_test.c
+++ b/src/overlays/actors/ovl_En_Test/z_en_test.c
@@ -133,7 +133,7 @@ void func_80863048(PlayState* play, EnTestStruct* arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
@@ -161,18 +161,18 @@ void EnTest_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnTest* this = THIS;
MtxF sp38;
- s32 sp34;
+ s32 bgId;
this->unk_209 = 0;
this->unk_174 = 0;
if (thisx->params > 0) {
Actor_SetScale(thisx, thisx->params / 100000.0f);
- this->unk_20A = 0;
+ this->surfaceMaterial = SURFACE_MATERIAL_DIRT;
} else {
thisx->floorPoly = NULL;
thisx->world.pos.y += 10.0f;
- thisx->floorHeight = BgCheck_EntityRaycastFloor3(&play->colCtx, &thisx->floorPoly, &sp34, &thisx->world.pos);
+ thisx->floorHeight = BgCheck_EntityRaycastFloor3(&play->colCtx, &thisx->floorPoly, &bgId, &thisx->world.pos);
if ((thisx->floorPoly == NULL) || (thisx->floorHeight == BGCHECK_Y_MIN)) {
Actor_Kill(thisx);
@@ -183,7 +183,7 @@ void EnTest_Init(Actor* thisx, PlayState* play2) {
func_800C0094(thisx->floorPoly, thisx->world.pos.x, thisx->floorHeight, thisx->world.pos.z, &sp38);
Matrix_MtxFToYXZRot(&sp38, &thisx->shape.rot, true);
thisx->world.rot = thisx->shape.rot;
- this->unk_20A = func_800C9BB8(&play->colCtx, thisx->floorPoly, sp34);
+ this->surfaceMaterial = SurfaceType_GetMaterial(&play->colCtx, thisx->floorPoly, bgId);
}
func_80183430(&this->skeletonInfo, &gameplay_keep_Blob_06EB70, &gameplay_keep_Blob_06BB0C, this->unk_178,
@@ -257,7 +257,8 @@ void EnTest_Draw(Actor* thisx, PlayState* play) {
sp2C = 29;
}
- if ((this->unk_20A == 15) || (this->unk_20A == 14)) {
+ //! @bug Checks for non-existent SURFACE_MATERIAL_MAX material
+ if ((this->surfaceMaterial == SURFACE_MATERIAL_MAX) || (this->surfaceMaterial == SURFACE_MATERIAL_SNOW)) {
AnimatedMat_DrawStep(play, Lib_SegmentedToVirtual(gameplay_keep_Matanimheader_06B730), sp2C);
} else {
AnimatedMat_DrawStep(play, Lib_SegmentedToVirtual(gameplay_keep_Matanimheader_06B6A0), sp2C);
@@ -266,7 +267,7 @@ void EnTest_Draw(Actor* thisx, PlayState* play) {
mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
if (mtx != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_8018450C(play, &this->skeletonInfo, mtx, EnTest_OverrideKeyframeDraw, NULL, thisx);
func_80863048(play, this->unk_20C);
}
diff --git a/src/overlays/actors/ovl_En_Test/z_en_test.h b/src/overlays/actors/ovl_En_Test/z_en_test.h
index 2b8d62993..68395a96a 100644
--- a/src/overlays/actors/ovl_En_Test/z_en_test.h
+++ b/src/overlays/actors/ovl_En_Test/z_en_test.h
@@ -24,7 +24,7 @@ typedef struct EnTest {
/* 0x1C0 */ Vec3s unk_1C0[12];
/* 0x208 */ u8 unk_208;
/* 0x209 */ u8 unk_209;
- /* 0x20A */ u8 unk_20A;
+ /* 0x20A */ u8 surfaceMaterial;
/* 0x20C */ EnTestStruct unk_20C[20];
} EnTest; // size = 0x6BC
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 fd1710264..e853570f4 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -72,7 +72,7 @@ void EnTest2_Init(Actor* thisx, PlayState* play) {
EnTest2* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if ((this->actor.params == EN_TEST2_PARAMS_B) || (this->actor.params == EN_TEST2_PARAMS_C)) {
+ if ((this->actor.params == EN_TEST2_PARAM_B) || (this->actor.params == EN_TEST2_PARAM_C)) {
this->actor.flags |= ACTOR_FLAG_20;
}
}
@@ -125,7 +125,7 @@ void EnTest2_Draw(Actor* thisx, PlayState* play) {
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_REACT_TO_LENS)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (dList != NULL) {
diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.h b/src/overlays/actors/ovl_En_Test2/z_en_test2.h
index 3b03e0cc1..d54dbb265 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.h
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.h
@@ -11,8 +11,8 @@ typedef struct EnTest2 {
} EnTest2; // size = 0x148
typedef enum {
- /* 0xB */ EN_TEST2_PARAMS_B = 0xB,
- /* 0xC */ EN_TEST2_PARAMS_C
-} EnTest2_Params;
+ /* 0xB */ EN_TEST2_PARAM_B = 0xB,
+ /* 0xC */ EN_TEST2_PARAM_C
+} EnTest2_Param;
#endif // Z_EN_TEST2_H
diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
index 8d1c726b7..2000e0e53 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -4,13 +4,14 @@
* Description: Kafei
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test3.h"
#include "objects/object_test3/object_test3.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_mask_ki_tan/object_mask_ki_tan.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((EnTest3*)thisx)
@@ -125,7 +126,7 @@ static u8 sScheduleScript[] = {
/* 0x0A5 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_79_40, 0x12C - 0x0AA),
/* 0x0AA */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_SECOM, 0x0B0 - 0x0AE),
/* 0x0AE */ SCHEDULE_CMD_RET_VAL_S(7),
- /* 0x0B0 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_20, 0x0DD - 0x0B4),
+ /* 0x0B0 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT, 0x0DD - 0x0B4),
/* 0x0B4 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_IKANA, 0x0DC - 0x0B8),
/* 0x0B8 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_08, 0x0BE - 0x0BC),
/* 0x0BC */ SCHEDULE_CMD_RET_VAL_S(5),
@@ -149,7 +150,7 @@ static u8 sScheduleScript[] = {
/* 0x0F3 */ SCHEDULE_CMD_RET_TIME(4, 0, 4, 10, 11),
/* 0x0F9 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_YADOYA, 0x12B - 0x0FD),
/* 0x0FD */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 10, 4, 30, 0x125 - 0x103),
- /* 0x103 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_01, 0x11C - 0x107),
+ /* 0x103 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES, 0x11C - 0x107),
/* 0x107 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 30, 4, 45, 0x116 - 0x10D),
/* 0x10D */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 45, 6, 0, 0x114 - 0x113),
/* 0x113 */ SCHEDULE_CMD_RET_NONE(),
@@ -312,7 +313,7 @@ s32 func_80A3E898(EnTest3* this, PlayState* play) {
u16 textId = this->unk_D78->textId;
if ((this->unk_D78->unk_0 == 4) && CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
}
if (textId == 0xFFFF) {
Message_CloseTextbox(play);
@@ -320,7 +321,7 @@ s32 func_80A3E898(EnTest3* this, PlayState* play) {
Message_ContinueTextbox(play, textId);
}
if (textId == 0x296B) {
- LinkAnimation_PlayOnceSetSpeed(play, &this->player.skelAnime, &gPlayerAnim_al_yareyare, 2.0f / 3.0f);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->player.skelAnime, &gPlayerAnim_al_yareyare, 2.0f / 3.0f);
}
return false;
}
@@ -339,11 +340,11 @@ s32 func_80A3E97C(EnTest3* this, PlayState* play) {
}
s32 func_80A3E9DC(EnTest3* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_D8D)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_D8D, &this->player.actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->player.actor);
return true;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_D8D);
+ CutsceneManager_Queue(this->csId);
return false;
}
}
@@ -357,8 +358,8 @@ s32 func_80A3EA30(EnTest3* this, PlayState* play) {
}
}
if (this->unk_D78->unk_1 != 0) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_D8D);
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
play->msgCtx.msgMode = 0x44;
}
return false;
@@ -374,9 +375,9 @@ s32 func_80A3EAC4(EnTest3* this, PlayState* play) {
s32 func_80A3EAF8(EnTest3* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
if (this->unk_D78->textId == 0x145F) {
- ActorCutscene_Stop(this->unk_D8D);
- this->unk_D8D = 0x7C;
- ActorCutscene_SetIntentToPlay(this->unk_D8D);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CS_ID_GLOBAL_TALK;
+ CutsceneManager_Queue(this->csId);
this->player.targetedActor = &GET_PLAYER(play)->actor;
}
return 1;
@@ -452,7 +453,7 @@ void EnTest3_Init(Actor* thisx, PlayState* play2) {
D_80A41D24 = true;
this->player.actor.room = -1;
- this->player.unk_A86 = -1;
+ this->player.csId = CS_ID_NONE;
this->player.transformation = PLAYER_FORM_HUMAN;
this->player.ageProperties = &sAgeProperties;
this->player.heldItemAction = PLAYER_IA_NONE;
@@ -478,8 +479,8 @@ void EnTest3_Init(Actor* thisx, PlayState* play2) {
if (play->sceneId == SCENE_SECOM) {
this->subCamId = Play_CreateSubCamera(play);
subCam = Play_GetCamera(play, this->subCamId);
- Camera_InitPlayerSettings(subCam, &this->player);
- Camera_SetFlags(subCam, CAM_STATE_0 | CAM_STATE_6);
+ Camera_InitFocalActorSettings(subCam, &this->player.actor);
+ Camera_SetStateFlag(subCam, CAM_STATE_0 | CAM_STATE_6);
Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_WAIT);
}
@@ -526,23 +527,23 @@ void func_80A3F0B0(EnTest3* this, PlayState* play) {
}
void func_80A3F114(EnTest3* this, PlayState* play) {
- if (this->player.csMode != 0) {
- play->startPlayerCutscene(play, &this->player, 6);
+ if (this->player.csMode != PLAYER_CSMODE_0) {
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_END);
}
}
s32 func_80A3F15C(EnTest3* this, PlayState* play, struct_80A41828* arg2) {
- s32 pathIndex;
+ s32 limit;
Path* path;
Vec3s* curPathPoint;
Vec3s* nextPathPoint;
Vec3f curPathPos;
Vec3f nextPathPos;
- pathIndex = ABS_ALT(arg2->unk_1_0) - 1;
+ limit = ABS_ALT(arg2->unk_1_0) - 1;
- if (pathIndex >= 0) {
- path = SubS_GetAdditionalPath(play, KAFEI_GET_PARAM_1F(&this->player.actor), pathIndex);
+ if (limit >= 0) {
+ path = SubS_GetAdditionalPath(play, KAFEI_GET_PATH_INDEX(&this->player.actor), limit);
curPathPoint = Lib_SegmentedToVirtual(path->points);
if (arg2->unk_1_0 > 0) {
@@ -589,14 +590,14 @@ s32 func_80A3F384(EnTest3* this, PlayState* play) {
EnDoor* door = (EnDoor*)func_80A3F2BC(play, this, ACTOR_EN_DOOR, ACTORCAT_DOOR, 55.0f, 20.0f);
Vec3f offset;
- if ((door != NULL) && (door->unk_1A1 == 0) &&
- ((player->doorType == 0) || (&door->dyna.actor != player->doorActor)) &&
- Actor_ActorAIsFacingActorB(&this->player.actor, &door->dyna.actor, 0x3000)) {
- Actor_OffsetOfPointInActorCoords(&door->dyna.actor, &offset, &this->player.actor.world.pos);
- this->player.doorType = 1;
+ if ((door != NULL) && !door->knobDoor.playOpenAnim &&
+ ((player->doorType == PLAYER_DOORTYPE_NONE) || (&door->knobDoor.dyna.actor != player->doorActor)) &&
+ Actor_ActorAIsFacingActorB(&this->player.actor, &door->knobDoor.dyna.actor, 0x3000)) {
+ Actor_OffsetOfPointInActorCoords(&door->knobDoor.dyna.actor, &offset, &this->player.actor.world.pos);
+ this->player.doorType = PLAYER_DOORTYPE_HANDLE;
this->player.doorDirection = (offset.z >= 0.0f) ? 1.0f : -1.0f;
- this->player.doorActor = &door->dyna.actor;
- this->player.unk_A86 = -1;
+ this->player.doorActor = &door->knobDoor.dyna.actor;
+ this->player.csId = CS_ID_NONE;
return true;
}
return false;
@@ -616,7 +617,7 @@ void func_80A3F534(EnTest3* this, PlayState* play) {
} else {
this->unk_D78 = &D_80A41854[1];
}
- this->unk_D8D = this->player.actor.cutscene;
+ this->csId = this->player.actor.csId;
}
void func_80A3F5A4(EnTest3* this, PlayState* play) {
@@ -628,7 +629,7 @@ void func_80A3F5A4(EnTest3* this, PlayState* play) {
} else {
this->unk_D78 = &D_80A41854[12];
}
- this->unk_D8D = this->player.actor.cutscene;
+ this->csId = this->player.actor.csId;
}
s32 func_80A3F62C(EnTest3* this, PlayState* play, struct_80A41828* arg2, ScheduleOutput* scheduleOutput) {
@@ -657,7 +658,7 @@ s32 func_80A3F73C(EnTest3* this, PlayState* play) {
this->player.stateFlags2 &= ~PLAYER_STATE2_40000;
D_80A41D5C = true;
if ((this->unk_D78->unk_0 == 4) && CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
}
} else {
if (play->actorCtx.flags & ACTORCTX_FLAG_4) {
@@ -666,8 +667,8 @@ s32 func_80A3F73C(EnTest3* this, PlayState* play) {
this->unk_D90->stateFlags1 |= PLAYER_STATE1_20;
func_800BC154(play, &play->actorCtx, &this->unk_D90->actor, 4);
func_800BC154(play, &play->actorCtx, &this->player.actor, 2);
- ActorCutscene_SetReturnCamera(this->subCamId);
- play->startPlayerCutscene(play, &this->player, 7);
+ CutsceneManager_SetReturnCamera(this->subCamId);
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_WAIT);
}
func_800B863C(&this->player.actor, play);
if (this->unk_D88 == 3) {
@@ -689,7 +690,7 @@ s32 func_80A3F8D4(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
((postActor = func_80A3F2BC(play, this, ACTOR_EN_PM, ACTORCAT_NPC, 100.0f, 20.0f)) != NULL)) {
this->player.actor.home.rot.y = Actor_WorldYawTowardActor(&this->player.actor, postActor);
}
- play->startPlayerCutscene(play, &this->player, 0x61);
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_97);
return true;
}
@@ -736,7 +737,7 @@ s32 func_80A3FA58(EnTest3* this, PlayState* play) {
return false;
}
if (this->unk_D8A == 90) {
- play->startPlayerCutscene(play, &this->player, 0x15);
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_21);
}
} else {
this->unk_D8A++;
@@ -757,20 +758,20 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
if (!Play_InCsMode(play)) {
D_80A41D20 = 1;
this->unk_D78 = &D_80A41854[20];
- this->unk_D8D = this->player.actor.cutscene;
+ this->csId = this->player.actor.csId;
this->player.actor.textId = this->unk_D78->textId;
}
} else if (D_80A41D20 == 1) {
- if (this->unk_D8D >= 0) {
+ if (this->csId >= 0) {
if (func_80A3E9DC(this, play)) {
- this->unk_D8D = -1;
+ this->csId = CS_ID_NONE;
Environment_StopTime();
}
} else if ((play->actorCtx.flags & ACTORCTX_FLAG_6) || (play->actorCtx.flags & ACTORCTX_FLAG_5)) {
- this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->player.actor.cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->player.actor.csId);
SET_WEEKEVENTREG(WEEKEVENTREG_90_02);
if (play->actorCtx.flags & ACTORCTX_FLAG_5) {
- this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->unk_D8D);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
}
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
D_80A41D20 = 2;
@@ -778,13 +779,13 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
func_80A3F73C(this, play);
}
} else if ((D_80A41D20 == 2) && func_80A3E9DC(this, play)) {
- ActorCutscene_SetReturnCamera(CAM_ID_MAIN);
+ CutsceneManager_SetReturnCamera(CAM_ID_MAIN);
Environment_StartTime();
if (((void)0, gSaveContext.save.time) > CLOCK_TIME(6, 0)) {
func_800FE658(TIME_TO_MINUTES_ALT_F(fabsf((s16) - ((void)0, gSaveContext.save.time))));
}
if (play->actorCtx.flags & ACTORCTX_FLAG_6) {
- SET_WEEKEVENTREG(WEEKEVENTREG_51_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_02);
}
D_80A41D20 = 3;
@@ -793,7 +794,7 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
}
s32 func_80A3FDE4(EnTest3* this, PlayState* play, struct_80A41828* arg2, ScheduleOutput* scheduleOutput) {
- this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->player.actor.cutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->player.actor.csId);
return true;
}
@@ -813,7 +814,7 @@ s32 func_80A3FE20(EnTest3* this, PlayState* play) {
} else if (D_80A41D64 == 1) {
func_80A40230(this, play);
} else if (D_80A41D64 == 2) {
- ActorCutscene_Stop(this->unk_D8D);
+ CutsceneManager_Stop(this->csId);
SET_WEEKEVENTREG(WEEKEVENTREG_90_02);
D_80A41D64 = 3;
}
@@ -835,9 +836,9 @@ s32 func_80A3FF10(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
return true;
} else {
func_80A3F15C(this, play, arg2);
- this->unk_D8D = this->player.actor.cutscene;
+ this->csId = this->player.actor.csId;
if (play->roomCtx.curRoom.num == 2) {
- this->unk_D8D = ActorCutscene_GetAdditionalCutscene(this->unk_D8D);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
}
return true;
}
@@ -856,7 +857,7 @@ s32 func_80A3FFD0(EnTest3* this, PlayState* play2) {
}
} else {
SET_WEEKEVENTREG(WEEKEVENTREG_51_40);
- play->startPlayerCutscene(play, &this->player, 0x6E);
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_110);
}
return false;
}
@@ -867,7 +868,7 @@ s32 func_80A40098(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
u16 numWaypoints;
func_80A3F15C(this, play, arg2);
- this->unk_D7C = SubS_GetAdditionalPath(play, KAFEI_GET_PARAM_1F(&this->player.actor), ABS_ALT(arg2->unk_1_0) - 1);
+ this->unk_D7C = SubS_GetAdditionalPath(play, KAFEI_GET_PATH_INDEX(&this->player.actor), ABS_ALT(arg2->unk_1_0) - 1);
if ((this->unk_D88 < 7) && (this->unk_D88 != 0) && (this->unk_D80 >= 0)) {
startTime = now;
} else {
@@ -1018,8 +1019,8 @@ void func_80A40908(EnTest3* this, PlayState* play) {
func_80A3E7E0(this, func_80A4084C);
this->player.targetedActor = &GET_PLAYER(play)->actor;
SET_WEEKEVENTREG(WEEKEVENTREG_51_08);
- func_80151BB4(play, 0x19);
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
} else {
func_800B8500(&this->player.actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
this->unk_D78 = &D_80A41854[6];
@@ -1032,7 +1033,7 @@ void func_80A409D4(EnTest3* this, PlayState* play) {
if ((play->actorCtx.flags & ACTORCTX_FLAG_5) || (play->actorCtx.flags & ACTORCTX_FLAG_4)) {
play->actorCtx.flags &= ~ACTORCTX_FLAG_4;
func_80A3F0B0(this, play);
- ActorCutscene_SetReturnCamera(CAM_ID_MAIN);
+ CutsceneManager_SetReturnCamera(CAM_ID_MAIN);
} else {
sEnTest3_Input = *CONTROLLER1(&play->state);
}
@@ -1055,16 +1056,16 @@ void EnTest3_Update(Actor* thisx, PlayState* play2) {
this->player.actor.draw = EnTest3_Draw;
D_80A41D48 = false;
this->player.actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
- if (Cutscene_CheckActorAction(play, 0x1FA) &&
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_506) &&
!((this->player.actor.category == ACTORCAT_PLAYER) &&
((play->actorCtx.flags & ACTORCTX_FLAG_5) || (play->actorCtx.flags & ACTORCTX_FLAG_4)))) {
- if (this->player.csMode != 5) {
- play->startPlayerCutscene(play, &this->player, 5);
+ if (this->player.csMode != PLAYER_CSMODE_5) {
+ play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_5);
}
play->actorCtx.flags &= ~ACTORCTX_FLAG_4;
} else if (this->player.actor.category == ACTORCAT_PLAYER) {
func_80A409D4(this, play);
- } else if (play->startPlayerCutscene(play, &this->player, 0)) {
+ } else if (play->startPlayerCutscene(play, &this->player, PLAYER_CSMODE_0)) {
if (this->unk_D88 >= 7) {
Vec3f worldPos;
@@ -1103,7 +1104,7 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
pos->z *= this->player.ageProperties->unk_08;
}
if (!(this->player.skelAnime.moveFlags & ANIM_FLAG_4) ||
- (this->player.skelAnime.moveFlags & ANIM_FLAG_UPDATEY)) {
+ (this->player.skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y)) {
pos->y *= this->player.ageProperties->unk_08;
}
pos->y -= this->player.unk_AB8;
@@ -1123,9 +1124,9 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
*dList = NULL;
}
if (limbIndex == OBJECT_TEST3_LIMB_0B) {
- rot->x += this->player.unk_AAC.z;
- rot->y -= this->player.unk_AAC.y;
- rot->z += this->player.unk_AAC.x;
+ rot->x += this->player.headLimbRot.z;
+ rot->y -= this->player.headLimbRot.y;
+ rot->z += this->player.headLimbRot.x;
} else if (limbIndex == OBJECT_TEST3_LIMB_0A) {
s32 requiredScopeTemp;
@@ -1133,12 +1134,12 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
Matrix_RotateZS(0x44C, MTXMODE_APPLY);
Matrix_RotateYS(this->player.unk_AA8, MTXMODE_APPLY);
}
- if (this->player.unk_AB2.y != 0) {
- Matrix_RotateYS(this->player.unk_AB2.y, MTXMODE_APPLY);
+ if (this->player.upperLimbRot.y != 0) {
+ Matrix_RotateYS(this->player.upperLimbRot.y, MTXMODE_APPLY);
}
- Matrix_RotateXS(this->player.unk_AB2.x, MTXMODE_APPLY);
- if (this->player.unk_AB2.z != 0) {
- Matrix_RotateZS(this->player.unk_AB2.z, MTXMODE_APPLY);
+ Matrix_RotateXS(this->player.upperLimbRot.x, MTXMODE_APPLY);
+ if (this->player.upperLimbRot.z != 0) {
+ Matrix_RotateZS(this->player.upperLimbRot.z, MTXMODE_APPLY);
}
} else {
func_80125500(play, &this->player, limbIndex, pos, rot);
@@ -1163,7 +1164,9 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
func_80128640(play, &this->player, *dList1);
if (this->player.stateFlags3 & PLAYER_STATE3_20000000) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_test3_DL_00EDD0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1176,8 +1179,8 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
leftHandActor->world.rot.y = this->player.actor.shape.rot.y + this->player.leftHandWorld.rot.y;
leftHandActor->shape.rot.y = leftHandActor->world.rot.y;
} else {
- Matrix_Get(&this->player.mf_CC4);
- Matrix_MtxFToYXZRot(&this->player.mf_CC4, &this->player.leftHandWorld.rot, false);
+ Matrix_Get(&this->player.leftHandMf);
+ Matrix_MtxFToYXZRot(&this->player.leftHandMf, &this->player.leftHandWorld.rot, false);
func_80126B8C(play, &this->player);
}
@@ -1199,7 +1202,9 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
(this->player.skelAnime.curFrame >= 12.0f))) {
if (func_80127438(play, &this->player, this->player.currentMask)) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_mask_ki_tan_DL_0004A0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1212,17 +1217,19 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
Matrix_MultVec3f(&D_80A418CC, &this->player.actor.focus.pos);
}
} else if (limbIndex == OBJECT_TEST3_LIMB_15) {
- if (D_80A41D60 || CHECK_WEEKEVENTREG(WEEKEVENTREG_50_80) ||
+ if (D_80A41D60 || CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES) ||
(INV_CONTENT(ITEM_PENDANT_OF_MEMORIES) == ITEM_PENDANT_OF_MEMORIES) ||
- (this->player.getItemDrawId - 1 == GID_PENDANT_OF_MEMORIES)) {
+ (this->player.getItemDrawIdPlusOne - 1 == GID_PENDANT_OF_MEMORIES)) {
D_80A41D60 = true;
} else {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_test3_DL_00CB60);
+
CLOSE_DISPS(play->state.gfxCtx);
}
} else {
- func_80128B74(play, &this->player, limbIndex);
+ Player_SetFeetPos(play, &this->player, limbIndex);
}
}
@@ -1257,7 +1264,7 @@ void EnTest3_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C268(play);
+ func_8012C268(&play->state);
if (this->player.invincibilityTimer > 0) {
s32 temp2; // Must exist for stack order. Could hold the result of CLAMP instead.
@@ -1295,7 +1302,7 @@ void EnTest3_Draw(Actor* thisx, PlayState* play2) {
if (this->player.invincibilityTimer > 0) {
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
}
- if ((this->player.getItemDrawId - 1) != GID_NONE) {
+ if ((this->player.getItemDrawIdPlusOne - 1) != GID_NONE) {
Player_DrawGetItem(play, &this->player);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.h b/src/overlays/actors/ovl_En_Test3/z_en_test3.h
index a4f1ff659..17c704129 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.h
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.h
@@ -7,7 +7,7 @@ struct EnTest3;
typedef void (*EnTest3ActionFunc)(struct EnTest3*, PlayState*);
-#define KAFEI_GET_PARAM_1F(thisx) ((thisx)->params & 0x1F)
+#define KAFEI_GET_PATH_INDEX(thisx) ((thisx)->params & 0x1F)
#define KAFEI_GET_PARAM_1E0(thisx) (((thisx)->params >> 5) & 0xF)
typedef struct {
@@ -26,7 +26,7 @@ typedef struct EnTest3 {
/* 0xD89 */ u8 unk_D89;
/* 0xD8A */ s16 unk_D8A;
/* 0xD8C */ u8 unk_D8C;
- /* 0xD8D */ s8 unk_D8D;
+ /* 0xD8D */ s8 csId;
/* 0xD8E */ s16 subCamId;
/* 0xD90 */ Player* unk_D90;
/* 0xD94 */ EnTest3ActionFunc unk_D94;
diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
index 180bc59d4..fb18d4a39 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
@@ -4,8 +4,8 @@
* Description: Three-Day Events
*/
-#include "prevent_bss_reordering.h"
#include "z_en_test4.h"
+#include "z64horse.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
@@ -43,19 +43,19 @@ static s16 sNightMessages2[] = { 0x1BB4, 0x1BB5, 0x1BB6 };
static s16 sDayMessages2[] = { 0x1BB2, 0x1BB2, 0x1BB3 };
static u16 D_80A43364[] = { CLOCK_TIME(6, 0), CLOCK_TIME(18, 0) };
-static s16 sCutscenes[2];
-static s16 sCurrentCs;
+static s16 sCsIdList[2];
+static s16 sCurCsId;
void func_80A41D70(EnTest4* this, PlayState* play) {
- if (this->unk_144 != 0) {
+ if (this->csIdIndex != 0) {
func_80151A68(play, sNightMessages1[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ } else if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
Sram_IncrementDay();
gSaveContext.save.time = CLOCK_TIME(6, 0);
func_80151A68(play, sDayMessages1[CURRENT_DAY - 1]);
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE;
}
@@ -67,22 +67,22 @@ void func_80A41D70(EnTest4* this, PlayState* play) {
}
if (gSaveContext.cutsceneTrigger == 0) {
- if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if ((sCsIdList[this->csIdIndex] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
this->actionFunc = func_80A42F20;
- sCurrentCs = sCutscenes[this->unk_144];
+ sCurCsId = sCsIdList[this->csIdIndex];
this->transitionCsTimer = 0;
SET_EVENTINF(EVENTINF_17);
- } else if (this->unk_144 == 0) {
+ } else if (this->csIdIndex == 0) {
play_sound(NA_SE_EV_CHICKEN_CRY_M);
} else {
func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
}
} else {
this->actionFunc = func_80A42AB8;
- if (this->unk_144 == 0) {
- this->unk_144 = 1;
+ if (this->csIdIndex == 0) {
+ this->csIdIndex = 1;
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
}
this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE;
@@ -90,9 +90,9 @@ void func_80A41D70(EnTest4* this, PlayState* play) {
}
void func_80A41FA4(EnTest4* this, PlayState* play) {
- if (this->unk_144 != 0) {
+ if (this->csIdIndex != 0) {
func_80151A68(play, sNightMessages2[CURRENT_DAY - 1]);
- } else if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ } else if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
Sram_IncrementDay();
gSaveContext.save.time = CLOCK_TIME(6, 0);
Interface_NewDay(play, CURRENT_DAY);
@@ -104,22 +104,22 @@ void func_80A41FA4(EnTest4* this, PlayState* play) {
}
if (gSaveContext.cutsceneTrigger == 0) {
- if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if ((sCsIdList[this->csIdIndex] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
this->actionFunc = func_80A42F20;
- sCurrentCs = sCutscenes[this->unk_144];
+ sCurCsId = sCsIdList[this->csIdIndex];
this->transitionCsTimer = 0;
SET_EVENTINF(EVENTINF_17);
- } else if (this->unk_144 == 0) {
+ } else if (this->csIdIndex == 0) {
play_sound(NA_SE_EV_CHICKEN_CRY_M);
} else {
func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
}
} else {
this->actionFunc = func_80A42AB8;
- if (this->unk_144 == 0) {
- this->unk_144 = 1;
+ if (this->csIdIndex == 0) {
+ this->csIdIndex = 1;
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
}
this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE;
@@ -278,7 +278,7 @@ void func_80A425E4(EnTest4* this, PlayState* play) {
this->nextBellTime = CLOCK_TIME(17, 30);
}
- if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1) || (CURRENT_DAY == 3) ||
+ if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1) || (CURRENT_DAY == 3) ||
(gSaveContext.save.time >= CLOCK_TIME(17, 0))) {
gSaveContext.screenScale = 1000.0f;
}
@@ -292,17 +292,17 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
s32 dayTemp;
EnTest4* this = THIS;
Player* player = GET_PLAYER(play);
- s8 temp_v0 = this->actor.cutscene;
+ s8 csId = this->actor.csId;
- sCutscenes[0] = temp_v0;
- if (temp_v0 >= 0) {
- ActorCutscene* temp_v0_2 = ActorCutscene_GetCutscene(sCutscenes[0]);
+ sCsIdList[0] = csId;
+ if (csId >= 0) {
+ ActorCutscene* actorCutscene = CutsceneManager_GetCutsceneEntry(sCsIdList[0]);
SET_EVENTINF(EVENTINF_52);
- sCutscenes[1] = temp_v0_2->additionalCutscene;
+ sCsIdList[1] = actorCutscene->additionalCsId;
} else {
CLEAR_EVENTINF(EVENTINF_52);
- sCutscenes[1] = sCutscenes[0];
+ sCsIdList[1] = sCsIdList[0];
}
if (sIsLoaded || (CHECK_EVENTINF(EVENTINF_27))) {
@@ -318,29 +318,29 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
gSaveContext.gameMode = GAMEMODE_NORMAL;
STOP_GAMESTATE(&play->state);
SET_NEXT_GAMESTATE(&play->state, DayTelop_Init, sizeof(DayTelopState));
- this->unk_144 = 1;
+ this->csIdIndex = 1;
gSaveContext.save.time = CLOCK_TIME(6, 0);
Actor_Kill(&this->actor);
} else {
gSaveContext.save.day = 1;
dayTemp = gSaveContext.save.day;
gSaveContext.save.daysElapsed = dayTemp;
- this->unk_144 = 1;
+ this->csIdIndex = 1;
this->unk_146 = gSaveContext.save.time;
this->actionFunc = func_80A42AB8;
}
} else if (gSaveContext.save.time == CLOCK_TIME(6, 0)) {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
func_80A41D70(this, play);
- if ((gSaveContext.cutsceneTrigger == 0) && (sCutscenes[this->unk_144] >= 0) &&
+ if ((gSaveContext.cutsceneTrigger == 0) && (sCsIdList[this->csIdIndex] >= 0) &&
!(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
player->stateFlags1 |= PLAYER_STATE1_200;
}
} else {
if ((gSaveContext.save.time > CLOCK_TIME(18, 0)) || (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
} else {
- this->unk_144 = 1;
+ this->csIdIndex = 1;
}
this->unk_146 = gSaveContext.save.time;
this->actionFunc = func_80A42AB8;
@@ -354,7 +354,7 @@ void EnTest4_Init(Actor* thisx, PlayState* play) {
}
this->lastBellTime = gSaveContext.save.time;
- if ((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if ((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) {
gSaveContext.screenScaleFlag = false;
gSaveContext.screenScale = 1000.0f;
}
@@ -369,7 +369,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if ((play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play) && (play->numSetupActors <= 0) &&
(play->roomCtx.status == 0) && !Play_IsDebugCamEnabled()) {
s16 temp_a2;
- u16 temp_a0 = D_80A43364[this->unk_144];
+ u16 temp_a0 = D_80A43364[this->csIdIndex];
s16 temp_a3;
s16 bellDiff;
s16 new_var;
@@ -392,7 +392,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
Interface_StartMoonCrash(play);
Actor_Kill(&this->actor);
SET_EVENTINF(EVENTINF_17);
- } else if (((sCutscenes[this->unk_144] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) &&
+ } else if (((sCsIdList[this->csIdIndex] < 0) || (play->actorCtx.flags & ACTORCTX_FLAG_1)) &&
(CURRENT_DAY != 3)) {
func_80A41FA4(this, play);
} else {
@@ -405,9 +405,9 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if ((rideActor->type == HORSE_TYPE_EPONA) || (rideActor->type == HORSE_TYPE_2)) {
if (CURRENT_DAY < 3) {
- D_801BDA9C = 1;
+ gHorseIsMounted = true;
} else {
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
}
}
}
@@ -418,14 +418,14 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
}
}
- if ((sCutscenes[this->unk_144] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
+ if ((sCsIdList[this->csIdIndex] >= 0) && !(play->actorCtx.flags & ACTORCTX_FLAG_1)) {
player->stateFlags1 |= PLAYER_STATE1_200;
this->unk_146 = gSaveContext.save.time;
} else {
- if (this->unk_144 == 0) {
- this->unk_144 = 1;
+ if (this->csIdIndex == 0) {
+ this->csIdIndex = 1;
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
}
this->unk_146 = gSaveContext.save.time += CLOCK_TIME_MINUTE;
@@ -436,7 +436,7 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if (CURRENT_DAY == 3) {
if ((this->nextBellTime == CLOCK_TIME(0, 0)) &&
- ((gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) ||
+ ((gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) ||
(play->sceneId == SCENE_CLOCKTOWER))) {
s32 playerParams;
u32 entrance = gSaveContext.save.entrance;
@@ -470,11 +470,11 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
void func_80A42F20(EnTest4* this, PlayState* play) {
if (!this->transitionCsTimer) {
- if (sCurrentCs >= 0) {
- if (ActorCutscene_GetCanPlayNext(sCurrentCs) == 0) {
- ActorCutscene_SetIntentToPlay(sCurrentCs);
+ if (sCurCsId >= 0) {
+ if (!CutsceneManager_IsNext(sCurCsId)) {
+ CutsceneManager_Queue(sCurCsId);
} else {
- ActorCutscene_Start(sCurrentCs, &this->actor);
+ CutsceneManager_Start(sCurCsId, &this->actor);
this->transitionCsTimer = 1;
}
} else {
@@ -483,7 +483,7 @@ void func_80A42F20(EnTest4* this, PlayState* play) {
} else if (this->transitionCsTimer < 60) {
this->transitionCsTimer++;
if (this->transitionCsTimer == 10) {
- if (this->unk_144 == 0) {
+ if (this->csIdIndex == 0) {
play_sound(NA_SE_EV_CHICKEN_CRY_M);
} else {
func_8019F128(NA_SE_EV_DOG_CRY_EVENING);
@@ -499,14 +499,14 @@ void func_80A42F20(EnTest4* this, PlayState* play) {
}
} else {
this->actionFunc = func_80A42AB8;
- if (this->unk_144 == 0) {
- this->unk_144 = 1;
+ if (this->csIdIndex == 0) {
+ this->csIdIndex = 1;
} else {
- this->unk_144 = 0;
+ this->csIdIndex = 0;
}
- if (sCurrentCs >= 0) {
- ActorCutscene_Stop(sCurrentCs);
+ if (sCurCsId >= 0) {
+ CutsceneManager_Stop(sCurCsId);
}
gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.h b/src/overlays/actors/ovl_En_Test4/z_en_test4.h
index 0a372f245..106a5a9aa 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.h
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.h
@@ -9,7 +9,7 @@ typedef void (*EnTest4ActionFunc)(struct EnTest4*, PlayState*);
typedef struct EnTest4 {
/* 0x000 */ Actor actor;
- /* 0x144 */ s8 unk_144; // 0 on night, 1 on day
+ /* 0x144 */ s8 csIdIndex; // 0 on night, 1 on day
/* 0x145 */ u8 transitionCsTimer;
/* 0x146 */ u16 unk_146;
/* 0x148 */ u16 nextBellTime; // Next time the bell will sound
diff --git a/src/overlays/actors/ovl_En_Test5/z_en_test5.c b/src/overlays/actors/ovl_En_Test5/z_en_test5.c
index a041a1aaf..f7a9b431b 100644
--- a/src/overlays/actors/ovl_En_Test5/z_en_test5.c
+++ b/src/overlays/actors/ovl_En_Test5/z_en_test5.c
@@ -66,13 +66,13 @@ void EnTest5_HandleBottleAction(EnTest5* this, PlayState* play) {
player = GET_PLAYER(play);
- if (player->interactRangeActor == NULL || player->getItemId != GI_MAX) {
+ if ((player->interactRangeActor == NULL) || (player->getItemId != GI_MAX)) {
Math_Vec3f_DistXYZAndStoreDiff(&this->minPos, &player->actor.world.pos, &playerPosRelativeToWater);
// Make sure that the player is within the bounds of the water and deep enough to grab some
- if (playerPosRelativeToWater.x >= 0.0f && playerPosRelativeToWater.x <= this->xLength &&
- playerPosRelativeToWater.z >= 0.0f && playerPosRelativeToWater.z <= this->zLength &&
- fabsf(playerPosRelativeToWater.y) < 100.0f && player->actor.depthInWater > 12.0f) {
+ if ((playerPosRelativeToWater.x >= 0.0f) && (playerPosRelativeToWater.x <= this->xLength) &&
+ (playerPosRelativeToWater.z >= 0.0f) && (playerPosRelativeToWater.z <= this->zLength) &&
+ (fabsf(playerPosRelativeToWater.y) < 100.0f) && (player->actor.depthInWater > 12.0f)) {
Actor_OfferGetItem(&this->actor, play, GI_MAX, this->actor.xzDistToPlayer,
fabsf(this->actor.playerHeightRel));
}
@@ -89,10 +89,10 @@ void EnTest5_Update(Actor* thisx, PlayState* play2) {
this->actionFunc(this, play);
// If it's the hot spring variant, generate steam clouds
- if (ENTEST5_IS_HOT_SPRING(&this->actor) && (play->state.frames % 4) == 0) {
- steamPos.x = (Rand_ZeroOne() * this->xLength) + this->minPos.x;
+ if (ENTEST5_IS_HOT_SPRING(&this->actor) && ((play->state.frames % 4) == 0)) {
+ steamPos.x = this->minPos.x + (Rand_ZeroOne() * this->xLength);
steamPos.y = this->minPos.y + 100.0f;
- steamPos.z = (Rand_ZeroOne() * this->zLength) + this->minPos.z;
+ steamPos.z = this->minPos.z + (Rand_ZeroOne() * this->zLength);
if ((BgCheck_EntityRaycastFloor2(play, &play->colCtx, &poly, &steamPos) + 10.0f) < this->minPos.y) {
Vec3f steamVel;
@@ -102,8 +102,7 @@ void EnTest5_Update(Actor* thisx, PlayState* play2) {
steamVel.x = 0.0f;
steamVel.z = 0.0f;
- EffectSsIceSmoke_Spawn(play, &steamPos, &steamVel, &gZeroVec3f,
- (s16)((-200) - (s32)(Rand_ZeroOne() * 50.0f)));
+ EffectSsIceSmoke_Spawn(play, &steamPos, &steamVel, &gZeroVec3f, -200 - (s32)(Rand_ZeroOne() * 50.0f));
}
}
}
diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.c b/src/overlays/actors/ovl_En_Test6/z_en_test6.c
index 2b57ecf51..846d728dc 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c
@@ -7,6 +7,7 @@
#include "z_en_test6.h"
#include "z64quake.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+#include "z64cutscene_commands.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | ACTOR_FLAG_2000000)
@@ -54,30 +55,57 @@ ActorInit En_Test6_InitVars = {
(ActorFunc)EnTest6_Draw,
};
-u8 D_80A93E80[] = {
- 0x00, 0x0D, 0x01, 0xA8, 0x00, 0x00, 0x00, 0x64, 0x04, 0x64, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xED, 0x00,
- 0x00, 0x04, 0x64, 0x00, 0x12, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xED, 0x00, 0x00, 0x04, 0x64, 0x00, 0x10, 0x00, 0x00,
- 0x00, 0x15, 0xFF, 0xED, 0x00, 0x00, 0x04, 0x64, 0x00, 0x11, 0xFF, 0xE6, 0xFF, 0xFB, 0xFF, 0xE0, 0x00, 0x00, 0x04,
- 0x64, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xE0, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x16,
- 0xFF, 0xE5, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFB, 0x00, 0x00, 0x04, 0x64, 0x00,
- 0x07, 0x00, 0x10, 0x00, 0x1D, 0xFF, 0xB3, 0x00, 0x00, 0x04, 0x64, 0x00, 0x03, 0x00, 0x01, 0x00, 0x13, 0x00, 0x6F,
- 0x00, 0x00, 0x04, 0x64, 0x00, 0x03, 0xFF, 0xC5, 0x00, 0x15, 0x00, 0x5B, 0x00, 0x00, 0x04, 0x64, 0x00, 0x03, 0xFF,
- 0xED, 0x00, 0x3B, 0x00, 0x54, 0x00, 0x00, 0x04, 0x64, 0x00, 0x88, 0xFF, 0xED, 0x00, 0x3B, 0x00, 0x54, 0x00, 0x00,
- 0x04, 0x64, 0x00, 0x6C, 0xFF, 0xEF, 0x00, 0x39, 0x00, 0x52, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0D, 0x00, 0x00, 0x00,
- 0x32, 0x02, 0xA9, 0x00, 0x00, 0x04, 0x64, 0x00, 0x12, 0x00, 0x00, 0x00, 0x32, 0x02, 0xA9, 0x00, 0x00, 0x04, 0x64,
- 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x02, 0xA9, 0x00, 0x00, 0x04, 0x64, 0x00, 0x11, 0xFF, 0x98, 0x01, 0x77, 0x01,
- 0x59, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0xC2, 0x01, 0x21, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0E,
- 0xFF, 0xD1, 0x00, 0x7D, 0x00, 0xCD, 0x00, 0x00, 0x04, 0x64, 0x00, 0x0C, 0xFF, 0xC6, 0xFF, 0xEF, 0x00, 0xC7, 0x00,
- 0x00, 0x04, 0x64, 0x00, 0x07, 0x00, 0x10, 0x00, 0x35, 0x00, 0xD3, 0x00, 0x00, 0x04, 0x64, 0x00, 0x03, 0xFF, 0xE1,
- 0x00, 0x3F, 0x02, 0x6F, 0x00, 0x00, 0x04, 0x64, 0x00, 0x03, 0xFE, 0xAB, 0x01, 0xD0, 0x02, 0x1E, 0x00, 0x00, 0x04,
- 0x64, 0x00, 0x03, 0xFE, 0xAB, 0x01, 0xD0, 0x02, 0x1E, 0x00, 0x00, 0x04, 0x64, 0x00, 0x88, 0xFE, 0xAB, 0x01, 0xD0,
- 0x02, 0x1E, 0x00, 0x00, 0x04, 0x64, 0x00, 0x6C, 0xFE, 0xAD, 0x01, 0xCE, 0x02, 0x1C, 0x00, 0x00, 0x00, 0x0F, 0x00,
- 0x0A, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0A, 0x00, 0x46,
- 0x00, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xEC, 0x00, 0x37, 0x00, 0x00, 0x00,
- 0x10, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFB,
- 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xDC, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xD8, 0x00, 0x78, 0x00,
- 0x00, 0x00, 0x02, 0xFF, 0xC4, 0x00, 0x78, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xBA, 0x00, 0x82, 0x00, 0x00, 0x00, 0x02,
- 0xFF, 0xB0, 0x00, 0x8C, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x04,
+CutsceneData D_80A93E80[] = {
+ // Header
+ CS_CAM_SPLINE(13, 424, 0, 100),
+
+ // Camera At Data
+ /* 0x0 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 13, 0, 21, -19, CS_CAM_REL_0),
+ /* 0x1 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 18, 0, 21, -19, CS_CAM_REL_0),
+ /* 0x2 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 16, 0, 21, -19, CS_CAM_REL_0),
+ /* 0x3 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 17, -26, -5, -32, CS_CAM_REL_0),
+ /* 0x4 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 15, 0, 18, -32, CS_CAM_REL_0),
+ /* 0x5 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 14, 1, 22, -27, CS_CAM_REL_0),
+ /* 0x6 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 12, 0, 1, -5, CS_CAM_REL_0),
+ /* 0x7 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 7, 16, 29, -77, CS_CAM_REL_0),
+ /* 0x8 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, 1, 19, 111, CS_CAM_REL_0),
+ /* 0x9 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, -59, 21, 91, CS_CAM_REL_0),
+ /* 0xA */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, -19, 59, 84, CS_CAM_REL_0),
+ /* 0xB */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 136, -19, 59, 84, CS_CAM_REL_0),
+ /* 0xC */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 108, -17, 57, 82, CS_CAM_REL_0),
+
+ // Camera Eye Data
+ /* 0x0 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 13, 0, 50, 681, CS_CAM_REL_0),
+ /* 0x1 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 18, 0, 50, 681, CS_CAM_REL_0),
+ /* 0x2 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 16, 0, 50, 681, CS_CAM_REL_0),
+ /* 0x3 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 17, -104, 375, 345, CS_CAM_REL_0),
+ /* 0x4 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 15, 0, -62, 289, CS_CAM_REL_0),
+ /* 0x5 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 14, -47, 125, 205, CS_CAM_REL_0),
+ /* 0x6 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 12, -58, -17, 199, CS_CAM_REL_0),
+ /* 0x7 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 7, 16, 53, 211, CS_CAM_REL_0),
+ /* 0x8 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, -31, 63, 623, CS_CAM_REL_0),
+ /* 0x9 */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, -341, 464, 542, CS_CAM_REL_0),
+ /* 0xA */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 3, -341, 464, 542, CS_CAM_REL_0),
+ /* 0xB */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 136, -341, 464, 542, CS_CAM_REL_0),
+ /* 0xC */ CS_CAM_POINT(CS_CAM_INTERP_4, 100, 108, -339, 462, 540, CS_CAM_REL_0),
+
+ // Camera Roll and Fov Data
+ /* 0x0 */ CS_CAM_MISC(15, 0xA, 70, 0),
+ /* 0x1 */ CS_CAM_MISC(15, 0xA, 70, 0),
+ /* 0x2 */ CS_CAM_MISC(15, 0xA, 70, 0),
+ /* 0x3 */ CS_CAM_MISC(10, 0x2, 60, 0),
+ /* 0x4 */ CS_CAM_MISC(10, -0x14, 55, 0),
+ /* 0x5 */ CS_CAM_MISC(16, 0x0, 43, 0),
+ /* 0x6 */ CS_CAM_MISC(12, 0x6, 47, 0),
+ /* 0x7 */ CS_CAM_MISC(5, -0x5, 50, 0),
+ /* 0x8 */ CS_CAM_MISC(2, -0x24, 108, 0),
+ /* 0x9 */ CS_CAM_MISC(2, -0x28, 120, 0),
+ /* 0xA */ CS_CAM_MISC(2, -0x3C, 120, 0),
+ /* 0xB */ CS_CAM_MISC(2, -0x46, 130, 0),
+ /* 0xC */ CS_CAM_MISC(2, -0x50, 140, 0),
+
+ // Terminate
+ CS_CAM_END()
};
TexturePtr D_80A9402C[] = {
@@ -113,12 +141,12 @@ void func_80A90730(EnTest6* this, PlayState* play) {
case ENTEST6_24:
case ENTEST6_25:
func_80A91690(this, play);
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
return;
case ENTEST6_26:
func_80A920C8(this, play);
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
return;
}
@@ -212,7 +240,7 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
Matrix_Translate(ptr->unk_08 * ptr->unk_04, ptr->unk_0C, ptr->unk_10 * ptr->unk_04, MTXMODE_NEW);
Matrix_Scale(ptr->unk_04 * 0.02f, ptr->unk_04 * 0.02f, ptr->unk_04 * 0.02f, MTXMODE_APPLY);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A9402C[ptr->unk_00]));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -227,7 +255,7 @@ void func_80A90D34(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 210, 210, 230, 128);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
@@ -254,7 +282,7 @@ void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
OPEN_DISPS(play->state.gfxCtx);
if (gfxHead != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetTileSize(gfx++, 1, sp70->h.x1 & 0xFFFF, sp70->h.y1 & 0xFFFF, (sp70->h.x1 + 60) & 0xFFFF,
(sp70->h.y1 + 60) & 0xFFFF);
@@ -279,7 +307,7 @@ void func_80A90FC0(EnTest6* this, PlayState* play, EnTest6Struct* ptr) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 220, 220, 230, 192);
gDPSetEnvColor(POLY_XLU_DISP++, 128, 128, 128, 0);
@@ -301,7 +329,7 @@ void EnTest6_Init(Actor* thisx, PlayState* play2) {
if (((ENTEST6_GET(&this->actor) == ENTEST6_24) || (ENTEST6_GET(&this->actor) == ENTEST6_25) ||
(ENTEST6_GET(&this->actor) == ENTEST6_26)) &&
- (play->playerActorCsIds[8] == -1)) {
+ (play->playerCsIds[PLAYER_CS_ID_SONG_WARP] == CS_ID_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -313,7 +341,7 @@ void EnTest6_Init(Actor* thisx, PlayState* play2) {
}
this->unk_286 = 0;
- this->unk_274 = 0;
+ this->cueId = 0;
this->unk_278 = 0;
this->unk_276 = 99;
func_80A90730(this, play);
@@ -350,21 +378,21 @@ void func_80A9156C(EnTest6* this, PlayState* play) {
switch (ENTEST6_GET(&this->actor)) {
case ENTEST6_24:
case ENTEST6_25:
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[8], NULL);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
EnTest6_SetupAction(this, func_80A91760);
}
break;
case ENTEST6_26:
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[8], NULL);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
EnTest6_SetupAction(this, func_80A92188);
}
break;
@@ -379,7 +407,7 @@ void func_80A9156C(EnTest6* this, PlayState* play) {
}
void func_80A91690(EnTest6* this, PlayState* play) {
- this->unk_274 = 90;
+ this->cueId = 90;
this->unk_27A = 100;
this->unk_286 = 0;
if (ENTEST6_GET(&this->actor) == ENTEST6_25) {
@@ -394,10 +422,10 @@ void func_80A916F0(EnTest6* this, PlayState* play) {
player->actor.freezeTimer = 0;
play->unk_18844 = false;
- ActorCutscene_Stop(play->playerActorCsIds[8]);
- func_800B7298(play, NULL, PLAYER_CSMODE_6);
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
Actor_Kill(&this->actor);
}
@@ -415,14 +443,14 @@ void func_80A91760(EnTest6* this, PlayState* play) {
mainCam = Play_GetCamera(play, CAM_ID_MAIN);
- switch (this->unk_274) {
+ switch (this->cueId) {
case 90:
this->unk_276 = 2;
this->unk_15C = 0.0f;
this->unk_14C = 0.1f;
this->unk_282 = 0;
this->unk_278 = 0;
- this->unk_274 = 91;
+ this->cueId = 91;
break;
case 91:
@@ -463,10 +491,10 @@ void func_80A91760(EnTest6* this, PlayState* play) {
}
}
EnTest6_EnableMotionBlur(120);
- Distortion_SetType(DISTORTION_TYPE_5);
- Distortion_SetCountdown(80);
+ Distortion_Request(DISTORTION_TYPE_SONG_OF_TIME);
+ Distortion_SetDuration(80);
play->unk_18844 = true;
- this->unk_274 = 95;
+ this->cueId = 95;
}
break;
@@ -518,12 +546,12 @@ void func_80A91760(EnTest6* this, PlayState* play) {
if (this->unk_27A == 10) {
this->unk_14C = 0.1f;
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
play->unk_18844 = false;
if (this->unk_254 != NULL) {
ZeldaArena_Free(this->unk_254);
}
- this->unk_274 = 99;
+ this->cueId = 99;
}
break;
@@ -537,7 +565,7 @@ void func_80A91760(EnTest6* this, PlayState* play) {
}
if (this->unk_286 != 0) {
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
} else {
if (this->unk_27A == 90) {
func_800B7298(play, NULL, PLAYER_CSMODE_66);
@@ -615,10 +643,10 @@ void func_80A92118(EnTest6* this, PlayState* play) {
player->actor.freezeTimer = 0;
play->unk_18844 = false;
- ActorCutscene_Stop(play->playerActorCsIds[8]);
- func_800B7298(play, NULL, PLAYER_CSMODE_6);
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
EnTest6_DisableMotionBlur();
- Distortion_ClearType(DISTORTION_TYPE_5);
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
Actor_Kill(&this->actor);
}
@@ -685,9 +713,9 @@ void func_80A92188(EnTest6* this, PlayState* play) {
case 115:
EnTest6_EnableMotionBlur(20);
- Distortion_SetType(DISTORTION_TYPE_5);
- Distortion_SetCountdown(90);
- this->unk_274 = 2;
+ Distortion_Request(DISTORTION_TYPE_SONG_OF_TIME);
+ Distortion_SetDuration(90);
+ this->cueId = 2;
break;
case 110:
@@ -696,34 +724,34 @@ void func_80A92188(EnTest6* this, PlayState* play) {
case 38:
case 114:
- this->unk_274 = 1;
+ this->cueId = 1;
break;
case 76:
- this->unk_274 = 3;
+ this->cueId = 3;
break;
case 61:
EnTest6_EnableMotionBlur(150);
- this->unk_274 = 4;
+ this->cueId = 4;
break;
case 51:
EnTest6_EnableMotionBlur(180);
- this->unk_274 = 5;
+ this->cueId = 5;
break;
case 14:
case 15:
EnTest6_EnableMotionBlur(50);
- Distortion_ClearType(DISTORTION_TYPE_5);
- this->unk_274 = 0;
+ Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME);
+ this->cueId = 0;
break;
case 1:
EnTest6_DisableMotionBlur();
if (CHECK_EVENTINF(EVENTINF_52)) {
- this->unk_274 = 9;
+ this->cueId = 9;
}
break;
}
@@ -731,19 +759,19 @@ void func_80A92188(EnTest6* this, PlayState* play) {
func_80A92950(this, play);
if (this->unk_27A == 115) {
- subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
subCam = Play_GetCamera(play, subCamId);
this->subCamAt = subCam->at;
this->subCamEye = subCam->eye;
this->subCamFov = subCam->fov;
- func_8016119C(subCam, &this->unk_18C);
+ CutsceneCamera_Init(subCam, &this->unk_18C);
}
if ((this->unk_27A <= 115) && (this->unk_27A >= 16)) {
- func_80161998(D_80A93E80, &this->unk_18C);
+ CutsceneCamera_UpdateSplines((u8*)D_80A93E80, &this->unk_18C);
} else if (this->unk_27A < 16) {
- subCamId = ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]);
+ subCamId = CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
Play_SetCameraAtEyeUp(play, subCamId, &this->subCamAt, &this->subCamEye, &sSubCamUp);
Play_SetCameraFov(play, subCamId, this->subCamFov);
@@ -780,7 +808,7 @@ void func_80A92188(EnTest6* this, PlayState* play) {
break;
case 38:
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
break;
case 14:
@@ -825,13 +853,13 @@ void func_80A92950(EnTest6* this, PlayState* play) {
Player* player = GET_PLAYER(play);
f32 temp_f0;
s32 i;
- s32 temp_v0;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 0x1F9)) {
- temp_v0 = Cutscene_GetActorActionIndex(play, 0x1F9);
- this->unk_274 = play->csCtx.actorActions[temp_v0]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_505)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_505);
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
- switch (this->unk_274) {
+ switch (this->cueId) {
case 1:
break;
@@ -841,39 +869,39 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_27C = 0;
player->actor.shape.shadowDraw = NULL;
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 = (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_154 = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->unk_154 = 150.0f;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.y != 0) {
- this->unk_280 = play->csCtx.actorActions[temp_v0]->startPos.y;
+ if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
+ this->unk_280 = play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->unk_280 = 38;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.z != 0) {
- this->unk_150 = (u32)play->csCtx.actorActions[temp_v0]->startPos.z;
+ if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
+ this->unk_150 = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->unk_150 = 480.0f;
}
break;
case 3:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_154 += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.y != 0) {
- this->unk_280 += (s16)play->csCtx.actorActions[temp_v0]->startPos.y;
+ if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
+ this->unk_280 += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->unk_280 += 6;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.z != 0) {
- this->unk_158 = (u32)play->csCtx.actorActions[temp_v0]->startPos.z;
+ if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
+ this->unk_158 = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->unk_158 = -32.0f;
}
@@ -881,30 +909,30 @@ void func_80A92950(EnTest6* this, PlayState* play) {
break;
case 4:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_154 += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.y != 0) {
- this->unk_280 += (s16)play->csCtx.actorActions[temp_v0]->startPos.y;
+ if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
+ this->unk_280 += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->unk_280 -= 4;
}
break;
case 5:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_154 += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.y != 0) {
- this->unk_280 += (s16)play->csCtx.actorActions[temp_v0]->startPos.y;
+ if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
+ this->unk_280 += (s16)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->unk_280 -= 8;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.z != 0) {
- this->unk_158 += (u32)play->csCtx.actorActions[temp_v0]->startPos.z;
+ if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
+ this->unk_158 += (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->unk_158 += 20.0f;
}
@@ -912,7 +940,7 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_150 += this->unk_158;
if (this->unk_150 > 3500.0f) {
this->unk_150 = 3500.0f;
- this->unk_274 = 0;
+ this->cueId = 0;
}
break;
@@ -922,20 +950,20 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_27C = 0;
player->actor.shape.shadowDraw = NULL;
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_154 = (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_154 = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->unk_154 = 100.0f;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.y != 0) {
- this->unk_14C = (u32)play->csCtx.actorActions[temp_v0]->startPos.y;
+ if (play->csCtx.actorCues[cueChannel]->startPos.y != 0) {
+ this->unk_14C = (u32)play->csCtx.actorCues[cueChannel]->startPos.y;
} else {
this->unk_14C = 20.0f;
}
- if (play->csCtx.actorActions[temp_v0]->startPos.z != 0) {
- this->unk_150 = (u32)play->csCtx.actorActions[temp_v0]->startPos.z;
+ if (play->csCtx.actorCues[cueChannel]->startPos.z != 0) {
+ this->unk_150 = (u32)play->csCtx.actorCues[cueChannel]->startPos.z;
} else {
this->unk_150 = 300.0f;
}
@@ -943,8 +971,8 @@ void func_80A92950(EnTest6* this, PlayState* play) {
break;
case 7:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_158 = (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_158 = (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->unk_158 = -5.0f;
}
@@ -952,8 +980,8 @@ void func_80A92950(EnTest6* this, PlayState* play) {
break;
case 8:
- if (play->csCtx.actorActions[temp_v0]->startPos.x != 0) {
- this->unk_158 += (u32)play->csCtx.actorActions[temp_v0]->startPos.x;
+ if (play->csCtx.actorCues[cueChannel]->startPos.x != 0) {
+ this->unk_158 += (u32)play->csCtx.actorCues[cueChannel]->startPos.x;
} else {
this->unk_158 += 2.0f;
}
@@ -961,7 +989,7 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_154 += this->unk_158;
if (this->unk_154 > 10000.0f) {
this->unk_154 = 10000.0f;
- this->unk_274 = 0;
+ this->cueId = 0;
}
break;
@@ -987,7 +1015,7 @@ void func_80A92950(EnTest6* this, PlayState* play) {
return;
}
} else {
- switch (this->unk_274) {
+ switch (this->cueId) {
case 2:
this->unk_276 = 0;
this->unk_278 = 0;
@@ -1016,7 +1044,7 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_150 += this->unk_158;
if (this->unk_150 > 3500.0f) {
this->unk_150 = 3500.0f;
- this->unk_274 = 0;
+ this->cueId = 0;
}
break;
@@ -1041,7 +1069,7 @@ void func_80A92950(EnTest6* this, PlayState* play) {
this->unk_154 += this->unk_158;
if (this->unk_154 > 10000.0f) {
this->unk_154 = 10000.0f;
- this->unk_274 = 0;
+ this->cueId = 0;
}
break;
@@ -1166,6 +1194,7 @@ void func_80A9369C(Actor* thisx, PlayState* play2) {
s32 pad;
if (this) {}
+
OPEN_DISPS(play->state.gfxCtx);
this->unk_148 = POLY_OPA_DISP;
@@ -1231,7 +1260,7 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- switch (this->unk_274) {
+ switch (this->cueId) {
case 91:
case 93:
Lights_PointSetPosition(&this->lights[0].info, player->actor.world.pos.x, player->actor.world.pos.y - 10.0f,
@@ -1267,7 +1296,7 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 128, 128, 128, this->unk_282 >> 1);
gDPSetEnvColor(POLY_XLU_DISP++, 230, 230, 180, this->unk_282);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZS(this->unk_278 + (i << 2), MTXMODE_APPLY);
@@ -1297,7 +1326,7 @@ void func_80A939E8(EnTest6* this, PlayState* play2) {
void EnTest6_Draw(Actor* thisx, PlayState* play) {
EnTest6* this = THIS;
- if (this->unk_274 != 0) {
+ if (this->cueId != 0) {
switch (this->unk_276) {
case 1:
func_80A93298(this, play);
diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.h b/src/overlays/actors/ovl_En_Test6/z_en_test6.h
index ec06afb91..2fe138ddb 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.h
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.h
@@ -9,11 +9,11 @@ typedef void (*EnTest6ActionFunc)(struct EnTest6*, PlayState*);
#define ENTEST6_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 24 */ ENTEST6_24 = 24,
/* 25 */ ENTEST6_25,
- /* 26 */ ENTEST6_26,
-};
+ /* 26 */ ENTEST6_26
+} EnTest6Param;
typedef struct {
/* 0x00 */ LightNode* node;
@@ -31,13 +31,13 @@ typedef struct EnTest6 {
/* 0x15C */ f32 unk_15C;
/* 0x160 */ f32 unk_160;
/* 0x164 */ EnTest6Light lights[2];
- /* 0x18C */ DbCameraUnkStruct unk_18C;
+ /* 0x18C */ CutsceneCamera unk_18C;
/* 0x20C */ Vec3f unk_20C[6];
/* 0x254 */ Vec3f (*unk_254)[64];
/* 0x258 */ Vec3f subCamAt;
/* 0x264 */ Vec3f subCamEye;
/* 0x270 */ f32 subCamFov;
- /* 0x274 */ s16 unk_274;
+ /* 0x274 */ s16 cueId;
/* 0x276 */ s16 unk_276;
/* 0x278 */ s16 unk_278;
/* 0x27A */ s16 unk_27A;
diff --git a/src/overlays/actors/ovl_En_Test7/z_en_test7.c b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
index 56b6c6f81..2606331e2 100644
--- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c
+++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
@@ -4,6 +4,7 @@
* Description: Soaring effects (wings, sphere, etc)
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test7.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -330,7 +331,7 @@ void func_80AF14FC(PlayState* play2, EnTest7Struct2* arg1) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C1C0(play->state.gfxCtx);
+ Gfx_SetupDL26_Opa(play->state.gfxCtx);
Matrix_Push();
@@ -412,12 +413,12 @@ void EnTest7_Init(Actor* thisx, PlayState* play2) {
Audio_PlayBgm_StorePrevBgm(NA_BGM_SONG_OF_SOARING);
}
- if (play->playerActorCsIds[8] == -1) {
+ if (play->playerCsIds[PLAYER_CS_ID_SONG_WARP] == CS_ID_NONE) {
Actor_Kill(&this->actor);
return;
}
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
player2->stateFlags1 |= PLAYER_STATE1_20;
Lights_PointNoGlowSetInfo(&this->lightInfo, (Math_SinS(this->unk_1E8E) * 90.0f) + player->actor.world.pos.x,
player->actor.world.pos.y + 10.0f,
@@ -428,15 +429,15 @@ void EnTest7_Init(Actor* thisx, PlayState* play2) {
void EnTest7_Destroy(Actor* thisx, PlayState* play) {
EnTest7* this = THIS;
- ActorCutscene_Stop(play->playerActorCsIds[8]);
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
LightContext_RemoveLight(play, &play->lightCtx, this->lightNode);
}
void func_80AF19A8(EnTest7* this, PlayState* play) {
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[8], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
func_80AF082C(this, func_80AF1A2C);
play->unk_18844 = true;
}
@@ -452,7 +453,8 @@ void func_80AF1A2C(EnTest7* this, PlayState* play) {
func_800FD698(play, 2000, 4000, sp2C);
if (this->unk_1E54 >= 10) {
- Camera* subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ Camera* subCam =
+ Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
this->subCamEye = subCam->eye;
this->subCamAt = subCam->at;
@@ -514,7 +516,8 @@ void func_80AF1CA0(EnTest7* this, PlayState* play) {
}
if (Rand_ZeroOne() < 0.3f) {
- Camera* subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ Camera* subCam =
+ Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
f32 rand = Rand_ZeroOne();
sp34.x = ((subCam->eye.x - this->actor.world.pos.x) * rand) + this->actor.world.pos.x;
@@ -537,7 +540,7 @@ void func_80AF1E44(EnTest7* this, PlayState* play) {
func_80AF1B68(this, play);
if (Rand_ZeroOne() < 0.3f) {
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
rand = Rand_ZeroOne();
sp34.x = ((subCam->eye.x - this->actor.world.pos.x) * rand) + this->actor.world.pos.x;
sp34.y = ((subCam->eye.y - this->actor.world.pos.y) * rand) + this->actor.world.pos.y;
@@ -585,7 +588,7 @@ void func_80AF2030(EnTest7* this, PlayState* play) {
this->unk_148.unk_10 -= 0x2EE0;
this->actor.world.pos.y += 100.0f;
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
subCam->focalActor = NULL;
subCam->eye.x = ((subCam->eye.x - this->subCamEye.x) * sp1C) + this->subCamEye.x;
@@ -667,10 +670,11 @@ void func_80AF2350(EnTest7* this, PlayState* play) {
gSaveContext.respawnFlag = -6;
} else {
play->nextEntrance = D_80AF343C[ENTEST7_GET(&this->actor) - ENTEST7_1C];
- if ((play->nextEntrance == ENTRANCE(SOUTHERN_SWAMP_POISONED, 10)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if ((play->nextEntrance == ENTRANCE(SOUTHERN_SWAMP_POISONED, 10)) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_CLEARED, 10);
} else if ((play->nextEntrance == ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 8)) &&
- CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80)) {
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
play->nextEntrance = ENTRANCE(MOUNTAIN_VILLAGE_SPRING, 8);
}
}
@@ -685,7 +689,8 @@ void func_80AF24D8(EnTest7* this, PlayState* play, f32 arg2) {
Vec3f sp3C;
Vec3f* pos;
Player* player = GET_PLAYER(play);
- Camera* subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ Camera* subCam =
+ Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
pos = &player->actor.world.pos;
subCam->focalActor = NULL;
@@ -708,7 +713,7 @@ void func_80AF2654(EnTest7* this, PlayState* play, f32 arg2) {
Camera* subCam;
Vec3f sp30;
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
subCam->focalActor = NULL;
pos = &player->actor.world.pos;
@@ -777,7 +782,8 @@ void func_80AF29C0(EnTest7* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
Vec3f* pos = &player->actor.world.pos;
- Camera* subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ Camera* subCam =
+ Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
subCam->at.x = ((D_80AF3454 * Math_SinS(D_80AF3450[0]) * Math_CosS(D_80AF3450[1]))) + pos->x;
subCam->at.y = (Math_SinS(D_80AF3450[1]) * D_80AF3454) + pos->y;
@@ -791,15 +797,15 @@ void func_80AF29C0(EnTest7* this, PlayState* play) {
void func_80AF2AE8(EnTest7* this, PlayState* play) {
Camera* subCam;
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
return;
}
- ActorCutscene_Start(play->playerActorCsIds[8], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
func_80AF082C(this, func_80AF2C48);
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
this->subCamEye = subCam->eye;
this->subCamAt = subCam->at;
@@ -810,7 +816,8 @@ void func_80AF2BAC(EnTest7* this, PlayState* play, Vec3f* arg2, f32 arg3) {
f32 x;
f32 y;
f32 z;
- Camera* subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ Camera* subCam =
+ Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
subCam->focalActor = NULL;
x = ((subCam->at.x - arg2->x) * arg3) + arg2->x;
@@ -836,7 +843,7 @@ void func_80AF2C48(EnTest7* this, PlayState* play) {
this->actor.world.pos.y = ((this->actor.world.pos.y - this->actor.home.pos.y) * sp24) + this->actor.home.pos.y;
this->actor.world.pos.z = ((this->actor.world.pos.z - this->actor.home.pos.z) * sp24) + this->actor.home.pos.z;
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
func_80AF2BAC(this, play, &this->actor.home.pos, sp24);
subCam->at.x = this->actor.world.pos.x;
@@ -855,7 +862,7 @@ void func_80AF2DB4(EnTest7* this, PlayState* play) {
Player* player = GET_PLAYER(play);
Vec3f* pos = &player->actor.world.pos;
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
subCam->eye.x = (Math_SinS(-player->actor.shape.rot.y) * 200.0f * -0.83907f) + pos->x;
subCam->eye.y = pos->y + 108.8042f;
@@ -869,13 +876,13 @@ void func_80AF2DB4(EnTest7* this, PlayState* play) {
void func_80AF2EC8(EnTest7* this, PlayState* play) {
Camera* subCam;
- if (!ActorCutscene_GetCanPlayNext(play->playerActorCsIds[8])) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[8]);
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_SONG_WARP])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]);
} else {
- ActorCutscene_Start(play->playerActorCsIds[8], NULL);
+ CutsceneManager_Start(play->playerCsIds[PLAYER_CS_ID_SONG_WARP], NULL);
func_80AF082C(this, func_80AF2F98);
- subCam = Play_GetCamera(play, ActorCutscene_GetCurrentSubCamId(play->playerActorCsIds[8]));
+ subCam = Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]));
this->subCamEye = subCam->eye;
this->subCamAt = subCam->at;
this->unk_1E54 = 40;
diff --git a/src/overlays/actors/ovl_En_Tg/z_en_tg.c b/src/overlays/actors/ovl_En_Tg/z_en_tg.c
index 0b7a5c3f3..0672bd4bf 100644
--- a/src/overlays/actors/ovl_En_Tg/z_en_tg.c
+++ b/src/overlays/actors/ovl_En_Tg/z_en_tg.c
@@ -162,7 +162,7 @@ void EnTg_Update(Actor* thisx, PlayState* play) {
EnTg* this = THIS;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnTg_UpdateSkelAnime(this, play);
EnTg_UpdateHearts(play, this->effects, ARRAY_COUNT(this->effects));
EnTg_UpdateCollider(this, play);
@@ -190,7 +190,8 @@ void EnTg_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, 0, 50, 160, 0));
@@ -260,7 +261,7 @@ void EnTg_DrawHearts(PlayState* play, EnTgHeartEffect* effect, s32 numEffects) {
OPEN_DISPS(play->state.gfxCtx);
POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP);
- POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP);
+ POLY_OPA_DISP = Gfx_SetupDL66(POLY_OPA_DISP);
for (i = 0; i < numEffects; i++, effect++) {
if (effect->isEnabled == true) {
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 674059f1a..87589ae8c 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -7,7 +7,7 @@
#include "prevent_bss_reordering.h"
#include "z_en_thiefbird.h"
-#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_1000 | ACTOR_FLAG_80000000)
+#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000)
#define THIS ((EnThiefbird*)thisx)
@@ -193,12 +193,12 @@ void func_80C10984(EnThiefbird* this, s32 arg1) {
for (i = 0; i < ARRAY_COUNT(this->unk_3F0); i++, ptr++) {
if (ptr->unk_22 == 0) {
ptr->unk_22 = (s32)Rand_ZeroFloat(20.0f) + 40;
- ptr->unk_00.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.x;
- ptr->unk_00.y = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.y;
- ptr->unk_00.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.z;
- ptr->unk_0C.x = randPlusMinusPoint5Scaled(5.0f);
+ ptr->unk_00.x = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.x;
+ ptr->unk_00.y = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.y;
+ ptr->unk_00.z = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.z;
+ ptr->unk_0C.x = Rand_CenteredFloat(5.0f);
ptr->unk_0C.y = Rand_ZeroOne() + 2.0f;
- ptr->unk_0C.z = randPlusMinusPoint5Scaled(5.0f);
+ ptr->unk_0C.z = Rand_CenteredFloat(5.0f);
ptr->unk_1C = Rand_ZeroFloat(1000.0f);
ptr->unk_18 = (Rand_ZeroFloat(20.0f) + 40.0f) * 0.0001f;
ptr->unk_1E = (s32)Rand_Next() >> 0x10;
@@ -223,10 +223,10 @@ s32 func_80C10B0C(EnThiefbird* this, PlayState* play) {
s16 itemId2 = 0;
for (; slotId < 24; slotId++) {
- if ((gSaveContext.save.inventory.items[slotId] >= ITEM_BOTTLE) &&
- (gSaveContext.save.inventory.items[slotId] <= ITEM_POTION_BLUE)) {
+ if ((gSaveContext.save.saveInfo.inventory.items[slotId] >= ITEM_BOTTLE) &&
+ (gSaveContext.save.saveInfo.inventory.items[slotId] <= ITEM_POTION_BLUE)) {
isItemFound = true;
- itemId2 = gSaveContext.save.inventory.items[slotId];
+ itemId2 = gSaveContext.save.saveInfo.inventory.items[slotId];
break;
}
}
@@ -343,7 +343,7 @@ s32 func_80C10E98(PlayState* play) {
spAC = 0;
}
- sp98 = (gSaveContext.save.playerData.rupees / 4) * 3;
+ sp98 = (gSaveContext.save.saveInfo.playerData.rupees / 4) * 3;
phi_s0_2 = sp98 / 50;
sp5C = (-spB0 - spAC);
sp5C += 8;
@@ -1020,7 +1020,8 @@ void EnThiefbird_Update(Actor* thisx, PlayState* play2) {
Actor_MoveWithGravity(&this->actor);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 25.0f, 50.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 25.0f, 50.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
if (this->actionFunc == func_80C1193C) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
@@ -1127,7 +1128,7 @@ void func_80C13354(EnThiefbird* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
gSPDisplayList(&gfx[1], gTakkuriFeatherMaterialDL);
gfx = &gfx[2];
@@ -1153,7 +1154,7 @@ void func_80C13354(EnThiefbird* this, PlayState* play2) {
void EnThiefbird_Draw(Actor* thisx, PlayState* play) {
EnThiefbird* this = THIS;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnThiefbird_OverrideLimbDraw, EnThiefbird_PostLimbDraw, &this->actor);
if (this->actor.colorFilterTimer > 0) {
diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
index c0ae22fd5..dfcd1bad0 100644
--- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
+++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
@@ -98,8 +98,8 @@ void EnTimeTag_RooftopOath_DoNothing(EnTimeTag* this, PlayState* play) {
}
void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = EnTimeTag_RooftopOath_DoNothing;
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
@@ -109,17 +109,17 @@ void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_25_02);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play) {
- EnTimeTag* this2 = this;
+ Actor* thisx = &this->actor;
if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) {
- if (this->actor.cutscene != -1) {
+ if (thisx->csId != CS_ID_NONE) {
this->actionFunc = EnTimeTag_RooftopOath_Cutscene;
- ActorCutscene_SetIntentToPlay(this2->actor.cutscene);
+ CutsceneManager_Queue(thisx->csId);
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
}
play->msgCtx.ocarinaMode = 4;
@@ -127,7 +127,7 @@ void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play) {
}
void EnTimeTag_SoaringEngraving_GetSong(EnTimeTag* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
this->actionFunc = EnTimeTag_SoaringEngraving_Wait;
this->actor.textId = 0xC02;
Item_Give(play, ITEM_SONG_SOARING);
@@ -135,14 +135,14 @@ void EnTimeTag_SoaringEngraving_GetSong(EnTimeTag* this, PlayState* play) {
}
void EnTimeTag_SoaringEngraving_StartCutscene(EnTimeTag* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
this->actionFunc = EnTimeTag_SoaringEngraving_GetSong;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -211,8 +211,8 @@ void EnTimeTag_Diary_Cutscene(EnTimeTag* this, PlayState* play) {
case 0x1230: // Mikau diary part 4
Message_CloseTextbox(play);
this->actionFunc = EnTimeTag_Diary_Wait;
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
+ CutsceneManager_Stop(this->actor.csId);
}
break;
@@ -240,16 +240,16 @@ void EnTimeTag_Diary_Cutscene(EnTimeTag* this, PlayState* play) {
}
if (TIMETAG_DIARY_TIMER(&this->actor) != 0) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
TIMETAG_DIARY_TIMER(&this->actor) = 0;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
TIMETAG_DIARY_TIMER(&this->actor) = 0;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -301,7 +301,7 @@ void EnTimeTag_KickOut_Transition(EnTimeTag* this, PlayState* play) {
*/
void EnTimeTag_KickOut_WaitForTrigger(EnTimeTag* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Message_StartTextbox(play, 0x1883 + TIMETAG_KICKOUT_GET_TEXT(&this->actor), NULL);
this->actionFunc = EnTimeTag_KickOut_Transition;
}
@@ -334,7 +334,7 @@ void EnTimeTag_KickOut_WaitForTime(EnTimeTag* this, PlayState* play) {
}
} else if ((hour == TIMETAG_KICKOUT_HOUR(&this->actor)) && (minute == TIMETAG_KICKOUT_MINUTE(&this->actor)) &&
!Play_InCsMode(play)) {
- func_800B7298(play, &this->actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Message_StartTextbox(play, 0x1883 + TIMETAG_KICKOUT_GET_TEXT(&this->actor), NULL);
this->actionFunc = EnTimeTag_KickOut_Transition;
}
diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
index 128e01973..c022ca122 100644
--- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
+++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
@@ -56,7 +56,7 @@ typedef enum {
/* 13 */ TIMETAG_KICKOUT_TEXT_TOWN_SHOOTING_GALLERY_2, // quick, it's closing time
/* 14 */ TIMETAG_KICKOUT_TEXT_SWORDSMANS_SCHOOL, // need to cut the moon, must leave
/* 15 */ TIMETAG_KICKOUT_TEXT_TREASURE_CHEST_SHOP, // already time to close shop
- /* 16 */ TIMETAG_KICKOUT_TEXT_DOGGY_RACETRACK, // no more for today
+ /* 16 */ TIMETAG_KICKOUT_TEXT_DOGGY_RACETRACK // no more for today
} TimeTagKickOutText;
typedef struct EnTimeTag {
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 f6a5b1ae4..1ae0e073b 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -147,7 +147,8 @@ void EnTite_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Collider_InitAndSetSphere(play, &this->collider, &this->actor, &sSphereInit);
this->collider.dim.worldSphere.radius = sSphereInit.dim.modelSphere.radius;
- this->unk_2C0 = 0x1D;
+ this->updBgCheckInfoFlags =
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10;
if (!D_80896B60) {
for (i = 0; i < ARRAY_COUNT(D_80896B24); i++) {
@@ -178,7 +179,7 @@ void EnTite_Init(Actor* thisx, PlayState* play) {
}
if (this->actor.params == ENTITE_MINUS_2) {
- this->unk_2C0 |= 0x40;
+ this->updBgCheckInfoFlags |= UPDBGCHECKINFO_FLAG_40;
this->actor.colChkInfo.health = 3;
}
}
@@ -196,7 +197,7 @@ void func_80893A18(EnTite* this) {
s32 func_80893A34(EnTite* this, PlayState* play) {
if ((this->actor.params == ENTITE_MINUS_2) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
- (func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 5)) {
+ (SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == FLOOR_TYPE_5)) {
return true;
}
return false;
@@ -239,21 +240,22 @@ void func_80893BCC(EnTite* this, PlayState* play) {
s32 j;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- u32 surface = func_800C9BB8(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ SurfaceMaterial surfaceMaterial =
+ SurfaceType_GetMaterial(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- if ((surface == COLPOLY_SURFACE_GROUND) || (surface == COLPOLY_SURFACE_SAND)) {
+ if ((surfaceMaterial == SURFACE_MATERIAL_DIRT) || (surfaceMaterial == SURFACE_MATERIAL_SAND)) {
for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
func_800BBFB0(play, &this->limbPos[i], 1.0f, 2, 80, 15, 1);
}
- } else if (surface == COLPOLY_SURFACE_SNOW) {
+ } else if (surfaceMaterial == SURFACE_MATERIAL_SNOW) {
Vec3f* ptr;
for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
for (j = 0; j < 2; j++) {
ptr = &this->limbPos[i];
- sp7C.x = ptr->x + randPlusMinusPoint5Scaled(1.0f);
- sp7C.y = ptr->y + randPlusMinusPoint5Scaled(1.0f);
- sp7C.z = ptr->z + randPlusMinusPoint5Scaled(1.0f);
+ sp7C.x = ptr->x + Rand_CenteredFloat(1.0f);
+ sp7C.y = ptr->y + Rand_CenteredFloat(1.0f);
+ sp7C.z = ptr->z + Rand_CenteredFloat(1.0f);
func_800B0DE0(play, &sp7C, &gZeroVec3f, &D_80896B64, &D_80896B3C, &D_80896B40,
(s32)Rand_ZeroFloat(16.0f) + 80, 15);
}
@@ -806,9 +808,9 @@ void func_80895738(EnTite* this, PlayState* play) {
void func_8089595C(EnTite* this, PlayState* play) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(20.0f) + this->actor.world.pos.x;
+ sp2C.x = Rand_CenteredFloat(20.0f) + this->actor.world.pos.x;
sp2C.y = this->actor.world.pos.y + 15.0f;
- sp2C.z = randPlusMinusPoint5Scaled(20.0f) + this->actor.world.pos.z;
+ sp2C.z = Rand_CenteredFloat(20.0f) + this->actor.world.pos.z;
func_800B0DE0(play, &sp2C, &gZeroVec3f, &D_80896B44, &D_80896B3C, &D_80896B40, 500, 50);
}
@@ -1062,7 +1064,7 @@ void EnTite_Update(Actor* thisx, PlayState* play) {
if (this->actionFunc != func_808951B8) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 40.0f, 20.0f, this->unk_2C0);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 25.0f, 40.0f, 20.0f, this->updBgCheckInfoFlags);
func_808963B4(this, play);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
func_800BE3D0(&this->actor, this->actor.shape.rot.y, &this->actor.shape.rot);
@@ -1159,9 +1161,10 @@ void EnTite_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
if (this->actor.params == ENTITE_MINUS_2) {
gSPSegment(&gfx[1], 0x08, D_80896B24[0][0]);
diff --git a/src/overlays/actors/ovl_En_Tite/z_en_tite.h b/src/overlays/actors/ovl_En_Tite/z_en_tite.h
index 4b87634a3..af77f4a8d 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.h
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.h
@@ -7,13 +7,13 @@ struct EnTite;
typedef void (*EnTiteActionFunc)(struct EnTite*, PlayState*);
-enum {
+typedef enum {
/* -4 */ ENTITE_MINUS_4 = -4,
/* -3 */ ENTITE_MINUS_3,
/* -2 */ ENTITE_MINUS_2,
/* -1 */ ENTITE_MINUS_1,
- /* 0 */ ENTITE_MINUS_0,
-};
+ /* 0 */ ENTITE_MINUS_0
+} EnTiteParam;
typedef struct EnTite {
/* 0x000 */ Actor actor;
@@ -27,7 +27,7 @@ typedef struct EnTite {
/* 0x2BB */ u8 drawDmgEffType;
/* 0x2BC */ s16 unk_2BC;
/* 0x2BE */ s16 unk_2BE;
- /* 0x2C0 */ s32 unk_2C0;
+ /* 0x2C0 */ s32 updBgCheckInfoFlags;
/* 0x2C4 */ f32 drawDmgEffAlpha;
/* 0x2C8 */ f32 drawDmgEffScale;
/* 0x2CC */ f32 drawDmgEffFrozenSteamScale;
diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
index dd122ed8c..469e07e6d 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -130,9 +130,9 @@ static f32 D_80AEF8F0[] = {
};
typedef struct {
- /* 0x00 */ Actor* unk_00;
- /* 0x04 */ f32 unk_04;
-} EnTkStruct; // size = 0x8?
+ /* 0x0 */ Actor* unk_00;
+ /* 0x4 */ f32 unk_04;
+} EnTkStruct; // size = 0x8
void func_80AEC460(EnTk* this) {
if (DECR(this->unk_2C4) == 0) {
@@ -247,7 +247,7 @@ void EnTk_Init(Actor* thisx, PlayState* play) {
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actor.flags |= ACTOR_FLAG_10;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 0, &this->unk_2D4);
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
switch (this->unk_2B0) {
case 4:
@@ -471,7 +471,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) {
if ((door != NULL) && (this->unk_2CA & 0x400)) {
Vec3f sp5C;
- Actor_OffsetOfPointInActorCoords(&this->actor, &sp5C, &door->dyna.actor.world.pos);
+ Actor_OffsetOfPointInActorCoords(&this->actor, &sp5C, &door->knobDoor.dyna.actor.world.pos);
door->unk_1A7 = 2;
if (sp5C.z < -20.0f) {
this->unk_2CA &= ~0x400;
@@ -503,12 +503,12 @@ s32 func_80AED354(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp1E = SCHEDULE_TIME_NOW;
- u8 params = ENTK_GET_F800(&this->actor);
+ u8 pathIndex = ENTK_GET_PATH_INDEX(&this->actor);
u16 phi_a1;
s32 index = scheduleOutput->result - 1;
u16 tmp;
- this->timePath = SubS_GetAdditionalPath(play, params, D_80AEF8E8[index + 1]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AEF8E8[index + 1]);
if (this->timePath == NULL) {
return false;
}
@@ -705,16 +705,16 @@ void func_80AED940(EnTk* this, PlayState* play) {
void func_80AEDBEC(EnTk* this, PlayState* play) {
this->actor.params = -1;
- this->unk_2E8 = 0;
+ this->csLength = 0;
this->actor.speed = 0.0f;
SubS_ChangeAnimationBySpeedInfo(&this->skelAnime, D_80AEF868, 2, &this->unk_2D4);
this->actionFunc = func_80AEDC4C;
}
void func_80AEDC4C(EnTk* this, PlayState* play) {
- if ((this->actor.params >= 0) && SubS_StartActorCutscene(&this->actor, this->cutscenes[1], this->actor.params,
- SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
- this->unk_2E8 = ActorCutscene_GetLength(this->cutscenes[1]);
+ if ((this->actor.params >= 0) &&
+ SubS_StartCutscene(&this->actor, this->csIdList[1], this->actor.params, SUBS_CUTSCENE_WITH_PLAYER)) {
+ this->csLength = CutsceneManager_GetLength(this->csIdList[1]);
Message_ContinueTextbox(play, 0x1411);
func_80AEDCBC(this, play);
}
@@ -731,9 +731,9 @@ void func_80AEDCBC(EnTk* this, PlayState* play) {
}
void func_80AEDD4C(EnTk* this, PlayState* play) {
- this->unk_2E8--;
- if (this->unk_2E8 <= 0) {
- ActorCutscene_Stop(this->cutscenes[1]);
+ this->csLength--;
+ if (this->csLength <= 0) {
+ CutsceneManager_Stop(this->csIdList[1]);
Message_CloseTextbox(play);
Actor_Kill(&this->actor);
}
@@ -901,7 +901,7 @@ void func_80AEE2A8(EnTk* this, PlayState* play) {
}
void func_80AEE2C0(EnTk* this, PlayState* play) {
- if (SubS_StartActorCutscene(&this->actor, this->cutscenes[0], 0x7C, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ if (SubS_StartCutscene(&this->actor, this->csIdList[0], CS_ID_GLOBAL_TALK, SUBS_CUTSCENE_WITH_PLAYER)) {
func_80AEE374(this, play);
}
}
@@ -995,15 +995,15 @@ void func_80AEE650(EnTk* this, PlayState* play) {
void func_80AEE6B8(EnTk* this, PlayState* play) {
if (this->unk_2CA & 0x20) {
if (this->unk_2E4 >= 3) {
- ActorCutscene_Stop(this->cutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
Message_CloseTextbox(play);
func_80AEDBEC(this, play);
- } else if (SubS_StartActorCutscene(&this->actor, 0x7C, this->cutscenes[0], SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ } else if (SubS_StartCutscene(&this->actor, CS_ID_GLOBAL_TALK, this->csIdList[0], SUBS_CUTSCENE_WITH_PLAYER)) {
this->unk_310 = 3;
func_80AEDE10(this, play);
this->unk_2CA &= ~0x20;
}
- } else if (SubS_StartActorCutscene(&this->actor, 0x7C, this->cutscenes[0], SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ } else if (SubS_StartCutscene(&this->actor, CS_ID_GLOBAL_TALK, this->csIdList[0], SUBS_CUTSCENE_WITH_PLAYER)) {
this->unk_310 = 4;
func_80AEDE10(this, play);
}
@@ -1035,13 +1035,13 @@ s32 func_80AEE86C(EnTk* this, PlayState* play) {
s32 pad;
s32 ret = false;
s32 pad2;
- CollisionPoly* sp38;
- s32 sp34;
+ CollisionPoly* groundPoly;
+ s32 bgId;
Vec3f sp28;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80AEFA78, &sp28);
- if ((BgCheck_EntityRaycastFloor3(&play->colCtx, &sp38, &sp34, &sp28) != BGCHECK_Y_MIN) &&
- (func_800C9BB8(&play->colCtx, sp38, sp34) == 1) && (this->unk_2D0 == (u32)1) &&
+ if ((BgCheck_EntityRaycastFloor3(&play->colCtx, &groundPoly, &bgId, &sp28) != BGCHECK_Y_MIN) &&
+ (SurfaceType_GetMaterial(&play->colCtx, groundPoly, bgId) == SURFACE_MATERIAL_SAND) && (this->unk_2D0 == 1) &&
(this->actor.xyzDistToPlayerSq <= SQ(115.0f)) &&
func_80AEE7E0(&this->actor.world.pos, 100.0f, this->unk_324, this->unk_36C) &&
(((this->unk_2CA & 2) && (Math_Vec3f_DistXZ(&this->unk_300, &sp28) >= 100.0f)) || !(this->unk_2CA & 2)) &&
@@ -1270,7 +1270,7 @@ void func_80AEF2D8(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
func_80AEC460(this);
}
@@ -1310,9 +1310,10 @@ void EnTk_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
- if ((this->unk_2B0 == 0) && (func_800C9B40(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) == 12)) {
+ if ((this->unk_2B0 == 0) && (SurfaceType_GetFloorProperty(&play->colCtx, this->actor.floorPoly,
+ this->actor.floorBgId) == FLOOR_PROPERTY_12)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
this->unk_2CA |= 0x200;
this->actor.velocity.y = 0.0f;
@@ -1365,6 +1366,7 @@ void EnTk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList(POLY_OPA_DISP++, object_tk_DL_00B530);
CLOSE_DISPS(play->state.gfxCtx);
+
break;
}
}
@@ -1381,7 +1383,7 @@ void EnTk_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 25);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AEFA90[this->unk_2C2]));
diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.h b/src/overlays/actors/ovl_En_Tk/z_en_tk.h
index 42a8aa96a..aa15c6fc6 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.h
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.h
@@ -10,7 +10,7 @@ typedef void (*EnTkUnkFunc)(struct EnTk*, PlayState*);
#define ENTK_GET_F(thisx) ((thisx)->params & 0xF)
#define ENTK_GET_7F0(thisx) (((thisx)->params >> 4) & 0x7F)
-#define ENTK_GET_F800(thisx) ((((thisx)->params >> 0xB) & 0x1F) & 0xFF)
+#define ENTK_GET_PATH_INDEX(thisx) (((thisx)->params >> 0xB) & 0x1F)
typedef struct EnTk {
/* 0x000 */ Actor actor;
@@ -36,13 +36,13 @@ typedef struct EnTk {
/* 0x2E0 */ s32 unk_2E0;
/* 0x2E4 */ s16 unk_2E4;
/* 0x2E6 */ u16 unk_2E6;
- /* 0x2E8 */ s16 unk_2E8;
+ /* 0x2E8 */ s16 csLength;
/* 0x2EC */ Vec3f unk_2EC;
/* 0x2F8 */ Vec3s unk_2F8;
/* 0x300 */ Vec3f unk_300;
/* 0x30C */ EnTkUnkFunc unk_30C;
/* 0x310 */ s16 unk_310;
- /* 0x312 */ s16 cutscenes[2];
+ /* 0x312 */ s16 csIdList[2];
/* 0x316 */ s16 unk_316;
/* 0x318 */ s16 unk_318;
/* 0x31A */ s16 unk_31A;
diff --git a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
index 75f966a3c..204fa8714 100644
--- a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
+++ b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
@@ -63,17 +63,14 @@ static Gfx* sShellDLists[] = {
void EnTorch2_Init(Actor* thisx, PlayState* play) {
EnTorch2* this = THIS;
- s16 params;
Actor_ProcessInitChain(&this->actor, sInitChain);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- // params: which form Link is in (e.g. human, deku, etc.)
- params = this->actor.params;
- if (params != TORCH2_PARAM_DEKU) {
- this->actor.flags |= ACTOR_FLAG_4000000; // Can press switch
- if (params == TORCH2_PARAM_GORON) {
- this->actor.flags |= ACTOR_FLAG_20000; // Can press heavy switches
+ if (this->actor.params != TORCH2_PARAM_DEKU) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
+ if (this->actor.params == TORCH2_PARAM_GORON) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH;
}
}
this->framesUntilNextState = 20;
@@ -101,7 +98,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play) {
this->actor.gravity = -1.0f;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 70.0f, 0x05);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 70.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if (this->framesUntilNextState == 0) {
remainingFrames = 0;
@@ -163,7 +160,8 @@ void EnTorch2_Draw(Actor* thisx, PlayState* play2) {
Gfx* gfx = sShellDLists[this->actor.params];
OPEN_DISPS(play->state.gfxCtx);
- if (this->alpha == 0xFF) {
+
+ if (this->alpha == 255) {
Scene_SetRenderModeXlu(play, 0, 0x01);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
Gfx_DrawDListOpa(play, gfx);
@@ -172,5 +170,6 @@ void EnTorch2_Draw(Actor* thisx, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->alpha);
Gfx_DrawDListXlu(play, gfx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
index 9033b9923..edc488d1e 100644
--- a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
+++ b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
@@ -18,7 +18,7 @@ typedef enum {
/* 1 */ TORCH2_PARAM_GORON,
/* 2 */ TORCH2_PARAM_ZORA,
/* 3 */ TORCH2_PARAM_DEKU,
- /* 4 */ TORCH2_PARAM_FIERCE_DEITY,
+ /* 4 */ TORCH2_PARAM_FIERCE_DEITY
} EnTorch2Param;
typedef enum {
@@ -26,7 +26,7 @@ typedef enum {
/* 1 */ TORCH2_STATE_FADING_IN,
/* 2 */ TORCH2_STATE_SOLID,
/* 3 */ TORCH2_STATE_IDLE,
- /* 4 */ TORCH2_STATE_DYING,
+ /* 4 */ TORCH2_STATE_DYING
} EnTorch2State;
#endif // Z_EN_TORCH2_H
diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
index 54ed5babc..2177742dc 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
@@ -205,16 +205,16 @@ void EnToto_Destroy(Actor* thisx, PlayState* play) {
}
void func_80BA383C(EnToto* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) && this->actionFuncIndex == 1 &&
- this->skelAnime.animation != &object_zm_Anim_000C80) {
- if (play->msgCtx.currentTextId != 0x2A98 && play->msgCtx.currentTextId != 0x2A99) {
- if (this->unk2B4 & 1 || Rand_ZeroOne() > 0.5f) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->actionFuncIndex == 1) &&
+ (this->skelAnime.animation != &object_zm_Anim_000C80)) {
+ if ((play->msgCtx.currentTextId != 0x2A98) && (play->msgCtx.currentTextId != 0x2A99)) {
+ if ((this->unk2B4 & 1) || (Rand_ZeroOne() > 0.5f)) {
this->unk2B4 = (this->unk2B4 + 1) & 3;
}
}
Animation_PlayOnce(&this->skelAnime, D_80BA5078[this->unk2B4]);
}
- func_800BBB74(this->unk260, 0x14, 0x50, 3);
+ func_800BBB74(&this->blinkInfo, 20, 80, 3);
}
void func_80BA3930(EnToto* this, PlayState* play) {
@@ -251,9 +251,8 @@ void func_80BA39C8(EnToto* this, PlayState* play) {
return;
}
- //! TODO: Neither 0xED02 nor 0xED01 match CLOCK_TIME macro
if (((play->sceneId == SCENE_MILK_BAR) &&
- !((gSaveContext.save.time >= CLOCK_TIME(6, 0)) && (gSaveContext.save.time < 0xED02))) ||
+ !((gSaveContext.save.time >= CLOCK_TIME(6, 0)) && (gSaveContext.save.time <= (CLOCK_TIME(22, 13) + 7)))) ||
((play->sceneId != SCENE_MILK_BAR) && func_80BA397C(this, 0x2000))) {
if (this->unk2B6 != 0) {
this->text = D_80BA5044;
@@ -291,7 +290,7 @@ void func_80BA3BFC(EnToto* this, PlayState* play) {
this->unk2B4 = 0;
} else {
if (this->text->unk0 == 4) {
- func_80151BB4(play, 9);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
}
Animation_MorphToLoop(&this->skelAnime, &object_zm_Anim_00B3E0, -4.0f);
}
@@ -312,11 +311,11 @@ void func_80BA3CC4(EnToto* this, PlayState* play) {
}
void func_80BA3D38(EnToto* this, PlayState* play) {
- this->cutscene = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->text = ENTOTO_WEEK_EVENT_FLAGS ? D_80BA50BC : D_80BA5088;
func_80BA4C0C(this, play);
play->actorCtx.flags |= ACTORCTX_FLAG_5;
- this->unk260[0] = 0;
+ this->blinkInfo.eyeTexIndex = 0;
}
void func_80BA3DBC(EnToto* this, PlayState* play) {
@@ -327,23 +326,23 @@ void func_80BA3DBC(EnToto* this, PlayState* play) {
if (!func_80BA4C44(this, play)) {
return;
}
- if (this->text->unk1 != 0 && ENTOTO_WEEK_EVENT_FLAGS) {
+ if ((this->text->unk1 != 0) && ENTOTO_WEEK_EVENT_FLAGS) {
this->unk2B7 = 1;
return;
}
} else {
player = GET_PLAYER(play);
if ((player->stateFlags1 & PLAYER_STATE1_400) && player->unk_AE7 != 0) {
- func_80151BB4(play, 48);
- func_80151BB4(play, 9);
- func_80151BB4(play, 10);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN);
} else {
return;
}
}
func_80BA36C0(this, play, 0);
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
play->actorCtx.flags &= ~ACTORCTX_FLAG_5;
}
@@ -357,7 +356,7 @@ s32 func_80BA3ED4(EnToto* this, PlayState* play) {
s32 func_80BA3EE8(EnToto* this, PlayState* play) {
if (this->text->unk1 == 2) {
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
}
return 0;
}
@@ -370,7 +369,7 @@ s32 func_80BA3F2C(EnToto* this, PlayState* play) {
func_80BA3EE8(this, play);
}
if (this->text->unk0 == 4) {
- func_80151BB4(play, 9);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
}
return 0;
}
@@ -389,21 +388,21 @@ s32 func_80BA3FCC(EnToto* this, PlayState* play) {
}
s32 func_80BA402C(EnToto* this, PlayState* play) {
- s16 prevCutscene = this->cutscene;
+ s16 prevCsId = this->csId;
- this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
- ActorCutscene_SetIntentToPlay(this->cutscene);
- ActorCutscene_Stop(prevCutscene);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
+ CutsceneManager_Stop(prevCsId);
return 0;
}
s32 func_80BA407C(EnToto* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &GET_PLAYER(play)->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &GET_PLAYER(play)->actor);
return 1;
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
return 0;
}
@@ -428,7 +427,7 @@ s32 func_80BA415C(EnToto* this, PlayState* play) {
} else {
func_8019F208();
}
- return (play->msgCtx.choiceIndex != 0 ? 0 : this->text->unk1) + 1; // Possible msg MACRO
+ return ((play->msgCtx.choiceIndex != 0) ? 0 : this->text->unk1) + 1;
}
return 0;
}
@@ -452,7 +451,7 @@ s32 func_80BA42BC(EnToto* this, PlayState* play) {
Vec3s* end = &D_80BA510C[3];
func_80BA3FB0(this, play);
- func_800B7298(play, NULL, PLAYER_CSMODE_6);
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
if (player->actor.world.pos.z > -310.0f) {
if ((player->actor.world.pos.x > -150.0f) || (player->actor.world.pos.z > -172.0f)) {
phi_s0 = 3;
@@ -480,14 +479,14 @@ s32 func_80BA43F4(EnToto* this, PlayState* play) {
s32 func_80BA445C(EnToto* this, PlayState* play) {
if (func_80BA4128(this, play)) {
- func_800B7298(play, NULL, PLAYER_CSMODE_6);
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
return 1;
}
return 0;
}
s32 func_80BA44A0(EnToto* this, PlayState* play) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->unk2B1 = 0;
return 0;
}
@@ -584,8 +583,9 @@ s32 func_80BA47E0(EnToto* this, PlayState* play) {
this->unk2B3 += 8;
}
for (i = 0; i < ARRAY_COUNT(D_80BA50DC); i++) {
- if (gSaveContext.save.playerForm != (i + 1) && (D_80BA5128[i] & this->unk2B3)) {
+ if ((gSaveContext.save.playerForm != (i + 1)) && (D_80BA5128[i] & this->unk2B3)) {
Math_Vec3s_ToVec3f(&spawnPos, &D_80BA50DC[i].unk6);
+
Actor_Spawn(&play->actorCtx, play, ACTOR_PLAYER, spawnPos.x, spawnPos.y, spawnPos.z, i + 2, 0, 0,
PLAYER_PARAMS(0xFF, PLAYER_INITMODE_F) | 0xFFFFF000);
}
@@ -675,30 +675,30 @@ s32 func_80BA4C44(EnToto* this, PlayState* play) {
}
void func_80BA4CB4(EnToto* this, PlayState* play) {
- CsCmdActorAction* action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 525)];
+ CsCmdActorCue* cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_525)];
- if (this->unk2B5 != action->action) {
- this->unk2B5 = action->action;
- if (this->unk2B5 != 4) {
- if (this->unk2B5 == 3) {
+ if (this->cueId != cue->id) {
+ this->cueId = cue->id;
+ if (this->cueId != 4) {
+ if (this->cueId == 3) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_zm_Anim_001DF0, -4.0f);
} else {
Animation_PlayOnce(&this->skelAnime,
- this->unk2B5 == 1 ? &object_zm_Anim_0016A4 : &object_zm_Anim_0022C8);
- if (this->unk2B5 == 2 && this->unk2B3 != 0xF) {
- func_80151BB4(play, 9);
- func_80151BB4(play, 10);
+ (this->cueId == 1) ? &object_zm_Anim_0016A4 : &object_zm_Anim_0022C8);
+ if ((this->cueId == 2) && (this->unk2B3 != 0xF)) {
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN);
}
}
}
}
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 0x320);
if (SkelAnime_Update(&this->skelAnime)) {
- if (this->unk2B5 != 3) {
- Animation_PlayLoop(&this->skelAnime, this->unk2B5 == 1 ? &object_zm_Anim_00C880 : &object_zm_Anim_001324);
+ if (this->cueId != 3) {
+ Animation_PlayLoop(&this->skelAnime, (this->cueId == 1) ? &object_zm_Anim_00C880 : &object_zm_Anim_001324);
}
}
- if (this->unk2B5 == 4 && !Actor_HasParent(&this->actor, play)) {
+ if ((this->cueId == 4) && !Actor_HasParent(&this->actor, play)) {
Actor_OfferGetItem(&this->actor, play, GI_MASK_CIRCUS_LEADER, 9999.9f, 9999.9f);
}
}
@@ -707,7 +707,7 @@ void EnToto_Update(Actor* thisx, PlayState* play) {
EnToto* this = THIS;
s32 pad;
- if (Cutscene_CheckActorAction(play, 0x20D)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_525)) {
func_80BA4CB4(this, play);
} else {
D_80BA51B8[this->actionFuncIndex](this, play);
@@ -727,8 +727,8 @@ void EnToto_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->unk260[0]]));
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->blinkInfo.eyeTexIndex]));
Scene_SetRenderModeXlu(play, 0, 1);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
NULL, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.h b/src/overlays/actors/ovl_En_Toto/z_en_toto.h
index 3c95a7dbb..dc2b0947e 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.h
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.h
@@ -26,14 +26,14 @@ typedef struct EnToto {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[18];
/* 0x1F4 */ Vec3s morphTable[18];
- /* 0x260 */ s16 unk260[2];
+ /* 0x260 */ BlinkInfo blinkInfo;
/* 0x264 */ ColliderCylinder collider;
/* 0x2B0 */ u8 actionFuncIndex;
/* 0x2B1 */ u8 unk2B1;
- /* 0x2B2 */ s8 cutscene;
+ /* 0x2B2 */ s8 csId;
/* 0x2B3 */ u8 unk2B3;
/* 0x2B4 */ u8 unk2B4;
- /* 0x2B5 */ u8 unk2B5;
+ /* 0x2B5 */ u8 cueId;
/* 0x2B6 */ u8 unk2B6;
/* 0x2B7 */ u8 unk2B7;
/* 0x2B8 */ EnTotoText* text;
diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.c b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
index ed0e61937..ee9c5aaae 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -126,7 +126,7 @@ void EnTrt_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animationInfo, s32 a
s32 EnTrt_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -170,22 +170,22 @@ void EnTrt_UpdateCursorPos(PlayState* play, EnTrt* this) {
void EnTrt_SetupGetMushroomCutscene(EnTrt* this) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- if (this->cutscene != this->tmpGetMushroomCutscene) {
- ActorCutscene_Stop(this->cutscene);
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (this->csId != this->tmpGetMushroomCsId) {
+ CutsceneManager_Stop(this->csId);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->tmpGetMushroomCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->tmpGetMushroomCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
}
}
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING_SPECIAL;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -213,7 +213,7 @@ void EnTrt_EndInteraction(PlayState* play, EnTrt* this) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
Actor_ProcessTalkRequest(&this->actor, &play->state);
@@ -274,10 +274,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -290,10 +290,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -318,11 +318,11 @@ void EnTrt_Hello(EnTrt* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
@@ -337,7 +337,7 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
u8 talkState = Message_GetState(&play->msgCtx);
Player* player = GET_PLAYER(play);
- this->tmpGetMushroomCutscene = this->getMushroomCutscene;
+ this->tmpGetMushroomCsId = this->getMushroomCsId;
if (this->cutsceneState != ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
EnTrt_SetupGetMushroomCutscene(this);
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
@@ -349,21 +349,24 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
this->textId = 0x884;
Message_StartTextbox(play, this->textId, &this->actor);
SET_WEEKEVENTREG(WEEKEVENTREG_53_08);
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
break;
+
case 0x888:
this->textId = 0x889;
Message_StartTextbox(play, this->textId, &this->actor);
break;
+
case 0x889:
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
play->msgCtx.msgMode = 0x43;
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_PayForMushroom;
break;
+
default:
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_EndInteraction(play, this);
@@ -375,7 +378,7 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
void EnTrt_PayForMushroom(EnTrt* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
this->actionFunc = EnTrt_SetupItemGiven;
} else {
Actor_OfferGetItem(&this->actor, play, GI_RUPEE_RED, 300.0f, 300.0f);
@@ -389,10 +392,14 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
this->textId = 0x887;
Message_ContinueTextbox(play, this->textId);
break;
+
case 0x887:
case 0x88B:
EnTrt_EndInteraction(play, this);
break;
+
+ default:
+ break;
}
}
}
@@ -402,7 +409,7 @@ void EnTrt_StartRedPotionConversation(EnTrt* this, PlayState* play) {
if (this->textId == 0x88F) {
if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
play->msgCtx.msgMode = 0x43;
@@ -465,18 +472,18 @@ void EnTrt_GivenRedPotionForKoume(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
player->stateFlags2 |= PLAYER_STATE2_20000000;
//! @bug: EnTrt_ContinueShopping gets overwritten by EnTrt_ItemGiven
this->actionFunc = EnTrt_ContinueShopping;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
@@ -504,12 +511,15 @@ s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play) {
func_8019F208();
EnTrt_SetupTalkToShopkeeper(play, this);
return true;
+
case 1:
func_8019F230();
EnTrt_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
@@ -517,19 +527,19 @@ void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
u8 cursorIndex;
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookForwardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookForwardCutscene;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
} else if (talkState == TEXT_STATE_CHOICE) {
func_8011552C(play, DO_ACTION_DECIDE);
@@ -551,25 +561,25 @@ void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
void EnTrt_LookToShelf(EnTrt* this, PlayState* play) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShelfCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShelfCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_UpdateCursorPos(play, this);
this->actionFunc = EnTrt_BrowseShelf;
Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -603,7 +613,7 @@ s32 EnTrt_HasPlayerSelectedItem(PlayState* play, EnTrt* this, Input* input) {
return true;
}
if (EnTrt_TestItemSelected(play)) {
- if (item->actor.params != SI_POTION_BLUE || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
+ if ((item->actor.params != SI_POTION_BLUE) || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
this->prevActionFunc = this->actionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemChoiceTextId(this));
play_sound(NA_SE_SY_DECIDE);
@@ -675,7 +685,7 @@ void EnTrt_HandleCanBuyItem(PlayState* play, EnTrt* this) {
switch (item->canBuyFunc(play, item)) {
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
func_8019F208();
@@ -733,11 +743,15 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
case 0:
EnTrt_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
break;
+
+ default:
+ break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
@@ -746,7 +760,7 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
EnTrt_SetupCannotBuy(play, this, 0x846);
} else {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
EnTrt_SetupBuyItemWithFanfare(play, this);
@@ -790,11 +804,11 @@ void EnTrt_IdleSleeping(EnTrt* this, PlayState* play) {
this->flags |= ENTRT_MET;
}
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookForwardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookForwardCutscene;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
}
player->stateFlags2 |= PLAYER_STATE2_20000000;
@@ -831,11 +845,11 @@ void EnTrt_IdleAwake(EnTrt* this, PlayState* play) {
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookForwardCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookForwardCutscene;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
}
player->stateFlags2 |= PLAYER_STATE2_20000000;
@@ -866,11 +880,11 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
s16 animLastFrame = Animation_GetLastFrame(&gKotakeWakeUpAnim) / (s16)this->skelAnime.playSpeed;
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING_SPECIAL;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
if (this->animIndex != TRT_ANIM_HANDS_ON_COUNTER) {
@@ -904,30 +918,36 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_StartRedPotionConversation;
}
break;
+
case 0x83E:
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
this->actionFunc = EnTrt_FaceShopkeeper;
break;
+
case 0x850:
case 0x890:
this->actionFunc = EnTrt_SetupEndInteraction;
break;
+
case 0x88F:
this->actionFunc = EnTrt_StartRedPotionConversation;
break;
+
+ default:
+ break;
}
}
}
void EnTrt_Surprised(EnTrt* this, PlayState* play) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING_SPECIAL;
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
if (DECR(this->timer) == 0) {
@@ -954,7 +974,7 @@ void EnTrt_TryToGiveRedPotionAfterSurprised(EnTrt* this, PlayState* play) {
if ((talkState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
if (Inventory_HasEmptyBottle() || !CHECK_WEEKEVENTREG(WEEKEVENTREG_12_10)) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
this->actionFunc = EnTrt_GiveRedPotionForKoume;
@@ -973,7 +993,7 @@ void EnTrt_TryToGiveRedPotion(EnTrt* this, PlayState* play) {
if (this->textId == 0x83C) {
if (Inventory_HasEmptyBottle()) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
play->msgCtx.msgMode = 0x43;
@@ -997,17 +1017,17 @@ void EnTrt_ItemGiven(EnTrt* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
player->stateFlags2 |= PLAYER_STATE2_20000000;
this->actionFunc = EnTrt_ContinueShopping;
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
}
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
@@ -1015,16 +1035,20 @@ void EnTrt_ItemGiven(EnTrt* this, PlayState* play) {
case 0x889:
this->textId = 0x88A;
break;
+
case 0x881:
this->textId = 0x88C;
break;
+
case 0x838:
case 0x83C:
case 0x88E:
case 0x88F:
this->textId = 0x83A;
break;
+
default:
+ //! FAKE:
if (1) {}
this->textId = 0x849;
break;
@@ -1048,13 +1072,13 @@ void EnTrt_ShopkeeperGone(EnTrt* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, this->textId, &this->actor);
} else {
- if ((player->actor.world.pos.x >= -50.0f && player->actor.world.pos.x <= 50.0f) &&
- (player->actor.world.pos.z >= -19.0f && player->actor.world.pos.z <= 30.0f)) {
+ if ((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= 50.0f) &&
+ (player->actor.world.pos.z >= -19.0f) && (player->actor.world.pos.z <= 30.0f)) {
func_800B8614(&this->actor, play, 200.0f);
}
}
if ((talkState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_CLEARED, 5);
} else {
play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_POISONED, 5);
@@ -1098,11 +1122,11 @@ void EnTrt_SetupItemGiven(EnTrt* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) {
this->actionFunc = EnTrt_ItemGiven;
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
}
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
}
@@ -1129,6 +1153,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
EnTrt_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
@@ -1440,23 +1465,23 @@ void EnTrt_SetupLookToShopkeeperFromShelf(PlayState* play, EnTrt* this) {
void EnTrt_LookToShopkeeperFromShelf(EnTrt* this, PlayState* play) {
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING) {
- ActorCutscene_Stop(this->cutscene);
+ CutsceneManager_Stop(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_STOPPED;
}
if (this->cutsceneState == ENTRT_CUTSCENESTATE_STOPPED) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- this->cutscene = this->lookToShopkeeperCutscene;
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->csId = this->lookToShopkeeperCsId;
+ CutsceneManager_Queue(this->csId);
this->cutsceneState = ENTRT_CUTSCENESTATE_WAITING;
} else if (this->cutsceneState == ENTRT_CUTSCENESTATE_WAITING) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->csId, &this->actor);
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_StartShopping(play, this);
} else {
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
}
@@ -1473,7 +1498,7 @@ void EnTrt_InitShopkeeper(EnTrt* this, PlayState* play) {
void EnTrt_InitShop(EnTrt* this, PlayState* play) {
EnTrt_GetCutscenes(this, play);
- this->cutscene = this->lookForwardCutscene;
+ this->csId = this->lookForwardCutscene;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
EnTrt_InitShopkeeper(this, play);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -1553,10 +1578,10 @@ void EnTrt_InitShop(EnTrt* this, PlayState* play) {
}
void EnTrt_GetCutscenes(EnTrt* this, PlayState* play) {
- this->lookForwardCutscene = this->actor.cutscene;
- this->lookToShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookForwardCutscene);
- this->lookToShopkeeperCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShelfCutscene);
- this->getMushroomCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperCutscene);
+ this->lookForwardCutscene = this->actor.csId;
+ this->lookToShelfCsId = CutsceneManager_GetAdditionalCsId(this->lookForwardCutscene);
+ this->lookToShopkeeperCsId = CutsceneManager_GetAdditionalCsId(this->lookToShelfCsId);
+ this->getMushroomCsId = CutsceneManager_GetAdditionalCsId(this->lookToShopkeeperCsId);
}
void EnTrt_DrawCursor(PlayState* play, EnTrt* this, f32 x, f32 y, f32 z, u8 drawCursor) {
@@ -1571,7 +1596,7 @@ void EnTrt_DrawCursor(PlayState* play, EnTrt* this, f32 x, f32 y, f32 z, u8 draw
OPEN_DISPS(play->state.gfxCtx);
if (drawCursor != 0) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColor.r, this->cursorColor.g, this->cursorColor.b,
this->cursorColor.a);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, gSelectionCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
@@ -1632,7 +1657,7 @@ void EnTrt_DrawStickDirectionPrompt(PlayState* play, EnTrt* this) {
OPEN_DISPS(play->state.gfxCtx);
if (drawStickRightPrompt || drawStickLeftPrompt) {
- func_8012C654(play->state.gfxCtx);
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPLoadTextureBlock(OVERLAY_DISP++, gArrowCursorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD,
@@ -1793,7 +1818,7 @@ void EnTrt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
diff --git a/src/overlays/actors/ovl_En_Trt/z_en_trt.h b/src/overlays/actors/ovl_En_Trt/z_en_trt.h
index c81032af5..dfa3ba5c4 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.h
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.h
@@ -35,8 +35,8 @@ typedef struct EnTrt {
/* 0x3D6 */ s16 blinkTimer;
/* 0x3D8 */ s16 eyeTexIndex;
/* 0x3DC */ EnTrtBlinkFunc blinkFunc;
- /* 0x3E0 */ s16 cutscene;
- /* 0x3E2 */ s16 tmpGetMushroomCutscene;
+ /* 0x3E0 */ s16 csId;
+ /* 0x3E2 */ s16 tmpGetMushroomCsId;
/* 0x3E4 */ Vec3f cursorPos;
/* 0x3F0 */ Color_RGBAu32 cursorColor;
/* 0x400 */ u8 drawCursor;
@@ -46,9 +46,9 @@ typedef struct EnTrt {
/* 0x408 */ u16 prevTextId;
/* 0x40A */ u16 talkOptionTextId;
/* 0x40C */ s16 lookForwardCutscene;
- /* 0x40E */ s16 lookToShelfCutscene;
- /* 0x410 */ s16 lookToShopkeeperCutscene;
- /* 0x412 */ s16 getMushroomCutscene;
+ /* 0x40E */ s16 lookToShelfCsId;
+ /* 0x410 */ s16 lookToShopkeeperCsId;
+ /* 0x412 */ s16 getMushroomCsId;
/* 0x414 */ UNK_TYPE1 pad414[0x2];
/* 0x416 */ Vec3s headRot;
/* 0x41C */ Vec3f headPos;
diff --git a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
index 44f2e7d3e..29560fdce 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -189,15 +189,15 @@ void func_80AD3530(EnTrt2* this, PlayState* play) {
}
void func_80AD3664(EnTrt2* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->unk_3DA)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_3DA, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
if (this->unk_3D9 == 0) {
this->unk_3B2 = 1;
} else {
this->unk_3B2 = 2;
}
} else {
- ActorCutscene_SetIntentToPlay(this->unk_3DA);
+ CutsceneManager_Queue(this->csId);
return;
}
func_800B9010(&this->actor, NA_SE_EN_KOTAKE_FLY - SFX_FLAG);
@@ -216,10 +216,10 @@ void func_80AD36EC(EnTrt2* this, PlayState* play) {
this->unk_1E4 = 0;
this->unk_3D9 = 1;
this->actor.velocity.y = 0.0f;
- this->path = SubS_GetPathByIndex(play, this->path->unk1, -1);
- ActorCutscene_Stop(this->unk_3DA);
- this->unk_3DA = ActorCutscene_GetAdditionalCutscene(this->unk_3DA);
- ActorCutscene_SetIntentToPlay(this->unk_3DA);
+ this->path = SubS_GetPathByIndex(play, this->path->additionalPathIndex, PATH_INDEX_NONE);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ CutsceneManager_Queue(this->csId);
this->unk_3B2 = 0;
} else {
this->unk_1E4++;
@@ -262,7 +262,7 @@ void func_80AD38B8(EnTrt2* this, PlayState* play) {
this->actor.world.rot.x = -this->actor.shape.rot.x;
if (func_80AD475C(this, this->path, this->unk_1E4)) {
if (this->unk_1E4 >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->unk_3DA);
+ CutsceneManager_Stop(this->csId);
this->unk_3D9 = 2;
} else {
this->unk_1E4++;
@@ -271,7 +271,7 @@ void func_80AD38B8(EnTrt2* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
if (this->unk_1E4 >= (this->path->count - 1)) {
- ActorCutscene_Stop(this->unk_3DA);
+ CutsceneManager_Stop(this->csId);
this->unk_3D9 = 2;
} else {
sp30.y = this->actor.wallYaw;
@@ -450,7 +450,7 @@ void func_80AD417C(EnTrt2* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
if (this->unk_3A8 == 0x84C) {
EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
- this->path = SubS_GetPathByIndex(play, ENTRT2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRT2_GET_PATH_INDEX(&this->actor), ENTRT2_PATH_INDEX_NONE);
this->unk_3B2 = 18;
} else if (this->unk_3A8 == 0x88F) {
this->unk_3A8 = 0x88E;
@@ -466,15 +466,15 @@ void func_80AD417C(EnTrt2* this, PlayState* play) {
void func_80AD4298(EnTrt2* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCanPlayNext(this->unk_3DA)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_3DA, &this->actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
player->stateFlags1 |= PLAYER_STATE1_20;
this->unk_3B2 = 6;
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->unk_3DA);
+ CutsceneManager_Queue(this->csId);
}
}
@@ -492,16 +492,16 @@ void func_80AD434C(EnTrt2* this, PlayState* play) {
if (this->actor.world.pos.y > 200.0f) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_3B2 = 0x13;
- ActorCutscene_Stop(this->unk_3DA);
+ CutsceneManager_Stop(this->csId);
} else {
s32 i;
Vec3f sp68;
Vec3f sp5C = { 0.0f, 0.5f, 0.0f };
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i -= 2) {
- sp68.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp68.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp68.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp68.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp68.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp68.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp68, &sp5C, &sp5C, 100, 0, 3);
}
@@ -592,7 +592,7 @@ s32 func_80AD475C(EnTrt2* this, Path* path, s32 arg2) {
phi_f14 = points[arg + 1].z - points[arg - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -615,7 +615,7 @@ s16 func_80AD48F8(Path* path, s32 arg1, Vec3f* arg2, f32* arg3) {
phi_f12 = 0.0f;
}
*arg3 = SQ(phi_f14) + SQ(phi_f12);
- return RADF_TO_BINANG(Math_Atan2F_XY(phi_f12, phi_f14));
+ return RAD_TO_BINANG(Math_Atan2F_XY(phi_f12, phi_f14));
}
f32 func_80AD49B8(Path* path, s32 arg1, Vec3f* arg2, Vec3s* arg3) {
@@ -639,9 +639,9 @@ f32 func_80AD49B8(Path* path, s32 arg1, Vec3f* arg2, Vec3s* arg3) {
void func_80AD4A78(EnTrt2* this, PlayState* play) {
Vec3f sp34;
- sp34.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ sp34.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y;
- sp34.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ sp34.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &sp34, 50.0f, 0, 2.0f, 0, 0, 0);
}
@@ -722,7 +722,7 @@ void func_80AD4DB4(EnTrt2* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10;
Actor_SetObjectDependency(play, &this->actor);
Actor_SetScale(&this->actor, 0.008f);
- this->path = SubS_GetPathByIndex(play, ENTRT2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRT2_GET_PATH_INDEX(&this->actor), ENTRT2_PATH_INDEX_NONE);
this->unk_3AE = Rand_S16Offset(100, 50);
this->unk_3B0 = 10;
this->unk_3A8 = 0;
@@ -738,7 +738,7 @@ void func_80AD4DB4(EnTrt2* this, PlayState* play) {
this->unk_3C0 = 0;
this->unk_3D8 = false;
- this->unk_3DA = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->unk_3B6 = 20;
this->unk_3B8 = 0;
this->unk_3BC = func_80AD4608;
@@ -792,7 +792,7 @@ void func_80AD4FE4(EnTrt2* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
if (play->sceneId != SCENE_20SICHITAI) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 26.0f, 10.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
Actor_SetFocus(&this->actor, 90.0f);
@@ -941,7 +941,7 @@ void func_80AD56E8(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AD5978[this->unk_3B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AD5978[this->unk_3B8]));
diff --git a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
index 44c2565f7..f9e2b4fc8 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
@@ -9,7 +9,9 @@ typedef void (*EnTrt2ActionFunc)(struct EnTrt2*, PlayState*);
typedef void (*EnTrt2UnkFunc)(struct EnTrt2*);
typedef void (*EnTrt2UnkFunc2)(struct EnTrt2*, PlayState*);
-#define ENTRT2_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENTRT2_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENTRT2_PATH_INDEX_NONE 0x3F
typedef struct EnTrt2 {
/* 0x000 */ Actor actor;
@@ -38,7 +40,7 @@ typedef struct EnTrt2 {
/* 0x3D6 */ s16 unk_3D6;
/* 0x3D8 */ u8 unk_3D8;
/* 0x3D9 */ u8 unk_3D9;
- /* 0x3DA */ s16 unk_3DA;
+ /* 0x3DA */ s16 csId;
} EnTrt2; // size = 0x3DC
#endif // Z_EN_TRT2_H
diff --git a/src/overlays/actors/ovl_En_Tru/z_en_tru.c b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
index eac370ebf..895d1d406 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -93,8 +93,14 @@ ActorInit En_Tru_InitVars = {
static Vec3f D_80A8B250 = { 0.0f, 0.02f, 0.0f };
static Color_RGBA8 D_80A8B25C[] = {
- { 255, 20, 60, 0 }, { 255, 235, 160, 0 }, { 20, 60, 255, 0 },
- { 100, 100, 100, 0 }, { 255, 255, 200, 0 }, { 100, 100, 100, 0 },
+ { 255, 20, 60, 0 },
+ { 255, 235, 160, 0 },
+ { 20, 60, 255, 0 },
+};
+static Color_RGBA8 D_80A8B268[] = {
+ { 100, 100, 100, 0 },
+ { 255, 255, 200, 0 },
+ { 100, 100, 100, 0 },
};
static f32 D_80A8B274[] = { 60.0f, 255.0f, 60.0f };
@@ -173,36 +179,36 @@ void func_80A85788(EnTruUnkStruct* arg0, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
- if (arg0->unk_00 == 1) {
- f32 alpha;
+ f32 alpha;
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, D_80A89000);
- flag = true;
- }
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= 255.0f;
- } while (0);
-
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)alpha);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -arg0->unk_02 * 5, 32, 64, 1, 0, 0, 32, 32));
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
- Matrix_Translate(0.0f, 14.0f, 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++, D_80A890A8);
+ if (arg0->unk_00 != 1) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, D_80A89000);
+ flag = true;
+ }
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= 255.0f;
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)alpha);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -arg0->unk_02 * 5, 32, 64, 1, 0, 0, 32, 32));
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 14.0f, 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++, D_80A890A8);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -227,38 +233,38 @@ void func_80A85AA4(EnTruUnkStruct* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 ar
}
void func_80A85BCC(EnTruUnkStruct* arg0, PlayState* play) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 i;
s32 flag = false;
OPEN_DISPS(play->state.gfxCtx);
- if (play) {}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
- if (arg0->unk_00 == 2) {
- f32 alpha;
+ f32 alpha;
- if (!flag) {
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 200, 0);
- flag = true;
- }
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= 255.0f;
- } while (0);
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 200, (u8)alpha);
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_80A8A108);
+ if (arg0->unk_00 != 2) {
+ continue;
}
+
+ if (!flag) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 200, 0);
+ flag = true;
+ }
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= 255.0f;
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 200, (u8)alpha);
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_80A8A108);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -282,63 +288,56 @@ void func_80A85E2C(EnTruUnkStruct* arg0, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3,
}
}
-#ifdef NON_MATCHING
-// s8/s6 flipped, same deal as above functions but the same fixes don't work
void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play) {
- u8 flag = false;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 i;
+ s32 flag = false;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
f32 alpha;
s32 index;
-
- if ((arg0->unk_00 == 3) || (arg0->unk_00 == 4) || (arg0->unk_00 == 5)) {
- if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPDisplayList(POLY_XLU_DISP++, gKoumeDustMaterialDL);
- flag = true;
- }
-
- Matrix_Push();
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= D_80A8B274[arg0->unk_00 - 3];
- } while (0);
-
- gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0,
- COMBINED, 0, SHADE, 0, 0, 0, 0, COMBINED);
- gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
- gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
- D_80A8B25C[arg0->unk_00 - 3].b, (u8)alpha);
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
- D_80A8B25C[arg0->unk_00 - 3].b, 0);
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- index = ((f32)arg0->unk_02 / arg0->unk_01) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
- gSPDisplayList(POLY_XLU_DISP++, gKoumeDustModelDL);
-
- Matrix_Pop();
+ if ((arg0->unk_00 != 3) && (arg0->unk_00 != 4) && (arg0->unk_00 != 5)) {
+ continue;
}
+
+ if (!flag) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, gKoumeDustMaterialDL);
+ flag = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= D_80A8B274[arg0->unk_00 - 3];
+
+ gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0,
+ COMBINED, 0, SHADE, 0, 0, 0, 0, COMBINED);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
+ D_80A8B25C[arg0->unk_00 - 3].b, (u8)alpha);
+ gDPSetEnvColor(POLY_XLU_DISP++, D_80A8B268[arg0->unk_00 - 3].r, D_80A8B268[arg0->unk_00 - 3].g,
+ D_80A8B268[arg0->unk_00 - 3].b, 0);
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ index = ((f32)arg0->unk_02 / arg0->unk_01) * 8.0f;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
+ gSPDisplayList(POLY_XLU_DISP++, gKoumeDustModelDL);
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tru/func_80A85F84.s")
-#endif
s32 func_80A86384(EnTruUnkStruct* arg0, Vec3f* arg1) {
s32 i;
@@ -495,7 +494,7 @@ s32 func_80A86B0C(EnTru* this, PlayState* play) {
s32 func_80A86BAC(EnTru* this, PlayState* play) {
if (this->unk_34E & 0x400) {
Matrix_Push();
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -525,7 +524,7 @@ s32 func_80A86BAC(EnTru* this, PlayState* play) {
if (this->unk_34E & 0x800) {
Matrix_Push();
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -693,10 +692,11 @@ s32 func_80A872AC(EnTru* this, PlayState* play) {
}
this->unk_34E &= ~(0x4000 | 0x2000);
- if ((player->exchangeItemId == 35) || (player->exchangeItemId == 36)) {
+ if ((player->exchangeItemId == PLAYER_IA_BOTTLE_POTION_RED) ||
+ (player->exchangeItemId == PLAYER_IA_BOTTLE_POTION_BLUE)) {
this->unk_34E |= 0x2000;
this->unk_38C = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
+ } else if (player->exchangeItemId != PLAYER_IA_NONE) {
this->unk_34E |= 0x4000;
}
@@ -771,7 +771,7 @@ s32 func_80A875AC(Actor* thisx, PlayState* play) {
switch (this->unk_364) {
case 0:
if ((this->unk_34E & 0x40) || CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
- this->unk_374 = this->actor.cutscene;
+ this->csId = this->actor.csId;
this->unk_364++;
} else {
this->unk_364++;
@@ -780,14 +780,14 @@ s32 func_80A875AC(Actor* thisx, PlayState* play) {
}
case 1:
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_374);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_374)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_374, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
+ } else if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_364++;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_374);
+ CutsceneManager_Queue(this->csId);
}
break;
@@ -867,19 +867,19 @@ s32 func_80A87880(Actor* thisx, PlayState* play) {
switch (this->unk_364) {
case 0:
- ActorCutscene_Stop(this->unk_374);
- this->unk_374 = ActorCutscene_GetAdditionalCutscene(this->unk_374);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
this->unk_364++;
case 1:
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_374);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_374)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_374, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
+ } else if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_364++;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_374);
+ CutsceneManager_Queue(this->csId);
}
break;
@@ -913,7 +913,7 @@ s32 func_80A87880(Actor* thisx, PlayState* play) {
Animation_OnFrame(&this->skelAnime, 52.0f)) {
if (Animation_OnFrame(&this->skelAnime, 52.0f)) {
this->unk_34E &= ~0x400;
- Player_UpdateBottleHeld(play, player, ITEM_BOTTLE, PLAYER_IA_BOTTLE);
+ Player_UpdateBottleHeld(play, player, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_KOUME_DRINK);
} else if (Animation_OnFrame(&this->skelAnime, 90.0f)) {
@@ -973,8 +973,8 @@ s32 func_80A87B48(Actor* thisx, PlayState* play) {
this->actor.shape.shadowDraw = NULL;
this->unk_34E |= (0x200 | 0x8);
this->unk_34E &= ~0x800;
- if (player->exchangeItemId != 0) {
- player->exchangeItemId = 0;
+ if (player->exchangeItemId != PLAYER_IA_NONE) {
+ player->exchangeItemId = PLAYER_IA_NONE;
}
EnTru_ChangeAnim(this, KOUME_ANIM_HOVER1);
}
@@ -999,19 +999,19 @@ s32 func_80A87DC0(Actor* thisx, PlayState* play) {
switch (this->unk_364) {
case 0:
- ActorCutscene_Stop(this->unk_374);
- this->unk_374 = ActorCutscene_GetAdditionalCutscene(this->unk_374);
+ CutsceneManager_Stop(this->csId);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
this->unk_364++;
case 1:
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_374);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_374)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_374, &this->actor);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csId);
+ } else if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->actor);
this->unk_364++;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_374);
+ CutsceneManager_Queue(this->csId);
}
break;
@@ -1102,8 +1102,8 @@ void func_80A881E0(EnTru* this, PlayState* play) {
this->unk_34E |= 0x80;
}
- if (ActorCutscene_GetCurrentIndex() != -1) {
- ActorCutscene_Stop(ActorCutscene_GetCurrentIndex());
+ if (CutsceneManager_GetCurrentCsId() != CS_ID_NONE) {
+ CutsceneManager_Stop(CutsceneManager_GetCurrentCsId());
}
if (!(this->unk_34E & 0x40) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_16_10)) {
@@ -1139,7 +1139,8 @@ void EnTru_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
this->animIndex = -1;
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_LYING_DOWN);
- this->path = SubS_GetDayDependentPath(play, ENTRU_GET_PATH(&this->actor), 255, &this->unk_384);
+ this->path =
+ SubS_GetDayDependentPath(play, ENTRU_GET_PATH_INDEX(&this->actor), ENTRU_PATH_INDEX_NONE, &this->unk_384);
if (this->path != NULL) {
this->unk_384 = 1;
}
@@ -1155,7 +1156,7 @@ void EnTru_Init(Actor* thisx, PlayState* play) {
}
this->actionFunc = func_80A87FD0;
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void EnTru_Destroy(Actor* thisx, PlayState* play) {
@@ -1266,7 +1267,7 @@ void EnTru_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Tru/z_en_tru.h b/src/overlays/actors/ovl_En_Tru/z_en_tru.h
index 48964b555..e7c06e127 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.h
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.h
@@ -9,7 +9,9 @@ struct EnTru;
typedef void (*EnTruActionFunc)(struct EnTru*, PlayState*);
typedef s32 (*EnTruUnkFunc)(Actor*, PlayState*);
-#define ENTRU_GET_PATH(thisx) ((thisx)->params & 0xFF)
+#define ENTRU_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
+
+#define ENTRU_PATH_INDEX_NONE 0xFF
typedef struct {
/* 0x00 */ u8 unk_00;
@@ -49,7 +51,7 @@ typedef struct EnTru {
/* 0x36E */ s16 eyeTexIndex;
/* 0x370 */ s16 unk_370;
/* 0x372 */ s16 unk_372;
- /* 0x374 */ s16 unk_374;
+ /* 0x374 */ s16 csId;
/* 0x378 */ EnTruUnkFunc unk_378;
/* 0x37C */ s32 animIndex;
/* 0x380 */ UNK_TYPE1 unk380[0x4];
diff --git a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
index 64f936bbd..f877a26a8 100644
--- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
+++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.c
@@ -301,7 +301,7 @@ s32 func_80B76600(EnTruMt* this, Path* path, s32 arg2) {
phi_f14 = sp5C[idx + 1].z - sp5C[idx - 1].z;
}
- func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
}
@@ -352,9 +352,9 @@ void func_80B76980(EnTruMt* this, PlayState* play) {
} else if (CHECK_EVENTINF(EVENTINF_40)) {
u32 score = gSaveContext.minigameScore;
- if (((gSaveContext.save.unk_EE8 & 0xFFFF0000) >> 0x10) < score) {
- gSaveContext.save.unk_EE8 =
- ((gSaveContext.minigameScore & 0xFFFF) << 0x10) | (gSaveContext.save.unk_EE8 & 0xFFFF);
+ if (((gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF0000) >> 0x10) < score) {
+ gSaveContext.save.saveInfo.unk_EC4 =
+ ((gSaveContext.minigameScore & 0xFFFF) << 0x10) | (gSaveContext.save.saveInfo.unk_EC4 & 0xFFFF);
SET_EVENTINF(EVENTINF_37);
}
}
@@ -431,15 +431,15 @@ void EnTruMt_Init(Actor* thisx, PlayState* play) {
this->collider.dim.worldSphere.radius = 22;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FF(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FF(&this->actor), ENTRUMT_PATH_INDEX_NONE);
this->actor.targetMode = 0;
Actor_SetScale(&this->actor, 0.008f);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->unk_328 = 0;
this->actor.room = -1;
- this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FC00(&this->actor), ENTRUMT_PATH_INDEX_NONE);
EnTruMt_ChangeAnim(&this->skelAnime, KOUME_MT_ANIM_FLY);
this->actionFunc = func_80B76A64;
}
@@ -527,7 +527,7 @@ void EnTruMt_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
}
if (limbIndex == KOUME_LIMB_BROOM) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -583,7 +583,7 @@ void EnTruMt_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(eyeTextures[this->eyeTexIndex]));
diff --git a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
index b114804d7..d25d54a24 100644
--- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
+++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
@@ -11,6 +11,8 @@ typedef void (*EnTruMtActionFunc)(struct EnTruMt*, PlayState*);
#define ENTRUMT_GET_FF(thisx) ((thisx)->params & 0xFF)
#define ENTRUMT_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENTRUMT_PATH_INDEX_NONE 0x3F
+
typedef struct EnTruMt {
/* 0x000 */ Actor actor;
/* 0x144 */ EnTruMtActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
index 87ae0791a..a404ac817 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
@@ -103,7 +103,7 @@ void func_80ADFCEC(EnTsn* this, PlayState* play) {
break;
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
if ((ENTSN_GET_F(&this->actor)) == ENTSN_F_0) {
this->actionFunc = func_80AE0D78;
} else {
@@ -144,7 +144,7 @@ void EnTsn_Init(Actor* thisx, PlayState* play) {
this->actor.terminalVelocity = -9.0f;
this->actor.gravity = -1.0f;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
}
@@ -369,7 +369,7 @@ void func_80AE0698(EnTsn* this, PlayState* play) {
this->actionFunc = func_80AE0C88;
this->unk_220 &= ~2;
this->actor.focus.pos = this->actor.world.pos;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
ENTSN_SET_Z(&this->unk_1D8->actor, false);
}
@@ -420,7 +420,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x1075:
case 0x1078:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
@@ -433,7 +433,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
func_80AE0460(this, play);
this->unk_220 &= ~2;
this->actor.focus.pos = this->actor.world.pos;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
REMOVE_QUEST_ITEM(QUEST_PICTOGRAPH);
} else {
@@ -448,7 +448,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
break;
case 0x107B:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
@@ -515,16 +515,16 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
}
if (this->unk_220 & 4) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->unk_220 &= ~4;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->unk_220 &= ~4;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -545,7 +545,7 @@ void func_80AE0D10(EnTsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
Message_CloseTextbox(play);
this->actionFunc = func_80AE0D78;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -567,7 +567,7 @@ void EnTsn_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
SkelAnime_Update(&this->skelAnime);
if (this->unk_220 & 1) {
@@ -627,7 +627,7 @@ void EnTsn_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80AE11C8[this->unk_22E]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80AE11C8[this->unk_22E]));
diff --git a/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c b/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c
index 48d7b4330..340618db7 100644
--- a/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c
+++ b/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c
@@ -289,7 +289,9 @@ void EnTuboTrap_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 10.0f, 20.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 10.0f, 20.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
Actor_SetFocus(&this->actor, 0.0f);
if (this->actor.projectedPos.z < 811.0f) {
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 205b9d9cc..b756d0f92 100644
--- a/src/overlays/actors/ovl_En_Twig/z_en_twig.c
+++ b/src/overlays/actors/ovl_En_Twig/z_en_twig.c
@@ -4,6 +4,7 @@
* Description: Beaver Race Ring
*/
+#include "prevent_bss_reordering.h"
#include "z_en_twig.h"
#include "objects/object_twig/object_twig.h"
@@ -63,7 +64,7 @@ void EnTwig_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->unk_160 = RACERING_GET_PARAM_F(&this->dyna.actor);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if (sColHeaders[this->unk_160] != NULL) {
DynaPolyActor_LoadMesh(play, &this->dyna, sColHeaders[this->unk_160]);
}
@@ -72,6 +73,7 @@ void EnTwig_Init(Actor* thisx, PlayState* play2) {
case 0:
Actor_Kill(&this->dyna.actor);
break;
+
case 1:
if (!sRingsHaveSpawned) {
sRingCount = CHECK_WEEKEVENTREG(WEEKEVENTREG_24_04) ? 25 : 20;
@@ -91,14 +93,18 @@ void EnTwig_Init(Actor* thisx, PlayState* play2) {
}
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);
+ DynaPoly_DisableCollision(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;
+
+ default:
+ break;
}
}
@@ -149,9 +155,9 @@ void func_80AC0AC8(EnTwig* this, PlayState* play) {
}
} else {
if (this->dyna.actor.xyzDistToPlayerSq <= SQ((this->dyna.actor.scale.x * 40.0f) + 40)) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(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;
@@ -165,7 +171,7 @@ 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);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = func_80AC0D2C;
}
diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
index 34551dac9..551d7d774 100644
--- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
+++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
@@ -47,18 +47,18 @@ void EnViewer_Init(Actor* thisx, PlayState* play) {
this->unk_154 = D_8089F3E0;
D_8089F3E0++;
switch (ENVIEWER_GET_3(&this->actor)) {
- case ENVIEWER_PARAMS_0:
+ case ENVIEWER_PARAM_0:
this->unk_148 = ENVIEWER_GET_8000(&this->actor) * 40.0f;
this->unk_150 = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
EnViewer_SetupAction(this, func_8089F17C);
break;
- case ENVIEWER_PARAMS_1:
+ case ENVIEWER_PARAM_1:
this->unk_148 = (u16)ENVIEWER_GET_FE00(&this->actor) * 40.0f;
this->unk_150 = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
this->unk_14C = (u16)(this->actor.world.rot.y) * 40.0f;
EnViewer_SetupAction(this, func_8089F218);
break;
- case ENVIEWER_PARAMS_2:
+ case ENVIEWER_PARAM_2:
this->unk_148 = (u16)ENVIEWER_GET_FE00(&this->actor) * 40.0f;
this->unk_14C = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
EnViewer_SetupAction(this, func_8089F2C4);
@@ -78,8 +78,8 @@ void func_8089F014(EnViewer* this, PlayState* play, f32 arg2) {
}
play->envCtx.lightSettingOverride = 0;
play->envCtx.unk_E0 = 2;
- play->envCtx.unk_C1 = this->actor.world.rot.x;
- play->envCtx.unk_C2 = this->actor.world.rot.z;
+ play->envCtx.lightSetting = this->actor.world.rot.x;
+ play->envCtx.prevLightSetting = this->actor.world.rot.z;
play->envCtx.lightBlend = arg2;
}
@@ -94,7 +94,7 @@ void func_8089F0A0(EnViewer* this, PlayState* play) {
func_800FAAB4(
play, SurfaceType_GetLightSettingIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId));
play->envCtx.lightBlend = 1.0f;
- play->envCtx.unk_C2 = play->envCtx.unk_C1;
+ play->envCtx.prevLightSetting = play->envCtx.lightSetting;
}
}
diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
index 1532e7c70..c4d2114bf 100644
--- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
+++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
@@ -22,9 +22,9 @@ typedef struct EnViewer {
} EnViewer; // size = 0x158
typedef enum {
- /* 0x0 */ ENVIEWER_PARAMS_0,
- /* 0x1 */ ENVIEWER_PARAMS_1,
- /* 0x2 */ ENVIEWER_PARAMS_2
-} EnViewerParams;
+ /* 0x0 */ ENVIEWER_PARAM_0,
+ /* 0x1 */ ENVIEWER_PARAM_1,
+ /* 0x2 */ ENVIEWER_PARAM_2
+} EnViewerParam;
#endif // Z_EN_VIEWER_H
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 aae20d26d..2f68391b1 100644
--- a/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -386,12 +386,14 @@ void func_808CCCF0(EnVm* this, PlayState* play) {
this->unk_216 += 0x5DC;
this->unk_218 += 0x9C4;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 40.0f, 7);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
this->unk_214--;
if (this->unk_214 == 1) {
- EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
- this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0x6FF, 0);
+ EnBom* bomb =
+ (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0x6FF, BOMB_TYPE_BODY);
if (bomb != NULL) {
bomb->timer = 0;
@@ -512,7 +514,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 25]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]);
POLY_OPA_DISP = &gfx[1];
@@ -522,7 +524,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play) {
if (this->unk_210 == 2) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 60]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_60]);
gDPSetColorDither(&gfx[1], G_CD_DISABLE);
Matrix_Translate(this->unk_234.x, this->unk_234.y + 10.0f, this->unk_234.z, MTXMODE_NEW);
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 63a97dab9..f4f89d79e 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -191,8 +191,8 @@ void EnWallmas_Destroy(Actor* thisx, PlayState* play) {
if (this->actor.parent != NULL) {
EnEncount1* encount1 = (EnEncount1*)this->actor.parent;
- if ((encount1->actor.update != NULL) && (encount1->unk_14E > 0)) {
- encount1->unk_14E--;
+ if ((encount1->actor.update != NULL) && (encount1->spawnActiveCount > 0)) {
+ encount1->spawnActiveCount--;
}
}
}
@@ -629,7 +629,9 @@ void EnWallmas_Update(Actor* thisx, PlayState* play) {
}
if (this->actionFunc != EnWallmas_Drop) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 0.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 25.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
}
if ((this->actionFunc != EnWallmas_Die) && (this->actionFunc != EnWallmas_Drop)) {
@@ -666,7 +668,7 @@ void EnWallmas_DrawShadow(EnWallmas* this, PlayState* play) {
gfx = POLY_OPA_DISP;
- gSPDisplayList(&gfx[0], &sSetupDL[6 * 44]);
+ gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_44]);
gDPSetPrimColor(&gfx[1], 0, 0, 0, 0, 0, 255);
func_800C0094(this->actor.floorPoly, this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
&mf);
@@ -740,7 +742,7 @@ void EnWallmas_Draw(Actor* thisx, PlayState* play) {
EnWallmas* this = THIS;
if (this->actionFunc != EnWallmas_WaitToDrop) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnWallmas_OverrideLimbDraw, EnWallmas_PostLimbDraw, &this->actor);
Actor_DrawDamageEffects(play, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), this->drawDmgEffScale,
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
index ceb1d1823..4d1466b95 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.h
@@ -8,6 +8,8 @@
#define WALLMASTER_GET_SWITCH_FLAG(thisx) (((thisx)->params >> 8) & 0xFF)
#define WALLMASTER_IS_FROZEN(thisx) ((thisx)->params & 0x80)
+#define WALLMASTER_PARAMS(type, switchFlag, isFrozen) ((type) | (((switchFlag) << 8) & 0xFF) | (((isFrozen) << 7) & 0x80))
+
/**
* This type determines under what conditions the Wallmaster will drop from the ceiling.
* - WALLMASTER_TYPE_TIMER_ONLY: These Wallmasters don't check for anything to determine
@@ -25,9 +27,9 @@
* the timer to 130 frames if the player strays too far from the Wallmaster's current position.
*/
typedef enum {
- /* 0x0 */ WALLMASTER_TYPE_TIMER_ONLY,
- /* 0x1 */ WALLMASTER_TYPE_PROXIMITY,
- /* 0x2 */ WALLMASTER_TYPE_FLAG
+ /* 0 */ WALLMASTER_TYPE_TIMER_ONLY,
+ /* 1 */ WALLMASTER_TYPE_PROXIMITY,
+ /* 2 */ WALLMASTER_TYPE_FLAG
} WallmasterType;
struct EnWallmas;
diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
index 99fa30977..06893449e 100644
--- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
+++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c
@@ -126,9 +126,9 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) {
*/
void EnWarpTag_Unused809C0A20(EnWarptag* this, PlayState* play) {
if (play->msgCtx.ocarinaMode == 9) {
- func_800B7298(play, NULL, PLAYER_CSMODE_7);
+ func_800B7298(play, NULL, PLAYER_CSMODE_WAIT);
this->actionFunc = EnWarpTag_RespawnPlayer;
- ActorCutscene_Stop(ActorCutscene_GetCurrentIndex());
+ CutsceneManager_Stop(CutsceneManager_GetCurrentCsId());
} else if (play->msgCtx.ocarinaMode >= 2) {
play->msgCtx.ocarinaMode = 4;
@@ -141,7 +141,7 @@ void EnWarpTag_Unused809C0A20(EnWarptag* this, PlayState* play) {
*/
void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
ActorEntry* playerActorEntry;
- Player* player;
+ Player* player = GET_PLAYER(play);
s32 playerSpawnIndex;
s32 new15E;
s32 entrance;
@@ -149,13 +149,13 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
u8 playerForm;
s16 playerParams;
- player = GET_PLAYER(play);
- if (play->playerActorCsIds[4] >= 0 && ActorCutscene_GetCurrentIndex() != play->playerActorCsIds[4]) {
- if (ActorCutscene_GetCanPlayNext(play->playerActorCsIds[4]) == 0) {
- ActorCutscene_SetIntentToPlay(play->playerActorCsIds[4]);
+ if ((play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON] >= 0) &&
+ (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
+ if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
+ CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(play->playerActorCsIds[4], &this->dyna.actor);
+ CutsceneManager_StartWithPlayerCs(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON], &this->dyna.actor);
Player_PlaySfx(player, NA_SE_PL_WARP_PLATE);
Play_EnableMotionBlur(0);
}
@@ -208,10 +208,9 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
// why are we getting player home rotation from the room data? doesnt player have home.rot.y?
// especially because we are converting from deg to binang, but isnt home.rot.y already in binang??
- Play_SetRespawnData(
- &play->state, 0, entrance, play->setupEntranceList[playerSpawnIndex].room, playerParams,
- &newRespawnPos,
- ((((playerActorEntry->rot.y >> 7) & 0x1FF) / 180.0f) * 32768.0f)); // DEG_TO_BINANG ?
+ Play_SetRespawnData(&play->state, 0, entrance, play->setupEntranceList[playerSpawnIndex].room,
+ playerParams, &newRespawnPos,
+ DEG_TO_BINANG_ALT((playerActorEntry->rot.y >> 7) & 0x1FF));
func_80169EFC(&play->state);
gSaveContext.respawnFlag = -5;
@@ -232,11 +231,11 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
* ActionFunc: Deku Playground, return to North Clock Town.
*/
void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->dyna.actor.cutscene) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_GetCurrentCsId() != this->dyna.actor.csId) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -246,7 +245,6 @@ void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
func_801A4058(5);
- if (1) {}
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
@@ -263,7 +261,7 @@ void EnWarptag_Update(Actor* thisx, PlayState* play) {
void EnWarpTag_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWarpTagRainbowTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
index f1400d69b..c8ec8f8c4 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.c
@@ -158,10 +158,10 @@ void EnWaterEffect_Update(Actor* thisx, PlayState* play2) {
this->unk_DC4++;
if ((this->unk_DC4 % 32) == 0) {
if (Rand_ZeroOne() < 0.5f) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, 4);
- sp88.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, UPDBGCHECKINFO_FLAG_4);
+ sp88.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp88.y = this->actor.world.pos.y;
- sp88.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp88.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
if ((this->actor.world.pos.y + this->actor.depthInWater) <= this->actor.floorHeight) {
phi_v1 = 0;
} else {
@@ -289,12 +289,12 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if ((ptr->unk_00 == 1) || (ptr->unk_00 == 2)) {
if (!phi_s4) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_004260);
@@ -326,7 +326,7 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) {
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if (ptr->unk_00 == 3) {
if (!phi_s4) {
- func_8012C448(gfxCtx);
+ Gfx_SetupDL44_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
@@ -367,9 +367,9 @@ void func_80A599E8(EnWaterEffect* this, Vec3f* arg1, u8 arg2) {
if (arg2 >= 2) {
if (arg2 == 2) {
- ptr->unk_10.x = randPlusMinusPoint5Scaled(10.0f);
+ ptr->unk_10.x = Rand_CenteredFloat(10.0f);
ptr->unk_10.y = Rand_ZeroFloat(3.0f) + 5.0f;
- ptr->unk_10.z = randPlusMinusPoint5Scaled(10.0f);
+ ptr->unk_10.z = Rand_CenteredFloat(10.0f);
}
ptr->unk_2C.z = 0.0017f;
ptr->unk_2C.x = 0.003f;
@@ -420,10 +420,10 @@ void func_80A59C04(Actor* thisx, PlayState* play2) {
this->unk_DC4++;
if (this->unk_DC6 == 0) {
this->unk_DC6 = Rand_ZeroFloat(150.0f) + 100.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, 4);
- sp74.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, UPDBGCHECKINFO_FLAG_4);
+ sp74.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp74.y = this->actor.world.pos.y;
- sp74.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp74.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
func_80A599E8(this, &sp74, 0);
}
}
@@ -524,8 +524,8 @@ void func_80A5A184(Actor* thisx, PlayState* play2) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144); i++, ptr++) {
if (ptr->unk_00 == 4) {
@@ -623,7 +623,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 165, 235, 255, 128);
@@ -634,7 +634,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
(this->actor.params == ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY)) {
if (this->unk_E2C > 1.0f) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000DE0));
Matrix_Scale(this->unk_DC8[1].y, this->unk_DC8[1].z, this->unk_DC8[1].y, MTXMODE_APPLY);
@@ -646,7 +646,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
Matrix_Pop();
if (this->unk_E30 > 1.0f) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E0C));
Matrix_Scale(this->unk_DC8[2].y, this->unk_DC8[2].z, this->unk_DC8[2].y, MTXMODE_APPLY);
@@ -661,7 +661,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
}
if ((this->unk_E34 > 1.0f) && (this->actor.params != ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E40));
Matrix_Scale(this->unk_DC8[3].y, this->unk_DC8[3].z, this->unk_DC8[3].y, MTXMODE_APPLY);
@@ -674,7 +674,7 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
if ((this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) ||
(this->actor.params == ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE)) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_water_effect_Matanimheader_000E58));
Matrix_Scale(this->unk_DC8[4].y, this->unk_DC8[4].z, this->unk_DC8[4].y, MTXMODE_APPLY);
@@ -684,12 +684,12 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) {
}
if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_144) / 2; i++, ptr++) {
if (ptr->unk_00 == 3) {
if (!phi_s4) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust1Tex));
gDPSetEnvColor(POLY_XLU_DISP++, 250, 250, 255, 0);
diff --git a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
index 433ebac62..f4b9d7284 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
@@ -24,7 +24,7 @@ typedef enum {
/* 0x309 */ ENWATEREFFECT_TYPE_GYORG_RIPPLES = 0x309, // Ripples on the surface when Gyrog enters/leaves the water
/* 0x30A */ ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY, // Large "funnel" of water that forms when Gyorg enters/leaves the water
/* 0x30B */ ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY, // Secondary "funnel" in the middle of the larger "funnel"
- /* 0x30C */ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE, // Shockwave on the surface when Gyorg rams into the central platform
+ /* 0x30C */ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE // Shockwave on the surface when Gyorg rams into the central platform
} EnWaterEffectType;
typedef struct EnWaterEffect {
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
index 530b75b0e..84f621915 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
@@ -76,32 +76,35 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->unk158 = this->actor.world.rot.y;
EnWeatherTag_SetupAction(this, func_80966A08);
break;
+
case WEATHERTAG_TYPE_UNK1:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
EnWeatherTag_SetupAction(this, func_80966B08);
break;
+
case WEATHERTAG_TYPE_WINTERFOG:
EnWeatherTag_SetupAction(this, func_80966E0C);
break;
- case WEATHERTAG_TYPE_UNK3:
- //! FAKE: this can move to different locations and still match
- if (1) {}
+ case WEATHERTAG_TYPE_UNK3:
EnWeatherTag_SetupAction(this, func_80966EF0);
break;
+
case WEATHERTAG_TYPE_UNK4:
EnWeatherTag_SetupAction(this, func_80966FEC);
break;
+
case WEATHERTAG_TYPE_UNK5:
func_800BC154(play, &play->actorCtx, &this->actor, 7);
play->skyboxId = SKYBOX_3;
- play->envCtx.unk_1F = 5;
- play->envCtx.unk_20 = 5;
+ play->envCtx.lightConfig = 5;
+ play->envCtx.changeLightNextConfig = 5;
D_801F4E74 = 1.0f;
EnWeatherTag_SetupAction(this, func_80966BF4);
break;
+
case WEATHERTAG_TYPE_WATERMURK:
pathID = WEATHER_TAG_PATHID(&this->actor);
path = &play->setupPathList[pathID];
@@ -109,32 +112,38 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->pathCount = path->count;
EnWeatherTag_SetupAction(this, func_809672DC);
break;
+
case WEATHERTAG_TYPE_LOCALDAY2RAIN:
EnWeatherTag_SetupAction(this, func_809674C8);
+ break;
+
+ default:
+ break;
}
}
// matches but unused params is suspicious
// called WeatherTag_CheckEnableWeatherEffect in OOT, that's where "weatherMode" came from
-u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 new1F, u8 new20, u16 new24,
- u8 weatherMode) {
+u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 lightConfig,
+ u8 changeLightNextConfig, u16 changeDuration, u8 weatherMode) {
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
if (WEATHER_TAG_RANGE100(&this->actor) > Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (!(play->envCtx.lightMode == 0) ||
+ ((play->envCtx.lightConfig != 1) && !play->envCtx.changeLightEnabled)) {
D_801BDBB8 = 0;
if (gWeatherMode != weatherMode) {
gWeatherMode = weatherMode;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = new1F;
- play->envCtx.unk_20 = new20;
- D_801BDBB4 = new20;
- play->envCtx.unk_24 = new24;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = lightConfig;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ D_801BDBB4 = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
returnVal = 1;
}
@@ -145,23 +154,25 @@ u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
// again with the unused parameters
// called WeatherTag_CheckRestoreWeather in OOT
-u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 new1F, u8 new20, u16 new24) {
+u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 lightConfig,
+ u8 changeLightNextConfig, u16 changeDuration) {
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
if (WEATHER_TAG_RANGE100(&this->actor) < Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (!(play->envCtx.lightMode == 0) ||
+ ((play->envCtx.lightConfig != 1) && !play->envCtx.changeLightEnabled)) {
D_801BDBB8 = 0;
gWeatherMode = 0;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = new1F;
- play->envCtx.unk_20 = new20;
- D_801BDBB4 = new20;
- play->envCtx.unk_24 = new24;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = lightConfig;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ D_801BDBB4 = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
returnVal = 1;
}
}
@@ -232,7 +243,7 @@ void EnWeatherTag_Die(EnWeatherTag* this, PlayState* play) {
// poisoned swamp: placed behind the water fall from ikana
// this tag stops spawning after STT cleared?
void func_80966B08(EnWeatherTag* this, PlayState* play) {
- if (func_80966608(this, play, 0, 0, play->envCtx.unk_1F, 5, 100, 2) || (gWeatherMode == 2)) {
+ if (func_80966608(this, play, 0, 0, play->envCtx.lightConfig, 5, 100, 2) || (gWeatherMode == 2)) {
play->skyboxId = SKYBOX_3;
EnWeatherTag_SetupAction(this, func_80966D20);
} else if (D_801F4E74 <= 0.01f) {
@@ -245,33 +256,35 @@ void func_80966B08(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_UNK5: only one in ikana canyon, corner of cliff right outside of stone tower entrance
// because it uses cutsecnes.. is this the clear ikana cutcsene?
void func_80966BF4(EnWeatherTag* this, PlayState* play) {
- u8 newUnk20;
- CsCmdActorAction* tmpAction;
+ u8 changeLightNextConfig;
+ CsCmdActorCue* cue;
- if (Cutscene_CheckActorAction(play, 567)) {
- tmpAction = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 567)];
- if ((play->csCtx.frames >= tmpAction->startFrame) && (tmpAction->action >= 2)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_567)) {
+ cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_567)];
+ if ((play->csCtx.curFrame >= cue->startFrame) && (cue->id >= 2)) {
switch (gSaveContext.save.day) {
case 0:
case 1:
default:
- newUnk20 = 0;
+ changeLightNextConfig = 0;
break;
+
case 2:
- newUnk20 = 3;
+ changeLightNextConfig = 3;
break;
+
case 3:
- newUnk20 = 4;
+ changeLightNextConfig = 4;
break;
}
Math_SmoothStepToF(&D_801F4E74, 0.0f, 0.2f, 0.02f, 0.001f);
- if (play->envCtx.unk_20 != newUnk20) {
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_20 = newUnk20;
- play->envCtx.unk_24 = 100;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ if (play->envCtx.changeLightNextConfig != changeLightNextConfig) {
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ play->envCtx.changeDuration = 100;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
}
}
@@ -287,9 +300,11 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
default:
newUnk20 = 0;
break;
+
case 2:
newUnk20 = 3;
break;
+
case 3:
newUnk20 = 4;
break;
@@ -379,14 +394,13 @@ void func_80967060(EnWeatherTag* this, PlayState* play) {
// type 4_3, start cutscene then die?
void func_80967148(EnWeatherTag* this, PlayState* play) {
- s16 tempCutscene;
+ s16 csId = this->actor.csId;
- tempCutscene = this->actor.cutscene;
- if (ActorCutscene_GetCanPlayNext(tempCutscene)) {
- ActorCutscene_Start(tempCutscene, &this->actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Start(csId, &this->actor);
EnWeatherTag_SetupAction(this, EnWeatherTag_DoNothing);
} else {
- ActorCutscene_SetIntentToPlay(tempCutscene);
+ CutsceneManager_Queue(csId);
}
}
@@ -485,8 +499,8 @@ void EnWeatherTag_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((play->actorCtx.flags & ACTORCTX_FLAG_1) && (play->msgCtx.msgMode != 0) &&
(play->msgCtx.currentTextId == 0x5E6) && !FrameAdvance_IsEnabled(&play->state) &&
- (play->transitionTrigger == TRANS_TRIGGER_OFF) && (ActorCutscene_GetCurrentIndex() == -1) &&
- (play->csCtx.state == 0)) {
+ (play->transitionTrigger == TRANS_TRIGGER_OFF) && (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) &&
+ (play->csCtx.state == CS_STATE_IDLE)) {
gSaveContext.save.time = ((void)0, gSaveContext.save.time) + (u16)R_TIME_SPEED;
if (R_TIME_SPEED != 0) {
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
index b1e7f8f86..5313aacfd 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
@@ -32,7 +32,7 @@ typedef enum {
/* 4 */ WEATHERTAG_TYPE_UNK4,
/* 5 */ WEATHERTAG_TYPE_UNK5,
/* 6 */ WEATHERTAG_TYPE_WATERMURK,
- /* 7 */ WEATHERTAG_TYPE_LOCALDAY2RAIN,
+ /* 7 */ WEATHERTAG_TYPE_LOCALDAY2RAIN
} WeatherTagType;
#endif // Z_EN_WEATHER_TAG_H
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 4ed6b6a7d..26301730f 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -471,14 +471,15 @@ void func_80990C6C(EnWf* this, PlayState* play, s32 arg2) {
static Color_RGBA8 D_809942EC = { 255, 255, 255, 255 };
s32 i;
Vec3f sp88;
- u32 temp_v0;
+ FloorType floorType;
Color_RGBA8* phi_s1;
s16 phi_s6;
if (this->actor.floorPoly != NULL) {
- temp_v0 = func_800C99D4(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
- if (temp_v0 != 5) {
- if ((temp_v0 == 15) || (temp_v0 == 14)) {
+ floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+
+ if (floorType != FLOOR_TYPE_5) {
+ if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
phi_s1 = &D_809942EC;
phi_s6 = Rand_ZeroFloat(150.0f) + 350.0f;
arg2 += 2;
@@ -488,9 +489,9 @@ void func_80990C6C(EnWf* this, PlayState* play, s32 arg2) {
}
for (i = 0; i < arg2; i++) {
- sp88.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ sp88.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp88.y = Rand_ZeroFloat(5.0f) + this->actor.world.pos.y;
- sp88.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp88.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
func_800B0F18(play, &sp88, &gZeroVec3f, &D_809942DC, phi_s1, phi_s1, phi_s6, 5,
Rand_ZeroFloat(5.0f) + 14.0f);
}
@@ -615,7 +616,8 @@ void func_80991280(EnWf* this, PlayState* play) {
if (!func_8099408C(play, this) && !func_80990948(play, this, 0)) {
phi_v1 = ABS_ALT(BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y));
- if ((this->actor.xzDistToPlayer < 80.0f) && (player->meleeWeaponState != 0) && (phi_v1 >= 0x1F40)) {
+ if ((this->actor.xzDistToPlayer < 80.0f) && (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) &&
+ (phi_v1 >= 0x1F40)) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
func_80991948(this);
@@ -665,7 +667,8 @@ void func_8099149C(EnWf* this, PlayState* play) {
sp28 = ABS_ALT(BINANG_SUB(player->actor.shape.rot.y, this->actor.shape.rot.y));
- if ((this->actor.xzDistToPlayer < (150.0f + sp2C)) && (player->meleeWeaponState != 0) && (sp28 >= 0x1F40)) {
+ if ((this->actor.xzDistToPlayer < (150.0f + sp2C)) &&
+ (player->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) && (sp28 >= 0x1F40)) {
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
if (Rand_ZeroOne() > 0.7f) {
@@ -1196,9 +1199,9 @@ void func_80992E0C(EnWf* this, PlayState* play) {
this->unk_2A0--;
for (i = (25 - this->unk_2A0) >> 1; i >= 0; i--) {
- sp60.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp60.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp60.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp60.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp60.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp60.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp60, &D_809942F0, &D_809942F0, 100, 0, 2);
}
@@ -1485,7 +1488,9 @@ void EnWf_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 60.0f, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 32.0f, 30.0f, 60.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
func_80993738(this, play);
if (this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) {
@@ -1570,7 +1575,7 @@ void EnWf_Draw(Actor* thisx, PlayState* play) {
if (this->actionFunc != func_80990F50) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actor.params == 0) {
gSPSegment(POLY_OPA_DISP++, 0x08, sNormalEyeTextures[this->eyeIndex]);
diff --git a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
index 26f126e72..6ce68a0e3 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.c
@@ -8,8 +8,8 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h"
-#define FLAGS \
- (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_1000 | ACTOR_FLAG_100000 | \
+#define FLAGS \
+ (ACTOR_FLAG_1 | ACTOR_FLAG_4 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_100000 | \
ACTOR_FLAG_CANT_LOCK_ON | ACTOR_FLAG_80000000)
#define THIS ((EnWiz*)thisx)
@@ -37,8 +37,8 @@ void EnWiz_SetupDead(EnWiz* this);
void EnWiz_Dead(EnWiz* this, PlayState* play);
// This number is almost-entirely arbirary, with the only requirement being
-// that cannot be a valid curPlatformIndex. Any negative number, or any number
-// larger than 10, would work just as well.
+// that it cannot be a valid curPlatformIndex. Any negative number, or any
+// number larger than 10, would work just as well.
#define INITIAL_PLATFORM_INDEX 777
typedef enum {
@@ -50,7 +50,7 @@ typedef enum {
/* 6 */ EN_WIZ_ACTION_BURST_INTO_FLAMES,
/* 7 */ EN_WIZ_ACTION_RUN_IN_CIRCLES,
/* 8 */ EN_WIZ_ACTION_ATTACK,
- /* 9 */ EN_WIZ_ACTION_DANCE,
+ /* 9 */ EN_WIZ_ACTION_DANCE
} EnWizAction;
typedef enum {
@@ -68,7 +68,7 @@ typedef enum {
/* 0 */ EN_WIZ_FIGHT_STATE_FIRST_PHASE,
/* 1 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE,
/* 2 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_COPY_WIZROBE,
- /* 3 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_RUN_AROUND,
+ /* 3 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_RUN_AROUND
} EnWizFightState;
typedef enum {
@@ -77,7 +77,7 @@ typedef enum {
/* 2 */ EN_WIZ_ANIM_DANCE,
/* 3 */ EN_WIZ_ANIM_WIND_UP,
/* 4 */ EN_WIZ_ANIM_ATTACK,
- /* 5 */ EN_WIZ_ANIM_DAMAGE,
+ /* 5 */ EN_WIZ_ANIM_DAMAGE
} EnWizAnimation;
ActorInit En_Wiz_InitVars = {
@@ -239,12 +239,12 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef enum {
- /* 0x0 */ EN_WIZ_DMGEFF_IMMUNE, // Deals no damage
- /* 0x1 */ EN_WIZ_DMGEFF_UNK1, // Deals no damage. Was probably originally intended for destroying ghosts.
- /* 0x2 */ EN_WIZ_DMGEFF_FIRE, // Damages and sets Ice Wizrobes on fire
- /* 0x3 */ EN_WIZ_DMGEFF_FREEZE, // Damages and surrounds Fire Wizrobes with ice
- /* 0x4 */ EN_WIZ_DMGEFF_LIGHT_ORB, // Damages and surrounds the Wizrobe with light orbs
- /* 0xF */ EN_WIZ_DMGEFF_NONE = 0xF, // Deals regular damage and has no special effect
+ /* 0x0 */ EN_WIZ_DMGEFF_IMMUNE, // Deals no damage
+ /* 0x1 */ EN_WIZ_DMGEFF_UNK1, // Deals no damage. Was probably originally intended for destroying ghosts.
+ /* 0x2 */ EN_WIZ_DMGEFF_FIRE, // Damages and sets Ice Wizrobes on fire
+ /* 0x3 */ EN_WIZ_DMGEFF_FREEZE, // Damages and surrounds Fire Wizrobes with ice
+ /* 0x4 */ EN_WIZ_DMGEFF_LIGHT_ORB, // Damages and surrounds the Wizrobe with light orbs
+ /* 0xF */ EN_WIZ_DMGEFF_NONE = 0xF // Deals regular damage and has no special effect
} EnWizDamageEffect;
static DamageTable sFireWizrobeDamageTable = {
@@ -601,6 +601,9 @@ void EnWiz_SelectPlatform(EnWiz* this, PlayState* play) {
break;
case EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE:
+ //! @bug: Setting the Wizrobe's position to the first platform *without* updating
+ //! this->curPlatformIndex can cause a bug later in EnWiz_Damaged. One way to fix
+ //! this is to set this->curPlatformIndex to 0 here.
Math_Vec3f_Copy(&this->actor.world.pos, &this->platforms[0]->world.pos);
for (i = 0, ghostAlpha = 128; i < this->platformCount; i++, ghostAlpha -= 10) {
Math_Vec3f_Copy(&this->ghostPos[i], &this->actor.world.pos);
@@ -668,13 +671,13 @@ void EnWiz_MoveGhosts(EnWiz* this) {
}
void EnWiz_StartIntroCutscene(EnWiz* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetFlag(this->actor.cutscene, &this->actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCsAndSetFlag(this->actor.csId, &this->actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
this->actor.flags |= ACTOR_FLAG_100000;
EnWiz_SetupAppear(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -828,13 +831,13 @@ void EnWiz_Dance(EnWiz* this, PlayState* play) {
}
void EnWiz_SetupSecondPhaseCutscene(EnWiz* this, PlayState* play) {
- s16 secondPhaseCutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ s16 secondPhaseCsId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- if (!ActorCutscene_GetCanPlayNext(secondPhaseCutscene)) {
- ActorCutscene_SetIntentToPlay(secondPhaseCutscene);
+ if (!CutsceneManager_IsNext(secondPhaseCsId)) {
+ CutsceneManager_Queue(secondPhaseCsId);
} else {
- ActorCutscene_StartAndSetFlag(secondPhaseCutscene, &this->actor);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(secondPhaseCutscene);
+ CutsceneManager_StartWithPlayerCsAndSetFlag(secondPhaseCsId, &this->actor);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(secondPhaseCsId);
this->actor.flags |= ACTOR_FLAG_100000;
EnWiz_ChangeAnim(this, EN_WIZ_ANIM_DANCE, false);
this->action = EN_WIZ_ACTION_RUN_BETWEEN_PLATFORMS;
@@ -885,7 +888,7 @@ void EnWiz_SecondPhaseCutscene(EnWiz* this, PlayState* play) {
this->platformCount = 0;
this->fightState = EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_COPY_WIZROBE;
this->timer = 0;
- ActorCutscene_Stop(ActorCutscene_GetAdditionalCutscene(this->actor.cutscene));
+ CutsceneManager_Stop(CutsceneManager_GetAdditionalCsId(this->actor.csId));
this->actor.flags &= ~ACTOR_FLAG_100000;
EnWiz_SetupDisappear(this);
return;
@@ -1037,7 +1040,7 @@ void EnWiz_Disappear(EnWiz* this, PlayState* play) {
if ((this->introCutsceneState == EN_WIZ_INTRO_CS_DISAPPEAR) && (this->introCutsceneTimer == 0)) {
this->introCutsceneState = EN_WIZ_INTRO_CS_END;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
this->actor.flags &= ~ACTOR_FLAG_100000;
}
@@ -1120,6 +1123,17 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
this->ghostRot[i].y += this->rotationalVelocity;
}
+ //! @bug: When the Wizrobe is defeated, it is launched into the air by the code above, and the
+ //! last check in this conditional is intended to check that the Wizrobe is standing on its
+ //! platform before transitioning to a different state. However, when the fight is in the
+ //! EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE state, the Wizrobe will always appear on top of
+ //! the first platform, while its curPlatformIndex is allowed to randomly choose any other
+ //! platform in the room. If the Wizrobe is defeated in this state (which is possible with a
+ //! well-timed attack before the cutscene starts), and if the first platform is elevated above
+ //! other platforms in the room (as it is in the Secret Shrine), then it is possible for
+ //! this->platforms[this->curPlatformIndex]->world.pos.y to be under the floor compared to the
+ //! Wizrobe's current position, causing it to get stuck here and never actually die. This can
+ //! be fixed by addressing the bug in EnWiz_SelectPlatform.
if ((this->timer == 1) ||
((this->actor.velocity.y < 0.0f) &&
(this->actor.world.pos.y < (this->platforms[this->curPlatformIndex]->world.pos.y + 11.0f)))) {
@@ -1151,7 +1165,9 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
Math_SmoothStepToS(&this->platformLightAlpha, this->targetPlatformLightAlpha, 20, 50, 10);
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 40.0f, 40.0f, 0x1F);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 40.0f, 40.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
}
void EnWiz_SetupDead(EnWiz* this) {
@@ -1281,7 +1297,7 @@ void EnWiz_UpdateDamage(EnWiz* this, PlayState* play) {
scaleStep = Rand_S16Offset(20, 10);
Math_Vec3f_Copy(&pos, &this->ghostPos[i]);
pos.x += (f32)Rand_S16Offset(20, 20) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1);
- pos.y += 70.0f + randPlusMinusPoint5Scaled(30.0f);
+ pos.y += 70.0f + Rand_CenteredFloat(30.0f);
pos.z += (f32)Rand_S16Offset(20, 20) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1);
func_800B0DE0(play, &pos, &velocity, &accel, &sDustPrimColor, &sDustEnvTimer,
Rand_S16Offset(350, 100), scaleStep);
@@ -1403,9 +1419,9 @@ void EnWiz_PostLimbDrawXlu(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_MultVec3f(&staffFlamePos, &flamePos);
- flamePos.x += randPlusMinusPoint5Scaled(4.0f);
- flamePos.y += randPlusMinusPoint5Scaled(7.0f);
- flamePos.z += randPlusMinusPoint5Scaled(5.0f);
+ flamePos.x += Rand_CenteredFloat(4.0f);
+ flamePos.y += Rand_CenteredFloat(7.0f);
+ flamePos.z += Rand_CenteredFloat(5.0f);
func_800B3030(play, &flamePos, &gZeroVec3f, &gZeroVec3f, ((Rand_ZeroFloat(1.0f) * 50.0f) + 70.0f), 10, 1);
SoundSource_PlaySfxAtFixedWorldPos(play, &flamePos, 10, NA_SE_EN_EXTINCT);
}
@@ -1435,8 +1451,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->action == EN_WIZ_ACTION_BURST_INTO_FLAMES) || (this->alpha != 255)) {
Scene_SetRenderModeXlu(play, 1, 2);
@@ -1486,8 +1502,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
}
for (i = 0; i < platformCount; i++) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if ((this->ghostPos[i].x != 0.0f) && (this->ghostPos[i].z != 0.0f)) {
Matrix_Translate(this->ghostPos[i].x, this->ghostPos[i].y + 10.0f, this->ghostPos[i].z, MTXMODE_NEW);
@@ -1513,8 +1529,8 @@ void EnWiz_Draw(Actor* thisx, PlayState* play) {
Matrix_Pop();
}
- func_8012C2DC(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
// Draw the light emanating from the Wizrobe's platform
if (this->fightState == EN_WIZ_FIGHT_STATE_FIRST_PHASE) {
diff --git a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
index 4d35a0f68..70f7a6c64 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
@@ -10,7 +10,7 @@
typedef enum {
/* 0 */ EN_WIZ_TYPE_FIRE,
/* 1 */ EN_WIZ_TYPE_ICE,
- /* 2 */ EN_WIZ_TYPE_FIRE_NO_BGM, // does not request the mini-boss BGM
+ /* 2 */ EN_WIZ_TYPE_FIRE_NO_BGM // does not request the mini-boss BGM
} EnWizType;
struct EnWiz;
diff --git a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
index 4a3689005..ac6ae3152 100644
--- a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
+++ b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.c
@@ -96,8 +96,8 @@ void EnWizBrock_Draw(Actor* thisx, PlayState* play) {
s32 pad;
EnWizBrock* this = THIS;
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(play->state.gfxCtx);
@@ -121,6 +121,7 @@ void EnWizBrock_Draw(Actor* thisx, PlayState* play) {
if (this->platformType != EN_WIZ_BROCK_PLATFORM_TYPE_INACTIVE) {
OPEN_DISPS(play->state.gfxCtx);
+
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWizrobePlatformCenterTexAnim));
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
index 3df0362ed..651aac8ea 100644
--- a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
+++ b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
@@ -7,7 +7,7 @@ typedef enum {
/* 0 */ EN_WIZ_BROCK_PLATFORM_TYPE_INACTIVE,
/* 1 */ EN_WIZ_BROCK_PLATFORM_TYPE_FIRE,
/* 2 */ EN_WIZ_BROCK_PLATFORM_TYPE_ICE,
- /* 3 */ EN_WIZ_BROCK_PLATFORM_TYPE_MAX,
+ /* 3 */ EN_WIZ_BROCK_PLATFORM_TYPE_MAX
} EnWizBrockPlatformType;
struct EnWizBrock;
diff --git a/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c b/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
index bf63fcc3c..e6fc7e776 100644
--- a/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
+++ b/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.c
@@ -32,7 +32,7 @@ typedef enum {
/* 0 */ EN_WIZ_FIRE_ACTION_MOVE_MAGIC_PROJECTILE,
/* 1 */ EN_WIZ_FIRE_ACTION_SMALL_FLAME,
/* 2 */ EN_WIZ_FIRE_ACTION_POOL,
- /* 3 */ EN_WIZ_FIRE_ACTION_KILL_MAGIC_PROJECTILE,
+ /* 3 */ EN_WIZ_FIRE_ACTION_KILL_MAGIC_PROJECTILE
} EnWizFireAction;
static s32 sPoolHitByIceArrow = false;
@@ -152,7 +152,7 @@ void EnWiz_SetupMoveMagicProjectile(EnWizFire* this, PlayState* play) {
Matrix_RotateXS(this->actor.world.rot.x, MTXMODE_APPLY);
if (this->type != EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) {
- velocity.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
+ velocity.z = Rand_CenteredFloat(2.0f) + 8.0f;
} else {
velocity.z = 12.0f;
}
@@ -223,8 +223,8 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
this->increaseLowestUsedIndexTimer = 10;
Matrix_Push();
- Matrix_RotateYS((s16)randPlusMinusPoint5Scaled(0x100) + this->actor.world.rot.y, MTXMODE_NEW);
- velocity.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
+ Matrix_RotateYS((s16)(s32)Rand_CenteredFloat(0x100) + this->actor.world.rot.y, MTXMODE_NEW);
+ velocity.z = Rand_CenteredFloat(2.0f) + 8.0f;
Matrix_MultVec3f(&velocity, &this->actor.velocity);
Matrix_Pop();
@@ -257,7 +257,7 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WIZ_FIRE, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, arcingProjectileRotY, 0,
EN_WIZ_FIRE_TYPE_ARCING_MAGIC_PROJECTILE);
- arcingProjectileRotY += BINANG_ADD((s32)randPlusMinusPoint5Scaled(0x1000), 0x3333);
+ arcingProjectileRotY += BINANG_ADD((s32)Rand_CenteredFloat(0x1000), 0x10000 / 5);
}
Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
@@ -313,9 +313,9 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
void EnWiz_SetupSmallFlame(EnWizFire* this, PlayState* play) {
this->targetScale = 0.02f;
this->timer = Rand_S16Offset(50, 50);
- this->scaleMod.x = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
- this->scaleMod.y = randPlusMinusPoint5Scaled(1.0f) * 0.005f;
- this->scaleMod.z = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
+ this->scaleMod.x = Rand_CenteredFloat(1.0f) * 0.007f;
+ this->scaleMod.y = Rand_CenteredFloat(1.0f) * 0.005f;
+ this->scaleMod.z = Rand_CenteredFloat(1.0f) * 0.007f;
this->actionFunc = EnWiz_SmallFlame;
}
@@ -379,13 +379,13 @@ void EnWiz_Pool(EnWizFire* this, PlayState* play) {
Vec3f accel = { 0.0f, 0.0f, 0.0f };
Vec3f pos;
- accel.x = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
+ accel.x = Rand_CenteredFloat(3.0f) / 10.0f;
accel.y = 0.23f;
- accel.z = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
+ accel.z = Rand_CenteredFloat(3.0f) / 10.0f;
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
- pos.x += randPlusMinusPoint5Scaled(150.0f);
- pos.z += randPlusMinusPoint5Scaled(150.0f);
+ pos.x += Rand_CenteredFloat(150.0f);
+ pos.z += Rand_CenteredFloat(150.0f);
Math_ApproachF(&this->poolScale, 0.022f, 0.3f, 0.01f);
this->collider.dim.radius = this->poolScale * 4300.0f;
@@ -573,7 +573,9 @@ void EnWizFire_Update(Actor* thisx, PlayState* play2) {
DECR(this->steamSpawnTimer);
DECR(this->poolTimer);
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 5.0f, 10, 0x1D);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 5.0f, 10,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
+ UPDBGCHECKINFO_FLAG_10);
if ((this->hitByIceArrow || sPoolHitByIceArrow) && (this->steamSpawnTimer == 0)) {
Vec3f accel;
@@ -656,8 +658,8 @@ void EnWizFire_DrawIcePool(EnWizFire* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if ((this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) && (this->action == EN_WIZ_FIRE_ACTION_POOL)) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z, MTXMODE_NEW);
Matrix_Scale(this->poolScale, this->poolScale, this->poolScale, MTXMODE_APPLY);
@@ -689,8 +691,8 @@ void EnWizFire_DrawFirePoolAndFlame(EnWizFire* this, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
if ((this->type == EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) && (this->action == EN_WIZ_FIRE_ACTION_POOL)) {
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Push();
Matrix_Translate(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z, MTXMODE_NEW);
@@ -752,8 +754,8 @@ void EnWizFire_Draw(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Push();
for (i = ARRAY_COUNT(this->magicProjectilePos) - 1; i >= this->lowestUsedIndex; i--) {
@@ -873,8 +875,8 @@ void EnWizFire_DrawEffects(EnWizFire* this, PlayState* play) {
OPEN_DISPS(gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
materialFlag = false;
for (i = 0; i < ARRAY_COUNT(this->effects); i++, effect++) {
diff --git a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
index 9b74a97ac..cf4331ffa 100644
--- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -202,7 +202,7 @@ void EnWood02_Init(Actor* thisx, PlayState* play) {
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ANI, this->actor.world.pos.x,
this->actor.world.pos.y + 120.0f, this->actor.world.pos.z - 15.0f, 0, 0, 0, 1);
if (this->actor.child != NULL) {
- this->actor.child->cutscene = this->actor.cutscene;
+ this->actor.child->csId = this->actor.csId;
}
this->unk_151 = 1;
} else {
@@ -264,8 +264,8 @@ void EnWood02_Init(Actor* thisx, PlayState* play) {
case WOOD_LEAF_YELLOW:
this->unk_14A[0] = 75;
actorScale = 0.02f;
- this->actor.velocity.x = randPlusMinusPoint5Scaled(6.0f);
- this->actor.velocity.z = randPlusMinusPoint5Scaled(6.0f);
+ this->actor.velocity.x = Rand_CenteredFloat(6.0f);
+ this->actor.velocity.z = Rand_CenteredFloat(6.0f);
this->actor.velocity.y = (Rand_ZeroOne() * 1.25f) + -3.1f;
break;
}
@@ -409,7 +409,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
for (i = 3; i >= 0; i--) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WOOD02, dropsSpawnPt.x, dropsSpawnPt.y, dropsSpawnPt.z,
- 0, randPlusMinusPoint5Scaled(0xFFFF), 0, leavesParams);
+ 0, Rand_CenteredFloat(0xFFFF), 0, leavesParams);
}
}
@@ -486,10 +486,10 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) {
red = green = blue = 255;
}
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
if ((thisx->params == WOOD_LEAF_GREEN) || (thisx->params == WOOD_LEAF_YELLOW)) {
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, red, green, blue, 127);
@@ -501,7 +501,7 @@ void EnWood02_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_808C4D70[this->drawType & 0xF]);
} else {
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_808C4D54[this->drawType & 0xF]);
diff --git a/src/overlays/actors/ovl_En_Yb/z_en_yb.c b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
index 7a751c7ce..9238a166b 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -68,7 +68,10 @@ static ColliderCylinderInit sCylinderInit = {
// assumption: draw uses two different skeleton functions, might be incompatible
static AnimationHeader* gYbUnusedAnimations[] = { &object_yb_Anim_000200 };
-static LinkAnimationHeader* gLinkAnimations[] = { &gPlayerAnim_link_normal_wait_free, &gPlayerAnim_alink_dance_loop };
+static PlayerAnimationHeader* gPlayerAnimations[] = {
+ &gPlayerAnim_link_normal_wait_free,
+ &gPlayerAnim_alink_dance_loop,
+};
static Vec3f D_80BFB2E8 = { 0.0f, 0.5f, 0.0f };
@@ -78,7 +81,7 @@ static Vec3f D_80BFB300 = { 500.0f, -500.0f, 0.0f };
void EnYb_Init(Actor* thisx, PlayState* play) {
EnYb* this = THIS;
- s16 tempCutscene;
+ s16 csId;
s32 i;
Actor_SetScale(&this->actor, 0.01f);
@@ -99,17 +102,17 @@ void EnYb_Init(Actor* thisx, PlayState* play) {
EnYb_ChangeAnim(play, this, 2, ANIMMODE_LOOP, 0.0f);
- tempCutscene = this->actor.cutscene;
- for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) {
- this->cutscenes[i] = tempCutscene;
- if (tempCutscene != -1) {
- this->actor.cutscene = tempCutscene;
- tempCutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ csId = this->actor.csId;
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
- this->cutsceneIndex = -1;
- this->actor.cutscene = this->cutscenes[0];
+ this->csIdIndex = -1;
+ this->actor.csId = this->csIdList[0];
// between midnight and morning start spawned
if (gSaveContext.save.time < CLOCK_TIME(6, 0)) {
@@ -133,9 +136,9 @@ void EnYb_Destroy(Actor* thisx, PlayState* play) {
void func_80BFA2FC(PlayState* play) {
if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
- func_80151BB4(play, 0x34);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK);
}
- func_80151BB4(play, 0xF);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAMARO);
}
/**
@@ -167,18 +170,18 @@ void EnYb_ActorShadowFunc(Actor* thisx, Lights* mapper, PlayState* play) {
}
void EnYb_ChangeAnim(PlayState* play, EnYb* this, s16 animIndex, u8 animMode, f32 morphFrames) {
- if (animIndex >= 0 && animIndex < 3) {
- if (animIndex != this->animIndex || animMode != ANIMMODE_LOOP) {
+ if ((animIndex >= 0) && (animIndex < 3)) {
+ if ((animIndex != this->animIndex) || (animMode != ANIMMODE_LOOP)) {
if (animIndex > 0) {
if (animMode == ANIMMODE_LOOP) {
- LinkAnimation_Change(play, &this->skelAnime, gLinkAnimations[animIndex - 1], 1.0f, 0.0f,
- Animation_GetLastFrame(gLinkAnimations[animIndex - 1]), ANIMMODE_LOOP,
- morphFrames);
+ PlayerAnimation_Change(play, &this->skelAnime, gPlayerAnimations[animIndex - 1], 1.0f, 0.0f,
+ Animation_GetLastFrame(gPlayerAnimations[animIndex - 1]), ANIMMODE_LOOP,
+ morphFrames);
} else {
// unused case, (only called once with animMode = ANIMMODE_LOOP)
- LinkAnimation_Change(play, &this->skelAnime, gLinkAnimations[animIndex - 1], 1.0f, 0.0f,
- Animation_GetLastFrame(gLinkAnimations[animIndex - 1]), ANIMMODE_LOOP,
- morphFrames);
+ PlayerAnimation_Change(play, &this->skelAnime, gPlayerAnimations[animIndex - 1], 1.0f, 0.0f,
+ Animation_GetLastFrame(gPlayerAnimations[animIndex - 1]), ANIMMODE_LOOP,
+ morphFrames);
}
} else {
// unused case, (only called once with animIndex = 2)
@@ -195,7 +198,7 @@ void EnYb_ChangeAnim(PlayState* play, EnYb* this, s16 animIndex, u8 animMode, f3
}
s32 EnYb_CanTalk(EnYb* this, PlayState* play) {
- if (this->actor.xzDistToPlayer < 100.0f && Player_IsFacingActor(&this->actor, 0x3000, play) &&
+ if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x3000)) {
return true;
} else {
@@ -207,22 +210,22 @@ void EnYb_UpdateAnimation(EnYb* this, PlayState* play) {
if (this->animIndex <= 0) {
SkelAnime_Update(&this->skelAnime);
} else {
- LinkAnimation_Update(play, &this->skelAnime);
+ PlayerAnimation_Update(play, &this->skelAnime);
}
}
void EnYb_FinishTeachingCutscene(EnYb* this) {
- if (this->cutsceneIndex != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->cutscenes[this->cutsceneIndex]) {
- ActorCutscene_Stop(this->cutscenes[this->cutsceneIndex]);
+ if (this->csIdIndex != -1) {
+ if (CutsceneManager_GetCurrentCsId() == this->csIdList[this->csIdIndex]) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
- this->cutsceneIndex = -1;
+ this->csIdIndex = -1;
}
}
-void EnYb_ChangeCutscene(EnYb* this, s16 cutsceneId) {
+void EnYb_ChangeCutscene(EnYb* this, s16 csIdIndex) {
EnYb_FinishTeachingCutscene(this);
- this->cutsceneIndex = cutsceneId;
+ this->csIdIndex = csIdIndex;
}
/**
@@ -239,9 +242,9 @@ void EnYb_Disappear(EnYb* this, PlayState* play) {
EnYb_UpdateAnimation(this, play);
for (i = 3; i >= 0; i--) {
- sp60.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp60.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp60.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp60.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp60.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp60.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp60, &D_80BFB2E8, &D_80BFB2E8, 100, 0, 2);
}
@@ -293,6 +296,7 @@ void EnYb_Talk(EnYb* this, PlayState* play) {
this->actionFunc = EnYb_Disappear;
SET_WEEKEVENTREG(WEEKEVENTREG_82_04);
break;
+
case 0x147C: // Spread my dance across the world
if (Player_GetMask(play) == PLAYER_MASK_KAMARO) {
Message_CloseTextbox(play);
@@ -308,6 +312,7 @@ void EnYb_Talk(EnYb* this, PlayState* play) {
EnYb_ReceiveMask(this, play);
}
break;
+
default:
Message_CloseTextbox(play);
this->actionFunc = EnYb_Idle;
@@ -350,9 +355,9 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnYb_UpdateAnimation(this, play);
- if (this->actor.xzDistToPlayer < 180.0f && fabsf(this->actor.playerHeightRel) < 50.0f &&
- play->msgCtx.ocarinaMode == 3 && play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING &&
- gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((this->actor.xzDistToPlayer < 180.0f) && (fabsf(this->actor.playerHeightRel) < 50.0f) &&
+ (play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
this->actionFunc = EnYb_TeachingDance;
this->teachingCutsceneTimer = 200;
EnYb_ChangeCutscene(this, 0);
@@ -374,8 +379,8 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
if (!(player->stateFlags2 & PLAYER_STATE2_8000000)) {
this->playerOcarinaOut &= ~1;
}
- } else if ((player->stateFlags2 & PLAYER_STATE2_8000000) && this->actor.xzDistToPlayer < 180.0f &&
- fabsf(this->actor.playerHeightRel) < 50.0f) {
+ } else if ((player->stateFlags2 & PLAYER_STATE2_8000000) && (this->actor.xzDistToPlayer < 180.0f) &&
+ (fabsf(this->actor.playerHeightRel) < 50.0f)) {
this->playerOcarinaOut |= 1;
Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
}
@@ -406,21 +411,21 @@ void EnYb_Update(Actor* thisx, PlayState* play) {
}
if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_1)) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 40.0f, 25.0f, 40.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
}
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])) {
- if (this->cutsceneIndex == 0) {
- ActorCutscene_StartAndSetUnkLinkFields(this->cutscenes[this->cutsceneIndex], &this->actor);
+ if ((this->csIdIndex != -1) && (CutsceneManager_GetCurrentCsId() != this->csIdList[this->csIdIndex])) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ if (this->csIdIndex == 0) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[this->csIdIndex], &this->actor);
}
} else {
- ActorCutscene_SetIntentToPlay(this->cutscenes[this->cutsceneIndex]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
}
@@ -455,22 +460,20 @@ void EnYb_Draw(Actor* thisx, PlayState* play) {
if (this->alpha != 0) {
if (this->alpha < 255) {
if (this->alpha > 128) {
- func_8012C2B4(POLY_XLU_DISP++);
+ Gfx_SetupDL71(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
Scene_SetRenderModeXlu(play, 1, 2);
}
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
- if (1) {}
-
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, EnYb_PostLimbDrawXlu, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 0, 1);
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, EnYb_PostLimbDrawOpa, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Yb/z_en_yb.h b/src/overlays/actors/ovl_En_Yb/z_en_yb.h
index c7b977653..4728ef44e 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.h
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.h
@@ -20,8 +20,8 @@ typedef struct EnYb {
/* 0x410 */ u16 playerOcarinaOut;
/* 0x412 */ s16 animIndex;
/* 0x414 */ s16 alpha;
- /* 0x416 */ s16 cutscenes[2];
- /* 0x41A */ s16 cutsceneIndex;
+ /* 0x416 */ s16 csIdList[2];
+ /* 0x41A */ s16 csIdIndex;
/* 0x41C */ s16 teachingCutsceneTimer;
/* 0x420 */ EnYbActionFunc actionFunc;
} EnYb; // size = 0x424
diff --git a/src/overlays/actors/ovl_En_Zo/z_en_zo.c b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
index 0e282656c..ba71bbd7f 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.c
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
@@ -122,7 +122,7 @@ s32 EnZo_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s32 EnZo_PlayWalkingSound(EnZo* this, PlayState* play) {
u8 leftWasGrounded;
u8 rightWasGrounded;
- s32 waterSfxId;
+ SurfaceSfxOffset surfaceSfxOffset;
u16 sfxId;
u8 isFootGrounded;
@@ -131,13 +131,14 @@ s32 EnZo_PlayWalkingSound(EnZo* this, PlayState* play) {
if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
if (this->actor.depthInWater < 20.0f) {
- waterSfxId = NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_SHALLOW;
} else {
- waterSfxId = NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ surfaceSfxOffset = SURFACE_SFX_OFFSET_WATER_DEEP;
}
- sfxId = waterSfxId + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND + surfaceSfxOffset;
} else {
- sfxId = SurfaceType_GetSfx(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) + SFX_FLAG;
+ sfxId = NA_SE_PL_WALK_GROUND +
+ SurfaceType_GetSfxOffset(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
}
this->isLeftFootGrounded = isFootGrounded = SubS_IsFloorAbove(play, &this->leftFootPos, -6.0f);
@@ -205,11 +206,11 @@ void EnZo_LookAtPlayer(EnZo* this, PlayState* play) {
}
void EnZo_Walk(EnZo* this, PlayState* play) {
- if (ENZO_GET_PATH(&this->actor) != 0x3F) {
+ if (ENZO_GET_PATH_INDEX(&this->actor) != ENZO_PATH_INDEX_NONE) {
EnZo_ChangeAnim(&this->skelAnime, 6);
}
- if (ENZO_GET_PATH(&this->actor) != 0x3F) {
+ if (ENZO_GET_PATH_INDEX(&this->actor) != ENZO_PATH_INDEX_NONE) {
this->actionFunc = EnZo_FollowPath;
} else {
this->actionFunc = EnZo_DoNothing;
@@ -263,7 +264,7 @@ void EnZo_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH_INDEX(&this->actor), ENZO_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = EnZo_Walk;
@@ -280,7 +281,7 @@ void EnZo_Update(Actor* thisx, PlayState* play) {
EnZo* this = THIS;
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
EnZo_LookAtPlayer(this, play);
EnZo_PlayWalkingSound(this, play);
EnZo_UpdateCollider(this, play);
@@ -346,7 +347,8 @@ void EnZo_Draw(Actor* thisx, PlayState* play) {
TexturePtr eyeTextures[] = { gZoraEyeOpenTex, gZoraEyeHalfTex, gZoraEyeClosedTex };
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
@@ -369,5 +371,6 @@ void EnZo_Draw(Actor* thisx, PlayState* play) {
}
SubS_DrawShadowTex(&this->actor, &play->state, shadowTex);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Zo/z_en_zo.h b/src/overlays/actors/ovl_En_Zo/z_en_zo.h
index bfd0c79dd..9d32f63e5 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.h
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.h
@@ -8,7 +8,9 @@ struct EnZo;
typedef void (*EnZoActionFunc)(struct EnZo*, PlayState*);
-#define ENZO_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENZO_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENZO_PATH_INDEX_NONE 0x3F
typedef struct EnZo {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Zob/z_en_zob.c b/src/overlays/actors/ovl_En_Zob/z_en_zob.c
index 895c5c032..cdf6b1766 100644
--- a/src/overlays/actors/ovl_En_Zob/z_en_zob.c
+++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.c
@@ -80,7 +80,7 @@ Vec3f D_80BA1120 = { 300.0f, 900.0f, 0.0f };
void EnZob_Init(Actor* thisx, PlayState* play) {
EnZob* this = THIS;
s32 i;
- s16 cs;
+ s16 csId;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@@ -90,8 +90,8 @@ void EnZob_Init(Actor* thisx, PlayState* play) {
Animation_PlayLoop(&this->skelAnime, &object_zob_Anim_006998);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->unk_2F4 = 0;
- this->unk_30E = -1;
- this->unk_310 = 0;
+ this->csIdIndex = -1;
+ this->cueId = 0;
this->unk_302 = 9;
this->unk_304 = 0;
this->actor.terminalVelocity = -4.0f;
@@ -100,16 +100,16 @@ void EnZob_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BA0728;
this->actor.textId = 0;
- cs = this->actor.cutscene;
- for (i = 0; i < ARRAY_COUNT(this->unk_306); i++) {
- this->unk_306[i] = cs;
- if (cs != -1) {
- this->actor.cutscene = cs;
- cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ csId = this->actor.csId;
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
- this->actor.cutscene = this->unk_306[0];
+ this->actor.csId = this->csIdList[0];
this->actor.flags |= ACTOR_FLAG_2000000;
switch (ENZOB_GET_F(&this->actor)) {
@@ -120,7 +120,7 @@ void EnZob_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BA0AD8;
}
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
return;
}
@@ -135,7 +135,7 @@ void EnZob_Init(Actor* thisx, PlayState* play) {
break;
default:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
this->actor.flags |= ACTOR_FLAG_10;
@@ -253,17 +253,17 @@ void func_80B9FA3C(EnZob* this, PlayState* play) {
}
void func_80B9FC0C(EnZob* this) {
- if (this->unk_30E != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->unk_306[this->unk_30E]) {
- ActorCutscene_Stop(this->unk_306[this->unk_30E]);
+ if (this->csIdIndex != -1) {
+ if (CutsceneManager_GetCurrentCsId() == this->csIdList[this->csIdIndex]) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
- this->unk_30E = -1;
+ this->csIdIndex = -1;
}
}
-void func_80B9FC70(EnZob* this, s16 arg1) {
+void func_80B9FC70(EnZob* this, s16 csIdIndex) {
func_80B9FC0C(this);
- this->unk_30E = arg1;
+ this->csIdIndex = csIdIndex;
}
void func_80B9FCA0(EnZob* this, PlayState* play) {
@@ -278,19 +278,19 @@ void func_80B9FCA0(EnZob* this, PlayState* play) {
}
void func_80B9FD24(EnZob* this, PlayState* play) {
- s32 actionIndex;
- s16 action;
+ s32 cueChannel;
+ s16 cueId;
func_80B9F86C(this);
- if (Cutscene_CheckActorAction(play, 500)) {
- this->unk_30E = -1;
- actionIndex = Cutscene_GetActorActionIndex(play, 500);
- action = play->csCtx.actorActions[actionIndex]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_500)) {
+ this->csIdIndex = -1;
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_500);
+ cueId = play->csCtx.actorCues[cueChannel]->id;
- if (action != this->unk_310) {
- this->unk_310 = action;
- switch (action) {
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (cueId) {
case 1:
func_80B9F7E4(this, 8, ANIMMODE_LOOP);
break;
@@ -549,7 +549,7 @@ void func_80BA0610(EnZob* this, PlayState* play) {
void func_80BA06BC(EnZob* this, PlayState* play) {
func_80B9FD24(this, play);
- if (!Cutscene_CheckActorAction(play, 500)) {
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_500)) {
this->actionFunc = func_80BA0610;
this->actor.flags |= ACTOR_FLAG_10000;
func_80BA0610(this, play);
@@ -572,12 +572,12 @@ void func_80BA0728(EnZob* this, PlayState* play) {
this->actionFunc = func_80BA00BC;
this->unk_304 = 1;
func_80B9F7E4(this, 2, ANIMMODE_ONCE);
- this->unk_30E = 0;
+ this->csIdIndex = 0;
this->unk_2F4 |= 1;
} else if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80BA0374;
func_80B9FA3C(this, play);
- } else if (Cutscene_CheckActorAction(play, 500)) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_500)) {
this->actionFunc = func_80BA06BC;
} else if ((this->actor.xzDistToPlayer < 180.0f) && (this->actor.xzDistToPlayer > 60.0f) &&
Player_IsFacingActor(&this->actor, 0x3000, play) && Actor_IsFacingPlayer(&this->actor, 0x3000)) {
@@ -588,7 +588,7 @@ void func_80BA0728(EnZob* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, 0x6C, 1000.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_BASS_PLAY, 1000.0f);
}
void func_80BA08E8(EnZob* this, PlayState* play) {
@@ -684,8 +684,8 @@ void func_80BA0C14(EnZob* this, PlayState* play) {
this->unk_312 = 999;
}
- if (Cutscene_CheckActorAction(play, 515)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 515)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 1) {
this->actionFunc = func_80BA0CF4;
this->unk_312 = -1;
}
@@ -697,8 +697,8 @@ void func_80BA0C14(EnZob* this, PlayState* play) {
void func_80BA0CF4(EnZob* this, PlayState* play) {
func_80B9F86C(this);
- if (Cutscene_CheckActorAction(play, 515) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 515)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 2)) {
this->actionFunc = func_80BA0C14;
}
}
@@ -711,18 +711,18 @@ void EnZob_Update(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
- if ((this->unk_30E != -1) && (ActorCutscene_GetCurrentIndex() != this->unk_306[this->unk_30E])) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_306[this->unk_30E]);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_306[this->unk_30E])) {
- ActorCutscene_Start(this->unk_306[this->unk_30E], &this->actor);
+ if ((this->csIdIndex != -1) && (CutsceneManager_GetCurrentCsId() != this->csIdList[this->csIdIndex])) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_306[this->unk_30E]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
@@ -759,7 +759,7 @@ void EnZob_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2F4 & 0x20) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->unk_312, 1000);
diff --git a/src/overlays/actors/ovl_En_Zob/z_en_zob.h b/src/overlays/actors/ovl_En_Zob/z_en_zob.h
index 25ce14fdc..6e6c8e7a8 100644
--- a/src/overlays/actors/ovl_En_Zob/z_en_zob.h
+++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.h
@@ -9,10 +9,10 @@ typedef void (*EnZobActionFunc)(struct EnZob*, PlayState*);
#define ENZOB_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 1 */ ENZOB_F_1 = 1,
- /* 2 */ ENZOB_F_2,
-};
+ /* 2 */ ENZOB_F_2
+} EnZobParam;
typedef struct EnZob {
/* 0x000 */ Actor actor;
@@ -25,9 +25,9 @@ typedef struct EnZob {
/* 0x2FC */ Vec3s unk_2FC;
/* 0x302 */ s16 unk_302;
/* 0x304 */ u16 unk_304;
- /* 0x306 */ s16 unk_306[4];
- /* 0x30E */ s16 unk_30E;
- /* 0x310 */ s16 unk_310;
+ /* 0x306 */ s16 csIdList[4];
+ /* 0x30E */ s16 csIdIndex;
+ /* 0x310 */ s16 cueId;
/* 0x312 */ s16 unk_312;
/* 0x314 */ EnZobActionFunc actionFunc;
} EnZob; // size = 0x318
diff --git a/src/overlays/actors/ovl_En_Zod/z_en_zod.c b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
index 0da7a17bb..d032b6579 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.c
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
@@ -30,7 +30,7 @@ typedef enum {
/* 2 */ ENZOD_ANIM_ARMS_FOLDED,
/* 3 */ ENZOD_ANIM_PLAYING_LENTO,
/* 4 */ ENZOD_ANIM_PLAYING_ANDANTINO,
- /* 5 */ ENZOD_ANIM_MAX,
+ /* 5 */ ENZOD_ANIM_MAX
} EnZodAnimation;
typedef enum {
@@ -42,7 +42,7 @@ typedef enum {
/* 6 */ ENZOD_INSTRUMENT_DRUM_3,
/* 7 */ ENZOD_INSTRUMENT_DRUM_4,
/* 8 */ ENZOD_INSTRUMENT_DRUM_5,
- /* 9 */ ENZOD_INSTRUMENT_BASS_DRUM,
+ /* 9 */ ENZOD_INSTRUMENT_BASS_DRUM
} EnZodInstrument;
const ActorInit En_Zod_InitVars = {
@@ -115,16 +115,16 @@ void EnZod_Init(Actor* thisx, PlayState* play) {
switch (ENZOD_GET_TYPE(thisx)) {
case ENZOD_TYPE_1:
- if (gSaveContext.save.weekEventReg[78] & 1) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_01)) {
this->actionFunc = func_80BAFDB4;
EnZod_ChangeAnim(this, ENZOD_ANIM_PLAYING_VIVACE, ANIMMODE_ONCE);
this->actor.flags |= ACTOR_FLAG_10;
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
break;
}
this->actionFunc = func_80BAFB84;
- if (!(gSaveContext.save.weekEventReg[55] & 0x80)) {
+ if (!(CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE))) {
Actor_Kill(&this->actor);
break;
}
@@ -137,7 +137,7 @@ void EnZod_Init(Actor* thisx, PlayState* play) {
break;
default:
- if (gSaveContext.save.weekEventReg[55] & 0x80) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
this->actor.flags |= ACTOR_FLAG_10;
@@ -156,19 +156,19 @@ void EnZod_HandleRoomConversation(EnZod* this, PlayState* play) {
if (gSaveContext.save.playerForm != PLAYER_FORM_ZORA) {
textId = 0x1227;
- if (gSaveContext.save.weekEventReg[32] & 8) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_32_08)) {
textId = 0x1229;
} else {
- gSaveContext.save.weekEventReg[32] |= 8;
+ SET_WEEKEVENTREG(WEEKEVENTREG_32_08);
}
} else if (this->stateFlags & TIJO_STATE_1) {
textId = 0x1225;
} else {
textId = 0x1219;
- if (gSaveContext.save.weekEventReg[32] & 0x10) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_32_10)) {
textId = 0x1226;
} else {
- gSaveContext.save.weekEventReg[32] |= 0x10;
+ SET_WEEKEVENTREG(WEEKEVENTREG_32_10);
}
this->stateFlags |= TIJO_STATE_1;
}
@@ -387,21 +387,21 @@ void EnZod_PlayDrumsSequence(EnZod* this, PlayState* play) {
seqPos.y = this->actor.projectedPos.y;
seqPos.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &seqPos, NA_BGM_DRUMS_PLAY, 700.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &seqPos, NA_BGM_DRUMS_PLAY, 700.0f);
}
void func_80BAFA44(EnZod* this, PlayState* play) {
u16 textId;
if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
- if (gSaveContext.save.weekEventReg[79] & 1) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_01)) {
textId = 0x1253;
} else {
textId = 0x1251;
- if (gSaveContext.save.weekEventReg[78] & 0x20) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_20)) {
textId = 0x1252;
} else {
- gSaveContext.save.weekEventReg[78] |= 0x20;
+ SET_WEEKEVENTREG(WEEKEVENTREG_78_20);
}
}
} else {
@@ -445,20 +445,20 @@ void EnZod_DoNothing(EnZod* this, PlayState* play) {
void EnZod_Rehearse(EnZod* this, PlayState* play) {
EnZod_UpdateAnimation(this);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
- this->actor.cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- if (this->actor.cutscene == -1) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ if (this->actor.csId == CS_ID_NONE) {
this->actionFunc = EnZod_DoNothing;
play->nextEntrance = play->setupExitList[ENZOD_GET_ENTRANCE_INDEX(&this->actor)];
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
play->transitionTrigger = TRANS_TRIGGER_START;
- gSaveContext.save.weekEventReg[78] &= (u8)~1;
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_78_01);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -468,23 +468,23 @@ void EnZod_SetupRehearse(EnZod* this, PlayState* play) {
Message_CloseTextbox(play);
EnZod_ChangeAnim(this, ENZOD_ANIM_PLAYING_LENTO, ANIMMODE_ONCE);
this->actionFunc = EnZod_Rehearse;
- ActorCutscene_Stop(this->actor.cutscene);
- this->actor.cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- gSaveContext.save.weekEventReg[79] |= 1;
+ CutsceneManager_Stop(this->actor.csId);
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ CutsceneManager_Queue(this->actor.csId);
+ SET_WEEKEVENTREG(WEEKEVENTREG_79_01);
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_INDIGO_GO_SESSION | SEQ_FLAG_ASYNC);
}
}
void func_80BAFDB4(EnZod* this, PlayState* play) {
EnZod_UpdateAnimation(this);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_800B7298(play, NULL, 0x44);
Message_StartTextbox(play, 0x103A, &this->actor);
this->actionFunc = EnZod_SetupRehearse;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -500,8 +500,8 @@ void func_80BAFE34(EnZod* this, PlayState* play) {
this->fogNear = 999;
}
- if (Cutscene_CheckActorAction(play, 0x203)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x203)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 1) {
this->actionFunc = func_80BAFF14;
this->fogNear = -1;
}
@@ -513,8 +513,8 @@ void func_80BAFE34(EnZod* this, PlayState* play) {
void func_80BAFF14(EnZod* this, PlayState* play) {
EnZod_UpdateAnimation(this);
- if (Cutscene_CheckActorAction(play, 0x203) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x203)]->action == 4)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 4)) {
this->actionFunc = func_80BAFE34;
}
}
@@ -527,7 +527,7 @@ void EnZod_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
EnZod_UpdateInstruments(this);
@@ -628,7 +628,7 @@ void EnZod_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->stateFlags & TIJO_STATE_2) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->fogNear, 1000);
diff --git a/src/overlays/actors/ovl_En_Zod/z_en_zod.h b/src/overlays/actors/ovl_En_Zod/z_en_zod.h
index 9e6f3f4da..12278bb97 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.h
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.h
@@ -33,9 +33,9 @@ typedef struct EnZod {
} EnZod; // size = 0x2A0
typedef enum {
- /* 1 */ ENZOD_TYPE_1 = 1,
- /* 2 */ ENZOD_TYPE_2,
- /* 0xF */ ENZOD_TYPE_0xF = 0xF,
-} EnZodTypes;
+ /* 0x1 */ ENZOD_TYPE_1 = 1,
+ /* 0x2 */ ENZOD_TYPE_2,
+ /* 0xF */ ENZOD_TYPE_0xF = 0xF
+} EnZodType;
#endif // Z_EN_ZOD_H
diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.c b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
index 1935d627e..96de52b88 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -181,7 +181,7 @@ void EnZog_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnZog* this = THIS;
s32 i;
- s16 cs;
+ s16 csId;
if (!D_80B95E10) {
for (i = 0; i < ARRAY_COUNT(D_80B958AC); i++) {
@@ -206,7 +206,7 @@ void EnZog_Init(Actor* thisx, PlayState* play) {
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
if ((ENZOG_GET_F(&this->actor) != ENZOG_F_2) && (INV_CONTENT(ITEM_MASK_ZORA) == ITEM_MASK_ZORA) &&
- ((play->csCtx.currentCsIndex != 2) || (gSaveContext.sceneLayer != 0) || (play->sceneId != SCENE_30GYOSON))) {
+ ((play->csCtx.scriptIndex != 2) || (gSaveContext.sceneLayer != 0) || (play->sceneId != SCENE_30GYOSON))) {
Actor_Kill(&this->actor);
return;
}
@@ -219,7 +219,7 @@ void EnZog_Init(Actor* thisx, PlayState* play) {
this->unk_30A = 0;
this->unk_31C = 2;
this->unk_31E = 0;
- this->unk_31A = -1;
+ this->csIdIndex = -1;
this->unk_322 = 100;
Math_Vec3f_Copy(&this->unk_2F0, &this->actor.world.pos);
@@ -245,13 +245,13 @@ void EnZog_Init(Actor* thisx, PlayState* play) {
this->unk_304 = 0;
this->unk_2FE = this->unk_2FC;
this->unk_300 = this->unk_302;
- cs = this->actor.cutscene;
+ csId = this->actor.csId;
- for (i = 0; i < ARRAY_COUNT(this->unk_30C); i++) {
- this->unk_30C[i] = cs;
- if (cs != -1) {
- this->actor.cutscene = cs;
- cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ for (i = 0; i < ARRAY_COUNT(this->csIdList); i++) {
+ this->csIdList[i] = csId;
+ if (csId != CS_ID_NONE) {
+ this->actor.csId = csId;
+ csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
}
}
@@ -331,17 +331,17 @@ void func_80B93A48(EnZog* this, PlayState* play) {
void func_80B93B44(EnZog* this) {
if (!(this->unk_30A & 4)) {
- if (this->unk_31A != -1) {
- ActorCutscene_Stop(this->unk_30C[this->unk_31A]);
+ if (this->csIdIndex != -1) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
}
- this->unk_31A = -1;
+ this->csIdIndex = -1;
this->unk_30A &= ~4;
}
-void func_80B93BA8(EnZog* this, s16 arg1) {
+void func_80B93BA8(EnZog* this, s16 csIdIndex) {
func_80B93B44(this);
- this->unk_31A = arg1;
+ this->csIdIndex = csIdIndex;
this->unk_30A |= 4;
}
@@ -394,17 +394,17 @@ void func_80B93D2C(EnZog* this, PlayState* play) {
void func_80B93DE8(Vec3f* arg0, PlayState* play, s32 arg2) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(30.0f) + arg0->x;
+ sp2C.x = Rand_CenteredFloat(30.0f) + arg0->x;
sp2C.y = arg0->y + 3.0f;
- sp2C.z = randPlusMinusPoint5Scaled(30.0f) + arg0->z;
+ sp2C.z = Rand_CenteredFloat(30.0f) + arg0->z;
EffectSsKirakira_SpawnDispersed(play, &sp2C, &D_80B9598C, &D_80B95998, &D_80B959A4, &D_80B959A8, 1000, arg2);
}
s32 func_80B93EA0(EnZog* this, PlayState* play) {
- s16 sp3E;
+ s16 cueId;
if (SkelAnime_Update(&this->skelAnime)) {
- switch (this->unk_306) {
+ switch (this->cueId) {
case 2:
case 3:
Animation_PlayLoop(&this->skelAnime, *D_80B958F0);
@@ -458,13 +458,13 @@ s32 func_80B93EA0(EnZog* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
- if (Cutscene_CheckActorAction(play, 471)) {
- sp3E = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 471)]->action;
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 471));
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_471)) {
+ cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_471)]->id;
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_471));
- switch (this->unk_306) {
+ switch (this->cueId) {
case 2:
- if (play->csCtx.frames == 60) {
+ if (play->csCtx.curFrame == 60) {
Actor_PlaySfx(&this->actor, NA_SE_EV_JUMP_SAND);
}
break;
@@ -497,10 +497,10 @@ s32 func_80B93EA0(EnZog* this, PlayState* play) {
break;
}
- if (this->unk_306 != sp3E) {
- this->unk_306 = sp3E;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
- switch (this->unk_306) {
+ switch (this->cueId) {
case 1:
func_80B939C0(this, 7, ANIMMODE_LOOP);
this->unk_31C = 2;
@@ -593,7 +593,7 @@ void func_80B943A0(EnZog* this, PlayState* play) {
void func_80B943C0(EnZog* this, PlayState* play) {
if (!(this->unk_30A & 4)) {
this->actionFunc = func_80B943A0;
- this->unk_306 = -1;
+ this->cueId = -1;
}
}
@@ -657,7 +657,7 @@ void func_80B946B4(EnZog* this, PlayState* play) {
func_80B93A48(this, play);
if (!(this->unk_30A & 4)) {
this->actionFunc = func_80B9461C;
- this->unk_306 = -1;
+ this->cueId = -1;
}
}
@@ -781,15 +781,15 @@ void func_80B94A00(EnZog* this, PlayState* play) {
if ((this->unk_304 == 4) &&
(Animation_OnFrame(&this->skelAnime, 136.0f) || Animation_OnFrame(&this->skelAnime, 155.0f))) {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_WATER0);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_WATER_SHALLOW);
}
if ((this->unk_304 == 5) &&
(Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 37.0f))) {
if (this->actor.depthInWater > 0.0f) {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_WATER0);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_WATER_SHALLOW);
} else {
- Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_SAND);
+ Actor_PlaySfx(&this->actor, NA_SE_PL_WALK_GROUND + SURFACE_SFX_OFFSET_SAND);
}
}
}
@@ -865,9 +865,9 @@ void func_80B94E34(EnZog* this, PlayState* play) {
Vec3f sp38;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80B959AC, &sp38);
- sp38.x += randPlusMinusPoint5Scaled(30.0f);
+ sp38.x += Rand_CenteredFloat(30.0f);
sp38.y += 20.0f;
- sp38.z += randPlusMinusPoint5Scaled(30.0f);
+ sp38.z += Rand_CenteredFloat(30.0f);
if (WaterBox_GetSurface1(play, &play->colCtx, sp38.x, sp38.z, &sp38.y, &sp44) &&
(this->actor.world.pos.y < sp38.y)) {
EffectSsGSplash_Spawn(play, &sp38, NULL, NULL, 1,
@@ -956,8 +956,8 @@ void EnZog_Update(Actor* thisx, PlayState* play) {
EnZog* this = THIS;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 5);
- if (Cutscene_CheckActorAction(play, 0x1D7) && (ENZOG_GET_F(&this->actor) != ENZOG_F_2)) {
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_471) && (ENZOG_GET_F(&this->actor) != ENZOG_F_2)) {
this->actionFunc = func_80B9461C;
this->actor.shape.yOffset = 0.0f;
}
@@ -982,18 +982,18 @@ void EnZog_Update(Actor* thisx, PlayState* play) {
this->actor.focus.pos.y += 30.0f;
if (this->unk_30A & 4) {
- if (this->unk_31A == -1) {
+ if (this->csIdIndex == -1) {
this->unk_30A &= ~4;
- } else if (this->unk_30C[this->unk_31A] == -1) {
+ } else if (this->csIdList[this->csIdIndex] == CS_ID_NONE) {
this->unk_30A &= ~4;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_30C[this->unk_31A]);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_30C[this->unk_31A])) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_30C[this->unk_31A], &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_StartWithPlayerCs(this->csIdList[this->csIdIndex], &this->actor);
this->unk_30A &= ~4;
} else {
- ActorCutscene_SetIntentToPlay(this->unk_30C[this->unk_31A]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
}
@@ -1049,11 +1049,11 @@ void EnZog_Draw(Actor* thisx, PlayState* play) {
if (this->unk_30A & 8) {
if (this->unk_322 > 128) {
gfx = POLY_XLU_DISP++;
- func_8012C2B4(gfx);
+ Gfx_SetupDL71(gfx);
Scene_SetRenderModeXlu(play, 2, 2);
} else {
gfx = POLY_XLU_DISP++;
- func_8012C304(gfx);
+ Gfx_SetupDL72(gfx);
Scene_SetRenderModeXlu(play, 1, 2);
}
@@ -1068,7 +1068,7 @@ void EnZog_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
NULL, func_80B95598, &this->actor, POLY_XLU_DISP);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Scene_SetRenderModeXlu(play, 0, 1);
gfx = POLY_OPA_DISP;
diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.h b/src/overlays/actors/ovl_En_Zog/z_en_zog.h
index 9971d77fa..737168250 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.h
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.h
@@ -27,11 +27,11 @@ typedef struct EnZog {
/* 0x300 */ s16 unk_300;
/* 0x302 */ s16 unk_302;
/* 0x304 */ s16 unk_304;
- /* 0x306 */ s16 unk_306;
+ /* 0x306 */ s16 cueId;
/* 0x308 */ s16 unk_308;
/* 0x30A */ u16 unk_30A;
- /* 0x30C */ s16 unk_30C[7];
- /* 0x31A */ s16 unk_31A;
+ /* 0x30C */ s16 csIdList[7];
+ /* 0x31A */ s16 csIdIndex;
/* 0x31C */ s16 unk_31C;
/* 0x31E */ s16 unk_31E;
/* 0x320 */ s16 unk_320;
diff --git a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
index cc391c0b1..0bfc986dc 100644
--- a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
+++ b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.c
@@ -75,7 +75,10 @@ void func_80B31590(EnZoraegg* this) {
void EnZoraegg_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnZoraegg* this = THIS;
- u16 sp40[] = { 457, 458, 459, 460, 461, 462, 464 };
+ u16 cueTypes[] = {
+ CS_CMD_ACTOR_CUE_457, CS_CMD_ACTOR_CUE_458, CS_CMD_ACTOR_CUE_459, CS_CMD_ACTOR_CUE_460,
+ CS_CMD_ACTOR_CUE_461, CS_CMD_ACTOR_CUE_462, CS_CMD_ACTOR_CUE_464,
+ };
Actor_SetScale(&this->actor, 0.006f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_zoraegg_Skel_004C90, &object_zoraegg_Anim_005098,
@@ -162,7 +165,7 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
case ENZORAEGG_1F_07:
case ENZORAEGG_1F_08:
case ENZORAEGG_1F_09:
- this->actorActionCmd = sp40[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_03];
+ this->cueType = cueTypes[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_03];
Animation_PlayOnce(&this->skelAnime, &object_zoraegg_Anim_001E08);
this->unk_1EC = 1;
this->unk_1EE = 0;
@@ -181,7 +184,7 @@ void EnZoraegg_Init(Actor* thisx, PlayState* play) {
case ENZORAEGG_1F_0E:
case ENZORAEGG_1F_0F:
case ENZORAEGG_1F_10:
- this->actorActionCmd = sp40[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_0A];
+ this->cueType = cueTypes[(ENZORAEGG_GET_1F(&this->actor)) - ENZORAEGG_1F_0A];
this->unk_1EC = 2;
this->actionFunc = func_80B324B0;
Animation_PlayLoop(&this->skelAnime, &object_zoraegg_Anim_004FE4);
@@ -206,13 +209,13 @@ void EnZoraegg_Destroy(Actor* thisx, PlayState* play) {
}
s32 func_80B319A8(PlayState* play) {
- return gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 & 7;
+ return gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 & 7;
}
void func_80B319D0(PlayState* play, s32 arg1) {
if ((arg1 < 8) && (arg1 >= 0)) {
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 &= ~7;
- gSaveContext.save.permanentSceneFlags[play->sceneId].unk_14 |= arg1;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 &= ~7;
+ gSaveContext.save.saveInfo.permanentSceneFlags[play->sceneId].unk_14 |= arg1;
}
}
@@ -244,7 +247,7 @@ void func_80B31C40(EnZoraegg* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
this->actor.focus.pos.y += 10.0f;
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
Actor* func_80B31CB4(PlayState* play) {
@@ -352,7 +355,7 @@ void func_80B320E0(EnZoraegg* this, PlayState* play) {
}
void func_80B321D0(EnZoraegg* this, PlayState* play) {
- if (ActorCutscene_GetCurrentIndex() != this->actor.cutscene) {
+ if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
this->actionFunc = func_80B322BC;
func_80B319D0(play, func_80B319A8(play) + 1);
}
@@ -362,26 +365,26 @@ void func_80B32228(EnZoraegg* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, this->unk_1DC);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, this->unk_1DC);
this->actionFunc = func_80B321D0;
} else {
if (this->unk_1E8 > 0) {
this->unk_1E8--;
} else if (this->unk_1E8 == 0) {
- ActorCutscene_Stop(player->unk_A86);
- player->unk_A86 = -1;
+ CutsceneManager_Stop(player->csId);
+ player->csId = CS_ID_NONE;
this->unk_1E8 = -1;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
void func_80B322BC(EnZoraegg* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->actor.cutscene != -1) {
+ if (this->actor.csId != CS_ID_NONE) {
this->unk_1DC = func_80B31CB4(play);
if (this->unk_1DC != NULL) {
this->unk_1E8 = 3;
@@ -400,11 +403,11 @@ void func_80B32390(EnZoraegg* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
Actor* temp_v0 = func_80B31D14(play);
if (temp_v0 != NULL) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, temp_v0);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, temp_v0);
SET_EVENTINF(EVENTINF_33);
Actor_Kill(&this->actor);
}
@@ -412,29 +415,29 @@ void func_80B32390(EnZoraegg* this, PlayState* play) {
(fabsf(player->actor.world.pos.x - this->actor.world.pos.x) < (100.0f * this->actor.scale.x)) &&
(fabsf(player->actor.world.pos.z - this->actor.world.pos.z) < (100.0f * this->actor.scale.z)) &&
(fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 30.0f)) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
void func_80B324B0(EnZoraegg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Cutscene_CheckActorAction(play, this->actorActionCmd)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
if (this->unk_1EA & 4) {
- if (Cutscene_CheckActorAction(play, this->actorActionCmd) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCmd)]->action == 3)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 3)) {
Animation_PlayLoop(&this->skelAnime, &object_zoraegg_Anim_004FE4);
this->unk_1EA &= ~4;
}
} else {
- if (Cutscene_CheckActorAction(play, this->actorActionCmd) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCmd)]->action == 4)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 4)) {
Animation_PlayLoop(&this->skelAnime, &object_zoraegg_Anim_004E04);
this->unk_1EA |= 4;
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCmd));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
if ((this->unk_1EA & 4) && Animation_OnFrame(&this->skelAnime, this->unk_1E4)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
@@ -453,10 +456,10 @@ void func_80B32644(EnZoraegg* this, PlayState* play) {
this->unk_1EA |= 2;
}
- if (!Cutscene_CheckActorAction(play, this->actorActionCmd)) {
+ if (!Cutscene_IsCueInChannel(play, this->cueType)) {
this->actionFunc = func_80B324B0;
} else {
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCmd));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
if (this->unk_1EE > 25) {
this->unk_1EE -= 25;
@@ -469,8 +472,8 @@ void func_80B32644(EnZoraegg* this, PlayState* play) {
void func_80B326F4(EnZoraegg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Cutscene_CheckActorAction(play, this->actorActionCmd) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCmd)]->action == 3)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 3)) {
Animation_Change(&this->skelAnime, &object_zoraegg_Anim_004D20, 1.0f, 0.0f,
Animation_GetLastFrame(&object_zoraegg_Anim_004D20), ANIMMODE_ONCE, 5.0f);
this->unk_1E8 = 0;
@@ -481,7 +484,7 @@ void func_80B326F4(EnZoraegg* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_2);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCmd));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
if (Animation_OnFrame(&this->skelAnime, 4.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_1);
@@ -504,7 +507,7 @@ void func_80B32820(EnZoraegg* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCmd));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
if (Animation_OnFrame(&this->skelAnime, 16.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ZORA_KIDS_SWIM_0);
@@ -538,7 +541,7 @@ void func_80B32928(EnZoraegg* this, PlayState* play) {
}
}
- Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, this->actorActionCmd));
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
if (Animation_OnFrame(&this->skelAnime, 97.0f) || Animation_OnFrame(&this->skelAnime, 101.0f) ||
Animation_OnFrame(&this->skelAnime, 105.0f)) {
@@ -547,8 +550,8 @@ void func_80B32928(EnZoraegg* this, PlayState* play) {
}
void func_80B32A88(EnZoraegg* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, this->actorActionCmd) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->actorActionCmd)]->action == 2)) {
+ if (Cutscene_IsCueInChannel(play, this->cueType) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id == 2)) {
this->unk_1E8 = 0;
this->actionFunc = func_80B32928;
}
@@ -570,7 +573,7 @@ void func_80B32B3C(EnZoraegg* this, PlayState* play) {
void func_80B32B70(EnZoraegg* this, PlayState* play) {
func_80B31C40(this, play);
- if (Cutscene_CheckActorAction(play, 0x1C9)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_457)) {
Actor_Kill(&this->actor);
}
}
@@ -583,7 +586,7 @@ void func_80B32BB8(EnZoraegg* this, PlayState* play) {
this->actionFunc = func_80B32B70;
}
- if (Cutscene_CheckActorAction(play, 0x1C9)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_457)) {
Actor_Kill(&this->actor);
}
}
@@ -694,8 +697,9 @@ void func_80B32F04(Actor* thisx, PlayState* play) {
this->actor.scale.z * (((sp7C + 1.0f) * 0.1f) + 9.0f), MTXMODE_APPLY);
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_XLU_DISP;
- gfx = func_8012C868(gfx);
+ gfx = Gfx_SetupDL20_NoCD(gfx);
gSPSetOtherMode(gfx++, G_SETOTHERMODE_H, 4, 4, 0x00000080);
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
@@ -722,13 +726,13 @@ void func_80B331C8(Actor* thisx, PlayState* play) {
Matrix_Scale(this->unk_1E0, this->unk_1E0, this->unk_1E0, MTXMODE_APPLY);
if (this->unk_1ED >= 254) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
gSPDisplayList(POLY_OPA_DISP++, object_zoraegg_DL_005250);
} else {
- func_8012C304(POLY_XLU_DISP++);
+ Gfx_SetupDL72(POLY_XLU_DISP++);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2);
@@ -859,7 +863,7 @@ void func_80B33818(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B33950[this->unk_1F2]));
diff --git a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
index f36f77c2b..f8895af3f 100644
--- a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
+++ b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
@@ -10,7 +10,7 @@ typedef void (*EnZoraeggActionFunc)(struct EnZoraegg*, PlayState*);
#define ENZORAEGG_GET_1F(thisx) ((thisx)->params & 0x1F)
#define ENZORAEGG_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 0x00 */ ENZORAEGG_1F_00,
/* 0x01 */ ENZORAEGG_1F_01,
/* 0x02 */ ENZORAEGG_1F_02,
@@ -36,8 +36,8 @@ enum {
/* 0x16 */ ENZORAEGG_1F_16,
/* 0x17 */ ENZORAEGG_1F_17,
/* 0x18 */ ENZORAEGG_1F_18,
- /* 0x19 */ ENZORAEGG_1F_19,
-};
+ /* 0x19 */ ENZORAEGG_1F_19
+} EnZoraeggParam;
typedef struct EnZoraegg {
/* 0x000 */ Actor actor;
@@ -53,7 +53,7 @@ typedef struct EnZoraegg {
/* 0x1ED */ u8 unk_1ED;
/* 0x1EE */ u8 unk_1EE;
/* 0x1EF */ u8 unk_1EF;
- /* 0x1F0 */ u16 actorActionCmd;
+ /* 0x1F0 */ u16 cueType;
/* 0x1F2 */ s16 unk_1F2;
/* 0x1F4 */ s16 unk_1F4;
/* 0x1F8 */ EnZoraeggActionFunc actionFunc;
diff --git a/src/overlays/actors/ovl_En_Zos/z_en_zos.c b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
index c538457e8..c3192cec1 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
@@ -100,7 +100,7 @@ void EnZos_Init(Actor* thisx, PlayState* play) {
switch (ENZOS_GET_F(&this->actor)) {
case ENZOS_F_1:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
@@ -120,7 +120,7 @@ void EnZos_Init(Actor* thisx, PlayState* play) {
break;
default:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
this->actor.flags |= ACTOR_FLAG_10;
@@ -280,13 +280,13 @@ void func_80BBB354(EnZos* this, PlayState* play) {
void func_80BBB414(EnZos* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
- if (Cutscene_CheckActorAction(play, 501)) {
- s16 action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 501)]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_501)) {
+ s16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_501)]->id;
- if (action != this->unk_2BA) {
- this->unk_2BA = action;
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
- switch (action) {
+ switch (cueId) {
case 1:
EnZos_ChangeAnim(this, EN_ZOS_ANIM_LEAN_ON_KEYBOARD_AND_SIGH, ANIMMODE_LOOP);
break;
@@ -302,15 +302,15 @@ void func_80BBB414(EnZos* this, PlayState* play) {
void func_80BBB4CC(EnZos* this, PlayState* play) {
func_80BBB414(this, play);
- if ((this->actor.cutscene != -1) && (ActorCutscene_GetCurrentIndex() != this->actor.cutscene)) {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
- this->actor.cutscene = -1;
+ if ((this->actor.csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != this->actor.csId)) {
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
+ this->actor.csId = CS_ID_NONE;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -417,7 +417,7 @@ void func_80BBB8AC(EnZos* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x1237:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
case 0x1238:
case 0x123A:
@@ -436,7 +436,7 @@ void func_80BBB8AC(EnZos* this, PlayState* play) {
case 0x1232:
case 0x1241:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
case 0x1239:
case 0x1246:
@@ -534,7 +534,7 @@ void func_80BBBCBC(EnZos* this, PlayState* play) {
void func_80BBBD5C(EnZos* this, PlayState* play) {
func_80BBB414(this, play);
- if (!Cutscene_CheckActorAction(play, 0x1F5)) {
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_501)) {
this->actionFunc = func_80BBBCBC;
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
@@ -567,7 +567,7 @@ void func_80BBBDE0(EnZos* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actionFunc = func_80BBB8AC;
func_80BBB15C(this, play);
- } else if (Cutscene_CheckActorAction(play, 0x1F5)) {
+ } else if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_501)) {
this->actionFunc = func_80BBBD5C;
} else if (func_80BBAF5C(this, play)) {
func_800B8614(&this->actor, play, 120.0f);
@@ -582,7 +582,7 @@ void func_80BBBDE0(EnZos* this, PlayState* play) {
sp28.x = this->actor.projectedPos.x;
sp28.y = this->actor.projectedPos.y;
sp28.z = this->actor.projectedPos.z;
- func_801A1FB4(3, &sp28, 110, 1000.0f);
+ func_801A1FB4(SEQ_PLAYER_BGM_SUB, &sp28, NA_BGM_PIANO_PLAY, 1000.0f);
}
void func_80BBBFBC(EnZos* this, PlayState* play) {
@@ -675,8 +675,8 @@ void func_80BBC298(EnZos* this, PlayState* play) {
this->unk_2BC = 999;
}
- if (Cutscene_CheckActorAction(play, 515)) {
- if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 515)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515)) {
+ if (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 1) {
this->actionFunc = func_80BBC37C;
this->unk_2BC = -1;
}
@@ -688,8 +688,8 @@ void func_80BBC298(EnZos* this, PlayState* play) {
void func_80BBC37C(EnZos* this, PlayState* play) {
func_80BBAFFC(this, play);
- if (Cutscene_CheckActorAction(play, 515) &&
- (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 515)]->action == 3)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_515) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_515)]->id == 3)) {
this->actionFunc = func_80BBC298;
}
}
@@ -701,7 +701,7 @@ void EnZos_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 30.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 30.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
@@ -738,7 +738,7 @@ void EnZos_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2B6 & 0x40) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 0, 0, 0, 0, this->unk_2BC, 1000);
diff --git a/src/overlays/actors/ovl_En_Zos/z_en_zos.h b/src/overlays/actors/ovl_En_Zos/z_en_zos.h
index e3ede7b28..f761a9bc5 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.h
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.h
@@ -10,10 +10,10 @@ typedef void (*EnZosActionFunc)(struct EnZos*, PlayState*);
#define ENZOS_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 1 */ ENZOS_F_1 = 1,
- /* 2 */ ENZOS_F_2,
-};
+ /* 2 */ ENZOS_F_2
+} EnZosParam;
typedef struct EnZos {
/* 0x000 */ Actor actor;
@@ -26,7 +26,7 @@ typedef struct EnZos {
/* 0x2B0 */ UNK_TYPE1 unk2B0[6];
/* 0x2B6 */ u16 unk_2B6;
/* 0x2B8 */ s16 animIndex;
- /* 0x2BA */ s16 unk_2BA;
+ /* 0x2BA */ s16 cueId;
/* 0x2BC */ s16 unk_2BC;
/* 0x2C0 */ EnZosActionFunc actionFunc;
} EnZos; // size = 0x2C4
diff --git a/src/overlays/actors/ovl_En_Zot/z_en_zot.c b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
index ce5625b83..1493759a5 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
@@ -111,8 +111,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
for (i = 0; i < ARRAY_COUNT(this->unk_2D8); i++) {
this->unk_2D8[i] = NULL;
}
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
this->unk_2D4 = 0;
func_80B965D0(this, play);
} else {
@@ -124,8 +124,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 3:
case 4:
this->actionFunc = func_80B97B5C;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -134,8 +134,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 5:
this->unk_2F2 |= 4;
this->actionFunc = func_80B97FD0;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -167,8 +167,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 10:
this->actionFunc = func_80B992C0;
func_80B96BEC(this, 1, ANIMMODE_LOOP);
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -185,14 +185,14 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
func_80B96BEC(this, 2, ANIMMODE_LOOP);
this->actor.colChkInfo.cylRadius = 0;
this->actor.shape.yOffset = -1400.0f;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
break;
case 18:
this->actionFunc = func_80B99384;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
break;
@@ -211,8 +211,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 22:
this->actionFunc = func_80B980FC;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -220,7 +220,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
break;
}
- if ((ENZOT_GET_1F(thisx) >= 2) && (ENZOT_GET_1F(thisx) < 11) && CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if ((ENZOT_GET_1F(thisx) >= 2) && (ENZOT_GET_1F(thisx) < 11) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->actor);
}
}
@@ -467,7 +468,7 @@ void func_80B973BC(EnZot* this, PlayState* play) {
break;
case 0x1275:
- if (gSaveContext.save.playerData.rupees < 10) {
+ if (gSaveContext.save.saveInfo.playerData.rupees < 10) {
Message_ContinueTextbox(play, 0x1277);
} else {
Message_ContinueTextbox(play, 0x1278);
@@ -488,8 +489,8 @@ void func_80B973BC(EnZot* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10000;
this->actor.textId = 0;
this->actionFunc = func_80B97708;
- if ((this->actor.cutscene != -1) && !(this->unk_2F2 & 1)) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if ((this->actor.csId != CS_ID_NONE) && !(this->unk_2F2 & 1)) {
+ CutsceneManager_Stop(this->actor.csId);
}
this->unk_2F2 &= ~1;
break;
@@ -497,16 +498,16 @@ void func_80B973BC(EnZot* this, PlayState* play) {
}
if (this->unk_2F2 & 1) {
- if (this->actor.cutscene == -1) {
+ if (this->actor.csId == CS_ID_NONE) {
this->unk_2F2 &= ~1;
- } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
- } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ } else if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->actor.csId);
+ } else if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->unk_2F2 &= ~1;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -756,8 +757,6 @@ void func_80B97E0C(EnZot* this, PlayState* play) {
}
void func_80B97E4C(EnZot* this, PlayState* play) {
- if (1) {}
-
if (this->unk_2F2 & 0x40) {
func_80B96BEC(this, 0, ANIMMODE_LOOP);
}
@@ -767,33 +766,38 @@ void func_80B97E4C(EnZot* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
}
- if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- switch (play->msgCtx.currentTextId) {
- case 0x128C:
- this->unk_2F2 &= ~4;
- func_80B96BEC(this, 6, ANIMMODE_ONCE);
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ if ((Message_GetState(&play->msgCtx) != TEXT_STATE_5) || !Message_ShouldAdvance(play)) {
+ return;
+ }
- case 0x128D:
- case 0x128E:
- case 0x128F:
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ switch (play->msgCtx.currentTextId) {
+ case 0x128C:
+ this->unk_2F2 &= ~4;
+ func_80B96BEC(this, 6, ANIMMODE_ONCE);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1290:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97D6C;
- this->unk_2F2 |= 4;
- func_80B96BEC(this, 3, ANIMMODE_LOOP);
- SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
- break;
+ case 0x128D:
+ case 0x128E:
+ case 0x128F:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x128B:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97FD0;
- break;
- }
+ case 0x1290:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97D6C;
+ this->unk_2F2 |= 4;
+ func_80B96BEC(this, 3, ANIMMODE_LOOP);
+ SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
+ break;
+
+ case 0x128B:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97FD0;
+ break;
+
+ default:
+ break;
}
}
@@ -1316,7 +1320,7 @@ void EnZot_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 30.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 30.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
this->unk_2F2 &= ~0x40;
if (SkelAnime_Update(&this->skelAnime) && (this->unk_2F0 != 0)) {
@@ -1397,7 +1401,7 @@ void EnZot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->unk_2EC]));
diff --git a/src/overlays/actors/ovl_En_Zot/z_en_zot.h b/src/overlays/actors/ovl_En_Zot/z_en_zot.h
index 1bab43ae3..e2c43baa3 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.h
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.h
@@ -8,7 +8,9 @@ struct EnZot;
typedef void (*EnZotActionFunc)(struct EnZot*, PlayState*);
#define ENZOT_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENZOT_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENZOT_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENZOT_PATH_INDEX_NONE 0x3F
typedef struct EnZot {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Zov/z_en_zov.c b/src/overlays/actors/ovl_En_Zov/z_en_zov.c
index 17c4a9f70..fdf50a820 100644
--- a/src/overlays/actors/ovl_En_Zov/z_en_zov.c
+++ b/src/overlays/actors/ovl_En_Zov/z_en_zov.c
@@ -91,10 +91,10 @@ void EnZov_Init(Actor* thisx, PlayState* play) {
Animation_PlayLoop(&this->skelAnime, &object_zov_Anim_00D3EC);
this->unk_320 = 0;
- this->unk_32C = -1;
- this->unk_326 = -1;
- this->unk_328[0] = this->picto.actor.cutscene;
- this->unk_328[1] = 0x7C;
+ this->csIdIndex = -1;
+ this->cueId = -1;
+ this->csIdList[0] = this->picto.actor.csId;
+ this->csIdList[1] = CS_ID_GLOBAL_TALK;
this->unk_322 = 0;
this->actionFunc = func_80BD1C84;
this->picto.validationFunc = EnZov_ValidatePictograph;
@@ -107,7 +107,7 @@ void EnZov_Init(Actor* thisx, PlayState* play) {
case ENZOV_F_1:
this->actionFunc = func_80BD1F1C;
func_80BD1570(this, 9, ANIMMODE_LOOP);
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
Actor_Kill(&this->picto.actor);
return;
}
@@ -120,7 +120,7 @@ void EnZov_Init(Actor* thisx, PlayState* play) {
default:
this->unk_320 |= 2;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_53_20)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE) || CHECK_WEEKEVENTREG(WEEKEVENTREG_53_20)) {
Actor_Kill(&this->picto.actor);
}
break;
@@ -134,17 +134,17 @@ void EnZov_Destroy(Actor* thisx, PlayState* play) {
}
void func_80BD13DC(EnZov* this) {
- if (this->unk_32C != -1) {
- if (ActorCutscene_GetCurrentIndex() == this->unk_328[this->unk_32C]) {
- ActorCutscene_Stop(this->unk_328[this->unk_32C]);
+ if (this->csIdIndex != -1) {
+ if (CutsceneManager_GetCurrentCsId() == this->csIdList[this->csIdIndex]) {
+ CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
}
- this->unk_32C = -1;
+ this->csIdIndex = -1;
}
}
void func_80BD1440(EnZov* this, s16 arg1) {
func_80BD13DC(this);
- this->unk_32C = arg1;
+ this->csIdIndex = arg1;
}
void func_80BD1470(EnZov* this, s16 index, u8 mode, f32 transitionRate) {
@@ -328,12 +328,12 @@ void func_80BD19FC(EnZov* this, PlayState* play) {
s32 func_80BD1AE0(EnZov* this, PlayState* play) {
func_80BD1764(this);
- if (Cutscene_CheckActorAction(play, 504)) {
- s16 action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 504)]->action;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_504)) {
+ s16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_504)]->id;
- if (action != this->unk_326) {
- this->unk_326 = action;
- switch (this->unk_326) {
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
case 1:
func_80BD1570(this, 0, ANIMMODE_LOOP);
break;
@@ -367,7 +367,7 @@ void func_80BD1BF0(EnZov* this, PlayState* play) {
void func_80BD1C38(EnZov* this, PlayState* play) {
if (func_80BD1AE0(this, play)) {
- Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetActorActionIndex(play, 504));
+ Cutscene_ActorTranslateAndYaw(&this->picto.actor, play, Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_504));
}
}
@@ -381,7 +381,7 @@ void func_80BD1C84(EnZov* this, PlayState* play) {
func_800B8614(&this->picto.actor, play, 120.0f);
}
- if (Cutscene_CheckActorAction(play, 0x1F8)) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_504)) {
this->actionFunc = func_80BD1BF0;
func_80BD1BF0(this, play);
}
@@ -476,11 +476,11 @@ void EnZov_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->picto.actor);
Collider_UpdateCylinder(&this->picto.actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->picto.actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->picto.actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
this->actionFunc(this, play);
- if (!Cutscene_CheckActorAction(play, 0x1F8)) {
+ if (!Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_504)) {
this->unk_320 &= ~0x10;
}
@@ -506,14 +506,14 @@ void EnZov_Update(Actor* thisx, PlayState* play) {
this->unk_2EC = 0;
}
- if ((this->unk_32C != -1) && (ActorCutscene_GetCurrentIndex() != this->unk_328[this->unk_32C])) {
- if ((this->unk_32C == 0) && (ActorCutscene_GetCurrentIndex() == 0x7C)) {
- ActorCutscene_Stop(0x7C);
- ActorCutscene_SetIntentToPlay(this->unk_328[this->unk_32C]);
- } else if (ActorCutscene_GetCanPlayNext(this->unk_328[this->unk_32C])) {
- ActorCutscene_Start(this->unk_328[this->unk_32C], &this->picto.actor);
+ if ((this->csIdIndex != -1) && (CutsceneManager_GetCurrentCsId() != this->csIdList[this->csIdIndex])) {
+ if ((this->csIdIndex == 0) && (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK)) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
+ } else if (CutsceneManager_IsNext(this->csIdList[this->csIdIndex])) {
+ CutsceneManager_Start(this->csIdList[this->csIdIndex], &this->picto.actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_328[this->unk_32C]);
+ CutsceneManager_Queue(this->csIdList[this->csIdIndex]);
}
}
}
@@ -563,7 +563,7 @@ void EnZov_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
phi_a1 = 0;
curFrame = this->skelAnime.curFrame;
phi_v1 = this->unk_2EC;
diff --git a/src/overlays/actors/ovl_En_Zov/z_en_zov.h b/src/overlays/actors/ovl_En_Zov/z_en_zov.h
index a5e217ca3..7e1204100 100644
--- a/src/overlays/actors/ovl_En_Zov/z_en_zov.h
+++ b/src/overlays/actors/ovl_En_Zov/z_en_zov.h
@@ -30,9 +30,9 @@ typedef struct EnZov {
/* 0x320 */ u16 unk_320;
/* 0x322 */ s16 unk_322;
/* 0x324 */ s16 unk_324;
- /* 0x326 */ s16 unk_326;
- /* 0x328 */ s16 unk_328[2];
- /* 0x32C */ s16 unk_32C;
+ /* 0x326 */ s16 cueId;
+ /* 0x328 */ s16 csIdList[2];
+ /* 0x32C */ s16 csIdIndex;
/* 0x330 */ EnZovActionFunc actionFunc;
} EnZov; // size = 0x334
diff --git a/src/overlays/actors/ovl_En_Zow/z_en_zow.c b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
index e68a11038..334b8fc05 100644
--- a/src/overlays/actors/ovl_En_Zow/z_en_zow.c
+++ b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
@@ -182,26 +182,27 @@ void func_80BDC830(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 1) {
- if (!flag) {
- gDPPipeSync(POLY_XLU_DISP++);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
- gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
+ if (ptr->unk_00 != 1) {
+ continue;
}
+
+ if (!flag) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
+ gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -213,26 +214,27 @@ void func_80BDC9DC(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 3) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- if (1) {}
- flag = true;
- }
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
+ if (ptr->unk_00 != 3) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
+ flag = true;
+ }
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -244,27 +246,28 @@ void func_80BDCB84(EnZowStruct* ptr, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
u8 flag = false;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 15; i++, ptr++) {
- if (ptr->unk_00 == 2) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
+ if (ptr->unk_00 != 2) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -357,7 +360,7 @@ void func_80BDD1E0(EnZow* this, PlayState* play) {
u16 phi_a1;
if (ENZOW_GET_F(&this->actor) == ENZOW_F_1) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_78_04)) {
phi_a1 = 0x12FD;
@@ -384,7 +387,7 @@ void func_80BDD1E0(EnZow* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_78_10);
phi_a1 = 0x12FF;
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_80)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE)) {
if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA) {
phi_a1 = 0x12EC;
} else {
@@ -547,7 +550,7 @@ void EnZow_Update(Actor* thisx, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 30.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 15.0f, 30.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if (this->unk_2CE != 0) {
this->unk_2CA &= ~2;
@@ -629,7 +632,7 @@ void EnZow_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
if (this->unk_2CE >= 255) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp54[this->unk_2C4]));
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
index c41f45579..661d24636 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_item_b_heart.c
+ * Overlay: ovl_Item_B_Heart
+ * Description: Heart Container
+ */
+
#include "z_item_b_heart.h"
#include "objects/object_gi_hearts/object_gi_hearts.h"
@@ -10,7 +16,8 @@ void ItemBHeart_Destroy(Actor* thisx, PlayState* play);
void ItemBHeart_Update(Actor* thisx, PlayState* play);
void ItemBHeart_Draw(Actor* thisx, PlayState* play);
-/*
+void ItemBHeart_UpdateModel(ItemBHeart* this, PlayState* play);
+
const ActorInit Item_B_Heart_InitVars = {
ACTOR_ITEM_B_HEART,
ACTORCAT_BOSS,
@@ -20,16 +27,94 @@ const ActorInit Item_B_Heart_InitVars = {
(ActorFunc)ItemBHeart_Init,
(ActorFunc)ItemBHeart_Destroy,
(ActorFunc)ItemBHeart_Update,
- (ActorFunc)ItemBHeart_Draw
+ (ActorFunc)ItemBHeart_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Init.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_VEC3F_DIV1000(scale, 0, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 800, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Destroy.s")
+void ItemBHeart_Init(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Update.s")
+ if (Flags_GetCollectible(play, 0x1F)) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.8f);
+ if (this->actor.params == BHEART_PARAM_SMALL) {
+ this->baseScale = BHEART_SCALE_SMALL;
+ } else {
+ this->baseScale = BHEART_SCALE_NORMAL;
+ }
+ this->actor.world.pos.y += 20.0f * this->baseScale;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/func_808BCF54.s")
+void ItemBHeart_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Item_B_Heart/ItemBHeart_Draw.s")
+/**
+ * Adjusts size and handles collection (if of proper baseScale)
+ */
+void ItemBHeart_Update(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
+
+ ItemBHeart_UpdateModel(this, play);
+
+ if (!(this->baseScale < BHEART_SCALE_MIN_COLLECTIBLE)) {
+ if (Actor_HasParent(&this->actor, play)) {
+ Flags_SetCollectible(play, 0x1F);
+ Actor_Kill(&this->actor);
+ return;
+ }
+ Actor_OfferGetItem(&this->actor, play, GI_HEART_CONTAINER, 30.0f, 80.0f);
+ }
+}
+
+/**
+ * Rotate continuously while approaching 40% of object's unit scale.
+ */
+void ItemBHeart_UpdateModel(ItemBHeart* this, PlayState* play) {
+ this->actor.shape.rot.y += 0x400;
+ Math_ApproachF(&this->variableScale, 0.4f, 0.1f, 0.01f);
+ Actor_SetScale(&this->actor, this->variableScale * this->baseScale);
+}
+
+/**
+ * Draw translucently when in front of a boss warp portal
+ */
+void ItemBHeart_Draw(Actor* thisx, PlayState* play) {
+ ItemBHeart* this = THIS;
+ Actor* actorIt;
+ u8 drawTranslucent = false;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ actorIt = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
+
+ while (actorIt != NULL) {
+ if ((actorIt->id == ACTOR_DOOR_WARP1) && (actorIt->projectedPos.z > this->actor.projectedPos.z)) {
+ drawTranslucent = true;
+ break;
+ }
+ actorIt = actorIt->next;
+ }
+
+ if (drawTranslucent || (this->actor.world.rot.y != 0)) {
+ Gfx_SetupDL25_Xlu(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++, &gGiHeartBorderDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gGiHeartContainerDL);
+ } else {
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, &gGiHeartBorderDL);
+ gSPDisplayList(POLY_OPA_DISP++, &gGiHeartContainerDL);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
index 4e3126e25..90577dcfd 100644
--- a/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
+++ b/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.h
@@ -3,12 +3,20 @@
#include "global.h"
-struct ItemBHeart;
+typedef enum {
+ /* 0 */ BHEART_PARAM_NORMAL, // Spawn Parameter for Normal Scale.
+ /* 35 */ BHEART_PARAM_SMALL = 35 // Spawn Parameter for Small Scale.
+} ItemBHeartParam;
+
+#define BHEART_SCALE_SMALL (0.1f) // Scale value for Small Mode
+#define BHEART_SCALE_NORMAL (1.0f) // Scale value for Normal Mode
+#define BHEART_SCALE_MIN_COLLECTIBLE (0.5f) // baseScale <50% will disable collection
typedef struct ItemBHeart {
/* 0x000 */ Actor actor;
- /* 0x144 */ UNK_TYPE1 unk_144[0x24];
- /* 0x168 */ f32 unk_168;
+ /* 0x144 */ UNK_TYPE1 unk_144[0x20];
+ /* 0x164 */ f32 variableScale;
+ /* 0x168 */ f32 baseScale;
} ItemBHeart; // size = 0x16C
#endif // Z_ITEM_B_HEART_H
diff --git a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
index 4880a326e..61b172ea7 100644
--- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
+++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.c
@@ -609,7 +609,7 @@ void MirRay_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(1.0f, 1.0f, this->reflectIntensity, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
index cd48cfed1..f27254cec 100644
--- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
+++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
@@ -19,8 +19,8 @@ typedef enum {
/* 0x7 */ MIRRAY_SPIRIT_TOPROOM_COBRA1,
/* 0x8 */ MIRRAY_SPIRIT_TOPROOM_COBRA2,
/* 0x9 */ MIRRAY_GANONSCASTLE_SPIRITTRIAL_DOWNLIGHT,
- /* 0xA */ MIRRAY_MAX,
-} MirRayBeamLocations;
+ /* 0xA */ MIRRAY_MAX
+} MirRayBeamLocation;
typedef struct MirRay {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c b/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c
index a552e35ab..c4e861ff6 100644
--- a/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c
+++ b/src/overlays/actors/ovl_Mir_Ray2/z_mir_ray2.c
@@ -115,7 +115,7 @@ void MirRay2_Update(Actor* thisx, PlayState* play) {
} else {
func_80AF3FE0(this, play);
if (MIRRAY2_GET_F(thisx) != 1) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 10.0f, UPDBGCHECKINFO_FLAG_4);
this->actor.shape.shadowAlpha = 0x50;
} else {
func_80AF3F70(this);
diff --git a/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c b/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
index 8f6fcbfe9..ae8c81f26 100644
--- a/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
+++ b/src/overlays/actors/ovl_Mir_Ray3/z_mir_ray3.c
@@ -361,7 +361,7 @@ void MirRay3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Scale(1.0f, 1.0f, this->unk_214, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
index 532daec90..ca4efd4bb 100644
--- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
+++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
@@ -257,7 +257,7 @@ void ObjAqua_Update(Actor* thisx, PlayState* play) {
}
this->actor.velocity.y *= 0.9f;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 4.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 12.0f, 4.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
if (this->actionFunc != func_80ACBDFC) {
Collider_UpdateCylinder(&this->actor, &this->collider);
this->collider.dim.radius = this->actor.scale.x * 3000.0f;
@@ -274,7 +274,8 @@ void ObjAqua_Draw(Actor* thisx, PlayState* play) {
s32 actionFuncTemp = this->actionFunc == func_80ACBDFC;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
framesTemp = ((play->gameplayFrames & 0x7FFFFFFF) * -0xA) & 0x1FF;
if (actionFuncTemp) {
framesTemp >>= 1;
diff --git a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
index 05544da0e..f41b8057c 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
@@ -7,7 +7,7 @@
#include "z_obj_armos.h"
#include "objects/gameplay_keep/gameplay_keep.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((ObjArmos*)thisx)
@@ -95,20 +95,20 @@ s32 func_809A4F00(ObjArmos* this, s32 arg1) {
}
if (temp_v0 == OBJARMOS_ROT_7_4) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (temp_v0 == OBJARMOS_ROT_7_5) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
if (temp_v0 == OBJARMOS_ROT_7_6) {
if (this->unk_26E != 0) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (this->unk_270 != 0) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
return true;
@@ -141,22 +141,22 @@ s32 func_809A500C(ObjArmos* this, s32 arg1) {
if (temp_v0 == OBJARMOS_ROT_7_4) {
temp = D_809A5BB0[arg1] + this->unk_26E;
- return temp <= temp_v1 && -temp_v1 <= temp;
+ return (temp <= temp_v1) && (-temp_v1 <= temp);
}
if (temp_v0 == OBJARMOS_ROT_7_5) {
temp2 = D_809A5BB8[arg1] + this->unk_270;
- return temp2 <= temp_v1 && -temp_v1 <= temp2;
+ return (temp2 <= temp_v1) && (-temp_v1 <= temp2);
}
if (temp_v0 == OBJARMOS_ROT_7_6) {
if ((arg1 == 0) || (arg1 == 1)) {
temp = D_809A5BB0[arg1] + this->unk_26E;
- return temp <= temp_v1 && -temp_v1 <= temp;
+ return (temp <= temp_v1) && (-temp_v1 <= temp);
}
temp2 = D_809A5BB8[arg1] + this->unk_270;
- return temp2 <= temp_v1 && -temp_v1 <= temp2;
+ return (temp2 <= temp_v1) && (-temp_v1 <= temp2);
}
return false;
@@ -227,7 +227,7 @@ void ObjArmos_Destroy(Actor* thisx, PlayState* play) {
void func_809A54B4(ObjArmos* this) {
this->actionFunc = func_809A54E0;
- this->unk_24C = 4;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4;
this->unk_266[1] = 0;
this->unk_266[2] = 0;
this->unk_266[3] = 0;
@@ -260,7 +260,7 @@ void func_809A54E0(ObjArmos* this, PlayState* play) {
void func_809A5610(ObjArmos* this) {
this->actionFunc = func_809A562C;
- this->unk_24C = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
}
void func_809A562C(ObjArmos* this, PlayState* play) {
@@ -304,7 +304,7 @@ void func_809A562C(ObjArmos* this, PlayState* play) {
void func_809A57D8(ObjArmos* this) {
this->actionFunc = func_809A57F4;
- this->unk_24C = 4;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4;
}
void func_809A57F4(ObjArmos* this, PlayState* play) {
@@ -322,12 +322,12 @@ void ObjArmos_Update(Actor* thisx, PlayState* play2) {
this->actionFunc(this, play);
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
- if (this->unk_24C != 0) {
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 20.0f, 30.0f, 0.0f, this->unk_24C);
+ if (this->updBgCheckInfoFlags != 0) {
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 20.0f, 30.0f, 0.0f, this->updBgCheckInfoFlags);
if ((this->actionFunc == func_809A54E0) && (this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(DynaPoly_GetActor(&play->colCtx, this->dyna.actor.floorBgId) == NULL)) {
- this->unk_24C = 0;
+ this->updBgCheckInfoFlags = 0;
}
this->unk_250.x = (Math_SinS(this->dyna.actor.shape.rot.y) * -9.0f) + this->dyna.actor.world.pos.x;
@@ -350,7 +350,7 @@ void func_809A5960(ObjArmos* this, PlayState* play) {
(Math_CosS(this->dyna.actor.shape.rot.y) * -9.0f) + this->dyna.actor.world.pos.z,
&this->dyna.actor.shape.rot);
Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
@@ -366,7 +366,7 @@ void func_809A5A3C(ObjArmos* this, PlayState* play) {
if (this->dyna.actor.floorPoly != NULL) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
COMBINED);
diff --git a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
index 2e9453005..4ac83cc9d 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
@@ -12,15 +12,15 @@ typedef void (*ObjArmosActionFunc)(struct ObjArmos*, PlayState*);
#define OBJARMOS_GET_ROTZ_7(thisx) ((thisx)->home.rot.z & 7)
#define OBJARMOS_GET_ROTX_F(thisx) ((thisx)->home.rot.x & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJARMOS_ROT_7_0,
/* 1 */ OBJARMOS_ROT_7_1,
/* 2 */ OBJARMOS_ROT_7_2,
/* 3 */ OBJARMOS_ROT_7_3,
/* 4 */ OBJARMOS_ROT_7_4,
/* 5 */ OBJARMOS_ROT_7_5,
- /* 6 */ OBJARMOS_ROT_7_6,
-};
+ /* 6 */ OBJARMOS_ROT_7_6
+} ObjArmosParam;
typedef struct ObjArmos {
/* 0x000 */ DynaPolyActor dyna;
@@ -28,7 +28,7 @@ typedef struct ObjArmos {
/* 0x1A0 */ Vec3s jointTable[OBJECT_AM_LIMB_MAX];
/* 0x1F4 */ Vec3s morphTable[OBJECT_AM_LIMB_MAX];
/* 0x248 */ ObjArmosActionFunc actionFunc;
- /* 0x24C */ u32 unk_24C;
+ /* 0x24C */ u32 updBgCheckInfoFlags;
/* 0x250 */ Vec3f unk_250;
/* 0x25C */ f32* unk_25C;
/* 0x260 */ f32 unk_260;
diff --git a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
index 13b565598..003b94932 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c
@@ -365,7 +365,7 @@ void ObjBean_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->unk_1FE = 0;
this->unk_1B8 = 0.1f;
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
Collider_InitCylinder(play, &this->collider);
if ((sp2C == ENOBJBEAN_GET_C000_1) || (sp2C == ENOBJBEAN_GET_C000_2)) {
@@ -414,7 +414,7 @@ void ObjBean_Init(Actor* thisx, PlayState* play) {
if (OBJBEAN_GET_80(&this->dyna.actor) || Flags_GetSwitch(play, OBJBEAN_GET_7F(&this->dyna.actor, 1))) {
func_80938804(this);
} else {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
func_80938704(this);
}
}
@@ -588,20 +588,20 @@ void func_809381B0(ObjBean* this) {
void func_809381C4(ObjBean* this, PlayState* play) {
this->unk_1E8(this);
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
- if (this->dyna.actor.cutscene >= 0) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
+ if (this->dyna.actor.csId >= 0) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_1);
}
this->unk_1E4 = 2;
func_80938284(this);
} else if (this->unk_1E4 == 4) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
play_sound(NA_SE_SY_ERROR);
this->unk_1E4 = 0;
func_80937FB0(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -618,7 +618,7 @@ void func_80938298(ObjBean* this, PlayState* play) {
this->unk_1E4 = 5;
func_8093833C(this);
} else if (this->unk_1E4 == 4) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
play_sound(NA_SE_SY_ERROR);
this->unk_1E4 = 0;
func_80937FB0(this);
@@ -634,7 +634,7 @@ void func_80938358(ObjBean* this, PlayState* play) {
this->unk_1E8(this);
if (this->unk_1B2 <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
func_80937FB0(this);
}
}
@@ -735,7 +735,7 @@ void func_80938704(ObjBean* this) {
void func_80938728(ObjBean* this, PlayState* play) {
if (this->unk_200 != 0) {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
func_8093876C(this);
}
}
@@ -745,16 +745,16 @@ void func_8093876C(ObjBean* this) {
}
void func_80938780(ObjBean* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
- if (this->dyna.actor.cutscene >= 0) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
+ if (this->dyna.actor.csId >= 0) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_1);
}
this->unk_1B4 = 36;
func_80937130(this);
func_80938AA4(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -765,7 +765,7 @@ void func_80938804(ObjBean* this) {
}
void func_80938834(ObjBean* this, PlayState* play) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_80938874(this);
}
func_80936F24(this);
@@ -784,7 +784,7 @@ void func_809388A8(ObjBean* this, PlayState* play) {
func_80937268(this, play);
func_809372A8(this);
func_8093892C(this);
- } else if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ } else if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_800B9010(&this->dyna.actor, NA_SE_PL_PLANT_MOVE - SFX_FLAG);
}
func_80936F24(this);
@@ -797,7 +797,7 @@ void func_8093892C(ObjBean* this) {
}
void func_80938958(ObjBean* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingRotatingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerAbove(&this->dyna)) {
func_80938804(this);
}
func_80936F24(this);
@@ -810,7 +810,7 @@ void func_80938998(ObjBean* this) {
}
void func_809389BC(ObjBean* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_80937268(this, play);
func_809372A8(this);
func_80937238(this);
@@ -851,9 +851,9 @@ void func_80938AD8(ObjBean* this, PlayState* play) {
}
if (sp30 != 0) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
if (this->dyna.actor.xzDistToPlayer < 74.0f) {
@@ -909,7 +909,7 @@ void ObjBean_Update(Actor* thisx, PlayState* play) {
if (this->unk_1B4 > 0) {
this->unk_1B4--;
if (this->unk_1B4 == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
@@ -925,7 +925,7 @@ void ObjBean_Update(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.shadowScale = this->dyna.actor.scale.x * 88.0f;
if (func_80937468(this, play)) {
func_809375F4(this, play);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
func_80938998(this);
}
} else {
@@ -939,7 +939,7 @@ void func_80938E00(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
index 7699b3427..1a22de390 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
@@ -16,11 +16,11 @@ typedef void (*ObjBeanUnkFunc)(struct ObjBean*);
#define OBJBEAN_GET_3(thisx) ((thisx)->home.rot.z & 3)
-enum {
- /* 0x0 */ ENOBJBEAN_GET_C000_0,
- /* 0x1 */ ENOBJBEAN_GET_C000_1,
- /* 0x2 */ ENOBJBEAN_GET_C000_2,
-};
+typedef enum {
+ /* 0 */ ENOBJBEAN_GET_C000_0,
+ /* 1 */ ENOBJBEAN_GET_C000_1,
+ /* 2 */ ENOBJBEAN_GET_C000_2
+} ObjBeanParam;
typedef struct ObjBean {
/* 0x000 */ DynaPolyActor dyna;
diff --git a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
index fb7f1466c..0a50c85c5 100644
--- a/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
+++ b/src/overlays/actors/ovl_Obj_Bell/z_obj_bell.c
@@ -220,13 +220,16 @@ void func_80A359B4(Actor* thisx, PlayState* play) {
Matrix_RotateXS(thisx->world.rot.x, MTXMODE_APPLY);
Matrix_RotateYS(-thisx->world.rot.y, MTXMODE_APPLY);
Matrix_Translate(0.0f, -2600.0f, 0.0f, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000698);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_0008D0);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000960);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_0007A8);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -234,20 +237,26 @@ void func_80A35B18(Actor* thisx, PlayState* play) {
Matrix_Translate(thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, MTXMODE_NEW);
Matrix_Scale(thisx->scale.x, thisx->scale.y, thisx->scale.z, MTXMODE_APPLY);
Matrix_RotateYS(thisx->shape.rot.y, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f52_obj_DL_000570);
+
CLOSE_DISPS(play->state.gfxCtx);
}
void func_80A35BD4(Actor* thisx, PlayState* play) {
Matrix_Translate(thisx->world.pos.x, thisx->world.pos.y - 4.0f, thisx->world.pos.z, MTXMODE_NEW);
Matrix_Scale(thisx->scale.x, thisx->scale.y, thisx->scale.z, MTXMODE_APPLY);
+
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(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++, object_f52_obj_DL_000840);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
index 04871bae5..61805fd49 100644
--- a/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
+++ b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
@@ -159,13 +159,13 @@ void func_80AE8DE4(ObjBigicicle* this, PlayState* play) {
f32 temp_f20 = this->actor.scale.x * (50.0f / 3.0f);
for (i = 0; i < 10; i++) {
- sp98.x = (randPlusMinusPoint5Scaled(4.0f) * temp_f20) + this->actor.world.pos.x;
+ sp98.x = (Rand_CenteredFloat(4.0f) * temp_f20) + this->actor.world.pos.x;
sp98.y = ((Rand_ZeroFloat(20.0f) - 35.0f) * temp_f20) + this->actor.world.pos.y;
- sp98.z = (randPlusMinusPoint5Scaled(4.0f) * temp_f20) + this->actor.world.pos.z;
+ sp98.z = (Rand_CenteredFloat(4.0f) * temp_f20) + this->actor.world.pos.z;
- sp8C.x = randPlusMinusPoint5Scaled(13.0f);
+ sp8C.x = Rand_CenteredFloat(13.0f);
sp8C.y = Rand_ZeroFloat(2.0f);
- sp8C.z = randPlusMinusPoint5Scaled(13.0f);
+ sp8C.z = Rand_CenteredFloat(13.0f);
EffectSsHahen_Spawn(play, &sp98, &sp8C, &D_80AE987C, HAHEN_XLU, (Rand_ZeroFloat(20.0f) + 30.0f) * temp_f20,
OBJECT_BIGICICLE, 40, object_bigicicle_DL_0009B0);
@@ -182,7 +182,7 @@ void func_80AE8FD4(ObjBigicicle* this, PlayState* play) {
if ((this->collider1.base.acFlags & AC_HIT) ||
((this->collider2.base.acFlags & AC_HIT) && (this->collider2.info.acHitInfo->toucher.dmgFlags & 0x3820))) {
if ((this->unk_148 == 0) || (this->unk_149 == 1)) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_80AE9090;
return;
}
@@ -195,8 +195,8 @@ void func_80AE8FD4(ObjBigicicle* this, PlayState* play) {
}
void func_80AE9090(ObjBigicicle* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->unk_149++;
func_80AE8DE4(this, play);
if (this->unk_149 == 2) {
@@ -213,7 +213,7 @@ void func_80AE9090(ObjBigicicle* this, PlayState* play) {
this->actionFunc = func_80AE9180;
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -222,12 +222,12 @@ void func_80AE9180(ObjBigicicle* this, PlayState* play) {
if (this->unk_14A > 0) {
this->unk_14A--;
- this->actor.shape.rot.x = BINANG_ADD((s32)(randPlusMinusPoint5Scaled(1408.0f) * 0.02f * this->unk_14A), 0x4000);
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled(1408.0f) * 0.02f * this->unk_14A;
+ this->actor.shape.rot.x = BINANG_ADD((s32)(Rand_CenteredFloat(0x580) * 0.02f * this->unk_14A), 0x4000);
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x580) * 0.02f * this->unk_14A;
} else {
this->actor.shape.rot.x = 0x4000;
this->actor.shape.rot.z = 0;
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
this->actionFunc = func_80AE8FD4;
}
}
@@ -238,7 +238,7 @@ void func_80AE9258(ObjBigicicle* this, PlayState* play) {
ObjIcePoly* icePoly;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first;
@@ -271,9 +271,9 @@ void func_80AE939C(ObjBigicicle* this, PlayState* play) {
f32 temp_f20 = this->actor.scale.x * (50.0f / 3.0f);
for (i = 0; i < 20; i++) {
- sp8C.x = randPlusMinusPoint5Scaled(15.0f);
+ sp8C.x = Rand_CenteredFloat(15.0f);
sp8C.y = Rand_ZeroFloat(7.0f) + 3.0f;
- sp8C.z = randPlusMinusPoint5Scaled(15.0f);
+ sp8C.z = Rand_CenteredFloat(15.0f);
sp98.x = this->actor.world.pos.x + (sp8C.x * 5.0f * temp_f20);
sp98.y = this->actor.world.pos.y + (sp8C.y * 7.0f * temp_f20);
@@ -284,7 +284,7 @@ void func_80AE939C(ObjBigicicle* this, PlayState* play) {
}
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_GLASSBROKEN_IMPACT);
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
Actor_Kill(&this->actor);
}
diff --git a/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c b/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c
index 437f0c234..a4f44973f 100644
--- a/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c
+++ b/src/overlays/actors/ovl_Obj_Blockstop/z_obj_blockstop.c
@@ -48,7 +48,7 @@ void ObjBlockstop_CheckForBlock(ObjBlockstop* this, PlayState* play) {
s32 params = OBJOSHIHIKI_GET_F(prop);
if (params < 3) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = ObjBlockstop_TryPlayCutscene;
}
}
@@ -57,15 +57,15 @@ void ObjBlockstop_CheckForBlock(ObjBlockstop* this, PlayState* play) {
}
void ObjBlockstop_TryPlayCutscene(ObjBlockstop* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
Flags_SetSwitch(play, this->actor.params);
- if (ActorCutscene_GetLength(this->actor.cutscene) != -1) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetLength(this->actor.csId) != -1) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
}
Actor_Kill(&this->actor);
return;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
void ObjBlockstop_Update(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
index cc94527a0..6c81e8de6 100644
--- a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
+++ b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
@@ -61,12 +61,12 @@ void ObjBoat_Init(Actor* thisx, PlayState* play) {
Vec3f sp24;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_kaizoku_obj_Colheader_009A88);
if (thisx->params < 0) {
this->dyna.actor.update = ObjBoat_UpdateCutscene;
} else {
- path = &play->setupPathList[OBJBOAT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJBOAT_GET_PATH_INDEX(thisx)];
this->maxPointIndex = path->count - 1;
this->points = Lib_SegmentedToVirtual(path->points);
this->direction = 1;
@@ -95,14 +95,14 @@ void ObjBoat_Update(Actor* thisx, PlayState* play) {
s32 pad;
ObjBoat* this = THIS;
Player* player = GET_PLAYER(play);
- s32 temp = DynaPolyActor_IsInRidingMovingState(&this->dyna);
+ s32 isPlayerOnTop = DynaPolyActor_IsPlayerOnTop(&this->dyna);
f32 speedTarget = 0.0f;
s16 yawTarget = this->dyna.actor.shape.rot.y;
Vec3f nextPoint;
- if (temp || ((DynaPolyActor_IsInRidingFallingState(&this->dyna)))) {
+ if (isPlayerOnTop || DynaPolyActor_IsActorOnTop(&this->dyna)) {
if ((this->timer == 0) &&
- (OBJBOAT_GET_4000(thisx) || (temp && (this->curPointIndex == this->lastPointIndex)))) {
+ (OBJBOAT_GET_4000(thisx) || (isPlayerOnTop && (this->curPointIndex == this->lastPointIndex)))) {
this->direction = -this->direction;
if (this->direction > 0) {
this->lastPointIndex = this->maxPointIndex;
@@ -151,29 +151,29 @@ void ObjBoat_UpdateCutscene(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
ObjBoat* this = THIS;
- if (Cutscene_CheckActorAction(play, 511)) {
- CsCmdActorAction* actionIndex = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 511)];
- if (this->csAction != actionIndex->action) {
- this->dyna.actor.shape.rot.x = actionIndex->urot.x;
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_511)) {
+ CsCmdActorCue* cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_511)];
- if (actionIndex->action != 1) {
- Path* path = &play->setupPathList[OBJBOAT_GET_PATH(&this->dyna.actor)];
+ if (this->cueId != cue->id) {
+ this->dyna.actor.shape.rot.x = cue->rot.x;
+ if (cue->id != 1) {
+ Path* path = &play->setupPathList[OBJBOAT_GET_PATH_INDEX(&this->dyna.actor)];
- if (actionIndex->action == 3) {
- path = &play->setupPathList[path->unk1];
+ if (cue->id == 3) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->maxPointIndex = path->count;
this->points = Lib_SegmentedToVirtual(path->points);
Math_Vec3s_ToVec3f(&this->dyna.actor.world.pos, this->points);
- this->dyna.actor.speed = actionIndex->urot.z * (45.0f / 0x2000);
+ this->dyna.actor.speed = cue->rot.z * (45.0f / 0x2000);
this->points++;
this->curPointIndex = 1;
}
- this->csAction = actionIndex->action;
+ this->cueId = cue->id;
} else {
- if (actionIndex->action != 1) {
+ if (cue->id != 1) {
Vec3f posTarget;
f32 distRemaining;
@@ -185,9 +185,9 @@ void ObjBoat_UpdateCutscene(Actor* thisx, PlayState* play2) {
}
}
- if (actionIndex->action != 3) {
+ if (cue->id != 3) {
ObjBoat_SetRotations(this);
- if (actionIndex->action == 2) {
+ if (cue->id == 2) {
func_800B9010(&this->dyna.actor, NA_SE_EV_PIRATE_SHIP - SFX_FLAG);
}
} else {
diff --git a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
index 879e2e50c..00cb936d7 100644
--- a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
+++ b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define OBJBOAT_GET_PATH(thisx) (((thisx)->params >> 7) & 0x1F)
+#define OBJBOAT_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJBOAT_GET_4000(thisx) ((thisx)->params & 0x4000)
struct ObjBoat;
@@ -15,7 +15,7 @@ typedef struct ObjBoat {
/* 0x15E */ u8 lastPointIndex; // max point if direction is negative, first point if forwards
/* 0x15F */ union {
u8 timer;
- u8 csAction;
+ u8 cueId;
};
/* 0x160 */ s16 angle; // Angle used to set rotations
/* 0x162 */ UNK_TYPE1 pad_162;
diff --git a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
index 84b2abc63..c8eed614b 100644
--- a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
+++ b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
@@ -77,11 +77,11 @@ static ColliderCylinderInit sCylinderInit2 = {
};
typedef struct {
- /* 0x00 */ ColliderCylinderInit* collider;
- /* 0x04 */ ActorShadowFunc unk_04;
- /* 0x08 */ ActorFunc unk_08;
- /* 0x0C */ s32 (*unk_0C)(Actor*);
-} ObjBombiwaStruct2;
+ /* 0x0 */ ColliderCylinderInit* collider;
+ /* 0x4 */ ActorShadowFunc unk_04;
+ /* 0x8 */ ActorFunc unk_08;
+ /* 0xC */ s32 (*unk_0C)(Actor*);
+} ObjBombiwaStruct2; // size = 0x10
static ObjBombiwaStruct2 D_8093A998[] = {
{ &sCylinderInit1, ActorShadow_DrawCircle, func_8093A418, func_809393B0 },
@@ -465,7 +465,7 @@ void func_8093A418(Actor* thisx, PlayState* play) {
sp28 = (2300.0f - this->actor.projectedPos.z) * 2.55f;
this->actor.shape.shadowAlpha = sp28 * (32.0f / 51);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
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, 255, (s32)sp28);
@@ -489,20 +489,20 @@ void func_8093A608(Actor* thisx, PlayState* play) {
if (this->actionFunc == func_80939EF4) {
if ((this->actor.projectedPos.z <= 2200.0f) ||
((this->unk_203 & 1) && (this->actor.projectedPos.z < 2300.0f))) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x9B, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_bombiwa_DL_004560);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, object_bombiwa_DL_004688);
} else if (this->actor.projectedPos.z < 2300.0f) {
sp38 = (2300.0f - this->actor.projectedPos.z) * 2.55f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -510,7 +510,7 @@ void func_8093A608(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, object_bombiwa_DL_004560);
}
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
diff --git a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
index dd9f84ae0..d1f19032f 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
@@ -25,7 +25,7 @@ void ObjChan_Destroy(Actor* thisx, PlayState* play);
void ObjChan_Update(Actor* thisx, PlayState* play);
void ObjChan_Draw(Actor* thisx, PlayState* play);
-void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play);
+void ObjChan_ChandelierAction(ObjChan* this, PlayState* play);
void ObjChan_PotAction(ObjChan* this, PlayState* play);
ActorInit Obj_Chan_InitVars = {
@@ -64,7 +64,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-void ObjChan_InitChandelier(ObjChan* this2, PlayState* play);
+void ObjChan_InitChandelier(ObjChan* this, PlayState* play);
void ObjChan_InitPot(ObjChan* this, PlayState* play);
void ObjChan_CreateSmashEffects(ObjChan* this, PlayState* play);
void ObjChan_DrawPot(Actor* thisx, PlayState* play);
@@ -92,17 +92,21 @@ void ObjChan_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sObjChanCylinderInit);
- SubS_FillCutscenesList(&this->actor, this->cutscenes, ARRAY_COUNT(this->cutscenes));
+ SubS_FillCutscenesList(&this->actor, this->csIdList, ARRAY_COUNT(this->csIdList));
switch (OBJCHAN_SUBTYPE(&this->actor)) {
case OBJCHAN_SUBTYPE_CHANDELIER:
this->rotation = this->actor.shape.rot.y;
this->actor.shape.rot.y = 0;
ObjChan_InitChandelier(this, play);
break;
+
case OBJCHAN_SUBTYPE_POT:
this->actor.draw = ObjChan_DrawPot;
ObjChan_InitPot(this, play);
break;
+
+ default:
+ break;
}
}
@@ -117,16 +121,16 @@ u32 func_80BB9A1C(ObjChan* this, f32 arg1) {
f32 sp20;
sp20 = Math_SinS(this->unk1D4) * this->unk1D0;
- temp_f6 = (Math_CosS(this->unk1D4) * 0.03834952f * this->unk1D0) + arg1;
+ temp_f6 = (Math_CosS(this->unk1D4) * (400 * M_PI / 0x8000) * this->unk1D0) + arg1;
if (temp_f6 != 0.0f) {
- this->unk1D4 = RADF_TO_BINANG(func_80086B30(sp20 * 0.03834952f, temp_f6));
+ this->unk1D4 = RAD_TO_BINANG(Math_FAtan2F(sp20 * (400 * M_PI / 0x8000), temp_f6));
} else if (sp20 >= 0.0f) {
this->unk1D4 = 0x4000;
} else {
this->unk1D4 = -0x4000;
}
if (Math_CosS(this->unk1D4) != 0.0f) {
- this->unk1D0 = (temp_f6 / (Math_CosS(this->unk1D4) * 0.03834952f));
+ this->unk1D0 = (temp_f6 / (Math_CosS(this->unk1D4) * (400 * M_PI / 0x8000)));
} else {
this->unk1D0 = sp20;
}
@@ -150,46 +154,44 @@ void ObjChan_CalculatePotPosition(Vec3f* childPosOut, Vec3s* childRotOut, Vec3f*
childRotOut->y += childAngle;
}
-//! TODO: Possibly takes actor and recasts
-void ObjChan_InitChandelier(ObjChan* this2, PlayState* play) {
- ObjChan* this = this2;
+void ObjChan_InitChandelier(ObjChan* this, PlayState* play) {
+ Actor* thisx = &this->actor;
s32 i;
- ObjChan* temp_v0;
+ ObjChan* pot;
Vec3f childPos;
Vec3s childRot;
CollisionPoly* sp94;
s32 sp90;
Vec3f sp84;
- Math_Vec3f_Copy(&this->unk1C0, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->unk1C0, &thisx->world.pos);
- Math_Vec3f_Copy(&sp84, &this->actor.world.pos);
+ Math_Vec3f_Copy(&sp84, &thisx->world.pos);
sp84.y += 1600.0f;
- if (BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp84, &this->unk1C0, &sp94, false, false, true,
- true, &sp90)) {
- this->unk1CC = this->actor.world.pos.y - this->unk1C0.y;
+ if (BgCheck_EntityLineTest1(&play->colCtx, &thisx->world.pos, &sp84, &this->unk1C0, &sp94, false, false, true, true,
+ &sp90)) {
+ this->unk1CC = thisx->world.pos.y - this->unk1C0.y;
} else {
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
return;
}
for (i = 0; i < 5; i++) {
- ObjChan_CalculatePotPosition(&childPos, &childRot, &this->actor.world.pos, &this->actor.shape.rot,
- (s32)(i * 360.0f / 5.0f * (65536.0f / 360.0f)) + this->rotation);
- temp_v0 = (ObjChan*)Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_OBJ_CHAN, childPos.x, childPos.y,
- childPos.z, childRot.x, childRot.y, childRot.z,
- (this->actor.params & 0xFFF) | 0x1000, this->actor.cutscene,
- this->actor.halfDaysBits, &this->actor);
- if (temp_v0 != NULL) {
- this->pots[i] = temp_v0;
- temp_v0->myPotIndex = i;
- temp_v0->actor.cutscene = this->actor.cutscene;
+ ObjChan_CalculatePotPosition(&childPos, &childRot, &thisx->world.pos, &thisx->shape.rot,
+ (s32)DEG_TO_BINANG_ALT3(i * 360.0f / 5.0f) + this->rotation);
+ pot = (ObjChan*)Actor_SpawnAsChildAndCutscene(
+ &play->actorCtx, play, ACTOR_OBJ_CHAN, childPos.x, childPos.y, childPos.z, childRot.x, childRot.y,
+ childRot.z, (thisx->params & 0xFFF) | 0x1000, thisx->csId, thisx->halfDaysBits, thisx);
+ if (pot != NULL) {
+ this->pots[i] = pot;
+ pot->myPotIndex = i;
+ pot->actor.csId = thisx->csId;
} else {
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
}
}
- if (Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, thisx->params & 0x7F)) {
this->stateFlags |= OBJCHAN_STATE_FIRE_DELAY;
this->stateFlags |= OBJCHAN_STATE_ON_FIRE;
@@ -211,9 +213,9 @@ void ObjChan_InitChandelier(ObjChan* this2, PlayState* play) {
}
//! TODO: More descriptive name than Action?
-void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
- ObjChan* this = this2;
- ObjChan* temp;
+void ObjChan_ChandelierAction(ObjChan* this, PlayState* play) {
+ Actor* thisx = &this->actor;
+ ObjChan* pot;
s32 i;
Vec3f sp60;
Vec3s sp58;
@@ -230,44 +232,44 @@ void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
this->unk1D0 = 0.0f;
}
}
- this->actor.shape.rot.z = (Math_SinS(this->unk1D4) * this->unk1D0);
+ thisx->shape.rot.z = (Math_SinS(this->unk1D4) * this->unk1D0);
if ((this->stateFlags & OBJCHAN_STATE_START_CUTSCENE) &&
- SubS_StartActorCutscene(&this->actor, this->cutscenes[0], -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ SubS_StartCutscene(&this->actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
this->stateFlags |= OBJCHAN_STATE_CUTSCENE;
this->stateFlags &= ~OBJCHAN_STATE_START_CUTSCENE;
}
if ((this->stateFlags & OBJCHAN_STATE_CUTSCENE) && this->rotationSpeed == OBJCHAN_ROTATION_SPEED) {
this->stateFlags &= ~OBJCHAN_STATE_CUTSCENE;
- ActorCutscene_Stop(this->cutscenes[0]);
+ CutsceneManager_Stop(this->csIdList[0]);
}
- Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
- Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_RotateYS(thisx->shape.rot.y, MTXMODE_NEW);
+ Matrix_RotateXS(thisx->shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(thisx->shape.rot.z, MTXMODE_APPLY);
Matrix_RotateYS(this->rotation, MTXMODE_APPLY);
- Matrix_MultVecY(this->unk1CC, &this->actor.world.pos);
- Math_Vec3f_Sum(&this->actor.world.pos, &this->unk1C0, &this->actor.world.pos);
+ Matrix_MultVecY(this->unk1CC, &thisx->world.pos);
+ Math_Vec3f_Sum(&thisx->world.pos, &this->unk1C0, &thisx->world.pos);
Collider_UpdateCylinder(&this->actor, &this->collider);
for (i = 0; i < 5; i++) {
- temp = this->pots[i];
- if (temp != NULL) {
- ObjChan_CalculatePotPosition(&sp60, &sp58, &this->actor.world.pos, &this->actor.shape.rot,
- (s32)(i * 360.0f / 5.0f * (65536.0f / 360.0f)) + this->rotation);
- Math_Vec3f_Copy(&temp->actor.world.pos, &sp60);
- Math_Vec3s_Copy(&temp->actor.shape.rot, &this->actor.shape.rot);
- temp->actor.shape.rot.y = this->rotation;
- Math_Vec3f_ToVec3s(&temp->collider.dim.pos, &temp->actor.world.pos);
+ pot = this->pots[i];
+ if (pot != NULL) {
+ ObjChan_CalculatePotPosition(&sp60, &sp58, &thisx->world.pos, &thisx->shape.rot,
+ (s32)DEG_TO_BINANG_ALT3(i * 360.0f / 5.0f) + this->rotation);
+ Math_Vec3f_Copy(&pot->actor.world.pos, &sp60);
+ Math_Vec3s_Copy(&pot->actor.shape.rot, &thisx->shape.rot);
+ pot->actor.shape.rot.y = this->rotation;
+ Math_Vec3f_ToVec3s(&pot->collider.dim.pos, &pot->actor.world.pos);
}
}
if ((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x800)) {
- Flags_SetSwitch(play, this->actor.params & 0x7F);
+ Flags_SetSwitch(play, thisx->params & 0x7F);
}
- if (Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, thisx->params & 0x7F)) {
if (!(this->stateFlags & OBJCHAN_STATE_FIRE_DELAY)) {
this->rotationSpeed = 0;
this->flameSize = 0.0f;
for (i = 0; i < 5; i++) {
- temp = this->pots[i];
- if (temp != NULL) {
+ pot = this->pots[i];
+ if (pot != NULL) {
this->pots[i]->stateFlags |= OBJCHAN_STATE_FIRE_DELAY;
this->pots[i]->fireDelayFrames = 20 + i * 5;
this->pots[i]->flameSize = 0.0f;
@@ -315,7 +317,7 @@ void ObjChan_PotAction(ObjChan* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_37_10);
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_EN_MM, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0x8000,
- this->actor.cutscene, this->actor.halfDaysBits, NULL);
+ this->actor.csId, this->actor.halfDaysBits, NULL);
}
}
Actor_Kill(&this->actor);
@@ -338,6 +340,7 @@ void ObjChan_CreateSmashEffects(ObjChan* this, PlayState* play) {
for (temp_s2 = 0, temp_s1 = 0; temp_s2 != 18; temp_s2++, temp_s1 += 0x4E20) {
f32 sin = Math_SinS(temp_s1);
f32 cos = Math_CosS(temp_s1);
+
spDC.x = sin * 8.0f;
spDC.y = Rand_ZeroOne() * 12.0f + 2.0f;
spDC.z = cos * 8.0f;
@@ -374,14 +377,15 @@ void ObjChan_Draw(Actor* thisx, PlayState* play) {
Gfx* xlu;
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_RotateYS(this->rotation, MTXMODE_APPLY);
- opa = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+ opa = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&opa[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&opa[1], object_obj_chan_DL_000AF0);
POLY_OPA_DISP = &opa[2];
- xlu = func_8012C2B4(POLY_XLU_DISP);
+ xlu = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&xlu[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&xlu[1], object_obj_chan_DL_000A10);
POLY_XLU_DISP = &xlu[2];
@@ -401,10 +405,12 @@ void ObjChan_DrawPot(Actor* thisx, PlayState* play) {
Gfx* dl;
OPEN_DISPS(play->state.gfxCtx);
- dl = Gfx_CallSetupDL(POLY_OPA_DISP, 0x19);
+
+ dl = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_25);
gSPMatrix(&dl[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(&dl[1], object_obj_chan_DL_002358);
POLY_OPA_DISP = &dl[2];
+
CLOSE_DISPS(play->state.gfxCtx);
if (this->stateFlags & OBJCHAN_STATE_ON_FIRE) {
@@ -415,6 +421,7 @@ void ObjChan_DrawPot(Actor* thisx, PlayState* play) {
void ObjChan_DrawFire(ObjChan* this, PlayState* play) {
u32 sp4C;
Gfx* dl;
+
OPEN_DISPS(play->state.gfxCtx);
sp4C = play->gameplayFrames;
@@ -425,7 +432,7 @@ void ObjChan_DrawFire(ObjChan* this, PlayState* play) {
sObjChanFlameSize[OBJCHAN_SUBTYPE(&this->actor)].y * this->flameSize, 1.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sObjChanFlameYOffset[OBJCHAN_SUBTYPE(&this->actor)], 0.0f, MTXMODE_APPLY);
- dl = func_8012C2B4(POLY_XLU_DISP);
+ dl = Gfx_SetupDL71(POLY_XLU_DISP);
gSPMatrix(&dl[0], Matrix_NewMtx(play->state.gfxCtx), G_MTX_LOAD);
gSPSegment(&dl[1], 0x08, Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, -sp4C * 20, 32, 128));
gDPSetPrimColor(&dl[2], 128, 128, 255, 255, 0, 255);
diff --git a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h
index f08f18adf..0e6fbca86 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.h
@@ -54,7 +54,7 @@ typedef struct ObjChan {
/* 0x1D8 */ f32 flameSize;
/* 0x1DC */ s16 rotationSpeed; // Main object only. Slowly ramps up under some circumstances. In other circumstances it's immediately set to maximum speed.
/* 0x1DE */ s16 rotation; // Increases as the chandelier spins. Don't know why they didn't use the actor's rotation variable.
- /* 0x1E0 */ s16 cutscenes[2];
+ /* 0x1E0 */ s16 csIdList[2];
} ObjChan; // size = 0x1E4
#endif // Z_OBJ_CHAN_H
diff --git a/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c b/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
index 0c888a4ac..4d2bee782 100644
--- a/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
+++ b/src/overlays/actors/ovl_Obj_Chikuwa/z_obj_chikuwa.c
@@ -49,7 +49,7 @@ void func_809B1550(Actor* thisx, PlayState* play) {
thisx->world.pos.x = (Math_SinS(thisx->shape.rot.y) * sp18) + thisx->home.pos.x;
thisx->world.pos.z = (Math_CosS(thisx->shape.rot.y) * sp18) + thisx->home.pos.z;
} else {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
@@ -174,7 +174,7 @@ void ObjChikuwa_Update(Actor* thisx, PlayState* play) {
func_809B17D0(play, this, &temp->unk_00);
temp_fs0 = Math3D_Vec3fDistSq(&temp->unk_00, &GET_PLAYER(play)->actor.world.pos);
if (temp_fs0 < SQ(240.0f)) {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
if (temp_fs0 < SQ(120.0f)) {
quakeVerticalMag = 4;
} else {
@@ -182,8 +182,8 @@ void ObjChikuwa_Update(Actor* thisx, PlayState* play) {
}
Quake_SetSpeed(quakeIndex, 17232);
- Quake_SetQuakeValues(quakeIndex, quakeVerticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, quakeVerticalMag, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
}
}
}
@@ -199,7 +199,7 @@ void ObjChikuwa_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_2A0 < this->unk_29C) {
for (i = 0; i < this->unk_29C; i++) {
diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
index f37a15a80..1f3f7f902 100644
--- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
+++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c
@@ -475,7 +475,7 @@ void func_8098DEA0(ObjComb* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
this->actor.shape.rot.x += this->unk_1AE;
this->actor.shape.rot.y += this->unk_1B0;
- Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 12.0f, 0.0f, 5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -493,8 +493,8 @@ void func_8098E0B8(ObjComb* this, PlayState* play) {
return;
}
- if ((this->unk_1B4 == 10) && (this->unk_1B6 != 0) && (this->unk_1B5 == 2) && (this->actor.cutscene >= 0)) {
- if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
+ if ((this->unk_1B4 == 10) && (this->unk_1B6 != 0) && (this->unk_1B5 == 2) && (this->actor.csId >= 0)) {
+ if (CutsceneManager_GetCurrentCsId() == this->actor.csId) {
func_800B7298(play, &this->actor, PLAYER_CSMODE_4);
}
}
@@ -518,17 +518,17 @@ void ObjComb_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if (this->actor.update == NULL) {
- if ((this->unk_1B5 == 2) && (func_800F2138(this->actor.cutscene) == -1)) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if ((this->unk_1B5 == 2) && (CutsceneManager_GetCutsceneScriptIndex(this->actor.csId) == -1)) {
+ CutsceneManager_Stop(this->actor.csId);
this->unk_1B5 = 0;
}
} else {
if (this->unk_1B5 != 0) {
Actor_SetFocus(&this->actor, 0.0f);
if (this->unk_1B5 == 1) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
- if (this->actor.cutscene >= 0) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
+ if (this->actor.csId >= 0) {
func_800B7298(play, &this->actor, PLAYER_CSMODE_1);
}
@@ -539,7 +539,7 @@ void ObjComb_Update(Actor* thisx, PlayState* play) {
this->unk_1B5 = 2;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
}
@@ -556,7 +556,7 @@ void ObjComb_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (118.0f * this->actor.scale.y),
this->actor.world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
index 1a9f62ede..9d468d834 100644
--- a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
+++ b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
@@ -54,7 +54,7 @@ void ObjDanpeilift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.x = 0;
this->dyna.actor.shape.rot.z = 0;
this->dyna.actor.world.rot.z = 0;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_obj_danpeilift_Colheader_000BA0);
if (this->dyna.bgId == BG_ACTOR_MAX) {
Actor_Kill(&this->dyna.actor);
@@ -68,7 +68,7 @@ void ObjDanpeilift_Init(Actor* thisx, PlayState* play) {
if (this->speed < 0.01f) {
this->actionFunc = ObjDanpeilift_DoNothing;
} else {
- path = &play->setupPathList[OBJDANPEILIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJDANPEILIFT_GET_PATH_INDEX(thisx)];
this->curPoint = OBJDANPEILIFT_GET_STARTING_POINT(thisx);
this->endPoint = path->count - 1;
this->direction = 1;
@@ -130,7 +130,7 @@ void ObjDanpeilift_Move(ObjDanpeilift* this, PlayState* play) {
if ((this->points[0].x != endPoint->x) || (this->points[0].y != endPoint->y) ||
(this->points[0].z != endPoint->z)) {
this->actionFunc = ObjDanpeilift_Teleport;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
isPosUpdated = false;
}
}
@@ -143,9 +143,9 @@ void ObjDanpeilift_Move(ObjDanpeilift* this, PlayState* play) {
}
void ObjDanpeilift_Teleport(ObjDanpeilift* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
ObjDanpeilift_UpdatePosition(this, this->curPoint);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = ObjDanpeilift_Move;
}
}
@@ -167,23 +167,23 @@ void ObjDanpeilift_Update(Actor* thisx, PlayState* play) {
if (this->cutsceneTimer > 0) {
this->cutsceneTimer--;
if (this->cutsceneTimer == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
- if (OBJDANPEILIFT_SHOULD_REACT_TO_WEIGHT(thisx)) {
+ if (OBJDANPEILIFT_REACT_TO_PLAYER_ON_TOP(thisx)) {
f32 target;
- this->isWeightOnPrev = this->isWeightOn;
- this->isWeightOn = DynaPolyActor_IsInRidingMovingState(&this->dyna) ? 1 : 0;
- if ((this->isWeightOn != this->isWeightOnPrev) && (this->maxHeight < 1.0f)) {
+ this->isPlayerOnTopPrev = this->isPlayerOnTop;
+ this->isPlayerOnTop = DynaPolyActor_IsPlayerOnTop(&this->dyna) ? true : false;
+ if ((this->isPlayerOnTop != this->isPlayerOnTopPrev) && (this->maxHeight < 1.0f)) {
this->cycle = -0x8000;
this->maxHeight = 6.0f;
}
this->cycle += 0xCE4;
Math_StepToF(&this->maxHeight, 0.0f, 0.12f);
- step = this->isWeightOn ? Math_CosS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f
- : Math_SinS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f;
- target = this->isWeightOn ? -8.0f : 0.0f;
+ step = this->isPlayerOnTop ? Math_CosS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f
+ : Math_SinS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f;
+ target = this->isPlayerOnTop ? -8.0f : 0.0f;
Math_StepToF(&this->cycleSpeed, target, step);
this->dyna.actor.shape.yOffset = ((Math_SinS(this->cycle) * this->maxHeight) + this->cycleSpeed) * 10.0f;
}
diff --git a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
index 392d5d4ca..8ad582dd4 100644
--- a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
+++ b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
@@ -10,10 +10,10 @@ typedef void (*ObjDanpeiliftActionFunc)(struct ObjDanpeilift*, PlayState*);
#define OBJDANPEILIFT_GET_TYPE(thisx) (((thisx)->params >> 0xF) & 1)
#define OBJDANPEILIFT_GET_STARTING_POINT(thisx) (((thisx)->params >> 7) & 0x1F)
-#define OBJDANPEILIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJDANPEILIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJDANPEILIFT_SHOULD_TELEPORT(thisx) (((thisx)->params >> 0xC) & 1)
#define OBJDANPEILIFT_GET_SPEED(thisx) ((thisx)->home.rot.z * 0.1f)
-#define OBJDANPEILIFT_SHOULD_REACT_TO_WEIGHT(thisx) (((thisx)->params >> 0xE) & 1)
+#define OBJDANPEILIFT_REACT_TO_PLAYER_ON_TOP(thisx) (((thisx)->params >> 0xE) & 1)
typedef struct ObjDanpeilift {
/* 0x000 */ DynaPolyActor dyna;
@@ -23,8 +23,8 @@ typedef struct ObjDanpeilift {
/* 0x168 */ s32 curPoint;
/* 0x16C */ s32 direction;
/* 0x170 */ Vec3s* points;
- /* 0x174 */ s32 isWeightOn;
- /* 0x178 */ s32 isWeightOnPrev;
+ /* 0x174 */ s32 isPlayerOnTop;
+ /* 0x178 */ s32 isPlayerOnTopPrev;
/* 0x17C */ f32 cycleSpeed;
/* 0x180 */ f32 maxHeight;
/* 0x184 */ s16 cycle;
diff --git a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c
index 8af30b3fd..ee76dd9d4 100644
--- a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c
+++ b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c
@@ -69,37 +69,37 @@ void func_80983678(ObjDemo* this, PlayState* play) {
func_80983634(play);
if ((this->actor.xzDistToPlayer < this->xzRange) && (fabsf(this->actor.playerHeightRel) < this->yRange)) {
if (this->unk_148 == 1) {
- ActorCutscene_Stop(0x7D);
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_80983704;
}
}
void func_80983704(ObjDemo* this, PlayState* play) {
- if ((this->unk_148 == 1) && (ActorCutscene_GetCurrentIndex() == 0x7D)) {
- ActorCutscene_Stop(0x7D);
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ if ((this->unk_148 == 1) && (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR)) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ CutsceneManager_Queue(this->actor.csId);
} else {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
if (this->unk_148 == 1) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_800E0348(play->cameraPtrs[CAM_ID_MAIN]);
} else {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
}
if (play->sceneId == SCENE_CASTLE) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_IKANA_CASTLE | SEQ_FLAG_ASYNC);
}
- this->actor.cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
- if (this->actor.cutscene == -1) {
+ this->actor.csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
+ if (this->actor.csId == CS_ID_NONE) {
if (this->actor.params != 0xFF) {
Flags_SetSwitch(play, this->actor.params);
}
Actor_Kill(&this->actor);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
func_80983634(play);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
index 4a0c5194f..c1b46fce7 100644
--- a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
+++ b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
@@ -167,8 +167,8 @@ void func_80B12A88(Actor* thisx) {
}
}
-void func_80B12B38(ObjDhouse* this2, PlayState* play) {
- ObjDhouse* this = this2;
+void func_80B12B38(ObjDhouse* this, PlayState* play) {
+ Actor* thisx = &this->dyna.actor;
s32 i;
f32 temp_f0;
CollisionPoly* sp90;
@@ -201,7 +201,7 @@ void func_80B12B38(ObjDhouse* this2, PlayState* play) {
phi_s3 = false;
if (ptr->unk_0C.y < 0.0f) {
func_80B12A50(ptr, ptr3, &sp80);
- temp_f0 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp7C, &this->dyna.actor, &sp80);
+ temp_f0 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp7C, thisx, &sp80);
if (((sp80.y - 35.0f) < temp_f0) && (temp_f0 > (BGCHECK_Y_MIN + 1.0f))) {
phi_s3 = true;
}
@@ -441,7 +441,7 @@ void func_80B13940(ObjDhouse* this, PlayState* play2) {
if (sp20) {
func_80B12A88(&this->dyna.actor);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = func_80B13C08;
this->dyna.actor.flags |= ACTOR_FLAG_20;
func_80B139D8(this);
@@ -458,20 +458,20 @@ void func_80B139F4(ObjDhouse* this, PlayState* play) {
s16 quakeIndex;
if (this->unk_1370 == 117) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 8, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 17);
+ Quake_SetPerturbations(quakeIndex, 8, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 17);
} else if (this->unk_1370 == 105) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 7, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 7, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
} else if (this->unk_1370 == 90) {
- quakeIndex = Quake_Add(camera, QUAKE_TYPE_3);
+ quakeIndex = Quake_Request(camera, QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 5, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 62);
+ Quake_SetPerturbations(quakeIndex, 5, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 62);
}
this->unk_1370--;
@@ -505,7 +505,7 @@ void func_80B13C08(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_dhouse_DL_004928);
diff --git a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
index 5a9ef2d05..774632cb4 100644
--- a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
+++ b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
@@ -31,7 +31,8 @@ ActorInit Obj_Dinner_InitVars = {
void ObjDinner_Init(Actor* thisx, PlayState* play) {
ObjDinner* this = THIS;
- if ((gSaveContext.save.isNight != true) || ((CURRENT_DAY == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01))) {
+ if ((gSaveContext.save.isNight != true) ||
+ ((CURRENT_DAY == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM))) {
Actor_Kill(&this->actor);
}
Actor_SetScale(&this->actor, 0.1f);
@@ -45,7 +46,8 @@ void ObjDinner_Update(Actor* thisx, PlayState* play) {
void ObjDinner_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_obj_dinner_DL_0011E0);
diff --git a/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c b/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
index bdff9b3bc..8a11c507b 100644
--- a/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
+++ b/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
@@ -281,14 +281,14 @@ void ObjDora_UpdateCollision(ObjDora* this, PlayState* play) {
this->lastGongHitType = DORA_HIT_STRONG;
}
- func_800BC848(&this->actor, play, 5, 10);
+ Actor_RequestQuakeAndRumble(&this->actor, play, 5, 10);
ObjDora_SetupMoveGong(this);
if ((ObjDora_IsHalfHour(time) == true) && (this->rupeeDropTimer == 0)) {
Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
itemDrop = Item_DropCollectible(play, &this->actor.world.pos, ITEM00_RUPEE_BLUE);
itemDrop->world.rot.y = this->actor.world.rot.y;
- itemDrop->world.rot.y += (s32)(Rand_Centered() * 90.0f * (0x10000 / 360.0f));
+ itemDrop->world.rot.y += (s32)DEG_TO_BINANG_ALT3(Rand_Centered() * 90.0f);
itemDrop->velocity.y = 5.0f;
itemDrop->gravity = -1.0f;
this->rupeeDropTimer = 40;
@@ -321,7 +321,8 @@ void ObjDora_Draw(Actor* thisx, PlayState* play) {
f32 gongForceX;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->actionFunc == ObjDora_MoveGong) {
gongForceX = this->gongForce.x;
diff --git a/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c b/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c
index a93ab99bf..7d729495a 100644
--- a/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c
+++ b/src/overlays/actors/ovl_Obj_Driftice/z_obj_driftice.c
@@ -389,7 +389,7 @@ void func_80A671E0(ObjDriftice* this, PlayState* play) {
if ((this->unk_16C[0].x != points->x) || (this->unk_16C[0].y != points->y) ||
(this->unk_16C[0].z != points->z)) {
func_80A6743C(this);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
sp30 = false;
}
}
@@ -408,7 +408,7 @@ void func_80A6743C(ObjDriftice* this) {
void func_80A67450(ObjDriftice* this, PlayState* play) {
if (this->unk_248 < 0) {
func_80A66570(this, this->unk_164);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
func_80A671CC(this);
}
}
@@ -429,7 +429,7 @@ void func_80A674C4(ObjDriftice* this, PlayState* play) {
void ObjDriftice_Update(Actor* thisx, PlayState* play) {
ObjDriftice* this = THIS;
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if (this->unk_248 < 0) {
this->unk_248 = 1;
} else {
diff --git a/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c b/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
index 723dfcf3e..0bd55b296 100644
--- a/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
+++ b/src/overlays/actors/ovl_Obj_Entotu/z_obj_entotu.c
@@ -104,7 +104,7 @@ void func_80A34A44(ObjEntotu* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f53_obj_DL_000158);
@@ -136,7 +136,7 @@ void func_80A34B28(ObjEntotu* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x20, 1, 0, sp56, 0x20, 0x20));
diff --git a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
index 69829d09e..c7fbab2d6 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
@@ -154,7 +154,7 @@ void ObjEtcetera_Idle(ObjEtcetera* this, PlayState* play) {
this->oscillationTimer = minOscillationTimer;
}
} else {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if (!(this->burrowFlag & 1)) {
// Player is walking onto the Deku Flower, or falling on it from a height
this->oscillationTimer = 10;
@@ -187,7 +187,7 @@ void ObjEtcetera_Idle(ObjEtcetera* this, PlayState* play) {
}
void ObjEtcetera_PlayRustleAnimation(ObjEtcetera* this, PlayState* play) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->burrowFlag |= 1;
} else {
this->burrowFlag &= ~1;
@@ -209,11 +209,11 @@ void ObjEtcetera_PlayRustleAnimation(ObjEtcetera* this, PlayState* play) {
void ObjEtcetera_DoBounceOscillation(ObjEtcetera* this, PlayState* play) {
// In order to match, we are seemingly required to access scale.x at one point
// without using this. We can create a thisx or dyna pointer to achieve that, but
- // it's more likely they used dyna given that DynaPolyActor_IsInRidingMovingState takes a DynaPolyActor.
+ // it's more likely they used dyna given that DynaPolyActor_IsPlayerOnTop takes a DynaPolyActor.
DynaPolyActor* dyna = &this->dyna;
f32 scaleTemp;
- if (DynaPolyActor_IsInRidingMovingState(dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(dyna)) {
this->burrowFlag |= 1;
} else {
this->burrowFlag &= ~1;
@@ -260,7 +260,7 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->objIndex)) {
this->dyna.actor.objBankIndex = this->objIndex;
Actor_SetObjectDependency(play, &this->dyna.actor);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
thisCollisionHeader = collisionHeaders[type];
if (thisCollisionHeader != NULL) {
CollisionHeader_GetVirtual(thisCollisionHeader, &colHeader);
@@ -284,6 +284,9 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
this->jointTable, this->morphTable, GOLD_DEKU_FLOWER_LIMB_MAX);
this->collider.dim.height = 20;
break;
+
+ default:
+ break;
}
type = DEKU_FLOWER_TYPE(&this->dyna.actor);
@@ -310,6 +313,9 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
this->dyna.actor.focus.pos.y = this->dyna.actor.home.pos.y + 10.0f;
this->dyna.actor.targetMode = 3;
break;
+
+ default:
+ break;
}
}
}
@@ -321,7 +327,7 @@ void ObjEtcetera_Update(Actor* thisx, PlayState* play) {
if (floorBgId == BGCHECK_SCENE) {
floorPoly = this->dyna.actor.floorPoly;
- if (floorPoly != NULL && this->burrowFlag & 1) {
+ if ((floorPoly != NULL) && (this->burrowFlag & 1)) {
func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, floorBgId));
}
}
@@ -341,7 +347,7 @@ void ObjEtcetera_DrawIdle(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->dList);
CLOSE_DISPS(play->state.gfxCtx);
@@ -355,6 +361,6 @@ void ObjEtcetera_DrawIdle(Actor* thisx, PlayState* play) {
void ObjEtcetera_DrawAnimated(Actor* thisx, PlayState* play) {
ObjEtcetera* this = THIS;
- func_8012C5B0(play->state.gfxCtx);
+ Gfx_SetupDL37_Opa(play->state.gfxCtx);
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->dyna.actor);
}
diff --git a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
index 1805e151a..454e3f674 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
@@ -12,7 +12,7 @@ typedef enum {
/* 1 */ DEKU_FLOWER_TYPE_PINK_WITH_INITIAL_BOUNCE,
/* 2 */ DEKU_FLOWER_TYPE_GOLD,
/* 3 */ DEKU_FLOWER_TYPE_GOLD_WITH_INITIAL_BOUNCE,
- /* 4 */ DEKU_FLOWER_TYPE_MAX,
+ /* 4 */ DEKU_FLOWER_TYPE_MAX
} DekuFlowerType;
struct ObjEtcetera;
diff --git a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
index a4c4e21d2..e672780de 100644
--- a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
+++ b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
@@ -55,8 +55,8 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- /* 0x00 */ f32 unk_00;
- /* 0x04 */ f32 unk_04;
+ /* 0x0 */ f32 unk_00;
+ /* 0x4 */ f32 unk_04;
} ObjFireshieldStruct; // size = 0x8
ObjFireshieldStruct D_80A4D84C[] = {
@@ -77,7 +77,7 @@ static InitChainEntry sInitChain[] = {
};
void func_80A4CA90(ObjFireshield* this) {
- if (this->actor.cutscene >= 0) {
+ if (this->actor.csId >= 0) {
this->actionFunc = func_80A4CABC;
} else {
this->actionFunc = func_80A4CC54;
@@ -87,17 +87,17 @@ void func_80A4CA90(ObjFireshield* this) {
void func_80A4CABC(ObjFireshield* this) {
s32 pad;
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
s32 sp18 = OBJFIRESHIELD_GET_7F(&this->actor);
s32 temp_a0 = (sp18 & ~0x1F) >> 5;
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
this->actionFunc = func_80A4CB7C;
this->unk_194 = 20;
D_80A4D884[temp_a0] |= 1 << (sp18 & 0x1F);
D_80A4D894[temp_a0] |= 1 << (sp18 & 0x1F);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -113,7 +113,7 @@ void func_80A4CB7C(ObjFireshield* this) {
return;
}
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
this->actionFunc = func_80A4CD28;
D_80A4D894[(sp18 & ~0x1F) >> 5] &= ~(1 << (sp18 & 0x1F));
}
@@ -315,8 +315,8 @@ void ObjFireshield_Destroy(Actor* thisx, PlayState* play) {
}
void ObjFireshield_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
ObjFireshield* this = THIS;
- ObjFireshield* this2 = THIS;
s32 sp44 = OBJFIRESHIELD_GET_ROTX(&this->actor);
s32 sp40 = OBJFIRESHIELD_GET_7F(&this->actor);
s32 temp_a0;
@@ -342,12 +342,12 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.base.atFlags &= ~AT_HIT;
} else if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- func_800B8D98(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 1.0f);
+ func_800B8D98(play, thisx, 5.0f, thisx->yawTowardsPlayer, 1.0f);
}
func_80A4CE28(this, play);
- this->actor.world.pos.y = ((sp44 ? 144.0f : -144.0f) * (1.0f - this2->unk_198)) + this->actor.home.pos.y;
+ thisx->world.pos.y = ((sp44 ? 144.0f : -144.0f) * (1.0f - this->unk_198)) + thisx->home.pos.y;
this->unk_1A6 = this->unk_198 * 255.0f;
@@ -357,13 +357,12 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.dim.height = this->unk_198 * 80.0f;
if (sp44) {
- this->collider.dim.yShift =
- (s32)(this->actor.home.pos.y - this->actor.world.pos.y) - this->collider.dim.height;
+ this->collider.dim.yShift = (s32)(thisx->home.pos.y - thisx->world.pos.y) - this->collider.dim.height;
} else {
- this->collider.dim.yShift = this->actor.home.pos.y - this->actor.world.pos.y;
+ this->collider.dim.yShift = thisx->home.pos.y - thisx->world.pos.y;
}
- func_800B9010(&this->actor, NA_SE_EV_BURNING - SFX_FLAG);
+ func_800B9010(thisx, NA_SE_EV_BURNING - SFX_FLAG);
if (player->transformation == PLAYER_FORM_GORON) {
this->collider.info.toucher.damage = 0;
@@ -373,7 +372,7 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.info.toucher.effect = 1;
}
- Collider_UpdateCylinder(&this->actor, &this->collider);
+ Collider_UpdateCylinder(thisx, &this->collider);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -384,7 +383,7 @@ void ObjFireshield_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 220, 0, this->unk_1A6);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
diff --git a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
index a5c66629a..aca30fe92 100644
--- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
+++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
@@ -22,7 +22,7 @@ void func_80A1C838(ObjFlowerpot* this, PlayState* play);
void func_80A1CBF8(ObjFlowerpot* this);
void func_80A1CC0C(ObjFlowerpot* this, PlayState* play);
void func_80A1CD10(ObjFlowerpot* this);
-void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play);
+void func_80A1CEF4(ObjFlowerpot* this, PlayState* play);
u32 D_80A1D830;
MtxF D_80A1D838[8];
@@ -384,7 +384,8 @@ void func_80A1C554(ObjFlowerpot* this) {
}
void func_80A1C5E8(ObjFlowerpot* this, PlayState* play) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
}
void func_80A1C62C(ObjFlowerpot* this, PlayState* play) {
@@ -588,8 +589,8 @@ void func_80A1CD10(ObjFlowerpot* this) {
}
}
-void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
- ObjFlowerpot* this = this2;
+void func_80A1CEF4(ObjFlowerpot* this, PlayState* play) {
+ Actor* thisx = &this->actor;
s32 sp28 = this->collider.elements[0].info.toucherFlags & TOUCH_HIT;
if (sp28) {
@@ -602,7 +603,7 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
func_80A1C62C(this, play);
- if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || sp28 ||
+ if ((thisx->bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || sp28 ||
(this->unk_1E8 <= 0)) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
@@ -612,11 +613,11 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
}
func_80A1BA44(this, play);
func_80A1B994(this, play);
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
return;
}
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ if (thisx->bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
func_80A1C328(this, play);
@@ -625,22 +626,22 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
}
func_80A1BD80(this, play);
func_80A1B994(this, play);
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
- Actor_Kill(&this->actor);
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
+ Actor_Kill(thisx);
return;
}
- Actor_MoveWithGravity(&this->actor);
+ Actor_MoveWithGravity(thisx);
if (!(this->unk_1EA & 2)) {
- D_80A1D3F8 += (s16)(this->actor.shape.rot.x * -0.06f);
+ D_80A1D3F8 += (s16)(thisx->shape.rot.x * -0.06f);
} else {
Math_StepToS(&D_80A1D3F8, 0, 80);
Math_StepToS(&D_80A1D3FC, 0, 20);
}
- this->actor.shape.rot.x += D_80A1D3F8;
- this->actor.shape.rot.y += D_80A1D3FC;
+ thisx->shape.rot.x += D_80A1D3F8;
+ thisx->shape.rot.y += D_80A1D3FC;
func_80A1C5E8(this, play);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -667,7 +668,7 @@ void ObjFlowerpot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_flowerpot_DL_0012E0);
diff --git a/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c b/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
index c3d4d1398..409cbd837 100644
--- a/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
+++ b/src/overlays/actors/ovl_Obj_Funen/z_obj_funen.c
@@ -34,7 +34,7 @@ void ObjFunen_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_RotateYS((s16)(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - 0x8000), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
diff --git a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
index e7ddf5038..85e628359 100644
--- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
+++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c
@@ -61,10 +61,10 @@ void func_80B3C2B0(ObjGhaka* this) {
void func_80B3C2C4(ObjGhaka* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_20_20)) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_BG_GORON_OYU, 0.0f, 25.0f, 261.0f, 0, 0, 0, 0,
- this->dyna.actor.cutscene, this->dyna.actor.halfDaysBits, 0);
+ this->dyna.actor.csId, this->dyna.actor.halfDaysBits, 0);
} else {
- Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_BG_GORON_OYU, 0.0f, 25.0f, 261.0f, 0, 0, 0, 1, -1,
- this->dyna.actor.halfDaysBits, 0);
+ Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_BG_GORON_OYU, 0.0f, 25.0f, 261.0f, 0, 0, 0, 1,
+ CS_ID_NONE, this->dyna.actor.halfDaysBits, 0);
}
}
@@ -154,10 +154,10 @@ void ObjGhaka_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, D_80B3C96C);
Actor_SetScale(&this->dyna.actor, 0.1f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_ghaka_Colheader_003CD0, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 0x4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.floorPoly == 0) {
Actor_Kill(&this->dyna.actor);
}
@@ -184,11 +184,13 @@ void ObjGhaka_Update(Actor* thisx, PlayState* play) {
void ObjGhaka_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_ghaka_DL_001A20);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, object_ghaka_DL_001980);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
index b1924c63b..a17f853df 100644
--- a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
+++ b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
@@ -4,6 +4,7 @@
* Description: "Master" instance of grass for unit spawned by Obj_Grass_Unit
*/
+#include "prevent_bss_reordering.h"
#include "z_obj_grass.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -439,7 +440,7 @@ void func_809AA54C(Actor* thisx, PlayState* play2) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, gObjGrass_D_809AA9F0);
@@ -484,7 +485,7 @@ void func_809AA798(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, gObjGrass_D_809AAA68);
diff --git a/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c b/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
index e649664f3..795d740f1 100644
--- a/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
+++ b/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
@@ -103,7 +103,9 @@ void func_809AAF18(ObjGrassCarry* this) {
}
void func_809AAF58(ObjGrassCarry* this, PlayState* play) {
- Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 7.5f, 35.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
}
void func_809AAF9C(Vec3f* arg0, s16 arg1, PlayState* play) {
@@ -206,31 +208,31 @@ void func_809AB474(ObjGrassCarry* this) {
}
void func_809AB4A8(ObjGrassCarry* this, PlayState* play) {
- ObjGrassCarry* this2 = this;
+ Actor* thisx = &this->actor;
- if (Actor_HasParent(&this->actor, play)) {
+ if (Actor_HasParent(thisx, play)) {
func_809AB5FC(this);
if (this->unk_194 != NULL) {
this->unk_194->unk_0F |= 4;
}
- this->actor.draw = func_809ABB7C;
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.shape.shadowAlpha = 60;
- this->actor.shape.shadowScale = 1.0f;
+ thisx->draw = func_809ABB7C;
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ thisx->shape.shadowAlpha = 60;
+ thisx->shape.shadowScale = 1.0f;
this->unk_190->unk_3292 ^= 1;
- this->actor.room = -1;
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
+ thisx->room = -1;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
} else if (this->unk_190->unk_3294 != NULL) {
Player* player = GET_PLAYER(play);
this->unk_194 = this->unk_190->unk_3294;
- Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_194->unk_00);
- this->actor.shape.rot.y = this->actor.world.rot.y = this->unk_194->unk_0C;
- this->unk_198 = this2->unk_194->unk_0E;
- this->actor.xzDistToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
- this->actor.playerHeightRel = Actor_HeightDiff(&this->actor, &player->actor);
- this->actor.xyzDistToPlayerSq = SQ(this->actor.xzDistToPlayer) + SQ(this->actor.playerHeightRel);
- this->actor.yawTowardsPlayer = Actor_WorldYawTowardActor(&this->actor, &player->actor);
+ Math_Vec3f_Copy(&thisx->world.pos, &this->unk_194->unk_00);
+ thisx->shape.rot.y = thisx->world.rot.y = this->unk_194->unk_0C;
+ this->unk_198 = this->unk_194->unk_0E;
+ thisx->xzDistToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
+ thisx->playerHeightRel = Actor_HeightDiff(&this->actor, &player->actor);
+ thisx->xyzDistToPlayerSq = SQ(thisx->xzDistToPlayer) + SQ(thisx->playerHeightRel);
+ thisx->yawTowardsPlayer = Actor_WorldYawTowardActor(&this->actor, &player->actor);
Actor_OfferCarry(&this->actor, play);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
index dcd1dad4e..40db98b1f 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.c
@@ -106,14 +106,14 @@ void ObjHakaisi_Init(Actor* thisx, PlayState* play) {
return;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_hakaisi_Colheader_002FC4, &sp7C);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, sp7C);
this->unk_19A = 0;
this->unk_198 = 0;
this->switchFlag = OBJHAKAISI_GET_SWITCHFLAG(thisx);
- this->unk_196 = this->dyna.actor.cutscene;
+ this->csId = this->dyna.actor.csId;
if (this->switchFlag == 0xFF) {
this->switchFlag = -1;
@@ -123,7 +123,7 @@ void ObjHakaisi_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->dyna.actor);
}
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->dyna.actor.floorPoly == NULL) {
Actor_Kill(&this->dyna.actor);
@@ -192,16 +192,16 @@ void func_80B14558(ObjHakaisi* this) {
}
void func_80B1456C(ObjHakaisi* this, PlayState* play) {
- if (this->unk_196 != -1) {
- if (ActorCutscene_GetCanPlayNext(this->unk_196)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_196, &this->dyna.actor);
+ if (this->csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->dyna.actor);
} else {
- ActorCutscene_SetIntentToPlay(this->unk_196);
+ CutsceneManager_Queue(this->csId);
}
}
if (this->dyna.actor.colChkInfo.health < 30) {
func_80B145F4(this);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
@@ -258,8 +258,8 @@ void func_80B149A8(ObjHakaisi* this) {
void func_80B149C0(ObjHakaisi* this, PlayState* play) {
if (this->unk_19A < 60) {
this->unk_19A++;
- } else if ((this->unk_196 != -1) && !ActorCutscene_GetCanPlayNext(this->unk_196)) {
- ActorCutscene_Stop(this->unk_196);
+ } else if ((this->csId != CS_ID_NONE) && !CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Stop(this->csId);
}
}
@@ -349,7 +349,7 @@ void ObjHakaisi_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->unk_194 == 0) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -423,13 +423,13 @@ void func_80B1544C(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
void func_80B154A0(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (OBJHAKAISI_GET_FF(thisx) == 4) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
index ed5341a82..1454181dd 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
@@ -17,7 +17,7 @@ typedef struct ObjHakaisi {
/* 0x184 */ Vec3f unk_184;
/* 0x190 */ s32 switchFlag;
/* 0x194 */ s16 unk_194;
- /* 0x196 */ s16 unk_196;
+ /* 0x196 */ s16 csId;
/* 0x198 */ s16 unk_198;
/* 0x19A */ s16 unk_19A;
/* 0x19C */ s16 unk_19C;
diff --git a/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
index 752b669cf..f9d1f0252 100644
--- a/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
+++ b/src/overlays/actors/ovl_Obj_Hamishi/z_obj_hamishi.c
@@ -165,7 +165,7 @@ void ObjHamishi_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
this->actor.uncullZoneForward += 1000.0f;
}
@@ -267,7 +267,7 @@ void ObjHamishi_Draw(Actor* thisx, PlayState* play) {
if ((thisx->projectedPos.z <= 2150.0f) || ((this->unk_1A2 & 1) && (thisx->projectedPos.z < 2250.0f))) {
thisx->shape.shadowAlpha = 160;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -277,7 +277,7 @@ void ObjHamishi_Draw(Actor* thisx, PlayState* play) {
f32 sp20 = (2250.0f - thisx->projectedPos.z) * 2.55f;
thisx->shape.shadowAlpha = sp20 * 0.627451f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c b/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
index 1c33af7fe..b390644c7 100644
--- a/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
+++ b/src/overlays/actors/ovl_Obj_Hariko/z_obj_hariko.c
@@ -74,7 +74,7 @@ void ObjHariko_BobHead(ObjHariko* this, PlayState* play) {
}
void ObjHariko_CheckForQuakes(ObjHariko* this) {
- if (Quake_NumActiveQuakes() != 0) {
+ if (Quake_GetNumActiveQuakes() != 0) {
ObjHariko_SetupBobHead(this);
}
}
@@ -90,7 +90,8 @@ void ObjHariko_Draw(Actor* thisx, PlayState* play) {
ObjHariko* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Push();
Matrix_RotateXS(this->headRotation.x, MTXMODE_APPLY);
@@ -101,5 +102,6 @@ void ObjHariko_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, gHarikoFaceDL);
Matrix_Pop();
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
index fa39be7df..d69c8d0fd 100644
--- a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
+++ b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.c
@@ -70,7 +70,7 @@ void ObjHgdoor_Init(Actor* thisx, PlayState* play) {
CollisionHeader* header = NULL;
Actor_SetScale(&this->dyna.actor, 0.1f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if (OBJHGDOOR_IS_RIGHT_DOOR(&this->dyna.actor)) {
CollisionHeader_GetVirtual(&object_hgdoor_Colheader_001D10, &header);
} else {
@@ -79,7 +79,7 @@ void ObjHgdoor_Init(Actor* thisx, PlayState* play) {
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, header);
this->rotation = 0;
this->timer = 0;
- this->cutscene = this->dyna.actor.cutscene;
+ this->csId = this->dyna.actor.csId;
ObjHgdoor_SetupIdle(this);
}
@@ -94,7 +94,7 @@ void ObjHgdoor_SetupIdle(ObjHgdoor* this) {
}
void ObjHgdoor_Idle(ObjHgdoor* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20) &&
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) &&
(this->dyna.actor.xzDistToPlayer < 100.0f) && (this->dyna.actor.playerHeightRel < 40.0f) &&
OBJHGDOOR_IS_RIGHT_DOOR(&this->dyna.actor)) {
ObjHgdoor_SetChild(this, play);
@@ -108,31 +108,31 @@ void ObjHgdoor_SetupCutscene(ObjHgdoor* this) {
}
void ObjHgdoor_PlayCutscene(ObjHgdoor* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Start(this->cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Start(this->csId, &this->dyna.actor);
ObjHgdoor_SetupCsAction(this);
ObjHgdoor_SetupCsAction((ObjHgdoor*)this->dyna.actor.child);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->cutscene);
+ CutsceneManager_Queue(this->csId);
}
}
void ObjHgdoor_SetupCsAction(ObjHgdoor* this) {
- this->csAction = 0x63;
+ this->cueId = 99;
this->actionFunc = ObjHgdoor_HandleCsAction;
}
void ObjHgdoor_HandleCsAction(ObjHgdoor* this, PlayState* play) {
- s32 actionIndex;
+ s32 cueChannel;
- if (Cutscene_CheckActorAction(play, 483)) {
- actionIndex = Cutscene_GetActorActionIndex(play, 483);
- if (this->csAction != play->csCtx.actorActions[actionIndex]->action) {
- this->csAction = play->csCtx.actorActions[actionIndex]->action;
- switch (play->csCtx.actorActions[actionIndex]->action) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_483)) {
+ cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_483);
+ if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
+ this->cueId = play->csCtx.actorCues[cueChannel]->id;
+ switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_WOOD_DOOR_OPEN_SPEEDY);
if ((this->dyna.actor.parent != NULL) && (this->dyna.actor.parent->id == ACTOR_EN_HG)) {
@@ -149,7 +149,7 @@ void ObjHgdoor_HandleCsAction(ObjHgdoor* this, PlayState* play) {
ObjHgdoor_SetupStopCs(this);
}
} else {
- this->csAction = 0x63;
+ this->cueId = 99;
}
}
@@ -160,8 +160,8 @@ void ObjHgdoor_SetupStopCs(ObjHgdoor* this) {
void ObjHgdoor_StopCs(ObjHgdoor* this, PlayState* play) {
if (this->timer++ > 80) {
- if (!ActorCutscene_GetCanPlayNext(this->cutscene)) {
- ActorCutscene_Stop(this->cutscene);
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Stop(this->csId);
}
}
}
@@ -199,7 +199,8 @@ void ObjHgdoor_Update(Actor* thisx, PlayState* play) {
void ObjHgdoor_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (OBJHGDOOR_IS_RIGHT_DOOR(thisx)) {
diff --git a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.h b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.h
index 7172952bb..1411a5e66 100644
--- a/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.h
+++ b/src/overlays/actors/ovl_Obj_Hgdoor/z_obj_hgdoor.h
@@ -13,10 +13,10 @@ typedef void (*ObjHgdoorActionFunc)(struct ObjHgdoor*, PlayState*);
typedef struct ObjHgdoor {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjHgdoorActionFunc actionFunc;
- /* 0x160 */ s16 cutscene;
+ /* 0x160 */ s16 csId;
/* 0x162 */ s16 rotation;
/* 0x164 */ s16 timer;
- /* 0x166 */ u16 csAction;
+ /* 0x166 */ u16 cueId;
} ObjHgdoor; // size = 0x168
#endif // Z_OBJ_HGDOOR_H
diff --git a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
index ae047f029..ffc3558e6 100644
--- a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
+++ b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
@@ -45,7 +45,7 @@ void ObjHsStump_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->isHidden = OBJHSSTUMP_GET_ISHIDDEN(thisx);
this->switchFlag = OBJHSSTUMP_GET_SWITCHFLAG(thisx);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_hsstump_Colheader_0011B0);
switch (this->isHidden) {
case true:
@@ -54,10 +54,15 @@ void ObjHsStump_Init(Actor* thisx, PlayState* play) {
} else {
this->dyna.actor.draw = NULL;
Actor_SetScale(&this->dyna.actor, 0.0f);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
+ // fallthrough
case false:
ObjHsStump_SetupIdle(this, play);
+ break;
+
+ default:
+ break;
}
}
@@ -89,14 +94,14 @@ void ObjHsStump_Appear(ObjHsStump* this, PlayState* play) {
}
if (this->framesAppeared <= 10) {
if (this->framesAppeared == 0) {
+ s32 pad;
s32 i;
- f32 angleDeg;
s16 numDirections = 4;
Vec3f iceSmokePosOffset;
Vec3f iceSmokeVelOffset;
- s16 offsetAngle;
+ s16 iceSmokeAngle;
Vec3f iceSmokeVel;
- f32 angleBrad;
+ f32 baseAngle;
Vec3f iceSmokePos;
iceSmokePosOffset.x = 1.0f;
@@ -107,14 +112,13 @@ void ObjHsStump_Appear(ObjHsStump* this, PlayState* play) {
iceSmokeVelOffset.y = 0.5f;
iceSmokeVelOffset.z = 0.0f;
- angleDeg = (360.0f / numDirections);
- angleBrad = (s32)(angleDeg * (0x10000 / 360.0f));
+ baseAngle = (s32)DEG_TO_BINANG_ALT3(360.0f / numDirections);
for (i = 0; i < numDirections; i++) {
- offsetAngle = i * angleBrad;
- Lib_Vec3f_TranslateAndRotateY(&this->dyna.actor.world.pos, offsetAngle, &iceSmokePosOffset,
+ iceSmokeAngle = i * baseAngle;
+ Lib_Vec3f_TranslateAndRotateY(&this->dyna.actor.world.pos, iceSmokeAngle, &iceSmokePosOffset,
&iceSmokePos);
- Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, offsetAngle, &iceSmokeVelOffset, &iceSmokeVel);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, iceSmokeAngle, &iceSmokeVelOffset, &iceSmokeVel);
EffectSsIceSmoke_Spawn(play, &iceSmokePos, &iceSmokeVel, &sIceSmokeAccel, 100);
}
}
@@ -123,9 +127,9 @@ void ObjHsStump_Appear(ObjHsStump* this, PlayState* play) {
Math_SmoothStepToF(&this->dyna.actor.scale.x, 18.0f * 0.01f, 1.0f, 0.01f, 0.001f);
Actor_SetScale(&this->dyna.actor, this->dyna.actor.scale.x);
}
- if (this->dyna.actor.scale.x == 18.0f * 0.01f) {
+ if (this->dyna.actor.scale.x == (18.0f * 0.01f)) {
this->isHidden = false;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
ObjHsStump_SetupIdle(this, play);
}
this->framesAppeared++;
diff --git a/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c b/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
index 26d89f00d..40e8b9323 100644
--- a/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
+++ b/src/overlays/actors/ovl_Obj_Hsblock/z_obj_hsblock.c
@@ -145,7 +145,7 @@ void ObjHsblock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetEnvColor(POLY_OPA_DISP++, envColor->r, envColor->g, envColor->b, 255);
gSPDisplayList(POLY_OPA_DISP++, sDisplayLists[OBJHSBLOCK_GET_3(thisx)]);
diff --git a/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c b/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
index cade13522..b04dff8a0 100644
--- a/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
+++ b/src/overlays/actors/ovl_Obj_Hugebombiwa/z_obj_hugebombiwa.c
@@ -293,13 +293,13 @@ void func_80A54600(PlayState* play, Vec3f* arg1, f32 arg2, f32 arg3) {
}
}
-void ObjHugebombiwa_AddQuake(ObjHugebombiwa* this, PlayState* play, s32 quakeVerticalMag) {
+void ObjHugebombiwa_RequestQuakeAndRumble(ObjHugebombiwa* this, PlayState* play, s32 quakeVerticalMag) {
s32 pad[2];
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, quakeVerticalMag, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, quakeVerticalMag, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->actor.xyzDistToPlayerSq, 255, 20, 150);
}
@@ -380,7 +380,7 @@ void func_80A54C04(ObjHugebombiwa* this, PlayState* play) {
}
if (func_80A54A0C(this)) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
func_80A54CD8(this);
return;
}
@@ -407,8 +407,8 @@ void func_80A54CD8(ObjHugebombiwa* this) {
void func_80A54CEC(ObjHugebombiwa* this, PlayState* play) {
s32 pad;
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
Flags_SetSwitch(play, ENHUGEBOMBIWA_GET_7F(&this->actor));
if (!(ENHUGEBOMBIWA_GET_100(&this->actor)) &&
((play->sceneId == SCENE_17SETUGEN) || (play->sceneId == SCENE_17SETUGEN2))) {
@@ -429,7 +429,7 @@ void func_80A54CEC(ObjHugebombiwa* this, PlayState* play) {
func_80A55310(this);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -516,14 +516,14 @@ void func_80A55064(ObjHugebombiwa* this, PlayState* play) {
ptr->unk_24 = 1;
func_80A53E60(play, &ptr->unk_0C, ptr->unk_18, ptr->unk_00.y * 9.8f);
if ((play->gameplayFrames % 4) == 0) {
- ObjHugebombiwa_AddQuake(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
+ ObjHugebombiwa_RequestQuakeAndRumble(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
}
}
}
this->unk_4B2--;
if ((this->unk_4B0 >= 20) || (this->unk_4B2 <= 0)) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
Actor_Kill(&this->actor);
}
}
@@ -612,14 +612,14 @@ void func_80A55564(ObjHugebombiwa* this, PlayState* play) {
ptr->unk_24 = 1;
func_80A54600(play, &ptr->unk_0C, ptr->unk_18, ptr->unk_00.y * 10.1f);
if ((play->gameplayFrames % 4) == 0) {
- ObjHugebombiwa_AddQuake(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
+ ObjHugebombiwa_RequestQuakeAndRumble(this, play, (s32)(Rand_ZeroOne() * 5.5f) + 1);
}
}
}
this->unk_4B2--;
if ((this->unk_4B0 >= 20) || (this->unk_4B2 <= 0)) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
Actor_Kill(&this->actor);
}
}
@@ -639,21 +639,21 @@ void ObjHugebombiwa_Draw(Actor* thisx, PlayState* play) {
if ((this->actionFunc == func_80A54C04) || (this->actionFunc == func_80A54CEC)) {
if (this->actor.projectedPos.z <= 4300.0f) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0xFF, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_bombiwa_DL_002F60);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, object_bombiwa_DL_003110);
} else if (this->actor.projectedPos.z < 4500.0f) {
sp38 = (4500.0f - this->actor.projectedPos.z) * 1.275f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -665,7 +665,7 @@ void ObjHugebombiwa_Draw(Actor* thisx, PlayState* play) {
EnHugebombiwaStruct* ptr;
Gfx* gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
@@ -697,9 +697,10 @@ void func_80A55B34(Actor* thisx, PlayState* play) {
}
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->unk_190); i++) {
ptr = &this->unk_190[i];
diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
index a861e9e63..7559c4db7 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
@@ -29,16 +29,16 @@ AnimatedMaterial* D_80B9DED0;
AnimatedMaterial* D_80B9DED4;
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
- /* 0x02 */ u8 unk_02;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
+ /* 0x2 */ u8 unk_02;
} ObjHansuiBssStruct; // size = 0x3
ObjHansuiBssStruct D_80B9DED8;
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
} ObjHansuiStruct; // size = 0x2
ObjHansuiStruct D_80B9DC70[] = {
@@ -120,7 +120,7 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
if ((this->dyna.actor.xzDistToPlayer < (45.0f * this->dyna.actor.scale.x * 10.0f)) &&
(this->dyna.actor.playerHeightRel < -21.0f)) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->unk_172 &= ~8;
this->unk_19C = 0.0f;
this->unk_1A0 = 0.0f;
@@ -130,8 +130,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
this->unk_18C = 0;
Math_Vec3f_Copy(&sp40, &player->actor.world.pos);
- sp40.x += randPlusMinusPoint5Scaled(10.0f);
- sp40.z += randPlusMinusPoint5Scaled(10.0f);
+ sp40.x += Rand_CenteredFloat(10.0f);
+ sp40.z += Rand_CenteredFloat(10.0f);
sp40.y += Rand_ZeroFloat(2.0f);
EffectSsGSplash_Spawn(play, &sp40, NULL, NULL, 2.0f * Rand_ZeroOne(), 1);
@@ -144,8 +144,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
Math_Vec3f_Copy(&sp40, &player->actor.world.pos);
this->unk_18C = 0;
- sp40.x += randPlusMinusPoint5Scaled(10.0f);
- sp40.z += randPlusMinusPoint5Scaled(10.0f);
+ sp40.x += Rand_CenteredFloat(10.0f);
+ sp40.z += Rand_CenteredFloat(10.0f);
sp40.y += Rand_ZeroFloat(45.0f);
EffectSsGSplash_Spawn(play, &sp40, NULL, NULL, 1, 1);
@@ -184,8 +184,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
Math_ApproachF(&this->unk_1A0, 3.0f, 1.0f, 1.0f);
Math_ApproachF(&this->unk_19C, this->unk_1A0, 1.0f, 0.1f);
}
- player->unk_B84 = this->unk_1A4;
- player->unk_B80 = this->unk_19C;
+ player->pushedYaw = this->unk_1A4;
+ player->pushedSpeed = this->unk_19C;
}
} else {
if (this->unk_172 & 8) {
@@ -205,7 +205,7 @@ void ObjHunsui_Init(Actor* thisx, PlayState* play) {
this->unk_160 = OBJHUNSUI_GET_F000(thisx);
this->unk_164 = OBJHUNSUI_GET_F80(thisx);
this->unk_168 = OBJHUNSUI_GET_7F(thisx);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if ((this->unk_160 != OBJHUNSUI_F000_5) && (this->unk_160 != OBJHUNSUI_F000_6)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_hunsui_Colheader_000C74);
@@ -213,7 +213,7 @@ void ObjHunsui_Init(Actor* thisx, PlayState* play) {
D_80B9DED0 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_000BF0);
D_80B9DED4 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_001888);
- SubS_FillCutscenesList(&this->dyna.actor, this->unk_170, ARRAY_COUNT(this->unk_170));
+ SubS_FillCutscenesList(&this->dyna.actor, this->csIdList, ARRAY_COUNT(this->csIdList));
this->unk_18C = 0;
switch (this->unk_160) {
@@ -327,7 +327,7 @@ void ObjHunsui_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((this->unk_172 & 0x40) &&
- SubS_StartActorCutscene(&this->dyna.actor, this->unk_17C, -1, SUBS_CUTSCENE_SET_UNK_LINK_FIELDS)) {
+ SubS_StartCutscene(&this->dyna.actor, this->csId, CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
this->unk_172 &= ~0x40;
}
@@ -355,7 +355,7 @@ void func_80B9CE64(ObjHunsui* this, PlayState* play) {
if (!(this->unk_172 & 1)) {
if (sp2C != this->unk_180) {
- this->unk_17C = this->unk_170[0];
+ this->csId = this->csIdList[0];
this->unk_172 |= 0x40;
}
}
@@ -447,7 +447,7 @@ void func_80B9D120(ObjHunsui* this, PlayState* play) {
}
if (func_80B9C450(play, this->unk_168, this->unk_164)) {
- this->unk_17C = this->unk_170[0];
+ this->csId = this->csIdList[0];
this->unk_172 |= 0x40;
func_80B9D4D0(this, play);
}
@@ -560,7 +560,7 @@ void func_80B9D508(ObjHunsui* this, PlayState* play) {
}
if (!(this->unk_172 & 1) && !func_80B9C450(play, this->unk_168, this->unk_164)) {
- this->unk_17C = this->unk_170[0];
+ this->csId = this->csIdList[0];
this->unk_172 |= 0x40;
func_80B9D0FC(this, play);
}
@@ -569,7 +569,7 @@ void func_80B9D508(ObjHunsui* this, PlayState* play) {
void func_80B9D714(ObjHunsui* this, PlayState* play) {
s32 pad;
Player* player = GET_PLAYER(play);
- s16 cs;
+ s16 csId;
f32 sp28;
if ((this->unk_16C != play->roomCtx.curRoom.num) && (this->unk_16C != play->roomCtx.prevRoom.num) &&
@@ -579,19 +579,19 @@ void func_80B9D714(ObjHunsui* this, PlayState* play) {
if (Flags_GetSwitch(play, this->unk_168)) {
this->unk_172 &= ~2;
this->unk_172 |= 0x10;
- cs = this->dyna.actor.cutscene;
+ csId = this->dyna.actor.csId;
if (this->unk_16E == 0) {
- if ((cs >= 0) && !ActorCutscene_GetCanPlayNext(cs)) {
- ActorCutscene_SetIntentToPlay(cs);
- } else if (cs >= 0) {
- ActorCutscene_StartAndSetUnkLinkFields(cs, &this->dyna.actor);
+ if ((csId >= 0) && !CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Queue(csId);
+ } else if (csId >= 0) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
this->unk_16E = -1;
} else {
this->unk_16E = 40;
}
} else if (this->unk_16E < 0) {
- if (func_800F22C4(cs, &this->dyna.actor)) {
+ if (func_800F22C4(csId, &this->dyna.actor) != 0) {
this->unk_16E = 40;
}
} else {
@@ -616,7 +616,7 @@ void func_80B9D714(ObjHunsui* this, PlayState* play) {
}
}
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if (this->dyna.actor.xzDistToPlayer < 45.0f) {
if ((this->dyna.actor.playerHeightRel < -this->dyna.actor.velocity.y) &&
(this->dyna.actor.playerHeightRel >= -800.0f)) {
diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
index 14a2eea62..1f0450b28 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
@@ -12,15 +12,15 @@ typedef void (*ObjHunsuiActionFunc)(struct ObjHunsui*, PlayState*);
#define OBJHUNSUI_GET_F80(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJHUNSUI_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJHUNSUI_F000_0,
/* 1 */ OBJHUNSUI_F000_1,
/* 2 */ OBJHUNSUI_F000_2,
/* 3 */ OBJHUNSUI_F000_3,
/* 4 */ OBJHUNSUI_F000_4,
/* 5 */ OBJHUNSUI_F000_5,
- /* 6 */ OBJHUNSUI_F000_6,
-};
+ /* 6 */ OBJHUNSUI_F000_6
+} ObjHunsuiParam;
typedef struct ObjHunsui {
/* 0x000 */ DynaPolyActor dyna;
@@ -31,11 +31,11 @@ typedef struct ObjHunsui {
/* 0x16C */ s8 unk_16C;
/* 0x16D */ s8 unk_16D;
/* 0x16E */ s8 unk_16E;
- /* 0x170 */ s16 unk_170[1];
+ /* 0x170 */ s16 csIdList[1];
/* 0x172 */ u16 unk_172;
/* 0x174 */ f32 unk_174;
/* 0x178 */ f32 unk_178;
- /* 0x17C */ s16 unk_17C;
+ /* 0x17C */ s16 csId;
/* 0x180 */ s32 unk_180;
/* 0x184 */ s16 unk_184;
/* 0x186 */ s16 unk_186;
diff --git a/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c b/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
index dc95eec27..d1601e69d 100644
--- a/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
+++ b/src/overlays/actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c
@@ -116,7 +116,7 @@ void ObjIcePoly_Init(Actor* thisx, PlayState* play) {
thisx->shape.rot.z = -0x500;
if (((this->unk_149 != OBJICEPOLY_FF_FF) && Flags_GetSwitch(play, this->unk_149)) ||
- ((play->sceneId == SCENE_KAJIYA) && CHECK_WEEKEVENTREG(WEEKEVENTREG_33_80))) {
+ ((play->sceneId == SCENE_KAJIYA) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE))) {
Actor_Kill(thisx);
return;
}
@@ -156,9 +156,9 @@ void func_80931828(ObjIcePoly* this, PlayState* play) {
temp = spA0.y - sp90;
for (i = 0; i < 30; i++) {
- sp94.x = randPlusMinusPoint5Scaled(12.0f);
+ sp94.x = Rand_CenteredFloat(12.0f);
sp94.y = Rand_ZeroFloat(15.0f);
- sp94.z = randPlusMinusPoint5Scaled(12.0f);
+ sp94.z = Rand_CenteredFloat(12.0f);
spA0.x = (this->colliders1[0].dim.radius * (sp94.x * (1.0f / 12))) + this->actor.world.pos.x;
spA0.z = (this->colliders1[0].dim.radius * (sp94.z * (1.0f / 12))) + this->actor.world.pos.z;
@@ -200,7 +200,7 @@ void func_80931A38(ObjIcePoly* this, PlayState* play) {
(this->colliders2[1].info.acHitInfo->toucher.dmgFlags == 0x800)) ||
((this->colliders2[1].base.ac->id == ACTOR_OBJ_AQUA) &&
(this->colliders2[1].base.ac->params == OBJAQUA_1))))) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->unk_14A = 0;
this->actionFunc = func_80931E58;
this->actor.focus.rot.y = this->actor.yawTowardsPlayer;
@@ -220,7 +220,7 @@ void func_80931A38(ObjIcePoly* this, PlayState* play) {
} while (actor != NULL);
}
} else if ((this->unk_149 != OBJICEPOLY_FF_FF) && Flags_GetSwitch(play, this->unk_149)) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->unk_14A = 1;
this->actionFunc = func_80931E58;
} else {
@@ -265,8 +265,8 @@ void func_80931A38(ObjIcePoly* this, PlayState* play) {
}
void func_80931E58(ObjIcePoly* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
if (this->unk_14A == 1) {
func_80931828(this, play);
Actor_Kill(&this->actor);
@@ -277,7 +277,7 @@ void func_80931E58(ObjIcePoly* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT);
this->actionFunc = func_80931EEC;
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -327,7 +327,7 @@ void func_80931EEC(ObjIcePoly* this, PlayState* play) {
this->unk_148 -= 6;
if (this->unk_14A == 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
if (this->unk_149 != OBJICEPOLY_FF_FF) {
Flags_SetSwitch(play, this->unk_149);
}
@@ -347,7 +347,7 @@ void ObjIcePoly_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
index 85b23d232..0ae8abe18 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -239,12 +239,12 @@ void func_80A237A4(ObjIceblock* this) {
((this->unk_244 - ((600.0f * this->dyna.actor.scale.y) - 90.0f)) + (sp20 * ptr->unk_08)) + ptr->unk_00;
}
-void func_80A23938(ObjIceblock* this2) {
- ObjIceblock* this = this2;
+void func_80A23938(ObjIceblock* this) {
+ Actor* thisx = &this->dyna.actor;
if (this->unk_1B0 & 0x80) {
- Math_ScaledStepToS(&this->dyna.actor.shape.rot.x, 0, 400);
- Math_ScaledStepToS(&this->dyna.actor.shape.rot.z, 0, 400);
+ Math_ScaledStepToS(&thisx->shape.rot.x, 0, 400);
+ Math_ScaledStepToS(&thisx->shape.rot.z, 0, 400);
} else {
ObjIceBlockUnkStruct4* ptr = &this->unk_27C;
f32 phi_f0;
@@ -252,7 +252,7 @@ void func_80A23938(ObjIceblock* this2) {
if (this->unk_1B0 & 0x20) {
phi_f0 = 0.3f;
- ptr->unk_14 = this->dyna.actor.yawTowardsPlayer;
+ ptr->unk_14 = thisx->yawTowardsPlayer;
} else {
phi_f0 = 0.08f;
}
@@ -264,16 +264,15 @@ void func_80A23938(ObjIceblock* this2) {
temp = ptr->unk_16 - ptr->unk_14;
- ptr->unk_18 +=
- (s16)(temp * -0.04f * this->dyna.actor.xzDistToPlayer * this->dyna.actor.scale.x * (1.0f / 600.0f));
+ ptr->unk_18 += (s16)(temp * -0.04f * thisx->xzDistToPlayer * thisx->scale.x * (1.0f / 600.0f));
ptr->unk_18 = func_80A23090(ptr->unk_18, 50, 800);
ptr->unk_16 += ptr->unk_18;
- this->dyna.actor.shape.rot.x = Math_CosS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
- this->dyna.actor.shape.rot.x = CLAMP(this->dyna.actor.shape.rot.x, -2000, 2000);
+ thisx->shape.rot.x = Math_CosS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
+ thisx->shape.rot.x = CLAMP(thisx->shape.rot.x, -2000, 2000);
- this->dyna.actor.shape.rot.z = -Math_SinS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
- this->dyna.actor.shape.rot.z = CLAMP(this->dyna.actor.shape.rot.z, -2000, 2000);
+ thisx->shape.rot.z = -Math_SinS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
+ thisx->shape.rot.z = CLAMP(thisx->shape.rot.z, -2000, 2000);
}
}
@@ -629,7 +628,8 @@ s32 func_80A24954(ObjIceblock* this, PlayState* play) {
func_80A262BC(this);
this->unk_2B0 = 3;
} else if (this->unk_1B0 & 4) {
- if (func_800C99D4(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) == 5) {
+ if (SurfaceType_GetFloorType(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) ==
+ FLOOR_TYPE_5) {
func_80A25FA0(this);
this->unk_2B0 = 2;
} else {
@@ -642,7 +642,7 @@ s32 func_80A24954(ObjIceblock* this, PlayState* play) {
void func_80A24A48(ObjIceblock* this, PlayState* play) {
if (!(this->unk_1B0 & 0x10) && !(this->collider.base.ocFlags1 & OC1_HIT)) {
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->unk_1B0 |= 0x10;
}
}
@@ -670,13 +670,14 @@ void func_80A24B74(ObjIceblock* this, PlayState* play) {
s32 pad;
Vec3f sp20;
- if (this->dyna.actor.flags & ACTOR_FLAG_40) {
- if (1) {}
- sp20.x = this->dyna.actor.world.pos.x;
- sp20.y = this->unk_244;
- sp20.z = this->dyna.actor.world.pos.z;
- EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
+ if (!(this->dyna.actor.flags & ACTOR_FLAG_40)) {
+ return;
}
+
+ sp20.x = this->dyna.actor.world.pos.x;
+ sp20.y = this->unk_244;
+ sp20.z = this->dyna.actor.world.pos.z;
+ EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
}
void func_80A24BDC(ObjIceblock* this, PlayState* play, f32 arg2, f32 arg3, s32 arg4) {
@@ -920,9 +921,9 @@ void ObjIceblock_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gIceBlockCol);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
@@ -970,13 +971,13 @@ void ObjIceBlock_SetupAttemptSpawnCutscene(ObjIceblock* this) {
}
void ObjIceBlock_AttemptSpawnCutscene(ObjIceblock* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->extendedDrawFunc = func_80A26BF8;
this->spawnCutsceneTimer = 80;
func_80A25824(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -1208,7 +1209,7 @@ void func_80A25FD4(ObjIceblock* this, PlayState* play) {
func_80A23370(this, sp2C);
func_80A260E8(this);
sp30 = false;
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
this->unk_1B0 |= 1;
}
@@ -1254,7 +1255,7 @@ void func_80A26144(ObjIceblock* this, PlayState* play) {
if ((this->unk_1B0 & 1) && (isBool || sp28 || (this->dyna.actor.xzDistToPlayer > 400.0f))) {
this->unk_1B0 &= ~1;
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
}
if (isBool) {
@@ -1426,7 +1427,7 @@ void ObjIceblock_Update(Actor* thisx, PlayState* play) {
}
}
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if (this->unk_1B0 & 0x20) {
this->unk_1B0 &= ~0x40;
} else {
@@ -1453,7 +1454,7 @@ void ObjIceblock_Update(Actor* thisx, PlayState* play) {
this->unk_1B0 &= ~0x100;
if (this->unk_1B0 & 1) {
this->unk_1B0 &= ~1;
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
}
func_80A266C4(this);
}
@@ -1462,7 +1463,7 @@ void ObjIceblock_Update(Actor* thisx, PlayState* play) {
if (this->spawnCutsceneTimer > 0) {
this->spawnCutsceneTimer--;
if (this->spawnCutsceneTimer == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
@@ -1526,7 +1527,7 @@ void func_80A26BF8(ObjIceblock* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
sp70.z = 0;
for (i = 0; i < ARRAY_COUNT(this->unk_1B4); i++) {
diff --git a/src/overlays/actors/ovl_Obj_Jg_Gakki/z_obj_jg_gakki.c b/src/overlays/actors/ovl_Obj_Jg_Gakki/z_obj_jg_gakki.c
index 0f4f83503..276c4a28e 100644
--- a/src/overlays/actors/ovl_Obj_Jg_Gakki/z_obj_jg_gakki.c
+++ b/src/overlays/actors/ovl_Obj_Jg_Gakki/z_obj_jg_gakki.c
@@ -36,7 +36,7 @@ void ObjJgGakki_Init(Actor* thisx, PlayState* play2) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &gGoronElderDrumSkel, NULL, NULL, NULL, 0);
- if (((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 7)) && (play->csCtx.currentCsIndex == 0)) {
+ if (((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 7)) && (play->csCtx.scriptIndex == 0)) {
Animation_Change(&this->skelAnime, &gGoronElderDrumTakeOutAnim, 1.0f, frameCount, frameCount, ANIMMODE_ONCE,
0.0f);
} else if ((play->sceneId == SCENE_17SETUGEN) || (play->sceneId == SCENE_10YUKIYAMANOMURA)) {
diff --git a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
index af05f0ba3..529d7ec95 100644
--- a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
+++ b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c
@@ -13,9 +13,9 @@
#define THIS ((ObjJgameLight*)thisx)
typedef enum {
- /* 0x0 */ OBJJGAMELIGHT_NONE,
- /* 0x1 */ OBJJGAMELIGHT_CORRECT,
- /* 0x2 */ OBJJGAMELIGHT_INCORRECT,
+ /* 0 */ OBJJGAMELIGHT_NONE,
+ /* 1 */ OBJJGAMELIGHT_CORRECT,
+ /* 2 */ OBJJGAMELIGHT_INCORRECT
} ObjJgameLightSignal;
void ObjJgameLight_Init(Actor* thisx, PlayState* play);
@@ -172,11 +172,11 @@ void ObjJgameLight_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, &gObjectSyokudaiTypeSwitchCausesFlameDL);
if (this->alpha > 0) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->alpha > 255) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 210, 64, 32, 255);
} else {
@@ -192,7 +192,7 @@ void ObjJgameLight_Draw(Actor* thisx, PlayState* play) {
if (this->flameScaleProportion != 0.0f) {
f32 scale;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
scale = (this->flameScaleProportion * 27.0f) / 10000.0f;
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, (this->flameScroll * -20) & 0x1FF,
diff --git a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
index 4d5845d45..048aa9bcc 100644
--- a/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
+++ b/src/overlays/actors/ovl_Obj_Kendo_Kanban/z_obj_kendo_kanban.c
@@ -28,7 +28,7 @@
typedef enum {
/* -1 */ OBJKENDOKANBAN_DIR_DOWN = -1,
/* 0 */ OBJKENDOKANBAN_DIR_UNDETERMINED,
- /* 1 */ OBJKENDOKANBAN_DIR_UP,
+ /* 1 */ OBJKENDOKANBAN_DIR_UP
} ObjKendoKanbanDirection;
void ObjKendoKanban_Init(Actor* thisx, PlayState* play);
@@ -211,7 +211,7 @@ void ObjKendoKanban_Init(Actor* thisx, PlayState* play) {
Collider_SetTrisVertices(&this->colliderTris, i, &vertices[0], &vertices[1], &vertices[2]);
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
this->boardFragments = OBJKENDOKANBAN_GET_BOARD_FRAGMENTS(&this->actor);
this->actor.gravity = -2.0f;
@@ -380,7 +380,7 @@ void ObjKendoKanban_HandlePhysics(ObjKendoKanban* this, PlayState* play) {
Matrix_Pop();
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
// When on the ground, apply some friction.
@@ -499,7 +499,7 @@ void ObjKendoKanban_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->boardFragments == OBJKENDOKANBAN_PART_FULL) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c b/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c
index 8dbff17b2..e33f62f8b 100644
--- a/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c
+++ b/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h"
#include "objects/object_kibako/object_kibako.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((ObjKibako*)thisx)
@@ -252,7 +252,8 @@ void func_80926B40(ObjKibako* this) {
void func_80926B54(ObjKibako* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
if (Object_IsLoaded(&play->objectCtx, this->bankIndex)) {
this->actor.draw = ObjKibako_Draw;
this->actor.objBankIndex = this->bankIndex;
@@ -293,7 +294,8 @@ void ObjKibako_Idle(ObjKibako* this, PlayState* play) {
} else {
Actor_MoveWithGravity(&this->actor);
func_809262BC(this);
- Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
if (!(this->collider.base.ocFlags1 & OC1_TYPE_PLAYER) && (this->actor.xzDistToPlayer > 28.0f)) {
this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER;
@@ -347,9 +349,10 @@ void ObjKibako_Held(ObjKibako* this, PlayState* play) {
} else {
Actor_MoveWithGravity(&this->actor);
ObjKibako_SetupThrown(this);
- this->actor.flags &= ~ACTOR_FLAG_4000000;
+ this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCH;
}
- Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
} else {
pos.x = this->actor.world.pos.x;
pos.y = this->actor.world.pos.y + 20.0f;
@@ -406,7 +409,8 @@ void ObjKibako_Thrown(ObjKibako* this, PlayState* play) {
Math_StepToS(&D_8092738C, D_80927388, 0xA0);
this->actor.shape.rot.x = (s16)(this->actor.shape.rot.x + D_80927384);
this->actor.shape.rot.y = (s16)(this->actor.shape.rot.y + D_8092738C);
- Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 18.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
diff --git a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
index e9ca6aba8..4d3bdc348 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
@@ -65,7 +65,7 @@ s32 ObjKibako2_ContainsSkulltula(ObjKibako2* this, PlayState* play) {
if ((u16)actorSpawnParam & 3) {
flag = ((actorSpawnParam & 0x3FC) >> 2) & 0xFF;
}
- return !(flag >= 0 && Flags_GetTreasure(play, flag));
+ return !((flag >= 0) && Flags_GetTreasure(play, flag));
}
void ObjKibako2_Break(ObjKibako2* this, PlayState* play) {
@@ -211,7 +211,7 @@ void ObjKibako2_Idle(ObjKibako2* this, PlayState* play) {
ObjKibako2_Break(this, play);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 20, NA_SE_EV_WOODBOX_BREAK);
this->dyna.actor.flags |= ACTOR_FLAG_10;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
this->actionFunc = ObjKibako2_Kill;
} else if (this->dyna.actor.xzDistToPlayer < 600.0f) {
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 b52a66d84..5bf35d48d 100644
--- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
+++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c
@@ -73,7 +73,7 @@ void ObjKinoko_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gfx = POLY_XLU_DISP;
gDPSetPrimColor(&gfx[0], 0, 0, 169, 63, 186, (u8)thisx->speed);
diff --git a/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c b/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
index 9ceff660e..ee8536caa 100644
--- a/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
+++ b/src/overlays/actors/ovl_Obj_Kzsaku/z_obj_kzsaku.c
@@ -41,7 +41,7 @@ void ObjKzsaku_Init(Actor* thisx, PlayState* play) {
CollisionHeader* col = NULL;
Actor_SetScale(&this->dyna.actor, 1.0f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_kzsaku_Colheader_001118, &col);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, col);
@@ -78,11 +78,11 @@ void func_80C08BBC(ObjKzsaku* this) {
}
void ObjKzsaku_Rise(ObjKzsaku* this, PlayState* play) {
- if (this->dyna.actor.cutscene != -1) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (this->dyna.actor.csId != CS_ID_NONE) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
if (this->raisedAmount < 450.0f) {
@@ -103,8 +103,8 @@ void func_80C08C84(ObjKzsaku* this) {
void func_80C08CB0(ObjKzsaku* this, PlayState* play) {
if (this->timer <= 20) {
if (this->timer == 20) {
- if (ActorCutscene_GetCurrentIndex() == this->dyna.actor.cutscene) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ if (CutsceneManager_GetCurrentCsId() == this->dyna.actor.csId) {
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
this->timer = 21;
} else {
@@ -122,7 +122,7 @@ void ObjKzsaku_Update(Actor* thisx, PlayState* play) {
void ObjKzsaku_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_kzsaku_DL_000040);
diff --git a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
index aff88964b..88d04b780 100644
--- a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
+++ b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c
@@ -100,7 +100,7 @@ void ObjLift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.z = 0;
this->unk_178 = this->dyna.actor.home.rot.z;
this->dyna.actor.home.rot.z = this->dyna.actor.world.rot.z = this->dyna.actor.shape.rot.z;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if ((this->unk_178 <= 0) && (Flags_GetSwitch(play, OBJLIFT_GET_7F(&this->dyna.actor)))) {
Actor_Kill(&this->dyna.actor);
return;
@@ -129,15 +129,15 @@ void func_8093D7A0(ObjLift* this, PlayState* play) {
s32 pad;
s16 quakeIndex;
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
if (this->timer <= 0) {
if (OBJLIFT_GET_7(&this->dyna.actor) == 7) {
func_8093D9C0(this);
} else {
- quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_1);
+ quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_1);
Quake_SetSpeed(quakeIndex, 10000);
- Quake_SetQuakeValues(quakeIndex, 2, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 20);
+ Quake_SetPerturbations(quakeIndex, 2, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 20);
func_8093D88C(this);
}
@@ -194,7 +194,7 @@ void func_8093DA48(ObjLift* this, PlayState* play) {
SoundSource_PlaySfxAtFixedWorldPos(play, &this->dyna.actor.world.pos, 20, NA_SE_EV_BOX_BREAK);
if (this->unk_178 > 0) {
func_8093DB70(this);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
} else {
Flags_SetSwitch(play, OBJLIFT_GET_7F(&this->dyna.actor));
Actor_Kill(&this->dyna.actor);
@@ -212,7 +212,7 @@ void func_8093DB90(ObjLift* this, PlayState* play) {
if (this->timer <= 0) {
Math_Vec3f_Copy(&this->dyna.actor.world.pos, &this->dyna.actor.home.pos);
this->dyna.actor.world.rot = this->dyna.actor.shape.rot = this->dyna.actor.home.rot;
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
func_8093D760(this);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
index 16a628fa2..6a6937e7e 100644
--- a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
+++ b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
@@ -55,11 +55,11 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- /* 0x00 */ f32 scale;
- /* 0x04 */ s16 radius;
- /* 0x06 */ s16 height;
- /* 0x08 */ s16 yShift;
- /* 0x0C */ s32 params;
+ /* 0x0 */ f32 scale;
+ /* 0x4 */ s16 radius;
+ /* 0x6 */ s16 height;
+ /* 0x8 */ s16 yShift;
+ /* 0xC */ s32 params;
} LightblockTypeVars; // size = 0x10
static LightblockTypeVars sLightblockTypeVars[] = {
@@ -134,7 +134,7 @@ void func_80AF3ADC(ObjLightblock* this, PlayState* play) {
}
if (this->collisionCounter >= 8) {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
func_80AF3B8C(this);
} else {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
@@ -146,13 +146,13 @@ void func_80AF3B8C(ObjLightblock* this) {
}
void func_80AF3BA0(ObjLightblock* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
Flags_SetSwitch(play, LIGHTBLOCK_DESTROYED(&this->dyna.actor));
func_80AF3910(this, play);
func_80AF3C18(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -162,12 +162,12 @@ void func_80AF3C18(ObjLightblock* this) {
}
void func_80AF3C34(ObjLightblock* this, PlayState* play) {
- s8 temp_a0;
+ s8 csId;
this->timer--;
if (this->timer <= 0) {
- temp_a0 = this->dyna.actor.cutscene;
- ActorCutscene_Stop(temp_a0);
+ csId = this->dyna.actor.csId;
+ CutsceneManager_Stop(csId);
Actor_Kill(&this->dyna.actor);
return;
}
@@ -178,7 +178,7 @@ void func_80AF3C34(ObjLightblock* this, PlayState* play) {
} else {
this->alpha = 0;
this->dyna.actor.draw = NULL;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
}
}
@@ -193,18 +193,20 @@ void ObjLightblock_Draw(Actor* thisx, PlayState* play) {
ObjLightblock* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->alpha < 255) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_801AEF88);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->alpha);
gSPDisplayList(POLY_XLU_DISP++, object_lightblock_DL_000178);
} else {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, D_801AEFA0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gSPDisplayList(POLY_OPA_DISP++, object_lightblock_DL_000178);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
index 4518e4e29..408668ecb 100644
--- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
+++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
@@ -189,13 +189,13 @@ void ObjLightswitch_SetAction(ObjLightswitch* this, ObjLightswitchSetupFunc setu
}
void ObjLightswitch_PlayCinema(ObjLightswitch* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
ObjLightswitch_UpdateSwitchFlags(this, play, this->switchFlagSetType);
this->cutsceneTimer = 50;
this->setupFunc(this);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -351,7 +351,7 @@ void ObjLightswitch_Update(Actor* thisx, PlayState* play) {
if ((this->cutsceneTimer > 0) && ((s32)this->actionFunc != (s32)ObjLightswitch_PlayCinema)) {
this->cutsceneTimer--;
if (this->cutsceneTimer == 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
}
@@ -370,7 +370,7 @@ void ObjLightSwitch_DrawOpa(ObjLightswitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6),
((void)0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6));
gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0);
@@ -406,7 +406,7 @@ void ObjLightSwitch_DrawXlu(ObjLightswitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6),
((void)0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6));
gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88);
diff --git a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
index 7be450b3b..7cace2621 100644
--- a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
+++ b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
@@ -53,9 +53,9 @@ void ObjLupygamelift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.shape.rot.z = 0;
this->dyna.actor.world.rot.z = 0;
this->timer = 0;
- Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawSquare, 0.0f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_raillift_Colheader_0048D0);
this->targetSpeedXZ = thisx->home.rot.z * 0.1f;
if (this->targetSpeedXZ < 0.0f) {
@@ -65,7 +65,7 @@ void ObjLupygamelift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.home.rot.y = 0;
this->dyna.actor.home.rot.z = 0;
- path = &play->setupPathList[OBJLUPYGAMELIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJLUPYGAMELIFT_GET_PATH_INDEX(thisx)];
this->pointIndex = OBJLUPYGAMELIFT_GET_7(thisx);
this->count = path->count;
if (this->pointIndex >= this->count) {
diff --git a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
index e25f9cd6d..a1928c473 100644
--- a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
+++ b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define OBJLUPYGAMELIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJLUPYGAMELIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJLUPYGAMELIFT_GET_7(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJLUPYGAMELIFT_GET_C(thisx) (((thisx)->params >> 0xC) & 1)
diff --git a/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c b/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c
index d544fcbfc..da16d938f 100644
--- a/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c
+++ b/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c
@@ -109,7 +109,7 @@ void ObjMakekinsuta_Update(Actor* thisx, PlayState* play) {
if (Flags_GetSwitch(play, OBJMAKEKINSUTA_GET_SWITCH_FLAGS(thisx))) {
this->actor.update = func_8099FD7C;
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
} else {
if (this->unk144 >= 0) {
if (this->unk144 == 0) {
@@ -127,15 +127,15 @@ void ObjMakekinsuta_Update(Actor* thisx, PlayState* play) {
}
void func_8099FD7C(Actor* thisx, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(thisx->cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(thisx->cutscene, thisx);
- if (thisx->cutscene >= 0) {
+ if (CutsceneManager_IsNext(thisx->csId)) {
+ CutsceneManager_StartWithPlayerCs(thisx->csId, thisx);
+ if (thisx->csId >= 0) {
func_800B7298(play, thisx, PLAYER_CSMODE_4);
}
func_8099FB64(thisx, play);
thisx->update = Actor_Noop;
thisx->flags &= ~ACTOR_FLAG_10;
} else {
- ActorCutscene_SetIntentToPlay(thisx->cutscene);
+ CutsceneManager_Queue(thisx->csId);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
index bb7d30f69..bcef92843 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
@@ -61,7 +61,7 @@ void ObjMakeoshihiki_Init(Actor* thisx, PlayState* play) {
Path* path;
s32 childPointIndex;
- path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(&this->actor)];
+ path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->pathCount = path->count;
childPointIndex = ObjMakeoshihiki_GetChildSpawnPointIndex(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
index 47fbe831b..fbe8c1283 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
@@ -5,7 +5,7 @@
struct ObjMakeoshihiki;
-#define OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(thisx) (((thisx)->params >> 7) & 0x7F)
+#define OBJMAKEOSHIHIKI_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x7F)
#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(thisx) ((thisx)->home.rot.z & 0x7F)
#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(thisx) ((thisx)->params & 0x7F)
diff --git a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
index 8ff6e8455..75ff18b6b 100644
--- a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
+++ b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
@@ -58,7 +58,7 @@ void ObjMilkBin_Init(Actor* thisx, PlayState* play) {
this->disableDraw = 0;
this->type = thisx->params;
- if ((this->type == OBJ_MILK_BIN_TYPE_2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if ((this->type == OBJ_MILK_BIN_TYPE_2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
this->disableDraw |= 1;
}
}
@@ -74,14 +74,14 @@ void ObjMilkBin_Update(Actor* thisx, PlayState* play2) {
ObjMilkBin* this = THIS;
if (this->type == OBJ_MILK_BIN_TYPE_1) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == 1)) || (gSaveContext.save.day >= 3)) {
Actor_Kill(&this->actor);
return;
}
}
} else if (this->type == OBJ_MILK_BIN_TYPE_2) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
this->disableDraw &= ~1;
} else {
this->disableDraw |= 1;
diff --git a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
index e1ee3cee5..dab7489ee 100644
--- a/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
+++ b/src/overlays/actors/ovl_Obj_Moon_Stone/z_obj_moon_stone.c
@@ -146,13 +146,15 @@ void ObjMoonStone_Draw(Actor* thisx, PlayState* play) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gGiMoonsTearTexAnim));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gGiMoonsTearItemDL);
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gGiMoonsTearGlowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
index e2750e639..d08f2d638 100644
--- a/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
+++ b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
@@ -40,7 +40,7 @@ ActorInit Obj_Mu_Pict_InitVars = {
void ObjMuPict_Init(Actor* thisx, PlayState* play) {
ObjMuPict* this = THIS;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_20)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
@@ -64,14 +64,14 @@ void func_80C06B70(ObjMuPict* this, PlayState* play) {
s16 yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (this->actor.cutscene < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80C06DC8(this, play);
func_80C06CC4(this);
} else {
- if (ActorCutscene_GetCurrentIndex() == 0x7C) {
- ActorCutscene_Stop(0x7C);
+ if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
func_80C06DC8(this, play);
func_80C06C54(this);
}
@@ -85,11 +85,11 @@ void func_80C06C54(ObjMuPict* this) {
}
void func_80C06C68(ObjMuPict* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
func_80C06CC4(this);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -113,8 +113,8 @@ void func_80C06CD8(ObjMuPict* this, PlayState* play) {
case TEXT_STATE_DONE:
if (Message_ShouldAdvance(play)) {
func_80C06B5C(this);
- if (this->actor.cutscene >= 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ if (this->actor.csId >= 0) {
+ CutsceneManager_Stop(this->actor.csId);
}
}
break;
diff --git a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
index 678f76ed0..f63201966 100644
--- a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
+++ b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
@@ -73,7 +73,8 @@ typedef enum {
} ObjMureChildState;
s32 func_808D78D0(ObjMure* this, PlayState* play) {
- if (this->type == OBJMURE_TYPE_FISH || this->type == OBJMURE_TYPE_BUGS || this->type == OBJMURE_TYPE_BUTTERFLY) {
+ if ((this->type == OBJMURE_TYPE_FISH) || (this->type == OBJMURE_TYPE_BUGS) ||
+ (this->type == OBJMURE_TYPE_BUTTERFLY)) {
Actor_ProcessInitChain(&this->actor, sInitChain);
} else {
return false;
@@ -135,11 +136,12 @@ void ObjMure_SpawnActors0(Actor* thisx, PlayState* play) {
switch (this->childrenStates[i]) {
case OBJMURE_CHILD_STATE_DEAD:
break;
+
case OBJMURE_CHILD_STATE_2:
ObjMure_GetSpawnPos(&pos, &this->actor.world.pos, this->ptn, i);
this->children[i] = Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, sSpawnActorIds[this->type], pos.x, pos.y, pos.z, this->actor.world.rot.x,
- this->actor.world.rot.y, this->actor.world.rot.z, sSpawnParams[this->type], this->actor.cutscene,
+ this->actor.world.rot.y, this->actor.world.rot.z, sSpawnParams[this->type], this->actor.csId,
this->actor.halfDaysBits, NULL);
if (this->children[i] != NULL) {
if (this->type == 0x90) {
@@ -148,11 +150,12 @@ void ObjMure_SpawnActors0(Actor* thisx, PlayState* play) {
this->children[i]->room = this->actor.room;
}
break;
+
default:
ObjMure_GetSpawnPos(&pos, &this->actor.world.pos, this->ptn, i);
this->children[i] = Actor_SpawnAsChildAndCutscene(
&play->actorCtx, play, sSpawnActorIds[this->type], pos.x, pos.y, pos.z, this->actor.world.rot.x,
- this->actor.world.rot.y, this->actor.world.rot.z, sSpawnParams[this->type], this->actor.cutscene,
+ this->actor.world.rot.y, this->actor.world.rot.z, sSpawnParams[this->type], this->actor.csId,
this->actor.halfDaysBits, NULL);
if (this->children[i] != NULL) {
this->children[i]->room = this->actor.room;
@@ -174,7 +177,7 @@ void ObjMure_SpawnActors1(ObjMure* this, PlayState* play2) {
this->children[i] = Actor_SpawnAsChildAndCutscene(
&play2->actorCtx, play, sSpawnActorIds[this->type], spawnPos.x, spawnPos.y, spawnPos.z, actor->world.rot.x,
actor->world.rot.y, actor->world.rot.z,
- (this->type == OBJMURE_TYPE_BUTTERFLY && i == 0) ? 1 : sSpawnParams[this->type], this->actor.cutscene,
+ (this->type == OBJMURE_TYPE_BUTTERFLY && i == 0) ? 1 : sSpawnParams[this->type], this->actor.csId,
this->actor.halfDaysBits, NULL);
if (this->children[i] != NULL) {
this->childrenStates[i] = OBJMURE_CHILD_STATE_0;
@@ -190,9 +193,13 @@ void ObjMure_SpawnActors(ObjMure* this, PlayState* play) {
case 0:
ObjMure_SpawnActors0(&this->actor, play);
break;
+
case 1:
ObjMure_SpawnActors1(this, play);
break;
+
+ default:
+ break;
}
}
@@ -205,12 +212,14 @@ void ObjMure_KillActorsImpl(ObjMure* this, PlayState* play) {
case OBJMURE_CHILD_STATE_DEAD:
this->children[i] = NULL;
break;
+
case OBJMURE_CHILD_STATE_2:
if (this->children[i] != NULL) {
Actor_Kill(this->children[i]);
this->children[i] = NULL;
}
break;
+
default:
if (this->children[i] != NULL) {
if (Actor_HasParent(this->children[i], play)) {
@@ -244,7 +253,7 @@ void ObjMure_CheckChildren(ObjMure* this, PlayState* play) {
this->childrenStates[i] = OBJMURE_CHILD_STATE_DEAD;
this->children[i] = NULL;
}
- } else if (this->childrenStates[i] == OBJMURE_CHILD_STATE_2 && this->children[i]->update == NULL) {
+ } else if ((this->childrenStates[i] == OBJMURE_CHILD_STATE_2) && (this->children[i]->update == NULL)) {
this->childrenStates[i] = OBJMURE_CHILD_STATE_DEAD;
this->children[i] = NULL;
}
@@ -367,7 +376,7 @@ void ObjMure_GroupBehavior1(ObjMure* this, PlayState* play) {
maxChildren = ObjMure_GetMaxChildSpawns(this);
for (i = 0; i < maxChildren; i++) {
if (this->children[i] != NULL) {
- if (this->children[i]->child != NULL && this->children[i]->child->update == NULL) {
+ if ((this->children[i]->child != NULL) && (this->children[i]->child->update == NULL)) {
this->children[i]->child = NULL;
}
}
@@ -380,7 +389,7 @@ static ObjMureActionFunc sTypeGroupBehaviorFunc[] = {
void ObjMure_ActiveState(ObjMure* this, PlayState* play) {
ObjMure_CheckChildren(this, play);
- if (sZClip[this->type] + 40.0f <= fabsf(this->actor.projectedPos.z)) {
+ if ((sZClip[this->type] + 40.0f) <= fabsf(this->actor.projectedPos.z)) {
this->actionFunc = ObjMure_CulledState;
this->actor.flags &= ~ACTOR_FLAG_10;
ObjMure_KillActors(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
index c8f657c13..10f12c64a 100644
--- a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
+++ b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
@@ -108,7 +108,7 @@ void func_8098F220(ObjMure3* this, PlayState* play) {
}
void func_8098F364(ObjMure3* this, PlayState* play) {
- s16 count = sRupeeCounts[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)];
+ s16 count = sRupeeCounts[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)];
s32 i;
EnItem00** collectible;
@@ -126,7 +126,7 @@ void func_8098F364(ObjMure3* this, PlayState* play) {
}
void func_8098F438(ObjMure3* this, PlayState* play) {
- s16 count = sRupeeCounts[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)];
+ s16 count = sRupeeCounts[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)];
s32 i;
for (i = 0; i < count; i++) {
@@ -134,7 +134,7 @@ void func_8098F438(ObjMure3* this, PlayState* play) {
if ((*collectible != NULL) && !((this->unk164 >> i) & 1)) {
if ((*collectible)->unk1A4 != 0) {
- Flags_SetSwitch(play, OBJMURE3_PARAMS_7F(&this->actor));
+ Flags_SetSwitch(play, OBJMURE3_PARAM_7F(&this->actor));
}
if ((*collectible)->actor.update == NULL) {
this->unk164 |= (1 << i);
@@ -147,7 +147,7 @@ void func_8098F438(ObjMure3* this, PlayState* play) {
void ObjMure3_Init(Actor* thisx, PlayState* play) {
ObjMure3* this = THIS;
- if (Flags_GetSwitch(play, OBJMURE3_PARAMS_7F(&this->actor))) {
+ if (Flags_GetSwitch(play, OBJMURE3_PARAM_7F(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -175,7 +175,7 @@ void func_8098F5E4(ObjMure3* this, PlayState* play) {
if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1150.0f)) {
this->actor.flags |= ACTOR_FLAG_10;
- sSpawnFuncs[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)](this, play);
+ sSpawnFuncs[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)](this, play);
func_8098F66C(this);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
index 8715e4308..336a092b4 100644
--- a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
+++ b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
@@ -3,8 +3,8 @@
#include "global.h"
-#define OBJMURE3_PARAMS_7F(thisx) ((thisx)->params & 0x7F)
-#define OBJMURE3_PARAMS_RUPEEINDEX(thisx) (((thisx)->params >> 13) & 7)
+#define OBJMURE3_PARAM_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJMURE3_PARAM_RUPEEINDEX(thisx) (((thisx)->params >> 13) & 7)
struct ObjMure3;
diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
index 1f42807c2..4710b8908 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c
@@ -70,7 +70,7 @@ void ObjNozoki_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
this->dyna.actor.shape.rot.x = 0;
this->dyna.actor.shape.rot.z = 0;
- this->unk_15F = this->dyna.actor.cutscene;
+ this->csId = this->dyna.actor.csId;
if (play->sceneId == SCENE_AYASHIISHOP) {
this->unk_15C = 4;
@@ -108,7 +108,7 @@ void func_80BA2514(ObjNozoki* this, PlayState* play) {
if (this->unk_15C == 0) {
Actor_SetObjectDependency(play, &this->dyna.actor);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_secom_obj_Colheader_0001C0);
- if (ActorCutscene_GetAdditionalCutscene(this->unk_15F) >= 0) {
+ if (CutsceneManager_GetAdditionalCsId(this->csId) >= 0) {
this->dyna.actor.params |= OBJNOZOKI_400;
}
ObjNozoki_SetupAction(this, func_80BA27C4);
@@ -130,16 +130,16 @@ void func_80BA2514(ObjNozoki* this, PlayState* play) {
}
s32 func_80BA26A8(ObjNozoki* this) {
- if (this->unk_15F < 0) {
+ if (this->csId <= CS_ID_NONE) {
return true;
}
- if (ActorCutscene_GetCanPlayNext(this->unk_15F)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->unk_15F, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_StartWithPlayerCs(this->csId, &this->dyna.actor);
return true;
}
- ActorCutscene_SetIntentToPlay(this->unk_15F);
+ CutsceneManager_Queue(this->csId);
return false;
}
@@ -186,7 +186,7 @@ void func_80BA27C4(ObjNozoki* this, PlayState* play) {
this->unk_15E = 25;
play_sound(NA_SE_SY_SECOM_WARNING);
} else {
- this->unk_15E = ActorCutscene_GetLength(this->unk_15F);
+ this->unk_15E = CutsceneManager_GetLength(this->csId);
if (this->unk_15E < 0) {
this->unk_15E = 50;
}
@@ -214,23 +214,23 @@ void func_80BA28DC(ObjNozoki* this, PlayState* play) {
return;
}
} else if (Flags_GetSwitch(play, OBJNOZOKI_GET_SWITCHFLAG1(&this->dyna.actor))) {
- s32 cs = this->dyna.actor.cutscene;
+ s32 csId = this->dyna.actor.csId;
- if (cs == this->unk_15F) {
+ if (csId == this->csId) {
if (OBJNOZOKI_GET_400(&this->dyna.actor)) {
Vec3f sp28;
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &sp28, &GET_PLAYER(play)->actor.world.pos);
if (sp28.z < -20.0f) {
- this->unk_15F = ActorCutscene_GetAdditionalCutscene(this->unk_15F);
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
}
}
} else if (D_80BA36B4 == 0) {
if (func_80BA26A8(this)) {
D_80BA36B4 = 1;
}
- } else if (ActorCutscene_GetCurrentIndex() != this->unk_15F) {
- this->unk_15F = cs;
+ } else if (CutsceneManager_GetCurrentCsId() != this->csId) {
+ this->csId = csId;
this->dyna.actor.params &= ~OBJNOZOKI_400;
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_ENEMY | 0x800 | SEQ_FLAG_ASYNC);
}
@@ -276,13 +276,13 @@ void func_80BA2BA4(ObjNozoki* this, PlayState* play) {
s32 func_80BA2C28(ObjNozoki* this) {
s32 i;
- s16 cs = this->unk_15F;
+ s16 csId = this->csId;
for (i = 0; i < 3; i++) {
- if (ActorCutscene_GetCurrentIndex() == cs) {
+ if (CutsceneManager_GetCurrentCsId() == csId) {
return i;
}
- cs = ActorCutscene_GetAdditionalCutscene(cs);
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
return -1;
diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.h b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.h
index 4c4b74916..8bfc9818e 100644
--- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.h
+++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.h
@@ -20,7 +20,7 @@ typedef struct ObjNozoki {
/* 0x15C */ u8 unk_15C;
/* 0x15D */ u8 unk_15D;
/* 0x15E */ s8 unk_15E;
- /* 0x15F */ s8 unk_15F;
+ /* 0x15F */ s8 csId;
/* 0x160 */ ObjNozokiActionFunc actionFunc;
} ObjNozoki; // size = 0x164
diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
index ab60ec034..168168f41 100644
--- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
+++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
@@ -62,7 +62,7 @@ void ObjOcarinalift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.world.rot.x = 0;
this->dyna.actor.shape.rot.z = 0;
this->dyna.actor.world.rot.z = 0;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_raillift_Colheader_0048D0);
this->unk160 = thisx->home.rot.z * 0.1f;
if (this->unk160 < 0.01f) {
@@ -74,7 +74,7 @@ void ObjOcarinalift_Init(Actor* thisx, PlayState* play) {
this->unk16C = 1;
this->unk170 = Lib_SegmentedToVirtual(path->points);
func_80AC94C0(this, this->unk168);
- if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAMSC_1) &&
+ if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAM_1) &&
(Flags_GetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor)))) {
func_80AC96B4(this);
} else {
@@ -137,7 +137,7 @@ void func_80AC96D0(ObjOcarinalift* this, PlayState* play) {
this->unk168 += this->unk16C;
thisx->speed *= 0.4f;
if (((this->unk168 >= this->unk164) && (this->unk16C > 0)) || ((this->unk168 <= 0) && (this->unk16C < 0))) {
- if (paramsC == OBJOCARINALIFT_PARAMSC_0) {
+ if (paramsC == OBJOCARINALIFT_PARAM_0) {
this->unk16C = -this->unk16C;
this->timer = 10;
func_80AC9A68(this);
@@ -153,13 +153,13 @@ void func_80AC96D0(ObjOcarinalift* this, PlayState* play) {
if (((this->unk170->x != temp_v1_2->x) || (this->unk170->y != temp_v1_2->y)) ||
(this->unk170->z != temp_v1_2->z)) {
func_80AC99C0(this);
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
sp34 = false;
- } else if ((paramsC == OBJOCARINALIFT_PARAMSC_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
+ } else if ((paramsC == OBJOCARINALIFT_PARAM_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
func_80AC9AB8(this);
}
}
- } else if ((paramsC == OBJOCARINALIFT_PARAMSC_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
+ } else if ((paramsC == OBJOCARINALIFT_PARAM_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
func_80AC9AB8(this);
}
if (sp34) {
@@ -173,10 +173,10 @@ void func_80AC99C0(ObjOcarinalift* this) {
}
void func_80AC99D4(ObjOcarinalift* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_80AC94C0(this, this->unk168);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
- if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) == OBJOCARINALIFT_PARAMSC_1) &&
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
+ if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) == OBJOCARINALIFT_PARAM_1) &&
(this->unk168 == OBJOCARINALIFT_GET_1F(&this->dyna.actor))) {
func_80AC9AB8(this);
} else {
@@ -205,7 +205,7 @@ void func_80AC9AE0(ObjOcarinalift* this, PlayState* play) {
if (func_800B8718(&this->dyna.actor, &play->state)) {
func_80152434(play, 1);
func_80AC9B48(this);
- } else if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ } else if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_800B8804(&this->dyna.actor, play, 40.0f);
}
}
@@ -218,10 +218,10 @@ void func_80AC9B5C(ObjOcarinalift* this, PlayState* play) {
if (func_800B886C(&this->dyna.actor, play)) {
if (play->msgCtx.ocarinaMode == 4) {
if (play->msgCtx.lastPlayedSong == 0) {
- if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAMSC_1) {
+ if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAM_1) {
Flags_SetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor));
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
func_80AC9C20(this);
}
} else {
@@ -239,12 +239,12 @@ void func_80AC9C20(ObjOcarinalift* this) {
}
void func_80AC9C48(ObjOcarinalift* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->cutsceneTimer = 50;
func_80AC96B4(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -256,7 +256,7 @@ void ObjOcarinalift_Update(Actor* thisx, PlayState* play) {
if (this->cutsceneTimer > 0) {
this->cutsceneTimer--;
if (this->cutsceneTimer == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
}
diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
index 3789383c2..abb1e440b 100644
--- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
+++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
@@ -24,9 +24,9 @@ typedef struct ObjOcarinalift {
/* 0x176 */ s16 cutsceneTimer;
} ObjOcarinalift; // size = 0x178
-typedef enum ObjOcarinaliftParams {
- /* 0x0 */ OBJOCARINALIFT_PARAMSC_0,
- /* 0x1 */ OBJOCARINALIFT_PARAMSC_1
-} ObjOcarinaliftParams;
+typedef enum ObjOcarinaliftParam {
+ /* 0 */ OBJOCARINALIFT_PARAM_0,
+ /* 1 */ OBJOCARINALIFT_PARAM_1
+} ObjOcarinaliftParam;
#endif // Z_OBJ_OCARINALIFT_H
diff --git a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
index 582d43f02..736d80d10 100644
--- a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
+++ b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c
@@ -196,7 +196,7 @@ void ObjOshihiki_SetColor(ObjOshihiki* this, PlayState* play) {
void ObjOshihiki_Init(Actor* thisx, PlayState* play) {
ObjOshihiki* this = THIS;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
if ((OBJOSHIHIKI_GET_FF00(&this->dyna.actor) >= OBJOSHIHIKI_FF00_0) &&
(OBJOSHIHIKI_GET_FF00(&this->dyna.actor) < OBJOSHIHIKI_FF00_80)) {
@@ -439,8 +439,8 @@ void ObjOshihiki_OnActor(ObjOshihiki* this, PlayState* play) {
} else {
dyna = DynaPoly_GetActor(&play->colCtx, this->floorBgIds[this->highestFloor]);
if (dyna != NULL) {
- DynaPolyActor_SetRidingFallingState(dyna);
- DynaPolyActor_SetSwitchPressedState(dyna);
+ DynaPolyActor_SetActorOnTop(dyna);
+ DynaPolyActor_SetActorOnSwitch(dyna);
if ((this->timer <= 0) && (fabsf(this->dyna.pushForce) > 0.001f) &&
ObjOshihiki_StrongEnough(this, play) && ObjOshihiki_NoSwitchPress(this, dyna, play) &&
!ObjOshihiki_CheckWall(play, this->dyna.yRotation, this->dyna.pushForce, this)) {
@@ -456,9 +456,9 @@ void ObjOshihiki_OnActor(ObjOshihiki* this, PlayState* play) {
ObjOshihiki_SetupFall(this, play);
} else {
dyna = DynaPoly_GetActor(&play->colCtx, this->floorBgIds[this->highestFloor]);
- if ((dyna != NULL) && (dyna->flags & 1)) {
- DynaPolyActor_SetRidingFallingState(dyna);
- DynaPolyActor_SetSwitchPressedState(dyna);
+ if ((dyna != NULL) && (dyna->transformFlags & DYNA_TRANSFORM_POS)) {
+ DynaPolyActor_SetActorOnTop(dyna);
+ DynaPolyActor_SetActorOnSwitch(dyna);
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
} else {
ObjOshihiki_SetupFall(this, play);
@@ -554,9 +554,9 @@ void ObjOshihiki_Fall(ObjOshihiki* this, PlayState* play) {
ObjOshihiki_SetupOnActor(this, play);
}
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
- Actor_PlaySfx(&this->dyna.actor, SurfaceType_GetSfx(&play->colCtx, this->floorPolys[this->highestFloor],
- this->floorBgIds[this->highestFloor]) +
- SFX_FLAG);
+ Actor_PlaySfx(&this->dyna.actor, NA_SE_PL_WALK_GROUND + SurfaceType_GetSfxOffset(
+ &play->colCtx, this->floorPolys[this->highestFloor],
+ this->floorBgIds[this->highestFloor]));
}
}
@@ -591,7 +591,7 @@ void ObjOshihiki_Draw(Actor* thisx, PlayState* play) {
}
this->stateFlags &= ~PUSHBLOCK_MOVE_UNDER;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, this->texture, this->textureStep);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
index d2f61e2cf..4740b907a 100644
--- a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
+++ b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
@@ -12,7 +12,7 @@ typedef void (*ObjOshihikiActionFunc)(struct ObjOshihiki*, PlayState*);
#define OBJOSHIHIKI_GET_7F00(thisx) (((thisx)->params >> 8) & 0x7F)
#define OBJOSHIHIKI_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0 */ OBJOSHIHIKI_F_0,
/* 1 */ OBJOSHIHIKI_F_1,
/* 2 */ OBJOSHIHIKI_F_2,
@@ -21,8 +21,8 @@ enum {
/* 5 */ OBJOSHIHIKI_F_5,
/* 6 */ OBJOSHIHIKI_F_6,
/* 7 */ OBJOSHIHIKI_F_7,
- /* 8 */ OBJOSHIHIKI_F_8,
-};
+ /* 8 */ OBJOSHIHIKI_F_8
+} ObjOshihikiParam;
#define OBJOSHIHIKI_FF00_0 0
#define OBJOSHIHIKI_FF00_80 0x80
diff --git a/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c b/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c
index ee26937da..649343554 100644
--- a/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c
+++ b/src/overlays/actors/ovl_Obj_Purify/z_obj_purify.c
@@ -113,7 +113,7 @@ s32 ObjPurify_IsPurified(ObjPurify* this) {
return true;
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_20_02)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
return true;
}
}
@@ -255,12 +255,12 @@ void func_80A851C8(Actor* thisx, PlayState* play) {
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(animMat));
}
if (opaDList != NULL) {
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, opaDList);
}
if (xluDList != NULL) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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++, xluDList);
}
@@ -285,7 +285,8 @@ void func_80A85304(Actor* thisx, PlayState* play) {
}
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(sp6C); i++) {
index = sp6C[i];
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(info->animMat[index]));
@@ -293,5 +294,6 @@ void func_80A85304(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, info->xluDLists[index]);
};
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
index 51eadfadc..8a124b0ab 100644
--- a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
+++ b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
@@ -8,7 +8,7 @@
#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h"
#include "objects/object_secom_obj/object_secom_obj.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((ObjPzlblock*)thisx)
@@ -44,7 +44,7 @@ typedef struct {
/* 0x0 */ s16 unk_00;
/* 0x4 */ CollisionHeader* unk_04;
/* 0x8 */ Gfx* unk_08;
-} ObjPzlblockStruct;
+} ObjPzlblockStruct; // size = 0xC
ObjPzlblockStruct D_809A4060[] = {
{ GAMEPLAY_DANGEON_KEEP, &gameplay_dangeon_keep_Colheader_01D488, gameplay_dangeon_keep_DL_01C228 },
@@ -114,20 +114,20 @@ s32 func_809A34E0(ObjPzlblock* this, s32 arg1) {
}
if (temp_v0 == 4) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (temp_v0 == 5) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
if (temp_v0 == 6) {
if (this->unk_176 != 0) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (this->unk_178 != 0) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
return true;
}
@@ -244,7 +244,7 @@ void func_809A3A48(ObjPzlblock* this) {
this->unk_16E[2] = 0;
this->unk_16E[3] = 0;
this->unk_16E[0] = 0;
- this->unk_160 = 4;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4;
}
void func_809A3A74(ObjPzlblock* this, PlayState* play) {
@@ -275,7 +275,7 @@ void func_809A3A74(ObjPzlblock* this, PlayState* play) {
void func_809A3BA4(ObjPzlblock* this) {
this->actionFunc = func_809A3BC0;
- this->unk_160 = 5;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4;
}
void func_809A3BC0(ObjPzlblock* this, PlayState* play) {
@@ -313,7 +313,7 @@ void func_809A3BC0(ObjPzlblock* this, PlayState* play) {
void func_809A3D1C(ObjPzlblock* this) {
this->actionFunc = func_809A3D38;
- this->unk_160 = 4;
+ this->updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4;
}
void func_809A3D38(ObjPzlblock* this, PlayState* play) {
@@ -328,7 +328,7 @@ void ObjPzlblock_Update(Actor* thisx, PlayState* play) {
ObjPzlblock* this = THIS;
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
if (Object_IsLoaded(&play->objectCtx, this->unk_17A)) {
ObjPzlblockStruct* sp2C = &D_809A4060[OBJPZLBLOCK_GET_1000(&this->dyna.actor)];
@@ -348,12 +348,12 @@ void func_809A3E58(Actor* thisx, PlayState* play) {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
- if (this->unk_160 != 0) {
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 0.0f, this->unk_160);
+ if (this->updBgCheckInfoFlags != 0) {
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 15.0f, 30.0f, 0.0f, this->updBgCheckInfoFlags);
if (((this->actionFunc == func_809A3A74) || (this->actionFunc == func_809A3D38)) &&
(this->dyna.actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
!DynaPoly_GetActor(&play->colCtx, this->dyna.actor.floorBgId)) {
- this->unk_160 = 0;
+ this->updBgCheckInfoFlags = 0;
}
}
}
@@ -364,7 +364,7 @@ void func_809A3F0C(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sp28->r, sp28->g, sp28->b, 255);
diff --git a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.h b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.h
index 27a038860..5cf67efcc 100644
--- a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.h
+++ b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.h
@@ -15,7 +15,7 @@ typedef void (*ObjPzlblockActionFunc)(struct ObjPzlblock*, PlayState*);
typedef struct ObjPzlblock {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjPzlblockActionFunc actionFunc;
- /* 0x160 */ s32 unk_160;
+ /* 0x160 */ s32 updBgCheckInfoFlags;
/* 0x164 */ f32* unk_164;
/* 0x168 */ f32 unk_168;
/* 0x16C */ s16 unk_16C;
diff --git a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
index 0fdf0a86b..1a63e89cb 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
@@ -66,7 +66,7 @@ void ObjRaillift_Init(Actor* thisx, PlayState* play) {
thisx->world.rot.x = 0;
thisx->shape.rot.z = 0;
thisx->world.rot.z = 0;
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, sColHeaders[type]);
this->speed = OBJRAILLIFT_GET_SPEED(thisx);
if (this->speed < 0.0f) {
@@ -86,7 +86,7 @@ void ObjRaillift_Init(Actor* thisx, PlayState* play) {
if (this->speed < 0.01f) {
this->actionFunc = ObjRaillift_DoNothing;
} else {
- path = &play->setupPathList[OBJRAILLIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJRAILLIFT_GET_PATH_INDEX(thisx)];
this->curPoint = OBJRAILLIFT_GET_STARTING_POINT(thisx);
this->endPoint = path->count - 1;
this->direction = 1;
@@ -164,7 +164,7 @@ void ObjRaillift_Move(ObjRaillift* this, PlayState* play) {
if ((this->points[0].x != endPoint->x) || (this->points[0].y != endPoint->y) ||
(this->points[0].z != endPoint->z)) {
this->actionFunc = ObjRaillift_Teleport;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
isPosUpdated = false;
}
}
@@ -180,9 +180,9 @@ void ObjRaillift_Move(ObjRaillift* this, PlayState* play) {
Will teleport to what ever curpoint is set to
*/
void ObjRaillift_Teleport(ObjRaillift* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
ObjRaillift_UpdatePosition(this, this->curPoint);
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = ObjRaillift_Move;
}
}
@@ -198,18 +198,18 @@ void ObjRaillift_Wait(ObjRaillift* this, PlayState* play) {
void ObjRaillift_Idle(ObjRaillift* this, PlayState* play) {
if (Flags_GetSwitch(play, OBJRAILLIFT_GET_FLAG(&this->dyna.actor))) {
this->dyna.actor.speed = 0.0f;
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
this->actionFunc = ObjRaillift_StartCutscene;
}
}
void ObjRaillift_StartCutscene(ObjRaillift* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->cutsceneTimer = 50;
this->actionFunc = ObjRaillift_Move;
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -223,27 +223,23 @@ void ObjRaillift_Update(Actor* thisx, PlayState* play) {
if (this->cutsceneTimer > 0) {
this->cutsceneTimer--;
if (this->cutsceneTimer == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
}
}
- if (OBJRAILLIFT_SHOULD_REACT_TO_WEIGHT(thisx)) {
+ if (OBJRAILLIFT_REACT_TO_PLAYER_ON_TOP(thisx)) {
s32 requiredScopeTemp;
- this->isWeightOnPrev = this->isWeightOn;
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
- this->isWeightOn = true;
- } else {
- this->isWeightOn = false;
- }
- if ((this->isWeightOn != this->isWeightOnPrev) && (this->maxHeight < 1.0f)) {
+ this->isPlayerOnTopPrev = this->isPlayerOnTop;
+ this->isPlayerOnTop = DynaPolyActor_IsPlayerOnTop(&this->dyna) ? true : false;
+ if ((this->isPlayerOnTop != this->isPlayerOnTopPrev) && (this->maxHeight < 1.0f)) {
this->cycle = -0x8000;
this->maxHeight = 6.0f;
}
this->cycle += 0xCE4;
Math_StepToF(&this->maxHeight, 0.0f, 0.12f);
- step = this->isWeightOn ? Math_CosS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f
- : Math_SinS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f;
- target = this->isWeightOn ? -8.0f : 0.0f;
+ step = this->isPlayerOnTop ? Math_CosS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f
+ : Math_SinS(fabsf(this->cycleSpeed) * 2048.0f) + 0.02f;
+ target = this->isPlayerOnTop ? -8.0f : 0.0f;
Math_StepToF(&this->cycleSpeed, target, step);
this->dyna.actor.shape.yOffset = ((Math_SinS(this->cycle) * this->maxHeight) + this->cycleSpeed) * 10.0f;
}
@@ -263,12 +259,14 @@ void ObjRaillift_Draw(Actor* thisx, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08,
Gfx_TwoTexScrollEnvColor(play->state.gfxCtx, 0, play->gameplayFrames, 0, 32, 32, 1, 0, 0, 32, 32, 0, 0,
0, 160));
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_raillift_DL_004BF0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
index 41b7a821e..dc197432f 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
@@ -10,11 +10,11 @@ typedef void (*ObjRailliftActionFunc)(struct ObjRaillift*, PlayState*);
#define OBJRAILLIFT_GET_TYPE(thisx) (((thisx)->params >> 0xF) & 1)
#define OBJRAILLIFT_HAS_FLAG(thisx) (((thisx)->params >> 0xD) & 1)
#define OBJRAILLIFT_GET_FLAG(thisx) ((thisx)->home.rot.x & 0x7F)
-#define OBJRAILLIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJRAILLIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJRAILLIFT_GET_STARTING_POINT(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJRAILLIFT_GET_SPEED(thisx) ((thisx)->home.rot.z * 0.1f)
#define OBJRAILLIFT_SHOULD_TELEPORT(thisx) (((thisx)->params >> 0xC) & 1)
-#define OBJRAILLIFT_SHOULD_REACT_TO_WEIGHT(thisx) (((thisx)->params >> 0xE) & 1)
+#define OBJRAILLIFT_REACT_TO_PLAYER_ON_TOP(thisx) (((thisx)->params >> 0xE) & 1)
typedef enum {
/* 0 */ OOT_WATER_TEMPLE_WATERFALL_PLATFORM,
@@ -29,8 +29,8 @@ typedef struct ObjRaillift {
/* 0x168 */ s32 curPoint;
/* 0x16C */ s32 direction; // +1 for forward, -1 for backward
/* 0x170 */ Vec3s* points;
- /* 0x174 */ s32 isWeightOn;
- /* 0x178 */ s32 isWeightOnPrev;
+ /* 0x174 */ s32 isPlayerOnTop;
+ /* 0x178 */ s32 isPlayerOnTopPrev;
/* 0x17C */ f32 cycleSpeed;
/* 0x180 */ f32 maxHeight;
/* 0x184 */ s16 cycle;
diff --git a/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c b/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
index 154f662f8..3871508ba 100644
--- a/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
+++ b/src/overlays/actors/ovl_Obj_Roomtimer/z_obj_roomtimer.c
@@ -64,7 +64,7 @@ void func_80973D3C(ObjRoomtimer* this, PlayState* play) {
if (this->actor.params != 0x1FF) {
gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_STOP;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_80973DE0;
} else if ((this->actor.params != 0x1FF) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] == TIMER_STATE_OFF)) {
play_sound(NA_SE_OC_ABYSS);
@@ -74,17 +74,17 @@ void func_80973D3C(ObjRoomtimer* this, PlayState* play) {
}
void func_80973DE0(ObjRoomtimer* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
Flags_SetClear(play, this->actor.room);
Flags_SetSwitch(play, this->switchFlag);
- if (ActorCutscene_GetLength(this->actor.cutscene) != -1) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_GetLength(this->actor.csId) != -1) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
}
Actor_Kill(&this->actor);
return;
}
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
void ObjRoomtimer_Update(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.c b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.c
index ce18a68b0..4c63908c6 100644
--- a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.c
+++ b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.c
@@ -111,7 +111,7 @@ void ObjRotlift_Init(Actor* thisx, PlayState* play2) {
ObjRotlift_MoveDekuFlowers(this);
}
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
modelInfo = &sModelInfo[type];
DynaPolyActor_LoadMesh(play, &this->dyna, modelInfo->colHeader);
diff --git a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
index df3fe1dee..e059b6baa 100644
--- a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
+++ b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
@@ -10,7 +10,7 @@
typedef enum {
/* 0 */ OBJROTLIFT_TYPE_PLATFORMS,
- /* 1 */ OBJROTLIFT_TYPE_SPIKES,
+ /* 1 */ OBJROTLIFT_TYPE_SPIKES
} ObjRotliftType;
struct ObjRotlift;
diff --git a/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c b/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
index 6f93935b2..bd567ca2d 100644
--- a/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
+++ b/src/overlays/actors/ovl_Obj_Shutter/z_obj_shutter.c
@@ -85,7 +85,7 @@ void ObjShutter_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gBankShutterDL);
diff --git a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
index 374a2f520..28ce8cda8 100644
--- a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
+++ b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c
@@ -489,7 +489,7 @@ void ObjSkateblock_Init(Actor* thisx, PlayState* play) {
ObjSkateblock* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gameplay_dangeon_keep_Colheader_007498);
if (D_80A22A18 == NULL) {
D_80A22A18 = Lib_SegmentedToVirtual(gameplay_dangeon_keep_Matanimheader_01B370);
@@ -535,7 +535,7 @@ void func_80A22334(ObjSkateblock* this, PlayState* play) {
func_80A21C88(this, sp2C);
func_80A2244C(this);
sp30 = false;
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_7);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
this->unk_1C1 |= 1;
}
@@ -591,7 +591,7 @@ void func_80A224A4(ObjSkateblock* this, PlayState* play) {
if ((this->unk_1C1 & 1) && (sp24 || sp28 || (this->dyna.actor.xzDistToPlayer > 400.0f))) {
this->unk_1C1 &= ~1;
- func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_6);
+ func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
}
func_80A21F74(this, play);
@@ -614,8 +614,9 @@ void func_80A2264C(ObjSkateblock* this, PlayState* play) {
sp20 = func_80A21548(this, play);
if (sp20 || ((this->unk_160 - this->dyna.actor.world.pos.y) > 300.0f)) {
- if (func_800C9B40(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) == 12) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ if (SurfaceType_GetFloorProperty(&play->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) ==
+ FLOOR_PROPERTY_12) {
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
func_80A22728(this);
return;
@@ -632,7 +633,7 @@ void func_80A22728(ObjSkateblock* this) {
}
void func_80A2273C(ObjSkateblock* this, PlayState* play) {
- if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x;
this->dyna.actor.world.pos.y = (this->dyna.actor.home.pos.y - (600.0f * this->dyna.actor.scale.y)) - 10.0f;
this->dyna.actor.world.pos.z = this->dyna.actor.home.pos.z;
@@ -656,14 +657,14 @@ void func_80A227C0(ObjSkateblock* this, PlayState* play) {
return;
}
- func_800C6314(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = ObjSkateblock_Draw;
if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, 1.0f)) {
func_80A22308(this);
}
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
D_80A22A10 |= 1 << this->unk_1C0;
}
}
@@ -683,7 +684,7 @@ void ObjSkateblock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
AnimatedMat_DrawStep(play, D_80A22A18, 0);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c b/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
index dd02f6c1b..a34050cc2 100644
--- a/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
+++ b/src/overlays/actors/ovl_Obj_Smork/z_obj_smork.c
@@ -115,7 +115,7 @@ void func_80A3D9C4(ObjSmork* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x20, 1, 0, sp56, 0x20, 0x20));
diff --git a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
index b0416cc58..92ac9ad85 100644
--- a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
+++ b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
@@ -73,10 +73,10 @@ static ColliderJntSphInit sJntSphInit = {
};
typedef struct {
- /* 0x00 */ s16 unk_00;
- /* 0x02 */ s16 unk_02;
- /* 0x04 */ ObjSnowballActionFunc unk_04;
-} ObjSnowballStruct2;
+ /* 0x0 */ s16 unk_00;
+ /* 0x2 */ s16 unk_02;
+ /* 0x4 */ ObjSnowballActionFunc unk_04;
+} ObjSnowballStruct2; // size = 0x8
static ObjSnowballStruct2 D_80B04F84[] = {
{ -1, 0, func_80B02D58 },
@@ -106,7 +106,7 @@ void func_80B02CD0(ObjSnowball* this, PlayState* play) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ptr->unk_00, this->actor.home.pos.x, this->actor.home.pos.y,
this->actor.home.pos.z, this->actor.home.rot.x, 0, this->actor.home.rot.z,
- ptr->unk_02, -1, this->actor.halfDaysBits, NULL);
+ ptr->unk_02, CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
void func_80B02D58(ObjSnowball* this, PlayState* play) {
@@ -121,10 +121,10 @@ void func_80B02DB0(ObjSnowball* this, PlayState* play) {
s32 pad;
ObjSnowballStruct2* ptr = &D_80B04F84[this->actor.home.rot.y];
- Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ptr->unk_00, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z,
- this->actor.home.rot.x, 0, this->actor.home.rot.z, this->actor.params | ptr->unk_02,
- ActorCutscene_GetAdditionalCutscene(this->actor.cutscene), this->actor.halfDaysBits, NULL);
+ Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ptr->unk_00, this->actor.home.pos.x, this->actor.home.pos.y,
+ this->actor.home.pos.z, this->actor.home.rot.x, 0, this->actor.home.rot.z,
+ this->actor.params | ptr->unk_02, CutsceneManager_GetAdditionalCsId(this->actor.csId),
+ this->actor.halfDaysBits, NULL);
}
void func_80B02E54(ObjSnowball* this, PlayState* play) {
@@ -132,7 +132,7 @@ void func_80B02E54(ObjSnowball* this, PlayState* play) {
Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ptr->unk_00, this->actor.home.pos.x, this->actor.home.pos.y,
this->actor.home.pos.z, this->actor.home.rot.x, 0, this->actor.home.rot.z,
- this->actor.params | ptr->unk_02, -1, this->actor.halfDaysBits, NULL);
+ this->actor.params | ptr->unk_02, CS_ID_NONE, this->actor.halfDaysBits, NULL);
}
void func_80B02EE4(ObjSnowball* this, PlayState* play) {
@@ -549,7 +549,7 @@ void func_80B04350(ObjSnowball* this, PlayState* play) {
this->unk_20A = 0;
}
- if (this->actor.cutscene < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80B03FF8(this, play);
if (this->unk_20A == 0) {
func_80B04608(this, play);
@@ -584,13 +584,13 @@ void func_80B04350(ObjSnowball* this, PlayState* play) {
}
void func_80B04540(ObjSnowball* this, PlayState* play) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_80B0457C;
}
void func_80B0457C(ObjSnowball* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
func_80B03FF8(this, play);
this->unk_20B = 1;
if (this->unk_20A == 0) {
@@ -599,7 +599,7 @@ void func_80B0457C(ObjSnowball* this, PlayState* play) {
func_80B046E4(this, play);
}
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -615,7 +615,7 @@ void func_80B04648(ObjSnowball* this, PlayState* play) {
this->unk_208--;
if (this->unk_208 <= 0) {
if (this->unk_20B != 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
if (this->actor.home.rot.y == 1) {
@@ -719,7 +719,7 @@ void func_80B047C0(ObjSnowball* this, PlayState* play) {
if ((this->unk_208 <= 0) || ((this->unk_1A8[0].unk_2D & 1) && (this->unk_1A8[1].unk_2D & 1))) {
if (this->unk_20B != 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
}
if (this->actor.home.rot.y == 1) {
@@ -818,7 +818,7 @@ void func_80B04D34(Actor* thisx, PlayState* play) {
if ((ptr->unk_28 != NULL) && (ptr->unk_2C > 0)) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
gDPSetCombineLERP(POLY_XLU_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0,
0, COMBINED);
diff --git a/src/overlays/actors/ovl_Obj_Snowball2/z_obj_snowball2.c b/src/overlays/actors/ovl_Obj_Snowball2/z_obj_snowball2.c
index f5c39f0b8..ec05294d1 100644
--- a/src/overlays/actors/ovl_Obj_Snowball2/z_obj_snowball2.c
+++ b/src/overlays/actors/ovl_Obj_Snowball2/z_obj_snowball2.c
@@ -374,7 +374,8 @@ void func_80B39C9C(ObjSnowball2* this, PlayState* play) {
if (this->unk_1AD == 0) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0x44);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId) == NULL)) {
this->unk_1AD = 1;
@@ -422,7 +423,8 @@ void func_80B39FA8(ObjSnowball2* this, PlayState* play) {
this->actor.velocity.y *= 0.4f;
this->actor.gravity = -2.8f;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
func_80B3A0D8(this);
} else {
sp30.x = this->actor.world.pos.x;
@@ -510,7 +512,8 @@ void func_80B3A13C(ObjSnowball2* this, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0x45);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
this->actor.shape.rot.x += this->unk_1A8;
this->actor.shape.rot.y += this->unk_1AA;
func_80B38E20(this);
diff --git a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
index 13e127c73..c366a6982 100644
--- a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
+++ b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
@@ -234,7 +234,7 @@ typedef struct {
/* 0x1C */ f32 unk_1C;
/* 0x20 */ f32 unk_20;
/* 0x24 */ f32 unk_24;
-} ObjSpidertentStruct;
+} ObjSpidertentStruct; // size = 0x28
ObjSpidertentStruct D_80B31350[] = {
{
@@ -272,7 +272,7 @@ typedef struct {
/* 0x0F */ s8 unk_0F;
/* 0x10 */ Color_RGBA8 unk_10;
/* 0x14 */ Color_RGBA8 unk_14;
-} ObjSpidertentStruct2;
+} ObjSpidertentStruct2; // size = 0x18
ObjSpidertentStruct2 D_80B313A0[] = {
{
@@ -676,15 +676,15 @@ void func_80B30A2C(ObjSpidertent* this) {
}
void func_80B30A4C(ObjSpidertent* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
- if (this->dyna.actor.cutscene >= 0) {
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
+ if (this->dyna.actor.csId >= 0) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_1);
}
Flags_SetSwitch(play, OBJSPIDERTENT_GET_7F00(&this->dyna.actor));
func_80B30AD4(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -755,7 +755,7 @@ void func_80B30AF8(ObjSpidertent* this, PlayState* play) {
this->unk_3C1--;
if (this->unk_3C1 == 40) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
}
if (this->unk_3C1 >= 32) {
@@ -791,7 +791,7 @@ void func_80B30AF8(ObjSpidertent* this, PlayState* play) {
}
}
} else if (this->unk_3C1 <= 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Actor_Kill(&this->dyna.actor);
}
}
@@ -812,7 +812,7 @@ void ObjSpidertent_Draw(Actor* thisx, PlayState* play) {
gfx = POLY_XLU_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(gfx++, 0, 0xFF, this->unk_3C2, this->unk_3C3, this->unk_3C4, temp_f18);
gSPDisplayList(gfx++, D_80B31350[params].unk_00);
diff --git a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
index 4541baa2a..4ff089a72 100644
--- a/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
+++ b/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.c
@@ -659,7 +659,7 @@ void ObjSpinyroll_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
temp_f26 = Math_CosS(this->dyna.actor.shape.rot.y) * 120.0f;
temp_f28 = Math_SinS(this->dyna.actor.shape.rot.y) * -120.0f;
diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
index 76f5bc872..70d6c2619 100644
--- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
+++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c
@@ -266,7 +266,7 @@ void ObjSwitch_CrystalUpdateTimer(ObjSwitch* this) {
void ObjSwitch_StopCutscene(ObjSwitch* this) {
if (this->isPlayingCutscene) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
this->isPlayingCutscene = false;
}
}
@@ -284,7 +284,7 @@ void ObjSwitch_PlayDiamondSwitchSfx(ObjSwitch* this) {
}
void ObjSwitch_SetFloorSwitchSnapPlayerState(ObjSwitch* this, s32 state) {
- if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
this->floorSwitchPlayerSnapState = state;
}
}
@@ -344,7 +344,7 @@ void ObjSwitch_Init(Actor* thisx, PlayState* play) {
} else {
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 1.0f;
}
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gFloorSwitchCol);
}
if (type == OBJSWITCH_TYPE_FLOOR) {
@@ -486,8 +486,8 @@ void ObjSwitch_TryPlayCutsceneInit(ObjSwitch* this, PlayState* play, ObjSwitchSe
}
void ObjSwitch_TryPlayCutscene(ObjSwitch* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ObjSwitch_SetSwitchFlagState(this, play, this->nextSwitchFlagState);
if (this->floorSwitchPlayerSnapState == 1) {
this->floorSwitchPlayerSnapState = 2;
@@ -495,7 +495,7 @@ void ObjSwitch_TryPlayCutscene(ObjSwitch* this, PlayState* play) {
this->isPlayingCutscene = true;
this->setupFunc(this);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -517,13 +517,13 @@ void ObjSwitch_FloorSwitchUp(ObjSwitch* this, PlayState* play) {
} else {
switch (OBJ_SWITCH_GET_SUBTYPE(&this->dyna.actor)) {
case OBJSWITCH_SUBTYPE_ONCE:
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 1);
ObjSwitch_TryPlayCutsceneInit(this, play, ObjSwitch_FloorSwitchPushDownInit, true);
}
break;
case OBJSWITCH_SUBTYPE_SYNC:
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 1);
ObjSwitch_TryPlayCutsceneInit(this, play, ObjSwitch_FloorSwitchPushDownInit, true);
} else if (Flags_GetSwitch(play, OBJ_SWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
@@ -531,7 +531,7 @@ void ObjSwitch_FloorSwitchUp(ObjSwitch* this, PlayState* play) {
}
break;
case OBJSWITCH_SUBTYPE_TOGGLE:
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
s32 isSwitchFlagNotSet =
Flags_GetSwitch(play, OBJ_SWITCH_GET_SWITCH_FLAG(&this->dyna.actor)) ? false : true;
@@ -540,13 +540,13 @@ void ObjSwitch_FloorSwitchUp(ObjSwitch* this, PlayState* play) {
}
break;
case OBJSWITCH_SUBTYPE_RESET:
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 1);
ObjSwitch_TryPlayCutsceneInit(this, play, ObjSwitch_FloorSwitchPushDownInit, true);
}
break;
case OBJSWITCH_SUBTYPE_RESET_INVERTED:
- if (DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsSwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 2);
ObjSwitch_SetSwitchFlagState(this, play, false);
ObjSwitch_FloorSwitchPushDownInit(this);
@@ -584,7 +584,7 @@ void ObjSwitch_FloorSwitchDown(ObjSwitch* this, PlayState* play) {
case OBJSWITCH_SUBTYPE_ONCE:
case OBJSWITCH_SUBTYPE_SYNC:
if (!Flags_GetSwitch(play, OBJ_SWITCH_GET_SWITCH_FLAG(&this->dyna.actor))) {
- if ((play->sceneId == SCENE_SECOM) && DynaPolyActor_IsInSwitchPressedState(&this->dyna)) {
+ if ((play->sceneId == SCENE_SECOM) && DynaPolyActor_IsSwitchPressed(&this->dyna)) {
ObjSwitch_SetSwitchFlagState(this, play, true);
} else {
ObjSwitch_FloorSwitchRiseUpInit(this);
@@ -594,7 +594,7 @@ void ObjSwitch_FloorSwitchDown(ObjSwitch* this, PlayState* play) {
case OBJSWITCH_SUBTYPE_TOGGLE:
case OBJSWITCH_SUBTYPE_RESET:
case OBJSWITCH_SUBTYPE_RESET_INVERTED:
- if (!DynaPolyActor_IsInSwitchPressedState(&this->dyna) &&
+ if (!DynaPolyActor_IsSwitchPressed(&this->dyna) &&
(!Player_InCsMode(play) || (play->sceneId == SCENE_SECOM))) {
if (this->floorSwitchReleaseTimer <= 0) {
if (subType == OBJSWITCH_SUBTYPE_RESET) {
@@ -841,16 +841,16 @@ void ObjSwitch_LargeFloorSwitchUp(ObjSwitch* this, PlayState* play) {
s32 subType = OBJ_SWITCH_GET_SUBTYPE(&this->dyna.actor);
if (subType == OBJSWITCH_SUBTYPE_ONCE) {
- if (DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsHeavySwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 1);
ObjSwitch_TryPlayCutsceneInit(this, play, ObjSwitch_LargeFloorSwitchPushDownInit, true);
}
} else if (subType == OBJSWITCH_SUBTYPE_RESET) {
- if (DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna)) {
+ if (DynaPolyActor_IsHeavySwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 1);
ObjSwitch_TryPlayCutsceneInit(this, play, ObjSwitch_LargeFloorSwitchPushDownInit, true);
}
- } else if (subType == OBJSWITCH_SUBTYPE_RESET_INVERTED && DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna)) {
+ } else if (subType == OBJSWITCH_SUBTYPE_RESET_INVERTED && DynaPolyActor_IsHeavySwitchPressed(&this->dyna)) {
ObjSwitch_SetFloorSwitchSnapPlayerState(this, 2);
ObjSwitch_SetSwitchFlagState(this, play, false);
ObjSwitch_LargeFloorSwitchPushDownInit(this);
@@ -885,7 +885,7 @@ void ObjSwitch_LargeFloorSwitchDown(ObjSwitch* this, PlayState* play) {
ObjSwitch_LargeFloorSwitchRiseUpInit(this);
}
} else if (subType == OBJSWITCH_SUBTYPE_RESET || subType == OBJSWITCH_SUBTYPE_RESET_INVERTED) {
- if (!DynaPolyActor_IsInHeavySwitchPressedState(&this->dyna) && !Player_InCsMode(play)) {
+ if (!DynaPolyActor_IsHeavySwitchPressed(&this->dyna) && !Player_InCsMode(play)) {
if (this->floorSwitchReleaseTimer <= 0) {
if (OBJ_SWITCH_GET_SUBTYPE(&this->dyna.actor) == OBJSWITCH_SUBTYPE_RESET) {
ObjSwitch_SetSwitchFlagState(this, play, false);
@@ -936,7 +936,7 @@ void ObjSwitch_Update(Actor* thisx, PlayState* play) {
case OBJSWITCH_TYPE_FLOOR:
case OBJSWITCH_TYPE_FLOOR_RUSTY:
case OBJSWITCH_TYPE_FLOOR_LARGE:
- this->collisionFlags = this->dyna.stateFlags;
+ this->collisionFlags = this->dyna.interactFlags;
break;
case OBJSWITCH_TYPE_EYE:
this->collisionFlags = this->colliderTris.base.acFlags;
@@ -968,12 +968,14 @@ void ObjSwitch_DrawFloorSwitch(ObjSwitch* this, PlayState* play) {
Gfx* opa;
OPEN_DISPS(play->state.gfxCtx);
+
opa = POLY_OPA_DISP;
- gSPDisplayList(opa++, &sSetupDL[6 * 25]);
+ gSPDisplayList(opa++, gSetupDLs[SETUPDL_25]);
gSPMatrix(opa++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(opa++, 0, 0x80, this->color.r, this->color.g, this->color.b, 255);
gSPDisplayList(opa++, gFloorSwitch1DL);
POLY_OPA_DISP = opa;
+
CLOSE_DISPS(play->state.gfxCtx);
} else {
Gfx_DrawDListOpa(play, sFloorSwitchDL[OBJ_SWITCH_GET_SUBTYPE(&this->dyna.actor)]);
@@ -990,7 +992,7 @@ void ObjSwitch_DrawVisibleEyeSwitch(ObjSwitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_OPA_DISP++, 0x08, sEyeSwitchTextures[subType][this->eyeTexIndex]);
gSPDisplayList(POLY_OPA_DISP++, sEyeSwitchDL[subType]);
@@ -1004,7 +1006,7 @@ void ObjSwitch_DrawInvisibleEyeSwitch(ObjSwitch* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, sEyeSwitchTextures[subType][this->eyeTexIndex]);
gSPDisplayList(POLY_XLU_DISP++, sEyeSwitchDL[subType]);
@@ -1027,8 +1029,8 @@ void ObjSwitch_DrawCrystalSwitch(ObjSwitch* this, PlayState* play) {
func_800B8118(&this->dyna.actor, play, 0);
AnimatedMat_DrawStep(play, sCrystalSwitchAnimatedMat, this->crystalAnimTimer);
- func_8012C28C(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gCrystalSwitchBaseDL);
diff --git a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
index 5e6f399a8..f1b7bfa6f 100644
--- a/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
+++ b/src/overlays/actors/ovl_Obj_Swprize/z_obj_swprize.c
@@ -109,12 +109,12 @@ void func_80C25698(ObjSwprize* this) {
}
void func_80C256AC(ObjSwprize* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ if (CutsceneManager_IsNext(this->actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
func_80C253D0(this, play);
func_80C25710(this);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -127,7 +127,7 @@ void func_80C2572C(ObjSwprize* this, PlayState* play) {
if (this->timer > 0) {
this->timer--;
if (this->timer == 0) {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
ObjSwprize_SetupDoNothing(this);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
index 96716d107..1b1ca74a0 100644
--- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
+++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
@@ -143,16 +143,16 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) {
s32 pad1;
if (this->pendingAction != OBJ_SYOKUDAI_PENDING_ACTION_NONE) {
- if (ActorCutscene_GetCurrentIndex() != thisx->cutscene) {
- if (ActorCutscene_GetCanPlayNext(thisx->cutscene) != 0) {
- ActorCutscene_StartAndSetUnkLinkFields(thisx->cutscene, thisx);
+ if (CutsceneManager_GetCurrentCsId() != thisx->csId) {
+ if (CutsceneManager_IsNext(thisx->csId)) {
+ CutsceneManager_StartWithPlayerCs(thisx->csId, thisx);
if (this->pendingAction >= OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH) {
Flags_SetSwitch(play, switchFlag);
}
} else {
- ActorCutscene_SetIntentToPlay(thisx->cutscene);
+ CutsceneManager_Queue(thisx->csId);
}
- } else if (func_800F22C4(thisx->cutscene, thisx) != 0) {
+ } else if (func_800F22C4(thisx->csId, thisx) != 0) {
this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER;
this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_NONE;
}
@@ -171,6 +171,7 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) {
} else {
s32 interaction = OBJ_SYOKUDAI_INTERACTION_NONE;
u32 flameColliderHurtboxDmgFlags = 0;
+
player = GET_PLAYER(play);
if (OBJ_SYOKUDAI_GET_START_LIT(thisx)) {
@@ -240,7 +241,7 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) {
if (groupSize == 0) {
if ((type == OBJ_SYOKUDAI_TYPE_NO_SWITCH) && (switchFlag == 0x7F)) {
this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER;
- } else if (thisx->cutscene >= 0) {
+ } else if (thisx->csId >= 0) {
this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH;
} else {
Flags_SetSwitch(play, switchFlag);
@@ -292,7 +293,8 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
f32 flameScale;
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, sDLists[OBJ_SYOKUDAI_GET_TYPE(thisx)]);
if (this->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT) {
@@ -306,7 +308,7 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
flameScale = (f32)this->snuffTimer / OBJ_SYOKUDAI_SNUFF_DEFAULT;
}
flameScale *= 0.0027f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0,
(this->flameTexScroll * -OBJ_SYOKUDAI_SNUFF_DEFAULT) & 0x1FF, 0x20, 0x80));
@@ -319,5 +321,6 @@ void ObjSyokudai_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
index 5608143b3..6eac0ddbc 100644
--- a/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
+++ b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
@@ -141,10 +141,10 @@ void func_80B9B9C8(ObjTaru* this, PlayState* play) {
for (i = 0; i < 4; i++) {
for (j = phi_fp; j < phi_s5; j++) {
- temp_fs0 = randPlusMinusPoint5Scaled(10.0f) + -105.0f + (j * 30.0f);
- temp_fs1 = randPlusMinusPoint5Scaled(4.0f);
+ temp_fs0 = Rand_CenteredFloat(10.0f) + -105.0f + (j * 30.0f);
+ temp_fs1 = Rand_CenteredFloat(4.0f);
spD8.x = temp_fs0 * cos;
- spD8.y = randPlusMinusPoint5Scaled(10.0f) + 15.0f + (i * 30.0f);
+ spD8.y = Rand_CenteredFloat(10.0f) + 15.0f + (i * 30.0f);
spD8.z = temp_fs0 * sin;
spCC.x = (spD8.x * 0.05f) + (temp_fs1 * sin);
spCC.y = Rand_ZeroFloat(5.0f) + 2.0f;
@@ -279,7 +279,7 @@ void func_80B9C07C(ObjTaru* this, PlayState* play) {
this->actionFunc = func_80B9C1A0;
} else {
this->dyna.actor.flags |= ACTOR_FLAG_10;
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->dyna.actor.draw = NULL;
this->actionFunc = func_80B9C174;
}
@@ -296,14 +296,14 @@ void func_80B9C174(ObjTaru* this, PlayState* play) {
}
void func_80B9C1A0(ObjTaru* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
Flags_SetSwitch(play, OBJ_TARU_GET_7F(&this->dyna.actor));
Actor_Kill(&this->dyna.actor);
return;
}
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
void ObjTaru_Update(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
index 490ade729..cecb80832 100644
--- a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
+++ b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
@@ -131,12 +131,12 @@ void ObjToge_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
- if (OBJTOGE_GET_PATH(thisx) == 0xFF) {
+ if (OBJTOGE_GET_PATH_INDEX(thisx) == OBJTOGE_PATH_INDEX_NONE) {
Actor_Kill(thisx);
return;
}
- path = &play->setupPathList[OBJTOGE_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJTOGE_GET_PATH_INDEX(thisx)];
if (path->count != 2) {
Actor_Kill(thisx);
return;
@@ -244,7 +244,8 @@ void func_809A48AC(ObjToge* this, PlayState* play) {
}
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, D_809A4D0C[OBJTOGE_GET_4000(&this->actor)] * 30.0f, 0.0f, 0x81);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, D_809A4D0C[OBJTOGE_GET_4000(&this->actor)] * 30.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_80);
if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
this->actor.world.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_198[this->unk_194]);
diff --git a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
index 8259e62c8..54cf02bf4 100644
--- a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
+++ b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
@@ -7,11 +7,13 @@ struct ObjToge;
typedef void (*ObjTogeActionFunc)(struct ObjToge*, PlayState*);
-#define OBJTOGE_GET_PATH(thisx) ((thisx)->params & 0xFF)
+#define OBJTOGE_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
#define OBJTOGE_GET_700(thisx) (((thisx)->params >> 8) & 7)
#define OBJTOGE_GET_3800(thisx) (((thisx)->params >> 0xB) & 7)
#define OBJTOGE_GET_4000(thisx) (((thisx)->params >> 0xE) & 1)
+#define OBJTOGE_PATH_INDEX_NONE 0xFF
+
typedef struct ObjToge {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c b/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
index 4f02a46b2..a198f4a0f 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
+++ b/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
@@ -61,13 +61,13 @@ void ObjTokeiStep_SetSysMatrix(ObjTokeiStepPanel* panel) {
mtx->zw = panel->pos.z;
}
-void ObjTokeiStep_AddQuake(ObjTokeiStep* this, PlayState* play) {
+void ObjTokeiStep_RequestQuakeAndRumble(ObjTokeiStep* this, PlayState* play) {
s32 pad[2];
- s16 quakeIndex = Quake_Add(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
+ s16 quakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_3);
Quake_SetSpeed(quakeIndex, 20000);
- Quake_SetQuakeValues(quakeIndex, 1, 0, 0, 0);
- Quake_SetCountdown(quakeIndex, 7);
+ Quake_SetPerturbations(quakeIndex, 1, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, 7);
Rumble_Request(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
}
@@ -140,7 +140,7 @@ void ObjTokeiStep_InitTimers(ObjTokeiStep* this) {
}
s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, PlayState* play) {
- ObjTokeiStep* this2 = this;
+ Actor* thisx = &this->dyna.actor;
s32 i;
ObjTokeiStepPanel* panel;
f32 finalPosY;
@@ -179,8 +179,8 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, PlayState* play) {
panel->pos.y += finalPosY;
}
if (panel->numBounces == 1) {
- ObjTokeiStep_SpawnDust(this2, panel, play);
- ObjTokeiStep_AddQuake(this2, play);
+ ObjTokeiStep_SpawnDust(this, panel, play);
+ ObjTokeiStep_RequestQuakeAndRumble(this, play);
}
}
}
@@ -195,7 +195,7 @@ void ObjTokeiStep_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
- if ((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0)) {
+ if ((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &gClocktowerPanelCol);
ObjTokeiStep_InitSteps(this);
ObjTokeiStep_SetupBeginOpen(this);
@@ -221,12 +221,12 @@ void ObjTokeiStep_SetupBeginOpen(ObjTokeiStep* this) {
}
void ObjTokeiStep_BeginOpen(ObjTokeiStep* this, PlayState* play) {
- CsCmdActorAction* action;
+ CsCmdActorCue* cue;
- if (Cutscene_CheckActorAction(play, 134)) {
- action = play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 134)];
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_134)) {
+ cue = play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_134)];
- if ((action->startFrame == play->csCtx.frames) && (action->action != 0)) {
+ if ((cue->startFrame == play->csCtx.curFrame) && (cue->id != 0)) {
this->dyna.actor.draw = ObjTokeiStep_DrawOpen;
ObjTokeiStep_SetupOpen(this);
}
@@ -247,7 +247,7 @@ void ObjTokeiStep_SetupOpen(ObjTokeiStep* this) {
void ObjTokeiStep_Open(ObjTokeiStep* this, PlayState* play) {
if (ObjTokeiStep_OpenProcess(this, play)) {
- func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
ObjTokeiStep_SetupDoNothingOpen(this);
}
}
@@ -279,8 +279,9 @@ void ObjTokeiStep_DrawOpen(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 0x19]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
@@ -289,5 +290,6 @@ void ObjTokeiStep_DrawOpen(Actor* thisx, PlayState* play) {
gSPDisplayList(gfx++, gClocktowerPanelDL);
}
POLY_OPA_DISP = gfx;
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
index 3dc8b3297..21fe5f572 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
+++ b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.c
@@ -72,7 +72,7 @@ void ObjTokeiTurret_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
gfx = POLY_OPA_DISP;
- gSPDisplayList(gfx++, &sSetupDL[6 * 25]);
+ gSPDisplayList(gfx++, gSetupDLs[SETUPDL_25]);
gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(gfx++, gClockTownTurretPlatformTopDL);
POLY_OPA_DISP = gfx;
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
index 620228f53..4ebde38ad 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
+++ b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
@@ -7,7 +7,7 @@
typedef enum {
/* 0 */ TURRET_TIER_BASE,
- /* 1 */ TURRET_TIER_TOP,
+ /* 1 */ TURRET_TIER_TOP
} TurretTierType;
struct ObjTokeiTurret;
diff --git a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
index a61fb6f64..61fa2376f 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
@@ -121,10 +121,10 @@ void ObjTokeidai_ExteriorGear_Init(ObjTokeidai* this, PlayState* play) {
this->opaDList = gClockTowerExteriorGearDL;
ObjTokeidai_SetupClockOrExteriorGear(this);
- if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0)) ||
- ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0))) {
+ if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
+ ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
ObjTokeidai_SetupTowerOpening(this);
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->actionFunc = ObjTokeidai_ExteriorGear_OpenedIdle;
this->actor.world.pos.y += this->actor.scale.y * 1900.0f;
this->actor.shape.yOffset = 1500.0f;
@@ -138,10 +138,10 @@ void ObjTokeidai_TowerClock_Init(ObjTokeidai* this, PlayState* play) {
this->actor.draw = ObjTokeidai_Clock_Draw;
ObjTokeidai_Clock_Init(this);
- if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0)) ||
- ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0))) {
+ if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
+ ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
ObjTokeidai_SetupTowerOpening(this);
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->actor.world.pos.y += (this->actor.scale.y * 5191.0f) - 50.0f;
this->actor.world.pos.x += Math_SinS(this->actor.world.rot.y) * this->actor.scale.z * 1791.0f;
this->actor.world.pos.z += -Math_CosS(this->actor.world.rot.y) * this->actor.scale.z * 1791.0f;
@@ -171,15 +171,15 @@ void ObjTokeidai_Counterweight_Init(ObjTokeidai* this, PlayState* play) {
this->spotlightIntensity = 0;
}
- if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0)) ||
- ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.currentCsIndex == 0))) {
+ if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
+ ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
this->spotlightIntensity = 0;
ObjTokeidai_SetupTowerOpening(this);
if (this->actor.child == NULL) {
type = OBJ_TOKEIDAI_TYPE(&this->actor);
- if (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN ||
- type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD) {
+ if ((type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN) ||
+ (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD)) {
this->actor.child = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HANABI, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
@@ -192,7 +192,7 @@ void ObjTokeidai_Counterweight_Init(ObjTokeidai* this, PlayState* play) {
this->actor.child->home.rot.x = 0x12C;
}
}
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->spotlightIntensity = 0;
this->actor.world.pos.y += this->actor.scale.y * -2160.0f;
this->actor.world.pos.x += Math_SinS(this->actor.world.rot.y) * this->actor.scale.z * 5400.0f;
@@ -274,6 +274,9 @@ void ObjTokeidai_Init(Actor* thisx, PlayState* play) {
this->xluDList = gClockTowerEmptyDL;
this->actionFunc = ObjTokeidai_StaircaseToRooftop_Idle;
break;
+
+ default:
+ break;
}
}
@@ -284,7 +287,7 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
s32 currentClockMinute = GET_CURRENT_CLOCK_MINUTE(this);
if (currentClockMinute != this->clockMinute) {
- if (this->minuteRingOrExteriorGearRotationTimer == 8 && playSfx) {
+ if ((this->minuteRingOrExteriorGearRotationTimer == 8) && playSfx) {
Actor_PlaySfx(&this->actor, NA_SE_EV_CLOCK_TOWER_SECOND_HAND);
}
@@ -306,8 +309,8 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
this->minuteRingOrExteriorGearRotationTimer++;
- if ((currentClockMinute == 15 && this->minuteRingOrExteriorGearRotation < 0) ||
- (currentClockMinute != 15 &&
+ if (((currentClockMinute == 15) && (this->minuteRingOrExteriorGearRotation < 0)) ||
+ ((currentClockMinute != 15) &&
this->minuteRingOrExteriorGearRotation > GET_MINUTE_RING_OR_EXTERIOR_GEAR_ROTATION(currentClockMinute))) {
this->minuteRingOrExteriorGearRotation = GET_MINUTE_RING_OR_EXTERIOR_GEAR_ROTATION(currentClockMinute);
this->clockMinute = currentClockMinute;
@@ -318,19 +321,19 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
}
void ObjTokeidai_ExteriorGear_Collapse(ObjTokeidai* this, PlayState* play) {
- if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || this->actor.world.pos.y < 0.0f) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.world.pos.y < 0.0f)) {
this->actionFunc = ObjTokeidai_DoNothing;
} else {
this->actor.shape.rot.x += 0x50;
this->actor.shape.rot.z += 0x50;
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, 4);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
}
void ObjTokeidai_ExteriorGear_OpenedIdle(ObjTokeidai* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 132) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 2) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 2) {
this->actionFunc = ObjTokeidai_ExteriorGear_Collapse;
this->actor.speed = this->actor.scale.y * 5.0f;
this->actor.velocity.y = 0.0f;
@@ -397,8 +400,8 @@ void ObjTokeidai_TowerClock_SlideOff(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_TowerClock_OpenedIdle(ObjTokeidai* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 132) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 1)) {
this->actionFunc = ObjTokeidai_TowerClock_SlideOff;
this->slidingClockFaceAngle = 0;
this->aerialClockFaceSpeed = -0xD;
@@ -415,8 +418,8 @@ void ObjTokeidai_Counterweight_Collapse(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_Counterweight_OpenedIdle(ObjTokeidai* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 132) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 3) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 3)) {
this->actionFunc = ObjTokeidai_Counterweight_Collapse;
this->xRotation = 0;
this->actor.velocity.y = 0.0f;
@@ -432,22 +435,20 @@ void ObjTokeidai_TerminaFieldWalls_Collapse(ObjTokeidai* this, PlayState* play)
}
void ObjTokeidai_TerminaFieldWalls_Idle(ObjTokeidai* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 132) != 0 &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 1) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 1)) {
this->actionFunc = ObjTokeidai_TerminaFieldWalls_Collapse;
}
}
void ObjTokeidai_TowerOpening_EndCutscene(ObjTokeidai* this, PlayState* play) {
- if (Cutscene_CheckActorAction(play, 132) != 0 &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 5) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 5)) {
SET_WEEKEVENTREG(WEEKEVENTREG_08_40);
- if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) &&
- (play->csCtx.currentCsIndex == 0)) ||
- ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) &&
- (play->csCtx.currentCsIndex == 0))) {
+ if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
+ ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
Audio_SetCutsceneFlag(false);
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
gSaveContext.nextCutsceneIndex = 0;
gSaveContext.respawnFlag = 2;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -515,6 +516,9 @@ void ObjTokeidai_TowerOpening_DropCounterweight(ObjTokeidai* this, PlayState* pl
case 2:
Actor_PlaySfx(&this->actor, NA_SE_EV_CLOCK_TOWER_BOUND_2);
break;
+
+ default:
+ break;
}
this->boundCount++;
@@ -587,8 +591,8 @@ void ObjTokeidai_TowerOpening_RaiseTower(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_TowerOpening_Start(ObjTokeidai* this, PlayState* play) {
- if ((Cutscene_CheckActorAction(play, 132) &&
- play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 132)]->action == 4) ||
+ if ((Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_132) &&
+ (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_132)]->id == 4)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
this->actionFunc = ObjTokeidai_TowerOpening_RaiseTower;
}
@@ -611,7 +615,7 @@ void ObjTokeidai_DoNothing(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_StaircaseToRooftop_Idle(ObjTokeidai* this, PlayState* play) {
- if ((((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || CURRENT_DAY >= 4) ||
+ if ((((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
this->actor.draw = ObjTokeidai_Draw;
} else {
@@ -620,10 +624,10 @@ void ObjTokeidai_StaircaseToRooftop_Idle(ObjTokeidai* this, PlayState* play) {
}
s32 ObjTokeidai_IsPostFirstCycleFinalHours(ObjTokeidai* this, PlayState* play) {
- if (gSaveContext.save.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
return false;
}
- if (CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
ObjTokeidai_SetupTowerOpening(this);
return true;
}
@@ -652,8 +656,8 @@ void ObjTokeidai_RotateOnHourChange(ObjTokeidai* this, PlayState* play) {
this->clockFaceRotationTimer++;
- if ((currentClockHour == 12 && this->clockFaceRotation < 0) ||
- (currentClockHour != 12 && this->clockFaceRotation > GET_CLOCK_FACE_ROTATION(currentClockHour))) {
+ if (((currentClockHour == 12) && (this->clockFaceRotation < 0)) ||
+ ((currentClockHour != 12) && (this->clockFaceRotation > GET_CLOCK_FACE_ROTATION(currentClockHour)))) {
this->clockFaceRotation = GET_CLOCK_FACE_ROTATION(currentClockHour);
this->clockHour = currentClockHour;
this->clockFaceRotationalVelocity = 0;
@@ -684,21 +688,21 @@ void ObjTokeidai_RotateOnHourChange(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
- if (CURRENT_DAY == 3 && this->clockHour < 6 && gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY == 3) && (this->clockHour < 6) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
this->actor.draw = ObjTokeidai_Clock_Draw;
ObjTokeidai_SetupTowerOpening(this);
SET_WEEKEVENTREG(WEEKEVENTREG_08_40);
return;
}
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
this->actor.home.rot.x = 1;
this->clockTime += 3;
this->actor.draw = ObjTokeidai_Clock_Draw;
} else {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
- OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_TOWER_CLOCK_TERMINA_FIELD &&
- ActorCutscene_GetCurrentIndex() == -1) {
+ (OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_TOWER_CLOCK_TERMINA_FIELD) &&
+ (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
this->actor.draw = NULL;
}
this->clockTime = gSaveContext.save.time;
@@ -708,7 +712,7 @@ void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
}
}
- if (CURRENT_DAY != 3 || gSaveContext.save.time >= CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY != 3) || (gSaveContext.save.time >= CLOCK_TIME(6, 0))) {
ObjTokeidai_RotateOnMinuteChange(this, true);
}
ObjTokeidai_RotateOnHourChange(this, play);
@@ -724,14 +728,14 @@ void ObjTokeidai_ExteriorGear_Idle(ObjTokeidai* this, PlayState* play) {
if (ObjTokeidai_IsPostFirstCycleFinalHours(this, play)) {
this->actor.draw = ObjTokeidai_ExteriorGear_Draw;
} else {
- if (play->csCtx.state != 0) {
+ if (play->csCtx.state != CS_STATE_IDLE) {
this->actor.home.rot.x = 1;
this->clockTime += 3;
this->actor.draw = ObjTokeidai_ExteriorGear_Draw;
} else {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
(OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_EXTERIOR_GEAR_TERMINA_FIELD) &&
- (ActorCutscene_GetCurrentIndex() == -1)) {
+ (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
this->actor.draw = NULL;
}
this->clockTime = gSaveContext.save.time;
@@ -752,8 +756,8 @@ void ObjTokeidai_Counterweight_Idle(ObjTokeidai* this, PlayState* play) {
if (this->actor.child == NULL) {
type = OBJ_TOKEIDAI_TYPE(&this->actor);
- if (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN ||
- type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD) {
+ if ((type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN) ||
+ (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD)) {
this->actor.child = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HANABI, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
@@ -793,13 +797,13 @@ void ObjTokeidai_Draw(Actor* thisx, PlayState* play) {
if (this->opaDList != NULL) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
}
if (this->xluDList != NULL) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
}
@@ -811,7 +815,7 @@ void ObjTokeidai_Clock_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(0.0f, this->yTranslation, 0.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, -1791.0f, MTXMODE_APPLY);
Matrix_RotateXS(-this->xRotation, MTXMODE_APPLY);
@@ -864,12 +868,12 @@ void ObjTokeidai_Counterweight_Draw(Actor* thisx, PlayState* play) {
// Draws the counterweight
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
// Draws the spotlight
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 255, 255, 235, 180, (s32)(this->spotlightIntensity * 2.55f));
gSPDisplayList(POLY_XLU_DISP++, this->xluDList);
@@ -889,7 +893,7 @@ void ObjTokeidai_ExteriorGear_Draw(Actor* thisx, PlayState* play) {
Matrix_Translate(0.0f, 0.0f, 1791.0f, MTXMODE_APPLY);
Matrix_RotateZS(this->minuteRingOrExteriorGearRotation, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, gClockTowerExteriorGearDL);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
index e670d19e0..43f424ceb 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
@@ -16,7 +16,7 @@ typedef enum {
/* 8 */ OBJ_TOKEIDAI_TYPE_TOWER_WALLS_TERMINA_FIELD = 8,
/* 9 */ OBJ_TOKEIDAI_TYPE_WALL_CLOCK,
/* 10 */ OBJ_TOKEIDAI_TYPE_SMALL_WALL_CLOCK,
- /* 11 */ OBJ_TOKEIDAI_TYPE_STAIRCASE_TO_ROOFTOP,
+ /* 11 */ OBJ_TOKEIDAI_TYPE_STAIRCASE_TO_ROOFTOP
} ObjTokeidaiType;
struct ObjTokeidai;
diff --git a/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c b/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
index 07561b8cd..b2b5e0314 100644
--- a/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
+++ b/src/overlays/actors/ovl_Obj_Toudai/z_obj_toudai.c
@@ -36,7 +36,7 @@ void func_80A33B00(ObjToudai* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_f53_obj_DL_0024E8);
@@ -67,7 +67,7 @@ void func_80A33BB4(ObjToudai* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, sp57, 0x20, 0x80, 1, 0, sp56, 0x20, 0x20));
diff --git a/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c b/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
index 6009affe4..4c30a763e 100644
--- a/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
+++ b/src/overlays/actors/ovl_Obj_Tree/z_obj_tree.c
@@ -99,7 +99,7 @@ void ObjTree_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.uncullZoneForward = 4000.0f;
} else {
Actor_SetScale(&this->dyna.actor, 0.1f);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
CollisionHeader_GetVirtual(&object_tree_Colheader_001B2C, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
}
@@ -185,7 +185,7 @@ void ObjTree_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_tree_DL_000680);
diff --git a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
index 99b7e3532..9b8baa861 100644
--- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
+++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
@@ -10,7 +10,7 @@
#include "objects/object_tsubo/object_tsubo.h"
#include "objects/object_racetsubo/object_racetsubo.h"
-#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_800000 | ACTOR_FLAG_4000000)
+#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_800000 | ACTOR_FLAG_CAN_PRESS_SWITCH)
#define THIS ((ObjTsubo*)thisx)
@@ -63,8 +63,7 @@ typedef struct {
/* 0x14 */ ObjTsuboUnkFunc breakPot1;
/* 0x18 */ ObjTsuboUnkFunc breakPot2;
/* 0x1C */ ObjTsuboUnkFunc breakPot3;
-
-} ObjTsuboData;
+} ObjTsuboData; // size = 0x20
ObjTsuboData sPotTypeData[4] = {
{ GAMEPLAY_DANGEON_KEEP, 0.197f, gameplay_dangeon_keep_DL_017EA0, gameplay_dangeon_keep_DL_018090, 12, 32,
@@ -431,7 +430,7 @@ void func_80928914(ObjTsubo* this) {
void func_80928928(ObjTsubo* this, PlayState* play) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0x44);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
if (Object_IsLoaded(&play->objectCtx, this->objBankIndex)) {
this->actor.objBankIndex = this->objBankIndex;
func_809289B4(this);
@@ -493,7 +492,8 @@ void func_809289E4(ObjTsubo* this, PlayState* play) {
} else {
if (!this->unk_195) {
Actor_MoveWithGravity(&this->actor);
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0x44);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40);
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId) == NULL)) {
this->unk_195 = true;
@@ -531,8 +531,10 @@ void func_80928D80(ObjTsubo* this, PlayState* play) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.room = play->roomCtx.curRoom.num;
Actor_MoveWithGravity(&this->actor);
- this->actor.flags &= ~ACTOR_FLAG_4000000;
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0xC5);
+ this->actor.flags &= ~ACTOR_FLAG_CAN_PRESS_SWITCH;
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
func_80928E74(this);
} else {
pos.x = this->actor.world.pos.x;
@@ -605,7 +607,9 @@ void func_80928F18(ObjTsubo* this, PlayState* play) {
Math_StepToS(&D_8092950C, D_80929508, 150);
this->actor.shape.rot.x += D_80929504;
this->actor.shape.rot.y += D_8092950C;
- Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f, 0xC5);
+ Actor_UpdateBgCheckInfo(play, &this->actor, 15.0f, 15.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_40 |
+ UPDBGCHECKINFO_FLAG_80);
Collider_UpdateCylinder(&this->actor, &this->cylinderCollider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->cylinderCollider.base);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->cylinderCollider.base);
@@ -642,7 +646,7 @@ void func_8092926C(ObjTsubo* this, PlayState* play) {
} else {
scale = sPotTypeData[OBJ_TSUBO_GET_TYPE(&this->actor)].scale;
if (Math_StepToF(&this->actor.scale.x, scale, scale * 0.1f)) {
- this->actor.flags |= ACTOR_FLAG_4000000;
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
func_809289B4(this);
}
this->actor.scale.z = this->actor.scale.y = this->actor.scale.x;
diff --git a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
index f06d13caf..a6085ef51 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_um.h"
+#include "z64horse.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -14,7 +15,7 @@
/**
* weekEventReg flags checked by this actor:
- * - WEEKEVENTREG_22_01: Aliens defeated
+ * - WEEKEVENTREG_DEFENDED_AGAINST_THEM: Aliens defeated
* If false: The actor doesn't spawn
* - WEEKEVENTREG_31_40
* If true: Cremia doesn't explain again she'll deliever milk to town
@@ -22,7 +23,7 @@
* If true: Triggers cutscene on Romani's Ranch
* - WEEKEVENTREG_34_80
* If true: Doesn't spawn on Romani's Ranch
- * - WEEKEVENTREG_52_01
+ * - WEEKEVENTREG_ESCORTED_CREMIA
* If true: Doesn't spawn on Romani's Ranch or Milk Road
* - WEEKEVENTREG_52_02
* If true: Doesn't spawn on Romani's Ranch or Milk Road
@@ -36,7 +37,7 @@
* Player accepts the ride and is with Cremia during the Milk Run
* - WEEKEVENTREG_34_80: Cremia does Milk Run alone
* Player didn't interact or didn't accept the ride
- * - WEEKEVENTREG_52_01: Won Milk Run minigame
+ * - WEEKEVENTREG_ESCORTED_CREMIA: Won Milk Run minigame
* At least one pot is safe. Turns off the "Lose Milk Run minigame"
* - WEEKEVENTREG_52_02: Lose Milk Run minigame
* Every pot was broken by bandits. Turns off the "Win Milk Run minigame"
@@ -46,7 +47,7 @@
* weekEventReg flags unset by this actor:
* - WEEKEVENTREG_31_80
* Turned off when the Milk Run finishes
- * - WEEKEVENTREG_52_01
+ * - WEEKEVENTREG_ESCORTED_CREMIA
* Turned off if Player lose the Milk Run
* - WEEKEVENTREG_52_02
* Turned off if Player wins the Milk Run
@@ -303,7 +304,7 @@ s32 func_80B781DC(ObjUm* this, EnHorse* bandit1, EnHorse* bandit2, PlayState* pl
if (bandit1->unk_550 == D_80B7C164[i].unk_00) {
if (bandit2->unk_550 != D_80B7C164[i].unk_04) {
if (D_80B7C164[i].unk_00 != 3) {
- if (D_80B7C164[i].unk_04 != 3 ||
+ if ((D_80B7C164[i].unk_04 != 3) ||
((mask = Player_GetMask(play)), PLAYER_MASK_CIRCUS_LEADER != mask)) {
phi_s3 = D_80B7C164[i].unk_04;
phi_s4 = D_80B7C164[i].unk_08;
@@ -454,13 +455,13 @@ s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandi
}
if (this->potsLife[1] != 1) {
- if ((potIndex == -1) || (potIndex == 0 && Rand_ZeroOne() < 0.3f)) {
+ if ((potIndex == -1) || ((potIndex == 0) && (Rand_ZeroOne() < 0.3f))) {
potIndex = 1;
}
}
if (this->potsLife[2] != 1) {
- if ((potIndex == -1) || (potIndex != -1 && Rand_ZeroOne() < 0.3f)) {
+ if ((potIndex == -1) || ((potIndex != -1) && (Rand_ZeroOne() < 0.3f))) {
potIndex = 2;
}
}
@@ -496,8 +497,6 @@ s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandi
phi_v1_5 = Math_Vec3f_Yaw(&bandit1->actor.prevPos, &bandit1->actor.world.pos);
}
- if (1) {}
-
phi_v1_5 -= bandit1->actor.shape.rot.y;
if (phi_v1_5 > 0x190) {
bandit1->actor.shape.rot.y += 0x190;
@@ -620,13 +619,13 @@ void func_80B78EBC(ObjUm* this, PlayState* play) {
player->actor.focus.rot.z = 0;
player->actor.focus.rot.y = player->actor.shape.rot.y;
- player->unk_AAC.x = 0;
- player->unk_AAC.y = 0;
- player->unk_AAC.z = 0;
+ player->headLimbRot.x = 0;
+ player->headLimbRot.y = 0;
+ player->headLimbRot.z = 0;
- player->unk_AB2.x = 0;
- player->unk_AB2.y = 0;
- player->unk_AB2.z = 0;
+ player->upperLimbRot.x = 0;
+ player->upperLimbRot.y = 0;
+ player->upperLimbRot.z = 0;
player->currentYaw = player->actor.focus.rot.y;
}
@@ -683,7 +682,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->initialPathIndex = OBJ_UM_GET_PATH_INDEX(thisx);
// if (!AliensDefeated)
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -703,7 +702,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
// Waiting for player
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_80) || (gSaveContext.save.time >= CLOCK_TIME(19, 0)) ||
- (gSaveContext.save.time <= CLOCK_TIME(6, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
Actor_Kill(&this->dyna.actor);
return;
@@ -714,7 +713,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
ObjUm_SetupAction(this, ObjUm_RanchWait);
}
} else if (this->type == OBJ_UM_TYPE_PRE_MILK_RUN) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -740,7 +739,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->unk_354 = 0;
ObjUm_RotatePlayer(this, play, 0);
} else if (this->type == OBJ_UM_TYPE_POST_MILK_RUN) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) || CHECK_WEEKEVENTREG(WEEKEVENTREG_59_02)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) || CHECK_WEEKEVENTREG(WEEKEVENTREG_59_02)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -763,7 +762,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_um_Colheader_007E20);
} else {
- DynaPolyActor_Init(&this->dyna, 3);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y);
DynaPolyActor_LoadMesh(play, &this->dyna, &object_um_Colheader_007F50);
}
@@ -772,7 +771,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
return;
}
- func_800C636C(play, &play->colCtx.dyna, this->dyna.bgId);
+ DynaPoly_DisableCeilingCollision(play, &play->colCtx.dyna, this->dyna.bgId);
this->donkey =
(EnHorse*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, this->dyna.actor.world.pos.x,
@@ -835,7 +834,7 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_31_80);
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 11);
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
@@ -844,7 +843,7 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
} else {
Actor_ContinueText(play, &this->dyna.actor, 0x33B5);
func_8019F230();
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
phi_v1 = false;
}
break;
@@ -878,6 +877,9 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
Actor_ContinueText(play, &this->dyna.actor, 0x33BC);
phi_v1 = false;
break;
+
+ default:
+ break;
}
return phi_v1;
@@ -899,6 +901,9 @@ s32 func_80B79734(PlayState* play, ObjUm* this, s32 arg2) {
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1030,7 +1035,7 @@ typedef enum ObjUmPathState {
/* 1 */ OBJUM_PATH_STATE_1,
/* 2 */ OBJUM_PATH_STATE_FINISH,
/* 3 */ OBJUM_PATH_STATE_3,
- /* 4 */ OBJUM_PATH_STATE_4,
+ /* 4 */ OBJUM_PATH_STATE_4
} ObjUmPathState;
ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
@@ -1093,9 +1098,7 @@ ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
if (this->donkey != NULL) {
this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp50);
- func_800F415C(&this->donkey->actor, &sp50, 0x190);
-
- if (1) {}
+ Horse_RotateToPoint(&this->donkey->actor, &sp50, 0x190);
yawDiff = this->donkey->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
if (fabsf(yawDiff) < 2730.0f) {
@@ -1139,7 +1142,7 @@ void ObjUm_RanchWaitPathFinished(ObjUm* this, PlayState* play) {
case OBJUM_PATH_STATE_1:
case OBJUM_PATH_STATE_FINISH:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80)) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
play->nextEntrance = ENTRANCE(MILK_ROAD, 5);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
@@ -1158,12 +1161,12 @@ void ObjUm_RanchWaitPathFinished(ObjUm* this, PlayState* play) {
void ObjUm_RanchStartCs(ObjUm* this, PlayState* play) {
ObjUm_ChangeAnim(this, play, OBJ_UM_ANIM_IDLE);
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->lastTime = gSaveContext.save.time;
ObjUm_SetupAction(this, func_80B7A0E0);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -1276,12 +1279,12 @@ void ObjUm_PreMilkRunStartCs(ObjUm* this, PlayState* play) {
ObjUm_SetPlayerPosition(this, play);
this->flags |= OBJ_UM_FLAG_0004;
player->stateFlags1 |= PLAYER_STATE1_20;
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->lastTime = gSaveContext.save.time;
ObjUm_SetupAction(this, func_80B7A394);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -1299,13 +1302,13 @@ void ObjUm_RunMinigame(ObjUm* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_31_80);
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
if (!this->areAllPotsBroken) {
play->nextEntrance = ENTRANCE(MILK_ROAD, 6);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
- SET_WEEKEVENTREG(WEEKEVENTREG_52_01);
+ SET_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_52_02);
} else {
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 8);
@@ -1313,7 +1316,7 @@ void ObjUm_RunMinigame(ObjUm* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_52_02);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_52_01);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA);
}
}
break;
@@ -1335,7 +1338,7 @@ void func_80B7A614(ObjUm* this, PlayState* play) {
this->flags |= OBJ_UM_FLAG_PLAYING_MINIGAME;
ObjUm_ChangeAnim(this, play, OBJ_UM_ANIM_GALLOP);
- if (ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_3 && this->unk_4DC == 0) {
+ if ((ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_3) && (this->unk_4DC == 0)) {
this->unk_4DC = 1;
} else if (this->unk_4DC > 0) {
if (this->unk_4DC == 1) {
@@ -1357,17 +1360,17 @@ void func_80B7A614(ObjUm* this, PlayState* play) {
}
if (this->flags & OBJ_UM_FLAG_MINIGAME_FINISHED) {
- s32 sp20 = ActorCutscene_GetAdditionalCutscene(this->dyna.actor.cutscene);
+ s32 csId = CutsceneManager_GetAdditionalCsId(this->dyna.actor.csId);
if (this->areAllPotsBroken) {
- sp20 = ActorCutscene_GetAdditionalCutscene(sp20);
+ csId = CutsceneManager_GetAdditionalCsId(csId);
}
- if (ActorCutscene_GetCanPlayNext(sp20)) {
- ActorCutscene_StartAndSetUnkLinkFields(sp20, &this->dyna.actor);
+ if (CutsceneManager_IsNext(csId)) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
ObjUm_SetupAction(this, ObjUm_RunMinigame);
this->flags &= ~OBJ_UM_FLAG_PLAYING_MINIGAME;
} else {
- ActorCutscene_SetIntentToPlay(sp20);
+ CutsceneManager_Queue(csId);
}
}
@@ -1396,14 +1399,14 @@ void func_80B7A860(ObjUm* this, PlayState* play) {
ObjUm_RotatePlayer(this, play, 0);
this->flags |= OBJ_UM_FLAG_0004;
- if (play->csCtx.frames == 449) {
+ if (play->csCtx.curFrame == 449) {
ObjUm_InitBandits(this, play);
- } else if (play->csCtx.frames >= 450) {
+ } else if (play->csCtx.curFrame >= 450) {
func_80B78DF0(this, play);
}
- if (play->csCtx.state == 0) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ CutsceneManager_Stop(this->dyna.actor.csId);
ObjUm_SetupAction(this, func_80B7A7AC);
}
@@ -1470,7 +1473,7 @@ void func_80B7A860(ObjUm* this, PlayState* play) {
case 0x33BF:
this->unk_4D8++;
- if ((fabsf(this->skelAnime.morphWeight) < 0.008f) && this->unk_4D8 >= 6) {
+ if ((fabsf(this->skelAnime.morphWeight) < 0.008f) && (this->unk_4D8 >= 6)) {
this->unk_4CC = 0;
this->mouthTexIndex = 0;
} else {
@@ -1526,12 +1529,12 @@ void ObjUm_StartCs(ObjUm* this, PlayState* play) {
ObjUm_RotatePlayer(this, play, 0);
this->flags |= OBJ_UM_FLAG_0004;
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
this->lastTime = gSaveContext.save.time;
ObjUm_SetupAction(this, func_80B7ABE4);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -1546,7 +1549,7 @@ void ObjUm_PostMilkRunWaitPathFinished(ObjUm* this, PlayState* play) {
ObjUm_ChangeAnim(this, play, OBJ_UM_ANIM_TROT);
if ((ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_4) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_59_02)) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Audio_SetCutsceneFlag(false);
SET_WEEKEVENTREG(WEEKEVENTREG_59_02);
gSaveContext.nextCutsceneIndex = 0xFFF3;
@@ -1568,11 +1571,11 @@ void ObjUm_PostMilkRunStartCs(ObjUm* this, PlayState* play) {
this->flags |= OBJ_UM_FLAG_0004;
ObjUm_ChangeAnim(this, play, OBJ_UM_ANIM_IDLE);
- if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if (CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ObjUm_SetupAction(this, ObjUm_PostMilkRunWaitPathFinished);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
}
@@ -1631,9 +1634,9 @@ void ObjUm_DefaultAnim(ObjUm* this, PlayState* play) {
}
typedef struct {
- /* 0x00 */ AnimationHeader* anim;
- /* 0x04 */ s32 doesMove; // `true` if the animation is intended to be used while the actor is moving
-} struct_80B7C25C; // size = 0x08
+ /* 0x0 */ AnimationHeader* anim;
+ /* 0x4 */ s32 doesMove; // `true` if the animation is intended to be used while the actor is moving
+} struct_80B7C25C; // size = 0x8
struct_80B7C25C sUmAnims[] = {
{ &gUmTrotAnim, true }, // OBJ_UM_ANIM_TROT
@@ -1700,7 +1703,7 @@ void ObjUm_ChangeAnim(ObjUm* this, PlayState* play, ObjUmAnimation animIndex) {
}
}
- if (this->wheelRot / 0x199A != this->unk_420) {
+ if ((this->wheelRot / 0x199A) != this->unk_420) {
this->unk_420 = this->wheelRot / 0x199A;
//! FAKE
if (sUmAnims[0].doesMove) {}
@@ -1713,7 +1716,8 @@ void ObjUm_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
this->unk_350++;
- Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 0x1C);
+ Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f,
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
if (this->donkey != NULL) {
this->donkey->actor.world.pos.x = this->dyna.actor.world.pos.x;
@@ -1766,18 +1770,23 @@ void ObjUm_Update(Actor* thisx, PlayState* play) {
case 1:
this->eyeTexIndex = 3;
break;
+
case 2:
this->eyeTexIndex = 4;
break;
+
case 3:
this->eyeTexIndex = 5;
break;
+
case 4:
this->eyeTexIndex = 2;
break;
+
case 5:
this->eyeTexIndex = 0;
break;
+
default:
this->unk_4CC = 0;
this->eyeTexIndex = 0;
@@ -1911,6 +1920,7 @@ void ObjUm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
sp80.x = 0;
sp80.z = 0;
sp88.x = 6800.0f;
+
OPEN_DISPS(gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->potsLife); i++) {
@@ -1996,7 +2006,7 @@ void func_80B7BEA4(Vec3f* cartBedPos, s16 arg1, Vec3f* arg2, u8 alpha, PlayState
OPEN_DISPS(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ POLY_OPA_DISP = Gfx_SetupDL(POLY_OPA_DISP, SETUPDL_44);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
gSPMatrix(POLY_OPA_DISP++, sp100, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSquareShadowDL);
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 d527e4937..23e6eb0ac 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
@@ -45,9 +45,9 @@ s32 func_80C07C80(s32 arg0) {
s32 var_v1;
if (!(arg0 & 1)) {
- var_v1 = gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF;
+ var_v1 = gSaveContext.save.saveInfo.unk_E64[arg0 >> 1] & 0xFFFF;
} else {
- var_v1 = (gSaveContext.save.unk_E88[arg0 >> 1] & 0xFFFF0000) >> 0x10;
+ var_v1 = (gSaveContext.save.saveInfo.unk_E64[arg0 >> 1] & 0xFFFF0000) >> 0x10;
}
return var_v1 + CLOCK_TIME(2, 30);
}
@@ -80,7 +80,7 @@ s32 func_80C07CD0(void) {
}
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
return true;
@@ -172,18 +172,18 @@ void func_80C081C8(ObjUsiyane* this, PlayState* play) {
}
void func_80C082CC(ObjUsiyane* this, PlayState* play) {
- this->unk_164 = -1;
+ this->cueId = -1;
}
void func_80C082E0(ObjUsiyane* this, PlayState* play) {
- CsCmdActorAction* csAction;
+ CsCmdActorCue* cue;
- 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) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_552)) {
+ this->cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_552);
+ cue = play->csCtx.actorCues[this->cueChannel];
+ if (this->cueId != cue->id) {
+ this->cueId = cue->id;
+ if (this->cueId == 2) {
func_80C07F30(this, play);
this->actionFunc = func_80C081C8;
}
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 2abc2a38b..b6ed8d0df 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
@@ -9,10 +9,10 @@ typedef void (*ObjUsiyaneActionFunc)(struct ObjUsiyane*, PlayState*);
#define OBJUSIYANE_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJUSIYANE_F_0,
- /* 1 */ OBJUSIYANE_F_1,
-};
+ /* 1 */ OBJUSIYANE_F_1
+} ObjUsiyaneParam;
typedef struct {
/* 0x00 */ Vec3f unk_00;
@@ -24,8 +24,8 @@ typedef struct {
typedef struct ObjUsiyane {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ ObjUsiyaneActionFunc actionFunc;
- /* 0x160 */ s32 unk_160;
- /* 0x164 */ s32 unk_164;
+ /* 0x160 */ s32 cueChannel;
+ /* 0x164 */ s32 cueId;
/* 0x168 */ ObjUsiyaneStruct unk_168[10][4];
/* 0x708 */ f32 unk_708;
/* 0x70C */ f32 unk_70C;
diff --git a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
index 257e9eb79..793838c8b 100644
--- a/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
+++ b/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.c
@@ -435,7 +435,7 @@ void func_80A3D2C0(Actor* thisx, PlayState* play) {
sp3C.y = this->dyna.actor.shape.rot.y;
sp3C.z = this->dyna.actor.shape.rot.z + 0x4000;
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 60.0f, this->dyna.actor.world.pos.z,
MTXMODE_NEW);
Matrix_RotateYS(sp3C.y, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
index 905002784..cc47113a5 100644
--- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
+++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
@@ -97,19 +97,19 @@ s32 ObjWarpstone_ClosedIdle(ObjWarpstone* this, PlayState* play) {
}
s32 ObjWarpstone_BeginOpeningCutscene(ObjWarpstone* this, PlayState* play) {
- if (this->dyna.actor.cutscene < 0 || ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
- ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ if ((this->dyna.actor.csId <= CS_ID_NONE) || CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ObjWarpstone_SetupAction(this, ObjWarpstone_PlayOpeningCutscene);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_OWL_WARP_SWITCH_ON);
} else {
- ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ CutsceneManager_Queue(this->dyna.actor.csId);
}
return true;
}
s32 ObjWarpstone_PlayOpeningCutscene(ObjWarpstone* this, PlayState* play) {
if (this->openingCSTimer++ >= OBJ_WARPSTONE_TIMER_ACTIVATE_THRESHOLD) {
- ActorCutscene_Stop(this->dyna.actor.cutscene);
+ CutsceneManager_Stop(this->dyna.actor.csId);
Sram_ActivateOwl(OBJ_WARPSTONE_GET_ID(&this->dyna.actor));
ObjWarpstone_SetupAction(this, ObjWarpstone_OpenedIdle);
} else if (this->openingCSTimer < OBJ_WARPSTONE_TIMER_OPEN_THRESHOLD) {
@@ -168,7 +168,8 @@ void ObjWarpstone_Draw(Actor* thisx, PlayState* play2) {
Gfx_DrawDListOpa(play, sOwlStatueDLs[this->modelIndex]);
if (this->dyna.actor.home.rot.x != 0) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 34.0f,
this->dyna.actor.world.pos.z, MTXMODE_NEW);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
@@ -179,13 +180,14 @@ void ObjWarpstone_Draw(Actor* thisx, PlayState* play2) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 128, 128, 255, 255, 200, this->dyna.actor.home.rot.x);
gDPSetEnvColor(POLY_XLU_DISP++, 100, 200, 0, 255);
- Matrix_RotateZF((((play->gameplayFrames * 1500) & 0xFFFF) * M_PI) / 0x8000, MTXMODE_APPLY);
+ Matrix_RotateZF(BINANG_TO_RAD_ALT2((play->gameplayFrames * 1500) & 0xFFFF), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
Matrix_Pop();
- Matrix_RotateZF((~((play->gameplayFrames * 1200) & 0xFFFF) * M_PI) / 0x8000, MTXMODE_APPLY);
+ Matrix_RotateZF(BINANG_TO_RAD_ALT2(~((play->gameplayFrames * 1200) & 0xFFFF)), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.h b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.h
index a2db609d6..241eb825d 100644
--- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.h
+++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.h
@@ -27,6 +27,6 @@ typedef struct ObjWarpstone {
} ObjWarpstone; // size = 0x1B0
#define OBJ_WARPSTONE_GET_ID(thisx) ((u16)((thisx)->params & 0xF))
-#define OBJ_WARPSTONE_IS_ACTIVATED(owlId) (((void)0, gSaveContext.save.playerData.owlActivationFlags) & (u16)gBitFlags[(owlId)])
+#define OBJ_WARPSTONE_IS_ACTIVATED(owlId) (((void)0, gSaveContext.save.saveInfo.playerData.owlActivationFlags) & (u16)gBitFlags[(owlId)])
#endif // Z_OBJ_WARPSTONE_H
diff --git a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c
index 4558a6a75..54ebe8cc7 100644
--- a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c
+++ b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c
@@ -52,15 +52,15 @@ void func_808A7968(ObjWturn* this, PlayState* play) {
}
void func_808A7A24(ObjWturn* this) {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
this->actionFunc = func_808A7A5C;
}
void func_808A7A5C(ObjWturn* this, PlayState* play) {
- if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ if (CutsceneManager_IsNext(this->actor.csId)) {
func_808A7AAC(this, play);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -69,9 +69,9 @@ void func_808A7AAC(ObjWturn* this, PlayState* play) {
Vec3f subCamEye;
Vec3f subCamAt;
- ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
+ CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor);
Play_EnableMotionBlur(140);
- this->subCamId = ActorCutscene_GetCurrentSubCamId(this->actor.cutscene);
+ this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId);
func_800B7298(play, &this->actor, PLAYER_CSMODE_21);
subCamAt.x = player->actor.focus.pos.x;
subCamAt.z = player->actor.focus.pos.z;
diff --git a/src/overlays/actors/ovl_Obj_Y2lift/z_obj_y2lift.c b/src/overlays/actors/ovl_Obj_Y2lift/z_obj_y2lift.c
index 9399940d8..96de17fb0 100644
--- a/src/overlays/actors/ovl_Obj_Y2lift/z_obj_y2lift.c
+++ b/src/overlays/actors/ovl_Obj_Y2lift/z_obj_y2lift.c
@@ -39,7 +39,7 @@ void ObjY2lift_Init(Actor* thisx, PlayState* play) {
ObjY2lift* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
- DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
DynaPolyActor_LoadMesh(play, &this->dyna, &gPirateLiftPlatformCol);
}
@@ -53,13 +53,13 @@ void ObjY2lift_Update(Actor* thisx, PlayState* play) {
ObjY2lift* this = THIS;
f32 temp_fv0 = this->dyna.actor.world.pos.y;
f32 targetVelocityY = 0.0f;
- s32 temp_v0 = DynaPolyActor_IsInRidingMovingState(&this->dyna);
+ s32 isPlayerOnTop = DynaPolyActor_IsPlayerOnTop(&this->dyna);
- if (temp_v0 || DynaPolyActor_IsInRidingFallingState(&this->dyna)) {
+ if (isPlayerOnTop || DynaPolyActor_IsActorOnTop(&this->dyna)) {
if (!this->unk15D) {
this->unk15D = true;
this->unk15F = 12;
- } else if (this->unk15F == 0 && temp_v0) {
+ } else if ((this->unk15F == 0) && isPlayerOnTop) {
this->unk15C = 16;
}
} else {
@@ -68,7 +68,7 @@ void ObjY2lift_Update(Actor* thisx, PlayState* play) {
if (DECR(this->unk15C) != 0) {
temp_fv0 = this->dyna.actor.home.pos.y + 180.0f;
targetVelocityY = 2.0f;
- } else if (!temp_v0 && this->dyna.actor.velocity.y <= 0.0f) {
+ } else if (!isPlayerOnTop && (this->dyna.actor.velocity.y <= 0.0f)) {
temp_fv0 = this->dyna.actor.home.pos.y;
targetVelocityY = -2.0f;
}
diff --git a/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.c b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.c
index 1196cb0be..cea1a4e71 100644
--- a/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.c
+++ b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.c
@@ -105,19 +105,19 @@ void ObjY2shutter_Update(Actor* thisx, PlayState* play) {
if (this->settleTimer == 0) {
if (Flags_GetSwitch(play, OBJY2SHUTTER_GET_SWITCHFLAG(&this->dyna.actor))) {
- s16 cutscene = this->dyna.actor.cutscene;
+ s16 csId = this->dyna.actor.csId;
if (this->openTimer == 0) {
- if ((cutscene >= 0) && !ActorCutscene_GetCanPlayNext(cutscene)) {
- ActorCutscene_SetIntentToPlay(cutscene);
- } else if (cutscene >= 0) {
- ActorCutscene_StartAndSetUnkLinkFields(cutscene, &this->dyna.actor);
+ if ((csId >= 0) && !CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Queue(csId);
+ } else if (csId >= 0) {
+ CutsceneManager_StartWithPlayerCs(csId, &this->dyna.actor);
this->openTimer = -1;
} else {
ObjY2shutter_SetupOpen(this, info, shutterType);
}
} else if (this->openTimer < 0) {
- if (func_800F22C4(cutscene, &this->dyna.actor)) {
+ if (func_800F22C4(csId, &this->dyna.actor) != 0) {
ObjY2shutter_SetupOpen(this, info, shutterType);
}
} else {
diff --git a/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
index bccdce645..a1b32bbe9 100644
--- a/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
+++ b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
@@ -13,8 +13,8 @@ typedef struct ObjY2shutter {
} ObjY2shutter; // size = 0x160
typedef enum {
- /* 0x0 */ SHUTTER_BARRED,
- /* 0x1 */ SHUTTER_GRATED,
+ /* 0 */ SHUTTER_BARRED,
+ /* 1 */ SHUTTER_GRATED
} ShutterType;
#define OBJY2SHUTTER_GET_TYPE(thisx) (((thisx)->params >> 7) & 1)
diff --git a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
index db78f579b..2661b9cc5 100644
--- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
+++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
@@ -517,6 +517,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
}
OPEN_DISPS(play->state.gfxCtx);
+
spB4 = false;
if (this->actor.params == 3) {
@@ -550,7 +551,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
@@ -632,7 +633,7 @@ void func_808DD970(Actor* thisx, PlayState* play2) {
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gEffDust5Tex));
gSPClearGeometryMode(POLY_XLU_DISP++, G_LIGHTING);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG);
@@ -647,8 +648,6 @@ f32 func_808DDE74(void) {
return Rand_ZeroOne() - 0.5f;
}
-#ifdef NON_MATCHING
-// s2/s3 swapped
void func_808DDE9C(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
ObjectKankyo* this = THIS;
@@ -666,7 +665,7 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
if (end) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 150, 255, 255, 25);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
}
for (i = 0; i < end; i++) {
@@ -674,32 +673,30 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = this->unk_14C[0].unk_04 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
temp_f2 = this->unk_14C[0].unk_08 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+
+ gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+
+ Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
+ Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
+
+ if (this->unk_114C == 0) {
+ Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
+ } else {
+ Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
-
- gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
-
- Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
- Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
-
- if (this->unk_114C == 0) {
- Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
- } else {
- Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
- }
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
phi_s5 = false;
if (player->actor.floorHeight < play->view.eye.y) {
for (i = 0; i < end; i++) {
if (!phi_s5) {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 100);
@@ -710,21 +707,17 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = player->actor.floorHeight + 2.0f;
temp_f2 = this->unk_14C[1].unk_08 + (func_808DDE74() * 220.0f);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+ temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
+ Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
- temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
- Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Object_Kankyo/func_808DDE9C.s")
-#endif
diff --git a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
index 731fe6b77..99bcf4191 100644
--- a/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
+++ b/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.c
@@ -160,7 +160,7 @@ void OceffSpot_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
diff --git a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
index 96d76f807..d3486bb0c 100644
--- a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
+++ b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.c
@@ -178,7 +178,7 @@ void OceffStorm_Draw2(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
- POLY_XLU_DISP = func_8012C3A4(POLY_XLU_DISP);
+ POLY_XLU_DISP = Gfx_SetupDL64(POLY_XLU_DISP);
gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
@@ -201,7 +201,7 @@ void OceffStorm_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 200, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 0, 128);
diff --git a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
index 87a67191c..8bd3ecd65 100644
--- a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
+++ b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
@@ -19,6 +19,6 @@ typedef struct OceffStorm {
typedef enum {
/* 1 */ OCEFF_STORM_ACTION_PARAM_1 = 1
-} OceffStormActionParams;
+} OceffStormActionParam;
#endif // Z_OCEFF_STORM_H
diff --git a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
index 42bf6c703..c73e67a1d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c
@@ -99,7 +99,7 @@ void OceffWipe_Draw(Actor* thisx, PlayState* play) {
vtxPtr[i * 2 + 1].v.cn[3] = alphaTable[sAlphaIndices[i] & 0xF];
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
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 3d8004c5c..7de628750 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c
@@ -89,7 +89,7 @@ void OceffWipe2_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
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 52031ce00..f7156878c 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c
@@ -90,7 +90,7 @@ void OceffWipe3_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
index 3554bc78a..d82c117e9 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c
@@ -88,7 +88,7 @@ void OceffWipe4_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(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);
diff --git a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
index 0d0db6385..3dcb06d5d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c
@@ -72,15 +72,15 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
s32 i;
s32 pad2;
Vec3f activeCamEye = GET_ACTIVE_CAM(play)->eye;
- Camera* cam = GET_ACTIVE_CAM(play);
+ Camera* activeCam = GET_ACTIVE_CAM(play);
Vec3f quakeOffset;
u8 alpha;
s32 colorIndex = OCEFF_WIPE5_GET_SONG_TYPE(thisx) * 3;
f32 phi_fv1 = 1220.0f;
if ((((OCEFF_WIPE5_GET_SONG_TYPE(thisx) == 2) && (play->sceneId == SCENE_LABO)) &&
- ((play->csCtx.currentCsIndex == 0) || (play->csCtx.currentCsIndex == 1))) &&
- (play->csCtx.state != 0)) {
+ ((play->csCtx.scriptIndex == 0) || (play->csCtx.scriptIndex == 1))) &&
+ (play->csCtx.state != CS_STATE_IDLE)) {
phi_fv1 = 1150.0f;
}
@@ -88,7 +88,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
colorIndex = 0;
}
- Camera_GetQuakeOffset(&quakeOffset, cam);
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
if (this->counter < 32) {
z = Math_SinS(this->counter << 9) * phi_fv1;
@@ -107,7 +107,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
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 87dbe2752..244870f9d 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c
@@ -86,7 +86,7 @@ void OceffWipe6_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
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 f269a89a5..fb8011c60 100644
--- a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
+++ b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c
@@ -88,7 +88,7 @@ void OceffWipe7_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(activeCamEye.x + quakeOffset.x, activeCamEye.y + quakeOffset.y, activeCamEye.z + quakeOffset.z,
MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
diff --git a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
index 23713aa71..69f56ef2d 100644
--- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
+++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
@@ -87,7 +87,7 @@ void ShotSun_SpawnFairy(ShotSun* this, PlayState* play2) {
if (this->timer > 0) {
this->timer--;
} else {
- ActorCutscene_Stop(this->actor.cutscene);
+ CutsceneManager_Stop(this->actor.csId);
switch (params) {
case SHOTSUN_FAIRY_SPAWNER_SUNS:
fairyType = ENELF_TYPE_7;
@@ -103,9 +103,9 @@ void ShotSun_SpawnFairy(ShotSun* this, PlayState* play2) {
}
void ShotSun_TriggerFairy(ShotSun* this, PlayState* play) {
- if ((this->actor.cutscene == -1) || ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
- if (this->actor.cutscene != -1) {
- ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ if ((this->actor.csId == CS_ID_NONE) || CutsceneManager_IsNext(this->actor.csId)) {
+ if (this->actor.csId != CS_ID_NONE) {
+ CutsceneManager_Start(this->actor.csId, &this->actor);
}
this->actionFunc = ShotSun_SpawnFairy;
this->timer = 50;
@@ -113,7 +113,7 @@ void ShotSun_TriggerFairy(ShotSun* this, PlayState* play) {
this->actor.home.pos.z, 0, 0, 0, 0x11);
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_TRE_BOX_APPEAR);
} else {
- ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ CutsceneManager_Queue(this->actor.csId);
}
}
@@ -145,13 +145,14 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
s32 pad;
Vec3f spawnPos;
+ //! FAKE:
+ if (1) {}
+
if (this->collider.base.acFlags & AC_HIT) {
play_sound(NA_SE_SY_CORRECT_CHIME);
- if (1) {}
if (INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE) {
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_ETCETERA, 700.0f, -800.0f, 7261.0f, 0, 0, 0,
ITEM_ETC_ARROW_FIRE);
- if (1) {}
gSaveContext.cutsceneTrigger = 1;
} else {
spawnPos.x = 700.0f;
@@ -168,19 +169,19 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
return;
}
- if (!(this->actor.xzDistToPlayer > 120.0f)) {
- if ((gSaveContext.save.time >= CLOCK_TIME(6, 30)) && (gSaveContext.save.time < CLOCK_TIME(7, 30))) {
- cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
- cylinderPos.y =
- (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
- cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
-
- this->hitboxPos = cylinderPos;
-
- Collider_SetCylinderPosition(&this->collider, &cylinderPos);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actor.xzDistToPlayer > 120.0f) || (gSaveContext.save.time < CLOCK_TIME(6, 30)) ||
+ (gSaveContext.save.time >= CLOCK_TIME(7, 30))) {
+ return;
}
+
+ cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
+ cylinderPos.y = (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
+ cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
+
+ this->hitboxPos = cylinderPos;
+
+ Collider_SetCylinderPosition(&this->collider, &cylinderPos);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
void ShotSun_Update(Actor* thisx, PlayState* play) {
diff --git a/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c b/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
index 5e42daffb..6279c367e 100644
--- a/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
+++ b/src/overlays/actors/ovl_TG_Sw/z_tg_sw.c
@@ -34,18 +34,17 @@ ActorInit TG_Sw_InitVars = {
void TGSw_ActionDecider(TGSw* this, PlayState* play) {
f32 scaledAbsoluteRotZ;
f32 scaledAbsoluteRotY;
- u8 unk1F4;
+ PlayerImpactType playerImpactType;
- // Maybe actorCtx Debug Flag?
- if (play->actorCtx.unk_1F4.timer != 0) {
+ if (play->actorCtx.playerImpact.timer != 0) {
scaledAbsoluteRotY = ABS_ALT(this->actor.world.rot.y) * 4.0f;
scaledAbsoluteRotZ = ABS_ALT(this->actor.world.rot.z) * 4.0f;
if ((scaledAbsoluteRotZ < this->actor.xzDistToPlayer) || (scaledAbsoluteRotY < this->actor.playerHeightRel)) {
return;
}
- unk1F4 = play->actorCtx.unk_1F4.unk_00;
- if (unk1F4 == 2 || unk1F4 == 0) {
+ playerImpactType = play->actorCtx.playerImpact.type;
+ if ((playerImpactType == PLAYER_IMPACT_BONK) || (playerImpactType == PLAYER_IMPACT_GORON_GROUND_POUND)) {
this->actionFunc = TGSw_ActionExecuteOneShot;
}
}
@@ -91,7 +90,7 @@ void TGSw_ActionExecuteOneShot(TGSw* this, PlayState* play) {
void TGSw_Init(Actor* thisx, PlayState* play) {
TGSw* this = THIS;
- this->actor.cutscene = this->actor.world.rot.z;
+ this->actor.csId = this->actor.world.rot.z;
this->actionFunc = TGSw_ActionDecider;
}
diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c
index 1f92e8825..01c732aa2 100644
--- a/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/src/overlays/actors/ovl_player_actor/z_player.c
@@ -3,1303 +3,20205 @@
* Overlay: ovl_player_actor
* Description: Player
*/
-
+#include "prevent_bss_reordering.h"
#include "global.h"
+#include "z64horse.h"
#include "z64quake.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
-#define THIS ((Player*)thisx)
+#include "overlays/actors/ovl_Arms_Hook/z_arms_hook.h"
+#include "overlays/actors/ovl_Door_Spiral/z_door_spiral.h"
+#include "overlays/actors/ovl_Door_Shutter/z_door_shutter.h"
+#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
+#include "overlays/actors/ovl_En_Boom/z_en_boom.h"
+#include "overlays/actors/ovl_En_Box/z_en_box.h"
+#include "overlays/actors/ovl_En_Door/z_en_door.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
+#include "overlays/actors/ovl_En_Ishi/z_en_ishi.h"
+#include "overlays/actors/ovl_En_Test3/z_en_test3.h"
+#include "overlays/actors/ovl_En_Test7/z_en_test7.h"
+#include "overlays/actors/ovl_En_Torch2/z_en_torch2.h"
-extern UNK_TYPE D_06008860;
-extern UNK_TYPE D_0600BDD8;
-extern UNK_TYPE D_060178D0;
+#include "overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h"
+
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#include "objects/object_link_boy/object_link_boy.h"
+#include "objects/object_link_goron/object_link_goron.h"
+#include "objects/object_link_zora/object_link_zora.h"
+#include "objects/object_link_nuts/object_link_nuts.h"
+#include "objects/object_link_child/object_link_child.h"
+
+#define THIS ((Player*)thisx)
void Player_Init(Actor* thisx, PlayState* play);
void Player_Destroy(Actor* thisx, PlayState* play);
void Player_Update(Actor* thisx, PlayState* play);
void Player_Draw(Actor* thisx, PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DA90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DABC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DAD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DAFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DB90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DBC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DC64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DCA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DD2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE14.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DE88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082DF8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E00C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E078.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E0CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E0F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E12C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E188.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E1BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E1F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E224.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E438.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E514.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E55C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E5A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E5EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E634.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E67C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E6D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E6F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E784.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E920.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082E9C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EA80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EAC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EAF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EB18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EB38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EC9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ECCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ECE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ED20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082ED94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EEA4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EEE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082EFE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F02C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F09C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F0E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F164.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F1AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F43C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F470.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F524.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F594.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F5FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F7F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F8A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F8BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082F938.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FA5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FB68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FBE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FC78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FCC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FD0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FDC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8082FE0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808302CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808304BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808305BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808306F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808308DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808309CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830A58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830AE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830B38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830B88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830CE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830D40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830DF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830E30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80830FD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831010.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831124.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831194.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083133C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808313A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808313F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831454.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831494.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083172C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831760.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808317C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831814.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808318C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831944.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831990.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80831F34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832090.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083213C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083216C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808323C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832444.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083249C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808324EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832558.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832578.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832660.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832754.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832CAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832F24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80832F78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833058.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808331FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808332A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808333CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808334D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808335B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808335F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833728.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083375C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833864.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833998.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808339B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808339D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833A64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833AA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80833B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808340AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808340D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834104.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834140.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808341F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808344C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834534.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083456C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808345A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808345C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834600.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834CD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834D50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834DB8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80834DFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835324.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808353DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835428.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808354A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808355D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083562C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835BC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835C64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835CD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835D2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835D58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835DF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80835EAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083604C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836258.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808365DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083692C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836988.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808369F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836A5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836A98.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836AD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836B3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836D8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836DC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80836F10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808370D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837134.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808373A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808373F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837730.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083784C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808378FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083798C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808379C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837B60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837BD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837C20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837C78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837CEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80837DEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808381A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808381F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083827C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083868C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838760.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808387A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838830.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808388B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808389BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838A20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80838A90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808391D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839518.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808395F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808396B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839800.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839860.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839978.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839A10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839A84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839CD8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839E3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839E74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839ED0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80839F98.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A04C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A0CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A114.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A274.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A548.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A580.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A658.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A6C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A844.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A878.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083A98C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AD04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AD8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083ADB8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083ADF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AE38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AECC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AF30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083AF8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B030.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B090.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B0E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B1A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B23C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B29C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B2E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B32C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B3B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B73C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B798.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B850.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B8D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083B930.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083BB4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083BF54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C62C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C6E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C85C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083C8E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CB04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CBC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CCB4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083CF68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D168.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D23C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D6DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D738.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D78C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083D860.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DCC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DD1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DEE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DF38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083DFC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E14C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E234.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E28C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E2F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E354.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E404.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E514.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E758.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E7F8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E8E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E958.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083E9C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EA44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EBD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083EE60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F144.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F190.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F230.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F27C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F358.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F57C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F828.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083F8A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FBC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FCF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FD80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FE38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FE90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FEF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FF30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8083FFEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808400CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808401F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840980.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808409A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840A30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840CD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840DEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840E24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840E5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840F34.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80840F90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808411D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808412A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808412BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841358.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841408.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808414E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841528.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808415A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808415E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841624.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841744.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084182C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80841A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80842510.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808425B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808426F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808430E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80843178.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80843EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808442D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808445C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808446F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844784.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844D80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80844EF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808463C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80846460.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Draw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/Player_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847190.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084748C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808475B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808477D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847880.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847994.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808479F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847A50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847A94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847BF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847E2C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847ED4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80847FF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848048.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808481CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848250.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848294.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808482E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808484CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808484F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848570.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848640.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848780.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808487B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848808.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084894C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848A0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848AB0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848B6C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848BF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80848E4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849054.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808490B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808491B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084923C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808492C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084933C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849570.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849620.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808496AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808497A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849A9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849DD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80849FE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A26C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A794.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A884.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084A8E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AB4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AC84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AEEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084AF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B0EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B288.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B3B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B4A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084B5C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BAA4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BBF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BC64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BE40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BF28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084BFDC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C124.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C16C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C6EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084C94C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CA24.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CCEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084CE84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D18C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D4EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084D820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E034.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E25C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E334.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E434.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E4E4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E58C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E65C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E724.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084E980.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084ED9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084EE50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084EF9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F1B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F3DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084F4E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FC0C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FD7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FE48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8084FE7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808505D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850734.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850854.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808508C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850B18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850BA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850D20.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80850D68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808513EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851588.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808516B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808519FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851B58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851BD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851C40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851D30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851EAC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851EC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80851F18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808521E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852290.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085255C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808525C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085269C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852B28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852C04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80852FD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808530E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853194.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808534C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853754.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853850.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853A5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853CC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80853D68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854010.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808540A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854118.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085421C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085437C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085439C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854430.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854614.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808546D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854800.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808548B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854CD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80854EFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808550D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855218.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808553F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855818.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855A7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855AF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855B9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855C28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855E08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80855F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856000.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856074.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856110.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808561B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808566C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085687C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856888.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80856918.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808573A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857640.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808576BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808577E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857950.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857A44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857AEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80857BE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858C84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858CC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858D48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DB4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DDC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858DFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858E80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858EFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F7C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858F9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858FBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80858FE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859028.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859168.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808591BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859210.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859248.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085929C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859300.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859414.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808594D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808595B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085968C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085978C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859890.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859990.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808599DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859A10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859A44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859AD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859AF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859B28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859B54.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859BA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859C60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859CFC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859D44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859D70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859EBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859F4C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859FCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_80859FF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A04C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A120.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A144.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A19C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A1D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A24C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A2AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A330.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A364.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A40C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A4A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A530.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A5DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A66C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A6C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A710.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A768.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A7C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A8C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085A940.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA60.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AA84.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AACC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AB58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085ABA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AC9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085AD5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085ADA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B08C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B134.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B170.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B1F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B28C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B384.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B3E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B460.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B74C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B820.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B854.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_8085B930.s")
+s32 Player_GrabPlayer(PlayState* play, Player* player);
+s32 func_8085B28C(PlayState* play, Player* this, PlayerCsMode csMode);
+void func_8085B384(Player* this, PlayState* play);
+s32 Player_InflictDamage(PlayState* play, s32 damage);
+void Player_TalkWithPlayer(PlayState* play, Actor* actor);
+void func_8085B74C(PlayState* play);
+void func_8085B820(PlayState* play, s16 arg1);
+PlayerItemAction func_8085B854(PlayState* play, Player* player, ItemId itemId);
+s32 func_8085B930(PlayState* play, PlayerAnimationHeader* talkAnim, AnimationMode animMode);
+
+void Player_UpdateCommon(Player* this, PlayState* play, Input* input);
+s32 Player_StartFishing(PlayState* play);
+void func_8085B170(PlayState* play, Player* this);
+s32 func_8083A658(PlayState* play, Player* this);
+void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction);
+
+void func_80831990(PlayState* play, Player* this, ItemId item);
+
+s32 func_80848BF4(Player* this, PlayState* play);
+
+void func_80836988(Player* this, PlayState* play);
+
+void func_808484F0(Player* this);
+
+void func_80838A20(PlayState* play, Player* this);
+void func_80839978(PlayState* play, Player* this);
+void func_80839A10(PlayState* play, Player* this);
+
+typedef enum AnimSfxType {
+ /* 1 */ ANIMSFX_TYPE_GENERAL = 1,
+ /* 2 */ ANIMSFX_TYPE_FLOOR,
+ /* 3 */ ANIMSFX_TYPE_FLOOR_BY_AGE,
+ /* 4 */ ANIMSFX_TYPE_VOICE,
+ /* 5 */ ANIMSFX_TYPE_FLOOR_LAND, // does not use sfxId
+ /* 6 */ ANIMSFX_TYPE_6, // FLOOR_WALK_Something // does not use sfxId
+ /* 7 */ ANIMSFX_TYPE_FLOOR_JUMP, // does not use sfxId
+ /* 8 */ ANIMSFX_TYPE_8, // FLOOR_WALK_Something2 // does not use sfxId
+ /* 9 */ ANIMSFX_TYPE_9, // Uses NA_SE_PL_WALK_LADDER // does not use sfxId, unused
+ /* 10 */ ANIMSFX_TYPE_SURFACE
+} AnimSfxType;
+
+#define ANIMSFX_SHIFT_TYPE(type) ((type) << 11)
+
+#define ANIMSFX_CONTINUE (1)
+#define ANIMSFX_STOP (0)
+
+#define ANIMSFX_FLAGS(type, frame, cont) \
+ (((ANIMSFX_##cont) == ANIMSFX_STOP ? -1 : 1) * (ANIMSFX_SHIFT_TYPE(type) | ((frame)&0x7FF)))
+
+#define ANIMSFX(type, frame, sfxId, cont) \
+ { (sfxId), ANIMSFX_FLAGS(type, frame, cont) }
+
+#define ANIMSFX_GET_TYPE(data) ((data)&0x7800)
+#define ANIMSFX_GET_FRAME(data) ((data)&0x7FF)
+
+typedef struct AnimSfxEntry {
+ /* 0x0 */ u16 sfxId;
+ /* 0x2 */ s16 flags; // negative marks the end
+} AnimSfxEntry; // size = 0x4
+
+/* action funcs */
+void func_808496AC(Player* this, PlayState* play);
+void func_808497A0(Player* this, PlayState* play);
+void func_80849A9C(Player* this, PlayState* play);
+void func_80849DD0(Player* this, PlayState* play);
+void func_80849FE0(Player* this, PlayState* play);
+void func_8084A26C(Player* this, PlayState* play);
+void func_8084A5C0(Player* this, PlayState* play);
+void func_8084A794(Player* this, PlayState* play);
+void func_8084A884(Player* this, PlayState* play);
+void func_8084A8E8(Player* this, PlayState* play);
+void func_8084AB4C(Player* this, PlayState* play);
+void func_8084AC84(Player* this, PlayState* play);
+void func_8084AEEC(Player* this, PlayState* play);
+void func_8084AF9C(Player* this, PlayState* play);
+void func_8084B0EC(Player* this, PlayState* play);
+void func_8084B288(Player* this, PlayState* play);
+void func_8084B3B8(Player* this, PlayState* play);
+void func_8084B4A8(Player* this, PlayState* play);
+void func_8084B5C0(Player* this, PlayState* play);
+void func_8084BAA4(Player* this, PlayState* play);
+void func_8084BBF0(Player* this, PlayState* play);
+void func_8084BC64(Player* this, PlayState* play);
+void func_8084BE40(Player* this, PlayState* play);
+void func_8084BF28(Player* this, PlayState* play);
+void func_8084BFDC(Player* this, PlayState* play);
+void func_8084C16C(Player* this, PlayState* play);
+void func_8084C6EC(Player* this, PlayState* play);
+void func_8084C94C(Player* this, PlayState* play);
+void func_8084CA24(Player* this, PlayState* play);
+void func_8084CB58(Player* this, PlayState* play);
+void func_8084CCEC(Player* this, PlayState* play);
+void func_8084CE84(Player* this, PlayState* play);
+void func_8084D18C(Player* this, PlayState* play);
+void func_8084D4EC(Player* this, PlayState* play);
+void func_8084D770(Player* this, PlayState* play);
+void func_8084D820(Player* this, PlayState* play);
+void func_8084E034(Player* this, PlayState* play);
+void func_8084E25C(Player* this, PlayState* play);
+void func_8084E334(Player* this, PlayState* play);
+void func_8084E434(Player* this, PlayState* play);
+void func_8084E4E4(Player* this, PlayState* play);
+void func_8084E58C(Player* this, PlayState* play);
+void func_8084E65C(Player* this, PlayState* play);
+void func_8084E724(Player* this, PlayState* play);
+void func_8084E980(Player* this, PlayState* play);
+void func_8084ED9C(Player* this, PlayState* play);
+void func_8084EE50(Player* this, PlayState* play);
+void func_8084EF9C(Player* this, PlayState* play);
+void func_8084F1B8(Player* this, PlayState* play);
+void func_8084F3DC(Player* this, PlayState* play);
+void func_8084F4E8(Player* this, PlayState* play);
+void func_8084FC0C(Player* this, PlayState* play);
+void func_8084FE7C(Player* this, PlayState* play);
+void func_808505D0(Player* this, PlayState* play);
+void func_808508C8(Player* this, PlayState* play);
+void func_80850B18(Player* this, PlayState* play);
+void func_80850D68(Player* this, PlayState* play);
+void func_808513EC(Player* this, PlayState* play);
+void func_80851588(Player* this, PlayState* play);
+void func_808516B4(Player* this, PlayState* play);
+void func_808519FC(Player* this, PlayState* play);
+void func_80851B58(Player* this, PlayState* play);
+void func_80851BD4(Player* this, PlayState* play);
+void func_8085269C(Player* this, PlayState* play);
+void func_80852B28(Player* this, PlayState* play);
+void func_80852C04(Player* this, PlayState* play);
+void func_80852FD4(Player* this, PlayState* play);
+void func_80853194(Player* this, PlayState* play);
+void func_808534C0(Player* this, PlayState* play);
+void func_80853754(Player* this, PlayState* play);
+void func_80853850(Player* this, PlayState* play);
+void func_80853A5C(Player* this, PlayState* play);
+void func_80853CC0(Player* this, PlayState* play);
+void func_80853D68(Player* this, PlayState* play);
+void func_80854010(Player* this, PlayState* play);
+void func_808540A0(Player* this, PlayState* play);
+void func_80854118(Player* this, PlayState* play);
+void func_8085421C(Player* this, PlayState* play);
+void func_8085437C(Player* this, PlayState* play);
+void func_8085439C(Player* this, PlayState* play);
+void func_80854430(Player* this, PlayState* play);
+void func_80854614(Player* this, PlayState* play);
+void func_808546D0(Player* this, PlayState* play);
+void func_80854800(Player* this, PlayState* play);
+void func_808548B8(Player* this, PlayState* play);
+void func_80854C70(Player* this, PlayState* play);
+void func_808553F4(Player* this, PlayState* play);
+void func_80855818(Player* this, PlayState* play);
+void func_80855A7C(Player* this, PlayState* play);
+void func_80855AF4(Player* this, PlayState* play);
+void func_80855B9C(Player* this, PlayState* play);
+void func_80855C28(Player* this, PlayState* play);
+void func_80855E08(Player* this, PlayState* play);
+void func_808561B0(Player* this, PlayState* play);
+void func_80856918(Player* this, PlayState* play);
+void func_808573A4(Player* this, PlayState* play);
+void func_80857BE8(Player* this, PlayState* play);
+void func_8085B08C(Player* this, PlayState* play);
+
+s32 func_80839518(Player* this, PlayState* play);
+s32 func_808365DC(Player* this, PlayState* play);
+s32 func_8083D23C(Player* this, PlayState* play);
+s32 func_8083CCB4(Player* this, PlayState* play);
+s32 func_808391D8(Player* this, PlayState* play);
+s32 func_8083DFC4(Player* this, PlayState* play);
+s32 func_8083A114(Player* this, PlayState* play);
+s32 func_80848570(Player* this, PlayState* play);
+s32 func_8083A580(Player* this, PlayState* play);
+s32 func_8083D78C(Player* this, PlayState* play);
+s32 func_80839B18(Player* this, PlayState* play);
+s32 func_8083A274(Player* this, PlayState* play);
+s32 func_80834DFC(Player* this, PlayState* play);
+s32 func_80838A90(Player* this, PlayState* play);
+s32 func_8083A0CC(Player* this, PlayState* play);
+
+s32 func_80848780(Player* this, PlayState* play);
+s32 func_808487B8(Player* this, PlayState* play);
+s32 func_80848B6C(Player* this, PlayState* play);
+s32 func_808490B4(Player* this, PlayState* play);
+s32 func_808491B4(Player* this, PlayState* play);
+s32 func_80848808(Player* this, PlayState* play);
+s32 func_8084894C(Player* this, PlayState* play);
+s32 func_80848A0C(Player* this, PlayState* play);
+s32 func_80848AB0(Player* this, PlayState* play);
+s32 func_80848E4C(Player* this, PlayState* play);
+s32 func_80849054(Player* this, PlayState* play);
+s32 func_8084923C(Player* this, PlayState* play);
+s32 func_808492C4(Player* this, PlayState* play);
+s32 func_8084933C(Player* this, PlayState* play);
+s32 func_80849570(Player* this, PlayState* play);
+s32 func_80849620(Player* this, PlayState* play);
+
+/* Init Mode functions */
+void Player_InitMode_0(PlayState* play, Player* this);
+void Player_InitMode_1(PlayState* play, Player* this);
+void Player_InitMode_2(PlayState* play, Player* this);
+void Player_InitMode_3(PlayState* play, Player* this);
+void Player_InitMode_4(PlayState* play, Player* this);
+void Player_InitMode_5(PlayState* play, Player* this);
+void Player_InitMode_6(PlayState* play, Player* this);
+void Player_InitMode_7(PlayState* play, Player* this);
+void func_80841744(PlayState* play, Player* this);
+void func_80841744(PlayState* play, Player* this);
+void func_8083ADF0(PlayState* play, Player* this);
+void Player_InitMode_B(PlayState* play, Player* this);
+void Player_InitMode_Telescope(PlayState* play, Player* this);
+void Player_InitMode_D(PlayState* play, Player* this);
+void func_8083ADF0(PlayState* play, Player* this);
+void Player_InitMode_F(PlayState* play, Player* this);
+
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_80859EBC(PlayState* play, Player* this, s32 arg2);
+
+void func_80859414(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859AD0(PlayState* play, Player* this, void* arg2);
+void func_80859B28(PlayState* play, Player* this, void* arg2);
+void func_8085ADA0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085AACC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859890(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859C60(PlayState* play, Player* this, void* arg2);
+void func_8085A710(PlayState* play, Player* this, void* anim);
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859D70(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A6C0(PlayState* play, Player* this, void* anim);
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2);
+void Player_Cutscene_TranslateReverse(PlayState* play, Player* this, void* arg);
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A364(PlayState* play, Player* this, void* arg2);
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A40C(PlayState* play, Player* this, void* arg2);
+void func_80859708(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A940(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A4A4(PlayState* play, Player* this, void* arg2);
+void func_8085A5DC(PlayState* play, Player* this, void* arg2);
+void func_8085AA84(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A7C0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085AA10(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859AF8(PlayState* play, Player* this, void* arg2);
+void func_80859A44(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859D44(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859EBC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_8085A768(PlayState* play, Player* this, void* arg2);
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2);
+
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085978C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859B54(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859CA0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859CFC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A66C(PlayState* play, Player* this, void* arg2);
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085968C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A8C4(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_8085A530(PlayState* play, Player* this, void* arg2);
+void func_8085A768(PlayState* play, Player* this, void* arg2);
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859990(PlayState* play, Player* this, UNK_TYPE arg2);
+void func_80859A10(PlayState* play, Player* this, UNK_TYPE arg2);
+
+// ItemActions
+void func_8082F594(PlayState* play, Player* this);
+void func_8082F5A4(PlayState* play, Player* this);
+void func_8082F8A0(PlayState* play, Player* this);
+void func_8082F5C0(PlayState* play, Player* this);
+void func_8082F7F4(PlayState* play, Player* this);
+void Player_SpawnExplosive(PlayState* play, Player* this);
+
+void func_80858DB4(PlayState* play, Player* this, void* anim);
+void func_80858DDC(PlayState* play, Player* this, void* anim);
+void func_80858E40(PlayState* play, Player* this, void* anim);
+void func_80858E60(PlayState* play, Player* this, void* anim);
+void func_80858E80(PlayState* play, Player* this, void* anim);
+void func_80858EA0(PlayState* play, Player* this, void* anim);
+void func_80858EFC(PlayState* play, Player* this, void* anim);
+void func_80858F1C(PlayState* play, Player* this, void* anim);
+void func_80858F3C(PlayState* play, Player* this, void* anim);
+void func_80858F5C(PlayState* play, Player* this, void* anim);
+void func_80858FBC(PlayState* play, Player* this, void* anim);
+void func_80859028(PlayState* play, Player* this, void* anim);
+void func_808591BC(PlayState* play, Player* this, void* anim);
+void func_80858DFC(PlayState* play, Player* this, void* anim);
+void func_80858EC0(PlayState* play, Player* this, void* anim);
+void func_80858F7C(PlayState* play, Player* this, void* anim);
+void func_80858F9C(PlayState* play, Player* this, void* anim);
+void func_80859168(PlayState* play, Player* this, void* anim);
+void func_80859210(PlayState* play, Player* this, void* arg2);
+
+typedef struct struct_8085C2A4 {
+ /* 0x0 */ PlayerAnimationHeader* unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+ /* 0x8 */ PlayerAnimationHeader* unk_8;
+} struct_8085C2A4; // size = 0xC
+
+typedef struct BlureColors {
+ /* 0x0 */ u8 p1StartColor[4];
+ /* 0x4 */ u8 p2StartColor[4];
+ /* 0x8 */ u8 p1EndColor[4];
+ /* 0xC */ u8 p2EndColor[4];
+} BlureColors; // size = 0x10
+
+typedef void (*PlayerCueInterpreter)(PlayState*, Player*, CsCmdActorCue*);
+
+typedef struct struct_8085DA94 {
+ /* 0x0 */ s8 type;
+ /* 0x4 */ union {
+ void* ptr; // Do not use, required in the absence of designated initialisors
+ PlayerAnimationHeader* anim;
+ PlayerCueInterpreter func;
+ AnimSfxEntry* entry;
+ };
+} struct_8085DA94; // size = 0x8
+
+typedef struct struct_8085E368 {
+ /* 0x0 */ Vec3s base;
+ /* 0x6 */ Vec3s range;
+} struct_8085E368; // size = 0xC
+
+typedef struct struct_8085D910 {
+ /* 0x0 */ u8 unk_0;
+ /* 0x1 */ u8 unk_1;
+ /* 0x2 */ u8 unk_2;
+ /* 0x3 */ u8 unk_3;
+} struct_8085D910; // size = 0x4
+
+typedef struct struct_8085D848_unk_00 {
+ /* 0x0 */ s16 fogNear;
+ /* 0x2 */ u8 fogColor[3];
+ /* 0x5 */ u8 ambientColor[3];
+} struct_8085D848_unk_00; // size = 0x8
+
+typedef struct struct_8085D848_unk_18 {
+ /* 0x00 */ Vec3f pos;
+ /* 0x0C */ u8 color[3];
+ /* 0x10 */ s16 radius;
+} struct_8085D848_unk_18; // size = 0x14
+
+typedef struct struct_8085D848 {
+ /* 0x00 */ struct_8085D848_unk_00 unk_00[3];
+ /* 0x18 */ struct_8085D848_unk_18 light[3];
+} struct_8085D848; // size = 0x54
+
+typedef struct struct_8085D80C {
+ /* 0x0 */ s16 actorId;
+ /* 0x2 */ s16 params;
+} struct_8085D80C; // size = 0x4
+
+typedef struct struct_8085D798 {
+ /* 0x0 */ s16 actorId;
+ /* 0x2 */ s8 actorParams;
+ /* 0x3 */ u8 itemId;
+ /* 0x4 */ u8 itemAction;
+ /* 0x5 */ u8 textId;
+} struct_8085D798; // size = 0x6
+
+typedef struct struct_8085D714 {
+ /* 0x0 */ u8 unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+} struct_8085D714; // size = 0x8
+
+typedef struct struct_8085D224 {
+ /* 0x0 */ PlayerAnimationHeader* anim;
+ /* 0x4 */ f32 unk_4;
+ /* 0x8 */ f32 unk_8;
+} struct_8085D224; // size = 0xC
+
+typedef struct FallImpactInfo {
+ /* 0x0 */ s8 damage;
+ /* 0x1 */ u8 sourceIntensity;
+ /* 0x2 */ u8 decayTimer;
+ /* 0x3 */ u8 decayStep;
+ /* 0x4 */ u16 sfxId;
+} FallImpactInfo; // size = 0x6
+
+typedef struct AttackAnimInfo {
+ /* 0x00 */ PlayerAnimationHeader* unk_0;
+ /* 0x04 */ PlayerAnimationHeader* unk_4;
+ /* 0x08 */ PlayerAnimationHeader* unk_8;
+ /* 0x0C */ u8 unk_C;
+ /* 0x0D */ u8 unk_D;
+} AttackAnimInfo; // size = 0x10
+
+typedef struct MeleeWeaponDamageInfo {
+ /* 0x0 */ s32 dmgFlags;
+ // Presumably these two fields are intended for Fierce Deity, but will also work for Deku if it can equip a sword
+ /* 0x4 */ u8 dmgTransformedNormal;
+ /* 0x5 */ u8 dmgTransformedStrong;
+ /* 0x6 */ u8 dmgHumanNormal;
+ /* 0x7 */ u8 dmgHumanStrong;
+} MeleeWeaponDamageInfo; // size = 0x8
+
+typedef struct struct_8085CC88 {
+ /* 0x0 */ PlayerAnimationHeader* anim;
+ /* 0x4 */ u8 frame;
+} struct_8085CC88; // size = 0x8
+
+typedef struct {
+ /* 0x0 */ u8 itemId;
+ /* 0x2 */ s16 actorId;
+} ExplosiveInfo; // size = 0x4
+
+typedef struct {
+ /* 0x0 */ Color_RGB8 unk_0;
+ /* 0x3 */ Color_RGB8 unk_3;
+ /* 0x6 */ Color_RGB8 unk_6;
+ /* 0xA */ s16 unk_A;
+ /* 0xC */ s16 unk_C;
+} struct_8082F02C_arg1; // size = 0xE
+
+typedef struct GetItemEntry {
+ /* 0x0 */ u8 itemId;
+ /* 0x1 */ u8 field; // various bit-packed data
+ /* 0x2 */ s8 gid; // defines the draw id and chest opening animation
+ /* 0x3 */ u8 textId;
+ /* 0x4 */ u16 objectId;
+} GetItemEntry; // size = 0x6
+
+typedef struct struct_8085D200 {
+ /* 0x0 */ PlayerAnimationHeader* unk_0;
+ /* 0x4 */ PlayerAnimationHeader* unk_4;
+ /* 0x8 */ u8 unk_8;
+ /* 0x9 */ u8 unk_9;
+} struct_8085D200; // size = 0xC
+
+f32 D_80862AFC; // distance of the analog stick to its center
+s16 D_80862B00; // analog stick angle/yaw
+s16 D_80862B02; // analog stick yaw + camera yaw
+s32 D_80862B04; // boolean, set to the return value of func_8083216C
+FloorType sPlayerCurrentFloorType;
+u32 sPlayerCurrentWallFlags;
+ConveyorSpeed sPlayerConveyorSpeedIndex;
+s16 sPlayerIsOnFloorConveyor;
+s16 D_80862B16; // SurfaceType_GetConveyorDirection << 0xA
+f32 D_80862B18; // D_80862B18 = this->actor.world.pos.y - this->actor.floorHeight;
+FloorProperty sPlayerPrevFloorProperty;
+s32 D_80862B20; // ABS_ALT(this->actor.shape.rot.y - BINANG_ADD(this->actor.wallYaw, 0x8000))
+s32 D_80862B24; // ABS_ALT(BINANG_SUB(this->currentYaw, BINANG_ADD(this->actor.wallYaw, 0x8000)))
+s16 D_80862B28;
+s32 D_80862B2C; // D_80862B2C = player->currentMask;
+Vec3f D_80862B30;
+f32 D_80862B3C;
+FloorEffect D_80862B40; // SurfaceType_GetFloorEffect
+Input* sPlayerControlInput;
+s32 D_80862B48;
+s32 D_80862B4C;
+EnvLightSettings D_80862B50; // backup of play->envCtx.lightSettings
+s32 D_80862B6C; // this->skelAnime.moveFlags // sPlayerSkelMoveFlags?
+
+s32 func_8082DA90(PlayState* play) {
+ return (play->transitionTrigger != TRANS_TRIGGER_OFF) || (play->transitionMode != TRANS_MODE_OFF);
+}
+
+void Player_StopHorizontalMovement(Player* this) {
+ this->linearVelocity = 0.0f;
+ this->actor.speed = 0.0f;
+}
+
+void func_8082DAD4(Player* this) {
+ Player_StopHorizontalMovement(this);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+}
+
+s32 func_8082DAFC(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ return CHECK_FLAG_ALL(player->actor.flags, ACTOR_FLAG_TALK_REQUESTED);
+}
+
+void Player_AnimationPlayOnce(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnce(play, &this->skelAnime, anim);
+}
+
+void Player_AnimationPlayLoop(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayLoop(play, &this->skelAnime, anim);
+}
+
+void func_8082DB60(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f);
+}
+
+void func_8082DB90(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 2.0f / 3.0f);
+}
+
+void Player_AnimationPlayOnceReverse(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, -2.0f / 3.0f, Animation_GetLastFrame(anim), 0.0f,
+ ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082DC28(Player* this) {
+ this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y = 0;
+}
+
+void func_8082DC38(Player* this) {
+ this->stateFlags2 &= ~PLAYER_STATE2_20000;
+ this->meleeWeaponState = PLAYER_MELEE_WEAPON_STATE_0;
+ this->meleeWeaponInfo[2].active = false;
+ this->meleeWeaponInfo[1].active = false;
+ this->meleeWeaponInfo[0].active = false;
+}
+
+void func_8082DC64(PlayState* play, Player* this) {
+ if ((this->subCamId != CAM_ID_NONE) && (play->cameraPtrs[this->subCamId] != NULL)) {
+ this->subCamId = CAM_ID_NONE;
+ }
+
+ this->stateFlags2 &= ~(PLAYER_STATE2_400 | PLAYER_STATE2_800);
+}
+
+void func_8082DCA0(PlayState* play, Player* this) {
+ Actor* heldActor = this->heldActor;
+
+ if ((heldActor != NULL) && !Player_IsHoldingHookshot(this)) {
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ this->interactRangeActor = NULL;
+ heldActor->parent = NULL;
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+
+ if (Player_GetExplosiveHeld(this) > PLAYER_EXPLOSIVE_NONE) {
+ func_8082F8BC(play, this, PLAYER_IA_NONE);
+ this->heldItemId = ITEM_FE;
+ }
+}
+
+void func_8082DD2C(PlayState* play, Player* this) {
+ if ((this->stateFlags1 & PLAYER_STATE1_800) && (this->heldActor == NULL)) {
+ if (this->interactRangeActor != NULL) {
+ if (this->getItemId == GI_NONE) {
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ this->interactRangeActor = NULL;
+ }
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+ }
+
+ func_8082DC38(this);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ func_8082DC64(play, this);
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ this->stateFlags1 &=
+ ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000 | PLAYER_STATE1_200000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_10 | PLAYER_STATE2_80);
+ this->unk_ADD = 0;
+ this->unk_ADC = 0;
+ this->actor.shape.rot.x = 0;
+ this->actor.shape.rot.z = 0;
+ this->unk_ABC = 0.0f;
+ this->unk_AC0 = 0.0f;
+}
+
+s32 func_8082DE14(PlayState* play, Player* this) {
+ if (this->heldItemAction > PLAYER_IA_LAST_USED) {
+ func_80831990(play, this, ITEM_NONE);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void func_8082DE50(PlayState* play, Player* this) {
+ func_8082DD2C(play, this);
+ func_8082DCA0(play, this);
+}
+
+s32 func_8082DE88(Player* this, s32 arg1, s32 arg2) {
+ s16 temp_v0 = this->unk_D64 - D_80862B00;
+
+ this->unk_AE8 += arg1 + (s16)(ABS_ALT(temp_v0) * fabsf(D_80862AFC) * (1.0f / 0x600F0));
+ if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_B | BTN_A)) {
+ this->unk_AE8 += 5;
+ }
+
+ return this->unk_AE8 >= arg2;
+}
+
+void func_8082DF2C(PlayState* play) {
+ if (play->actorCtx.freezeFlashTimer == 0) {
+ play->actorCtx.freezeFlashTimer = 1;
+ }
+}
+
+u8 D_8085B9F0[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ true, // PLAYER_LIMB_UPPER_ROOT
+ true, // PLAYER_LIMB_HEAD
+ true, // PLAYER_LIMB_HAT
+ true, // PLAYER_LIMB_COLLAR
+ true, // PLAYER_LIMB_L_SHOULDER
+ true, // PLAYER_LIMB_L_FOREARM
+ true, // PLAYER_LIMB_L_HAND
+ true, // PLAYER_LIMB_R_SHOULDER
+ true, // PLAYER_LIMB_R_FOREARM
+ true, // PLAYER_LIMB_R_HAND
+ true, // PLAYER_LIMB_SHEATH
+ true, // PLAYER_LIMB_TORSO
+};
+u8 D_8085BA08[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ false, // PLAYER_LIMB_UPPER_ROOT
+ false, // PLAYER_LIMB_HEAD
+ false, // PLAYER_LIMB_HAT
+ false, // PLAYER_LIMB_COLLAR
+ true, // PLAYER_LIMB_L_SHOULDER
+ true, // PLAYER_LIMB_L_FOREARM
+ true, // PLAYER_LIMB_L_HAND
+ false, // PLAYER_LIMB_R_SHOULDER
+ false, // PLAYER_LIMB_R_FOREARM
+ false, // PLAYER_LIMB_R_HAND
+ false, // PLAYER_LIMB_SHEATH
+ false, // PLAYER_LIMB_TORSO
+};
+u8 D_8085BA20[PLAYER_LIMB_MAX] = {
+ false, // PLAYER_LIMB_NONE
+ false, // PLAYER_LIMB_ROOT
+ false, // PLAYER_LIMB_WAIST
+ false, // PLAYER_LIMB_LOWER_ROOT
+ false, // PLAYER_LIMB_R_THIGH
+ false, // PLAYER_LIMB_R_SHIN
+ false, // PLAYER_LIMB_R_FOOT
+ false, // PLAYER_LIMB_L_THIGH
+ false, // PLAYER_LIMB_L_SHIN
+ false, // PLAYER_LIMB_L_FOOT
+ false, // PLAYER_LIMB_UPPER_ROOT
+ false, // PLAYER_LIMB_HEAD
+ false, // PLAYER_LIMB_HAT
+ false, // PLAYER_LIMB_COLLAR
+ false, // PLAYER_LIMB_L_SHOULDER
+ false, // PLAYER_LIMB_L_FOREARM
+ false, // PLAYER_LIMB_L_HAND
+ true, // PLAYER_LIMB_R_SHOULDER
+ true, // PLAYER_LIMB_R_FOREARM
+ true, // PLAYER_LIMB_R_HAND
+ false, // PLAYER_LIMB_SHEATH
+ false, // PLAYER_LIMB_TORSO
+};
+
+void Player_RequestRumble(PlayState* play, Player* this, s32 sourceIntensity, s32 decayTimer, s32 decayStep,
+ s32 distSq) {
+ if (this == GET_PLAYER(play)) {
+ Rumble_Request(distSq, sourceIntensity, decayTimer, decayStep);
+ }
+}
+
+// TODO: less dumb name
+#define SFX_VOICE_BANK_SIZE 0x20
+
+PlayerAgeProperties sPlayerAgeProperties[PLAYER_FORM_MAX] = {
+ {
+ // unk_00;
+ 84.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 1.5f,
+ // unk_0C;
+ 166.5f,
+ // unk_10;
+ 105.0f,
+ // unk_14;
+ 119.100006f,
+ // unk_18;
+ 88.5f,
+ // unk_1C;
+ 61.5f,
+ // unk_20;
+ 28.5f,
+ // unk_24;
+ 54.0f,
+ // unk_28;
+ 75.0f,
+ // unk_2C;
+ 84.0f,
+ // unk_30;
+ 102.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 27.0f,
+ // unk_3C;
+ 24.75f,
+ // unk_40;
+ 105.0f,
+ // unk_44
+ { 9, 0x123F, 0x167 },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 0,
+ // surfaceSfxIdOffset;
+ 0x80,
+ // unk_98;
+ 33.0f,
+ // unk_9C;
+ 44.15145f,
+ // openChestAnim
+ &gPlayerAnim_link_demo_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_link_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_link_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_link_normal_climb_upL,
+ &gPlayerAnim_link_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_link_normal_climb_endAL,
+ &gPlayerAnim_link_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_link_normal_climb_endBR,
+ &gPlayerAnim_link_normal_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 70.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 0.74f,
+ // unk_0C;
+ 111.0f,
+ // unk_10;
+ 70.0f,
+ // unk_14;
+ 79.4f,
+ // unk_18;
+ 59.0f,
+ // unk_1C;
+ 41.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 36.0f,
+ // unk_28;
+ 50.0f,
+ // unk_2C;
+ 56.0f,
+ // unk_30;
+ 68.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 19.5f,
+ // unk_3C;
+ 18.2f,
+ // unk_40;
+ 80.0f,
+ // unk_44
+ { 0x17, 0xF3B, 0xDF },
+ {
+ { 0x18, 0xF3B, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0xF3B, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ },
+ {
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0x1AF2, 0xDF },
+ { 0x17, 0x14CF, 0xDF },
+ { 0x18, 0x1AF2, 0xDF },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 6,
+ // surfaceSfxIdOffset;
+ 0x150,
+ // unk_98;
+ -25.0f,
+ // unk_9C;
+ 42.0f,
+ // openChestAnim
+ &gPlayerAnim_pg_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_pg_climb_startA,
+ // unk_B0
+ &gPlayerAnim_pg_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_pg_climb_upL,
+ &gPlayerAnim_pg_climb_upR,
+ &gPlayerAnim_pg_climb_upL,
+ &gPlayerAnim_pg_climb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_pg_climb_endAL,
+ &gPlayerAnim_pg_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_pg_climb_endBR,
+ &gPlayerAnim_pg_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 56.0f,
+ // shadowScale;
+ 90.0f,
+ // unk_08;
+ 1.0f,
+ // unk_0C;
+ 111.0f,
+ // unk_10;
+ 70.0f,
+ // unk_14;
+ 79.4f,
+ // unk_18;
+ 59.0f,
+ // unk_1C;
+ 41.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 36.0f,
+ // unk_28;
+ 50.0f,
+ // unk_2C;
+ 56.0f,
+ // unk_30;
+ 68.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 18.0f,
+ // unk_3C;
+ 23.0f,
+ // unk_40;
+ 70.0f,
+ // unk_44
+ { 0x17, 0x1323, -0x6D },
+ {
+ { 0x17, 0x1323, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ { 0x17, 0x1323, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ },
+ {
+ { 0x17, 0x18B7, -0x6D },
+ { 0x18, 0x1EDA, -0x58 },
+ { 0x17, 0x18B7, -0x6D },
+ { 0x18, 0x1EDA, -0x58 },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 5,
+ // surfaceSfxIdOffset;
+ 0x120,
+ // unk_98;
+ 22.0f,
+ // unk_9C;
+ 36.0f,
+ // openChestAnim
+ &gPlayerAnim_pz_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_pz_climb_startA,
+ // unk_B0
+ &gPlayerAnim_pz_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_pz_climb_upL,
+ &gPlayerAnim_pz_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_pz_climb_endAL,
+ &gPlayerAnim_pz_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_pz_climb_endBR,
+ &gPlayerAnim_pz_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 35.0f,
+ // shadowScale;
+ 50.0f,
+ // unk_08;
+ 0.3f,
+ // unk_0C;
+ 71.0f,
+ // unk_10;
+ 50.0f,
+ // unk_14;
+ 49.0f,
+ // unk_18;
+ 39.0f,
+ // unk_1C;
+ 27.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 8.0f,
+ // unk_28;
+ 13.6f,
+ // unk_2C;
+ 24.0f,
+ // unk_30;
+ 24.0f,
+ // unk_34; // height?
+ 70.0f,
+ // unk_38;
+ 14.0f,
+ // unk_3C;
+ 12.0f,
+ // unk_40;
+ 55.0f,
+ // unk_44
+ { -0x18, 0xDED, 0x36C },
+ {
+ { -0x18, 0xD92, 0x35E },
+ { -0x18, 0x1371, 0x3A9 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { -0x18, 0x1371, 0x3A9 },
+ { -0x18, 0x195F, 0x3A9 },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 4,
+ // surfaceSfxIdOffset;
+ 0xF0,
+ // unk_98;
+ -21.0f,
+ // unk_9C;
+ 33.0f,
+ // openChestAnim
+ &gPlayerAnim_pn_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_link_demo_back_to_past,
+ // unk_A8
+ &gPlayerAnim_link_demo_return_to_past,
+ // unk_AC
+ &gPlayerAnim_clink_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_clink_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_clink_normal_climb_upL,
+ &gPlayerAnim_clink_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_clink_normal_climb_endAL,
+ &gPlayerAnim_clink_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_clink_normal_climb_endBR,
+ &gPlayerAnim_clink_normal_climb_endBL,
+ },
+ },
+ {
+ // unk_00;
+ 40.0f,
+ // shadowScale;
+ 60.0f,
+ // unk_08;
+ 11.0f / 17.0f,
+ // unk_0C;
+ 71.0f,
+ // unk_10;
+ 50.0f,
+ // unk_14;
+ 49.0f,
+ // unk_18;
+ 39.0f,
+ // unk_1C;
+ 27.0f,
+ // unk_20;
+ 19.0f,
+ // unk_24;
+ 22.0f,
+ // unk_28;
+ 32.4f,
+ // unk_2C;
+ 32.0f,
+ // unk_30;
+ 48.0f,
+ // unk_34; // height?
+ 11.0f / 17.0f * 70.0f,
+ // unk_38;
+ 14.0f,
+ // unk_3C;
+ 12.0f,
+ // unk_40;
+ 55.0f,
+ // unk_44
+ { -0x18, 0xDED, 0x36C },
+ {
+ { -0x18, 0xD92, 0x35E },
+ { -0x18, 0x1371, 0x3A9 },
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ },
+ {
+ { -0x18, 0x1371, 0x3A9 },
+ { -0x18, 0x195F, 0x3A9 },
+ { 9, 0x17EA, 0x167 },
+ { 9, 0x1E0D, 0x17C },
+ },
+ {
+ { 8, 0x1256, 0x17C },
+ { 9, 0x17EA, 0x167 },
+ { -0x638, 0x1256, 0x17C },
+ { -0x637, 0x17EA, 0x167 },
+ },
+ // voiceSfxIdOffset;
+ SFX_VOICE_BANK_SIZE * 1,
+ // surfaceSfxIdOffset;
+ 0,
+ // unk_98;
+ 22.0f,
+ // unk_9C;
+ 29.4343f,
+ // openChestAnim
+ &gPlayerAnim_clink_demo_Tbox_open,
+ // unk_A4
+ &gPlayerAnim_clink_demo_goto_future,
+ // unk_A8
+ &gPlayerAnim_clink_demo_return_to_future,
+ // unk_AC
+ &gPlayerAnim_clink_normal_climb_startA,
+ // unk_B0
+ &gPlayerAnim_clink_normal_climb_startB,
+ // unk_B4
+ {
+ &gPlayerAnim_clink_normal_climb_upL,
+ &gPlayerAnim_clink_normal_climb_upR,
+ &gPlayerAnim_link_normal_Fclimb_upL,
+ &gPlayerAnim_link_normal_Fclimb_upR,
+ },
+ // unk_C4
+ {
+ &gPlayerAnim_link_normal_Fclimb_sideL,
+ &gPlayerAnim_link_normal_Fclimb_sideR,
+ },
+ // unk_CC
+ {
+ &gPlayerAnim_clink_normal_climb_endAL,
+ &gPlayerAnim_clink_normal_climb_endAR,
+ },
+ // unk_D4
+ {
+ &gPlayerAnim_clink_normal_climb_endBR,
+ &gPlayerAnim_clink_normal_climb_endBL,
+ },
+ },
+};
+
+PlayerAnimationHeader* D_8085BE84[PLAYER_ANIMGROUP_MAX][PLAYER_ANIMTYPE_MAX] = {
+ // PLAYER_ANIMGROUP_0
+ {
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ &gPlayerAnim_link_normal_wait, // Default idle standing, looking forward, sword and shield
+ &gPlayerAnim_link_normal_wait, // Default idle standing, looking forward, sword and shield
+ &gPlayerAnim_link_fighter_wait_long, // Default idle standing, looking forward, two hand weapon
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ &gPlayerAnim_link_normal_wait_free, // Default idle standing, looking forward
+ },
+ // PLAYER_ANIMGROUP_1
+ {
+ &gPlayerAnim_link_normal_walk_free,
+ &gPlayerAnim_link_normal_walk,
+ &gPlayerAnim_link_normal_walk,
+ &gPlayerAnim_link_fighter_walk_long,
+ &gPlayerAnim_link_normal_walk_free,
+ &gPlayerAnim_link_normal_walk_free,
+ },
+ // PLAYER_ANIMGROUP_2
+ {
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ &gPlayerAnim_link_fighter_run, // Running with Sword and Shield in hands
+ &gPlayerAnim_link_normal_run,
+ &gPlayerAnim_link_fighter_run_long, // Running with Two handed weapon
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ &gPlayerAnim_link_normal_run_free, // Running with empty hands
+ },
+ // PLAYER_ANIMGROUP_3
+ {
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_fighter_damage_run,
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_fighter_damage_run_long,
+ &gPlayerAnim_link_normal_damage_run_free,
+ &gPlayerAnim_link_normal_damage_run_free,
+ },
+ // PLAYER_ANIMGROUP_4
+ {
+ &gPlayerAnim_link_normal_waitL_free,
+ &gPlayerAnim_link_anchor_waitL,
+ &gPlayerAnim_link_anchor_waitL,
+ &gPlayerAnim_link_fighter_waitL_long,
+ &gPlayerAnim_link_normal_waitL_free,
+ &gPlayerAnim_link_normal_waitL_free,
+ },
+ // PLAYER_ANIMGROUP_5
+ {
+ &gPlayerAnim_link_normal_waitR_free,
+ &gPlayerAnim_link_anchor_waitR,
+ &gPlayerAnim_link_anchor_waitR,
+ &gPlayerAnim_link_fighter_waitR_long,
+ &gPlayerAnim_link_normal_waitR_free,
+ &gPlayerAnim_link_normal_waitR_free,
+ },
+ // PLAYER_ANIMGROUP_6
+ {
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_normal_wait2waitR,
+ &gPlayerAnim_link_normal_wait2waitR,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ &gPlayerAnim_link_fighter_wait2waitR_long,
+ },
+ // PLAYER_ANIMGROUP_7
+ {
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_fighter_normal2fighter,
+ &gPlayerAnim_link_fighter_normal2fighter,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ &gPlayerAnim_link_normal_normal2fighter_free,
+ },
+ // PLAYER_ANIMGROUP_8
+ {
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link,
+ &gPlayerAnim_link_demo_doorA_link,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ &gPlayerAnim_link_demo_doorA_link_free,
+ },
+ // PLAYER_ANIMGROUP_9
+ {
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ &gPlayerAnim_clink_demo_doorA_link,
+ },
+ // PLAYER_ANIMGROUP_10
+ {
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link,
+ &gPlayerAnim_link_demo_doorB_link,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ &gPlayerAnim_link_demo_doorB_link_free,
+ },
+ // PLAYER_ANIMGROUP_11
+ {
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ &gPlayerAnim_clink_demo_doorB_link,
+ },
+ // PLAYER_ANIMGROUP_12
+ {
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB, //
+ &gPlayerAnim_link_normal_carryB, //
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ &gPlayerAnim_link_normal_carryB_free, // Grabbing something from the floor
+ },
+ // PLAYER_ANIMGROUP_13
+ {
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing,
+ &gPlayerAnim_link_normal_landing,
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing_free,
+ &gPlayerAnim_link_normal_landing_free,
+ },
+ // PLAYER_ANIMGROUP_14
+ {
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing,
+ &gPlayerAnim_link_normal_short_landing,
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing_free,
+ &gPlayerAnim_link_normal_short_landing_free,
+ },
+ // PLAYER_ANIMGROUP_15
+ {
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ &gPlayerAnim_link_normal_landing_roll, // Rolling with sword and shield
+ &gPlayerAnim_link_normal_landing_roll, // Rolling with sword and shield
+ &gPlayerAnim_link_fighter_landing_roll_long, // Rolling with two hand weapon
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ &gPlayerAnim_link_normal_landing_roll_free, // Rolling with nothing in hands
+ },
+ // PLAYER_ANIMGROUP_16
+ {
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ &gPlayerAnim_link_normal_hip_down, // Rolling bonk swrod and shield
+ &gPlayerAnim_link_normal_hip_down, // Rolling bonk swrod and shield
+ &gPlayerAnim_link_normal_hip_down_long, // Rolling bonk two hand weapon
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ &gPlayerAnim_link_normal_hip_down_free, // Rolling bonk
+ },
+ // PLAYER_ANIMGROUP_17
+ {
+ &gPlayerAnim_link_normal_walk_endL_free,
+ &gPlayerAnim_link_normal_walk_endL,
+ &gPlayerAnim_link_normal_walk_endL,
+ &gPlayerAnim_link_fighter_walk_endL_long,
+ &gPlayerAnim_link_normal_walk_endL_free,
+ &gPlayerAnim_link_normal_walk_endL_free,
+ },
+ // PLAYER_ANIMGROUP_18
+ {
+ &gPlayerAnim_link_normal_walk_endR_free,
+ &gPlayerAnim_link_normal_walk_endR,
+ &gPlayerAnim_link_normal_walk_endR,
+ &gPlayerAnim_link_fighter_walk_endR_long,
+ &gPlayerAnim_link_normal_walk_endR_free,
+ &gPlayerAnim_link_normal_walk_endR_free,
+ },
+ // PLAYER_ANIMGROUP_19
+ {
+ &gPlayerAnim_link_normal_defense_free,
+ &gPlayerAnim_link_normal_defense,
+ &gPlayerAnim_link_normal_defense,
+ &gPlayerAnim_link_normal_defense_free,
+ &gPlayerAnim_link_bow_defense,
+ &gPlayerAnim_link_normal_defense_free,
+ },
+ // PLAYER_ANIMGROUP_20
+ {
+ &gPlayerAnim_link_normal_defense_wait_free,
+ &gPlayerAnim_link_normal_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait_free,
+ &gPlayerAnim_link_bow_defense_wait,
+ &gPlayerAnim_link_normal_defense_wait_free,
+ },
+ // PLAYER_ANIMGROUP_21
+ {
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end,
+ &gPlayerAnim_link_normal_defense_end,
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end_free,
+ &gPlayerAnim_link_normal_defense_end_free,
+ },
+ // PLAYER_ANIMGROUP_22
+ {
+ &gPlayerAnim_link_normal_side_walk_free,
+ &gPlayerAnim_link_normal_side_walk,
+ &gPlayerAnim_link_normal_side_walk,
+ &gPlayerAnim_link_fighter_side_walk_long,
+ &gPlayerAnim_link_normal_side_walk_free,
+ &gPlayerAnim_link_normal_side_walk_free,
+ },
+ // PLAYER_ANIMGROUP_23
+ {
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ &gPlayerAnim_link_anchor_side_walkL, // Side walking with sword and shield in hands
+ &gPlayerAnim_link_anchor_side_walkL, // Side walking with sword and shield in hands
+ &gPlayerAnim_link_fighter_side_walkL_long,
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ &gPlayerAnim_link_normal_side_walkL_free, // Side walking
+ },
+ // PLAYER_ANIMGROUP_24
+ {
+ &gPlayerAnim_link_normal_side_walkR_free,
+ &gPlayerAnim_link_anchor_side_walkR,
+ &gPlayerAnim_link_anchor_side_walkR,
+ &gPlayerAnim_link_fighter_side_walkR_long,
+ &gPlayerAnim_link_normal_side_walkR_free,
+ &gPlayerAnim_link_normal_side_walkR_free,
+ },
+ // PLAYER_ANIMGROUP_25
+ {
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn,
+ &gPlayerAnim_link_normal_45_turn,
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn_free,
+ &gPlayerAnim_link_normal_45_turn_free,
+ },
+ // PLAYER_ANIMGROUP_26
+ {
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_normal_waitL2wait,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ &gPlayerAnim_link_fighter_waitL2wait_long,
+ },
+ // PLAYER_ANIMGROUP_27
+ {
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_normal_waitR2wait,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ &gPlayerAnim_link_fighter_waitR2wait_long,
+ },
+ // PLAYER_ANIMGROUP_28
+ {
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw,
+ &gPlayerAnim_link_normal_throw,
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw_free,
+ &gPlayerAnim_link_normal_throw_free,
+ },
+ // PLAYER_ANIMGROUP_29
+ {
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put,
+ &gPlayerAnim_link_normal_put,
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put_free,
+ &gPlayerAnim_link_normal_put_free,
+ },
+ // PLAYER_ANIMGROUP_30
+ {
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ &gPlayerAnim_link_normal_back_walk,
+ },
+ // PLAYER_ANIMGROUP_31
+ {
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check,
+ &gPlayerAnim_link_normal_check,
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check_free,
+ &gPlayerAnim_link_normal_check_free,
+ },
+ // PLAYER_ANIMGROUP_32
+ {
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait,
+ &gPlayerAnim_link_normal_check_wait,
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait_free,
+ &gPlayerAnim_link_normal_check_wait_free,
+ },
+ // PLAYER_ANIMGROUP_33
+ {
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end,
+ &gPlayerAnim_link_normal_check_end,
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end_free,
+ &gPlayerAnim_link_normal_check_end_free,
+ },
+ // PLAYER_ANIMGROUP_34
+ {
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start,
+ &gPlayerAnim_link_normal_pull_start,
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start_free,
+ &gPlayerAnim_link_normal_pull_start_free,
+ },
+ // PLAYER_ANIMGROUP_35
+ {
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling,
+ &gPlayerAnim_link_normal_pulling,
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling_free,
+ &gPlayerAnim_link_normal_pulling_free,
+ },
+ // PLAYER_ANIMGROUP_36
+ {
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end,
+ &gPlayerAnim_link_normal_pull_end,
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end_free,
+ &gPlayerAnim_link_normal_pull_end_free,
+ },
+ // PLAYER_ANIMGROUP_37
+ {
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up,
+ &gPlayerAnim_link_normal_fall_up,
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up_free,
+ &gPlayerAnim_link_normal_fall_up_free,
+ },
+ // PLAYER_ANIMGROUP_38
+ {
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold,
+ &gPlayerAnim_link_normal_jump_climb_hold,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ &gPlayerAnim_link_normal_jump_climb_hold_free,
+ },
+ // PLAYER_ANIMGROUP_39
+ {
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait,
+ &gPlayerAnim_link_normal_jump_climb_wait,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ &gPlayerAnim_link_normal_jump_climb_wait_free,
+ },
+ // PLAYER_ANIMGROUP_40
+ {
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up,
+ &gPlayerAnim_link_normal_jump_climb_up,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ &gPlayerAnim_link_normal_jump_climb_up_free,
+ },
+ // PLAYER_ANIMGROUP_41
+ {
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ &gPlayerAnim_link_normal_down_slope_slip_end,
+ &gPlayerAnim_link_normal_down_slope_slip_end,
+ &gPlayerAnim_link_normal_down_slope_slip_end_long,
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ &gPlayerAnim_link_normal_down_slope_slip_end_free,
+ },
+ // PLAYER_ANIMGROUP_42
+ {
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ &gPlayerAnim_link_normal_up_slope_slip_end,
+ &gPlayerAnim_link_normal_up_slope_slip_end,
+ &gPlayerAnim_link_normal_up_slope_slip_end_long,
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ &gPlayerAnim_link_normal_up_slope_slip_end_free,
+ },
+ // PLAYER_ANIMGROUP_43
+ {
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_lkt_nwait,
+ &gPlayerAnim_lkt_nwait,
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_sude_nwait,
+ &gPlayerAnim_sude_nwait,
+ }
+};
+
+struct_8085C2A4 D_8085C2A4[] = {
+ /* 0 / Forward */
+ {
+ &gPlayerAnim_link_fighter_front_jump,
+ &gPlayerAnim_link_fighter_front_jump_end,
+ &gPlayerAnim_link_fighter_front_jump_endR,
+ },
+ /* 1 / Left */
+ {
+ &gPlayerAnim_link_fighter_Lside_jump,
+ &gPlayerAnim_link_fighter_Lside_jump_end,
+ &gPlayerAnim_link_fighter_Lside_jump_endL,
+ },
+ /* 2 / Back */
+ {
+ &gPlayerAnim_link_fighter_backturn_jump,
+ &gPlayerAnim_link_fighter_backturn_jump_end,
+ &gPlayerAnim_link_fighter_backturn_jump_endR,
+ },
+ /* 3 / Right */
+ {
+ &gPlayerAnim_link_fighter_Rside_jump,
+ &gPlayerAnim_link_fighter_Rside_jump_end,
+ &gPlayerAnim_link_fighter_Rside_jump_endR,
+ },
+ /* 4 / */
+ {
+ &gPlayerAnim_link_normal_newroll_jump_20f,
+ &gPlayerAnim_link_normal_newroll_jump_end_20f,
+ &gPlayerAnim_link_normal_newroll_jump_end_20f,
+ },
+ /* 5 / */
+ {
+ &gPlayerAnim_link_normal_newside_jump_20f,
+ &gPlayerAnim_link_normal_newside_jump_end_20f,
+ &gPlayerAnim_link_normal_newside_jump_end_20f,
+ },
+};
+
+// sCylinderInit
+ColliderCylinderInit D_8085C2EC = {
+ {
+ COLTYPE_HIT5,
+ AT_NONE,
+ AC_ON | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
+ { 12, 60, 0, { 0, 0, 0 } },
+};
+
+// sShieldCylinderInit
+ColliderCylinderInit D_8085C318 = {
+ {
+ COLTYPE_METAL,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_ON | AC_HARD | AC_TYPE_ENEMY,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00100000, 0x00, 0x02 },
+ { 0xD7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
+ { 25, 60, 0, { 0, 0, 0 } },
+};
+
+// sMeleeWeaponQuadInit
+ColliderQuadInit D_8085C344 = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_NONE,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_QUAD,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00000000, 0x00, 0x01 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
+ { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } },
+};
+
+// sShieldQuadInit
+ColliderQuadInit D_8085C394 = {
+ {
+ COLTYPE_METAL,
+ AT_ON | AT_TYPE_PLAYER,
+ AC_ON | AC_HARD | AC_TYPE_ENEMY,
+ OC1_NONE,
+ OC2_TYPE_PLAYER,
+ COLSHAPE_QUAD,
+ },
+ {
+ ELEMTYPE_UNK2,
+ { 0x00100000, 0x00, 0x00 },
+ { 0xD7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_NONE,
+ },
+ { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } },
+};
+
+f32 D_8085C3E4 = 1.0f;
+f32 D_8085C3E8 = 1.0f;
+
+// ANIMSFX_TYPE_VOICE
+void Player_AnimSfx_PlayVoice(Player* this, u16 sfxId) {
+ u16 sfxOffset;
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ func_8019F830(&this->actor.projectedPos, sfxId);
+ } else if (this->actor.id == ACTOR_PLAYER) {
+ if (this->currentMask == PLAYER_MASK_SCENTS) {
+ sfxOffset = SFX_VOICE_BANK_SIZE * 7;
+ } else {
+ sfxOffset = this->ageProperties->voiceSfxIdOffset;
+ }
+
+ Player_PlaySfx(this, sfxOffset + sfxId);
+ }
+}
+
+u16 D_8085C3EC[] = {
+ NA_SE_VO_LI_SWEAT,
+ NA_SE_VO_LI_SNEEZE,
+ NA_SE_VO_LI_RELAX,
+ NA_SE_VO_LI_FALL_L,
+};
+
+void func_8082E00C(Player* this) {
+ s32 i;
+ u16* sfxIdPtr = D_8085C3EC;
+
+ for (i = 0; i < ARRAY_COUNT(D_8085C3EC); i++) {
+ AudioSfx_StopById((u16)(*sfxIdPtr + this->ageProperties->voiceSfxIdOffset));
+ sfxIdPtr++;
+ }
+}
+
+u16 Player_GetFloorSfx(Player* this, u16 sfxId) {
+ return sfxId + this->floorSfxOffset;
+}
+
+// ANIMSFX_TYPE_FLOOR
+void Player_AnimSfx_PlayFloor(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, Player_GetFloorSfx(this, sfxId));
+}
+
+u16 Player_GetFloorSfxByAge(Player* this, u16 sfxId) {
+ return sfxId + this->floorSfxOffset + this->ageProperties->surfaceSfxIdOffset;
+}
+
+// ANIMSFX_TYPE_FLOOR_BY_AGE
+void Player_AnimSfx_PlayFloorByAge(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, sfxId));
+}
+
+// ANIMSFX_TYPE_6 and ANIMSFX_TYPE_8
+void Player_AnimSfx_PlayFloorWalk(Player* this, f32 freqVolumeLerp) {
+ s32 sfxId;
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ sfxId = NA_SE_PL_GIANT_WALK;
+ } else {
+ sfxId = Player_GetFloorSfxByAge(this, NA_SE_PL_WALK_GROUND);
+ }
+
+ // Audio_PlaySfx_AtPosForMetalEffectsWithSyncedFreqAndVolume
+ func_8019F638(&this->actor.projectedPos, sfxId, freqVolumeLerp);
+}
+
+// ANIMSFX_TYPE_FLOOR_JUMP
+void Player_AnimSfx_PlayFloorJump(Player* this) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, NA_SE_PL_JUMP_GROUND));
+}
+
+// ANIMSFX_TYPE_FLOOR_LAND
+void Player_AnimSfx_PlayFloorLand(Player* this) {
+ Player_PlaySfx(this, Player_GetFloorSfxByAge(this, NA_SE_PL_LAND_GROUND));
+}
+
+void func_8082E1F0(Player* this, u16 sfxId) {
+ Player_PlaySfx(this, sfxId);
+ this->stateFlags2 |= PLAYER_STATE2_8;
+}
+
+void Player_PlayAnimSfx(Player* this, AnimSfxEntry* entry) {
+ s32 cond;
+
+ do {
+ s32 data = ABS_ALT(entry->flags);
+ s32 type = ANIMSFX_GET_TYPE(data);
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, fabsf(ANIMSFX_GET_FRAME(data)))) {
+ if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_GENERAL)) {
+ Player_PlaySfx(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR)) {
+ Player_AnimSfx_PlayFloor(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_BY_AGE)) {
+ Player_AnimSfx_PlayFloorByAge(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_VOICE)) {
+ Player_AnimSfx_PlayVoice(this, entry->sfxId);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_LAND)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_6)) {
+ Player_AnimSfx_PlayFloorWalk(this, 6.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_FLOOR_JUMP)) {
+ Player_AnimSfx_PlayFloorJump(this);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_8)) {
+ Player_AnimSfx_PlayFloorWalk(this, 0.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_9)) {
+ // Audio_PlaySfx_AtPosForMetalEffectsWithSyncedFreqAndVolume
+ func_8019F638(&this->actor.projectedPos, this->ageProperties->surfaceSfxIdOffset + NA_SE_PL_WALK_LADDER,
+ 0.0f);
+ } else if (type == ANIMSFX_SHIFT_TYPE(ANIMSFX_TYPE_SURFACE)) {
+ Player_PlaySfx(this, entry->sfxId + this->ageProperties->surfaceSfxIdOffset);
+ }
+ }
+
+ cond = entry->flags >= 0;
+ entry++;
+ } while (cond);
+}
+
+void func_8082E438(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -6.0f);
+}
+
+void func_8082E4A4(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -6.0f);
+}
+
+void func_8082E514(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8082E55C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8082E5A8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082E5EC(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f);
+}
+
+void func_8082E634(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 3.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -16.0f);
+}
+
+// Player_AnimationPlayLoopIfCurrentFinished
+s32 func_8082E67C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, anim);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void func_8082E6D0(Player* this) {
+ this->skelAnime.prevTransl = this->skelAnime.baseTransl;
+ this->skelAnime.prevRot = this->actor.shape.rot.y;
+}
+
+void func_8082E6F8(Player* this) {
+ func_8082E6D0(this);
+ this->skelAnime.prevTransl.x *= this->ageProperties->unk_08;
+ this->skelAnime.prevTransl.y *= this->ageProperties->unk_08;
+ this->skelAnime.prevTransl.z *= this->ageProperties->unk_08;
+}
+
+void func_8082E784(Player* this) {
+ this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y = 0;
+}
+
+void func_8082E794(Player* this) {
+ if (this->skelAnime.moveFlags) {
+ func_8082DC28(this);
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = this->skelAnime.baseTransl.x;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = this->skelAnime.baseTransl.z;
+
+ if (this->skelAnime.moveFlags & ANIM_FLAG_8) {
+ if (this->skelAnime.moveFlags & ANIM_FLAG_UPDATE_Y) {
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y = this->skelAnime.prevTransl.y;
+ }
+ } else {
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y = this->skelAnime.baseTransl.y;
+ }
+ func_8082E6D0(this);
+ this->skelAnime.moveFlags = 0;
+ }
+}
+
+void func_8082E820(Player* this, s32 moveFlags) {
+ Vec3f pos;
+
+ this->skelAnime.moveFlags = moveFlags;
+ this->skelAnime.prevTransl = this->skelAnime.baseTransl;
+ SkelAnime_UpdateTranslation(&this->skelAnime, &pos, this->actor.shape.rot.y);
+
+ if (moveFlags & ANIM_FLAG_1) {
+ pos.x *= this->ageProperties->unk_08;
+ pos.z *= this->ageProperties->unk_08;
+ this->actor.world.pos.x += pos.x * this->actor.scale.x;
+ this->actor.world.pos.z += pos.z * this->actor.scale.z;
+ }
+
+ if (moveFlags & ANIM_FLAG_UPDATE_Y) {
+ if (!(moveFlags & ANIM_FLAG_4)) {
+ pos.y *= this->ageProperties->unk_08;
+ }
+ this->actor.world.pos.y += pos.y * this->actor.scale.y;
+ }
+
+ func_8082DC28(this);
+}
+
+void func_8082E920(PlayState* play, Player* this, s32 moveFlags) {
+ if (moveFlags & ANIM_FLAG_200) {
+ func_8082E6F8(this);
+ } else if ((moveFlags & ANIM_FLAG_100) || this->skelAnime.moveFlags) {
+ func_8082E6D0(this);
+ } else {
+ this->skelAnime.prevTransl = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1];
+ this->skelAnime.prevRot = this->actor.shape.rot.y;
+ }
+
+ this->skelAnime.moveFlags = moveFlags;
+ Player_StopHorizontalMovement(this);
+ AnimationContext_DisableQueue(play);
+}
+
+void func_8082E9C8(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags, f32 playSpeed) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, playSpeed);
+ func_8082E920(play, this, moveFlags);
+}
+
+void func_8082EA10(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082E9C8(play, this, anim, moveFlags, 3.0f / 3.0f);
+}
+
+void func_8082EA38(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082E9C8(play, this, anim, moveFlags, 2.0f / 3.0f);
+}
+
+void func_8082EA60(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082EA38(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_200);
+}
+
+void func_8082EA80(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags, f32 playSpeed) {
+ PlayerAnimation_PlayLoopSetSpeed(play, &this->skelAnime, anim, playSpeed);
+ func_8082E920(play, this, moveFlags);
+}
+
+void func_8082EAC8(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082EA80(play, this, anim, moveFlags, 3.0f / 3.0f);
+}
+
+void func_8082EAF0(PlayState* play, Player* this, PlayerAnimationHeader* anim, s32 moveFlags) {
+ func_8082EA80(play, this, anim, moveFlags, 2.0f / 3.0f);
+}
+
+void func_8082EB18(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082EAF0(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+}
+
+void func_8082EB38(PlayState* play, Player* this) {
+ s8 var_v0;
+ s8 var_v1;
+
+ this->unk_D60 = D_80862AFC;
+ this->unk_D64 = D_80862B00;
+ func_800FF3A0(&D_80862AFC, &D_80862B00, sPlayerControlInput);
+
+ if (D_80862AFC < 8.0f) {
+ D_80862AFC = 0.0f;
+ }
+
+ D_80862B02 = Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]) + D_80862B00;
+ this->unk_ADE = (this->unk_ADE + 1) % ARRAY_COUNT(this->unk_ADF);
+ if (D_80862AFC < 55.0f) {
+ var_v0 = -1;
+ var_v1 = -1;
+ } else {
+ var_v1 = ((u16)(D_80862B00 + 0x2000)) >> 9;
+ var_v0 = ((u16)(BINANG_SUB(D_80862B02, this->actor.shape.rot.y) + 0x2000)) >> 14;
+ }
+ this->unk_ADF[this->unk_ADE] = var_v1;
+ this->unk_AE3[this->unk_ADE] = var_v0;
+}
+
+void func_8082EC9C(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, D_8085C3E4);
+}
+
+s32 func_8082ECCC(Player* this) {
+ return this->stateFlags1 & PLAYER_STATE1_1000000;
+}
+
+#define CHEST_ANIM_SHORT 0
+#define CHEST_ANIM_LONG 1
+
+// TODO: consider what to do with the NONEs: cannot use a zero-argument macro like OoT since the text id is involved.
+#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \
+ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId }
+
+#define GIFIELD_GET_DROP_TYPE(field) ((field)&0x1F)
+#define GIFIELD_20 (1 << 5)
+#define GIFIELD_40 (1 << 6)
+#define GIFIELD_NO_COLLECTIBLE (1 << 7)
+/**
+ * `flags` must be 0, GIFIELD_20, GIFIELD_40 or GIFIELD_NO_COLLECTIBLE (which can be or'ed together)
+ * `dropType` must be either a value from the `Item00Type` enum or 0 if the `GIFIELD_NO_COLLECTIBLE` flag was used
+ */
+#define GIFIELD(flags, dropType) ((flags) | (dropType))
+
+GetItemEntry sGetItemTable[GI_MAX - 1] = {
+ // GI_RUPEE_GREEN
+ GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xC4, GIFIELD(0, ITEM00_RUPEE_GREEN), CHEST_ANIM_SHORT),
+ // GI_RUPEE_BLUE
+ GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0x2, GIFIELD(0, ITEM00_RUPEE_BLUE), CHEST_ANIM_SHORT),
+ // GI_RUPEE_10
+ GET_ITEM(ITEM_RUPEE_10, OBJECT_GI_RUPY, GID_RUPEE_RED, 0x3, GIFIELD(0, ITEM00_RUPEE_RED), CHEST_ANIM_SHORT),
+ // GI_RUPEE_RED
+ GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0x4, GIFIELD(0, ITEM00_RUPEE_RED), CHEST_ANIM_SHORT),
+ // GI_RUPEE_PURPLE
+ GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0x5, GIFIELD(0, ITEM00_RUPEE_PURPLE),
+ CHEST_ANIM_SHORT),
+ // GI_RUPEE_SILVER
+ GET_ITEM(ITEM_RUPEE_SILVER, OBJECT_GI_RUPY, GID_RUPEE_SILVER, 0x6, GIFIELD(0, ITEM00_RUPEE_PURPLE),
+ CHEST_ANIM_SHORT),
+ // GI_RUPEE_HUGE
+ GET_ITEM(ITEM_RUPEE_HUGE, OBJECT_GI_RUPY, GID_RUPEE_HUGE, 0x7, GIFIELD(0, ITEM00_RUPEE_HUGE), CHEST_ANIM_SHORT),
+ // GI_WALLET_ADULT
+ GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x8, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_WALLET_GIANT
+ GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x9, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_RECOVERY_HEART
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0xA, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_0B
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0xB,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HEART_PIECE
+ GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HEART_CONTAINER
+ GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xD,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MAGIC_SMALL
+ GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE,
+ GIFIELD(GIFIELD_20 | GIFIELD_40, ITEM00_MAGIC_SMALL), CHEST_ANIM_SHORT),
+ // GI_MAGIC_LARGE
+ GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xF,
+ GIFIELD(GIFIELD_20 | GIFIELD_40, ITEM00_MAGIC_LARGE), CHEST_ANIM_SHORT),
+ // GI_10
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x10, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_STRAY_FAIRY
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x11, 0, 0),
+ // GI_12
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x12, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_13
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x13, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_BOMBS_1
+ GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x14, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_5
+ GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x15, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_10
+ GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x16, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_20
+ GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x17, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_BOMBS_30
+ GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x18, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0), CHEST_ANIM_SHORT),
+ // GI_STICKS_1
+ GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x19, GIFIELD(0, ITEM00_STICK), CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_10
+ GET_ITEM(ITEM_BOMBCHUS_10, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x1A, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMB_BAG_20
+ GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x1B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMB_BAG_30
+ GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x1C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMB_BAG_40
+ GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x1D,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_ARROWS_10
+ GET_ITEM(ITEM_ARROWS_10, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0x1E, GIFIELD(GIFIELD_40, ITEM00_ARROWS_30),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_30
+ GET_ITEM(ITEM_ARROWS_30, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0x1F, GIFIELD(GIFIELD_40, ITEM00_ARROWS_40),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_40
+ GET_ITEM(ITEM_ARROWS_40, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0x20, GIFIELD(GIFIELD_40, ITEM00_ARROWS_50),
+ CHEST_ANIM_SHORT),
+ // GI_ARROWS_50
+ GET_ITEM(ITEM_ARROWS_40, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0x21, GIFIELD(GIFIELD_40, ITEM00_ARROWS_50),
+ CHEST_ANIM_SHORT),
+ // GI_QUIVER_30
+ GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x22, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_QUIVER_40
+ GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x23, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_QUIVER_50
+ GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x24, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_FIRE
+ GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x25, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_ICE
+ GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x26, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_ARROW_LIGHT
+ GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x27,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_NUTS_1
+ GET_ITEM(ITEM_NUT, OBJECT_GI_NUTS, GID_NUTS, 0x28, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_NUTS_5
+ GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x29, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_NUTS_10
+ GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x2A, GIFIELD(0, ITEM00_NUTS_1), CHEST_ANIM_SHORT),
+ // GI_2B
+ GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0x2B, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2C
+ GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0x2C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2D
+ GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0x2D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_20
+ GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x2E, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_2F
+ GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x2F, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_30
+ GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x30, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_31
+ GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x31, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SHIELD_HERO
+ GET_ITEM(ITEM_SHIELD_HERO, OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, 0x32,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_SHORT),
+ // GI_SHIELD_MIRROR
+ GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x33,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_POWDER_KEG
+ GET_ITEM(ITEM_POWDER_KEG, OBJECT_GI_BIGBOMB, GID_POWDER_KEG, 0x34, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MAGIC_BEANS
+ GET_ITEM(ITEM_MAGIC_BEANS, OBJECT_GI_BEAN, GID_MAGIC_BEANS, 0x35, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_BOMBCHUS_1
+ GET_ITEM(ITEM_BOMBCHUS_1, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x36, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SWORD_KOKIRI
+ GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0x37,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_RAZOR
+ GET_ITEM(ITEM_SWORD_RAZOR, OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, 0x38,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_GILDED
+ GET_ITEM(ITEM_SWORD_GILDED, OBJECT_GI_SWORD_3, GID_SWORD_GILDED, 0x39,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOMBCHUS_5
+ GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x3A, GIFIELD(GIFIELD_40 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_SWORD_GREAT_FAIRY
+ GET_ITEM(ITEM_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, 0x3B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_KEY_SMALL
+ GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x3C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_KEY_BOSS
+ GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0x3D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MAP
+ GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x3E, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_COMPASS
+ GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x3F, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_40
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x40, 0, 0),
+ // GI_HOOKSHOT
+ GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x41, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_LENS
+ GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x42, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_PICTO_BOX
+ GET_ITEM(ITEM_PICTO_BOX, OBJECT_GI_CAMERA, GID_PICTO_BOX, 0x43, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_44
+ GET_ITEM(ITEM_PICTO_BOX, OBJECT_UNSET_0, GID_NONE, 0x44, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_45
+ GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x45, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_46
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x46, 0, 0),
+ // GI_47
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x47, 0, 0),
+ // GI_48
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x48, 0, 0),
+ // GI_49
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x49, 0, 0),
+ // GI_4A
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4A, 0, 0),
+ // GI_4B
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4B, 0, 0),
+ // GI_OCARINA
+ GET_ITEM(ITEM_OCARINA, OBJECT_GI_OCARINA, GID_OCARINA, 0x4C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_4D
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4D, 0, 0),
+ // GI_4E
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4E, 0, 0),
+ // GI_4F
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x4F, 0, 0),
+ // GI_BOMBERS_NOTEBOOK
+ GET_ITEM(ITEM_BOMBERS_NOTEBOOK, OBJECT_GI_SCHEDULE, GID_BOMBERS_NOTEBOOK, 0x50, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_51
+ GET_ITEM(ITEM_NONE, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x51, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SKULL_TOKEN
+ GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0x52, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_SHORT),
+ // GI_53
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x53, 0, 0),
+ // GI_54
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x54, 0, 0),
+ // GI_REMAINS_ODOLWA
+ GET_ITEM(ITEM_REMAINS_ODOLWA, OBJECT_UNSET_0, GID_REMAINS_ODOLWA, 0x55, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_GOHT
+ GET_ITEM(ITEM_REMAINS_GOHT, OBJECT_UNSET_0, GID_REMAINS_GOHT, 0x56, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_GYORG
+ GET_ITEM(ITEM_REMAINS_GYORG, OBJECT_UNSET_0, GID_REMAINS_GYORG, 0x57, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_REMAINS_TWINMOLD
+ GET_ITEM(ITEM_REMAINS_TWINMOLD, OBJECT_UNSET_0, GID_REMAINS_TWINMOLD, 0x58, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_RED_BOTTLE
+ GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_BOTTLE_RED, GID_57, GIFIELD(GIFIELD_40, ITEM00_BOMBS_0),
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BOTTLE
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x5A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_POTION_RED
+ GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x5B, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_GREEN
+ GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x5C, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_POTION_BLUE
+ GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x5D, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_FAIRY
+ GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE_04, GID_FAIRY, 0x5E, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_DEKU_PRINCESS
+ GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x5F, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MILK_BOTTLE
+ GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x60, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MILK_HALF
+ GET_ITEM(ITEM_MILK_HALF, OBJECT_GI_MILK, GID_MILK, 0x61, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_FISH
+ GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x62, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BUG
+ GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x63, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BLUE_FIRE
+ GET_ITEM(ITEM_BLUE_FIRE, OBJECT_UNSET_0, GID_NONE, 0x64, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_POE
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x65, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_BIG_POE
+ GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0x66, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SPRING_WATER
+ GET_ITEM(ITEM_SPRING_WATER, OBJECT_UNSET_0, GID_NONE, 0x67, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_HOT_SPRING_WATER
+ GET_ITEM(ITEM_HOT_SPRING_WATER, OBJECT_UNSET_0, GID_NONE, 0x68, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_ZORA_EGG
+ GET_ITEM(ITEM_ZORA_EGG, OBJECT_GI_BOTTLE_15, GID_ZORA_EGG, 0x69, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_GOLD_DUST
+ GET_ITEM(ITEM_GOLD_DUST, OBJECT_GI_BOTTLE_16, GID_SEAHORSE, 0x6A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MUSHROOM
+ GET_ITEM(ITEM_MUSHROOM, OBJECT_GI_MAGICMUSHROOM, GID_MUSHROOM, 0x6B, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_6C
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x6C, GIFIELD(0, ITEM00_RUPEE_GREEN), 0),
+ // GI_6D
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x6D, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SEAHORSE
+ GET_ITEM(ITEM_SEAHORSE, OBJECT_GI_BOTTLE_16, GID_SEAHORSE, 0x6E, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_CHATEAU_BOTTLE
+ GET_ITEM(ITEM_CHATEAU, OBJECT_GI_BOTTLE_21, GID_CHATEAU, 0x6F, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_HYLIAN_LOACH
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x70, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_71
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x71, 0, 0),
+ // GI_72
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x72, 0, 0),
+ // GI_73
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x73, 0, 0),
+ // GI_74
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x74, 0, 0),
+ // GI_75
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x75, 0, 0),
+ // GI_ICE_TRAP
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x76, 0, 0),
+ // GI_77
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x77, 0, 0),
+ // GI_MASK_DEKU
+ GET_ITEM(ITEM_MASK_DEKU, OBJECT_GI_NUTSMASK, GID_MASK_DEKU, 0x78, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_GORON
+ GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x79,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_ZORA
+ GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x7A, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_FIERCE_DEITY
+ GET_ITEM(ITEM_MASK_FIERCE_DEITY, OBJECT_GI_MASK03, GID_MASK_FIERCE_DEITY, 0x7B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_CAPTAIN
+ GET_ITEM(ITEM_MASK_CAPTAIN, OBJECT_GI_MASK18, GID_MASK_CAPTAIN, 0x7C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GIANT
+ GET_ITEM(ITEM_MASK_GIANT, OBJECT_GI_MASK23, GID_MASK_GIANT, 0x7D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_ALL_NIGHT
+ GET_ITEM(ITEM_MASK_ALL_NIGHT, OBJECT_GI_MASK06, GID_MASK_ALL_NIGHT, 0x7E,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_BUNNY
+ GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x7F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_KEATON
+ GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x80,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GARO
+ GET_ITEM(ITEM_MASK_GARO, OBJECT_GI_MASK09, GID_MASK_GARO, 0x81, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_ROMANI
+ GET_ITEM(ITEM_MASK_ROMANI, OBJECT_GI_MASK10, GID_MASK_ROMANI, 0x82, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_CIRCUS_LEADER
+ GET_ITEM(ITEM_MASK_CIRCUS_LEADER, OBJECT_GI_MASK11, GID_MASK_CIRCUS_LEADER, 0x83,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_POSTMAN
+ GET_ITEM(ITEM_MASK_POSTMAN, OBJECT_GI_MASK12, GID_MASK_POSTMAN, 0x84,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_COUPLE
+ GET_ITEM(ITEM_MASK_COUPLE, OBJECT_GI_MASK13, GID_MASK_COUPLE, 0x85, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_GREAT_FAIRY
+ GET_ITEM(ITEM_MASK_GREAT_FAIRY, OBJECT_GI_MASK14, GID_MASK_GREAT_FAIRY, 0x86,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_GIBDO
+ GET_ITEM(ITEM_MASK_GIBDO, OBJECT_GI_MASK15, GID_MASK_GIBDO, 0x87, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_DON_GERO
+ GET_ITEM(ITEM_MASK_DON_GERO, OBJECT_GI_MASK16, GID_MASK_DON_GERO, 0x88,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_KAMARO
+ GET_ITEM(ITEM_MASK_KAMARO, OBJECT_GI_MASK17, GID_MASK_KAMARO, 0x89, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_TRUTH
+ GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x8A,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_STONE
+ GET_ITEM(ITEM_MASK_STONE, OBJECT_GI_STONEMASK, GID_MASK_STONE, 0x8B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_MASK_BREMEN
+ GET_ITEM(ITEM_MASK_BREMEN, OBJECT_GI_MASK20, GID_MASK_BREMEN, 0x8C, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_BLAST
+ GET_ITEM(ITEM_MASK_BLAST, OBJECT_GI_MASK21, GID_MASK_BLAST, 0x8D, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_SCENTS
+ GET_ITEM(ITEM_MASK_SCENTS, OBJECT_GI_MASK22, GID_MASK_SCENTS, 0x8E, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MASK_KAFEIS_MASK
+ GET_ITEM(ITEM_MASK_KAFEIS_MASK, OBJECT_GI_MASK05, GID_MASK_KAFEIS_MASK, 0x8F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_90
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0x90, 0, 0),
+ // GI_CHATEAU
+ GET_ITEM(ITEM_CHATEAU_2, OBJECT_GI_BOTTLE_21, GID_CHATEAU, 0x91, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MILK
+ GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x92, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_GOLD_DUST_2
+ GET_ITEM(ITEM_GOLD_DUST_2, OBJECT_GI_GOLD_DUST, GID_GOLD_DUST, 0x93, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_HYLIAN_LOACH_2
+ GET_ITEM(ITEM_HYLIAN_LOACH_2, OBJECT_GI_LOACH, GID_HYLIAN_LOACH, 0x94, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SEAHORSE_CAUGHT
+ GET_ITEM(ITEM_SEAHORSE_CAUGHT, OBJECT_GI_SEAHORSE, GID_SEAHORSE_CAUGHT, 0x95, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_MOON_TEAR
+ GET_ITEM(ITEM_MOON_TEAR, OBJECT_GI_RESERVE00, GID_MOON_TEAR, 0x96, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_LAND
+ GET_ITEM(ITEM_DEED_LAND, OBJECT_GI_RESERVE01, GID_DEED_LAND, 0x97, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_SWAMP
+ GET_ITEM(ITEM_DEED_SWAMP, OBJECT_GI_RESERVE01, GID_DEED_SWAMP, 0x98, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_MOUNTAIN
+ GET_ITEM(ITEM_DEED_MOUNTAIN, OBJECT_GI_RESERVE01, GID_DEED_MOUNTAIN, 0x99, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_DEED_OCEAN
+ GET_ITEM(ITEM_DEED_OCEAN, OBJECT_GI_RESERVE01, GID_DEED_OCEAN, 0x9A, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_SWORD_GREAT_FAIRY_STOLEN
+ GET_ITEM(ITEM_SWORD_GREAT_FAIRY, OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, 0x9B,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_KOKIRI_STOLEN
+ GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0x9C,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_RAZOR_STOLEN
+ GET_ITEM(ITEM_SWORD_RAZOR, OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, 0x9D,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SWORD_GILDED_STOLEN
+ GET_ITEM(ITEM_SWORD_GILDED, OBJECT_GI_SWORD_3, GID_SWORD_GILDED, 0x9E,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_SHIELD_HERO_STOLEN
+ GET_ITEM(ITEM_SHIELD_HERO, OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, 0x9F,
+ GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_SHORT),
+ // GI_ROOM_KEY
+ GET_ITEM(ITEM_ROOM_KEY, OBJECT_GI_RESERVE_B_00, GID_ROOM_KEY, 0xA0, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_LETTER_TO_MAMA
+ GET_ITEM(ITEM_LETTER_MAMA, OBJECT_GI_RESERVE_B_01, GID_LETTER_MAMA, 0xA1, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_A2
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA2, 0, 0),
+ // GI_A3
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA3, 0, 0),
+ // GI_A4
+ GET_ITEM(ITEM_NONE, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0xA4, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_A5
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA5, 0, 0),
+ // GI_A6
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA6, 0, 0),
+ // GI_A7
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA7, 0, 0),
+ // GI_A8
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xA8, 0, 0),
+ // GI_BOTTLE_STOLEN
+ GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0xA9, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_LETTER_TO_KAFEI
+ GET_ITEM(ITEM_LETTER_TO_KAFEI, OBJECT_GI_RESERVE_C_00, GID_LETTER_TO_KAFEI, 0xAA,
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_PENDANT_OF_MEMORIES
+ GET_ITEM(ITEM_PENDANT_OF_MEMORIES, OBJECT_GI_RESERVE_C_01, GID_PENDANT_OF_MEMORIES, 0xAB,
+ GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_AC
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAC, 0, 0),
+ // GI_AD
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAD, 0, 0),
+ // GI_AE
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAE, 0, 0),
+ // GI_AF
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xAF, 0, 0),
+ // GI_B0
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB0, 0, 0),
+ // GI_B1
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB1, 0, 0),
+ // GI_B2
+ GET_ITEM(ITEM_NONE, OBJECT_UNSET_0, GID_NONE, 0xB2, 0, 0),
+ // GI_B3
+ GET_ITEM(ITEM_NONE, OBJECT_GI_MSSA, GID_MASK_SUN, 0xB3, GIFIELD(GIFIELD_NO_COLLECTIBLE, 0), CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_CLOCK_TOWN
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB4, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_WOODFALL
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB5, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_SNOWHEAD
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB6, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_ROMANI_RANCH
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB7, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_GREAT_BAY
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB8, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+ // GI_TINGLE_MAP_STONE_TOWER
+ GET_ITEM(ITEM_TINGLE_MAP, OBJECT_GI_FIELDMAP, GID_TINGLE_MAP, 0xB9, GIFIELD(GIFIELD_20 | GIFIELD_NO_COLLECTIBLE, 0),
+ CHEST_ANIM_LONG),
+};
+
+// Player_UpdateCurrentGetItemDrawId?
+void func_8082ECE0(Player* this) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ this->getItemDrawIdPlusOne = ABS_ALT(giEntry->gid);
+}
+
+PlayerAnimationHeader* func_8082ED20(Player* this) {
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->actor.id != ACTOR_PLAYER)) {
+ return &gPlayerAnim_pz_wait;
+ }
+ if (this->transformation == PLAYER_FORM_GORON) {
+ return &gPlayerAnim_pg_wait;
+ }
+ if (this->currentMask == PLAYER_MASK_SCENTS) {
+ return &gPlayerAnim_cl_msbowait;
+ }
+ return D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType];
+}
+
+PlayerAnimationHeader* sPlayerIdleAnimations[][2] = {
+ { &gPlayerAnim_link_normal_wait_typeA_20f, &gPlayerAnim_link_normal_waitF_typeA_20f }, // ROOM_BEHAVIOR_TYPE2_0
+ { &gPlayerAnim_link_normal_wait_typeC_20f, &gPlayerAnim_link_normal_waitF_typeC_20f }, // ROOM_BEHAVIOR_TYPE2_1
+ { &gPlayerAnim_link_normal_wait_typeB_20f, &gPlayerAnim_link_normal_waitF_typeB_20f }, // ROOM_BEHAVIOR_TYPE2_2
+ { &gPlayerAnim_link_normal_wait_typeB_20f, &gPlayerAnim_link_normal_waitF_typeB_20f }, // ROOM_BEHAVIOR_TYPE2_HOT
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_4
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_5
+ { &gPlayerAnim_link_wait_typeD_20f, &gPlayerAnim_link_waitF_typeD_20f }, // ROOM_BEHAVIOR_TYPE2_6
+ { &gPlayerAnim_link_wait_heat1_20f, &gPlayerAnim_link_waitF_heat1_20f },
+ { &gPlayerAnim_link_wait_heat2_20f, &gPlayerAnim_link_waitF_heat2_20f },
+ { &gPlayerAnim_link_wait_itemD1_20f, &gPlayerAnim_link_wait_itemD1_20f },
+ { &gPlayerAnim_link_wait_itemA_20f, &gPlayerAnim_link_waitF_itemA_20f },
+ { &gPlayerAnim_link_wait_itemB_20f, &gPlayerAnim_link_waitF_itemB_20f },
+ { &gPlayerAnim_link_wait_itemC_20f, &gPlayerAnim_link_wait_itemC_20f },
+ { &gPlayerAnim_link_wait_itemD2_20f, &gPlayerAnim_link_wait_itemD2_20f },
+ { &gPlayerAnim_cl_msbowait, &gPlayerAnim_cl_msbowait },
+};
+
+AnimSfxEntry D_8085C8C4[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 8, NA_SE_VO_LI_SNEEZE, STOP),
+};
+AnimSfxEntry D_8085C8C8[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 18, NA_SE_VO_LI_SWEAT, STOP),
+};
+AnimSfxEntry D_8085C8CC[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_BREATH_REST, STOP),
+};
+AnimSfxEntry D_8085C8D0[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 10, NA_SE_VO_LI_BREATH_REST, STOP),
+};
+
+AnimSfxEntry D_8085C8D4[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 44, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 48, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 52, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 56, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 60, NA_SE_PL_CALM_HIT, STOP),
+};
+
+AnimSfxEntry D_8085C8E8[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 25, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 30, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 44, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 48, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 52, NA_SE_NONE, CONTINUE), ANIMSFX(ANIMSFX_TYPE_8, 56, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085C900[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 16, NA_SE_IT_SHIELD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 20, NA_SE_IT_SHIELD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 70, NA_SE_IT_SHIELD_SWING, STOP),
+};
+
+AnimSfxEntry D_8085C90C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 10, NA_SE_IT_HAMMER_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 10, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 22, NA_SE_IT_SWORD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 22, NA_SE_VO_LI_SWORD_N, STOP),
+};
+
+AnimSfxEntry D_8085C91C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 39, NA_SE_IT_SWORD_SWING, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 39, NA_SE_VO_LI_SWORD_N, STOP),
+};
+AnimSfxEntry D_8085C924[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 20, NA_SE_VO_LI_RELAX, STOP),
+};
+
+AnimSfxEntry D_8085C928[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 12, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 61, NA_SE_VO_LI_POO_WAIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 68, NA_SE_VO_LI_POO_WAIT, STOP),
+};
+
+AnimSfxEntry* D_8085C93C[] = {
+ D_8085C8C4, D_8085C8C8, D_8085C8CC, D_8085C8D0, D_8085C8D4, D_8085C8E8,
+ D_8085C900, D_8085C90C, D_8085C91C, D_8085C924, D_8085C928, NULL,
+};
+
+// Used to index into D_8085C93C
+u8 D_8085C96C[] = {
+ 0, 0, 1, 1, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 3, 3, 4, 4, 8, 8, 5, 5, 6, 6, 7, 7, 9, 9, 11, 11,
+};
+
+s32 func_8082ED94(Player* this) {
+ PlayerAnimationHeader** entry;
+ s32 i;
+
+ if ((this->skelAnime.animation != &gPlayerAnim_link_normal_newroll_jump_end_20f) &&
+ (this->skelAnime.animation != &gPlayerAnim_link_normal_newside_jump_end_20f)) {
+ if ((this->skelAnime.animation != func_8082ED20(this)) ||
+ (this->skelAnime.animation == &gPlayerAnim_cl_msbowait)) {
+ for (i = 0, entry = &sPlayerIdleAnimations[0][0]; i < ARRAY_COUNT_2D(sPlayerIdleAnimations); i++) {
+ if (this->skelAnime.animation == *entry) {
+ return i + 1;
+ }
+ entry++;
+ }
+
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+void func_8082EEA4(Player* this, s32 arg1) {
+ u8 temp_v0 = D_8085C96C[arg1];
+
+ if (temp_v0 != 0) {
+ Player_PlayAnimSfx(this, D_8085C93C[temp_v0 - 1]);
+ }
+}
+
+PlayerAnimationHeader* func_8082EEE0(Player* this) {
+ if (this->unk_B64 != 0) {
+ return D_8085BE84[PLAYER_ANIMGROUP_3][this->modelAnimType];
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_2][this->modelAnimType];
+ }
+}
+
+s32 func_8082EF20(Player* this) {
+ return func_8082ECCC(this) && (this->unk_ACC != 0);
+}
+
+PlayerAnimationHeader* func_8082EF54(Player* this) {
+ if (func_8082EF20(this)) {
+ return &gPlayerAnim_link_boom_throw_waitR;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_5][this->modelAnimType];
+ }
+}
+
+PlayerAnimationHeader* func_8082EF9C(Player* this) {
+ if (func_8082EF20(this)) {
+ return &gPlayerAnim_link_boom_throw_waitL;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_4][this->modelAnimType];
+ }
+}
+
+PlayerAnimationHeader* func_8082EFE4(Player* this) {
+ if (func_800B7128(this)) {
+ return &gPlayerAnim_link_bow_side_walk;
+ } else {
+ return D_8085BE84[PLAYER_ANIMGROUP_22][this->modelAnimType];
+ }
+}
+
+void func_8082F02C(PlayState* play, struct_8082F02C_arg1* arg1, f32 arg2) {
+ func_800FD59C(play, &arg1->unk_0, arg2);
+ func_800FD5E0(play, &arg1->unk_3, arg2);
+ func_800FD654(play, &arg1->unk_6, arg2);
+ func_800FD698(play, arg1->unk_A, arg1->unk_C, arg2);
+}
+
+/**
+ * Revert cylinder to normal properties
+ */
+void Player_ResetCylinder(Player* this) {
+ this->cylinder.base.colType = COLTYPE_HIT5;
+ this->cylinder.base.atFlags = AT_NONE;
+ this->cylinder.base.acFlags = AC_ON | AC_TYPE_ENEMY;
+ this->cylinder.base.ocFlags1 = OC1_ON | OC1_TYPE_ALL;
+ this->cylinder.info.elemType = ELEMTYPE_UNK1;
+ this->cylinder.info.toucher.dmgFlags = 0;
+ this->cylinder.info.bumper.dmgFlags = 0xF7CFFFFF;
+ this->cylinder.info.toucherFlags = TOUCH_NONE | TOUCH_SFX_NORMAL;
+ this->cylinder.dim.radius = 12;
+}
+
+/**
+ * Give cylinder special properties for attacks, uses include
+ * - Normal roll
+ * - Deku spin
+ * - Deku launch
+ * - Goron pound
+ * - Goron spike roll
+ * - Zora barrier
+ *
+ * and possibly more.
+ *
+ * @param dmgFlags Damage flags (DMGFLAG defines)
+ * @param damage to do
+ * @param radius of cylinder
+ */
+void Player_SetCylinderForAttack(Player* this, u32 dmgFlags, s32 damage, s32 radius) {
+ this->cylinder.base.atFlags = AT_ON | AT_TYPE_PLAYER;
+ if (radius > 30) {
+ this->cylinder.base.ocFlags1 = OC1_NONE;
+ } else {
+ this->cylinder.base.ocFlags1 = OC1_ON | OC1_TYPE_ALL;
+ }
+
+ this->cylinder.info.elemType = ELEMTYPE_UNK2;
+ this->cylinder.info.toucherFlags = TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_NORMAL;
+ this->cylinder.dim.radius = radius;
+ this->cylinder.info.toucher.dmgFlags = dmgFlags;
+ this->cylinder.info.toucher.damage = damage;
+
+ if (dmgFlags & DMG_GORON_POUND) {
+ this->cylinder.base.acFlags = AC_NONE;
+ } else {
+ this->cylinder.base.colType = COLTYPE_NONE;
+ this->cylinder.info.bumper.dmgFlags = 0xF7CFFFFF;
+
+ if (dmgFlags & DMG_ZORA_BARRIER) {
+ this->cylinder.base.acFlags = AC_NONE;
+ } else {
+ this->cylinder.base.acFlags = AC_ON | AC_TYPE_ENEMY;
+ }
+ }
+}
+
+// Check for starting Zora barrier
+void func_8082F164(Player* this, u16 button) {
+ if ((this->transformation == PLAYER_FORM_ZORA) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, button)) {
+ this->stateFlags1 |= PLAYER_STATE1_10;
+ }
+}
+
+struct_8082F02C_arg1 D_8085C98C = {
+ { 0, 0, 0 }, { 255, 255, 155 }, { 20, 20, 50 }, 940, 5000,
+};
+
+// Run Zora Barrier
+void func_8082F1AC(PlayState* play, Player* this) {
+ s32 sp4C = this->unk_B62;
+ f32 temp;
+ s16 sp46;
+ s16 sp44;
+ f32 sp40;
+ f32 sp3C;
+ s32 var_v0;
+
+ if ((gSaveContext.save.saveInfo.playerData.magic != 0) && (this->stateFlags1 & PLAYER_STATE1_10)) {
+ if (gSaveContext.magicState == MAGIC_STATE_IDLE) {
+ Magic_Consume(play, 0, MAGIC_CONSUME_GORON_ZORA);
+ }
+
+ temp = 16.0f;
+ if (gSaveContext.save.saveInfo.playerData.magic >= 16) {
+ var_v0 = 255;
+ } else {
+ var_v0 = (gSaveContext.save.saveInfo.playerData.magic / temp) * 255.0f;
+ }
+ Math_StepToS(&this->unk_B62, var_v0, 50);
+ } else if (Math_StepToS(&this->unk_B62, 0, 50) && (gSaveContext.magicState != MAGIC_STATE_IDLE)) {
+ Magic_Reset(play);
+ }
+
+ if ((this->unk_B62 != 0) || (sp4C != 0)) {
+ f32 sp34;
+ f32 new_var;
+
+ sp46 = play->gameplayFrames * 7000;
+ sp44 = play->gameplayFrames * 14000;
+ func_8082F02C(play, &D_8085C98C, this->unk_B62 / 255.0f);
+
+ sp34 = Math_SinS(sp44) * 40.0f;
+ sp40 = Math_CosS(sp44) * 40.0f;
+ sp3C = Math_SinS(sp46) * sp34;
+ new_var = Math_CosS(sp46) * sp34;
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x + sp40, this->actor.world.pos.y + sp3C,
+ this->actor.world.pos.z + new_var, 100, 200, 255, 600);
+
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SPARK_BARRIER - SFX_FLAG);
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_ZORA_BARRIER, 2, 100.0f, &this->actor.world.pos);
+ }
+}
+
+void func_8082F43C(PlayState* play, Player* this, PlayerFuncAC4 arg2) {
+ this->unk_AC4 = arg2;
+ this->unk_ACE = 0;
+ this->unk_AC8 = 0.0f;
+ func_8082E00C(this);
+}
+
+#define GET_PLAYER_ANIM(group, type) ((PlayerAnimationHeader**)D_8085BE84)[group * PLAYER_ANIMTYPE_MAX + type]
+
+void func_8082F470(PlayState* play, Player* this, PlayerItemAction itemAction) {
+ PlayerAnimationHeader* curAnim = this->skelAnime.animation;
+ PlayerAnimationHeader*(*iter)[PLAYER_ANIMTYPE_MAX] = (void*)&D_8085BE84[0][this->modelAnimType];
+ s32 i;
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_8 | PLAYER_STATE1_1000000);
+
+ for (i = 0; i < PLAYER_ANIMGROUP_MAX; i++) {
+ if (curAnim == **iter) {
+ break;
+ }
+ iter++;
+ }
+
+ func_8082F8BC(play, this, itemAction);
+
+ if (i < PLAYER_ANIMGROUP_MAX) {
+ this->skelAnime.animation = GET_PLAYER_ANIM(i, this->modelAnimType);
+ }
+}
+
+s8 sItemItemActions[] = {
+ PLAYER_IA_OCARINA, // ITEM_OCARINA,
+ PLAYER_IA_BOW, // ITEM_BOW,
+ PLAYER_IA_BOW_FIRE, // ITEM_ARROW_FIRE,
+ PLAYER_IA_BOW_ICE, // ITEM_ARROW_ICE,
+ PLAYER_IA_BOW_LIGHT, // ITEM_ARROW_LIGHT,
+ PLAYER_IA_PICTO_BOX, // ITEM_OCARINA_FAIRY,
+ PLAYER_IA_BOMB, // ITEM_BOMB,
+ PLAYER_IA_BOMBCHU, // ITEM_BOMBCHU,
+ PLAYER_IA_STICK, // ITEM_STICK,
+ PLAYER_IA_NUT, // ITEM_NUT,
+ PLAYER_IA_MAGIC_BEANS, // ITEM_MAGIC_BEANS,
+ PLAYER_IA_PICTO_BOX, // ITEM_SLINGSHOT,
+ PLAYER_IA_POWDER_KEG, // ITEM_POWDER_KEG,
+ PLAYER_IA_PICTO_BOX, // ITEM_PICTO_BOX,
+ PLAYER_IA_LENS, // ITEM_LENS,
+ PLAYER_IA_HOOKSHOT, // ITEM_HOOKSHOT,
+ PLAYER_IA_SWORD_TWO_HANDED, // ITEM_SWORD_GREAT_FAIRY,
+ PLAYER_IA_PICTO_BOX, // ITEM_LONGSHOT, // OoT Leftover
+ PLAYER_IA_BOTTLE_EMPTY, // ITEM_BOTTLE,
+ PLAYER_IA_BOTTLE_POTION_RED, // ITEM_POTION_RED,
+ PLAYER_IA_BOTTLE_POTION_GREEN, // ITEM_POTION_GREEN,
+ PLAYER_IA_BOTTLE_POTION_BLUE, // ITEM_POTION_BLUE,
+ PLAYER_IA_BOTTLE_FAIRY, // ITEM_FAIRY,
+ PLAYER_IA_BOTTLE_DEKU_PRINCESS, // ITEM_DEKU_PRINCESS,
+ PLAYER_IA_BOTTLE_MILK, // ITEM_MILK_BOTTLE,
+ PLAYER_IA_BOTTLE_MILK_HALF, // ITEM_MILK_HALF,
+ PLAYER_IA_BOTTLE_FISH, // ITEM_FISH,
+ PLAYER_IA_BOTTLE_BUG, // ITEM_BUG,
+ PLAYER_IA_BOTTLE_BUG, // ITEM_BLUE_FIRE, // !
+ PLAYER_IA_BOTTLE_POE, // ITEM_POE,
+ PLAYER_IA_BOTTLE_BIG_POE, // ITEM_BIG_POE,
+ PLAYER_IA_BOTTLE_SPRING_WATER, // ITEM_SPRING_WATER,
+ PLAYER_IA_BOTTLE_HOT_SPRING_WATER, // ITEM_HOT_SPRING_WATER,
+ PLAYER_IA_BOTTLE_ZORA_EGG, // ITEM_ZORA_EGG,
+ PLAYER_IA_BOTTLE_GOLD_DUST, // ITEM_GOLD_DUST,
+ PLAYER_IA_BOTTLE_MUSHROOM, // ITEM_MUSHROOM,
+ PLAYER_IA_BOTTLE_SEAHORSE, // ITEM_SEA_HORSE,
+ PLAYER_IA_BOTTLE_CHATEAU, // ITEM_CHATEAU,
+ PLAYER_IA_BOTTLE_HYLIAN_LOACH, // ITEM_HYLIAN_LOACH,
+ PLAYER_IA_BOTTLE_POE, // ITEM_OBABA_DRINK, // !
+ PLAYER_IA_MOON_TEAR, // ITEM_MOON_TEAR,
+ PLAYER_IA_DEED_LAND, // ITEM_DEED_LAND,
+ PLAYER_IA_DEED_SWAMP, // ITEM_DEED_SWAMP,
+ PLAYER_IA_DEED_MOUNTAIN, // ITEM_DEED_MOUNTAIN,
+ PLAYER_IA_DEED_OCEAN, // ITEM_DEED_OCEAN,
+ PLAYER_IA_ROOM_KEY, // ITEM_ROOM_KEY,
+ PLAYER_IA_LETTER_MAMA, // ITEM_LETTER_MAMA,
+ PLAYER_IA_LETTER_TO_KAFEI, // ITEM_LETTER_TO_KAFEI,
+ PLAYER_IA_PENDANT_OF_MEMORIES, // ITEM_PENDANT_MEMORIES,
+ PLAYER_IA_38, // ITEM_TINGLE_MAP, // !
+ PLAYER_IA_MASK_DEKU, // ITEM_MASK_DEKU,
+ PLAYER_IA_MASK_GORON, // ITEM_MASK_GORON,
+ PLAYER_IA_MASK_ZORA, // ITEM_MASK_ZORA,
+ PLAYER_IA_MASK_FIERCE_DEITY, // ITEM_MASK_FIERCE_DEITY,
+ PLAYER_IA_MASK_TRUTH, // ITEM_MASK_TRUTH,
+ PLAYER_IA_MASK_KAFEIS_MASK, // ITEM_MASK_KAFEIS_MASK,
+ PLAYER_IA_MASK_ALL_NIGHT, // ITEM_MASK_ALL_NIGHT,
+ PLAYER_IA_MASK_BUNNY, // ITEM_MASK_BUNNY,
+ PLAYER_IA_MASK_KEATON, // ITEM_MASK_KEATON,
+ PLAYER_IA_MASK_GARO, // ITEM_MASK_GARO,
+ PLAYER_IA_MASK_ROMANI, // ITEM_MASK_ROMANI,
+ PLAYER_IA_MASK_CIRCUS_LEADER, // ITEM_MASK_CIRCUS_LEADER,
+ PLAYER_IA_MASK_POSTMAN, // ITEM_MASK_POSTMAN,
+ PLAYER_IA_MASK_COUPLE, // ITEM_MASK_COUPLE,
+ PLAYER_IA_MASK_GREAT_FAIRY, // ITEM_MASK_GREAT_FAIRY,
+ PLAYER_IA_MASK_GIBDO, // ITEM_MASK_GIBDO,
+ PLAYER_IA_MASK_DON_GERO, // ITEM_MASK_DON_GERO,
+ PLAYER_IA_MASK_KAMARO, // ITEM_MASK_KAMARO,
+ PLAYER_IA_MASK_CAPTAIN, // ITEM_MASK_CAPTAIN,
+ PLAYER_IA_MASK_STONE, // ITEM_MASK_STONE,
+ PLAYER_IA_MASK_BREMEN, // ITEM_MASK_BREMEN,
+ PLAYER_IA_MASK_BLAST, // ITEM_MASK_BLAST,
+ PLAYER_IA_MASK_SCENTS, // ITEM_MASK_SCENTS,
+ PLAYER_IA_MASK_GIANT, // ITEM_MASK_GIANT,
+ PLAYER_IA_BOW_FIRE, // ITEM_BOW_ARROW_FIRE,
+ PLAYER_IA_BOW_ICE, // ITEM_BOW_ARROW_ICE,
+ PLAYER_IA_BOW_LIGHT, // ITEM_BOW_ARROW_LIGHT,
+ PLAYER_IA_SWORD_KOKIRI, // ITEM_SWORD_KOKIRI,
+ PLAYER_IA_SWORD_RAZOR, // ITEM_SWORD_RAZOR,
+ PLAYER_IA_SWORD_GILDED, // ITEM_SWORD_GILDED,
+ PLAYER_IA_SWORD_TWO_HANDED, // ITEM_SWORD_DEITY,
+};
+
+PlayerItemAction Player_ItemToItemAction(Player* this, ItemId item) {
+ if (item >= ITEM_FD) {
+ return PLAYER_IA_NONE;
+ } else if (item == ITEM_FC) {
+ return PLAYER_IA_LAST_USED;
+ } else if (item == ITEM_FISHING_ROD) {
+ return PLAYER_IA_FISHING_ROD;
+ } else if ((item == ITEM_SWORD_KOKIRI) && (this->transformation == PLAYER_FORM_ZORA)) {
+ return PLAYER_IA_ZORA_FINS;
+ } else {
+ return sItemItemActions[item];
+ }
+}
+
+void func_8082F594(PlayState* play, Player* this) {
+}
+
+void func_8082F5A4(PlayState* play, Player* this) {
+ this->unk_B28 = 0;
+ this->unk_B0C = 1.0f;
+}
+
+void func_8082F5C0(PlayState* play, Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_8;
+
+ if (this->heldItemAction == PLAYER_IA_NUT) {
+ this->unk_B28 = -2;
+ } else {
+ this->unk_B28 = -1;
+ }
+ this->unk_ACC = 0;
+}
+
+PlayerFuncAC4 D_8085C9F0[PLAYER_IA_MAX] = {
+ func_80848780, // PLAYER_IA_NONE
+ func_80848780, // PLAYER_IA_LAST_USED
+ func_80848780, // PLAYER_IA_FISHING_ROD
+ func_808487B8, // PLAYER_IA_SWORD_KOKIRI
+ func_808487B8, // PLAYER_IA_SWORD_RAZOR
+ func_808487B8, // PLAYER_IA_SWORD_GILDED
+ func_808487B8, // PLAYER_IA_SWORD_TWO_HANDED
+ func_80848780, // PLAYER_IA_STICK
+ func_80848780, // PLAYER_IA_ZORA_FINS
+ func_80848B6C, // PLAYER_IA_BOW
+ func_80848B6C, // PLAYER_IA_BOW_FIRE
+ func_80848B6C, // PLAYER_IA_BOW_ICE
+ func_80848B6C, // PLAYER_IA_BOW_LIGHT
+ func_80848B6C, // PLAYER_IA_HOOKSHOT
+ func_808490B4, // PLAYER_IA_BOMB
+ func_808490B4, // PLAYER_IA_POWDER_KEG
+ func_808490B4, // PLAYER_IA_BOMBCHU
+ func_808491B4, // PLAYER_IA_11
+ func_80848B6C, // PLAYER_IA_NUT
+ func_80848780, // PLAYER_IA_PICTO_BOX
+ func_80848780, // PLAYER_IA_OCARINA
+ func_80848780, // PLAYER_IA_BOTTLE_EMPTY
+ func_80848780, // PLAYER_IA_BOTTLE_FISH
+ func_80848780, // PLAYER_IA_BOTTLE_SPRING_WATER
+ func_80848780, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ func_80848780, // PLAYER_IA_BOTTLE_ZORA_EGG
+ func_80848780, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ func_80848780, // PLAYER_IA_BOTTLE_GOLD_DUST
+ func_80848780, // PLAYER_IA_BOTTLE_1C
+ func_80848780, // PLAYER_IA_BOTTLE_SEA_HORSE
+ func_80848780, // PLAYER_IA_BOTTLE_MUSHROOM
+ func_80848780, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ func_80848780, // PLAYER_IA_BOTTLE_BUG
+ func_80848780, // PLAYER_IA_BOTTLE_POE
+ func_80848780, // PLAYER_IA_BOTTLE_BIG_POE
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_RED
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_BLUE
+ func_80848780, // PLAYER_IA_BOTTLE_POTION_GREEN
+ func_80848780, // PLAYER_IA_BOTTLE_MILK
+ func_80848780, // PLAYER_IA_BOTTLE_MILK_HALF
+ func_80848780, // PLAYER_IA_BOTTLE_CHATEAU
+ func_80848780, // PLAYER_IA_BOTTLE_FAIRY
+ func_80848780, // PLAYER_IA_MOON_TEAR
+ func_80848780, // PLAYER_IA_DEED_LAND
+ func_80848780, // PLAYER_IA_ROOM_KEY
+ func_80848780, // PLAYER_IA_LETTER_TO_KAFEI
+ func_80848780, // PLAYER_IA_MAGIC_BEANS
+ func_80848780, // PLAYER_IA_DEED_SWAMP
+ func_80848780, // PLAYER_IA_DEED_MOUNTAIN
+ func_80848780, // PLAYER_IA_DEED_OCEAN
+ func_80848780, // PLAYER_IA_32
+ func_80848780, // PLAYER_IA_LETTER_MAMA
+ func_80848780, // PLAYER_IA_34
+ func_80848780, // PLAYER_IA_35
+ func_80848780, // PLAYER_IA_PENDANT_MEMORIES
+ func_80848780, // PLAYER_IA_37
+ func_80848780, // PLAYER_IA_38
+ func_80848780, // PLAYER_IA_39
+ func_80848780, // PLAYER_IA_MASK_TRUTH
+ func_80848780, // PLAYER_IA_MASK_KAFEIS_MASK
+ func_80848780, // PLAYER_IA_MASK_ALL_NIGHT
+ func_80848780, // PLAYER_IA_MASK_BUNNY
+ func_80848780, // PLAYER_IA_MASK_KEATON
+ func_80848780, // PLAYER_IA_MASK_GARO
+ func_80848780, // PLAYER_IA_MASK_ROMANI
+ func_80848780, // PLAYER_IA_MASK_CIRCUS_LEADER
+ func_80848780, // PLAYER_IA_MASK_POSTMAN
+ func_80848780, // PLAYER_IA_MASK_COUPLE
+ func_80848780, // PLAYER_IA_MASK_GREAT_FAIRY
+ func_80848780, // PLAYER_IA_MASK_GIBDO
+ func_80848780, // PLAYER_IA_MASK_DON_GERO
+ func_80848780, // PLAYER_IA_MASK_KAMARO
+ func_80848780, // PLAYER_IA_MASK_CAPTAIN
+ func_80848780, // PLAYER_IA_MASK_STONE
+ func_80848780, // PLAYER_IA_MASK_BREMEN
+ func_80848780, // PLAYER_IA_MASK_BLAST
+ func_80848780, // PLAYER_IA_MASK_SCENTS
+ func_80848780, // PLAYER_IA_MASK_GIANT
+ func_80848780, // PLAYER_IA_MASK_FIERCE_DEITY
+ func_80848780, // PLAYER_IA_MASK_GORON
+ func_80848780, // PLAYER_IA_MASK_ZORA
+ func_80848780, // PLAYER_IA_MASK_DEKU
+ func_80848780, // PLAYER_IA_LENS
+};
+
+// sPlayerItemActionInits?
+void (*D_8085CB3C[PLAYER_IA_MAX])(PlayState*, Player*) = {
+ func_8082F594, // PLAYER_IA_NONE
+ func_8082F594, // PLAYER_IA_LAST_USED
+ func_8082F594, // PLAYER_IA_FISHING_ROD
+ func_8082F594, // PLAYER_IA_SWORD_KOKIRI
+ func_8082F594, // PLAYER_IA_SWORD_RAZOR
+ func_8082F594, // PLAYER_IA_SWORD_GILDED
+ func_8082F594, // PLAYER_IA_SWORD_TWO_HANDED
+ func_8082F5A4, // PLAYER_IA_STICK
+ func_8082F8A0, // PLAYER_IA_ZORA_FINS
+ func_8082F5C0, // PLAYER_IA_BOW
+ func_8082F5C0, // PLAYER_IA_BOW_FIRE
+ func_8082F5C0, // PLAYER_IA_BOW_ICE
+ func_8082F5C0, // PLAYER_IA_BOW_LIGHT
+ func_8082F7F4, // PLAYER_IA_HOOKSHOT
+ Player_SpawnExplosive, // PLAYER_IA_BOMB
+ Player_SpawnExplosive, // PLAYER_IA_POWDER_KEG
+ Player_SpawnExplosive, // PLAYER_IA_BOMBCHU
+ func_8082F8A0, // PLAYER_IA_11
+ func_8082F5C0, // PLAYER_IA_NUT
+ func_8082F594, // PLAYER_IA_PICTO_BOX
+ func_8082F594, // PLAYER_IA_OCARINA
+ func_8082F594, // PLAYER_IA_BOTTLE_EMPTY
+ func_8082F594, // PLAYER_IA_BOTTLE_FISH
+ func_8082F594, // PLAYER_IA_BOTTLE_SPRING_WATER
+ func_8082F594, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ func_8082F594, // PLAYER_IA_BOTTLE_ZORA_EGG
+ func_8082F594, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ func_8082F594, // PLAYER_IA_BOTTLE_GOLD_DUST
+ func_8082F594, // PLAYER_IA_BOTTLE_1C
+ func_8082F594, // PLAYER_IA_BOTTLE_SEA_HORSE
+ func_8082F594, // PLAYER_IA_BOTTLE_MUSHROOM
+ func_8082F594, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ func_8082F594, // PLAYER_IA_BOTTLE_BUG
+ func_8082F594, // PLAYER_IA_BOTTLE_POE
+ func_8082F594, // PLAYER_IA_BOTTLE_BIG_POE
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_RED
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_BLUE
+ func_8082F594, // PLAYER_IA_BOTTLE_POTION_GREEN
+ func_8082F594, // PLAYER_IA_BOTTLE_MILK
+ func_8082F594, // PLAYER_IA_BOTTLE_MILK_HALF
+ func_8082F594, // PLAYER_IA_BOTTLE_CHATEAU
+ func_8082F594, // PLAYER_IA_BOTTLE_FAIRY
+ func_8082F594, // PLAYER_IA_MOON_TEAR
+ func_8082F594, // PLAYER_IA_DEED_LAND
+ func_8082F594, // PLAYER_IA_ROOM_KEY
+ func_8082F594, // PLAYER_IA_LETTER_TO_KAFEI
+ func_8082F594, // PLAYER_IA_MAGIC_BEANS
+ func_8082F594, // PLAYER_IA_DEED_SWAMP
+ func_8082F594, // PLAYER_IA_DEED_MOUNTAIN
+ func_8082F594, // PLAYER_IA_DEED_OCEAN
+ func_8082F594, // PLAYER_IA_32
+ func_8082F594, // PLAYER_IA_LETTER_MAMA
+ func_8082F594, // PLAYER_IA_34
+ func_8082F594, // PLAYER_IA_35
+ func_8082F594, // PLAYER_IA_PENDANT_MEMORIES
+ func_8082F594, // PLAYER_IA_37
+ func_8082F594, // PLAYER_IA_38
+ func_8082F594, // PLAYER_IA_39
+ func_8082F594, // PLAYER_IA_MASK_TRUTH
+ func_8082F594, // PLAYER_IA_MASK_KAFEIS_MASK
+ func_8082F594, // PLAYER_IA_MASK_ALL_NIGHT
+ func_8082F594, // PLAYER_IA_MASK_BUNNY
+ func_8082F594, // PLAYER_IA_MASK_KEATON
+ func_8082F594, // PLAYER_IA_MASK_GARO
+ func_8082F594, // PLAYER_IA_MASK_ROMANI
+ func_8082F594, // PLAYER_IA_MASK_CIRCUS_LEADER
+ func_8082F594, // PLAYER_IA_MASK_POSTMAN
+ func_8082F594, // PLAYER_IA_MASK_COUPLE
+ func_8082F594, // PLAYER_IA_MASK_GREAT_FAIRY
+ func_8082F594, // PLAYER_IA_MASK_GIBDO
+ func_8082F594, // PLAYER_IA_MASK_DON_GERO
+ func_8082F594, // PLAYER_IA_MASK_KAMARO
+ func_8082F594, // PLAYER_IA_MASK_CAPTAIN
+ func_8082F594, // PLAYER_IA_MASK_STONE
+ func_8082F594, // PLAYER_IA_MASK_BREMEN
+ func_8082F594, // PLAYER_IA_MASK_BLAST
+ func_8082F594, // PLAYER_IA_MASK_SCENTS
+ func_8082F594, // PLAYER_IA_MASK_GIANT
+ func_8082F594, // PLAYER_IA_MASK_FIERCE_DEITY
+ func_8082F594, // PLAYER_IA_MASK_GORON
+ func_8082F594, // PLAYER_IA_MASK_ZORA
+ func_8082F594, // PLAYER_IA_MASK_DEKU
+ func_8082F594, // PLAYER_IA_LENS
+};
+
+void func_8082F5FC(Player* this, Actor* actor) {
+ this->heldActor = actor;
+ this->interactRangeActor = actor;
+ this->getItemId = GI_NONE;
+ this->leftHandWorld.rot.y = actor->shape.rot.y - this->actor.shape.rot.y;
+ this->stateFlags1 |= PLAYER_STATE1_800;
+}
+
+struct_8085CC88 D_8085CC88[] = {
+ { &gPlayerAnim_link_normal_free2free, 12 },
+ { &gPlayerAnim_link_normal_normal2fighter, 6 },
+ { &gPlayerAnim_link_hammer_normal2long, 8 },
+ { &gPlayerAnim_link_normal_normal2free, 8 },
+ { &gPlayerAnim_link_fighter_fighter2long, 8 },
+ { &gPlayerAnim_link_normal_fighter2free, 10 },
+ { &gPlayerAnim_link_hammer_long2free, 7 },
+ { &gPlayerAnim_link_hammer_long2long, 11 },
+ { &gPlayerAnim_link_normal_free2free, 12 },
+ { &gPlayerAnim_link_normal_normal2bom, 4 },
+ { &gPlayerAnim_link_normal_long2bom, 4 },
+ { &gPlayerAnim_link_normal_free2bom, 4 },
+ { &gPlayerAnim_link_anchor_anchor2fighter, 5 },
+ { &gPlayerAnim_link_normal_free2freeB, 13 },
+ { &gPlayerAnim_pz_bladeon, 4 },
+};
+
+s8 D_8085CD00[PLAYER_ANIMTYPE_MAX][PLAYER_ANIMTYPE_MAX] = {
+ { 8, -5, -3, -6, 8, 0xB }, { 5, 0, -1, 4, 5, 9 }, { 3, 1, 0, 2, 3, 9 },
+ { 6, -4, -2, 7, 6, 0xA }, { 8, -5, -3, -6, 8, 0xB }, { 8, -5, -3, -6, 8, 0xB },
+};
+
+ExplosiveInfo sPlayerExplosiveInfo[PLAYER_EXPLOSIVE_MAX] = {
+ { ITEM_BOMB, ACTOR_EN_BOM }, // PLAYER_EXPLOSIVE_BOMB
+ { ITEM_POWDER_KEG, ACTOR_EN_BOM }, // PLAYER_EXPLOSIVE_POWDER_KEG
+ { ITEM_BOMBCHU, ACTOR_EN_BOM_CHU }, // PLAYER_EXPLOSIVE_BOMBCHU
+};
+
+void Player_SpawnExplosive(PlayState* play, Player* this) {
+ PlayerExplosive explosiveType;
+ ExplosiveInfo* explosiveInfo;
+ Actor* explosiveActor;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8082DE14(play, this);
+ return;
+ }
+
+ explosiveType = Player_GetExplosiveHeld(this);
+ explosiveInfo = &sPlayerExplosiveInfo[explosiveType];
+ if ((explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) && (gSaveContext.powderKegTimer == 0)) {
+ gSaveContext.powderKegTimer = 200;
+ }
+
+ explosiveActor = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, explosiveInfo->actorId,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
+ (explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) ? BOMB_EXPLOSIVE_TYPE_POWDER_KEG
+ : BOMB_EXPLOSIVE_TYPE_BOMB,
+ this->actor.shape.rot.y, 0, BOMB_TYPE_BODY);
+ if (explosiveActor != NULL) {
+ if ((explosiveType == PLAYER_EXPLOSIVE_BOMB) && (play->unk_1887E != 0)) {
+ play->unk_1887E--;
+ if (play->unk_1887E == 0) {
+ play->unk_1887E = -1;
+ }
+ } else if ((explosiveType == PLAYER_EXPLOSIVE_BOMBCHU) && (play->unk_1887D != 0)) {
+ play->unk_1887D--;
+ if (play->unk_1887D == 0) {
+ play->unk_1887D = -1;
+ }
+ } else {
+ Inventory_ChangeAmmo(explosiveInfo->itemId, -1);
+ }
+ func_8082F5FC(this, explosiveActor);
+ } else if (explosiveType == PLAYER_EXPLOSIVE_POWDER_KEG) {
+ gSaveContext.powderKegTimer = 0;
+ }
+}
+
+// SpawnHookshot?
+void func_8082F7F4(PlayState* play, Player* this) {
+ ArmsHook* armsHook;
+
+ this->stateFlags1 |= PLAYER_STATE1_8;
+ this->unk_B28 = -3;
+ this->unk_B48 = 0.0f;
+
+ this->heldActor =
+ Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_ARMS_HOOK, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, 0);
+
+ if (this->heldActor == NULL) {
+ func_80831990(play, this, ITEM_NONE);
+ return;
+ }
+ armsHook = (ArmsHook*)this->heldActor;
+ armsHook->actor.objBankIndex = this->actor.objBankIndex;
+ armsHook->unk_208 = this->transformation;
+}
+
+void func_8082F8A0(PlayState* play, Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_1000000;
+}
+
+void func_8082F8BC(PlayState* play, Player* this, PlayerItemAction itemAction) {
+ this->itemAction = this->heldItemAction = itemAction;
+ this->modelGroup = this->nextModelGroup;
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_1000000 | PLAYER_STATE1_8);
+
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ this->unk_B28 = 0;
+
+ D_8085CB3C[itemAction](play, this);
+ Player_SetModelGroup(this, this->modelGroup);
+}
+
+// AttackAnimInfo sMeleeAttackAnimInfo
+AttackAnimInfo sMeleeAttackAnimInfo[PLAYER_MWA_MAX] = {
+ // PLAYER_MWA_FORWARD_SLASH_1H
+ { &gPlayerAnim_link_fighter_normal_kiru, &gPlayerAnim_link_fighter_normal_kiru_end,
+ &gPlayerAnim_link_fighter_normal_kiru_endR, 1, 4 },
+ // PLAYER_MWA_FORWARD_SLASH_2H
+ { &gPlayerAnim_link_fighter_Lnormal_kiru, &gPlayerAnim_link_fighter_Lnormal_kiru_end,
+ &gPlayerAnim_link_anchor_Lnormal_kiru_endR, 1, 4 },
+ // PLAYER_MWA_FORWARD_COMBO_1H
+ { &gPlayerAnim_link_fighter_normal_kiru_finsh, &gPlayerAnim_link_fighter_normal_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_normal_kiru_finsh_endR, 0, 5 },
+ // PLAYER_MWA_FORWARD_COMBO_2H
+ { &gPlayerAnim_link_fighter_Lnormal_kiru_finsh, &gPlayerAnim_link_fighter_Lnormal_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lnormal_kiru_finsh_endR, 1, 7 },
+ // PLAYER_MWA_RIGHT_SLASH_1H
+ { &gPlayerAnim_link_fighter_Lside_kiru, &gPlayerAnim_link_fighter_Lside_kiru_end,
+ &gPlayerAnim_link_anchor_Lside_kiru_endR, 1, 4 },
+ // PLAYER_MWA_RIGHT_SLASH_2H
+ { &gPlayerAnim_link_fighter_LLside_kiru, &gPlayerAnim_link_fighter_LLside_kiru_end,
+ &gPlayerAnim_link_anchor_LLside_kiru_endL, 0, 5 },
+ // PLAYER_MWA_RIGHT_COMBO_1H
+ { &gPlayerAnim_link_fighter_Lside_kiru_finsh, &gPlayerAnim_link_fighter_Lside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lside_kiru_finsh_endR, 2, 8 },
+ // PLAYER_MWA_RIGHT_COMBO_2H
+ { &gPlayerAnim_link_fighter_LLside_kiru_finsh, &gPlayerAnim_link_fighter_LLside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_LLside_kiru_finsh_endR, 3, 8 },
+ // PLAYER_MWA_LEFT_SLASH_1H
+ { &gPlayerAnim_link_fighter_Rside_kiru, &gPlayerAnim_link_fighter_Rside_kiru_end,
+ &gPlayerAnim_link_anchor_Rside_kiru_endR, 0, 4 },
+ // PLAYER_MWA_LEFT_SLASH_2H
+ { &gPlayerAnim_link_fighter_LRside_kiru, &gPlayerAnim_link_fighter_LRside_kiru_end,
+ &gPlayerAnim_link_anchor_LRside_kiru_endR, 0, 5 },
+ // PLAYER_MWA_LEFT_COMBO_1H
+ { &gPlayerAnim_link_fighter_Rside_kiru_finsh, &gPlayerAnim_link_fighter_Rside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Rside_kiru_finsh_endR, 0, 6 },
+ // PLAYER_MWA_LEFT_COMBO_2H
+ { &gPlayerAnim_link_fighter_LRside_kiru_finsh, &gPlayerAnim_link_fighter_LRside_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_LRside_kiru_finsh_endL, 1, 5 },
+ // PLAYER_MWA_STAB_1H
+ { &gPlayerAnim_link_fighter_pierce_kiru, &gPlayerAnim_link_fighter_pierce_kiru_end,
+ &gPlayerAnim_link_anchor_pierce_kiru_endR, 0, 3 },
+ // PLAYER_MWA_STAB_2H
+ { &gPlayerAnim_link_fighter_Lpierce_kiru, &gPlayerAnim_link_fighter_Lpierce_kiru_end,
+ &gPlayerAnim_link_anchor_Lpierce_kiru_endL, 0, 3 },
+ // PLAYER_MWA_STAB_COMBO_1H
+ { &gPlayerAnim_link_fighter_pierce_kiru_finsh, &gPlayerAnim_link_fighter_pierce_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_pierce_kiru_finsh_endR, 1, 9 },
+ // PLAYER_MWA_STAB_COMBO_2H
+ { &gPlayerAnim_link_fighter_Lpierce_kiru_finsh, &gPlayerAnim_link_fighter_Lpierce_kiru_finsh_end,
+ &gPlayerAnim_link_anchor_Lpierce_kiru_finsh_endR, 1, 8 },
+ // PLAYER_MWA_FLIPSLASH_START
+ { &gPlayerAnim_link_fighter_jump_rollkiru, &gPlayerAnim_link_fighter_jump_kiru_finsh,
+ &gPlayerAnim_link_fighter_jump_kiru_finsh, 7, 99 },
+ // PLAYER_MWA_JUMPSLASH_START
+ { &gPlayerAnim_link_fighter_Lpower_jump_kiru, &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit,
+ &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, 7, 99 },
+ // PLAYER_MWA_ZORA_JUMPKICK_START
+ { &gPlayerAnim_pz_jumpAT, &gPlayerAnim_pz_jumpATend, &gPlayerAnim_pz_jumpATend, 8, 99 },
+ // PLAYER_MWA_FLIPSLASH_FINISH
+ { &gPlayerAnim_link_fighter_jump_kiru_finsh, &gPlayerAnim_link_fighter_jump_kiru_finsh_end,
+ &gPlayerAnim_link_fighter_jump_kiru_finsh_end, 1, 2 },
+ // PLAYER_MWA_JUMPSLASH_FINISH
+ { &gPlayerAnim_link_fighter_Lpower_jump_kiru_hit, &gPlayerAnim_link_fighter_Lpower_jump_kiru_end,
+ &gPlayerAnim_link_fighter_Lpower_jump_kiru_end, 1, 2 },
+ // PLAYER_MWA_ZORA_JUMPKICK_FINISH
+ { &gPlayerAnim_pz_jumpATend, &gPlayerAnim_pz_wait, &gPlayerAnim_link_normal_waitR_free, 1, 2 },
+ // PLAYER_MWA_BACKSLASH_RIGHT
+ { &gPlayerAnim_link_fighter_turn_kiruR, &gPlayerAnim_link_fighter_turn_kiruR_end,
+ &gPlayerAnim_link_fighter_turn_kiruR_end, 1, 5 },
+ // PLAYER_MWA_BACKSLASH_LEFT
+ { &gPlayerAnim_link_fighter_turn_kiruL, &gPlayerAnim_link_fighter_turn_kiruL_end,
+ &gPlayerAnim_link_fighter_turn_kiruL_end, 1, 4 },
+ // PLAYER_MWA_GORON_PUNCH_LEFT
+ { &gPlayerAnim_pg_punchA, &gPlayerAnim_pg_punchAend, &gPlayerAnim_pg_punchAendR, 6, 8 },
+ // PLAYER_MWA_GORON_PUNCH_RIGHT
+ { &gPlayerAnim_pg_punchB, &gPlayerAnim_pg_punchBend, &gPlayerAnim_pg_punchBendR, 12, 18 },
+ // PLAYER_MWA_GORON_PUNCH_BUTT
+ { &gPlayerAnim_pg_punchC, &gPlayerAnim_pg_punchCend, &gPlayerAnim_pg_punchCendR, 8, 14 },
+ // PLAYER_MWA_ZORA_PUNCH_LEFT
+ { &gPlayerAnim_pz_attackA, &gPlayerAnim_pz_attackAend, &gPlayerAnim_pz_attackAendR, 2, 5 },
+ // PLAYER_MWA_ZORA_PUNCH_COMBO
+ { &gPlayerAnim_pz_attackB, &gPlayerAnim_pz_attackBend, &gPlayerAnim_pz_attackBendR, 3, 8 },
+ // PLAYER_MWA_ZORA_PUNCH_KICK
+ { &gPlayerAnim_pz_attackC, &gPlayerAnim_pz_attackCend, &gPlayerAnim_pz_attackCendR, 3, 10 },
+ // PLAYER_MWA_SPIN_ATTACK_1H
+ { &gPlayerAnim_link_fighter_rolling_kiru, &gPlayerAnim_link_fighter_rolling_kiru_end,
+ &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 12 },
+ // PLAYER_MWA_SPIN_ATTACK_2H
+ { &gPlayerAnim_link_fighter_Lrolling_kiru, &gPlayerAnim_link_fighter_Lrolling_kiru_end,
+ &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 15 },
+ // PLAYER_MWA_BIG_SPIN_1H
+ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end,
+ &gPlayerAnim_link_anchor_rolling_kiru_endR, 0, 16 },
+ // PLAYER_MWA_BIG_SPIN_2H
+ { &gPlayerAnim_link_fighter_Wrolling_kiru, &gPlayerAnim_link_fighter_Wrolling_kiru_end,
+ &gPlayerAnim_link_anchor_Lrolling_kiru_endR, 0, 16 },
+};
+
+PlayerAnimationHeader* D_8085CF50[] = {
+ &gPlayerAnim_link_fighter_power_kiru_start,
+ &gPlayerAnim_link_fighter_Lpower_kiru_start,
+};
+PlayerAnimationHeader* D_8085CF58[] = {
+ &gPlayerAnim_link_fighter_power_kiru_startL,
+ &gPlayerAnim_link_fighter_Lpower_kiru_start,
+};
+PlayerAnimationHeader* D_8085CF60[] = {
+ &gPlayerAnim_link_fighter_power_kiru_wait,
+ &gPlayerAnim_link_fighter_Lpower_kiru_wait,
+};
+PlayerAnimationHeader* D_8085CF68[] = {
+ &gPlayerAnim_link_fighter_power_kiru_wait_end,
+ &gPlayerAnim_link_fighter_Lpower_kiru_wait_end,
+};
+PlayerAnimationHeader* D_8085CF70[] = {
+ &gPlayerAnim_link_fighter_power_kiru_walk,
+ &gPlayerAnim_link_fighter_Lpower_kiru_walk,
+};
+PlayerAnimationHeader* D_8085CF78[] = {
+ &gPlayerAnim_link_fighter_power_kiru_side_walk,
+ &gPlayerAnim_link_fighter_Lpower_kiru_side_walk,
+};
+
+u8 D_8085CF80[] = {
+ PLAYER_MWA_SPIN_ATTACK_1H,
+ PLAYER_MWA_SPIN_ATTACK_2H,
+};
+u8 D_8085CF84[] = {
+ PLAYER_MWA_BIG_SPIN_1H,
+ PLAYER_MWA_BIG_SPIN_2H,
+};
+
+// sBlureColors
+BlureColors D_8085CF88[] = {
+ { { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 } },
+ { { 165, 185, 255, 185 }, { 205, 225, 255, 50 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 } },
+};
+
+void Player_OverrideBlureColors(PlayState* play, Player* this, s32 colorType, s32 elemDuration) {
+ EffectBlure* blure0 = Effect_GetByIndex(this->meleeWeaponEffectIndex[0]);
+ EffectBlure* blure1 = Effect_GetByIndex(this->meleeWeaponEffectIndex[1]);
+ s32 i;
+
+ for (i = 0; i < 4; i++) {
+ blure0->p1StartColor[i] = D_8085CF88[colorType].p1StartColor[i];
+ blure0->p2StartColor[i] = D_8085CF88[colorType].p2StartColor[i];
+ blure0->p1EndColor[i] = D_8085CF88[colorType].p1EndColor[i];
+ blure0->p2EndColor[i] = D_8085CF88[colorType].p2EndColor[i];
+ blure1->p1StartColor[i] = D_8085CF88[colorType].p1StartColor[i];
+ blure1->p2StartColor[i] = D_8085CF88[colorType].p2StartColor[i];
+ blure1->p1EndColor[i] = D_8085CF88[colorType].p1EndColor[i];
+ blure1->p2EndColor[i] = D_8085CF88[colorType].p2EndColor[i];
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ elemDuration = 8;
+ }
+ blure0->elemDuration = elemDuration;
+ blure1->elemDuration = elemDuration;
+}
+
+void func_8082FA5C(PlayState* play, Player* this, PlayerMeleeWeaponState meleeWeaponState) {
+ u16 voiceSfxId;
+ u16 itemSfxId;
+
+ if (this->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_N;
+ if (this->transformation == PLAYER_FORM_GORON) {
+ itemSfxId = NA_SE_IT_GORON_PUNCH_SWING;
+ } else {
+ itemSfxId = NA_SE_NONE;
+ if (this->meleeWeaponAnimation >= PLAYER_MWA_SPIN_ATTACK_1H) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_L;
+ } else if (this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_KICK) {
+ itemSfxId = NA_SE_IT_GORON_PUNCH_SWING;
+ } else {
+ itemSfxId = NA_SE_IT_SWORD_SWING_HARD;
+ if (this->unk_ADD >= 3) {
+ voiceSfxId = NA_SE_VO_LI_SWORD_L;
+ } else {
+ itemSfxId = (this->heldItemAction == PLAYER_IA_SWORD_TWO_HANDED) ? NA_SE_IT_HAMMER_SWING
+ : NA_SE_IT_SWORD_SWING;
+ }
+ }
+ }
+
+ if (itemSfxId != NA_SE_NONE) {
+ func_8082E1F0(this, itemSfxId);
+ }
+
+ if (!((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_START) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_JUMPKICK_FINISH))) {
+ Player_AnimSfx_PlayVoice(this, voiceSfxId);
+ }
+
+ Player_OverrideBlureColors(play, this, 0, 4);
+ }
+
+ this->meleeWeaponState = meleeWeaponState;
+}
+
+s32 func_8082FB68(Player* this) {
+ if ((this->targetedActor != NULL) && CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_4)) {
+ this->stateFlags3 |= PLAYER_STATE3_80000000;
+ return true;
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_80000000) {
+ this->stateFlags3 &= ~PLAYER_STATE3_80000000;
+ if (this->linearVelocity == 0.0f) {
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+ }
+
+ return false;
+}
+
+s32 func_8082FBE8(Player* this) {
+ return func_80123420(this) || func_80123434(this);
+}
+
+s32 func_8082FC24(Player* this) {
+ return func_8082FB68(this) || func_80123434(this);
+}
+
+void func_8082FC60(Player* this) {
+ this->unk_B44 = 0.0f;
+ this->unk_B40 = 0.0f;
+}
+
+s32 func_8082FC78(Player* this, ItemId item) {
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->itemAction)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+s32 func_8082FCC4(Player* this, ItemId item, PlayerItemAction itemAction) {
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == itemAction)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+EquipSlot func_8082FD0C(Player* this, PlayerItemAction itemAction) {
+ s32 btn;
+
+ for (btn = EQUIP_SLOT_C_LEFT; btn <= EQUIP_SLOT_C_RIGHT; btn++) {
+ if (func_8082FCC4(this, GET_CUR_FORM_BTN_ITEM(btn), itemAction)) {
+ return btn;
+ }
+ }
+
+ return EQUIP_SLOT_NONE;
+}
+
+u16 D_8085CFA8[] = {
+ BTN_B,
+ BTN_CLEFT,
+ BTN_CDOWN,
+ BTN_CRIGHT,
+};
+
+// Return currently-pressed button, in order of priority B, CLEFT, CDOWN, CRIGHT.
+EquipSlot func_8082FDC4(void) {
+ EquipSlot i;
+
+ for (i = 0; i < ARRAY_COUNT(D_8085CFA8); i++) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, D_8085CFA8[i])) {
+ break;
+ }
+ }
+
+ return i;
+}
+
+void func_8082FE0C(Player* this, PlayState* play) {
+ if (this->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_20000000)) {
+ return;
+ }
+ if (this->stateFlags2 & PLAYER_STATE2_2000000) {
+ return;
+ }
+ if (this->stateFlags3 & PLAYER_STATE3_20000000) {
+ return;
+ }
+ if (func_801240DC(this)) {
+ return;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ if (this->currentMask != PLAYER_MASK_NONE) {
+ PlayerItemAction maskItemAction = GET_IA_FROM_MASK(this->currentMask);
+ EquipSlot btn = func_8082FD0C(this, maskItemAction);
+
+ if (btn <= EQUIP_SLOT_NONE) {
+ s32 maskIdMinusOne =
+ GET_MASK_FROM_IA(Player_ItemToItemAction(this, GET_CUR_FORM_BTN_ITEM(this->unk_154))) - 1;
+
+ if ((maskIdMinusOne < PLAYER_MASK_TRUTH - 1) || (maskIdMinusOne >= PLAYER_MASK_MAX - 1)) {
+ maskIdMinusOne = this->currentMask - 1;
+ }
+ func_80831990(play, this, Player_MaskIdToItemId(maskIdMinusOne));
+ return;
+ }
+
+ if ((this->currentMask == PLAYER_MASK_GIANT) && (gSaveContext.save.saveInfo.playerData.magic == 0)) {
+ func_80838A20(play, this);
+ }
+
+ this->unk_154 = btn;
+ }
+ }
+
+ if (((this->actor.id == ACTOR_PLAYER) && (this->itemAction >= PLAYER_IA_FISHING_ROD)) &&
+ !(((Player_GetHeldBButtonSword(this) == PLAYER_B_SWORD_NONE) || (gSaveContext.jinxTimer == 0)) &&
+ (func_8082FC78(this, (IREG(1) != 0) ? ITEM_FISHING_ROD : Inventory_GetBtnBItem(play)) ||
+ func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_LEFT)) || func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_DOWN)) ||
+ func_8082FC78(this, C_BTN_ITEM(EQUIP_SLOT_C_RIGHT))))) {
+ func_80831990(play, this, ITEM_NONE);
+ } else {
+ s32 pad;
+ ItemId item;
+ EquipSlot i = func_8082FDC4();
+
+ i = ((i >= EQUIP_SLOT_A) && (this->transformation == PLAYER_FORM_FIERCE_DEITY) &&
+ (this->heldItemAction != PLAYER_IA_SWORD_TWO_HANDED))
+ ? EQUIP_SLOT_B
+ : i;
+
+ item = func_8012364C(play, this, i);
+ if (item >= ITEM_FD) {
+ for (i = 0; i < ARRAY_COUNT(D_8085CFA8); i++) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, D_8085CFA8[i])) {
+ break;
+ }
+ }
+
+ item = func_8012364C(play, this, i);
+ if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->heldItemAction)) {
+ D_80862B4C = 1;
+ }
+ } else if (item == ITEM_F0) {
+ if (this->blastMaskTimer == 0) {
+ EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.focus.pos.x,
+ this->actor.focus.pos.y, this->actor.focus.pos.z,
+ BOMB_EXPLOSIVE_TYPE_BOMB, 0, 0, BOMB_TYPE_BODY);
+
+ if (bomb != NULL) {
+ bomb->timer = 0;
+ this->blastMaskTimer = 310;
+ }
+ }
+ } else if (item == ITEM_F1) {
+ func_80839978(play, this);
+ } else if (item == ITEM_F2) {
+ func_80839A10(play, this);
+ } else if ((Player_BButtonSwordFromIA(this, Player_ItemToItemAction(this, item)) != PLAYER_B_SWORD_NONE) &&
+ (gSaveContext.jinxTimer != 0)) {
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Message_StartTextbox(play, 0xF7, NULL);
+ }
+ } else {
+ this->heldItemButton = i;
+ func_80831990(play, this, item);
+ }
+ }
+}
+
+void func_808302CC(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+ s32 pad[3];
+ u8 nextModelAnimType;
+ s32 var_v1;
+ s8 itemAction = Player_ItemToItemAction(this, this->heldItemId);
+ s32 pad3;
+ f32 startFrame;
+ f32 endFrame;
+ f32 frameSpeed;
+
+ func_8082F43C(play, this, func_80848808);
+
+ nextModelAnimType = gPlayerModelTypes[this->nextModelGroup].modelAnimType;
+ var_v1 = D_8085CD00[gPlayerModelTypes[this->modelGroup].modelAnimType][nextModelAnimType];
+
+ if ((itemAction == PLAYER_IA_ZORA_FINS) || (this->heldItemAction == PLAYER_IA_ZORA_FINS)) {
+ var_v1 = (itemAction == PLAYER_IA_NONE) ? -14 : 14;
+ } else if ((itemAction == PLAYER_IA_BOTTLE_EMPTY) || (itemAction == PLAYER_IA_11) ||
+ ((itemAction == PLAYER_IA_NONE) &&
+ ((this->heldItemAction == PLAYER_IA_BOTTLE_EMPTY) || (this->heldItemAction == PLAYER_IA_11)))) {
+ var_v1 = (itemAction == PLAYER_IA_NONE) ? -13 : 13;
+ }
+
+ this->unk_14E = ABS_ALT(var_v1);
+ anim = D_8085CC88[this->unk_14E].anim;
+ if ((anim == &gPlayerAnim_link_normal_fighter2free) && (this->currentShield == PLAYER_SHIELD_NONE)) {
+ anim = &gPlayerAnim_link_normal_free2fighter_free;
+ }
+
+ endFrame = Animation_GetLastFrame(anim);
+
+ if (var_v1 >= 0) {
+ frameSpeed = 1.2f;
+ startFrame = 0.0f;
+ } else {
+ frameSpeed = -1.2f;
+ startFrame = endFrame;
+ endFrame = 0.0f;
+ }
+
+ if (itemAction != PLAYER_IA_NONE) {
+ frameSpeed *= 2.0f;
+ }
+
+ PlayerAnimation_Change(play, &this->unk_284, anim, frameSpeed, startFrame, endFrame, ANIMMODE_ONCE, 0.0f);
+ this->stateFlags3 &= ~PLAYER_STATE3_40000000;
+}
+
+void func_808304BC(Player* this, PlayState* play) {
+ if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags3 & PLAYER_STATE3_40000000)) {
+ if ((this->heldItemAction == this->itemAction) || (this->stateFlags1 & PLAYER_STATE1_400000)) {
+ if ((gSaveContext.save.saveInfo.playerData.health != 0) && (play->csCtx.state == CS_STATE_IDLE)) {
+ if ((this->csMode == PLAYER_CSMODE_0) && (play->unk_1887C == 0) && (play->activeCamId == CAM_ID_MAIN)) {
+ if (!func_8082DA90(play) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] != TIMER_STATE_STOP)) {
+ func_8082FE0C(this, play);
+ }
+ }
+ }
+ }
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_40000000) {
+ func_808302CC(this, play);
+ }
+}
+
+// EN_ARROW ammo related?
+s32 func_808305BC(PlayState* play, Player* this, ItemId* item, ArrowType* typeParam) {
+ if (this->heldItemAction == PLAYER_IA_NUT) {
+ *item = ITEM_NUT;
+ *typeParam = (this->transformation == PLAYER_FORM_DEKU) ? ARROW_TYPE_DEKU_BUBBLE : ARROW_TYPE_SLINGSHOT;
+ } else {
+ *item = ITEM_BOW;
+ *typeParam = (this->stateFlags1 & PLAYER_STATE1_800000)
+ ? ARROW_TYPE_NORMAL_HORSE
+ : (this->heldItemAction - PLAYER_IA_BOW + ARROW_TYPE_NORMAL);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ return ((gSaveContext.save.saveInfo.playerData.magic >= 2) ||
+ (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) && (play->sceneId == SCENE_BOWLING)))
+ ? 1
+ : 0;
+ }
+ if (this->stateFlags3 & PLAYER_STATE3_400) {
+ return 1;
+ }
+ if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
+ return play->interfaceCtx.minigameAmmo;
+ }
+ if (play->unk_1887C != 0) {
+ return play->unk_1887C;
+ }
+
+ return AMMO(*item);
+}
+
+u16 D_8085CFB0[] = {
+ NA_SE_PL_BOW_DRAW,
+ NA_SE_NONE,
+ NA_SE_IT_HOOKSHOT_READY,
+};
+
+u8 sMagicArrowCosts[] = {
+ 4, // ARROW_MAGIC_FIRE
+ 4, // ARROW_MAGIC_ICE
+ 8, // ARROW_MAGIC_LIGHT
+ 2, // ARROW_MAGIC_DEKU_BUBBLE
+};
+
+// Draw bow or hookshot / first person items?
+s32 func_808306F8(Player* this, PlayState* play) {
+ if ((this->heldItemAction >= PLAYER_IA_BOW_FIRE) && (this->heldItemAction <= PLAYER_IA_BOW_LIGHT) &&
+ (gSaveContext.magicState != MAGIC_STATE_IDLE)) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ func_8082F43C(play, this, func_80848BF4);
+
+ this->stateFlags3 |= PLAYER_STATE3_40;
+ this->unk_ACC = 14;
+
+ if (this->unk_B28 >= 0) {
+ s32 var_v1 = ABS_ALT(this->unk_B28);
+ ItemId item;
+ ArrowType arrowType;
+ ArrowMagic magicArrowType;
+
+ if (var_v1 != 2) {
+ Player_PlaySfx(this, D_8085CFB0[var_v1 - 1]);
+ }
+
+ if (!Player_IsHoldingHookshot(this) && (func_808305BC(play, this, &item, &arrowType) > 0)) {
+ if (this->unk_B28 >= 0) {
+ magicArrowType = ARROW_GET_MAGIC_FROM_TYPE(arrowType);
+
+ if ((ARROW_GET_MAGIC_FROM_TYPE(arrowType) >= ARROW_MAGIC_FIRE) &&
+ (ARROW_GET_MAGIC_FROM_TYPE(arrowType) <= ARROW_MAGIC_LIGHT)) {
+ if (((void)0, gSaveContext.save.saveInfo.playerData.magic) < sMagicArrowCosts[magicArrowType]) {
+ arrowType = ARROW_TYPE_NORMAL;
+ magicArrowType = ARROW_MAGIC_INVALID;
+ }
+ } else if ((arrowType == ARROW_TYPE_DEKU_BUBBLE) &&
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01) || (play->sceneId != SCENE_BOWLING))) {
+ magicArrowType = ARROW_MAGIC_DEKU_BUBBLE;
+ } else {
+ magicArrowType = ARROW_MAGIC_INVALID;
+ }
+
+ this->heldActor = Actor_SpawnAsChild(
+ &play->actorCtx, &this->actor, play, ACTOR_EN_ARROW, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, arrowType);
+
+ if ((this->heldActor != NULL) && (magicArrowType > ARROW_MAGIC_INVALID)) {
+ Magic_Consume(play, sMagicArrowCosts[magicArrowType], MAGIC_CONSUME_NOW);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+// Take out / put away sounds?
+void func_808308DC(PlayState* play, Player* this) {
+ s32 isGoronOrDeku = (this->transformation == PLAYER_FORM_GORON) || (this->transformation == PLAYER_FORM_DEKU);
+
+ if ((this->heldItemAction != PLAYER_IA_NONE) && !isGoronOrDeku) {
+ if (Player_SwordFromIA(this, this->heldItemAction) > PLAYER_SWORD_NONE) {
+ func_8082E1F0(this, NA_SE_IT_SWORD_PUTAWAY);
+ } else {
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ }
+
+ func_80831990(play, this, this->heldItemId);
+
+ if (!isGoronOrDeku) {
+ if (Player_SwordFromIA(this, this->heldItemAction) > PLAYER_SWORD_NONE) {
+ func_8082E1F0(this, NA_SE_IT_SWORD_PICKOUT);
+ } else if (this->heldItemAction != PLAYER_IA_NONE) {
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ }
+}
+
+void func_808309CC(PlayState* play, Player* this) {
+ if (func_80848808 == this->unk_AC4) {
+ func_808308DC(play, this);
+ }
+
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ this->unk_ACC = 0;
+ this->unk_AA4 = 0;
+ func_8082DCA0(play, this);
+ this->stateFlags3 &= ~PLAYER_STATE3_40000000;
+}
+
+PlayerAnimationHeader* D_8085CFBC[2] = {
+ &gPlayerAnim_link_anchor_waitR2defense,
+ &gPlayerAnim_link_anchor_waitR2defense_long,
+};
+PlayerAnimationHeader* D_8085CFC4[2] = {
+ &gPlayerAnim_link_anchor_waitL2defense,
+ &gPlayerAnim_link_anchor_waitL2defense_long,
+};
+PlayerAnimationHeader* D_8085CFCC[2] = {
+ &gPlayerAnim_link_anchor_defense_hit,
+ &gPlayerAnim_link_anchor_defense_long_hitL,
+};
+PlayerAnimationHeader* D_8085CFD4[2] = {
+ &gPlayerAnim_link_anchor_defense_hit,
+ &gPlayerAnim_link_anchor_defense_long_hitR,
+};
+PlayerAnimationHeader* D_8085CFDC[2] = {
+ &gPlayerAnim_link_normal_defense_hit,
+ &gPlayerAnim_link_fighter_defense_long_hit,
+};
+
+PlayerAnimationHeader* func_80830A58(PlayState* play, Player* this) {
+ func_8082F43C(play, this, func_8084894C);
+ func_8082DCA0(play, this);
+
+ if (this->unk_B40 < 0.5f) {
+ return D_8085CFBC[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ return D_8085CFC4[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+}
+
+void func_80830AE8(Player* this) {
+ s32 sfxId = (this->transformation == PLAYER_FORM_GORON)
+ ? NA_SE_PL_GORON_SQUAT
+ : ((this->transformation == PLAYER_FORM_DEKU) ? NA_SE_PL_CHANGE_ARMS : NA_SE_IT_SHIELD_SWING);
+
+ Player_PlaySfx(this, sfxId);
+}
+
+void func_80830B38(Player* this) {
+ s32 sfxId = (this->transformation == PLAYER_FORM_GORON)
+ ? NA_SE_PL_BALL_TO_GORON
+ : ((this->transformation == PLAYER_FORM_DEKU) ? NA_SE_PL_TAKE_OUT_SHIELD : NA_SE_IT_SHIELD_REMOVE);
+
+ Player_PlaySfx(this, sfxId);
+}
+
+s32 func_80830B88(PlayState* play, Player* this) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R)) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_400000 | PLAYER_STATE1_800000 | PLAYER_STATE1_20000000))) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000) || ((this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if ((play->unk_1887C == 0) && (this->heldItemAction == this->itemAction)) {
+ if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) ||
+ (!Player_IsGoronOrDeku(this) &&
+ ((((this->transformation == PLAYER_FORM_ZORA)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_2000000)) ||
+ ((this->transformation == PLAYER_FORM_HUMAN) &&
+ (this->currentShield != PLAYER_SHIELD_NONE))) &&
+ func_8082FBE8(this))) {
+ PlayerAnimationHeader* anim = func_80830A58(play, this);
+ f32 lastFrame = Animation_GetLastFrame(anim);
+
+ PlayerAnimation_Change(play, &this->unk_284, anim, 3.0f / 3.0f, lastFrame, lastFrame,
+ ANIMMODE_ONCE, 0.0f);
+ func_80830AE8(this);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_80830CE8(PlayState* play, Player* this) {
+ func_8082F43C(play, this, func_80848AB0);
+
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ Animation_Reverse(&this->unk_284);
+ func_80830B38(this);
+}
+
+void func_80830D40(PlayState* play, Player* this) {
+ struct_8085CC88* entry = &D_8085CC88[this->unk_14E];
+ f32 frame = entry->frame;
+
+ if (this->unk_284.playSpeed < 0.0f) {
+ frame -= 1.0f;
+ }
+ if (PlayerAnimation_OnFrame(&this->unk_284, frame)) {
+ func_808308DC(play, this);
+ }
+ func_8082FB68(this);
+}
+
+s32 func_80830DF0(Player* this, PlayState* play) {
+ if (this->stateFlags3 & PLAYER_STATE3_40000000) {
+ func_808302CC(this, play);
+ } else {
+ return false;
+ }
+ return true;
+}
+
+s32 func_80830E30(Player* this, PlayState* play) {
+ if ((this->heldItemAction == PLAYER_IA_11) || (this->transformation == PLAYER_FORM_ZORA)) {
+ func_8082F43C(play, this, func_8084923C);
+
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_LEFT)
+ ? &gPlayerAnim_pz_cutterwaitA
+ : ((this->meleeWeaponAnimation == PLAYER_MWA_ZORA_PUNCH_COMBO)
+ ? &gPlayerAnim_pz_cutterwaitB
+ : &gPlayerAnim_pz_cutterwaitC));
+ this->unk_ACC = 0xA;
+ } else {
+ if (!func_808306F8(this, play)) {
+ return false;
+ }
+
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (Player_IsHoldingHookshot(this))
+ ? &gPlayerAnim_link_hook_shot_ready
+ : ((this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_ready));
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_uma_anim_walk);
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->transformation != PLAYER_FORM_ZORA)) {
+ Player_AnimationPlayLoop(play, this, func_8082ED20(this));
+ }
+
+ return true;
+}
+
+s32 func_80830F9C(PlayState* play) {
+ return (play->unk_1887C > 0) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B);
+}
+
+s32 func_80830FD4(PlayState* play) {
+ return (play->unk_1887C != 0) &&
+ ((play->unk_1887C < 0) || CHECK_BTN_ANY(sPlayerControlInput->cur.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A));
+}
+
+s32 func_80831010(Player* this, PlayState* play) {
+ if ((this->unk_AA5 == PLAYER_UNKAA5_0) || (this->unk_AA5 == PLAYER_UNKAA5_3)) {
+ if (func_8082FBE8(this) || (this->targetedActor != NULL) ||
+ (Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_BOWARROW) == 0)) {
+ return true;
+ }
+ this->unk_AA5 = PLAYER_UNKAA5_3;
+ }
+ return false;
+}
+
+s32 func_80831094(Player* this, PlayState* play) {
+ if ((this->doorType == PLAYER_DOORTYPE_NONE) && !(this->stateFlags1 & PLAYER_STATE1_2000000)) {
+ if ((D_80862B48 != 0) || func_80830F9C(play)) {
+ if (func_80830E30(this, play)) {
+ return func_80831010(this, play);
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80831124(PlayState* play, Player* this) {
+ if (this->actor.child != NULL) {
+ if (this->heldActor == NULL) {
+ this->heldActor = this->actor.child;
+ Player_RequestRumble(play, this, 255, 10, 250, SQ(0));
+ Player_PlaySfx(this, NA_SE_IT_HOOKSHOT_RECEIVE);
+ }
+ return true;
+ }
+ return false;
+}
+
+s32 func_80831194(PlayState* play, Player* this) {
+ if (this->heldActor != NULL) {
+ if (!Player_IsHoldingHookshot(this)) {
+ ItemId item;
+ ArrowType arrowType;
+
+ func_808305BC(play, this, &item, &arrowType);
+ if ((this->transformation != PLAYER_FORM_DEKU) && !(this->stateFlags3 & PLAYER_STATE3_400)) {
+ if (gSaveContext.minigameStatus == MINIGAME_STATUS_ACTIVE) {
+ if ((play->sceneId != SCENE_SYATEKI_MIZU) && (play->sceneId != SCENE_F01) &&
+ (play->sceneId != SCENE_SYATEKI_MORI)) {
+ play->interfaceCtx.minigameAmmo--;
+ }
+ } else if (play->unk_1887C != 0) {
+ play->unk_1887C--;
+ } else {
+ Inventory_ChangeAmmo(item, -1);
+ }
+ }
+
+ if (play->unk_1887C == 1) {
+ play->unk_1887C = -10;
+ }
+
+ Player_RequestRumble(play, this, 150, 10, 150, SQ(0));
+ } else {
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ this->unk_B48 = 0.0f;
+ }
+
+ this->unk_D57 = (this->transformation == PLAYER_FORM_DEKU) ? 20 : 4;
+
+ this->heldActor->parent = NULL;
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ return true;
+ }
+
+ return false;
+}
+
+void func_8083133C(Player* this) {
+ this->stateFlags1 |= PLAYER_STATE1_20000;
+
+ if (!(this->skelAnime.moveFlags & ANIM_FLAG_80) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ (D_80862B20 < 0x2000)) {
+ this->currentYaw = this->actor.shape.rot.y = this->actor.wallYaw + 0x8000;
+ }
+
+ this->targetYaw = this->actor.shape.rot.y;
+}
+
+s32 func_808313A8(PlayState* play, Player* this, Actor* actor) {
+ if (actor == NULL) {
+ func_8082DE50(play, this);
+ func_80836988(this, play);
+ return true;
+ }
+
+ return false;
+}
+
+void func_808313F0(Player* this, PlayState* play) {
+ if (!func_808313A8(play, this, this->heldActor)) {
+ func_8082F43C(play, this, func_808490B4);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_link_normal_carryB_wait);
+ }
+}
+
+// Stops the current fanfare if a stateflag is set; these two are Kamaro Dancing and Bremen Marching.
+void func_80831454(Player* this) {
+ if ((this->stateFlags3 & PLAYER_STATE3_20000000) || (this->stateFlags2 & PLAYER_STATE2_2000000)) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
+ }
+}
+
+s32 Player_SetAction(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ s32 i;
+ f32* ptr;
+
+ if (actionFunc == this->actionFunc) {
+ return false;
+ }
+
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_PICTO_BOX_ON;
+
+ if (this->actor.flags & ACTOR_FLAG_20000000) {
+ AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+ } else if ((func_80857BE8 == this->actionFunc) || (func_808561B0 == this->actionFunc)) {
+ this->actor.shape.shadowDraw = ActorShadow_DrawFeet;
+ this->actor.shape.shadowScale = this->ageProperties->shadowScale;
+ this->unk_ABC = 0.0f;
+ if (func_80857BE8 == this->actionFunc) {
+ if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ Magic_Reset(play);
+ }
+ func_8082DD2C(play, this);
+ this->actor.shape.rot.x = 0;
+ this->actor.shape.rot.z = 0;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_800;
+ } else {
+ Actor_SetScale(&this->actor, 0.01f);
+ }
+ } else if ((this->transformation == PLAYER_FORM_GORON) &&
+ (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)) {
+ func_80831990(play, this, ITEM_NONE);
+ }
+
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ this->actionFunc = actionFunc;
+
+ if ((this->itemAction != this->heldItemAction) && (!(arg3 & 1) || !(this->stateFlags1 & PLAYER_STATE1_400000))) {
+ func_80123C58(this);
+ }
+
+ if (!(arg3 & 1) && !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_808309CC(play, this);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, func_8082ED20(this));
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ }
+
+ func_80831454(this);
+ func_8082E794(this);
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_40 | PLAYER_STATE1_4000000 | PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000 |
+ PLAYER_STATE1_80000000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_80000 | PLAYER_STATE2_800000 | PLAYER_STATE2_2000000 | PLAYER_STATE2_8000000 |
+ PLAYER_STATE2_10000000);
+ this->stateFlags3 &=
+ ~(PLAYER_STATE3_2 | PLAYER_STATE3_8 | PLAYER_STATE3_80 | PLAYER_STATE3_200 | PLAYER_STATE3_2000 |
+ PLAYER_STATE3_8000 | PLAYER_STATE3_10000 | PLAYER_STATE3_20000 | PLAYER_STATE3_40000 | PLAYER_STATE3_80000 |
+ PLAYER_STATE3_200000 | PLAYER_STATE3_1000000 | PLAYER_STATE3_20000000);
+
+ this->unk_AE7 = 0;
+ this->unk_AE8 = 0;
+ this->unk_AA4 = 0;
+ this->unk_B86[0] = 0;
+ this->unk_B86[1] = 0;
+ this->unk_B8A = 0;
+ this->unk_B8C = 0;
+ this->unk_B8E = 0;
+
+ // TODO: Is there no other way to write this that works?
+ i = 0;
+ ptr = this->unk_B10;
+ do {
+ *ptr = 0.0f;
+ ptr++;
+ i++;
+ } while (i < ARRAY_COUNT(this->unk_B10));
+
+ this->actor.shape.rot.z = 0;
+
+ Player_ResetCylinder(this);
+ func_8082E00C(this);
+
+ return true;
+}
+
+void func_8083172C(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ s32 moveFlags = this->skelAnime.moveFlags;
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, actionFunc, arg3);
+ this->skelAnime.moveFlags = moveFlags;
+}
+
+void func_80831760(PlayState* play, Player* this, PlayerActionFunc actionFunc, s32 arg3) {
+ if (this->itemAction > PLAYER_IA_MINUS1) {
+ PlayerItemAction heldItemAction = this->itemAction;
+
+ this->itemAction = this->heldItemAction;
+ Player_SetAction(play, this, actionFunc, arg3);
+ this->itemAction = heldItemAction;
+
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+ }
+}
+
+void func_808317C4(Player* this) {
+ if (Player_IsHoldingHookshot(this)) {
+ if (this->heldActor != NULL) {
+ Actor_Kill(this->heldActor);
+ this->actor.child = NULL;
+ this->heldActor = NULL;
+ }
+ }
+}
+
+s32 func_80831814(Player* this, PlayState* play, PlayerUnkAA5 arg2) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_800 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000))) {
+ if (Camera_CheckValidMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_FIRSTPERSON) != 0) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_801242B4(this) && (this->actor.depthInWater < this->ageProperties->unk_2C))) {
+ this->unk_AA5 = arg2;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+// Toggle Lens
+void func_808318C0(PlayState* play) {
+ if (Magic_Consume(play, 0, MAGIC_CONSUME_LENS)) {
+ if (play->actorCtx.lensActive) {
+ Actor_DeactivateLens(play);
+ } else {
+ play->actorCtx.lensActive = true;
+ }
+
+ play_sound(play->actorCtx.lensActive ? NA_SE_SY_GLASSMODE_ON : NA_SE_SY_GLASSMODE_OFF);
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ }
+}
+
+// Toggle Lens from a button press
+void func_80831944(PlayState* play, Player* this) {
+ if (func_8012364C(play, this, func_8082FDC4()) == ITEM_LENS) {
+ func_808318C0(play);
+ }
+}
+
+// Proposed name: Player_UseItem
+void func_80831990(PlayState* play, Player* this, ItemId item) {
+ PlayerItemAction itemAction = Player_ItemToItemAction(this, item);
+
+ if ((((this->heldItemAction == this->itemAction) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_400000) ||
+ (Player_MeleeWeaponFromIA(itemAction) != PLAYER_MELEEWEAPON_NONE) || (itemAction == PLAYER_IA_NONE))) ||
+ ((this->itemAction <= PLAYER_IA_MINUS1) &&
+ ((Player_MeleeWeaponFromIA(itemAction) != PLAYER_MELEEWEAPON_NONE) || (itemAction == PLAYER_IA_NONE)))) &&
+ ((itemAction == PLAYER_IA_NONE) || !(this->stateFlags1 & PLAYER_STATE1_8000000) ||
+ (itemAction == PLAYER_IA_MASK_ZORA) ||
+ ((this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)))) {
+ s32 var_v1 = ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction <= PLAYER_IA_MASK_MAX) &&
+ ((this->transformation != PLAYER_FORM_HUMAN) || (itemAction >= PLAYER_IA_MASK_GIANT)));
+ CollisionPoly* sp5C;
+ s32 sp58;
+ f32 sp54;
+ PlayerExplosive explosiveType;
+
+ if (var_v1 ||
+ (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED) && (itemAction != PLAYER_IA_NONE)) ||
+ (itemAction == PLAYER_IA_OCARINA) ||
+ ((itemAction > PLAYER_IA_BOTTLE_MIN) && itemAction < PLAYER_IA_MASK_MIN) ||
+ ((itemAction == PLAYER_IA_PICTO_BOX) && (this->talkActor != NULL) &&
+ (this->exchangeItemId > PLAYER_IA_NONE))) {
+ if (var_v1) {
+ PlayerTransformation playerForm = (itemAction < PLAYER_IA_MASK_FIERCE_DEITY)
+ ? PLAYER_FORM_HUMAN
+ : itemAction - PLAYER_IA_MASK_FIERCE_DEITY;
+
+ if (((this->currentMask != PLAYER_MASK_GIANT) && (itemAction == PLAYER_IA_MASK_GIANT) &&
+ ((gSaveContext.magicState != MAGIC_STATE_IDLE) ||
+ (gSaveContext.save.saveInfo.playerData.magic == 0))) ||
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ BgCheck_EntityCheckCeiling(&play->colCtx, &sp54, &this->actor.world.pos,
+ sPlayerAgeProperties[playerForm].unk_00, &sp5C, &sp58, &this->actor))) {
+ play_sound(NA_SE_SY_ERROR);
+ return;
+ }
+ }
+ if ((itemAction == PLAYER_IA_MAGIC_BEANS) && (AMMO(ITEM_MAGIC_BEANS) == 0)) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ this->itemAction = itemAction;
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+ }
+ } else if (((itemAction == PLAYER_IA_STICK) && (AMMO(ITEM_STICK) == 0)) ||
+ (((play->unk_1887D != 0) || (play->unk_1887E != 0)) &&
+ (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].length >= 5)) ||
+ ((play->unk_1887D == 0) && (play->unk_1887E == 0) &&
+ ((explosiveType = Player_ExplosiveFromIA(this, itemAction)) > PLAYER_EXPLOSIVE_NONE) &&
+ ((AMMO(sPlayerExplosiveInfo[explosiveType].itemId) == 0) ||
+ (play->actorCtx.actorLists[ACTORCAT_EXPLOSIVES].length >= 3)))) {
+ play_sound(NA_SE_SY_ERROR);
+ } else if (itemAction == PLAYER_IA_LENS) {
+ func_808318C0(play);
+ } else if (itemAction == PLAYER_IA_PICTO_BOX) {
+ if (!func_80831814(this, play, PLAYER_UNKAA5_2)) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ } else if ((itemAction == PLAYER_IA_NUT) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->heldItemButton != 0))) {
+ if (AMMO(ITEM_NUT) != 0) {
+ func_8083A658(play, this);
+ } else {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ } else if ((this->transformation == PLAYER_FORM_HUMAN) && (itemAction >= PLAYER_IA_MASK_MIN) &&
+ (itemAction < PLAYER_IA_MASK_GIANT)) {
+ PlayerMask maskId = GET_MASK_FROM_IA(itemAction);
+
+ this->prevMask = this->currentMask;
+ if (maskId == this->currentMask) {
+ this->currentMask = PLAYER_MASK_NONE;
+ func_8082E1F0(this, NA_SE_PL_TAKE_OUT_SHIELD);
+ } else {
+ this->currentMask = maskId;
+ func_8082E1F0(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ gSaveContext.save.equippedMask = this->currentMask;
+ } else if ((itemAction != this->heldItemAction) ||
+ ((this->heldActor == NULL) && (Player_ExplosiveFromIA(this, itemAction) > PLAYER_EXPLOSIVE_NONE))) {
+ u8 nextAnimType;
+
+ this->nextModelGroup = Player_ActionToModelGroup(this, itemAction);
+ nextAnimType = gPlayerModelTypes[this->nextModelGroup].modelAnimType;
+ var_v1 = ((this->transformation != PLAYER_FORM_GORON) || (itemAction == PLAYER_IA_POWDER_KEG));
+
+ if (var_v1 && (this->heldItemAction >= 0) && (item != this->heldItemId) &&
+ (D_8085CD00[gPlayerModelTypes[this->modelGroup].modelAnimType][nextAnimType] != 0)) {
+ this->heldItemId = item;
+ this->stateFlags3 |= PLAYER_STATE3_40000000;
+ } else {
+ func_808317C4(this);
+ func_8082DCA0(play, this);
+ func_8082F470(play, this, itemAction);
+ if (!var_v1) {
+ D_80862B48 = 1;
+ D_80862B4C = 1;
+ }
+ }
+ } else {
+ D_80862B48 = 1;
+ D_80862B4C = 1;
+ }
+ }
+}
+
+void func_80831F34(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ s32 sp24 = func_801242B4(this);
+
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, sp24 ? func_80851BD4 : func_8084BFDC, 0);
+ Player_AnimationPlayOnce(play, this, anim);
+
+ if (anim == &gPlayerAnim_link_derth_rebirth) {
+ this->skelAnime.endFrame = 84.0f;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_80;
+
+ func_8082DAD4(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DOWN);
+
+ if (this == GET_PLAYER(play)) {
+ this->csId = play->playerCsIds[PLAYER_CS_ID_DEATH];
+ Audio_SetBgmVolumeOff();
+ gSaveContext.powderKegTimer = 0;
+ gSaveContext.unk_1014 = 0;
+ gSaveContext.jinxTimer = 0;
+
+ if (Inventory_ConsumeFairy(play)) {
+ play->gameOverCtx.state = GAMEOVER_REVIVE_START;
+ this->unk_AE7 = 1;
+ } else {
+ play->gameOverCtx.state = GAMEOVER_DEATH_START;
+ func_801A41F8(0);
+ Audio_PlayFanfare(NA_BGM_GAME_OVER);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ }
+
+ ShrinkWindow_Letterbox_SetSizeTarget(32);
+ }
+}
+
+s32 func_80832090(Player* this) {
+ return (!(func_8084D770 == this->actionFunc) ||
+ (((this->stateFlags3 & PLAYER_STATE3_40000000)) &&
+ ((this->heldItemId == ITEM_FC) || (this->heldItemId == ITEM_NONE)))) &&
+ (!(func_80848808 == this->unk_AC4) ||
+ Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction);
+}
+
+// Whether action is Bremen marching or Kamaro dancing
+s32 func_8083213C(Player* this) {
+ return (func_8084AC84 == this->actionFunc) || (func_8084AEEC == this->actionFunc);
+}
+
+s32 func_8083216C(Player* this, PlayState* play) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800000) && (this->actor.parent != NULL) && Player_IsHoldingHookshot(this)) {
+ Player_SetAction(play, this, func_80855E08, 1);
+ this->stateFlags3 |= PLAYER_STATE3_80;
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_hook_fly_start);
+ func_8082E920(play, this, (ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80));
+ func_8082DAD4(this);
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ this->unk_AA6 |= 0x43;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH);
+ return true;
+ }
+
+ if (func_80832090(this)) {
+ func_808304BC(this, play);
+ if (func_80852B28 == this->actionFunc) {
+ return true;
+ }
+ }
+
+ if (!this->unk_AC4(this, play)) {
+ return false;
+ }
+
+ if (this->unk_AC8 != 0.0f) {
+ if ((func_8082ED94(this) == 0) || (this->linearVelocity != 0.0f)) {
+ AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->unk_284.jointTable,
+ this->skelAnime.jointTable, D_8085B9F0);
+ }
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->skelAnime.moveFlags & ANIM_FLAG_8)) {
+ Math_StepToF(&this->unk_AC8, 0.0f, 0.25f);
+ AnimationContext_SetInterp(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable, 1.0f - this->unk_AC8);
+ }
+ } else if ((func_8082ED94(this) == 0) || (this->linearVelocity != 0.0f) ||
+ (this->skelAnime.moveFlags & ANIM_FLAG_8)) {
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable, D_8085B9F0);
+ } else {
+ AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable);
+ }
+
+ return true;
+}
+
+s32 func_808323C0(Player* this, s16 csId) {
+ if ((csId > CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != csId)) {
+ if (!CutsceneManager_IsNext(csId)) {
+ CutsceneManager_Queue(csId);
+
+ return false;
+ }
+ CutsceneManager_Start(csId, &this->actor);
+ }
+ this->csId = csId;
+
+ return true;
+}
+
+s32 func_80832444(Player* this) {
+ if (this->csId > CS_ID_NONE) {
+ if (!CutsceneManager_IsNext(this->csId)) {
+ CutsceneManager_Queue(this->csId);
+ return false;
+ }
+
+ CutsceneManager_Start(this->csId, &this->actor);
+ }
+ return true;
+}
+
+s32 func_8083249C(Player* this) {
+ if ((this->csId > CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() != this->csId)) {
+ return func_80832444(this);
+ }
+ return true;
+}
+
+s32 func_808324EC(PlayState* play, Player* this, PlayerFuncD58 arg2, s32 csId) {
+ this->unk_D58 = arg2;
+ this->csId = csId;
+ Player_SetAction(play, this, func_8084D770, 0);
+ func_8083249C(this);
+ this->stateFlags2 |= PLAYER_STATE2_40;
+ return func_8082DE14(play, this);
+}
+
+s32 func_80832558(PlayState* play, Player* this, PlayerFuncD58 arg2) {
+ return func_808324EC(play, this, arg2, CS_ID_NONE);
+}
+
+// To do with turning, related to targeting
+void func_80832578(Player* this, PlayState* play) {
+ s16 previousYaw = this->actor.shape.rot.y;
+
+ if (!(this->stateFlags2 & (PLAYER_STATE2_20 | PLAYER_STATE2_40))) {
+ Actor* targetedActor = this->targetedActor;
+
+ if ((targetedActor != NULL) && ((play->actorCtx.targetContext.unk4B != 0) || (this != GET_PLAYER(play))) &&
+ (targetedActor->id != ACTOR_OBJ_NOZOKI)) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y,
+ Math_Vec3f_Yaw(&this->actor.world.pos, &targetedActor->focus.pos), 0xFA0);
+ } else if ((this->stateFlags1 & PLAYER_STATE1_20000) &&
+ !(this->stateFlags2 & (PLAYER_STATE2_20 | PLAYER_STATE2_40))) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->targetYaw, 0xFA0);
+ }
+ } else if (!(this->stateFlags2 & PLAYER_STATE2_40)) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->currentYaw, 0x7D0);
+ }
+
+ this->unk_B4C = this->actor.shape.rot.y - previousYaw;
+}
+
+s16 func_80832660(s16* pValue, s16 target, s16 step, s16 arg3, s16 arg4, s16 arg5) {
+ s16 temp1;
+ s16 temp2;
+ s16 temp3;
+
+ temp1 = temp2 = arg4 - *pValue;
+ temp2 = CLAMP(temp2, -arg5, arg5);
+ *pValue += BINANG_SUB(temp1, temp2);
+
+ Math_ScaledStepToS(pValue, target, step);
+
+ temp3 = *pValue;
+ if (*pValue < -arg3) {
+ *pValue = -arg3;
+ } else if (arg3 < *pValue) {
+ *pValue = arg3;
+ }
+ return temp3 - *pValue;
+}
+
+s16 func_80832754(Player* this, s32 arg1) {
+ s16 sp36;
+ s16 var_s1 = this->actor.shape.rot.y;
+
+ if (arg1) {
+ this->upperLimbRot.x = this->actor.focus.rot.x;
+ var_s1 = this->actor.focus.rot.y;
+ this->unk_AA6 |= 0x41;
+ } else {
+ s16 temp =
+ func_80832660(&this->headLimbRot.x, this->actor.focus.rot.x, 0x258, 0x2710, this->actor.focus.rot.x, 0);
+
+ func_80832660(&this->upperLimbRot.x, temp, 0xC8, 0xFA0, this->headLimbRot.x, 0x2710);
+
+ sp36 = this->actor.focus.rot.y - var_s1;
+ func_80832660(&sp36, 0, 0xC8, 0x5DC0, this->upperLimbRot.y, 0x1F40);
+ var_s1 = this->actor.focus.rot.y - sp36;
+ func_80832660(&this->headLimbRot.y, (sp36 - this->upperLimbRot.y), 0xC8, 0x1F40, sp36, 0x1F40);
+ func_80832660(&this->upperLimbRot.y, sp36, 0xC8, 0x1F40, this->headLimbRot.y, 0x1F40);
+ this->unk_AA6 |= 0xD9;
+ }
+
+ return var_s1;
+}
+
+void func_80832888(Player* this, PlayState* play) {
+ s32 var_v1 = 0;
+ Actor* var_v1_2;
+ s32 heldZ = CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_Z);
+ s32 temp_v0_3;
+ s32 var_a1;
+
+ if (!heldZ) {
+ this->stateFlags1 &= ~PLAYER_STATE1_40000000;
+ }
+
+ if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != PLAYER_CSMODE_0) ||
+ (this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) || (this->stateFlags3 & PLAYER_STATE3_80)) {
+ this->unk_738 = 0;
+ } else if (heldZ || (this->stateFlags2 & PLAYER_STATE2_2000) || (this->unk_A78 != NULL)) {
+ if (this->unk_738 <= 5) {
+ this->unk_738 = 5;
+ } else {
+ this->unk_738--;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_20000) {
+ this->unk_738 = 0;
+ } else if (this->unk_738 != 0) {
+ this->unk_738--;
+ }
+
+ if (this->unk_738 > 5) {
+ var_v1 = 1;
+ }
+
+ temp_v0_3 = func_8082DAFC(play);
+ if (temp_v0_3 || (this->unk_738 != 0) || (this->stateFlags1 & (PLAYER_STATE1_1000 | PLAYER_STATE1_2000000))) {
+ if (!temp_v0_3) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_2000000) &&
+ ((this->heldItemAction != PLAYER_IA_FISHING_ROD) || (this->unk_B28 == 0)) &&
+ CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_Z)) {
+ var_v1_2 = (this == GET_PLAYER(play)) ? play->actorCtx.targetContext.arrowPointedActor
+ : &GET_PLAYER(play)->actor;
+ var_a1 = (gSaveContext.options.zTargetSetting != 0) || (this != GET_PLAYER(play));
+ this->stateFlags1 |= PLAYER_STATE1_8000;
+ if ((this->currentMask != PLAYER_MASK_GIANT) && (var_v1_2 != NULL) &&
+ !(var_v1_2->flags & ACTOR_FLAG_CANT_LOCK_ON) &&
+ !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) {
+ if ((var_v1_2 == this->targetedActor) && (this == GET_PLAYER(play))) {
+ var_v1_2 = play->actorCtx.targetContext.unk_94;
+ }
+
+ if ((var_v1_2 != NULL) &&
+ (((var_v1_2 != this->targetedActor)) || (var_v1_2->flags & ACTOR_FLAG_80000))) {
+ var_v1_2->flags &= ~ACTOR_FLAG_80000;
+ if (!var_a1) {
+ this->stateFlags2 |= PLAYER_STATE2_2000;
+ }
+ this->targetedActor = var_v1_2;
+ this->unk_738 = 0xF;
+ this->stateFlags2 &= ~(PLAYER_STATE2_2 | PLAYER_STATE2_200000);
+ } else if (!var_a1) {
+ func_80123DA4(this);
+ }
+ this->stateFlags1 &= ~PLAYER_STATE1_40000000;
+ } else if (!(this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) &&
+ (func_808573A4 != this->actionFunc)) {
+ func_8083133C(this);
+ }
+ }
+
+ if (this->targetedActor != NULL) {
+ if ((this == GET_PLAYER(play)) && (this->targetedActor != this->unk_A78) &&
+ func_800B83F8(this->targetedActor, this, var_v1)) {
+ func_80123DA4(this);
+ this->stateFlags1 |= PLAYER_STATE1_40000000;
+ } else if (this->targetedActor != NULL) {
+ this->targetedActor->targetPriority = 0x28;
+ }
+ } else if (this->unk_A78 != NULL) {
+ this->targetedActor = this->unk_A78;
+ }
+ }
+
+ if ((this->targetedActor != NULL) && !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_10000 | PLAYER_STATE1_20000);
+ if ((this->stateFlags1 & PLAYER_STATE1_800) ||
+ !CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_4)) {
+ this->stateFlags1 |= PLAYER_STATE1_10000;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_20000) {
+ this->stateFlags2 &= ~PLAYER_STATE2_2000;
+ } else {
+ func_80123DC0(this);
+ }
+ } else {
+ func_80123DC0(this);
+ }
+}
+
+s32 func_80832CAC(PlayState* play, Player* this, f32* arg2, s16* outYaw, f32 arg4) {
+ f32 temp_fv1_2;
+
+ if ((this->unk_AA5 != PLAYER_UNKAA5_0) || func_8082DA90(play) || (this->stateFlags1 & PLAYER_STATE1_1)) {
+ *arg2 = 0.0f;
+ *outYaw = this->actor.shape.rot.y;
+ } else {
+ *arg2 = D_80862AFC;
+ *outYaw = D_80862B00;
+ if (arg4 != 0.0f) {
+ *arg2 -= 20.0f;
+ if (*arg2 < 0.0f) {
+ *arg2 = 0.0f;
+ } else {
+ temp_fv1_2 = 1.0f - Math_CosS(*arg2 * 450.0f);
+ *arg2 = (SQ(temp_fv1_2) * 30.0f) + 7.0f;
+ }
+ } else {
+ *arg2 *= 0.8f;
+ }
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ *arg2 *= 1.5f;
+ }
+
+ if (D_80862AFC != 0.0f) {
+ f32 temp_fv0 = Math_SinS(this->unk_B6C);
+ f32 var_fa0 = this->unk_B50;
+ f32 var_fa1;
+
+ if (this->unk_AB8 != 0.0f) {
+ var_fa1 = (this->targetedActor != NULL) ? 0.002f : 0.008f;
+
+ var_fa0 -= this->unk_AB8 * var_fa1;
+ var_fa0 = CLAMP_MIN(var_fa0, 2.0f);
+ }
+ *arg2 = (*arg2 * 0.14f) - (8.0f * temp_fv0 * temp_fv0);
+ *arg2 = CLAMP(*arg2, 0.0f, var_fa0);
+ if (temp_fv0) {} //! FAKE
+ return true;
+ }
+ }
+
+ return false;
+}
+
+s32 func_80832F24(Player* this) {
+ return Math_StepToF(&this->linearVelocity, 0.0f, REG(43) / 100.0f);
+}
+
+s32 func_80832F78(Player* this, f32* arg1, s16* outYaw, f32 arg3, PlayState* play) {
+ if (!func_80832CAC(play, this, arg1, outYaw, arg3)) {
+ *outYaw = this->actor.shape.rot.y;
+
+ if (this->targetedActor != NULL) {
+ if ((play->actorCtx.targetContext.unk4B != 0) && !(this->stateFlags2 & PLAYER_STATE2_40)) {
+ *outYaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->targetedActor->focus.pos);
+ }
+ } else if (func_80123434(this)) {
+ *outYaw = this->targetYaw;
+ }
+
+ return false;
+ }
+
+ *outYaw += Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ return true;
+}
+
+/**
+ * The values of following arrays are used as indices for the `D_8085D054` array.
+ * Each index correspond to a function which will be called sequentially until any of them return `true`.
+ * Negative marks the end of the array.
+ */
+s8 D_8085CFE4[] = { 13, 2, 4, 9, 10, 11, 8, -7 };
+s8 D_8085CFEC[] = { 13, 1, 2, 5, 3, 4, 9, 10, 11, 7, 8, -6 };
+s8 D_8085CFF8[] = { 13, 1, 2, 3, 4, 9, 10, 11, 8, 7, -6 };
+s8 D_8085D004[] = { 13, 2, 4, 9, 10, 11, 8, -7 };
+s8 D_8085D00C[] = { 13, 2, 4, 9, 10, 11, 12, 8, -7 };
+s8 D_8085D018[] = { -7 };
+s8 D_8085D01C[] = { 0, 11, 1, 2, 3, 5, 4, 9, 8, 7, -6 };
+s8 D_8085D028[] = { 0, 11, 1, 2, 3, 12, 5, 4, 9, 8, 7, -6 };
+s8 D_8085D034[] = { 13, 1, 2, 3, 12, 5, 4, 9, 10, 11, 8, 7, -6 };
+s8 D_8085D044[] = { 10, 8, -7 };
+s8 D_8085D048[] = { 0, 12, 5, 4, -14 };
+s8 D_8085D050[] = { 13, 2, -4 };
+
+s32 (*D_8085D054[])(Player*, PlayState*) = {
+ func_80839518, func_808365DC, func_8083D23C, func_8083CCB4, func_808391D8,
+ func_8083DFC4, func_8083A114, func_80848570, func_8083A580, func_8083D78C,
+ func_80839B18, func_8083A274, func_80834DFC, func_80838A90, func_8083A0CC,
+};
+
+s32 func_80833058(PlayState* play, Player* this, s8* arg2, s32 arg3) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_1 | PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) && !func_8082DA90(play)) {
+ if (arg3) {
+ D_80862B04 = func_8083216C(this, play);
+ if (func_80852B28 == this->actionFunc) {
+ return true;
+ }
+ }
+
+ if (func_801240DC(this)) {
+ this->unk_AA6 |= 0x41;
+ return true;
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_40000000) && (func_80848808 != this->unk_AC4)) {
+ while (*arg2 >= 0) {
+ if (D_8085D054[*arg2](this, play)) {
+ return true;
+ }
+ arg2++;
+ }
+
+ if (D_8085D054[-*arg2](this, play)) {
+ return true;
+ }
+ }
+
+ if (func_8083213C(this)) {
+ return true;
+ }
+ } else if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8083216C(this, play);
+ }
+
+ return false;
+}
+
+s32 func_808331FC(PlayState* play, Player* this, SkelAnime* skelAnime, f32 frame) {
+ if ((skelAnime->endFrame - frame) <= skelAnime->curFrame) {
+ f32 sp24;
+ s16 sp22;
+
+ if (func_80833058(play, this, D_8085D01C, 1)) {
+ return 0;
+ }
+
+ if (D_80862B04 || func_80832F78(this, &sp24, &sp22, 0.018f, play)) {
+ return 1;
+ }
+ }
+ return -1;
+}
+
+void func_808332A0(PlayState* play, Player* this, s32 magicCost, s32 isSwordBeam) {
+ if (magicCost != 0) {
+ this->unk_B08 = 0.0f;
+ } else {
+ this->unk_B08 = 0.5f;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+ if ((this->actor.id == ACTOR_PLAYER) && (isSwordBeam || (this->transformation == PLAYER_FORM_HUMAN))) {
+ s16 pitch = 0;
+ Actor* thunder;
+
+ if (isSwordBeam) {
+ if (this->targetedActor != NULL) {
+ pitch = Math_Vec3f_Pitch(&this->bodyPartsPos[PLAYER_BODYPART_WAIST], &this->targetedActor->focus.pos);
+ }
+ if (gSaveContext.save.saveInfo.playerData.magic == 0) {
+ return;
+ }
+ }
+
+ thunder = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_M_THUNDER, this->bodyPartsPos[PLAYER_BODYPART_WAIST].x,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y, this->bodyPartsPos[PLAYER_BODYPART_WAIST].z,
+ pitch, 0, 0, (this->heldItemAction - PLAYER_IA_SWORD_KOKIRI) | magicCost);
+
+ if ((thunder != NULL) && isSwordBeam) {
+ Magic_Consume(play, 1, MAGIC_CONSUME_DEITY_BEAM);
+ this->unk_D57 = 4;
+ }
+ }
+}
+
+// Check for inputs for quickspin
+s32 func_808333CC(Player* this) {
+ s8 sp3C[4];
+ s8* iter;
+ s8* iter2;
+ s8 temp1;
+ s8 temp2;
+ s32 i;
+
+ if (this->heldItemAction == PLAYER_IA_STICK) {
+ return false;
+ }
+
+ iter = &this->unk_ADF[0];
+ iter2 = &sp3C[0];
+ for (i = 0; i < 4; i++, iter++, iter2++) {
+ if ((*iter2 = *iter) < 0) {
+ return false;
+ }
+ *iter2 *= 2;
+ }
+
+ temp1 = sp3C[0] - sp3C[1];
+ if (ABS_ALT(temp1) < 10) {
+ return false;
+ }
+
+ iter2 = &sp3C[1];
+ for (i = 1; i < 3; i++, iter2++) {
+ temp2 = *iter2 - *(iter2 + 1);
+ if ((ABS_ALT(temp2) < 10) || (temp2 * temp1 < 0)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void func_808334D4(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim;
+
+ if ((this->meleeWeaponAnimation >= PLAYER_MWA_RIGHT_SLASH_1H) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_RIGHT_COMBO_2H)) {
+ anim = D_8085CF58[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ anim = D_8085CF50[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+
+ func_8082DC38(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 8.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -9.0f);
+ func_808332A0(play, this, 2 << 8, false);
+}
+
+void func_808335B0(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8084CCEC, 1);
+ func_808334D4(play, this);
+}
+
+s8 D_8085D090[] = {
+ PLAYER_MWA_STAB_1H,
+ PLAYER_MWA_RIGHT_SLASH_1H,
+ PLAYER_MWA_RIGHT_SLASH_1H,
+ PLAYER_MWA_LEFT_SLASH_1H,
+};
+
+s8 D_8085D094[][3] = {
+ { PLAYER_MWA_ZORA_PUNCH_LEFT, PLAYER_MWA_ZORA_PUNCH_COMBO, PLAYER_MWA_ZORA_PUNCH_KICK },
+ { PLAYER_MWA_GORON_PUNCH_LEFT, PLAYER_MWA_GORON_PUNCH_RIGHT, PLAYER_MWA_GORON_PUNCH_BUTT },
+};
+
+PlayerMeleeWeaponAnimation func_808335F4(Player* this) {
+ s32 temp_a1;
+ PlayerMeleeWeaponAnimation meleeWeaponAnim;
+
+ temp_a1 = this->unk_AE3[this->unk_ADE];
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_GORON)) {
+ s32 requiredScopeTemp;
+
+ // yikes
+ meleeWeaponAnim = ((this->transformation == PLAYER_FORM_ZORA) ? D_8085D094[0] : D_8085D094[1])[this->unk_ADD];
+
+ if (this->unk_ADD != 0) {
+ this->meleeWeaponAnimation = meleeWeaponAnim;
+ if (this->unk_ADD >= 2) {
+ this->unk_ADD = -1;
+ }
+ }
+ } else {
+ if (func_808333CC(this)) {
+ meleeWeaponAnim = PLAYER_MWA_SPIN_ATTACK_1H;
+ } else {
+ if (temp_a1 < 0) {
+ meleeWeaponAnim = func_8082FBE8(this) ? PLAYER_MWA_FORWARD_SLASH_1H : PLAYER_MWA_RIGHT_SLASH_1H;
+ } else {
+ meleeWeaponAnim = D_8085D090[temp_a1];
+ if (meleeWeaponAnim == PLAYER_MWA_STAB_1H) {
+ this->stateFlags2 |= PLAYER_STATE2_40000000;
+ if (!func_8082FBE8(this)) {
+ meleeWeaponAnim = PLAYER_MWA_FORWARD_SLASH_1H;
+ }
+ }
+ }
+
+ if (this->heldItemAction == PLAYER_IA_STICK) {
+ meleeWeaponAnim = PLAYER_MWA_FORWARD_SLASH_1H;
+ }
+ }
+
+ if (Player_IsHoldingTwoHandedWeapon(this)) {
+ meleeWeaponAnim++;
+ }
+ }
+ return meleeWeaponAnim;
+}
+
+void func_80833728(Player* this, s32 index, u32 dmgFlags, s32 damage) {
+ this->meleeWeaponQuads[index].info.toucher.dmgFlags = dmgFlags;
+ this->meleeWeaponQuads[index].info.toucher.damage = damage;
+
+ if (dmgFlags == DMG_DEKU_STICK) {
+ this->meleeWeaponQuads[index].info.toucherFlags = (TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_WOOD);
+ } else {
+ this->meleeWeaponQuads[index].info.toucherFlags = (TOUCH_ON | TOUCH_NEAREST);
+ }
+}
+
+MeleeWeaponDamageInfo D_8085D09C[PLAYER_MELEEWEAPON_MAX] = {
+ { DMG_GORON_PUNCH, 2, 2, 0, 0 }, // PLAYER_MELEEWEAPON_NONE
+ { DMG_SWORD, 4, 8, 1, 2 }, // PLAYER_MELEEWEAPON_SWORD_KOKIRI
+ { DMG_SWORD, 4, 8, 2, 4 }, // PLAYER_MELEEWEAPON_SWORD_RAZOR
+ { DMG_SWORD, 4, 8, 3, 6 }, // PLAYER_MELEEWEAPON_SWORD_GILDED
+ { DMG_SWORD, 4, 8, 4, 8 }, // PLAYER_MELEEWEAPON_SWORD_TWO_HANDED
+ { DMG_DEKU_STICK, 0, 0, 2, 4 }, // PLAYER_MELEEWEAPON_STICK
+ { DMG_ZORA_PUNCH, 1, 2, 0, 0 }, // PLAYER_MELEEWEAPON_ZORA_FINS
+};
+
+// New function in NE0: split out of func_80833864 to be able to call it to patch Power Crouch Stab.
+void func_8083375C(Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim) {
+ MeleeWeaponDamageInfo* dmgInfo = &D_8085D09C[0];
+ s32 damage;
+
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ // Was Kafei originally intended to be able to punch?
+ meleeWeaponAnim = PLAYER_MWA_GORON_PUNCH_LEFT;
+ this->meleeWeaponAnimation = -1;
+ } else {
+ //! @bug Quick Put Away Damage: Since 0 is also the "no weapon" value, producing a weapon quad without a weapon
+ //! in hand, such as during Quick Put Away, produced a quad with the Goron punch properties, which does 0 damage
+ //! as human.
+ dmgInfo = &D_8085D09C[(this->transformation == PLAYER_FORM_GORON) ? PLAYER_MELEEWEAPON_NONE
+ : Player_GetMeleeWeaponHeld(this)];
+ }
+
+ //! @bug Great Deku Sword: Presumably the dmgTransformed fields are intended for Fierce Deity, but also work for
+ //! Deku if it is able to equip a sword (such as with the "0th day" glitch), giving Great Fairy's Sword damage.
+ damage =
+ ((meleeWeaponAnim >= PLAYER_MWA_FLIPSLASH_START) && (meleeWeaponAnim <= PLAYER_MWA_ZORA_JUMPKICK_FINISH))
+ ? ((this->transformation == PLAYER_FORM_HUMAN) ? dmgInfo->dmgHumanStrong : dmgInfo->dmgTransformedStrong)
+ : ((this->transformation == PLAYER_FORM_HUMAN) ? dmgInfo->dmgHumanNormal : dmgInfo->dmgTransformedNormal);
+
+ func_80833728(this, 0, dmgInfo->dmgFlags, damage);
+ func_80833728(this, 1, dmgInfo->dmgFlags, damage);
+}
+
+void func_80833864(PlayState* play, Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim) {
+ func_8083375C(this, meleeWeaponAnim);
+ Player_SetAction(play, this, func_808548B8, 0);
+ this->unk_AE8 = 0;
+
+ if ((meleeWeaponAnim < PLAYER_MWA_FLIPSLASH_FINISH) || (meleeWeaponAnim > PLAYER_MWA_ZORA_JUMPKICK_FINISH)) {
+ func_8082DC38(this);
+ }
+
+ // Accumulate consecutive slashes to do the "third slash" types
+ if ((meleeWeaponAnim != this->meleeWeaponAnimation) || (this->unk_ADD >= 3)) {
+ this->unk_ADD = 0;
+ }
+
+ this->unk_ADD++;
+ if (this->unk_ADD >= 3) {
+ meleeWeaponAnim += 2;
+ }
+
+ this->meleeWeaponAnimation = meleeWeaponAnim;
+ func_8082DB90(play, this, sMeleeAttackAnimInfo[meleeWeaponAnim].unk_0);
+ this->unk_ADC = this->skelAnime.animLength + 4.0f;
+
+ if ((meleeWeaponAnim < PLAYER_MWA_FLIPSLASH_START) || (meleeWeaponAnim > PLAYER_MWA_ZORA_JUMPKICK_START)) {
+ func_8082E920(play, this, (ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE));
+ }
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80833998(Player* this, s32 invincibilityTimer) {
+ if (this->invincibilityTimer >= 0) {
+ this->invincibilityTimer = invincibilityTimer;
+ this->unk_B5F = 0;
+ }
+}
+
+void func_808339B4(Player* this, s32 invincibilityTimer) {
+ if (this->invincibilityTimer > invincibilityTimer) {
+ this->invincibilityTimer = invincibilityTimer;
+ }
+ this->unk_B5F = 0;
+}
+
+// Player_InflictDamageImpl?
+s32 func_808339D4(PlayState* play, Player* this, s32 damage) {
+ if ((this->invincibilityTimer != 0) || (this->stateFlags3 & PLAYER_STATE3_400000) ||
+ (this->actor.id != ACTOR_PLAYER)) {
+ return 1;
+ }
+
+ if (this->actor.category != ACTORCAT_PLAYER) {
+ this->actor.colChkInfo.damage = -damage;
+ return Actor_ApplyDamage(&this->actor);
+ }
+
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ damage >>= 2;
+ }
+
+ return Health_ChangeBy(play, damage);
+}
+
+void func_80833A64(Player* this) {
+ this->skelAnime.prevTransl = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1];
+ func_8082E820(this, 1 | ANIM_FLAG_UPDATE_Y);
+}
+
+void func_80833AA0(Player* this, PlayState* play) {
+ if (Player_SetAction(play, this, func_8084C16C, 0)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ this->unk_AE8 = 1;
+ }
+ if (this->unk_AA5 != PLAYER_UNKAA5_4) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+}
+
+// TODO: this can be one array, but should it be?
+PlayerAnimationHeader* D_8085D0D4[] = {
+ &gPlayerAnim_link_normal_front_shit,
+ &gPlayerAnim_link_normal_front_shitR,
+ &gPlayerAnim_link_normal_back_shit,
+ &gPlayerAnim_link_normal_back_shitR,
+ // };
+ // PlayerAnimationHeader* D_8085D0E4[] = {
+ &gPlayerAnim_link_normal_front_hit,
+ &gPlayerAnim_link_anchor_front_hitR,
+ &gPlayerAnim_link_normal_back_hit,
+ &gPlayerAnim_link_anchor_back_hitR,
+};
+
+void func_80833B18(PlayState* play, Player* this, s32 arg2, f32 speed, f32 velocityY, s16 arg5,
+ s32 invincibilityTimer) {
+ PlayerAnimationHeader* anim = NULL;
+
+ if (this->stateFlags1 & PLAYER_STATE1_2000) {
+ func_80833A64(this);
+ }
+
+ this->unk_B64 = 0;
+
+ Player_PlaySfx(this, NA_SE_PL_DAMAGE);
+
+ if (func_808339D4(play, this, -this->actor.colChkInfo.damage) == 0) {
+ this->stateFlags2 &= ~PLAYER_STATE2_80;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ return;
+ }
+ }
+
+ if (this->actor.colChkInfo.damage != 0) {
+ func_80833998(this, invincibilityTimer);
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ return;
+ }
+
+ if (arg2 == 3) {
+ Player_SetAction(play, this, func_808546D0, 0);
+ anim = &gPlayerAnim_link_normal_ice_down;
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+
+ Player_RequestRumble(play, this, 255, 10, 40, SQ(0));
+
+ Player_PlaySfx(this, NA_SE_PL_FREEZE_S);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FREEZE);
+ } else if (arg2 == 4) {
+ Player_SetAction(play, this, func_80854800, 0);
+ func_8082DB60(play, this, &gPlayerAnim_link_normal_electric_shock);
+ func_8082DAD4(this);
+
+ this->unk_AE8 = 20;
+ this->actor.velocity.y = 0.0f;
+
+ Player_RequestRumble(play, this, 255, 80, 150, SQ(0));
+ } else {
+ arg5 -= this->actor.shape.rot.y;
+
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ Player_SetAction(play, this, func_80851B58, 0);
+ Player_RequestRumble(play, this, 180, 20, 50, SQ(0));
+
+ if (arg2 == 1) {
+ this->linearVelocity = speed * 1.5f;
+ this->actor.velocity.y = velocityY * 0.7f;
+ } else {
+ this->linearVelocity = 4.0f;
+ this->actor.velocity.y = 0.0f;
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ anim = &gPlayerAnim_link_swimer_swim_hit;
+ } else if ((arg2 == 1) || (arg2 == 2) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 &
+ (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000))) {
+ Player_SetAction(play, this, func_8084BC64, 0);
+
+ this->stateFlags3 |= PLAYER_STATE3_2;
+
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ func_8082DAD4(this);
+
+ if (arg2 == 2) {
+ this->unk_AE8 = 4;
+
+ this->actor.speed = 3.0f;
+ this->linearVelocity = 3.0f;
+ this->actor.velocity.y = 6.0f;
+
+ func_8082E5A8(play, this, D_8085BE84[PLAYER_ANIMGROUP_3][this->modelAnimType]);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ } else {
+ this->actor.speed = speed;
+ this->linearVelocity = speed;
+ this->actor.velocity.y = velocityY;
+
+ if (ABS_ALT(arg5) > 0x4000) {
+ anim = &gPlayerAnim_link_normal_front_downA;
+ } else {
+ anim = &gPlayerAnim_link_normal_back_downA;
+ }
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_L);
+ }
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ } else if ((this->linearVelocity > 4.0f) && !func_80123420(this)) {
+ this->unk_B64 = 20;
+
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+
+ return;
+ } else {
+ PlayerAnimationHeader** animPtr = D_8085D0D4;
+
+ Player_SetAction(play, this, func_8084BBF0, 0);
+ func_8082FC60(this);
+
+ if (this->actor.colChkInfo.damage < 5) {
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ } else {
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = 23.0f;
+
+ animPtr += 4;
+ }
+
+ if (ABS_ALT(arg5) <= 0x4000) {
+ animPtr += 2;
+ }
+
+ if (func_80123420(this)) {
+ animPtr++;
+ }
+
+ anim = *animPtr;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+
+ this->actor.shape.rot.y += arg5;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (ABS_ALT(arg5) > 0x4000) {
+ this->actor.shape.rot.y += 0x8000;
+ }
+ }
+
+ func_8082DE50(play, this);
+
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+
+ if (anim != NULL) {
+ func_8082DB90(play, this, anim);
+ }
+}
+
+s32 func_808340AC(FloorType floorType) {
+ s32 temp_v0 = floorType - FLOOR_TYPE_2;
+
+ if ((temp_v0 >= FLOOR_TYPE_2 - FLOOR_TYPE_2) && (temp_v0 <= FLOOR_TYPE_3 - FLOOR_TYPE_2)) {
+ return temp_v0;
+ }
+ return -1;
+}
+
+s32 func_808340D4(FloorType floorType) {
+ return (floorType == FLOOR_TYPE_4) || (floorType == FLOOR_TYPE_7) || (floorType == FLOOR_TYPE_12);
+}
+
+void func_80834104(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8085421C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000 | PLAYER_STATE1_80000000;
+}
+
+void func_80834140(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_80)) {
+ func_80834104(play, this);
+ if (func_8082DA90(play)) {
+ this->unk_AE8 = -30;
+ }
+ this->stateFlags1 |= PLAYER_STATE1_80;
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, 84.0f, ANIMMODE_ONCE, -6.0f);
+ this->unk_AE7 = 1;
+ this->linearVelocity = 0.0f;
+ }
+}
+
+s32 func_808341F4(PlayState* play, Player* this) {
+ f32 temp_fv0;
+ f32 flameScale;
+ f32 flameIntensity;
+ s32 i;
+ s32 timerStep;
+ s32 spawnedFlame = false;
+ s32 var_v0;
+ s32 var_v1;
+ u8* timerPtr = this->flameTimers;
+
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_DEKU)) {
+ timerStep = 0;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->cylinder.base.ocFlags1 & OC1_HIT) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ this->linearVelocity = 0.0f;
+ }
+ func_80834140(play, this, &gPlayerAnim_link_derth_rebirth);
+ }
+ } else {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ var_v1 = 20;
+ } else {
+ var_v1 = (s32)(this->linearVelocity * 0.4f) + 1;
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_8) {
+ var_v0 = 100;
+ } else {
+ var_v0 = 0;
+ }
+
+ timerStep = var_v0 + var_v1;
+ }
+
+ for (i = 0; i < PLAYER_BODYPART_MAX; i++, timerPtr++) {
+ if (*timerPtr <= timerStep) {
+ *timerPtr = 0;
+ } else {
+ spawnedFlame = true;
+ *timerPtr -= timerStep;
+ if (*timerPtr > 20.0f) {
+ temp_fv0 = (*timerPtr - 20.0f) * 0.01f;
+ flameScale = CLAMP(temp_fv0, 0.19999999f, 0.2f);
+ } else {
+ flameScale = *timerPtr * 0.01f;
+ }
+
+ flameIntensity = (*timerPtr - 25.0f) * 0.02f;
+ flameIntensity = CLAMP(flameIntensity, 0.0f, 1.0f);
+ EffectSsFireTail_SpawnFlameOnPlayer(play, flameScale, i, flameIntensity);
+ }
+ }
+
+ if (spawnedFlame) {
+ Player_PlaySfx(this, NA_SE_EV_TORCH - SFX_FLAG);
+ if ((play->gameplayFrames % 4) == 0) {
+ Player_InflictDamage(play, -1);
+ }
+ } else {
+ this->isBurning = false;
+ }
+
+ return this->stateFlags1 & PLAYER_STATE1_80;
+}
+
+s32 func_808344C0(PlayState* play, Player* this) {
+ s32 i = 0;
+
+ while (i < ARRAY_COUNT(this->flameTimers)) {
+ this->flameTimers[i] = Rand_S16Offset(0, 200);
+ i++;
+ }
+
+ this->isBurning = true;
+ return func_808341F4(play, this);
+}
+
+s32 func_80834534(PlayState* play, Player* this) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_L);
+ return func_808344C0(play, this);
+}
+
+s32 func_8083456C(PlayState* play, Player* this) {
+ if (this->actor.colChkInfo.acHitEffect == 1) {
+ return func_80834534(play, this);
+ }
+ return false;
+}
+
+void func_808345A8(Player* this) {
+ if ((this->invincibilityTimer > 0) && (this->invincibilityTimer < 20)) {
+ this->invincibilityTimer = 20;
+ }
+}
+
+void func_808345C8(void) {
+ if (INV_CONTENT(ITEM_MASK_DEKU) == ITEM_MASK_DEKU) {
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+}
+
+s32 func_80834600(Player* this, PlayState* play) {
+ s32 pad74;
+ s32 var_v0;
+
+ if (this->unk_D6A != 0) {
+ if (!Player_InBlockingCsMode(play, this)) {
+ Player_InflictDamage(play, -16);
+ this->unk_D6A = 0;
+ }
+ } else if ((var_v0 = ((Player_GetHeight(this) - 8.0f) < (this->unk_AB8 * this->actor.scale.y))) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_CRUSHED) || (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ (this->stateFlags2 & PLAYER_STATE2_80000000)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+
+ if (var_v0) {
+ func_80169FDC(&play->state);
+ func_808345C8();
+ Scene_SetExitFade(play);
+ } else {
+ func_80169EFC(&play->state);
+ func_808345C8();
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_TAKEN_AWAY);
+ play->haltAllActors = true;
+ play_sound(NA_SE_OC_ABYSS);
+ } else if ((this->unk_B75 != 0) && ((this->unk_B75 >= 3) || (this->invincibilityTimer == 0))) {
+ u8 sp6C[] = { 0, 2, 1, 1 };
+
+ if (!func_8083456C(play, this)) {
+ if (this->unk_B75 == 4) {
+ this->shockTimer = 40;
+ }
+
+ this->actor.colChkInfo.damage += this->unk_B74;
+ func_80833B18(play, this, sp6C[this->unk_B75 - 1], this->unk_B78, this->unk_B7C, this->unk_B76, 20);
+ }
+ } else if ((this->shieldQuad.base.acFlags & AC_BOUNCED) || (this->shieldCylinder.base.acFlags & AC_BOUNCED) ||
+ ((this->invincibilityTimer < 0) && (this->cylinder.base.acFlags & AC_HIT) &&
+ (this->cylinder.info.acHitInfo != NULL) &&
+ (this->cylinder.info.acHitInfo->toucher.dmgFlags != DMG_UNBLOCKABLE))) {
+ PlayerAnimationHeader* var_a2;
+ s32 sp64;
+
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ if ((this->invincibilityTimer >= 0) && !Player_IsGoronOrDeku(this)) {
+ sp64 = (func_8084B5C0 == this->actionFunc);
+ if (!func_801242B4(this)) {
+ Player_SetAction(play, this, func_8084BAA4, 0);
+ }
+
+ this->unk_AE7 = sp64;
+ if ((s8)sp64 == 0) {
+ func_8082F43C(play, this, func_80848A0C);
+ var_a2 = (this->unk_B40 < 0.5f) ? D_8085CFD4[Player_IsHoldingTwoHandedWeapon(this)]
+ : D_8085CFCC[Player_IsHoldingTwoHandedWeapon(this)];
+ PlayerAnimation_PlayOnce(play, &this->unk_284, var_a2);
+ } else {
+ Player_AnimationPlayOnce(play, this, D_8085CFDC[Player_IsHoldingTwoHandedWeapon(this)]);
+ }
+ }
+
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000))) {
+ this->linearVelocity = -18.0f;
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+
+ return false;
+ } else if ((this->unk_D6B != 0) || (this->invincibilityTimer > 0) || (this->stateFlags1 & PLAYER_STATE1_4000000) ||
+ (this->csMode != PLAYER_CSMODE_0) || (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) ||
+ (this->meleeWeaponQuads[1].base.atFlags & AT_HIT) || (this->cylinder.base.atFlags & AT_HIT) ||
+ (this->shieldCylinder.base.atFlags & AT_HIT)) {
+ return false;
+ } else if (this->cylinder.base.acFlags & AC_HIT) {
+ Actor* sp60 = this->cylinder.base.ac;
+ s32 var_a2_2;
+
+ if (sp60->flags & ACTOR_FLAG_1000000) {
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+ }
+
+ if (this->actor.colChkInfo.acHitEffect == 2) {
+ var_a2_2 = 3;
+ } else if (this->actor.colChkInfo.acHitEffect == 3) {
+ var_a2_2 = 4;
+ } else if (this->actor.colChkInfo.acHitEffect == 7) {
+ var_a2_2 = 1;
+ this->shockTimer = 40;
+ } else if (this->actor.colChkInfo.acHitEffect == 9) {
+ var_a2_2 = 1;
+ if (func_80834534(play, this)) {
+ return true;
+ }
+
+ } else if (((this->actor.colChkInfo.acHitEffect == 4) && (this->currentMask != PLAYER_MASK_GIANT)) ||
+ (this->stateFlags3 & PLAYER_STATE3_1000)) {
+ var_a2_2 = 1;
+ } else {
+ var_a2_2 = 0;
+ if (func_8083456C(play, this)) {
+ return true;
+ }
+ }
+ func_80833B18(play, this, var_a2_2, 4.0f, 5.0f, Actor_WorldYawTowardActor(sp60, &this->actor), 20);
+ } else if (this->invincibilityTimer != 0) {
+ return false;
+ } else {
+ s32 sp58 = func_808340AC(sPlayerCurrentFloorType);
+ u32 sp54 = SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ s32 var_a1 = 0;
+ s32 var_v1_2;
+ s32 pad48;
+
+ if ((sp58 < 0) ||
+ ((sp54 == 0) && (this->transformation == PLAYER_FORM_GORON) && !(this->actor.depthInWater > 0.0f))) {
+ var_a1 = (this->actor.wallPoly != NULL) &&
+ SurfaceType_IsWallDamage(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId);
+ if (var_a1 == 0) {
+ //! FAKE?
+ goto label;
+ }
+ }
+ var_v1_2 = (var_a1 != 0) ? this->actor.wallBgId : this->actor.floorBgId;
+ if (((this->transformation == PLAYER_FORM_DEKU) || (this->transformation == PLAYER_FORM_ZORA)) &&
+ ((sp58 >= 0) && (sp54 == 0) && !(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.depthInWater < -30.0f))) {
+ func_80834534(play, this);
+ } else {
+ this->actor.colChkInfo.damage = 4;
+ func_80833B18(play, this, (var_v1_2 == BGCHECK_SCENE) ? 0 : 1, 4.0f, 5.0f,
+ (var_a1 != 0) ? this->actor.wallYaw : this->actor.shape.rot.y, 20);
+ return true;
+ }
+ }
+
+ //! FAKE?
+ if (0) {
+ label:
+ return false;
+ }
+
+ return true;
+}
+
+void func_80834CD0(Player* this, f32 arg1, u16 sfxId) {
+ this->actor.velocity.y = arg1 * D_8085C3E4;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+
+ if (sfxId != NA_SE_NONE) {
+ Player_AnimSfx_PlayFloorJump(this);
+ Player_AnimSfx_PlayVoice(this, sfxId);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_40000;
+ this->fallStartHeight = this->actor.world.pos.y;
+}
+
+void func_80834D50(PlayState* play, Player* this, PlayerAnimationHeader* anim, f32 speed, u16 sfxId) {
+ Player_SetAction(play, this, func_8084C16C, 1);
+ if (anim != NULL) {
+ func_8082DB90(play, this, anim);
+ }
+ func_80834CD0(this, speed, sfxId);
+}
+
+void func_80834DB8(Player* this, PlayerAnimationHeader* anim, f32 speed, PlayState* play) {
+ func_80834D50(play, this, anim, speed, NA_SE_VO_LI_SWORD_N);
+}
+
+s32 func_80834DFC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || func_801242B4(this) || (this->unk_B5C < 4)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_800) && (this->unk_B5C >= 2) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->wallHeight < this->ageProperties->unk_14))) {
+ s32 var_v1 = false;
+ PlayerAnimationHeader* anim;
+ f32 wallHeight;
+
+ if (func_801242B4(this)) {
+ f32 depth = (this->transformation == PLAYER_FORM_FIERCE_DEITY) ? 80.0f : 50.0f;
+
+ if (this->actor.depthInWater < depth) {
+ if ((this->unk_B5C < 2) || (this->ageProperties->unk_10 < this->wallHeight)) {
+ return false;
+ }
+ } else if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) || (this->unk_B5C >= 3)) {
+ return false;
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ ((this->ageProperties->unk_14 <= this->wallHeight) && (this->stateFlags1 & PLAYER_STATE1_8000000))) {
+ return false;
+ }
+
+ if ((this->actor.wallBgId != BGCHECK_SCENE) && (sPlayerCurrentWallFlags & WALL_FLAG_6)) {
+ if (this->unk_B5D >= 6) {
+ this->stateFlags2 |= PLAYER_STATE2_4;
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ var_v1 = true;
+ }
+ }
+ } else if ((this->unk_B5D >= 6) || CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ var_v1 = true;
+ }
+
+ if (var_v1) {
+ Player_SetAction(play, this, func_8084D4EC, 0);
+ wallHeight = this->wallHeight;
+
+ if (this->ageProperties->unk_14 <= wallHeight) {
+ anim = &gPlayerAnim_link_normal_250jump_start;
+ this->linearVelocity = 1.0f;
+ } else {
+ CollisionPoly* poly;
+ s32 bgId;
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.z);
+ f32 var_fv1 = this->wallDistance + 0.5f; // wallDistance
+ f32 yIntersect;
+ s32 pad;
+
+ this->stateFlags1 |= PLAYER_STATE1_4;
+
+ if (func_801242B4(this)) {
+ wallHeight -= 60.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_swimer_swim_15step_up;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ } else if (this->ageProperties->unk_18 <= wallHeight) {
+ wallHeight -= 59.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_normal_150step_up;
+ } else {
+ wallHeight -= 41.0f * this->ageProperties->unk_08;
+ anim = &gPlayerAnim_link_normal_100step_up;
+ }
+
+ this->unk_ABC -= wallHeight * 100.0f;
+
+ this->actor.world.pos.x -= var_fv1 * wallPolyNormalX;
+ this->actor.world.pos.y += this->wallHeight + 10.0f;
+ this->actor.world.pos.z -= var_fv1 * wallPolyNormalZ;
+
+ yIntersect =
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &this->actor.world.pos);
+ if ((this->actor.world.pos.y - yIntersect) <= 20.0f) {
+ this->actor.world.pos.y = yIntersect;
+ if (bgId != BGCHECK_SCENE) {
+ DynaPoly_SetPlayerOnTop(&play->colCtx, bgId);
+ }
+ }
+
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+ }
+
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f);
+ AnimationContext_DisableQueue(play);
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+ return true;
+ }
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->unk_B5C == 1) && (this->unk_B5D >= 3)) {
+ f32 temp = (this->wallHeight * 0.08f) + 5.5f;
+
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, temp, play);
+ this->linearVelocity = 2.5f;
+ return true;
+ }
+
+ return false;
+}
+
+void func_80835324(PlayState* play, Player* this, f32 arg2, s16 arg3) {
+ Player_SetAction(play, this, func_8084D820, 0);
+ func_8082DD2C(play, this);
+
+ this->csId = CS_ID_NONE;
+ this->unk_AE7 = 1;
+ this->unk_AE8 = 1;
+
+ this->unk_3A0.x = Math_SinS(arg3) * arg2 + this->actor.world.pos.x;
+ this->unk_3A0.z = Math_CosS(arg3) * arg2 + this->actor.world.pos.z;
+
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+}
+
+void func_808353DC(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_808508C8, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+}
+
+s32 func_80835428(PlayState* play, Player* this) {
+ if (!func_8082DA90(play) && (this->stateFlags1 & PLAYER_STATE1_80000000)) {
+ func_80834104(play, this);
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FALL_S);
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * The actual entrances each "return entrance" value can map to.
+ * This is used by scenes that are shared between locations.
+ *
+ * This 1D array is split into groups of entrances.
+ * The start of each group is indexed by `sReturnEntranceGroupIndices` values.
+ * The resulting groups are then indexed by the spawn value.
+ *
+ * The spawn value (`PlayState.curSpawn`) is set to a different value depending on the entrance used to enter the
+ * scene, which allows these dynamic "return entrances" to link back to the previous scene.
+ *
+ * Seems unused in MM
+ */
+u16 sReturnEntranceGroupData[] = {
+ // 0xFE00
+ /* 0 */ 0x1000,
+};
+
+/**
+ * The values are indices into `sReturnEntranceGroupData` marking the start of each group
+ */
+u8 sReturnEntranceGroupIndices[] = {
+ 0, // 0xFE00
+};
+
+// subfunction of OoT's func_80839034
+void func_808354A4(PlayState* play, s32 arg1, s32 arg2) {
+ play->nextEntrance = play->setupExitList[arg1];
+
+ if (play->nextEntrance == 0xFFFF) {
+ gSaveContext.respawnFlag = 4;
+ play->nextEntrance = gSaveContext.respawn[RESPAWN_MODE_UNK_3].entrance;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ } else if (play->nextEntrance >= 0xFE00) {
+ play->nextEntrance =
+ sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntrance - 0xFE00] + play->curSpawn];
+
+ Scene_SetExitFade(play);
+ } else {
+ if (arg2) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = play->nextEntrance;
+ func_80169EFC(&play->state);
+ gSaveContext.respawnFlag = -2;
+ }
+
+ gSaveContext.retainWeatherMode = 1;
+ Scene_SetExitFade(play);
+ }
+
+ play->transitionTrigger = TRANS_TRIGGER_START;
+}
+
+void func_808355D8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_80833AA0(this, play);
+ this->unk_AE8 = -2;
+ func_8082E5EC(play, this, anim);
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_CLOSE);
+}
+
+// related to grottos (?)
+s32 func_8083562C(PlayState* play, Player* this, CollisionPoly* poly, s32 bgId) {
+ s32 var_a3;
+ FloorType floorType;
+ s32 sp34;
+ s32 sp30;
+
+ if ((this == GET_PLAYER(play)) && !(this->stateFlags1 & PLAYER_STATE1_80) && !func_8082DA90(play) &&
+ (this->csMode == PLAYER_CSMODE_0) && !(this->stateFlags1 & PLAYER_STATE1_1)) {
+ var_a3 = 0;
+ if (((poly != NULL) && (var_a3 = SurfaceType_GetSceneExitIndex(&play->colCtx, poly, bgId), (var_a3 != 0)) &&
+ (((play->sceneId != SCENE_GORONRACE) && (play->sceneId != SCENE_DEKU_KING)) || (var_a3 < 3)) &&
+ (((play->sceneId != SCENE_20SICHITAI) && (play->sceneId != SCENE_20SICHITAI2)) || (var_a3 < 0x15)) &&
+ ((play->sceneId != SCENE_11GORONNOSATO) || (var_a3 < 6))) ||
+ (func_808340D4(sPlayerCurrentFloorType) && (this->floorProperty == FLOOR_PROPERTY_12))) {
+ sp34 = this->unk_D68 - (s32)this->actor.world.pos.y;
+ if (!(this->stateFlags1 & (PLAYER_STATE1_800000 | PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (sp34 < 400) && (D_80862B18 > 100.0f)) {
+ if ((this->floorProperty != FLOOR_PROPERTY_5) && (this->floorProperty != FLOOR_PROPERTY_12)) {
+ this->linearVelocity = 0.0f;
+ }
+
+ return false;
+ } else {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ }
+
+ if (var_a3 == 0) {
+ func_80169EFC(&play->state);
+ Scene_SetExitFade(play);
+ } else {
+ func_808354A4(play, var_a3 - 1,
+ SurfaceType_GetFloorEffect(&play->colCtx, poly, bgId) == FLOOR_EFFECT_2);
+ if ((this->stateFlags1 & PLAYER_STATE1_8000000) && (this->floorProperty == FLOOR_PROPERTY_5)) {
+ func_8019F128(NA_SE_OC_TUNAMI);
+ func_801A4058(5);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->floorProperty == FLOOR_PROPERTY_12)) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ if (D_801BDAA0) {
+ D_801BDAA0 = false;
+ } else {
+ gHorseIsMounted = true;
+ }
+ }
+ }
+
+ if (!(this->stateFlags1 & (PLAYER_STATE1_800000 | PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ ((floorType = SurfaceType_GetFloorType(&play->colCtx, poly, bgId)) != FLOOR_TYPE_10) &&
+ ((sp34 < 100) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (floorType == FLOOR_TYPE_11) {
+ func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
+ func_801A4058(5);
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ } else {
+ func_8085B74C(play);
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_StopHorizontalMovement(this);
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_SCENE0);
+ this->stateFlags1 |= PLAYER_STATE1_1 | PLAYER_STATE1_20000000;
+ return true;
+ }
+ } else {
+ if ((this->stateFlags1 & PLAYER_STATE1_8000000) && (this->actor.floorPoly == NULL)) {
+ BgCheck_EntityRaycastFloor7(&play->colCtx, &this->actor.floorPoly, &sp30, &this->actor,
+ &this->actor.world.pos);
+ if (this->actor.floorPoly == NULL) {
+ func_80169EFC(&play->state);
+ return false;
+ }
+ //! FAKE
+ if (1) {}
+ }
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_80000000)) {
+ if (((this->actor.world.pos.y < -4000.0f) ||
+ (((this->floorProperty == FLOOR_PROPERTY_5) || (this->floorProperty == FLOOR_PROPERTY_12) ||
+ (this->floorProperty == FLOOR_PROPERTY_13)) &&
+ ((D_80862B18 < 100.0f) || (this->fallDistance > 400))))) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->floorProperty == FLOOR_PROPERTY_5) {
+ func_80169FDC(&play->state);
+ func_808345C8();
+ } else {
+ func_80169EFC(&play->state);
+ }
+ if (!SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ gSaveContext.respawnFlag = -5;
+ }
+
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ play_sound(NA_SE_OC_ABYSS);
+ } else {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ }
+
+ if (this->floorProperty == FLOOR_PROPERTY_13) {
+ Player_SetAction(play, this, func_808497A0, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else {
+ func_80834104(play, this);
+ this->unk_AE8 = 9999;
+ if (this->floorProperty == FLOOR_PROPERTY_5) {
+ this->unk_AE7 = -1;
+ } else {
+ this->unk_AE7 = 1;
+ }
+ }
+ }
+ }
+ }
+
+ this->unk_D68 = this->actor.world.pos.y;
+ }
+ }
+
+ return false;
+}
+
+void Player_TranslateAndRotateY(Player* this, Vec3f* translation, Vec3f* src, Vec3f* dst) {
+ Lib_Vec3f_TranslateAndRotateY(translation, this->actor.shape.rot.y, src, dst);
+}
+
+// Player_GetPosInACertainDirectionFromARadiusAway
+void func_80835BF8(Vec3f* srcPos, s16 rotY, f32 radius, Vec3f* dstPos) {
+ dstPos->x = Math_SinS(rotY) * radius + srcPos->x;
+ dstPos->z = Math_CosS(rotY) * radius + srcPos->z;
+}
+
+Actor* Player_SpawnFairy(PlayState* play, Player* this, Vec3f* translation, Vec3f* arg3, s32 elfParams) {
+ Vec3f pos;
+
+ Player_TranslateAndRotateY(this, translation, arg3, &pos);
+
+ return Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, pos.x, pos.y, pos.z, 0, 0, 0, elfParams);
+}
+
+f32 func_80835CD8(PlayState* play, Player* this, Vec3f* arg2, Vec3f* pos, CollisionPoly** outPoly, s32* outBgId) {
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, arg2, pos);
+ return BgCheck_EntityRaycastFloor5(&play->colCtx, outPoly, outBgId, &this->actor, pos);
+}
+
+f32 func_80835D2C(PlayState* play, Player* this, Vec3f* arg2, Vec3f* pos) {
+ CollisionPoly* poly;
+ s32 bgId;
+
+ return func_80835CD8(play, this, arg2, pos, &poly, &bgId);
+}
+
+s32 func_80835D58(PlayState* play, Player* this, Vec3f* arg2, CollisionPoly** outPoly, s32* bgId, Vec3f* posResult) {
+ Vec3f posA;
+ Vec3f posB;
+
+ posA.x = this->actor.world.pos.x;
+ posA.y = this->actor.world.pos.y + arg2->y;
+ posA.z = this->actor.world.pos.z;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, arg2, &posB);
+
+ return BgCheck_EntityLineTest2(&play->colCtx, &posA, &posB, posResult, outPoly, true, false, false, true, bgId,
+ &this->actor);
+}
+
+Vec3f D_8085D100 = { 0.0f, 50.0f, 0.0f };
+
+s32 func_80835DF8(PlayState* play, Player* this, CollisionPoly** outPoly, s32* outBgId) {
+ Vec3f pos;
+ f32 yIntersect = func_80835CD8(play, this, &D_8085D100, &pos, outPoly, outBgId);
+
+ if ((*outBgId == BGCHECK_SCENE) && (fabsf(this->actor.world.pos.y - yIntersect) < 10.0f)) {
+ func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, *outPoly, *outBgId));
+ return true;
+ }
+ return false;
+}
+
+/**
+ * PLAYER_DOORTYPE_STAIRCASE: DoorSpiral
+ */
+void Player_Door_Staircase(PlayState* play, Player* this, Actor* door) {
+ static Vec3f D_8085D10C = { 20.0f, 0.0f, 20.0f };
+ DoorSpiral* doorStaircase = (DoorSpiral*)door;
+
+ this->currentYaw = doorStaircase->actor.home.rot.y + 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ }
+ func_80835324(play, this, 50.0f, this->actor.shape.rot.y);
+
+ this->unk_397 = this->doorType;
+ this->unk_AE7 = 0;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ func_80835BF8(&doorStaircase->actor.world.pos, doorStaircase->actor.shape.rot.y, -140.0f, &this->unk_3A0);
+
+ D_8085D10C.x = (this->doorDirection != 0) ? -400.0f : 400.0f;
+ D_8085D10C.z = 200.0f;
+ Player_TranslateAndRotateY(this, &this->unk_3A0, &D_8085D10C, &this->unk_3AC);
+
+ doorStaircase->shouldClimb = true;
+
+ func_8082DAD4(this);
+
+ if (this->doorTimer != 0) {
+ this->unk_AE8 = 0;
+ func_8082E438(play, this, func_8082ED20(this));
+ this->skelAnime.endFrame = 0.0f;
+ } else {
+ this->linearVelocity = 0.1f;
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_SCENE0);
+ this->doorBgCamIndex =
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorStaircase->actor)].sides[0].bgCamIndex;
+ Actor_DeactivateLens(play);
+ this->floorSfxOffset = NA_SE_PL_WALK_CONCRETE - SFX_FLAG;
+}
+
+/**
+ * PLAYER_DOORTYPE_SLIDING: DoorShutter, BgOpenShutter
+ */
+void Player_Door_Sliding(PlayState* play, Player* this, Actor* door) {
+ SlidingDoorActor* doorSliding = (SlidingDoorActor*)door;
+ Vec3f sp38;
+
+ this->currentYaw = doorSliding->dyna.actor.home.rot.y;
+ if (this->doorDirection > 0) {
+ this->currentYaw -= 0x8000;
+ }
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ }
+
+ func_80835324(play, this, 50.0f, this->actor.shape.rot.y);
+ this->unk_AE7 = 0;
+ this->unk_397 = this->doorType;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ Actor_OffsetOfPointInActorCoords(&doorSliding->dyna.actor, &sp38, &this->actor.world.pos);
+
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y,
+ (42.0f - fabsf(sp38.z)) * this->doorDirection, &this->actor.world.pos);
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y, this->doorDirection * 20.0f,
+ &this->unk_3A0);
+ func_80835BF8(&this->actor.world.pos, doorSliding->dyna.actor.shape.rot.y, this->doorDirection * -120.0f,
+ &this->unk_3AC);
+
+ doorSliding->unk_15C = 1;
+ func_8082DAD4(this);
+
+ if (this->doorTimer != 0) {
+ this->unk_AE8 = 0;
+ func_8082E438(play, this, func_8082ED20(this));
+ this->skelAnime.endFrame = 0.0f;
+ } else {
+ this->linearVelocity = 0.1f;
+ }
+
+ if (doorSliding->dyna.actor.category == ACTORCAT_DOOR) {
+ this->doorBgCamIndex = play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorSliding->dyna.actor)]
+ .sides[this->doorDirection > 0 ? 0 : 1]
+ .bgCamIndex;
+ Actor_DeactivateLens(play);
+ }
+}
+
+// sPlayerOpenDoorLeftAnimPerForm
+PlayerAnimationHeader* D_8085D118[] = {
+ &gPlayerAnim_pg_doorA_open, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_doorA_open, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_doorA_open, // PLAYER_FORM_DEKU
+};
+// sPlayerOpenDoorRightAnimPerForm
+PlayerAnimationHeader* D_8085D124[] = {
+ &gPlayerAnim_pg_doorB_open, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_doorB_open, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_doorB_open, // PLAYER_FORM_DEKU
+};
+
+/**
+ * PLAYER_DOORTYPE_TALKING: EnDoorEtc
+ * PLAYER_DOORTYPE_HANDLE: EnDoor
+ * PLAYER_DOORTYPE_FAKE:
+ * PLAYER_DOORTYPE_PROXIMITY: EnDoor
+ */
+void Player_Door_Knob(PlayState* play, Player* this, Actor* door) {
+ s32 temp = this->transformation - 1;
+ PlayerAnimationHeader* anim;
+ f32 temp_fv0; // sp5C
+ KnobDoorActor* doorHandle = (KnobDoorActor*)door;
+
+ doorHandle->animIndex = this->transformation;
+
+ if (this->doorDirection < 0) {
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_8][this->modelAnimType];
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_9][this->modelAnimType];
+ } else {
+ anim = D_8085D118[temp];
+ }
+ } else {
+ doorHandle->animIndex += 5;
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_10][this->modelAnimType];
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_11][this->modelAnimType];
+ } else {
+ anim = D_8085D124[temp];
+ }
+ }
+
+ Player_SetAction(play, this, func_8084E034, 0);
+ this->stateFlags2 |= PLAYER_STATE2_800000;
+ func_8082DE14(play, this);
+ if (this->doorDirection < 0) {
+ this->actor.shape.rot.y = doorHandle->dyna.actor.shape.rot.y;
+ } else {
+ this->actor.shape.rot.y = doorHandle->dyna.actor.shape.rot.y - 0x8000;
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+ temp_fv0 = this->doorDirection * 22.0f;
+ func_80835BF8(&doorHandle->dyna.actor.world.pos, doorHandle->dyna.actor.shape.rot.y, temp_fv0,
+ &this->actor.world.pos);
+ func_8082EC9C(play, this, anim);
+
+ if (this->doorTimer != 0) {
+ this->skelAnime.endFrame = 0.0f;
+ }
+
+ func_8082DAD4(this);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_80 | ANIM_FLAG_200);
+ doorHandle->playOpenAnim = true;
+ if (this->doorType != PLAYER_DOORTYPE_FAKE) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ s32 enDoorType = ENDOOR_GET_TYPE(&doorHandle->dyna.actor);
+
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ Actor_DeactivateLens(play);
+ func_80835BF8(&doorHandle->dyna.actor.world.pos, doorHandle->dyna.actor.shape.rot.y, -temp_fv0, &pos);
+ pos.y = doorHandle->dyna.actor.world.pos.y + 10.0f;
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos);
+
+ if (func_8083562C(play, this, poly, BGCHECK_SCENE)) {
+ gSaveContext.entranceSpeed = 2.0f;
+ } else if (enDoorType != ENDOOR_TYPE_7) {
+ Camera* mainCam;
+
+ this->unk_AE7 = 38.0f * D_8085C3E8;
+ mainCam = Play_GetCamera(play, CAM_ID_MAIN);
+
+ Camera_ChangeDoorCam(mainCam, &doorHandle->dyna.actor,
+ play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(&doorHandle->dyna.actor)]
+ .sides[(this->doorDirection > 0) ? 0 : 1]
+ .bgCamIndex,
+ 0.0f, this->unk_AE7, 26.0f * D_8085C3E8, 10.0f * D_8085C3E8);
+ }
+ }
+ }
+}
+
+// door stuff
+s32 func_808365DC(Player* this, PlayState* play) {
+ if ((gSaveContext.save.saveInfo.playerData.health != 0) && (this->doorType != PLAYER_DOORTYPE_NONE)) {
+ if ((this->actor.category != ACTORCAT_PLAYER) ||
+ ((((this->doorType <= PLAYER_DOORTYPE_TALKING) && CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) ||
+ ((this->doorType >= PLAYER_DOORTYPE_HANDLE) && CutsceneManager_IsNext(CS_ID_GLOBAL_DOOR))) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_800) &&
+ (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) || (func_8085437C == this->actionFunc) ||
+ (this->doorType == PLAYER_DOORTYPE_STAIRCASE) || (this->doorType == PLAYER_DOORTYPE_PROXIMITY))))) {
+ Actor* doorActor = this->doorActor;
+ Actor* var_v0_3;
+
+ if (this->doorType <= PLAYER_DOORTYPE_TALKING) {
+ Player_TalkWithPlayer(play, doorActor);
+ if (doorActor->textId == 0x1821) {
+ doorActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+ return true;
+ }
+
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 0;
+
+ if (this->doorType == PLAYER_DOORTYPE_STAIRCASE) {
+ Player_Door_Staircase(play, this, doorActor);
+ } else if (this->doorType == PLAYER_DOORTYPE_SLIDING) {
+ Player_Door_Sliding(play, this, doorActor);
+ } else {
+ Player_Door_Knob(play, this, doorActor);
+ }
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ this->csId = CS_ID_GLOBAL_DOOR;
+ CutsceneManager_Start(this->csId, &this->actor);
+ }
+
+ if (this->actor.category == ACTORCAT_PLAYER) {
+ if ((this->doorType < PLAYER_DOORTYPE_FAKE) && (doorActor->category == ACTORCAT_DOOR) &&
+ ((this->doorType != PLAYER_DOORTYPE_HANDLE) || (ENDOOR_GET_TYPE(doorActor) != ENDOOR_TYPE_7))) {
+ s8 roomNum = play->doorCtx.transitionActorList[DOOR_GET_TRANSITION_ID(doorActor)]
+ .sides[(this->doorDirection > 0) ? 0 : 1]
+ .room;
+
+ if ((roomNum >= 0) && (roomNum != play->roomCtx.curRoom.num)) {
+ Room_StartRoomTransition(play, &play->roomCtx, roomNum);
+ }
+ }
+ }
+
+ doorActor->room = play->roomCtx.curRoom.num;
+ if (((var_v0_3 = doorActor->child) != NULL) || ((var_v0_3 = doorActor->parent) != NULL)) {
+ var_v0_3->room = play->roomCtx.curRoom.num;
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void func_80836888(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+
+ Player_SetAction(play, this, func_80849A9C, 1);
+
+ if (this->unk_B40 < 0.5f) {
+ anim = func_8082EF54(this);
+ this->unk_B40 = 0.0f;
+ } else {
+ anim = func_8082EF9C(this);
+ this->unk_B40 = 1.0f;
+ }
+
+ this->unk_B44 = this->unk_B40;
+ Player_AnimationPlayLoop(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8083692C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849DD0, 1);
+ func_8082E438(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80836988(Player* this, PlayState* play) {
+ if (func_80123420(this)) {
+ func_80836888(this, play);
+ } else if (func_80123434(this)) {
+ func_8083692C(this, play);
+ } else {
+ func_8085B384(this, play);
+ }
+}
+
+void func_808369F4(Player* this, PlayState* play) {
+ PlayerActionFunc actionFunc;
+
+ if (func_80123420(this)) {
+ actionFunc = func_80849A9C;
+ } else if (func_80123434(this)) {
+ actionFunc = func_80849DD0;
+ } else {
+ actionFunc = func_80849FE0;
+ }
+ Player_SetAction(play, this, actionFunc, 1);
+}
+
+void func_80836A5C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ if (func_80123420(this)) {
+ this->unk_AE8 = 1;
+ }
+}
+
+void func_80836A98(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ func_80836A5C(this, play);
+ func_8082EC9C(play, this, anim);
+}
+
+void func_80836AD8(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80857BE8, 0);
+ this->unk_B28 = 0;
+ this->unk_B86[1] = 0;
+ this->unk_AF0[0].x = 0.0f;
+ this->unk_AF0[0].y = 0.0f;
+ this->unk_AF0[0].z = 0.0f;
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ Player_PlaySfx(this, NA_SE_PL_GORON_TO_BALL);
+}
+
+void func_80836B3C(PlayState* play, Player* this, f32 arg2) {
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ func_80836AD8(play, this);
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_15][this->modelAnimType],
+ 1.5f * D_8085C3E4, 0.0f, 6.0f, ANIMMODE_ONCE, 0.0f);
+ } else {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_15][this->modelAnimType];
+
+ Player_SetAction(play, this, func_8084C6EC, 0);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.25f * D_8085C3E4, arg2, Animation_GetLastFrame(anim),
+ ANIMMODE_ONCE, 0.0f);
+ }
+}
+
+void func_80836C70(PlayState* play, Player* this, PlayerBodyPart bodyPartIndex) {
+ static Vec3f D_8085D130 = { 0, 0, 0 };
+ s32 i;
+
+ for (i = 0; i < 4; i++) {
+ Vec3f velocity;
+
+ velocity.x = Rand_CenteredFloat(4.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = Rand_CenteredFloat(4.0f);
+ D_8085D130.y = -0.2f;
+ EffectSsHahen_Spawn(play, &this->bodyPartsPos[bodyPartIndex], &velocity, &D_8085D130, 0, 10, OBJECT_LINK_NUTS,
+ 16, object_link_nuts_DL_008860);
+ }
+}
+
+void func_80836D8C(Player* this) {
+ this->actor.focus.rot.x = 0;
+ this->actor.focus.rot.z = 0;
+ this->headLimbRot.x = 0;
+ this->headLimbRot.y = 0;
+ this->headLimbRot.z = 0;
+ this->upperLimbRot.x = 0;
+ this->upperLimbRot.y = 0;
+ this->upperLimbRot.z = 0;
+ this->actor.shape.rot.y = this->actor.focus.rot.y;
+ this->currentYaw = this->actor.focus.rot.y;
+}
+
+s32 func_80836DC0(PlayState* play, Player* this) {
+ if ((MREG(48) != 0) || func_800C9DDC(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ Player_SetAction(play, this, func_808561B0, 0);
+ this->stateFlags1 &= ~(PLAYER_STATE1_20000 | PLAYER_STATE1_40000000);
+ func_8082E438(play, this, &gPlayerAnim_pn_attack);
+ Player_StopHorizontalMovement(this);
+ func_80836D8C(this);
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->unk_B48 = -2000.0f;
+ this->actor.shape.shadowScale = 13.0f;
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_IN_GRD);
+ return true;
+ }
+
+ return false;
+}
+
+void Player_RequestQuake(PlayState* play, u16 speed, s16 y, s16 duration) {
+ s16 quakeIndex = Quake_Request(Play_GetCamera(play, CAM_ID_MAIN), QUAKE_TYPE_3);
+
+ Quake_SetSpeed(quakeIndex, speed);
+ Quake_SetPerturbations(quakeIndex, y, 0, 0, 0);
+ Quake_SetDuration(quakeIndex, duration);
+}
+
+FallImpactInfo sFallImpactInfos[] = {
+ { -8, 180, 40, 100, NA_SE_VO_LI_LAND_DAMAGE_S },
+ { -16, 255, 140, 150, NA_SE_VO_LI_LAND_DAMAGE_S },
+};
+
+// Player_FallAgainstTheFloor, Player_LetTheBodiesHitTheFloor, Player_ImpactFloor, Player_ProcessFallDamage,
+// Player_DamageOnFloorImpact, Player_CalculateFallDamage
+s32 func_80836F10(PlayState* play, Player* this) {
+ s32 fallDistance;
+
+ if ((sPlayerCurrentFloorType == FLOOR_TYPE_6) || (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ (this->csMode != PLAYER_CSMODE_0)) {
+ fallDistance = 0;
+ } else {
+ fallDistance = this->fallDistance;
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 1.0f);
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ // Height enough for fall damage
+ if (fallDistance >= 400) {
+ s32 index;
+ FallImpactInfo* entry;
+
+ if (this->fallDistance < 800) {
+ // small fall
+ index = 0;
+ } else {
+ // big fall
+ index = 1;
+ }
+
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+
+ entry = &sFallImpactInfos[index];
+ Player_AnimSfx_PlayVoice(this, entry->sfxId);
+
+ if (Player_InflictDamage(play, entry->damage)) {
+ // Player's dead
+ return -1;
+ }
+
+ func_80833998(this, 40);
+ Player_RequestQuake(play, 32967, 2, 30);
+ Player_RequestRumble(play, this, entry->sourceIntensity, entry->decayTimer, entry->decayStep, SQ(0));
+
+ return index + 1;
+ }
+
+ // Tiny fall, won't damage player
+ if (fallDistance > 200) {
+ fallDistance = fallDistance * 2;
+ fallDistance = CLAMP_MAX(fallDistance, 255);
+
+ Player_RequestRumble(play, this, fallDistance, fallDistance * 0.1f, fallDistance, SQ(0));
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_6) {
+ //! @bug unreachable code: When sPlayerCurrentFloorType is equal to FLOOR_TYPE_6 then fallDistance is
+ //! ignored (set to zero), so the previous check based on said variable will always fail, producing this
+ //! current check to always be false.
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+ }
+
+ Player_AnimSfx_PlayFloorLand(this);
+ return 0;
+}
+
+s32 func_808370D4(PlayState* play, Player* this) {
+ if ((this->fallDistance < 800) && (this->unk_AE3[this->unk_ADE] == 0) && !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_80836B3C(play, this, 0.0f);
+
+ return true;
+ }
+ return false;
+}
+
+void func_80837134(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_13][this->modelAnimType];
+ s32 temp_v0_2; // sp28
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ s32 var_v1 = false;
+
+ if ((this->skelAnime.animation == &gPlayerAnim_pn_rakkafinish) ||
+ (this->skelAnime.animation == &gPlayerAnim_pn_kakkufinish)) {
+ func_80836C70(play, this, PLAYER_BODYPART_LEFT_HAND);
+ func_80836C70(play, this, PLAYER_BODYPART_RIGHT_HAND);
+ var_v1 = true;
+ }
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) && func_80836DC0(play, this)) {
+ return;
+ }
+
+ if (var_v1) {
+ func_80836A98(this, anim, play);
+ Player_AnimSfx_PlayFloorLand(this);
+ return;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_80000) {
+ if (func_80123420(this)) {
+ anim = D_8085C2A4[this->unk_AE7].unk_8;
+ } else {
+ anim = D_8085C2A4[this->unk_AE7].unk_4;
+ }
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_run_jump) {
+ anim = &gPlayerAnim_link_normal_run_jump_end;
+ } else if (func_80123420(this)) {
+ anim = &gPlayerAnim_link_anchor_landingR;
+ func_8082FC60(this);
+ } else if (this->fallDistance <= 80) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_14][this->modelAnimType];
+ } else if (func_808370D4(play, this)) {
+ return;
+ }
+
+ temp_v0_2 = func_80836F10(play, this);
+ if (temp_v0_2 > 0) { // Player suffered damage because of this fall
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_13][this->modelAnimType], play);
+ this->skelAnime.endFrame = 8.0f;
+
+ if (temp_v0_2 == 1) {
+ this->unk_AE8 = 0xA;
+ } else {
+ this->unk_AE8 = 0x14;
+ }
+ } else if (temp_v0_2 == 0) {
+ func_80836A98(this, anim, play);
+ }
+}
+
+void func_808373A4(PlayState* play, Player* this) {
+ func_8082E438(play, this, &gPlayerAnim_pn_attack);
+ this->unk_B10[0] = 20000.0f;
+ this->unk_B10[1] = 0x30000;
+ Player_PlaySfx(this, NA_SE_PL_DEKUNUTS_ATTACK);
+}
+
+s32 func_808373F8(PlayState* play, Player* this, u16 sfxId) {
+ PlayerAnimationHeader* anim;
+ f32 speed;
+ s16 yawDiff = this->currentYaw - this->actor.shape.rot.y;
+
+ if ((IREG(66) / 100.0f) < this->linearVelocity) {
+ speed = IREG(67) / 100.0f;
+ } else {
+ speed = (IREG(68) / 100.0f + (IREG(69) * this->linearVelocity) / 1000.0f);
+
+ if ((this->transformation == PLAYER_FORM_DEKU) && (speed < 8.0f)) {
+ speed = 8.0f;
+ } else if (speed < 5.0f) {
+ speed = 5.0f;
+ }
+ }
+
+ if ((ABS_ALT(yawDiff) >= 0x1000) || (this->linearVelocity <= 4.0f)) {
+ anim = &gPlayerAnim_link_normal_jump;
+ } else {
+ s32 var_v1;
+
+ if ((this->transformation != PLAYER_FORM_DEKU) &&
+ (((sPlayerPrevFloorProperty == FLOOR_PROPERTY_1)) || (sPlayerPrevFloorProperty == FLOOR_PROPERTY_2))) {
+ if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_1) {
+ var_v1 = 4;
+ } else {
+ var_v1 = 5;
+ }
+
+ func_80834D50(play, this, D_8085C2A4[var_v1].unk_0, speed, ((var_v1 == 4) ? NA_SE_VO_LI_SWORD_N : sfxId));
+ this->unk_AE8 = -1;
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ this->unk_AE7 = var_v1;
+ return true;
+ }
+ anim = &gPlayerAnim_link_normal_run_jump;
+ }
+
+ // Deku hopping
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ speed *= 0.3f + ((5 - this->remainingHopsCounter) * 0.18f);
+ if (speed < 4.0f) {
+ speed = 4.0f;
+ }
+
+ if ((this->actor.depthInWater > 0.0f) && (this->remainingHopsCounter != 0)) {
+ this->actor.world.pos.y += this->actor.depthInWater;
+ func_80834D50(play, this, anim, speed, NA_SE_NONE);
+ this->unk_AE8 = 1;
+ this->stateFlags3 |= PLAYER_STATE3_200000;
+ Player_PlaySfx(this, (NA_SE_PL_DEKUNUTS_JUMP5 + 1 - this->remainingHopsCounter));
+ Player_AnimSfx_PlayVoice(this, sfxId);
+ this->remainingHopsCounter--;
+ if (this->remainingHopsCounter == 0) {
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ func_808373A4(play, this);
+ }
+
+ return true;
+ }
+
+ if (this->actor.velocity.y > 0.0f) {
+ sfxId = NA_SE_NONE;
+ }
+ }
+
+ func_80834D50(play, this, anim, speed, sfxId);
+ this->unk_AE8 = 1;
+
+ return true;
+}
+
+s32 func_80837730(PlayState* play, Player* this, f32 arg2, s32 scale) {
+ f32 sp3C = fabsf(arg2);
+
+ if (sp3C > 2.0f) {
+ WaterBox* waterBox;
+ f32 sp34;
+ Vec3f pos;
+
+ Math_Vec3f_Copy(&pos, &this->bodyPartsPos[PLAYER_BODYPART_WAIST]);
+ pos.y += 20.0f;
+ if (WaterBox_GetSurface1(play, &play->colCtx, pos.x, pos.z, &pos.y, &waterBox)) {
+ sp34 = pos.y - this->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].y;
+ if ((sp34 > -2.0f) && (sp34 < 100.0f)) {
+ EffectSsGSplash_Spawn(play, &pos, NULL, NULL,
+ (sp3C <= 10.0f) ? EFFSSGSPLASH_TYPE_0 : EFFSSGSPLASH_TYPE_1, scale);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083784C(Player* this) {
+ if (this->actor.velocity.y < 0.0f) {
+ if ((this->actor.depthInWater > 0.0f) &&
+ ((this->ageProperties->unk_2C - this->actor.depthInWater) < D_80862B18)) {
+ if ((this->remainingHopsCounter != 0) && (gSaveContext.save.saveInfo.playerData.health != 0) &&
+ !(this->stateFlags1 & PLAYER_STATE1_4000000)) {
+ if (((this->talkActor == NULL) || !(this->talkActor->flags & ACTOR_FLAG_10000))) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_808378FC(PlayState* play, Player* this) {
+ if (!func_8082FC24(this)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ }
+
+ if (func_8083784C(this) && func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP)) {
+ func_80837730(play, this, 20.0f, this->actor.velocity.y * 50.0f);
+ }
+}
+
+s32 func_8083798C(Player* this) {
+ return (this->interactRangeActor != NULL) && (this->heldActor == NULL) &&
+ (this->transformation != PLAYER_FORM_DEKU);
+}
+
+void func_808379C0(PlayState* play, Player* this) {
+ if (func_8083798C(this)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+ PlayerAnimationHeader* anim;
+
+ if ((interactRangeActor->id == ACTOR_EN_ISHI) && (ENISHI_GET_1(interactRangeActor) != 0)) {
+ Player_SetAction(play, this, func_8084E334, 0);
+ anim = &gPlayerAnim_link_silver_carry;
+ } else if (((interactRangeActor->id == ACTOR_EN_BOMBF) || (interactRangeActor->id == ACTOR_EN_KUSA) ||
+ (interactRangeActor->id == ACTOR_EN_KUSA2) || (interactRangeActor->id == ACTOR_OBJ_GRASS_CARRY)) &&
+ (Player_GetStrength() <= PLAYER_STRENGTH_DEKU)) {
+ Player_SetAction(play, this, func_8084E4E4, 0);
+ anim = &gPlayerAnim_link_normal_nocarry_free;
+
+ this->actor.world.pos.x =
+ (Math_SinS(interactRangeActor->yawTowardsPlayer) * 20.0f) + interactRangeActor->world.pos.x;
+ this->actor.world.pos.z =
+ (Math_CosS(interactRangeActor->yawTowardsPlayer) * 20.0f) + interactRangeActor->world.pos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = interactRangeActor->yawTowardsPlayer + 0x8000;
+ } else {
+ Player_SetAction(play, this, func_8084E25C, 0);
+ anim = D_8085BE84[PLAYER_ANIMGROUP_12][this->modelAnimType];
+ }
+
+ Player_AnimationPlayOnce(play, this, anim);
+ } else {
+ func_80836988(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ }
+}
+
+void func_80837B60(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_8084E980, 0);
+
+ this->exchangeItemId = PLAYER_IA_NONE;
+ this->stateFlags1 |= (PLAYER_STATE1_40 | PLAYER_STATE1_20000000);
+ if (this->actor.textId != 0) {
+ Message_StartTextbox(play, this->actor.textId, this->talkActor);
+ }
+ this->targetedActor = this->talkActor;
+}
+
+void func_80837BD0(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_8084FE7C, 0);
+}
+
+void func_80837BF8(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8084ED9C, 0);
+}
+
+void func_80837C20(PlayState* play, Player* this) {
+ s32 sp1C = this->unk_AE8;
+ s32 sp18 = this->unk_AE7;
+
+ func_8083172C(play, this, func_8084F4E8, 0);
+ this->actor.velocity.y = 0.0f;
+
+ this->unk_AE8 = sp1C;
+ this->unk_AE7 = sp18;
+}
+
+void func_80837C78(PlayState* play, Player* this) {
+ func_8083172C(play, this, func_80852C04, 0);
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_20000000);
+
+ if (this->getItemId == GI_HEART_CONTAINER) {
+ this->unk_AE8 = 20;
+ } else if (this->getItemId >= GI_NONE) {
+ this->unk_AE8 = 1;
+ } else {
+ this->getItemId = -this->getItemId;
+ }
+}
+
+void func_80837CEC(PlayState* play, Player* this, CollisionPoly* arg2, f32 arg3, PlayerAnimationHeader* anim) {
+ f32 nx = COLPOLY_GET_NORMAL(arg2->normal.x);
+ f32 nz = COLPOLY_GET_NORMAL(arg2->normal.z);
+
+ Player_SetAction(play, this, func_8084F1B8, 0);
+ func_8082DE50(play, this);
+ Player_AnimationPlayOnce(play, this, anim);
+
+ this->actor.world.pos.x -= (arg3 + 1.0f) * nx;
+ this->actor.world.pos.z -= (arg3 + 1.0f) * nz;
+ this->actor.shape.rot.y = Math_Atan2S_XY(nz, nx);
+ this->currentYaw = this->actor.shape.rot.y;
+
+ func_8082DAD4(this);
+ this->actor.velocity.y = 0.0f;
+ func_8082E6D0(this);
+}
+
+s32 func_80837DEC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (this->transformation != PLAYER_FORM_DEKU) &&
+ (this->actor.depthInWater < -80.0f)) {
+ if ((ABS_ALT(this->unk_B6C)) < 0xAAA && (ABS_ALT(this->unk_B6E) < 0xAAA)) {
+ CollisionPoly* entityPoly;
+ CollisionPoly* sp90;
+ s32 entityBgId;
+ s32 sp88;
+ Vec3f sp7C;
+ Vec3f sp70;
+ f32 temp_fv1_2;
+ f32 entityNormalX;
+ f32 entityNormalY;
+ f32 entityNormalZ;
+ f32 temp_fv0_2;
+ f32 var_fv1;
+
+ sp7C.x = this->actor.prevPos.x - this->actor.world.pos.x;
+ sp7C.z = this->actor.prevPos.z - this->actor.world.pos.z;
+
+ var_fv1 = sqrtf(SQXZ(sp7C));
+ if (var_fv1 != 0.0f) {
+ var_fv1 = 5.0f / var_fv1;
+ } else {
+ var_fv1 = 0.0f;
+ }
+
+ sp7C.x = this->actor.prevPos.x + (sp7C.x * var_fv1);
+ sp7C.y = this->actor.world.pos.y;
+ sp7C.z = this->actor.prevPos.z + (sp7C.z * var_fv1);
+
+ if (BgCheck_EntityLineTest2(&play->colCtx, &this->actor.world.pos, &sp7C, &sp70, &entityPoly, true, false,
+ false, true, &entityBgId, &this->actor)) {
+ if (ABS_ALT(entityPoly->normal.y) < 0x258) {
+ s32 var_v1_2; // sp54
+
+ entityNormalX = COLPOLY_GET_NORMAL(entityPoly->normal.x);
+ entityNormalY = COLPOLY_GET_NORMAL(entityPoly->normal.y);
+ entityNormalZ = COLPOLY_GET_NORMAL(entityPoly->normal.z);
+
+ temp_fv0_2 = Math3D_UDistPlaneToPos(entityNormalX, entityNormalY, entityNormalZ, entityPoly->dist,
+ &this->actor.world.pos);
+
+ sp70.x = this->actor.world.pos.x - ((temp_fv0_2 + 1.0f) * entityNormalX);
+ sp70.z = this->actor.world.pos.z - ((temp_fv0_2 + 1.0f) * entityNormalZ);
+ sp70.y = this->actor.world.pos.y + 268 * 0.1f;
+
+ temp_fv1_2 = this->actor.world.pos.y -
+ BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp88, &this->actor, &sp70);
+ if ((temp_fv1_2 >= -11.0f) && (temp_fv1_2 <= 0.0f)) {
+ var_v1_2 = sPlayerPrevFloorProperty == FLOOR_PROPERTY_6;
+ if (!var_v1_2) {
+ if (SurfaceType_GetWallFlags(&play->colCtx, entityPoly, entityBgId) & WALL_FLAG_3) {
+ var_v1_2 = true;
+ }
+ }
+
+ func_80837CEC(play, this, entityPoly, temp_fv0_2,
+ var_v1_2 ? &gPlayerAnim_link_normal_Fclimb_startB
+ : &gPlayerAnim_link_normal_fall);
+ if (var_v1_2) {
+ func_80832558(play, this, func_80837C20);
+
+ this->actor.shape.rot.y = this->currentYaw += 0x8000;
+ this->stateFlags1 |= PLAYER_STATE1_200000;
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 |
+ ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->unk_AE8 = -1;
+ this->unk_AE7 = var_v1_2;
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_2000;
+ this->stateFlags1 &= ~PLAYER_STATE1_20000;
+ }
+
+ Player_PlaySfx(this, NA_SE_PL_SLIPDOWN);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_808381A0(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ Player_SetAction(play, this, func_8084F3DC, 0);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 1.3f);
+}
+
+Vec3f D_8085D148 = { 0.0f, 50.0f, 0.0f };
+
+s32 func_808381F8(PlayState* play, Player* this) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ f32 yIntersect;
+
+ Player_TranslateAndRotateY(this, &this->actor.prevPos, &D_8085D148, &pos);
+
+ yIntersect = BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos);
+
+ return fabsf(yIntersect - this->actor.world.pos.y) < 10.0f;
+}
+
+Vec3f D_8085D154 = { 0.0f, 0.0f, 100.0f };
+
+void func_8083827C(Player* this, PlayState* play) {
+ s32 temp_t0; // sp64
+ CollisionPoly* sp60;
+ s32 sp5C;
+ WaterBox* sp58;
+ Vec3f sp4C;
+ f32 sp48;
+ f32 sp44;
+
+ this->fallDistance = this->fallStartHeight - (s32)this->actor.world.pos.y;
+ if (!(this->stateFlags1 & (PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000)) &&
+ ((this->stateFlags1 & PLAYER_STATE1_80000000) ||
+ !(this->stateFlags3 & (PLAYER_STATE3_200 | PLAYER_STATE3_2000))) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (func_80835428(play, this)) {
+ return;
+ }
+
+ if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_8) {
+ this->actor.world.pos.x = this->actor.prevPos.x;
+ this->actor.world.pos.z = this->actor.prevPos.z;
+ return;
+ }
+
+ if ((this->stateFlags3 & PLAYER_STATE3_2) || (this->skelAnime.moveFlags & ANIM_FLAG_80)) {
+ return;
+ }
+
+ if ((func_8084C16C == this->actionFunc) || (func_8084C94C == this->actionFunc) ||
+ (func_8084CA24 == this->actionFunc) || (func_80857BE8 == this->actionFunc) ||
+ (func_808546D0 == this->actionFunc) || (func_80854800 == this->actionFunc)) {
+ return;
+ }
+
+ if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_7) || (this->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) ||
+ ((this->skelAnime.moveFlags & ANIM_FLAG_8) && func_808381F8(play, this))) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ if (this->linearVelocity > 0.0f) {
+ Player_StopHorizontalMovement(this);
+ }
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND_TOUCH;
+ return;
+ }
+
+ temp_t0 = BINANG_SUB(this->currentYaw, this->actor.shape.rot.y);
+ Player_SetAction(play, this, func_8084C16C, 1);
+ func_8082DD2C(play, this);
+
+ this->floorSfxOffset = this->unk_D66;
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->remainingHopsCounter != 0)) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_LEAVE)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ if ((sPlayerPrevFloorProperty != FLOOR_PROPERTY_6) && (sPlayerPrevFloorProperty != FLOOR_PROPERTY_9) &&
+ (D_80862B18 > 20.0f) && (this->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0)) {
+ if ((ABS_ALT(temp_t0) < 0x2000) && (this->linearVelocity > 3.0f)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (((this->transformation == PLAYER_FORM_ZORA) &&
+ CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_11) &&
+ (this->transformation != PLAYER_FORM_GORON) &&
+ (this->transformation != PLAYER_FORM_DEKU))) {
+
+ sp48 = func_80835CD8(play, this, &D_8085D154, &sp4C, &sp60, &sp5C);
+ sp44 = this->actor.world.pos.y;
+
+ if (WaterBox_GetSurface1(play, &play->colCtx, sp4C.x, sp4C.z, &sp44, &sp58) &&
+ ((sp44 - sp48) > 50.0f)) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_run_jump_water_fall, 6.0f, play);
+ Player_SetAction(play, this, func_8084C94C, 0);
+ return;
+ }
+ }
+ }
+ func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP);
+ return;
+ }
+ }
+ }
+ }
+
+ // Checking if the ledge is tall enough for Player to hang from
+ if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_9) || (D_80862B18 <= this->ageProperties->unk_34) ||
+ !func_80837DEC(this, play)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait);
+ }
+ } else {
+ this->fallStartHeight = this->actor.world.pos.y;
+ this->remainingHopsCounter = 5;
+ }
+}
+
+s32 func_8083868C(PlayState* play, Player* this) {
+ s32 camMode;
+ Camera* camera;
+
+ if (this->unk_AA5 == PLAYER_UNKAA5_3) {
+ if (func_800B7118(this)) {
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ camMode = CAM_MODE_SLINGSHOT;
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ camMode = CAM_MODE_DEKUSHOOT;
+ } else {
+ camMode = CAM_MODE_BOWARROW;
+ }
+ } else {
+ camMode = CAM_MODE_ZORAFIN;
+ }
+ } else {
+ camMode = CAM_MODE_FIRSTPERSON;
+ }
+
+ camera = (this->actor.id == ACTOR_PLAYER) ? Play_GetCamera(play, CAM_ID_MAIN)
+ : Play_GetCamera(play, ((EnTest3*)this)->subCamId);
+
+ return Camera_ChangeMode(camera, camMode);
+}
+
+void Player_StopCutscene(Player* this) {
+ if (this->csId > CS_ID_NONE) {
+ CutsceneManager_Stop(this->csId);
+ this->csId = CS_ID_NONE;
+ }
+}
+
+s32 func_808387A0(PlayState* play, Player* this) {
+ if (this->unk_AA5 == PLAYER_UNKAA5_4) {
+ Player_StopCutscene(this);
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ Player_SetAction(play, this, func_8085B08C, 0);
+ if (this->doorBgCamIndex != 0) {
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ }
+ func_8082DC38(this);
+
+ return true;
+ }
+ return false;
+}
+
+void func_80838830(Player* this, s16 objectId) {
+ s32 pad[2];
+
+ if (objectId != OBJECT_UNSET_0) {
+ this->giObjectLoading = true;
+ osCreateMesgQueue(&this->giObjectLoadQueue, &this->giObjectLoadMsg, 1);
+ DmaMgr_SendRequestImpl(&this->giObjectDmaRequest, this->giObjectSegment, gObjectTable[objectId].vromStart,
+ gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0,
+ &this->giObjectLoadQueue, NULL);
+ }
+}
+
+PlayerAnimationHeader* D_8085D160[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_pz_maskoffstart, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_maskoffstart, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_maskoffstart, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_maskoffstart, // PLAYER_FORM_DEKU
+ &gPlayerAnim_cl_setmask, // PLAYER_FORM_HUMAN
+};
+
+void func_808388B8(PlayState* play, Player* this, PlayerTransformation playerForm) {
+ func_8082DE50(play, this);
+ func_80831760(play, this, func_808553F4, 0);
+ func_8082E4A4(play, this, D_8085D160[this->transformation]);
+ gSaveContext.save.playerForm = playerForm;
+ this->stateFlags1 |= PLAYER_STATE1_2;
+
+ D_80862B50 = play->envCtx.lightSettings;
+ this->actor.velocity.y = 0.0f;
+ Actor_DeactivateLens(play);
+}
+
+void func_808389BC(PlayState* play, Player* this) {
+ func_80831760(play, this, func_80855AF4, 0);
+ func_8082E4A4(play, this, &gPlayerAnim_cl_setmask);
+ this->stateFlags1 |= (PLAYER_STATE1_100 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+}
+
+void func_80838A20(PlayState* play, Player* this) {
+ func_80831760(play, this, func_80855B9C, 0);
+ func_8082DB90(play, this, &gPlayerAnim_cl_maskoff);
+ this->currentMask = PLAYER_MASK_NONE;
+ this->stateFlags1 |= (PLAYER_STATE1_100 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+ Magic_Reset(play);
+}
+
+u8 sPlayerMass[PLAYER_FORM_MAX] = {
+ 100, // PLAYER_FORM_FIERCE_DEITY
+ 200, // PLAYER_FORM_GORON
+ 80, // PLAYER_FORM_ZORA
+ 20, // PLAYER_FORM_DEKU
+ 50, // PLAYER_FORM_HUMAN
+};
+
+PlayerAnimationHeader* D_8085D17C[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_link_normal_okarina_start, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_gakkistart, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_gakkistart, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_gakkistart, // PLAYER_FORM_DEKU
+ &gPlayerAnim_link_normal_okarina_start, // PLAYER_FORM_HUMAN
+};
+PlayerAnimationHeader* D_8085D190[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_link_normal_okarina_swing, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_pg_gakkiplay, // PLAYER_FORM_GORON
+ &gPlayerAnim_pz_gakkiplay, // PLAYER_FORM_ZORA
+ &gPlayerAnim_pn_gakkiplay, // PLAYER_FORM_DEKU
+ &gPlayerAnim_link_normal_okarina_swing, // PLAYER_FORM_HUMAN
+};
+
+u8 D_8085D1A4[PLAYER_IA_MAX] = {
+ GI_NONE, // PLAYER_IA_NONE
+ GI_NONE, // PLAYER_IA_LAST_USED
+ GI_NONE, // PLAYER_IA_FISHING_ROD
+ GI_SWORD_KOKIRI, // PLAYER_IA_SWORD_KOKIRI
+ GI_SWORD_RAZOR, // PLAYER_IA_SWORD_RAZOR
+ GI_SWORD_GILDED, // PLAYER_IA_SWORD_GILDED
+ GI_SWORD_GREAT_FAIRY, // PLAYER_IA_SWORD_TWO_HANDED
+ GI_STICKS_1, // PLAYER_IA_STICK
+ GI_SWORD_KOKIRI, // PLAYER_IA_ZORA_FINS
+ GI_QUIVER_30, // PLAYER_IA_BOW
+ GI_ARROW_FIRE, // PLAYER_IA_BOW_FIRE
+ GI_ARROW_ICE, // PLAYER_IA_BOW_ICE
+ GI_ARROW_LIGHT, // PLAYER_IA_BOW_LIGHT
+ GI_HOOKSHOT, // PLAYER_IA_HOOKSHOT
+ GI_BOMBS_1, // PLAYER_IA_BOMB
+ GI_POWDER_KEG, // PLAYER_IA_POWDER_KEG
+ GI_BOMBCHUS_10, // PLAYER_IA_BOMBCHU
+ GI_40, // PLAYER_IA_11
+ GI_NUTS_1, // PLAYER_IA_NUT
+ GI_PICTO_BOX, // PLAYER_IA_PICTO_BOX
+ GI_OCARINA, // PLAYER_IA_OCARINA
+ GI_BOTTLE, // PLAYER_IA_BOTTLE_EMPTY
+ GI_FISH, // PLAYER_IA_BOTTLE_FISH
+ GI_75, // PLAYER_IA_BOTTLE_SPRING_WATER
+ GI_ICE_TRAP, // PLAYER_IA_BOTTLE_HOT_SPRING_WATER
+ GI_ZORA_EGG, // PLAYER_IA_BOTTLE_ZORA_EGG
+ GI_GOLD_DUST, // PLAYER_IA_BOTTLE_DEKU_PRINCESS
+ GI_6C, // PLAYER_IA_BOTTLE_GOLD_DUST
+ GI_SEAHORSE, // PLAYER_IA_BOTTLE_1C
+ GI_MUSHROOM, // PLAYER_IA_BOTTLE_SEAHORSE
+ GI_HYLIAN_LOACH, // PLAYER_IA_BOTTLE_MUSHROOM
+ GI_DEKU_PRINCESS, // PLAYER_IA_BOTTLE_HYLIAN_LOACH
+ GI_BUG, // PLAYER_IA_BOTTLE_BUG
+ GI_POE, // PLAYER_IA_BOTTLE_POE
+ GI_BIG_POE, // PLAYER_IA_BOTTLE_BIG_POE
+ GI_POTION_RED, // PLAYER_IA_BOTTLE_POTION_RED
+ GI_POTION_BLUE, // PLAYER_IA_BOTTLE_POTION_BLUE
+ GI_POTION_GREEN, // PLAYER_IA_BOTTLE_POTION_GREEN
+ GI_MILK_HALF, // PLAYER_IA_BOTTLE_MILK
+ GI_MILK_HALF, // PLAYER_IA_BOTTLE_MILK_HALF
+ GI_CHATEAU, // PLAYER_IA_BOTTLE_CHATEAU
+ GI_FAIRY, // PLAYER_IA_BOTTLE_FAIRY
+ GI_MOON_TEAR, // PLAYER_IA_MOON_TEAR
+ GI_DEED_LAND, // PLAYER_IA_DEED_LAND
+ GI_ROOM_KEY, // PLAYER_IA_ROOM_KEY
+ GI_LETTER_TO_KAFEI, // PLAYER_IA_LETTER_TO_KAFEI
+ GI_MAGIC_BEANS, // PLAYER_IA_MAGIC_BEANS
+ GI_DEED_SWAMP, // PLAYER_IA_DEED_SWAMP
+ GI_DEED_MOUNTAIN, // PLAYER_IA_DEED_MOUNTAIN
+ GI_DEED_OCEAN, // PLAYER_IA_DEED_OCEAN
+ GI_MOON_TEAR, // PLAYER_IA_32
+ GI_LETTER_TO_MAMA, // PLAYER_IA_LETTER_MAMA
+ GI_A7, // PLAYER_IA_34
+ GI_A8, // PLAYER_IA_35
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_PENDANT_OF_MEMORIES
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_37
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_38
+ GI_PENDANT_OF_MEMORIES, // PLAYER_IA_39
+ GI_MASK_TRUTH, // PLAYER_IA_MASK_TRUTH
+ GI_MASK_KAFEIS_MASK, // PLAYER_IA_MASK_KAFEIS_MASK
+ GI_MASK_ALL_NIGHT, // PLAYER_IA_MASK_ALL_NIGHT
+ GI_MASK_BUNNY, // PLAYER_IA_MASK_BUNNY
+ GI_MASK_KEATON, // PLAYER_IA_MASK_KEATON
+ GI_MASK_GARO, // PLAYER_IA_MASK_GARO
+ GI_MASK_ROMANI, // PLAYER_IA_MASK_ROMANI
+ GI_MASK_CIRCUS_LEADER, // PLAYER_IA_MASK_CIRCUS_LEADER
+ GI_MASK_POSTMAN, // PLAYER_IA_MASK_POSTMAN
+ GI_MASK_COUPLE, // PLAYER_IA_MASK_COUPLE
+ GI_MASK_GREAT_FAIRY, // PLAYER_IA_MASK_GREAT_FAIRY
+ GI_MASK_GIBDO, // PLAYER_IA_MASK_GIBDO
+ GI_MASK_DON_GERO, // PLAYER_IA_MASK_DON_GERO
+ GI_MASK_KAMARO, // PLAYER_IA_MASK_KAMARO
+ GI_MASK_CAPTAIN, // PLAYER_IA_MASK_CAPTAIN
+ GI_MASK_STONE, // PLAYER_IA_MASK_STONE
+ GI_MASK_BREMEN, // PLAYER_IA_MASK_BREMEN
+ GI_MASK_BLAST, // PLAYER_IA_MASK_BLAST
+ GI_MASK_SCENTS, // PLAYER_IA_MASK_SCENTS
+ GI_MASK_GIANT, // PLAYER_IA_MASK_GIANT
+ GI_MASK_FIERCE_DEITY, // PLAYER_IA_MASK_FIERCE_DEITY
+ GI_MASK_GORON, // PLAYER_IA_MASK_GORON
+ GI_MASK_ZORA, // PLAYER_IA_MASK_ZORA
+ GI_MASK_DEKU, // PLAYER_IA_MASK_DEKU
+ GI_LENS, // PLAYER_IA_LENS
+};
+
+PlayerAnimationHeader* D_8085D1F8[] = {
+ &gPlayerAnim_link_normal_give_other,
+ &gPlayerAnim_link_normal_take_out, // Hold up cutscene item; "this item doesn't work here"
+};
+
+s32 func_80838A90(Player* this, PlayState* play) {
+ PlayerBottle bottleAction;
+
+ if (this->unk_AA5 != PLAYER_UNKAA5_0) {
+ if (!(this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH)) &&
+ !(this->stateFlags1 & PLAYER_STATE1_8000000) && !(this->stateFlags1 & PLAYER_STATE1_800000) &&
+ !(this->stateFlags3 & PLAYER_STATE3_8) && !(this->skelAnime.moveFlags & ANIM_FLAG_8)) {
+ Player_StopCutscene(this);
+ func_80833AA0(this, play);
+ return true;
+ }
+ if (!func_808387A0(play, this)) {
+ if (this->unk_AA5 == PLAYER_UNKAA5_5) {
+ if ((this->itemAction >= PLAYER_IA_MASK_MIN) && (this->itemAction <= PLAYER_IA_MASK_MAX)) {
+ PlayerMask maskId = GET_MASK_FROM_IA(this->itemAction);
+
+ this->prevMask = this->currentMask;
+ if (((maskId == this->currentMask) != 0) || (this->itemAction < PLAYER_IA_MASK_GIANT) ||
+ ((this->itemAction == PLAYER_IA_MASK_GIANT) && (this->transformation != PLAYER_FORM_HUMAN))) {
+ if (maskId == this->currentMask) {
+ this->currentMask = PLAYER_MASK_NONE;
+ } else {
+ this->currentMask = maskId;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ func_80838A20(play, this);
+ return true;
+ }
+
+ func_808388B8(play, this, PLAYER_FORM_HUMAN);
+ } else {
+ this->currentMask = maskId;
+ if (this->currentMask == PLAYER_MASK_GIANT) {
+ func_808389BC(play, this);
+ return true;
+ }
+ func_808388B8(play, this, this->itemAction - PLAYER_IA_MASK_FIERCE_DEITY);
+ }
+ gSaveContext.save.equippedMask = this->currentMask;
+ } else if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED) ||
+ (this->itemAction == PLAYER_IA_PICTO_BOX) ||
+ ((this->itemAction != this->unk_B2B) &&
+ ((this->itemAction == PLAYER_IA_BOTTLE_BIG_POE) ||
+ ((this->itemAction >= PLAYER_IA_BOTTLE_ZORA_EGG) &&
+ (this->itemAction <= PLAYER_IA_BOTTLE_HYLIAN_LOACH)) ||
+ (this->itemAction > PLAYER_IA_BOTTLE_FAIRY) ||
+ ((this->talkActor != NULL) && (this->exchangeItemId > PLAYER_IA_NONE) &&
+ (((this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) &&
+ (this->itemAction == PLAYER_IA_MAGIC_BEANS)) ||
+ ((this->exchangeItemId != PLAYER_IA_MAGIC_BEANS) &&
+ (Player_BottleFromIA(this, this->itemAction) > PLAYER_BOTTLE_NONE))))))) {
+ Actor* talkActor;
+ s32 heldItemTemp = this->itemAction;
+
+ Player_StopCutscene(this);
+ this->itemAction = PLAYER_IA_NONE;
+ func_80831760(play, this, func_80853A5C, 0);
+ talkActor = this->talkActor;
+ this->itemAction = heldItemTemp;
+ this->csId = CS_ID_NONE;
+
+ if ((talkActor != NULL) && (((this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) &&
+ (this->itemAction == PLAYER_IA_MAGIC_BEANS)) ||
+ ((this->exchangeItemId != PLAYER_IA_MAGIC_BEANS) &&
+ (this->exchangeItemId > PLAYER_IA_NONE)))) {
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_40);
+ if (this->exchangeItemId == PLAYER_IA_MAGIC_BEANS) {
+ Inventory_ChangeAmmo(ITEM_MAGIC_BEANS, -1);
+ func_80831760(play, this, func_8084B4A8, 0);
+ this->currentYaw = talkActor->yawTowardsPlayer + 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ if (talkActor->xzDistToPlayer < 40.0f) {
+ func_8082DB90(play, this, &gPlayerAnim_link_normal_backspace);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+ } else {
+ func_8082E438(play, this, D_8085BE84[31][this->modelAnimType]);
+ }
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_AE8 = 80;
+ this->unk_AE7 = -1;
+ this->targetedActor = this->talkActor;
+ } else {
+ this->csId = CS_ID_GLOBAL_TALK;
+ }
+
+ talkActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ this->actor.textId = 0;
+ this->targetedActor = this->talkActor;
+ } else {
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_10000000 | PLAYER_STATE1_40);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_SHOW];
+ this->unk_AE7 = 1;
+ this->actor.textId = 0xFE;
+ }
+ this->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ this->exchangeItemId = this->itemAction;
+ if (this->unk_AE7 >= 0) {
+ Player_AnimationPlayOnce(play, this, D_8085D1F8[this->unk_AE7]);
+ }
+ func_8082DAD4(this);
+ return true;
+ } else {
+ bottleAction = Player_BottleFromIA(this, this->itemAction);
+
+ if (bottleAction > PLAYER_BOTTLE_NONE) {
+ Player_StopCutscene(this);
+ if (bottleAction >= PLAYER_BOTTLE_FAIRY) {
+ func_80831760(play, this, func_80853754, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_bottle_bug_out);
+ } else if ((bottleAction > PLAYER_BOTTLE_EMPTY) && (bottleAction < PLAYER_BOTTLE_POE)) {
+ func_80831760(play, this, func_80853850, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_bottle_fish_out);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE];
+ } else {
+ func_80831760(play, this, func_80853194, 0);
+ func_8082E4A4(play, this,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_drinkstart
+ : &gPlayerAnim_link_bottle_drink_demo_start);
+ }
+ } else {
+ Actor* actorUnkA90 = this->unk_A90;
+
+ if ((actorUnkA90 == NULL) || (actorUnkA90->id == ACTOR_EN_ZOT) ||
+ (actorUnkA90->csId == CS_ID_NONE)) {
+ if (!func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA])) {
+ return false;
+ }
+ } else {
+ this->csId = CS_ID_NONE;
+ }
+ func_80831760(play, this, func_8085269C, 0);
+ if ((this->skelAnime.playSpeed < 0.0f) ||
+ ((this->skelAnime.animation != D_8085D17C[this->transformation]) &&
+ (this->skelAnime.animation != D_8085D190[this->transformation]))) {
+ func_8082DB90(play, this, D_8085D17C[this->transformation]);
+ }
+ this->stateFlags2 |= PLAYER_STATE2_8000000;
+ if (actorUnkA90 != NULL) {
+ this->actor.flags |= ACTOR_FLAG_20000000;
+ if (actorUnkA90->id == ACTOR_EN_ZOT) {
+ this->unk_A94 = -1.0f;
+ } else {
+ actorUnkA90->flags |= ACTOR_FLAG_20000000;
+ }
+ }
+ }
+ }
+ } else {
+ if (func_8083868C(play, this) != CAM_MODE_NORMAL) {
+ Player_StopCutscene(this);
+ if (!(this->stateFlags1 & PLAYER_STATE1_800000)) {
+ Player_SetAction(play, this, func_8084E724, 1);
+ this->unk_AE8 = 13;
+ func_80836D8C(this);
+ if (this->unk_AA5 == PLAYER_UNKAA5_2) {
+ play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON;
+ }
+ }
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ Player_StopHorizontalMovement(this);
+ return true;
+ }
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ play_sound(NA_SE_SY_ERROR);
+ return false;
+ }
+ this->stateFlags1 |= (PLAYER_STATE1_20000000 | PLAYER_STATE1_10000000);
+ func_8082DAD4(this);
+ }
+ return true;
+ }
+ return false;
+}
+
+s32 func_808391D8(Player* this, PlayState* play) {
+ if (gSaveContext.save.saveInfo.playerData.health != 0) {
+ Actor* talkActor = this->talkActor;
+ Actor* targetedActor = this->targetedActor;
+ Actor* var_a1 = NULL;
+ s32 var_t1 = false;
+ s32 var_t2 = false;
+
+ if (this->tatlActor != NULL) {
+ var_t2 =
+ (targetedActor != NULL) && (CHECK_FLAG_ALL(targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000) ||
+ (targetedActor->hintId != TATL_HINT_ID_NONE));
+
+ if (var_t2 || (this->tatlTextId != 0)) {
+ //! @bug The comparison `((ABS_ALT(this->tatlTextId) & 0xFF00) != 0x10000)` always evaluates to `true`
+ var_t1 = (this->tatlTextId < 0) && ((ABS_ALT(this->tatlTextId) & 0xFF00) != 0x10000);
+
+ if (var_t1 || !var_t2) {
+ var_a1 = this->tatlActor;
+ if (var_t1) {
+ targetedActor = NULL;
+ talkActor = NULL;
+ }
+ } else {
+ var_a1 = targetedActor;
+ }
+ }
+ }
+
+ if ((talkActor != NULL) || (var_a1 != NULL)) {
+ if ((targetedActor == NULL) || (targetedActor == talkActor) || (targetedActor == var_a1)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800) ||
+ ((this->heldActor != NULL) &&
+ (var_t1 || (talkActor == this->heldActor) || (var_a1 == this->heldActor) ||
+ ((talkActor != NULL) && (talkActor->flags & ACTOR_FLAG_10000))))) {
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 & PLAYER_STATE1_800000) || func_801242B4(this))) {
+ if (talkActor != NULL) {
+ if ((targetedActor == NULL) || (targetedActor == talkActor)) {
+ this->stateFlags2 |= PLAYER_STATE2_2;
+ }
+
+ if (!CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ return false;
+ }
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) ||
+ (talkActor->flags & ACTOR_FLAG_10000)) {
+ var_a1 = NULL;
+ } else if (var_a1 == NULL) {
+ return false;
+ }
+ }
+
+ if (var_a1 != NULL) {
+ if (!var_t1) {
+ this->stateFlags2 |= PLAYER_STATE2_200000;
+ if (!CutsceneManager_IsNext(CS_ID_GLOBAL_TALK) ||
+ !CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_CUP)) {
+ return false;
+ }
+ }
+
+ talkActor = var_a1;
+ this->talkActor = NULL;
+
+ if (var_t1 || !var_t2) {
+ var_a1->textId = ABS_ALT(this->tatlTextId);
+ } else if (var_a1->hintId != 0xFF) {
+ var_a1->textId = var_a1->hintId + 0x1900;
+ }
+ }
+
+ this->currentMask = D_80862B2C;
+ gSaveContext.save.equippedMask = this->currentMask;
+ Player_TalkWithPlayer(play, talkActor);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_80839518(Player* this, PlayState* play) {
+ if (this->unk_AA5 != PLAYER_UNKAA5_0) {
+ func_80838A90(this, play);
+ return true;
+ } else if ((this->targetedActor != NULL) &&
+ (CHECK_FLAG_ALL(this->targetedActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000) ||
+ (this->targetedActor->hintId != TATL_HINT_ID_NONE))) {
+ this->stateFlags2 |= PLAYER_STATE2_200000;
+ } else if ((this->tatlTextId == 0) && !func_80123420(this) &&
+ CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_CUP) &&
+ !func_80831814(this, play, PLAYER_UNKAA5_1)) {
+ play_sound(NA_SE_SY_ERROR);
+ }
+ return false;
+}
+
+// Jumpslash/Jumpkick start
+void func_808395F0(PlayState* play, Player* this, PlayerMeleeWeaponAnimation meleeWeaponAnim, f32 linearVelocity,
+ f32 yVelocity) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ linearVelocity *= 1.1f;
+ meleeWeaponAnim = PLAYER_MWA_ZORA_JUMPKICK_START;
+ yVelocity *= 0.9f;
+ }
+
+ func_80833864(play, this, meleeWeaponAnim);
+ Player_SetAction(play, this, func_8084CB58, 0);
+ this->stateFlags3 |= PLAYER_STATE3_2;
+ this->linearVelocity = linearVelocity;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.velocity.y = yVelocity;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Player_AnimSfx_PlayFloorJump(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_L);
+}
+
+s32 func_808396B8(PlayState* play, Player* this) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_400000) &&
+ (((this->actor.id != ACTOR_PLAYER) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) ||
+ ((Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) &&
+ ((this->transformation != PLAYER_FORM_GORON) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) &&
+ ((this->transformation != PLAYER_FORM_ZORA) || !(this->stateFlags1 & PLAYER_STATE1_2000000)) &&
+ (D_80862B48 != 0)))) {
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80839770(Player* this, PlayState* play) {
+ if (func_808396B8(play, this)) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (sPlayerCurrentFloorType != FLOOR_TYPE_7)) {
+ func_808395F0(play, this,
+ (this->transformation == PLAYER_FORM_ZORA) ? PLAYER_MWA_ZORA_JUMPKICK_START
+ : PLAYER_MWA_JUMPSLASH_START,
+ 3.0f, 4.5f);
+ return true;
+ }
+ }
+ return false;
+}
+
+s32 func_80839800(Player* this, PlayState* play) {
+ if ((this->unk_AE3[this->unk_ADE] == 0) && (sPlayerCurrentFloorType != FLOOR_TYPE_7)) {
+ func_80836B3C(play, this, 0.0f);
+ return true;
+ }
+ return false;
+}
+
+void func_80839860(Player* this, PlayState* play, s32 arg2) {
+ s32 pad;
+ f32 speed = (!(arg2 & 1) ? 5.8f : 3.5f);
+
+ if (this->currentBoots == PLAYER_BOOTS_GIANT) {
+ speed /= 2.0f;
+ }
+
+ //! FAKE
+ if (arg2 == 2) {}
+
+ func_80834D50(play, this, D_8085C2A4[arg2].unk_0, speed, NA_SE_VO_LI_SWORD_N);
+
+ this->unk_AE8 = 1;
+ this->unk_AE7 = arg2;
+
+ this->currentYaw = this->actor.shape.rot.y + (arg2 << 0xE);
+ this->linearVelocity = !(arg2 & 1) ? 6.0f : 8.5f;
+
+ this->stateFlags2 |= PLAYER_STATE2_80000;
+ Player_PlaySfx(this, ((arg2 << 0xE) == 0x8000) ? NA_SE_PL_ROLL : NA_SE_PL_SKIP);
+}
+
+void func_80839978(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->itemAction = PLAYER_IA_OCARINA;
+ func_80831760(play, this, func_8084AC84, 0);
+ func_8082DB60(play, this, &gPlayerAnim_clink_normal_okarina_walk);
+ func_8082E920(play, this, ANIM_FLAG_4 | ANIM_FLAG_200);
+ this->stateFlags3 |= PLAYER_STATE3_20000000;
+ this->unk_B48 = this->linearVelocity;
+ Audio_PlayFanfare(NA_BGM_BREMEN_MARCH);
+ }
+}
+
+void func_80839A10(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->itemAction = PLAYER_IA_NONE;
+ func_80831760(play, this, func_8084AEEC, 0);
+ func_8082DB60(play, this, &gPlayerAnim_alink_dance_loop);
+ this->stateFlags2 |= PLAYER_STATE2_2000000;
+ Audio_PlayFanfare(NA_BGM_KAMARO_DANCE);
+ }
+}
+
+s32 func_80839A84(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ if (func_80836DC0(play, this)) {
+ return true;
+ }
+ } else {
+ return false;
+ }
+
+ Player_SetAction(play, this, func_808573A4, 0);
+ this->stateFlags1 &= ~(PLAYER_STATE1_20000 | PLAYER_STATE1_40000000);
+ this->unk_ADC = 4;
+ func_808373A4(play, this);
+ return true;
+}
+
+s32 func_80839B18(Player* this, PlayState* play) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) &&
+ (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && (sPlayerCurrentFloorType != FLOOR_TYPE_7) &&
+ (D_80862B40 != FLOOR_EFFECT_1)) {
+ s32 temp_a2 = this->unk_AE3[this->unk_ADE];
+
+ if (temp_a2 <= 0) {
+ if (func_8082FBE8(this)) {
+ if (this->actor.category != ACTORCAT_PLAYER) {
+ if (temp_a2 < 0) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, REG(69) / 100.0f, play);
+ } else {
+ func_80836B3C(play, this, 0.0f);
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) && func_80832090(this) &&
+ (this->transformation != PLAYER_FORM_GORON)) {
+ func_808395F0(play, this, PLAYER_MWA_JUMPSLASH_START, 5.0f, 5.0f);
+ } else if (!func_80839A84(play, this)) {
+ func_80836B3C(play, this, 0.0f);
+ }
+
+ return true;
+ }
+ } else {
+ func_80839860(this, play, temp_a2);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void func_80839CD8(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+ f32 var_fv0 = this->unk_B38 - 3.0f;
+
+ if (var_fv0 < 0.0f) {
+ var_fv0 += 29.0f;
+ }
+
+ if (var_fv0 < 14.0f) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_17][this->modelAnimType];
+ var_fv0 = 11.0f - var_fv0;
+ if (var_fv0 < 0.0f) {
+ var_fv0 = -var_fv0 * 1.375f;
+ }
+ var_fv0 = var_fv0 / 11.0f;
+ } else {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_18][this->modelAnimType];
+ var_fv0 = 26.0f - var_fv0;
+ if (var_fv0 < 0.0f) {
+ var_fv0 = -var_fv0 * 2;
+ }
+ var_fv0 = var_fv0 / 12.0f;
+ }
+
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ 4.0f * var_fv0);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80839E3C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ func_80839CD8(this, play);
+}
+
+void func_80839E74(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80839ED0(Player* this, PlayState* play) {
+ if (!(this->stateFlags3 & PLAYER_STATE3_80) && (func_80852B28 != this->actionFunc) && !func_8083213C(this)) {
+ func_80836D8C(this);
+ if (!(this->stateFlags1 & PLAYER_STATE1_40)) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ } else {
+ func_80836988(this, play);
+ }
+ }
+ if (this->unk_AA5 < PLAYER_UNKAA5_5) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+ }
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000);
+}
+
+s32 func_80839F98(PlayState* play, Player* this) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ if (this->linearVelocity != 0.0f) {
+ func_80836B3C(play, this, 0.0f);
+ return true;
+ }
+ func_80836AD8(play, this);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pg_maru_change, 2.0f / 3.0f, 0.0f, 7.0f,
+ ANIMMODE_ONCE, 0.0f);
+ return true;
+ }
+ return false;
+}
+
+// Toggles swimming/walking underwater as Zora
+void func_8083A04C(Player* this) {
+ if (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ }
+ if (func_808508C8 == this->actionFunc) {
+ this->unk_AE8 = 20;
+ }
+ } else {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_UNDERWATER;
+ }
+ }
+}
+
+s32 func_8083A0CC(Player* this, PlayState* play) {
+ if (!D_80862B04 && (this->transformation == PLAYER_FORM_ZORA)) {
+ func_8083A04C(this);
+ }
+ return false;
+}
+
+s32 func_8083A114(Player* this, PlayState* play) {
+ if (!D_80862B04 && !(this->stateFlags1 & PLAYER_STATE1_800000) && !func_8082FB68(this)) {
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ func_8083A04C(this);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) && !func_8082FB68(this)) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ if (func_80839F98(play, this)) {
+ return true;
+ }
+ } else if (func_80839A84(play, this) || func_80839800(this, play)) {
+ return true;
+ }
+
+ if ((this->putAwayCountdown == 0) && (this->heldItemAction >= PLAYER_IA_SWORD_KOKIRI) &&
+ (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ func_80831990(play, this, ITEM_NONE);
+ } else {
+ this->stateFlags2 ^= PLAYER_STATE2_100000;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083A274(Player* this, PlayState* play) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R) && (this->unk_AA5 == PLAYER_UNKAA5_0) &&
+ (play->unk_1887C == 0)) {
+ if (Player_IsGoronOrDeku(this) ||
+ ((((this->transformation == PLAYER_FORM_ZORA) && !(this->stateFlags1 & PLAYER_STATE1_2000000)) ||
+ ((this->transformation == PLAYER_FORM_HUMAN) && (this->currentShield != PLAYER_SHIELD_NONE))) &&
+ !func_80123434(this) && (this->targetedActor == NULL))) {
+ func_8082DC38(this);
+ func_8082DCA0(play, this);
+ if (Player_SetAction(play, this, func_8084B5C0, 0)) {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ if (this->transformation != PLAYER_FORM_GORON) {
+ PlayerAnimationHeader* anim;
+ f32 endFrame;
+
+ if (!Player_IsGoronOrDeku(this)) {
+ Player_SetModelsForHoldingShield(this);
+ anim = D_8085BE84[PLAYER_ANIMGROUP_19][this->modelAnimType];
+ } else {
+ anim = (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_gurd
+ : &gPlayerAnim_clink_normal_defense_ALL;
+ }
+
+ if (anim != this->skelAnime.animation) {
+ if (func_80123420(this)) {
+ this->unk_B3C = 1.0f;
+ } else {
+ this->unk_B3C = 0.0f;
+ func_8082FC60(this);
+ }
+ this->upperLimbRot.x = 0;
+ this->upperLimbRot.y = 0;
+ this->upperLimbRot.z = 0;
+ }
+
+ endFrame = Animation_GetLastFrame(anim);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f,
+ (anim == &gPlayerAnim_pn_gurd) ? 0.0f : endFrame, endFrame, ANIMMODE_ONCE,
+ 0.0f);
+ }
+ func_80830AE8(this);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083A4A4(Player* this, f32* arg1, s16* arg2, f32 arg3) {
+ s16 yaw = this->currentYaw - *arg2;
+
+ if (ABS_ALT(yaw) > 0x6000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, arg3)) {
+ *arg1 = 0.0f;
+ *arg2 = this->currentYaw;
+ } else {
+ return true;
+ }
+ }
+ return false;
+}
+
+void func_8083A548(Player* this) {
+ if ((this->unk_ADC > 0) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ this->unk_ADC = -this->unk_ADC;
+ }
+}
+
+s32 func_8083A580(Player* this, PlayState* play) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_400000) &&
+ (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)) {
+ if ((this->unk_ADC > 0) && (((this->transformation == PLAYER_FORM_ZORA)) ||
+ ((this->unk_ADC == 1) && (this->heldItemAction != PLAYER_IA_STICK)))) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80830E30(this, play);
+ } else {
+ func_808335B0(play, this);
+ }
+ return true;
+ }
+ }
+ } else {
+ func_8083A548(this);
+ }
+ return false;
+}
+
+s32 func_8083A658(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ Player_SetAction(play, this, func_80852B28, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_light_bom);
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ return true;
+ }
+ return false;
+}
+
+struct_8085D200 D_8085D200[] = {
+ { &gPlayerAnim_link_bottle_bug_miss, &gPlayerAnim_link_bottle_bug_in, 2, 3 },
+ { &gPlayerAnim_link_bottle_fish_miss, &gPlayerAnim_link_bottle_fish_in, 5, 3 },
+};
+
+s32 func_8083A6C0(PlayState* play, Player* this) {
+ if (D_80862B48 != 0) {
+ if (Player_GetBottleHeld(this) > PLAYER_BOTTLE_NONE) {
+ Player_SetAction(play, this, func_808534C0, 0);
+ if (this->actor.depthInWater > 12.0f) {
+ this->unk_AE8 = 1;
+ }
+ func_8082DB90(play, this, D_8085D200[this->unk_AE8].unk_0);
+ Player_PlaySfx(this, NA_SE_IT_SWORD_SWING);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
+void func_8083A794(Player* this, PlayState* play) {
+ if ((func_8084AF9C != this->actionFunc) && (func_8084B0EC != this->actionFunc)) {
+ this->unk_B70 = 0;
+ this->unk_B34 = 0.0f;
+ this->unk_B38 = 0.0f;
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_2][this->modelAnimType]);
+ }
+
+ Player_SetAction(play, this, func_8082FBE8(this) ? func_8084B0EC : func_8084AF9C, 1);
+}
+
+void func_8083A844(Player* this, PlayState* play, s16 currentYaw) {
+ this->currentYaw = currentYaw;
+ this->actor.shape.rot.y = this->currentYaw;
+ func_8083A794(this, play);
+}
+
+s32 func_8083A878(PlayState* play, Player* this, f32 arg2) {
+ WaterBox* waterBox;
+ f32 ySurface = this->actor.world.pos.y;
+
+ if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &ySurface,
+ &waterBox)) {
+ ySurface -= this->actor.world.pos.y;
+ if (this->ageProperties->unk_24 <= ySurface) {
+ Player_SetAction(play, this, func_80850B18, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ this->stateFlags1 |= (PLAYER_STATE1_8000000 | PLAYER_STATE1_20000000);
+ this->unk_AE8 = 20;
+ this->linearVelocity = 2.0f;
+ func_80123140(play, this);
+ return false;
+ }
+ }
+ func_80835324(play, this, arg2, this->actor.shape.rot.y);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ return true;
+}
+
+/**
+ * Update for using telescopes. SCENE_AYASHIISHOP acts quite differently: it has a different camera mode and cannot use
+ * zooming.
+ *
+ * - Stick inputs move the view; shape.rot.y is used as a base position which cannot be looked too far away from. (This
+ * is not necessarily the same as the original angle of the spawn.)
+ * - A can be used to zoom (except in SCENE_AYASHIISHOP)
+ * - B exits, using the RESPAWN_MODE_DOWN entrance
+ */
+void func_8083A98C(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ Player* this = THIS;
+ s32 camMode;
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ return;
+ }
+
+ if (DECR(this->unk_AE8) != 0) {
+ camMode = (play->sceneId != SCENE_AYASHIISHOP) ? CAM_MODE_FIRSTPERSON : CAM_MODE_DEKUHIDE;
+
+ // Show controls overlay. SCENE_AYASHIISHOP does not have Zoom, so has a different one.
+ if (this->unk_AE8 == 1) {
+ Message_StartTextbox(play, (play->sceneId == SCENE_AYASHIISHOP) ? 0x2A00 : 0x5E6, NULL);
+ }
+ } else {
+ sPlayerControlInput = play->state.input;
+ if (play->view.fovy >= 25.0f) {
+ s16 prevFocusX = thisx->focus.rot.x;
+ s16 prevFocusY = thisx->focus.rot.y;
+ s16 inputY;
+ s16 inputX;
+ s16 newYaw; // from base position shape.rot.y
+
+ // Pitch:
+ inputY = sPlayerControlInput->rel.stick_y * 4;
+ // Add input, clamped to prevent turning too fast
+ thisx->focus.rot.x += CLAMP(inputY, -0x12C, 0x12C);
+ // Prevent looking too far up or down
+ thisx->focus.rot.x = CLAMP(thisx->focus.rot.x, -0x2EE0, 0x2EE0);
+
+ // Yaw: shape.rot.y is used as a fixed starting position
+ inputX = sPlayerControlInput->rel.stick_x * -4;
+ // Start from current position: no input -> no change
+ newYaw = thisx->focus.rot.y - thisx->shape.rot.y;
+ // Add input, clamped to prevent turning too fast
+ newYaw += CLAMP(inputX, -0x12C, 0x12C);
+ // Prevent looking too far left or right of base position
+ newYaw = CLAMP(newYaw, -0x3E80, 0x3E80);
+ thisx->focus.rot.y = thisx->shape.rot.y + newYaw;
+
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ f32 focusDeltaX = (s16)(thisx->focus.rot.x - prevFocusX);
+ f32 focusDeltaY = (s16)(thisx->focus.rot.y - prevFocusY);
+
+ func_8019FAD8(&gSfxDefaultPos, NA_SE_PL_TELESCOPE_MOVEMENT - SFX_FLAG,
+ sqrtf(SQ(focusDeltaX) + SQ(focusDeltaY)) / 300.0f);
+ }
+ }
+
+ if (play->sceneId == SCENE_AYASHIISHOP) {
+ camMode = CAM_MODE_DEKUHIDE;
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) { // Zoom
+ camMode = CAM_MODE_TARGET;
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ }
+
+ // Exit
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ Message_CloseTextbox(play);
+
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = ENTRANCE(ASTRAL_OBSERVATORY, 2);
+ } else {
+ u16 entrance;
+
+ if (play->sceneId == SCENE_AYASHIISHOP) {
+ entrance = ENTRANCE(CURIOSITY_SHOP, 3);
+ } else {
+ entrance = ENTRANCE(PIRATES_FORTRESS_INTERIOR, 8);
+ }
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = entrance;
+ }
+
+ func_80169EFC(&play->state);
+ gSaveContext.respawnFlag = -2;
+ play->transitionType = TRANS_TYPE_CIRCLE;
+ }
+ }
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_TELESCOPE);
+ Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), camMode);
+}
+
+// Set up using a telescope
+void Player_InitMode_Telescope(PlayState* play, Player* this) {
+ this->actor.update = func_8083A98C;
+ this->actor.draw = NULL;
+ if (play->sceneId == SCENE_00KEIKOKU) {
+ this->actor.focus.rot.x = 0xBD8;
+ this->actor.focus.rot.y = -0x4D74;
+ this->unk_AE8 = 20;
+ } else if (play->sceneId == SCENE_AYASHIISHOP) {
+ this->actor.focus.rot.x = 0x9A6;
+ this->actor.focus.rot.y = 0x2102;
+ this->unk_AE8 = 2;
+ } else {
+ this->actor.focus.rot.x = 0x9A6;
+ this->actor.focus.rot.y = 0x2102;
+ this->unk_AE8 = 20;
+ }
+ play->actorCtx.flags |= ACTORCTX_FLAG_1;
+}
+
+void Player_InitMode_B(PlayState* play, Player* this) {
+ func_8085B384(this, play);
+}
+
+void Player_InitMode_D(PlayState* play, Player* this) {
+ if (func_8083A878(play, this, 180.0f)) {
+ this->unk_AE8 = -20;
+ }
+}
+
+// InitModes 0xA and 0xE
+void func_8083ADF0(PlayState* play, Player* this) {
+ this->linearVelocity = 2.0f;
+ gSaveContext.entranceSpeed = 2.0f;
+
+ if (func_8083A878(play, this, 120.0f)) {
+ this->unk_AE8 = -15;
+ }
+}
+
+void Player_InitMode_F(PlayState* play, Player* this) {
+ if (gSaveContext.entranceSpeed < 0.1f) {
+ gSaveContext.entranceSpeed = 0.1f;
+ }
+
+ this->linearVelocity = gSaveContext.entranceSpeed;
+ if (func_8083A878(play, this, 800.0f)) {
+ this->unk_AE8 = -80.0f / this->linearVelocity;
+ if (this->unk_AE8 < -20) {
+ this->unk_AE8 = -20;
+ }
+ }
+}
+
+void func_8083AECC(Player* this, s16 currentYaw, PlayState* play) {
+ Player_SetAction(play, this, func_8084A5C0, 1);
+ PlayerAnimation_CopyJointToMorph(play, &this->skelAnime);
+ this->unk_B38 = 0.0f;
+ this->unk_B34 = 0.0f;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083AF30(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A26C, 1);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType]);
+}
+
+void func_8083AF8C(Player* this, s16 currentYaw, PlayState* play) {
+ Player_SetAction(play, this, func_8084B288, 1);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_walk, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_anchor_back_walk), ANIMMODE_ONCE, -6.0f);
+ this->linearVelocity = 8.0f;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083B030(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A8E8, 1);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_24][this->modelAnimType]);
+ this->unk_B38 = 0.0f;
+}
+
+void func_8083B090(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084B3B8, 1);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, &gPlayerAnim_link_anchor_back_brake, 6.0f / 3.0f);
+}
+
+void func_8083B0E4(PlayState* play, Player* this, s16 currentYaw) {
+ this->currentYaw = currentYaw;
+ Player_SetAction(play, this, func_8084AB4C, 1);
+ this->unk_B4E = 1200;
+ this->unk_B4E *= D_8085C3E4;
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType], 1.0f, 0.0f,
+ 0.0f, ANIMMODE_LOOP, -6.0f);
+}
+
+void func_8083B1A0(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim;
+
+ Player_SetAction(play, this, func_80849FE0, 1);
+ if (this->unk_B40 < 0.5f) {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_27][this->modelAnimType];
+ } else {
+ anim = D_8085BE84[PLAYER_ANIMGROUP_26][this->modelAnimType];
+ }
+ Player_AnimationPlayOnce(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8083B23C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849A9C, 1);
+ func_8082E438(play, this, D_8085BE84[PLAYER_ANIMGROUP_6][this->modelAnimType]);
+ this->unk_AE8 = 1;
+}
+
+void func_8083B29C(Player* this, PlayState* play) {
+ if (this->linearVelocity != 0.0f) {
+ func_8083A794(this, play);
+ } else {
+ func_8083B1A0(this, play);
+ }
+}
+
+void func_8083B2E4(Player* this, PlayState* play) {
+ if (this->linearVelocity != 0.0f) {
+ func_8083A794(this, play);
+ } else {
+ func_80836988(this, play);
+ }
+}
+
+void func_8083B32C(PlayState* play, Player* this, f32 arg2) {
+ this->stateFlags1 |= PLAYER_STATE1_40000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ func_8082DC64(play, this);
+
+ if (func_80837730(play, this, arg2, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_JUMP_OUT_WATER);
+ }
+ func_80123140(play, this);
+}
+
+s32 func_8083B3B4(PlayState* play, Player* this, Input* input) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_400) && !(this->stateFlags2 & PLAYER_STATE2_400) &&
+ (this->transformation != PLAYER_FORM_ZORA)) &&
+ ((input == NULL) ||
+ ((((this->interactRangeActor == NULL) || (this->interactRangeActor->id != ACTOR_EN_ZOG)) &&
+ CHECK_BTN_ALL(input->press.button, BTN_A)) &&
+ ((ABS_ALT(this->unk_AAA) < 0x2EE0) && (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ ((s32)SurfaceType_GetConveyorSpeed(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) <=
+ CONVEYOR_SPEED_SLOW))))) {
+ if (func_8085B08C != this->actionFunc) {
+ Player_SetAction(play, this, func_808516B4, 0);
+ }
+
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_swimer_swim_deep_start);
+ this->unk_AAA = 0;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->actor.velocity.y = 0.0f;
+ if (input != NULL) {
+ this->stateFlags2 |= PLAYER_STATE2_800;
+ Player_PlaySfx(this, NA_SE_PL_DIVE_BUBBLE);
+ }
+
+ return true;
+ }
+
+ if ((this->transformation != PLAYER_FORM_DEKU) &&
+ ((this->stateFlags1 & PLAYER_STATE1_400) ||
+ ((this->stateFlags2 & PLAYER_STATE2_400) &&
+ (((func_80850D68 != this->actionFunc) && !(this->stateFlags3 & PLAYER_STATE3_8000)) ||
+ (this->unk_AAA < -0x1555)))) &&
+ ((this->actor.depthInWater - this->actor.velocity.y) < this->ageProperties->unk_30)) {
+ s32 temp_v0_3;
+ s16 sp2A;
+ f32 sp24;
+
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ func_8082DC64(play, this);
+ temp_v0_3 = func_80837730(play, this, this->actor.velocity.y, 0x1F4);
+ if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ sp2A = this->unk_B86[1];
+ sp24 = this->unk_B48 * 1.5f;
+ Player_SetAction(play, this, func_8084CA24, 1);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ sp24 = CLAMP_MAX(sp24, 13.5f);
+ this->linearVelocity = Math_CosS(this->unk_AAA) * sp24;
+ this->actor.velocity.y = -Math_SinS(this->unk_AAA) * sp24;
+ this->unk_B86[1] = sp2A;
+ Player_PlaySfx(this, NA_SE_EV_JUMP_OUT_WATER);
+ return true;
+ }
+
+ if (temp_v0_3) {
+ Player_PlaySfx(this, NA_SE_PL_FACE_UP);
+ } else {
+ Player_PlaySfx(this, NA_SE_PL_FACE_UP);
+ }
+
+ if (input != NULL) {
+ Player_SetAction(play, this, func_808519FC, 1);
+ if (this->stateFlags1 & PLAYER_STATE1_400) {
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ }
+ this->unk_AE8 = 2;
+ }
+
+ func_8082E438(play, this,
+ (this->stateFlags1 & PLAYER_STATE1_800) ? &gPlayerAnim_link_swimer_swim_get
+ : &gPlayerAnim_link_swimer_swim_deep_end);
+ return true;
+ }
+
+ return false;
+}
+
+void func_8083B73C(PlayState* play, Player* this, s16 currentYaw) {
+ Player_SetAction(play, this, func_808513EC, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ this->actor.shape.rot.y = currentYaw;
+ this->currentYaw = currentYaw;
+}
+
+void func_8083B798(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ Player_SetAction(play, this, func_808513EC, 0);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim, 1.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim), 0.0f, ANIMMODE_LOOP, 0.0f);
+ this->unk_B48 = 2.0f;
+ } else {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim);
+ this->unk_AE8 = 1;
+ }
+
+ this->unk_AAA = 0x3E80;
+}
+
+void func_8083B850(PlayState* play, Player* this) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ this->prevBoots = PLAYER_BOOTS_ZORA_LAND;
+ Player_SetAction(play, this, func_80850D68, 0);
+ this->unk_B48 = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y));
+ Player_OverrideBlureColors(play, this, 1, 8);
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ this->prevBoots = PLAYER_BOOTS_ZORA_LAND;
+}
+
+void func_8083B8D0(PlayState* play, Player* this) {
+ if (func_80837730(play, this, this->actor.velocity.y, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_DIVE_INTO_WATER);
+ if (this->fallDistance > 800) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+ }
+}
+
+void func_8083B930(PlayState* play, Player* this) {
+ PlayerAnimationHeader* var_a2;
+
+ if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) || !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (func_80857BE8 == this->actionFunc)) {
+ func_8082DE50(play, this);
+
+ if (func_8084CA24 == this->actionFunc) {
+ func_8083B850(play, this);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ } else if ((this->transformation == PLAYER_FORM_ZORA) && (func_8084C94C == this->actionFunc)) {
+ func_8083B850(play, this);
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ } else if ((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) && (this->stateFlags2 & PLAYER_STATE2_400)) {
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ func_8083B3B4(play, this, NULL);
+ this->unk_AE7 = 1;
+ } else if (func_8084C94C == this->actionFunc) {
+ Player_SetAction(play, this, func_808516B4, 0);
+ func_8083B798(play, this);
+ } else {
+ Player_SetAction(play, this, func_808508C8, 1);
+ func_8082E438(play, this,
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ? &gPlayerAnim_link_swimer_wait2swim_wait
+ : &gPlayerAnim_link_swimer_land2swim_wait);
+ }
+ }
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->actor.depthInWater < this->ageProperties->unk_2C)) {
+ func_8083B8D0(play, this);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_8000000;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+
+ this->unk_AEC = 0.0f;
+ func_80123140(play, this);
+}
+
+void func_8083BB4C(PlayState* play, Player* this) {
+ f32 sp1C = this->actor.depthInWater - this->ageProperties->unk_2C;
+
+ if (sp1C < 0.0f) {
+ this->underwaterTimer = 0;
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ this->currentBoots = PLAYER_BOOTS_ZORA_LAND;
+ }
+ func_801A3E38(0);
+ } else {
+ func_801A3E38(0x20);
+ if ((this->transformation == PLAYER_FORM_ZORA) || (sp1C < 10.0f)) {
+ this->underwaterTimer = 0;
+ } else if (this->underwaterTimer < 300) {
+ this->underwaterTimer++;
+ }
+ }
+
+ if ((this->actor.parent == NULL) && (func_8084D4EC != this->actionFunc) && (func_8084F3DC != this->actionFunc) &&
+ ((func_8084CA24 != this->actionFunc) || (this->actor.velocity.y < -2.0f))) {
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ func_80834140(play, this, &gPlayerAnim_link_swimer_swim_down);
+ func_808345C8();
+ func_8083B8D0(play, this);
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ if (this->remainingHopsCounter != 0) {
+ func_808373F8(play, this, NA_SE_VO_LI_AUTO_JUMP);
+ } else {
+ if ((play->sceneId == SCENE_20SICHITAI) && (this->unk_3CF == 0)) {
+ if (CHECK_EVENTINF(EVENTINF_50)) {
+ play->nextEntrance = ENTRANCE(TOURIST_INFORMATION, 2);
+ } else {
+ play->nextEntrance = ENTRANCE(TOURIST_INFORMATION, 1);
+ }
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ this->stateFlags1 |= PLAYER_STATE1_200;
+ play_sound(NA_SE_SY_DEKUNUTS_JUMP_FAILED);
+ } else if ((this->unk_3CF == 0) &&
+ ((play->sceneId == SCENE_30GYOSON) || (play->sceneId == SCENE_31MISAKI) ||
+ (play->sceneId == SCENE_TORIDE))) {
+ func_80169EFC(&play->state);
+ func_808345C8();
+ } else {
+ Player_SetAction(play, this, func_808497A0, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ }
+ func_8083B8D0(play, this);
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) ||
+ (((this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) &&
+ (func_8084E724 != this->actionFunc) && (func_80851B58 != this->actionFunc) &&
+ (func_80851BD4 != this->actionFunc) && (func_808508C8 != this->actionFunc) &&
+ (func_808513EC != this->actionFunc) && (func_80851588 != this->actionFunc) &&
+ (func_808516B4 != this->actionFunc) && (func_808519FC != this->actionFunc) &&
+ (func_80850B18 != this->actionFunc) && (func_80850D68 != this->actionFunc))) {
+ func_8083B930(play, this);
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.depthInWater < this->ageProperties->unk_24) &&
+ (((func_80850D68 != this->actionFunc) && !(this->stateFlags3 & PLAYER_STATE3_8000)) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (this->skelAnime.moveFlags == 0) {
+ func_8083B0E4(play, this, this->actor.shape.rot.y);
+ }
+ func_8083B32C(play, this, this->actor.velocity.y);
+ }
+ }
+}
+
+void func_8083BF54(PlayState* play, Player* this) {
+ Vec3f sp84;
+ s32 temp_v0;
+ s32 var_a2;
+
+ this->actor.terminalVelocity = -20.0f;
+ this->actor.gravity = REG(68) / 100.0f;
+
+ var_a2 = false;
+ temp_v0 = func_808340D4(sPlayerCurrentFloorType);
+
+ if (temp_v0 ||
+ (((var_a2 = (sPlayerCurrentFloorType == FLOOR_TYPE_14) || (sPlayerCurrentFloorType == FLOOR_TYPE_15))) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_13))) {
+ f32 temp_fv1_2;
+ f32 var_fa1;
+ f32 var_ft4;
+ f32 var_fv0;
+ u16 sfxId;
+
+ var_ft4 = fabsf(this->linearVelocity + D_80862B3C) * 20.0f;
+ if (temp_v0) {
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_4) {
+ var_fa1 = 1300.0f;
+ } else if (sPlayerCurrentFloorType == FLOOR_TYPE_7) {
+ var_fa1 = 20000.0f;
+ var_ft4 = 0.0f;
+ } else {
+ var_fa1 = 10000.0f;
+ var_ft4 *= 1.6f;
+ }
+ sfxId = NA_SE_PL_SINK_ON_SAND - SFX_FLAG;
+ } else if (var_a2) {
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_14) {
+ var_fa1 = 400.0f;
+ var_ft4 *= 10.0f;
+ } else {
+ var_fa1 = 1300.0f;
+ var_ft4 = 0.0f;
+ }
+ sfxId = NA_SE_PL_SINK_ON_SNOW - SFX_FLAG;
+ } else {
+ var_fa1 = (this->transformation == PLAYER_FORM_GORON) ? 10000.0f : 1000.0f;
+ var_ft4 = 0.0f;
+ sfxId = NA_SE_PL_SINK_ON_SAND - SFX_FLAG;
+ }
+
+ var_fa1 = CLAMP_MIN(var_fa1, this->unk_AB8);
+
+ var_fv0 = (sPlayerCurrentFloorType == FLOOR_TYPE_14) ? 200.0f : (var_fa1 - this->unk_AB8) * 0.02f;
+ var_fv0 = CLAMP(var_fv0, 0.0f, 300.0f);
+
+ temp_fv1_2 = this->unk_AB8;
+ this->unk_AB8 += var_fv0 - var_ft4;
+ this->unk_AB8 = CLAMP(this->unk_AB8, 0.0f, var_fa1);
+
+ if ((this->linearVelocity == 0.0f) && (fabsf(this->unk_AB8 - temp_fv1_2) > 2.0f)) {
+ func_800B8F98(&this->actor, sfxId);
+ }
+
+ this->actor.gravity -= this->unk_AB8 * 0.004f;
+ } else {
+ this->unk_AB8 = 0.0f;
+ }
+
+ if ((this->stateFlags3 & PLAYER_STATE3_10) && (this->actor.bgCheckFlags & BGCHECKFLAG_WATER)) {
+ if (this->actor.depthInWater < 50.0f) {
+ f32 temp_fv1_5;
+ Vec3f* bodyPartsPos;
+ f32 var_fa0_3;
+ f32 var_ft4_2;
+
+ var_ft4_2 = fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].x - this->unk_D6C.x) +
+ fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].y - this->unk_D6C.y) +
+ fabsf(this->bodyPartsPos[PLAYER_BODYPART_WAIST].z - this->unk_D6C.z);
+ var_ft4_2 = CLAMP_MAX(var_ft4_2, 4.0f);
+
+ this->unk_AEC += var_ft4_2;
+ if (this->unk_AEC > 15.0f) {
+ this->unk_AEC = 0.0f;
+ sp84.x = (Rand_ZeroOne() * 10.0f) + this->actor.world.pos.x;
+ sp84.y = this->actor.world.pos.y + this->actor.depthInWater;
+ sp84.z = (Rand_ZeroOne() * 10.0f) + this->actor.world.pos.z;
+
+ EffectSsGRipple_Spawn(play, &sp84, 100, 500, 0);
+
+ if ((this->linearVelocity > 4.0f) && !func_801242B4(this) &&
+ ((this->actor.world.pos.y + this->actor.depthInWater) <
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y)) {
+ func_80837730(play, this, 20.0f,
+ (fabsf(this->linearVelocity) * 50.0f) + (this->actor.depthInWater * 5.0f));
+ } else if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ s32 i;
+
+ var_fa0_3 = (this->actor.world.pos.y + this->actor.depthInWater) - 5.0f;
+ bodyPartsPos = this->bodyPartsPos;
+
+ for (i = 0; i < PLAYER_BODYPART_MAX; i++, bodyPartsPos++) {
+ temp_fv1_5 = bodyPartsPos->y - var_fa0_3;
+
+ if (temp_fv1_5 > 0.0f) {
+ func_80837730(play, this, 20.0f,
+ fabsf(this->linearVelocity) * 20.0f + (temp_fv1_5 * 10.0f));
+ }
+ }
+ }
+ }
+ }
+
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ s32 numBubbles = 0;
+ s32 i;
+ f32 var_fv1;
+
+ var_fv1 = (this->stateFlags1 & PLAYER_STATE1_4000000)
+ ? -fabsf(this->linearVelocity)
+ : ((func_80850D68 == this->actionFunc)
+ ? (ABS_ALT(this->unk_B8A) * -0.004f) + (this->unk_B48 * -0.38f)
+ : this->actor.velocity.y);
+
+ if ((var_fv1 > -1.0f) || ((this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ if (Rand_ZeroOne() < 0.2f) {
+ numBubbles = 1;
+ }
+ } else {
+ numBubbles = var_fv1 * -0.3f;
+ if (numBubbles > 8) {
+ numBubbles = 8;
+ }
+ }
+
+ for (i = 0; i < numBubbles; i++) {
+ EffectSsBubble_Spawn(play, &this->actor.world.pos, 20.0f, 10.0f, 20.0f, 0.13f);
+ }
+ }
+ }
+}
+
+s32 func_8083C62C(Player* this, s32 arg1) {
+ Actor* targetedActor = this->targetedActor;
+ Vec3f headPos;
+ s16 pitchTarget;
+ s16 yawTarget;
+
+ headPos.x = this->actor.world.pos.x;
+ headPos.y = this->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f;
+ headPos.z = this->actor.world.pos.z;
+
+ pitchTarget = Math_Vec3f_Pitch(&headPos, &targetedActor->focus.pos);
+ yawTarget = Math_Vec3f_Yaw(&headPos, &targetedActor->focus.pos);
+
+ Math_SmoothStepToS(&this->actor.focus.rot.y, yawTarget, 4, 0x2710, 0);
+ Math_SmoothStepToS(&this->actor.focus.rot.x, pitchTarget, 4, 0x2710, 0);
+
+ this->unk_AA6 |= 2;
+
+ return func_80832754(this, arg1);
+}
+
+Vec3f D_8085D218 = { 0.0f, 100.0f, 40.0f };
+
+void func_8083C6E8(Player* this, PlayState* play) {
+ if (this->targetedActor != NULL) {
+ if (func_800B7128(this) || func_8082EF20(this)) {
+ func_8083C62C(this, true);
+ } else {
+ func_8083C62C(this, false);
+ }
+ return;
+ }
+
+ if (sPlayerCurrentFloorType == FLOOR_TYPE_11) {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, -20000, 10, 4000, 800);
+ } else {
+ s16 sp46 = 0;
+ f32 yIntersect;
+ Vec3f pos;
+ s16 temp_v0;
+
+ yIntersect = func_80835D2C(play, this, &D_8085D218, &pos);
+ if (yIntersect > BGCHECK_Y_MIN) {
+ temp_v0 = Math_Atan2S_XY(40.0f, this->actor.world.pos.y - yIntersect);
+ sp46 = CLAMP(temp_v0, -4000, 4000);
+ }
+ this->actor.focus.rot.y = this->actor.shape.rot.y;
+ Math_SmoothStepToS(&this->actor.focus.rot.x, sp46, 14, 4000, 30);
+ }
+
+ func_80832754(this, func_800B7128(this) || func_8082EF20(this));
+}
+
+void func_8083C85C(Player* this) {
+ Math_ScaledStepToS(&this->upperLimbRot.x, D_80862B3C * -500.0f, 900);
+ this->headLimbRot.x = (-(f32)this->upperLimbRot.x * 0.5f);
+ this->unk_AA6 |= 0x48;
+}
+
+void func_8083C8E8(Player* this, PlayState* play) {
+ if ((func_800B7128(this) == 0) && (func_8082EF20(this) == 0) &&
+ ((this->linearVelocity > 5.0f) || (D_80862B3C != 0.0f))) {
+ s16 temp1;
+ s16 temp2;
+
+ temp1 = this->linearVelocity * 200.0f;
+ temp2 = BINANG_SUB(this->currentYaw, this->actor.shape.rot.y) * this->linearVelocity * 0.1f;
+
+ temp1 = CLAMP(temp1, -0xFA0, 0xFA0);
+
+ temp1 += (s16)(s32)(D_80862B3C * -500.0f);
+
+ temp1 = CLAMP(temp1, -0x2EE0, 0x2EE0);
+
+ temp2 = CLAMP(-temp2, -0xFA0, 0xFA0);
+
+ Math_ScaledStepToS(&this->upperLimbRot.x, temp1, 0x384);
+ this->headLimbRot.x = -(f32)this->upperLimbRot.x * 0.5f;
+ Math_ScaledStepToS(&this->headLimbRot.z, temp2, 0x12C);
+ Math_ScaledStepToS(&this->upperLimbRot.z, temp2, 0xC8);
+ this->unk_AA6 |= 0x168;
+ } else {
+ func_8083C6E8(this, play);
+ }
+}
+
+void func_8083CB04(Player* this, f32 arg1, s16 arg2, f32 arg3, f32 arg4, s16 arg5) {
+ Math_AsymStepToF(&this->linearVelocity, arg1, arg3, arg4);
+ Math_ScaledStepToS(&this->currentYaw, arg2, arg5);
+}
+
+void func_8083CB58(Player* this, f32 arg1, s16 arg2) {
+ func_8083CB04(this, arg1, arg2, REG(19) / 100.0f, 1.5f, REG(27));
+}
+
+s32 func_8083CBC4(Player* this, f32 arg1, s16 arg2, f32 arg3, f32 arg4, f32 arg5, s16 arg6) {
+ s16 temp_v0 = this->currentYaw - arg2;
+
+ if ((this->unk_B50 * 1.5f) < fabsf(this->linearVelocity)) {
+ arg5 *= 4.0f;
+ arg3 *= 4.0f;
+ }
+
+ if (ABS_ALT(temp_v0) > 0x6000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, arg3) == 0) {
+ return false;
+ }
+
+ this->currentYaw = arg2;
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, arg1, arg4, arg5);
+ Math_ScaledStepToS(&this->currentYaw, arg2, arg6);
+ }
+
+ return true;
+}
+
+struct_8085D224 D_8085D224[][2] = {
+ {
+ { &gPlayerAnim_link_uma_left_up, 35.17f, 6.6099997f },
+ { &gPlayerAnim_link_uma_right_up, -34.16f, 7.91f },
+ },
+ {
+ { &gPlayerAnim_cl_uma_leftup, 22.718237f, 2.3294117f },
+ { &gPlayerAnim_cl_uma_rightup, -22.0f, 1.9800001f },
+ },
+};
+
+u16 D_8085D254[] = {
+ 0x1804, // PLAYER_FORM_GORON
+ 0x1805, // PLAYER_FORM_ZORA
+ 0x1806, // PLAYER_FORM_DEKU
+ 0x1806, // PLAYER_FORM_HUMAN
+};
+
+u16 D_8085D25C[] = {
+ 0x1804, // PLAYER_FORM_FIERCE_DEITY
+ 0x1804, // PLAYER_FORM_GORON
+ 0x1805, // PLAYER_FORM_ZORA
+ 0x1806, // PLAYER_FORM_DEKU
+};
+
+// Player_MountHorse
+s32 func_8083CCB4(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+
+ if (rideActor != NULL) {
+ if ((rideActor->type != HORSE_TYPE_2) && (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ rideActor->actor.textId = D_8085D254[this->transformation - 1];
+ Player_TalkWithPlayer(play, &rideActor->actor);
+ return true;
+ }
+ }
+
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else if ((rideActor->type == HORSE_TYPE_2) && (this->transformation != PLAYER_FORM_HUMAN)) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
+ rideActor->actor.textId = D_8085D25C[this->transformation];
+ Player_TalkWithPlayer(play, &rideActor->actor);
+ return true;
+ }
+ }
+
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ s32 pad[2];
+ f32 sp28 = Math_CosS(rideActor->actor.shape.rot.y);
+ f32 sp24 = Math_SinS(rideActor->actor.shape.rot.y);
+ struct_8085D224* entry;
+ f32 temp_fv0;
+ f32 temp_fv1;
+
+ func_80832558(play, this, func_80837BD0);
+
+ this->stateFlags1 |= PLAYER_STATE1_800000;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
+ this->isBurning = false;
+
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ entry = D_8085D224[0];
+ } else {
+ entry = D_8085D224[1];
+ }
+ if (this->mountSide >= 0) {
+ entry++;
+ }
+
+ temp_fv0 = entry->unk_4;
+ temp_fv1 = entry->unk_8;
+ this->actor.world.pos.x =
+ rideActor->actor.world.pos.x + rideActor->riderPos.x + ((temp_fv0 * sp28) + (temp_fv1 * sp24));
+ this->actor.world.pos.z =
+ rideActor->actor.world.pos.z + rideActor->riderPos.z + ((temp_fv1 * sp28) - (temp_fv0 * sp24));
+ this->unk_B48 = rideActor->actor.world.pos.y - this->actor.world.pos.y;
+
+ this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y;
+
+ Actor_MountHorse(play, this, &rideActor->actor);
+ Player_AnimationPlayOnce(play, this, entry->anim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->actor.parent = this->rideActor;
+ func_8082DAD4(this);
+ Actor_DeactivateLens(play);
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+PlayerAnimationHeader* D_8085D264[] = {
+ &gPlayerAnim_link_normal_down_slope_slip,
+ &gPlayerAnim_link_normal_up_slope_slip,
+};
+
+s32 func_8083CF68(PlayState* play, Player* this) {
+ if (!Player_InBlockingCsMode(play, this) && !(this->cylinder.base.ocFlags1 & OC1_HIT)) {
+ if ((func_80853D68 != this->actionFunc) && (func_80857BE8 != this->actionFunc) &&
+ (D_80862B40 == FLOOR_EFFECT_1)) {
+ s16 playerVelYaw = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
+ Vec3f slopeNormal;
+ s16 downwardSlopeYaw;
+ s16 velYawToDownwardSlope;
+ f32 slopeSlowdownSpeed;
+ f32 temp_fv1;
+ f32 var_fa1;
+ f32 slopeSlowdownSpeedStep;
+
+ Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
+ velYawToDownwardSlope = downwardSlopeYaw - playerVelYaw;
+
+ if (ABS_ALT(velYawToDownwardSlope) > 0x3E80) { // 87.9 degrees
+ var_fa1 = (func_80857BE8 == this->actionFunc) ? Math_CosS(this->unk_B6C) : slopeNormal.y;
+ slopeSlowdownSpeed = (1.0f - var_fa1) * 40.0f;
+ temp_fv1 = fabsf(this->actor.speed) + slopeSlowdownSpeed;
+ slopeSlowdownSpeedStep = SQ(temp_fv1) * 0.011f;
+ slopeSlowdownSpeedStep = CLAMP_MIN(slopeSlowdownSpeedStep, 2.2f);
+
+ // slows down speed as player is climbing a slope
+ this->pushedYaw = downwardSlopeYaw;
+ Math_StepToF(&this->pushedSpeed, slopeSlowdownSpeed, slopeSlowdownSpeedStep);
+ } else {
+ Player_SetAction(play, this, func_80853D68, 0);
+ func_8082DE50(play, this);
+ func_8082E514(play, this, D_8085D264[this->unk_AE7]);
+ this->linearVelocity = sqrtf(SQXZ(this->actor.velocity));
+ this->currentYaw = downwardSlopeYaw;
+ if (D_80862B28 >= 0) {
+ this->unk_AE7 = 1;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ }
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_8083D168(PlayState* play, Player* this, GetItemEntry* giEntry) {
+ Item00Type dropType = GIFIELD_GET_DROP_TYPE(giEntry->field);
+
+ if (!(giEntry->field & GIFIELD_NO_COLLECTIBLE)) {
+ Item_DropCollectible(play, &this->actor.world.pos, dropType | 0x8000);
+
+ if ((dropType == ITEM00_BOMBS_A) || (dropType == ITEM00_ARROWS_30) || (dropType == ITEM00_ARROWS_40) ||
+ (dropType == ITEM00_ARROWS_50) || (dropType == ITEM00_RUPEE_GREEN) || (dropType == ITEM00_RUPEE_BLUE) ||
+ (dropType == ITEM00_RUPEE_RED) || (dropType == ITEM00_RUPEE_PURPLE) || (dropType == ITEM00_RUPEE_HUGE)) {
+ return;
+ }
+ }
+
+ Item_Give(play, giEntry->itemId);
+ play_sound((this->getItemId < GI_NONE) ? NA_SE_SY_GET_BOXITEM : NA_SE_SY_GET_ITEM);
+}
+
+s32 func_8083D23C(Player* this, PlayState* play) {
+ if (gSaveContext.save.saveInfo.playerData.health != 0) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (interactRangeActor != NULL) {
+ if (this->getItemId > GI_NONE) {
+ if (this->getItemId < GI_MAX) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ interactRangeActor->parent = &this->actor;
+ if ((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) ||
+ ((s16)giEntry->objectId == OBJECT_GI_BOMB_2)) {
+ func_8082DCA0(play, this);
+ func_80838830(this, giEntry->objectId);
+
+ if (!(this->stateFlags2 & PLAYER_STATE2_400) ||
+ (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ Player_StopCutscene(this);
+ func_808324EC(play, this, func_80837C78, play->playerCsIds[PLAYER_CS_ID_ITEM_GET]);
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_getB
+ : &gPlayerAnim_link_demo_get_itemB);
+ }
+
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ func_8082DAD4(this);
+
+ return true;
+ }
+
+ func_8083D168(play, this, giEntry);
+ this->getItemId = GI_NONE;
+ }
+ } else if (this->csMode == PLAYER_CSMODE_0) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (this->getItemId != GI_NONE) {
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ GetItemEntry* giEntry = &sGetItemTable[-this->getItemId - 1];
+ EnBox* chest = (EnBox*)interactRangeActor;
+
+ if ((giEntry->itemId != ITEM_NONE) &&
+ (((Item_CheckObtainability(giEntry->itemId) == ITEM_NONE) &&
+ (giEntry->field & GIFIELD_40)) ||
+ (((Item_CheckObtainability(giEntry->itemId) != ITEM_NONE)) &&
+ (giEntry->field & GIFIELD_20)))) {
+ this->getItemId =
+ (giEntry->itemId == ITEM_MASK_CAPTAIN) ? -GI_RECOVERY_HEART : -GI_RUPEE_BLUE;
+ giEntry = &sGetItemTable[-this->getItemId - 1];
+ }
+
+ func_80832558(play, this, func_80837C78);
+ this->stateFlags1 |= (PLAYER_STATE1_400 | PLAYER_STATE1_800 | PLAYER_STATE1_20000000);
+ func_80838830(this, giEntry->objectId);
+
+ this->actor.world.pos.x =
+ interactRangeActor->world.pos.x -
+ (Math_SinS(interactRangeActor->shape.rot.y) * this->ageProperties->unk_9C);
+ this->actor.world.pos.z =
+ interactRangeActor->world.pos.z -
+ (Math_CosS(interactRangeActor->shape.rot.y) * this->ageProperties->unk_9C);
+ this->actor.world.pos.y = interactRangeActor->world.pos.y;
+ this->currentYaw = this->actor.shape.rot.y = interactRangeActor->shape.rot.y;
+
+ func_8082DAD4(this);
+ if ((giEntry->itemId != ITEM_NONE) && (giEntry->gid >= 0) &&
+ (Item_CheckObtainability(giEntry->itemId) == ITEM_NONE)) {
+ this->csId = chest->csId2;
+ func_8082DB90(play, this, this->ageProperties->openChestAnim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 |
+ ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_WATER;
+ chest->unk_1EC = 1;
+ } else {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_box_kick);
+ chest->unk_1EC = -1;
+ }
+
+ return true;
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->transformation != PLAYER_FORM_DEKU)) {
+ if ((this->heldActor == NULL) || Player_IsHoldingHookshot(this)) {
+ EnBom* bomb = (EnBom*)interactRangeActor;
+
+ if (((this->transformation != PLAYER_FORM_GORON) &&
+ (((bomb->actor.id == ACTOR_EN_BOM) && bomb->isPowderKeg) ||
+ ((interactRangeActor->id == ACTOR_EN_ISHI) && (interactRangeActor->params & 1)) ||
+ (interactRangeActor->id == ACTOR_EN_MM)))) {
+ return false;
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_10000;
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ func_80832558(play, this, func_808379C0);
+ func_8082DAD4(this);
+ this->stateFlags1 |= PLAYER_STATE1_800;
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// Player_SetAction_Throwing
+void func_8083D6DC(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084E65C, 1);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_28][this->modelAnimType]);
+}
+
+// Determines whether a held actor should be dropped or thrown: false implies droppable.
+s32 func_8083D738(Player* this, Actor* heldActor) {
+ if ((heldActor != NULL) && !(heldActor->flags & ACTOR_FLAG_800000) &&
+ ((this->linearVelocity < 1.1f) || (heldActor->id == ACTOR_EN_BOM_CHU))) {
+ return false;
+ }
+ return true;
+}
+
+s32 func_8083D78C(Player* this, PlayState* play) {
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ if ((this->heldActor != NULL) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) {
+ if (!func_808313A8(play, this, this->heldActor)) {
+ if (!func_8083D738(this, this->heldActor)) {
+ Player_SetAction(play, this, func_8084E58C, 1);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_29][this->modelAnimType]);
+ return true;
+ }
+ func_8083D6DC(this, play);
+ }
+
+ return true;
+ }
+ }
+ return false;
+}
+
+s32 func_8083D860(Player* this, PlayState* play) {
+ if ((this->wallHeight >= 79.0f) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_8000000) || (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ (this->actor.depthInWater < this->ageProperties->unk_2C))) {
+ s32 var_t0 = (sPlayerCurrentWallFlags & WALL_FLAG_3) ? 2 : 0;
+ s32 temp_t2 = sPlayerCurrentWallFlags & WALL_FLAG_1;
+
+ if ((var_t0 != 0) || temp_t2 ||
+ SurfaceType_CheckWallFlag2(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) {
+ CollisionPoly* wallPoly = this->actor.wallPoly;
+ f32 sp78;
+ f32 sp74;
+ f32 zOut;
+ f32 yOut;
+ Vec3f sp48[3];
+ s32 i;
+ f32 sp40;
+ Vec3f* sp3C;
+ f32 xOut;
+
+ yOut = xOut = 0.0f;
+ if (var_t0 != 0) {
+ sp78 = this->actor.world.pos.x;
+ sp74 = this->actor.world.pos.z;
+ } else {
+ sp3C = sp48;
+ CollisionPoly_GetVerticesByBgId(wallPoly, this->actor.wallBgId, &play->colCtx, sp48);
+ sp78 = xOut = sp48[0].x;
+ sp74 = zOut = sp48[0].z;
+ yOut = sp48[0].y;
+
+ for (i = 1; i < ARRAY_COUNT(sp48); i++) {
+ sp3C++;
+
+ if (sp78 > sp3C->x) {
+ sp78 = sp3C->x;
+ } else if (xOut < sp3C->x) {
+ xOut = sp3C->x;
+ }
+
+ if (sp74 > sp3C->z) {
+ sp74 = sp3C->z;
+ } else if (zOut < sp3C->z) {
+ zOut = sp3C->z;
+ }
+
+ if (yOut > sp3C->y) {
+ yOut = sp3C->y;
+ }
+ }
+
+ sp78 = (sp78 + xOut) * 0.5f;
+ sp74 = (sp74 + zOut) * 0.5f;
+
+ xOut = ((this->actor.world.pos.x - sp78) * COLPOLY_GET_NORMAL(wallPoly->normal.z)) -
+ ((this->actor.world.pos.z - sp74) * COLPOLY_GET_NORMAL(wallPoly->normal.x));
+
+ sp40 = this->actor.world.pos.y - yOut;
+ yOut = ((s32)((sp40 / 15.0f) + 0.5f) * 15.0f) - sp40;
+ xOut = fabsf(xOut);
+ }
+
+ if (xOut < 8.0f) {
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+ f32 wallDistance = this->wallDistance;
+ PlayerAnimationHeader* anim;
+
+ func_80832558(play, this, func_80837C20);
+
+ this->stateFlags1 |= PLAYER_STATE1_200000;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+
+ if ((var_t0 != 0) || temp_t2) {
+ if ((this->unk_AE7 = var_t0) != 0) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ anim = &gPlayerAnim_link_normal_Fclimb_startA;
+
+ } else {
+ anim = &gPlayerAnim_link_normal_Fclimb_hold2upL;
+ }
+ wallDistance = (this->ageProperties->unk_3C + 4.0f) - wallDistance;
+ } else {
+ anim = this->ageProperties->unk_AC;
+ wallDistance = 20.5f;
+ }
+
+ this->unk_AE8 = -2;
+ this->actor.world.pos.y += yOut;
+
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+ } else {
+ anim = this->ageProperties->unk_B0;
+ wallDistance = (this->ageProperties->unk_38 - this->ageProperties->unk_3C) + 17.0f;
+ this->unk_AE8 = -4;
+
+ this->actor.shape.rot.y = this->currentYaw = i = this->actor.wallYaw; //! FAKE
+ }
+
+ this->actor.world.pos.x = (wallDistance * wallPolyNormalX) + sp78;
+ this->actor.world.pos.z = (wallDistance * wallPolyNormalZ) + sp74;
+ func_8082DAD4(this);
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ Player_AnimationPlayOnce(play, this, anim);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE |
+ ANIM_FLAG_80);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void func_8083DCC4(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ func_8083172C(play, this, func_8084FC0C, 0);
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->skelAnime, anim, 4.0f / 3.0f);
+}
+
+s32 func_8083DD1C(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4, f32 arg5) {
+ CollisionPoly* wallPoly;
+ s32 bgId;
+ Vec3f sp74;
+ Vec3f sp68;
+ Vec3f sp5C;
+ f32 cos = Math_CosS(this->actor.shape.rot.y);
+ f32 sin = Math_SinS(this->actor.shape.rot.y);
+
+ sp74.x = this->actor.world.pos.x + (arg5 * sin);
+ sp74.z = this->actor.world.pos.z + (arg5 * cos);
+ sp68.x = this->actor.world.pos.x + (arg4 * sin);
+ sp68.z = this->actor.world.pos.z + (arg4 * cos);
+ sp74.y = sp68.y = this->actor.world.pos.y + arg2;
+
+ if (BgCheck_EntityLineTest2(&play->colCtx, &sp74, &sp68, &sp5C, &this->actor.wallPoly, true, false, false, true,
+ &bgId, &this->actor)) {
+ f32 wallPolyNormalX;
+ f32 wallPolyNormalZ;
+
+ wallPoly = this->actor.wallPoly;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ this->actor.wallBgId = bgId;
+ sPlayerCurrentWallFlags = SurfaceType_GetWallFlags(&play->colCtx, wallPoly, bgId);
+
+ wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, Math_Atan2S_XY(-wallPolyNormalZ, -wallPolyNormalX), 0x320);
+
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.world.pos.x = sp5C.x - (Math_SinS(this->actor.shape.rot.y) * arg3);
+ this->actor.world.pos.z = sp5C.z - (Math_CosS(this->actor.shape.rot.y) * arg3);
+
+ return true;
+ }
+
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ return false;
+}
+
+void func_8083DEE4(PlayState* play, Player* this) {
+ f32 temp_fv0 = this->ageProperties->unk_38;
+
+ func_8083DD1C(play, this, 268 * 0.1f, temp_fv0 + 5.0f, temp_fv0 + 15.0f, 0.0f);
+}
+
+void func_8083DF38(Player* this, PlayerAnimationHeader* anim, PlayState* play) {
+ if (!func_80832558(play, this, func_80837BF8)) {
+ Player_SetAction(play, this, func_8084ED9C, 0);
+ }
+
+ Player_AnimationPlayOnce(play, this, anim);
+ func_8082DAD4(this);
+
+ this->actor.shape.rot.y = this->currentYaw = this->actor.wallYaw + 0x8000;
+}
+
+s32 func_8083DFC4(Player* this, PlayState* play) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ (D_80862B20 < 0x3000)) {
+ if ((this->linearVelocity > 0.0f) && func_8083D860(this, play)) {
+ return true;
+ }
+
+ if (!func_801242B4(this) && ((this->linearVelocity == 0.0f) || !(this->stateFlags2 & PLAYER_STATE2_4)) &&
+ (sPlayerCurrentWallFlags & WALL_FLAG_6) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ (this->wallHeight >= 39.0f)) {
+ this->stateFlags2 |= PLAYER_STATE2_1;
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ DynaPolyActor* dyna;
+
+ if ((this->actor.wallBgId != BGCHECK_SCENE) &&
+ ((dyna = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId)) != NULL)) {
+ this->rightHandActor = &dyna->actor;
+ } else {
+ this->rightHandActor = NULL;
+ }
+
+ func_8083DF38(this, &gPlayerAnim_link_normal_push_wait, play);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083E14C(PlayState* play, Player* this) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ ((this->stateFlags2 & PLAYER_STATE2_10) || CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A))) {
+ DynaPolyActor* var_v1 = NULL;
+
+ if (this->actor.wallBgId != BGCHECK_SCENE) {
+ var_v1 = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+ }
+
+ if (&var_v1->actor == this->rightHandActor) {
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ func_808369F4(this, play);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_push_wait_end);
+ this->stateFlags2 &= ~PLAYER_STATE2_10;
+ return true;
+}
+
+void func_8083E234(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084EE50, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_push_start);
+ this->stateFlags2 |= PLAYER_STATE2_10;
+}
+
+void func_8083E28C(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084EF9C, 0);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_34][this->modelAnimType]);
+ this->stateFlags2 |= PLAYER_STATE2_10;
+}
+
+void func_8083E2F4(Player* this, PlayState* play) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_200000 | PLAYER_STATE1_8000000);
+ func_80833AA0(this, play);
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ this->linearVelocity = -1.7f;
+ } else {
+ this->linearVelocity = -0.4f;
+ }
+}
+
+s32 func_8083E354(Player* this, PlayState* play) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT)) {
+ if ((sPlayerCurrentWallFlags & WALL_FLAG_3) || (sPlayerCurrentWallFlags & WALL_FLAG_1) ||
+ SurfaceType_CheckWallFlag2(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId)) {
+ return false;
+ }
+ }
+
+ func_8083E2F4(this, play);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ return true;
+}
+
+s32 func_8083E404(Player* this, f32 arg1, s16 arg2) {
+ f32 sp1C = BINANG_SUB(arg2, this->actor.shape.rot.y);
+ f32 temp_fv1;
+
+ if (this->targetedActor != NULL) {
+ func_8083C62C(this, func_800B7128(this) || func_8082EF20(this));
+ }
+
+ temp_fv1 = fabsf(sp1C) / 0x8000;
+ if (((SQ(temp_fv1) * 50.0f) + 6.0f) < arg1) {
+ return 1;
+ }
+
+ if ((((1.0f - temp_fv1) * 10.0f) + 6.8f) < arg1) {
+ return -1;
+ }
+ return 0;
+}
+
+s32 func_8083E514(Player* this, f32* arg2, s16* arg3, PlayState* play) {
+ s16 temp_v1 = *arg3 - this->targetYaw;
+ u16 var_a2 = ABS_ALT(temp_v1);
+
+ if ((func_800B7128(this) || func_8082EF20(this)) && (this->targetedActor == NULL)) {
+ *arg2 *= Math_SinS(var_a2);
+
+ if (*arg2 != 0.0f) {
+ *arg3 = (((temp_v1 >= 0) ? 1 : -1) * 0x4000) + this->actor.shape.rot.y;
+ } else {
+ *arg3 = this->actor.shape.rot.y;
+ }
+
+ if (this->targetedActor != NULL) {
+ func_8083C62C(this, true);
+ } else {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, (sPlayerControlInput->rel.stick_y * 240.0f), 0xE, 0xFA0, 0x1E);
+ func_80832754(this, true);
+ }
+ } else {
+ if (this->targetedActor != NULL) {
+ return func_8083E404(this, *arg2, *arg3);
+ }
+
+ func_8083C6E8(this, play);
+ if ((*arg2 != 0.0f) && (var_a2 < 0x1770)) {
+ return 1;
+ }
+
+ if ((Math_SinS(0x4000 - (var_a2 >> 1)) * 200.0f) < *arg2) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+s32 func_8083E758(Player* this, f32* arg1, s16* arg2) {
+ f32 temp_fv0;
+ u16 temp_v0;
+ s16 var_v1;
+
+ var_v1 = *arg2 - this->actor.shape.rot.y;
+ temp_v0 = ABS_ALT(var_v1);
+ temp_fv0 = Math_CosS(temp_v0);
+ *arg1 *= temp_fv0;
+
+ // Can't be (*arg1 != 0.0f)
+ if (*arg1 != 0) {
+ if (temp_fv0 > 0.0f) {
+ return 1;
+ }
+ return -1;
+ }
+ return 0;
+}
+
+s32 func_8083E7F8(Player* this, f32* arg1, s16* arg2, PlayState* play) {
+ func_8083C6E8(this, play);
+
+ if ((*arg1 != 0.0f) || (ABS_ALT(this->unk_B4C) > 0x190)) {
+ s16 temp_a0 = *arg2 - (u16)Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ u16 temp;
+
+ temp = (ABS_ALT(temp_a0) - 0x2000);
+ if ((temp < 0x4000) || (this->unk_B4C != 0)) {
+ return -1;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+void func_8083E8E0(Player* this, f32 arg1, s16 arg2) {
+ s16 temp = arg2 - this->actor.shape.rot.y;
+
+ if (arg1 > 0.0f) {
+ if (temp < 0) {
+ this->unk_B44 = 0.0f;
+ } else {
+ this->unk_B44 = 1.0f;
+ }
+ }
+
+ Math_StepToF(&this->unk_B40, this->unk_B44, 0.3f);
+}
+
+void func_8083E958(PlayState* play, Player* this) {
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, func_8082EF54(this), this->unk_B38, func_8082EF9C(this),
+ this->unk_B38, this->unk_B40, this->blendTableBuffer);
+}
+
+s32 func_8083E9C4(f32 arg0, f32 arg1, f32 arg2, f32 arg3) {
+ f32 temp_fv0;
+
+ if ((arg3 == 0.0f) && (arg1 > 0.0f)) {
+ arg3 = arg2;
+ }
+ temp_fv0 = (arg0 + arg1) - arg3;
+ if (((temp_fv0 * arg1) >= 0.0f) && (((temp_fv0 - arg1) * arg1) < 0.0f)) {
+ return true;
+ }
+ return false;
+}
+
+void func_8083EA44(Player* this, f32 arg1) {
+ s32 sp24;
+ f32 updateScale = R_UPDATE_RATE / 2.0f;
+
+ arg1 *= updateScale;
+ if (arg1 < -7.25f) {
+ arg1 = -7.25f;
+ } else if (arg1 > 7.25f) {
+ arg1 = 7.25f;
+ }
+
+ sp24 = func_8083E9C4(this->unk_B38, arg1, 29.0f, 10.0f);
+
+ if (sp24 || func_8083E9C4(this->unk_B38, arg1, 29.0f, 24.0f)) {
+ Player_AnimSfx_PlayFloorWalk(this, this->linearVelocity);
+ if (this->linearVelocity > 4.0f) {
+ this->stateFlags2 |= PLAYER_STATE2_8;
+ }
+ this->actor.shape.unk_17 = sp24 ? 1 : 2;
+ }
+
+ this->unk_B38 += arg1;
+ if (this->unk_B38 < 0.0f) {
+ this->unk_B38 += 29.0f;
+ } else if (this->unk_B38 >= 29.0f) {
+ this->unk_B38 -= 29.0f;
+ }
+}
+
+void Player_ChooseIdleAnim(PlayState* play, Player* this) {
+ PlayerAnimationHeader* anim;
+ u32 healthIsCritical;
+ PlayerAnimationHeader** animPtr;
+ s32 animIndex;
+ s32 rand;
+ f32 morphFrames;
+ s16 lastFrame;
+
+ if (((this->actor.id != ACTOR_PLAYER) && !(healthIsCritical = (this->actor.colChkInfo.health < 0x64))) ||
+ ((this->actor.id == ACTOR_PLAYER) &&
+ (((this->targetedActor != NULL) ||
+ ((this->transformation != PLAYER_FORM_FIERCE_DEITY) && (this->transformation != PLAYER_FORM_HUMAN)) ||
+ (this->currentMask == PLAYER_MASK_SCENTS)) ||
+ (!(healthIsCritical = LifeMeter_IsCritical()) && (this->unk_AA4 = ((this->unk_AA4 + 1) & 1)))))) {
+ this->stateFlags2 &= ~PLAYER_STATE2_10000000;
+ anim = func_8082ED20(this);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10000000;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ anim = func_8082ED20(this);
+ } else {
+ animIndex = play->roomCtx.curRoom.behaviorType2;
+
+ if (healthIsCritical) {
+ if (this->unk_AA4 >= 0) {
+ animIndex = 7;
+ this->unk_AA4 = -1;
+ } else {
+ animIndex = 8;
+ }
+ } else {
+ rand = Rand_ZeroOne() * 5.0f;
+ if (rand < 4) {
+ if (((rand != 0) && (rand != 3)) ||
+ ((this->rightHandType == PLAYER_MODELTYPE_RH_SHIELD) &&
+ ((rand == 3) || (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE)))) {
+ if ((rand == 0) && Player_IsHoldingTwoHandedWeapon(this)) {
+ rand = 4;
+ }
+ animIndex = rand + 9;
+ }
+ }
+ }
+
+ animPtr = &sPlayerIdleAnimations[animIndex][0];
+ if (this->modelAnimType != PLAYER_ANIMTYPE_1) {
+ animPtr = &sPlayerIdleAnimations[animIndex][1];
+ }
+ anim = *animPtr;
+ }
+ }
+
+ lastFrame = Animation_GetLastFrame(anim);
+ if ((this->skelAnime.animation == anim) || (this->skelAnime.animation == &gPlayerAnim_pz_attackAend) ||
+ (this->skelAnime.animation == &gPlayerAnim_pz_attackBend) ||
+ (this->skelAnime.animation == &gPlayerAnim_pz_attackCend)) {
+ morphFrames = 0.0f;
+ } else {
+ morphFrames = -6.0f;
+ }
+
+ PlayerAnimation_Change(play, &this->skelAnime, anim, (2.0f / 3.0f) * D_8085C3E4, 0.0f, lastFrame, ANIMMODE_ONCE,
+ morphFrames);
+}
+
+void func_8083EE60(Player* this, PlayState* play) {
+ f32 temp_fv0;
+ f32 var_fs0;
+
+ if (this->unk_B34 < 1.0f) {
+ f32 temp_fs0 = R_UPDATE_RATE / 2.0f;
+
+ func_8083EA44(this, REG(35) / 1000.0f);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ this->unk_B34 += (1.0f * 1.0f) * temp_fs0;
+ if (this->unk_B34 >= 1.0f) {
+ this->unk_B34 = 1.0f;
+ }
+ var_fs0 = this->unk_B34;
+ } else {
+ temp_fv0 = this->linearVelocity - (REG(48) / 100.0f);
+
+ if (temp_fv0 < 0.0f) {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, ((REG(35)) / 1000.0f) + (((REG(36)) / 1000.0f) * this->linearVelocity));
+
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ } else {
+ var_fs0 = (REG(37) / 1000.0f) * temp_fv0;
+ if (var_fs0 < 1.0f) {
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ } else {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(39) / 100.0f) + ((REG(38) / 1000.0f) * temp_fv0));
+ }
+
+ PlayerAnimation_LoadToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_30][this->modelAnimType],
+ this->unk_B38);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, &gPlayerAnim_link_normal_back_run,
+ this->unk_B38 * (16.0f / 29.0f));
+ }
+ }
+ if (var_fs0 < 1.0f) {
+ PlayerAnimation_InterpJointMorph(play, &this->skelAnime, 1.0f - var_fs0);
+ }
+}
+
+void func_8083F144(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A794, 1);
+ func_8082E438(play, this, &gPlayerAnim_link_normal_back_brake);
+}
+
+s32 func_8083F190(Player* this, f32* arg1, s16* arg2, PlayState* play) {
+ if (this->linearVelocity > 6.0f) {
+ func_8083F144(this, play);
+ return true;
+ }
+
+ if (*arg1 != 0.0f) {
+ if (func_80832F24(this)) {
+ *arg1 = 0.0f;
+ *arg2 = this->currentYaw;
+ } else {
+ return true;
+ }
+ }
+ return false;
+}
+
+void func_8083F230(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084A884, 1);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_back_brake_end);
+}
+
+void func_8083F27C(PlayState* play, Player* this) {
+ f32 temp_fv0;
+ PlayerAnimationHeader* sp38;
+ PlayerAnimationHeader* sp34;
+
+ sp38 = D_8085BE84[PLAYER_ANIMGROUP_23][this->modelAnimType];
+ sp34 = D_8085BE84[PLAYER_ANIMGROUP_24][this->modelAnimType];
+
+ this->skelAnime.animation = sp38;
+
+ func_8083EA44(this, (REG(30) / 1000.0f) + ((REG(32) / 1000.0f) * this->linearVelocity));
+
+ temp_fv0 = this->unk_B38 * (16.0f / 29.0f);
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, sp34, temp_fv0, sp38, temp_fv0, this->unk_B40,
+ this->blendTableBuffer);
+}
+
+void func_8083F358(Player* this, s32 arg1, PlayState* play) {
+ PlayerAnimationHeader* var_v0;
+ f32 var_fv1;
+ s16 var_a1;
+
+ if (ABS_ALT(D_80862B28) < 0xE38) {
+ var_a1 = 0;
+ } else {
+ var_a1 = CLAMP(D_80862B28, -0x2AAA, 0x2AAA);
+ }
+
+ Math_ScaledStepToS(&this->unk_B70, var_a1, 0x190);
+ if ((this->modelAnimType == PLAYER_ANIMTYPE_3) || ((this->unk_B70 == 0) && (this->unk_AB8 <= 0.0f))) {
+ if (arg1 == 0) {
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+ } else {
+ PlayerAnimation_LoadToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+ }
+ return;
+ }
+
+ if (this->unk_B70 != 0) {
+ var_fv1 = this->unk_B70 / (f32)0x2AAA;
+ } else {
+ var_fv1 = this->unk_AB8 * 0.0006f;
+ }
+
+ var_fv1 *= fabsf(this->linearVelocity) * 0.5f;
+ if (var_fv1 > 1.0f) {
+ var_fv1 = 1.0f;
+ }
+
+ if (var_fv1 < 0.0f) {
+ var_v0 = &gPlayerAnim_link_normal_climb_down;
+ var_fv1 = -var_fv1;
+ } else {
+ var_v0 = &gPlayerAnim_link_normal_climb_up;
+ }
+
+ if (arg1 == 0) {
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38, var_v0, this->unk_B38, var_fv1, this->blendTableBuffer);
+ } else {
+ PlayerAnimation_BlendToMorph(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38, var_v0, this->unk_B38, var_fv1, this->blendTableBuffer);
+ }
+}
+
+void func_8083F57C(Player* this, PlayState* play) {
+ f32 temp_fv0;
+ f32 var_fs0;
+
+ if (this->unk_B34 < 1.0f) {
+ f32 temp_fs0;
+
+ temp_fs0 = R_UPDATE_RATE / 2.0f;
+ func_8083EA44(this, REG(35) / 1000.0f);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, D_8085BE84[PLAYER_ANIMGROUP_1][this->modelAnimType],
+ this->unk_B38);
+
+ // required
+ this->unk_B34 += 1 * temp_fs0;
+ if (this->unk_B34 >= 1.0f) {
+ this->unk_B34 = 1.0f;
+ }
+ var_fs0 = this->unk_B34;
+ } else {
+ temp_fv0 = (this->linearVelocity - (REG(48) / 100.0f));
+ if (temp_fv0 < 0.0f) {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ func_8083F358(this, 0, play);
+ } else {
+ var_fs0 = (REG(37) / 1000.0f) * temp_fv0;
+ if (var_fs0 < 1.0f) {
+ func_8083EA44(this, (REG(35) / 1000.0f) + ((REG(36) / 1000.0f) * this->linearVelocity));
+ } else {
+ var_fs0 = 1.0f;
+ func_8083EA44(this, (REG(39) / 100.0f) + ((REG(38) / 1000.0f) * temp_fv0));
+ }
+ func_8083F358(this, 1, play);
+ PlayerAnimation_LoadToJoint(play, &this->skelAnime, func_8082EEE0(this), this->unk_B38 * (20.0f / 29.0f));
+ }
+ }
+
+ if (var_fs0 < 1.0f) {
+ PlayerAnimation_InterpJointMorph(play, &this->skelAnime, 1.0f - var_fs0);
+ }
+}
+
+void func_8083F828(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4) {
+ arg1->x = Rand_CenteredFloat(arg3) + arg0->x;
+ arg1->y = Rand_CenteredFloat(arg4) + (arg0->y + arg2);
+ arg1->z = Rand_CenteredFloat(arg3) + arg0->z;
+}
+
+Color_RGBA8 D_8085D26C = { 255, 255, 255, 255 };
+Vec3f D_8085D270 = { 0.0f, 0.04f, 0.0f };
+
+s32 func_8083F8A8(PlayState* play, Player* this, f32 radius, s32 countMax, f32 randAccelWeight, s32 scale,
+ s32 scaleStep, s32 useLighting) {
+ static Vec3f D_8085D27C = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D288 = { 0.0f, 0.0f, 0.0f };
+
+ if ((countMax < 0) || (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)) {
+ s32 count = func_80173B48(&play->state) / 20000000;
+ Vec3f pos;
+ s32 i;
+
+ count = (count >= ABS_ALT(countMax)) ? ABS_ALT(countMax) : count;
+ for (i = 0; i < count; i++) {
+ func_8083F828(&this->actor.world.pos, &pos, 0.0f, 40.0f, 10.0f);
+ D_8085D27C.x = Rand_CenteredFloat(3.0f);
+ D_8085D27C.z = Rand_CenteredFloat(3.0f);
+ EffectSsDust_Spawn(play, 0, &pos, &D_8085D27C, &D_8085D270, &D_8085D26C, &D_8085D26C, scale, scaleStep, 42,
+ 0);
+ }
+
+ return true;
+ } else if ((this->floorSfxOffset == NA_SE_PL_WALK_GROUND - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG)) {
+ s32 count = func_80173B48(&play->state) / 12000000;
+
+ if (count > 0) {
+ Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, radius,
+ (count < countMax) ? count : countMax, randAccelWeight, scale, scaleStep,
+ useLighting);
+
+ return true;
+ }
+ } else if (this->floorSfxOffset == NA_SE_PL_WALK_GRASS - SFX_FLAG) {
+ s32 count = func_80173B48(&play->state) / 12000000;
+ Vec3f velocity;
+ Vec3f pos;
+ s32 i;
+
+ count = (count >= countMax) ? countMax : count;
+ for (i = 0; i < count; i++) {
+ func_8083F828(&this->actor.world.pos, &pos, 0.0f, 20.0f, 20.0f);
+ velocity.x = Rand_CenteredFloat(3.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = Rand_CenteredFloat(3.0f);
+ D_8085D288.y = -0.1f;
+ EffectSsHahen_Spawn(play, &pos, &velocity, &D_8085D288, 0, 0x96, 1, 0x10, gKakeraLeafTip);
+ }
+ }
+
+ return false;
+}
+
+s32 func_8083FBC4(PlayState* play, Player* this) {
+ if ((this->floorSfxOffset == NA_SE_PL_WALK_GROUND - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG)) {
+ Vec3f* feetPos = this->actor.shape.feetPos;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(this->actor.shape.feetPos); i++) {
+ func_800B1210(play, feetPos, &gZeroVec3f, &gZeroVec3f, 50, 30);
+ feetPos++;
+ }
+
+ return true;
+ }
+
+ if (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG) {
+ Vec3f* feetPos = this->actor.shape.feetPos;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(this->actor.shape.feetPos); i++) {
+ EffectSsDust_Spawn(play, 0, feetPos, &gZeroVec3f, &D_8085D270, &D_8085D26C, &D_8085D26C, 100, 40, 17, 0);
+ feetPos++;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_8083FCF0(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4) {
+ if (arg4 < this->skelAnime.curFrame) {
+ func_8082DC38(this);
+ } else if (arg2 <= this->skelAnime.curFrame) {
+ this->stateFlags3 |= PLAYER_STATE3_2000000;
+ func_8082FA5C(play, this,
+ (arg3 <= this->skelAnime.curFrame) ? PLAYER_MELEE_WEAPON_STATE_1
+ : PLAYER_MELEE_WEAPON_STATE_MINUS_1);
+ return true;
+ }
+ return false;
+}
+
+// Crouch-stabbing
+s32 func_8083FD80(Player* this, PlayState* play) {
+ if (!Player_IsGoronOrDeku(this) && (Player_GetMeleeWeaponHeld(this) != PLAYER_MELEEWEAPON_NONE) &&
+ (this->transformation != PLAYER_FORM_ZORA) && (D_80862B48 != 0)) {
+ //! Calling this function sets the meleeWeaponQuads' damage properties correctly, patching "Power Crouch Stab".
+ func_8083375C(this, PLAYER_MWA_STAB_1H);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_defense_kiru);
+ this->unk_AE7 = 1;
+ this->meleeWeaponAnimation = PLAYER_MWA_STAB_1H;
+ this->currentYaw = this->actor.shape.rot.y + this->upperLimbRot.y;
+ this->unk_ADD = 0;
+ return true;
+ }
+ return false;
+}
+
+s32 func_8083FE38(Player* this, PlayState* play) {
+ return func_80838A90(this, play) || func_808391D8(this, play) || func_8083D23C(this, play);
+}
+
+void Player_RequestQuakeAndRumble(PlayState* play, Player* this, u16 sfxId) {
+ Player_RequestQuake(play, 27767, 7, 20);
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ Player_PlaySfx(this, sfxId);
+}
+
+void func_8083FEF4(PlayState* play, Player* this) {
+ Inventory_ChangeAmmo(ITEM_STICK, -1);
+ func_80831990(play, this, ITEM_NONE);
+}
+
+s32 func_8083FF30(PlayState* play, Player* this) {
+ if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B0C > 0.5f)) {
+ if (AMMO(ITEM_STICK) != 0) {
+ EffectSsStick_Spawn(play, &this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND],
+ BINANG_ADD(this->actor.shape.rot.y, 0x8000));
+ this->unk_B0C = 0.5f;
+ func_8083FEF4(play, this);
+ Player_PlaySfx(this, NA_SE_IT_WOODSTICK_BROKEN);
+ }
+ return true;
+ }
+
+ return false;
+}
+
+// handles razor sword health and breaking
+s32 func_8083FFEC(PlayState* play, Player* this) {
+ if (this->heldItemAction == PLAYER_IA_SWORD_RAZOR) {
+ if (gSaveContext.save.saveInfo.playerData.swordHealth > 0) {
+ gSaveContext.save.saveInfo.playerData.swordHealth--;
+ if (gSaveContext.save.saveInfo.playerData.swordHealth <= 0) {
+ Item_Give(play, ITEM_SWORD_KOKIRI);
+ func_80831990(play, this, ITEM_SWORD_KOKIRI);
+ Player_PlaySfx(this, NA_SE_IT_MAJIN_SWORD_BROKEN);
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Message_StartTextbox(play, 0xF9, NULL);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+// Could return the last function, but never used as such
+void func_80840094(PlayState* play, Player* this) {
+ func_8083FF30(play, this);
+ func_8083FFEC(play, this);
+}
+
+PlayerAnimationHeader* D_8085D294[] = {
+ &gPlayerAnim_link_fighter_rebound,
+ &gPlayerAnim_link_fighter_rebound_long,
+ &gPlayerAnim_link_fighter_reboundR,
+ &gPlayerAnim_link_fighter_rebound_longR,
+};
+
+void func_808400CC(PlayState* play, Player* this) {
+ if (func_8084B5C0 != this->actionFunc) {
+ func_8082DD2C(play, this);
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (this->transformation != PLAYER_FORM_FIERCE_DEITY)) {
+ u8 moveFlags = this->skelAnime.moveFlags;
+ s32 pad;
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, func_80854C70, 0);
+ this->skelAnime.moveFlags = moveFlags;
+ } else {
+ s32 var_v1;
+ s32 pad;
+
+ Player_SetAction(play, this, func_80854C70, 0);
+ if (func_80123420(this)) {
+ var_v1 = 2;
+ } else {
+ var_v1 = 0;
+ }
+ func_8082DB90(play, this, D_8085D294[Player_IsHoldingTwoHandedWeapon(this) + var_v1]);
+ }
+ }
+
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = -18.0f;
+ func_80840094(play, this);
+}
+
+s32 func_808401F4(PlayState* play, Player* this) {
+ if (this->meleeWeaponState >= PLAYER_MELEE_WEAPON_STATE_1) {
+ s32 temp_v0_3;
+
+ if (this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) {
+ if (!(this->meleeWeaponQuads[0].base.atFlags & AT_BOUNCED) &&
+ !(this->meleeWeaponQuads[1].base.atFlags & AT_BOUNCED)) {
+ if (this->skelAnime.curFrame >= 2.0f) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f spC8;
+ Vec3f pos;
+ Vec3f spB0;
+ Vec3f* var_a1;
+ Vec3f* temp_a0 = &this->meleeWeaponInfo[0].tip;
+ f32 var_fv1;
+
+ if (this->linearVelocity >= 0.0f) {
+ var_a1 = &this->meleeWeaponInfo[0].base;
+ if ((this->transformation == PLAYER_FORM_GORON) || (this->actor.id == ACTOR_EN_TEST3)) {
+ var_a1 = &this->unk_AF0[1];
+ }
+
+ var_fv1 = Math_Vec3f_DistXYZAndStoreDiff(temp_a0, var_a1, &spB0);
+ if (var_fv1 != 0.0f) {
+ var_fv1 = (var_fv1 + 10.0f) / var_fv1;
+ }
+
+ spC8.x = temp_a0->x + (spB0.x * var_fv1);
+ spC8.y = temp_a0->y + (spB0.y * var_fv1);
+ spC8.z = temp_a0->z + (spB0.z * var_fv1);
+ if (BgCheck_EntityLineTest2(&play->colCtx, &spC8, temp_a0, &pos, &poly, 1, 0, 0, 1, &bgId,
+ &this->actor)) {
+ if (!SurfaceType_IsIgnoredByEntities(&play->colCtx, poly, bgId) &&
+ (SurfaceType_GetFloorType(&play->colCtx, poly, bgId) != FLOOR_TYPE_6) &&
+ !func_800B90AC(play, &this->actor, poly, bgId, &pos)) {
+ if (this->transformation == PLAYER_FORM_GORON) {
+ MtxF sp64;
+ Vec3s actorRot;
+ DynaPolyActor* temp_v0;
+
+ func_8082DF2C(play);
+ Player_RequestQuakeAndRumble(play, this, NA_SE_IT_HAMMER_HIT);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_BONK, 2, 100.0f,
+ &this->actor.world.pos);
+ func_800C0094(poly, pos.x, pos.y, pos.z, &sp64);
+ Matrix_MtxFToYXZRot(&sp64, &actorRot, true);
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, pos.x, pos.y, pos.z,
+ actorRot.x, actorRot.y, actorRot.z, 500);
+ }
+
+ if (bgId != BGCHECK_SCENE) {
+ temp_v0 = DynaPoly_GetActor(&play->colCtx, bgId);
+
+ if (((this->meleeWeaponQuads[0].base.atFlags & AT_HIT) &&
+ (&temp_v0->actor == this->meleeWeaponQuads[0].base.at)) ||
+ ((this->meleeWeaponQuads[1].base.atFlags & AT_HIT) &&
+ (&temp_v0->actor == this->meleeWeaponQuads[1].base.at))) {
+ return false;
+ }
+ }
+
+ func_808400CC(play, this);
+ if (this->transformation != PLAYER_FORM_GORON) {
+ return true;
+ }
+ return false;
+ }
+
+ if (this->linearVelocity >= 0.0f) {
+ SurfaceMaterial surfaceMaterial =
+ SurfaceType_GetMaterial(&play->colCtx, poly, bgId);
+
+ if (surfaceMaterial == SURFACE_MATERIAL_WOOD) {
+ CollisionCheck_SpawnShieldParticlesWood(play, &pos, &this->actor.projectedPos);
+ } else {
+ pos.x += 8.0f * COLPOLY_GET_NORMAL(poly->normal.x);
+ pos.y += 8.0f * COLPOLY_GET_NORMAL(poly->normal.y);
+ pos.x += 8.0f * COLPOLY_GET_NORMAL(poly->normal.z);
+ CollisionCheck_SpawnShieldParticles(play, &pos);
+
+ if (surfaceMaterial == SURFACE_MATERIAL_DIRT_SOFT) {
+ Player_PlaySfx(this, NA_SE_IT_WALL_HIT_SOFT);
+ } else {
+ Player_PlaySfx(this, NA_SE_IT_WALL_HIT_HARD);
+ }
+ }
+
+ func_80840094(play, this);
+ Player_RequestRumble(play, this, 180, 20, 100, SQ(0));
+ this->linearVelocity = -14.0f;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ func_808400CC(play, this);
+ func_8082DF2C(play);
+ return true;
+ }
+ }
+
+ temp_v0_3 = (this->meleeWeaponQuads[0].base.atFlags & AT_HIT) != 0;
+ if (temp_v0_3 || (this->meleeWeaponQuads[1].base.atFlags & AT_HIT)) {
+ if ((this->meleeWeaponAnimation < PLAYER_MWA_SPIN_ATTACK_1H) &&
+ (this->transformation != PLAYER_FORM_GORON)) {
+ Actor* temp_v1 = this->meleeWeaponQuads[temp_v0_3 ? 0 : 1].base.at;
+
+ if ((temp_v1 != NULL) && (temp_v1->id != ACTOR_EN_KANBAN)) {
+ func_8082DF2C(play);
+ }
+ }
+
+ if (!func_8083FF30(play, this)) {
+ func_8083FFEC(play, this);
+ if (this->actor.colChkInfo.atHitEffect == 1) {
+ this->actor.colChkInfo.damage = 8;
+ func_80833B18(play, this, 4, 0.0f, 0.0f, this->actor.shape.rot.y, 20);
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+Vec3f D_8085D2A4 = { 0.0f, 0.0f, 5.0f };
+
+void func_80840770(PlayState* play, Player* this) {
+ if (this->unk_AE8 != 0) {
+ if (this->unk_AE8 > 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_swimer_swim_wait, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_swimer_swim_wait), ANIMMODE_ONCE,
+ -16.0f);
+ } else {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_derth_rebirth, 1.0f, 99.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_derth_rebirth), ANIMMODE_ONCE,
+ 0.0f);
+ }
+ gSaveContext.healthAccumulator = 0xA0;
+ this->unk_AE8 = -1;
+ }
+ } else if (gSaveContext.healthAccumulator == 0) {
+ Player_StopCutscene(this);
+
+ this->stateFlags1 &= ~PLAYER_STATE1_80;
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_808353DC(play, this);
+ } else {
+ func_8085B384(this, play);
+ }
+
+ this->unk_D6B = 20;
+ func_808339B4(this, -20);
+ Audio_SetBgmVolumeOn();
+ }
+ } else if (this->unk_AE7 != 0) {
+ Player_StopCutscene(this);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_REVIVE];
+ this->unk_AE8 = 60;
+ Player_SpawnFairy(play, this, &this->actor.world.pos, &D_8085D2A4, 5);
+ Player_PlaySfx(this, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ } else if (play->gameOverCtx.state == GAMEOVER_DEATH_WAIT_GROUND) {
+ play->gameOverCtx.state = GAMEOVER_DEATH_FADE_OUT;
+ }
+}
+
+void func_80840980(Player* this, u16 sfxId) {
+ Player_AnimSfx_PlayVoice(this, sfxId);
+}
+
+void func_808409A8(PlayState* play, Player* this, f32 speed, f32 yVelocity) {
+ Actor* heldActor = this->heldActor;
+
+ if (!func_808313A8(play, this, heldActor)) {
+ heldActor->world.rot.y = this->actor.shape.rot.y;
+ heldActor->speed = speed;
+ heldActor->velocity.y = yVelocity;
+ func_808309CC(play, this);
+ Player_PlaySfx(this, NA_SE_PL_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+// Check if bonked and if so, rumble, play sound, etc.
+s32 func_80840A30(PlayState* play, Player* this, f32* arg2, f32 arg3) {
+ Actor* cylinderOc = NULL;
+
+ if (arg3 <= *arg2) {
+ // If interacting with a wall and close to facing it
+ if (((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (D_80862B24 < 0x1C00)) ||
+ // or, impacting something's cylinder
+ (((this->cylinder.base.ocFlags1 & OC1_HIT) && (cylinderOc = this->cylinder.base.oc) != NULL) &&
+ // and that something is a Beaver Race ring,
+ ((cylinderOc->id == ACTOR_EN_TWIG) ||
+ // or something is a tree and `this` is close to facing it (note the this actor's facing direction would
+ // be antiparallel to the cylinder's actor's yaw if this was directly facing it)
+ (((cylinderOc->id == ACTOR_EN_WOOD02) || (cylinderOc->id == ACTOR_EN_SNOWWD) ||
+ (cylinderOc->id == ACTOR_OBJ_TREE)) &&
+ (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, cylinderOc->yawTowardsPlayer)) > 0x6000))))) {
+
+ if (!func_8082DA90(play)) {
+ if (this->doorType == PLAYER_DOORTYPE_STAIRCASE) {
+ func_8085B384(this, play);
+ return true;
+ }
+
+ if (cylinderOc != NULL) {
+ cylinderOc->home.rot.y = 1;
+ } else if (this->actor.wallBgId != BGCHECK_SCENE) { // i.e. was an actor
+ DynaPolyActor* wallPolyActor = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ // Large crates, barrels and palm trees
+ if ((wallPolyActor != NULL) &&
+ ((wallPolyActor->actor.id == ACTOR_OBJ_KIBAKO2) ||
+ (wallPolyActor->actor.id == ACTOR_OBJ_TARU) || (wallPolyActor->actor.id == ACTOR_OBJ_YASI))) {
+ wallPolyActor->actor.home.rot.z = 1;
+ }
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_1000)) {
+ if ((this->stateFlags3 & PLAYER_STATE3_8000) && (func_8084CA24 != this->actionFunc)) {
+ Player_SetAction(play, this, func_80851B58, 0);
+ func_8082DB90(play, this, &gPlayerAnim_link_swimer_swim_hit);
+ func_8082DD2C(play, this);
+ this->linearVelocity *= 0.2f;
+ } else {
+ Player_SetAction(play, this, func_8084C6EC, 0);
+ Player_AnimationPlayOnce(play, this, D_8085BE84[PLAYER_ANIMGROUP_16][this->modelAnimType]);
+ this->unk_AE8 = 1;
+ }
+ }
+
+ this->linearVelocity = -this->linearVelocity;
+ Player_RequestQuake(play, 33267, 3, 12);
+ Player_RequestRumble(play, this, 255, 20, 150, SQ(0));
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_BONK, 2, 100.0f, &this->actor.world.pos);
+ Player_PlaySfx(this, NA_SE_PL_BODY_HIT);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80840CD4(Player* this, PlayState* play) {
+ if (func_808387A0(play, this)) {
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ } else if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ PlayerMeleeWeaponAnimation meleeWeaponAnim;
+
+ if ((this->unk_B08 >= 0.85f) || func_808333CC(this)) {
+ meleeWeaponAnim = D_8085CF84[Player_IsHoldingTwoHandedWeapon(this)];
+ } else {
+ meleeWeaponAnim = D_8085CF80[Player_IsHoldingTwoHandedWeapon(this)];
+ }
+ func_80833864(play, this, meleeWeaponAnim);
+ func_808339B4(this, -8);
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ if (this->unk_AE3[this->unk_ADE] == 0) {
+ this->stateFlags2 |= PLAYER_STATE2_40000000;
+ }
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+void func_80840DEC(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084CE84, 1);
+}
+
+void func_80840E24(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084D18C, 1);
+}
+
+void func_80840E5C(Player* this, PlayState* play) {
+ func_808369F4(this, play);
+ func_8082DC38(this);
+ func_8082E438(play, this, D_8085CF68[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_80840EC0(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_8084CCEC, 1);
+ Player_AnimationPlayLoop(play, this, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->unk_AE8 = 1;
+ this->unk_B38 = 0.0f;
+}
+
+// Spin attack size
+void func_80840F34(Player* this) {
+ Math_StepToF(&this->unk_B08, (CHECK_WEEKEVENTREG(WEEKEVENTREG_23_02)) ? 1.0f : 0.5f, 0.02f);
+}
+
+s32 func_80840F90(PlayState* play, Player* this, CsCmdActorCue* playerAction, f32 arg3, s16 arg4, s32 arg5) {
+ if ((arg5 != 0) && (this->linearVelocity == 0.0f)) {
+ return PlayerAnimation_Update(play, &this->skelAnime);
+ }
+
+ if (arg5 != 2) {
+ f32 halfUpdateRate = R_UPDATE_RATE / 2.0f;
+ f32 curDiffX = playerAction->endPos.x - this->actor.world.pos.x;
+ f32 curDiffZ = playerAction->endPos.z - this->actor.world.pos.z;
+ f32 scaledCurDist = sqrtf(SQ(curDiffX) + SQ(curDiffZ)) / halfUpdateRate;
+ s32 framesLeft = (playerAction->endFrame - play->csCtx.curFrame) + 1;
+
+ arg4 = Math_Atan2S_XY(curDiffZ, curDiffX);
+
+ if (arg5 == 1) {
+ f32 distX = playerAction->endPos.x - playerAction->startPos.x;
+ f32 distZ = playerAction->endPos.z - playerAction->startPos.z;
+ s32 temp = (((sqrtf(SQ(distX) + SQ(distZ)) / halfUpdateRate) /
+ (playerAction->endFrame - playerAction->startFrame)) /
+ 1.5f) *
+ 4.0f;
+ if (temp >= framesLeft) {
+ arg3 = 0.0f;
+ arg4 = this->actor.shape.rot.y;
+ } else {
+ arg3 = scaledCurDist / ((framesLeft - temp) + 1);
+ }
+ } else {
+ arg3 = scaledCurDist / framesLeft;
+ }
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_8083F57C(this, play);
+ func_8083CB58(this, arg3, arg4);
+ if ((arg3 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_80839CD8(this, play);
+ }
+
+ return false;
+}
+
+s32 func_808411D4(PlayState* play, Player* this, f32* arg2, s32 arg3) {
+ f32 xDiff = this->unk_3A0.x - this->actor.world.pos.x;
+ f32 yDiff = this->unk_3A0.z - this->actor.world.pos.z;
+ s32 sp2C;
+ s32 pad2;
+ s16 var_v1;
+
+ sp2C = sqrtf(SQ(xDiff) + SQ(yDiff));
+ var_v1 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_3A0);
+ if (sp2C < arg3) {
+ *arg2 = 0.0f;
+ var_v1 = this->actor.shape.rot.y;
+ }
+ if (func_80840F90(play, this, NULL, *arg2, var_v1, 2)) {
+ return 0;
+ }
+ return sp2C;
+}
+
+void Player_InitMode_0(PlayState* play, Player* this) {
+ this->actor.update = func_801229EC;
+ this->actor.draw = NULL;
+}
+
+void Player_InitMode_2(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80854118, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_okarina_warp_goal, 2.0f / 3.0f, 0.0f, 24.0f,
+ ANIMMODE_ONCE, 0.0f);
+ this->actor.world.pos.y += 800.0f;
+}
+
+u8 D_8085D2B0[] = {
+ ITEM_SWORD_RAZOR,
+ ITEM_SWORD_KOKIRI,
+};
+
+// OoT leftover?
+void func_80841358(PlayState* play, Player* this, s32 arg2) {
+ ItemId item;
+ PlayerItemAction itemAction;
+
+ //! @bug OoB read if player is goron, deku or human
+ item = D_8085D2B0[this->transformation];
+ itemAction = sItemItemActions[item];
+ func_808317C4(this);
+ func_8082DCA0(play, this);
+ this->heldItemId = item;
+ this->nextModelGroup = Player_ActionToModelGroup(this, itemAction);
+ func_8082F8BC(play, this, itemAction);
+ func_808309CC(play, this);
+ if (arg2) {
+ Player_PlaySfx(this, NA_SE_IT_SWORD_PICKOUT);
+ }
+}
+
+Vec3f D_8085D2B4 = { -1.0f, 69.0f, 20.0f };
+
+void Player_InitMode_1(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80852FD4, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ Math_Vec3f_Copy(&this->actor.world.pos, &D_8085D2B4);
+ this->currentYaw = this->actor.shape.rot.y = -0x8000;
+ PlayerAnimation_Change(play, &this->skelAnime, this->ageProperties->unk_A8, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_ONCE,
+ 0.0f);
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_80 | ANIM_FLAG_200);
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {
+ func_80841358(play, this, false);
+ }
+ this->unk_AE8 = 20;
+}
+
+void Player_InitMode_3(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_8085437C, 0);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void Player_InitMode_4(PlayState* play, Player* this) {
+ func_80834DB8(this, &gPlayerAnim_link_normal_jump, 12.0f, play);
+ Player_SetAction(play, this, func_8085439C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->fallStartHeight = this->actor.world.pos.y;
+}
+
+void Player_InitMode_7(PlayState* play, Player* this) {
+ func_80833B18(play, this, 1, 2.0f, 2.0f, this->actor.shape.rot.y + 0x8000, 0);
+}
+
+void Player_InitMode_5(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_808540A0, 0);
+ this->actor.draw = NULL;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+}
+
+void Player_InitMode_6(PlayState* play, Player* this) {
+ if (gSaveContext.save.isOwlSave) {
+ Player_SetAction(play, this, func_808496AC, 0);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_AE8 = 0x28;
+ gSaveContext.save.isOwlSave = false;
+ } else {
+ Player_SetAction(play, this, func_80849FE0, 0);
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->stateFlags2 |= PLAYER_STATE2_20000000;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST7, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, ENTEST7_MINUS1);
+ }
+}
+
+// InitModes 0x8 and 0x9
+void func_80841744(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80855C28, 0);
+ if (PLAYER_GET_INITMODE(&this->actor) == PLAYER_INITMODE_8) {
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+ } else {
+ func_8082DB60(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ }
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_ABC = -10000.0f;
+ this->unk_AE8 = 0x2710;
+ this->unk_B10[5] = 8.0f;
+}
+
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP),
+};
+
+Vec3s D_8085D2C4 = { -57, 3377, 0 };
+
+void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHeader) {
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->currentYaw = this->actor.world.rot.y;
+
+ if ((PLAYER_GET_INITMODE(&this->actor) != PLAYER_INITMODE_TELESCOPE) &&
+ ((gSaveContext.respawnFlag != 2) ||
+ (gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams != PLAYER_PARAMS(0xFF, PLAYER_INITMODE_TELESCOPE)))) {
+ func_808309CC(play, this);
+ SkelAnime_InitPlayer(play, &this->skelAnime, skelHeader, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType],
+ 1 | 8, this->jointTableBuffer, this->morphTableBuffer, PLAYER_LIMB_MAX);
+ this->skelAnime.baseTransl = D_8085D2C4;
+
+ SkelAnime_InitPlayer(play, &this->unk_284, skelHeader, func_8082ED20(this), 1 | 8, this->unk_929, this->unk_9C8,
+ PLAYER_LIMB_MAX);
+ this->unk_284.baseTransl = D_8085D2C4;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ SkelAnime_InitFlex(play, &this->unk_2C8, &gLinkGoronShieldingSkel, &gLinkGoronShieldingAnim,
+ this->jointTable, this->morphTable, LINK_GORON_SHIELDING_LIMB_MAX);
+ }
+
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFeet, this->ageProperties->shadowScale);
+ }
+
+ this->subCamId = CAM_ID_NONE;
+ Collider_InitAndSetCylinder(play, &this->cylinder, &this->actor, &D_8085C2EC);
+ Collider_InitAndSetCylinder(play, &this->shieldCylinder, &this->actor, &D_8085C318);
+ Collider_InitAndSetQuad(play, &this->meleeWeaponQuads[0], &this->actor, &D_8085C344);
+ Collider_InitAndSetQuad(play, &this->meleeWeaponQuads[1], &this->actor, &D_8085C344);
+ Collider_InitAndSetQuad(play, &this->shieldQuad, &this->actor, &D_8085C394);
+}
+
+void func_80841A50(PlayState* play, Player* this) {
+ if ((play->roomCtx.curRoom.num >= 0) && (play->roomCtx.prevRoom.num < 0)) {
+ Math_Vec3f_Copy(&this->unk_3C0, &this->actor.world.pos);
+ this->unk_3CC = this->actor.shape.rot.y;
+ this->unk_3CE = play->roomCtx.curRoom.num;
+ this->unk_3CF = 1;
+ }
+}
+
+typedef void (*PlayerInitModeFunc)(PlayState*, Player*);
+
+// Initialisation functions for various gameplay modes depending on spawn params. There may be at most 0x10 due to it
+// using a single nybble.
+// sInitModeFuncs
+PlayerInitModeFunc D_8085D2CC[0x10] = {
+ /* 0x0 */ Player_InitMode_0,
+ /* 0x1 */ Player_InitMode_1,
+ /* 0x2 */ Player_InitMode_2,
+ /* 0x3 */ Player_InitMode_3,
+ /* 0x4 */ Player_InitMode_4,
+ /* 0x5 */ Player_InitMode_5,
+ /* 0x6 */ Player_InitMode_6,
+ /* 0x7 */ Player_InitMode_7,
+ /* 0x8 */ func_80841744,
+ /* 0x9 */ func_80841744,
+ /* 0xA */ func_8083ADF0,
+ /* 0xB */ Player_InitMode_B,
+ /* 0xC */ Player_InitMode_Telescope,
+ /* 0xD */ Player_InitMode_D,
+ /* 0xE */ func_8083ADF0,
+ /* 0xF */ Player_InitMode_F,
+};
+
+// sBlureInit
+EffectBlureInit2 D_8085D30C = {
+ 0, 8, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, 4,
+ 0, 2, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
+};
+
+// sTireMarkInit ?
+EffectTireMarkInit D_8085D330 = { 0, 63, { 0, 0, 15, 100 } };
+
+// sTireMarkGoronColor ?
+Color_RGBA8 D_8085D338 = { 0, 0, 15, 100 };
+// sTireMarkOtherColor ?
+Color_RGBA8 D_8085D33C = { 0, 0, 0, 150 };
+Vec3f D_8085D340 = { 0.0f, 50.0f, 0.0f };
+
+void Player_Init(Actor* thisx, PlayState* play) {
+ s32 pad;
+ Player* this = THIS;
+ s8 objBankIndex;
+ s32 respawnFlag;
+ s32 var_a1;
+ PlayerInitMode initMode;
+
+ play->playerInit = Player_InitCommon;
+ play->playerUpdate = Player_UpdateCommon;
+ play->unk_18770 = func_8085B170;
+ play->startPlayerFishing = Player_StartFishing;
+ play->grabPlayer = Player_GrabPlayer;
+ play->startPlayerCutscene = func_8085B28C;
+ play->func_18780 = func_8085B384;
+ play->damagePlayer = Player_InflictDamage;
+ play->talkWithPlayer = Player_TalkWithPlayer;
+ play->unk_1878C = func_8085B74C;
+ play->unk_18790 = func_8085B820;
+ play->unk_18794 = func_8085B854;
+ play->setPlayerTalkAnim = func_8085B930;
+
+ gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId = GAMEPLAY_KEEP;
+
+ this->actor.room = -1;
+ this->csId = CS_ID_NONE;
+
+ if (this->actor.shape.rot.x != 0) {
+ this->transformation = this->actor.shape.rot.x - 1;
+
+ objBankIndex = Object_GetIndex(&play->objectCtx, gPlayerFormObjectIndices[this->transformation]);
+ this->actor.objBankIndex = objBankIndex;
+ if (objBankIndex < 0) {
+ Actor_Kill(&this->actor);
+ return;
+ }
+
+ Actor_SetObjectDependency(play, &this->actor);
+ } else {
+ this->transformation = gSaveContext.save.playerForm;
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ if (gSaveContext.save.equippedMask == PLAYER_MASK_GIANT) {
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+ this->currentMask = gSaveContext.save.equippedMask;
+ } else {
+ this->currentMask = this->transformation + PLAYER_MASK_FIERCE_DEITY;
+ gSaveContext.save.equippedMask = PLAYER_MASK_NONE;
+ }
+
+ Inventory_UpdateDeitySwordEquip(play);
+
+ this->unk_B28 = 0;
+ this->unk_B90 = 0;
+ this->unk_B92 = 0;
+ this->unk_B94 = 0;
+ this->unk_B96 = 0;
+ this->stateFlags1 &= ~(PLAYER_STATE1_8 | PLAYER_STATE1_1000 | PLAYER_STATE1_1000000 | PLAYER_STATE1_2000000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_20000 | PLAYER_STATE2_1000000 | PLAYER_STATE2_40000000);
+ this->stateFlags3 &=
+ ~(PLAYER_STATE3_8 | PLAYER_STATE3_40 | PLAYER_STATE3_80 | PLAYER_STATE3_100 | PLAYER_STATE3_200 |
+ PLAYER_STATE3_800 | PLAYER_STATE3_1000 | PLAYER_STATE3_2000 | PLAYER_STATE3_8000 | PLAYER_STATE3_10000 |
+ PLAYER_STATE3_40000 | PLAYER_STATE3_80000 | PLAYER_STATE3_100000 | PLAYER_STATE3_200000 |
+ PLAYER_STATE3_800000 | PLAYER_STATE3_1000000 | PLAYER_STATE3_2000000);
+ this->unk_B08 = 0.0f;
+ this->unk_B0C = 0.0f;
+ }
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ this->unk_B10[0] = 1.0f;
+ } else {
+ this->unk_B10[0] = 0.0f;
+ }
+ }
+
+ this->actor.flags &= ~(ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH | ACTOR_FLAG_CAN_PRESS_SWITCH);
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_SWITCH;
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->actor.flags |= ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH;
+ }
+ }
+
+ this->ageProperties = &sPlayerAgeProperties[this->transformation];
+
+ this->itemAction = PLAYER_IA_NONE;
+ this->heldItemAction = PLAYER_IA_NONE;
+ this->heldItemId = ITEM_NONE;
+
+ func_80831990(play, this, ITEM_NONE);
+ Player_SetEquipmentData(play, this);
+ this->prevBoots = this->currentBoots;
+ Player_InitCommon(this, play, gPlayerSkeletons[this->transformation]);
+
+ if (this->actor.shape.rot.z != 0) {
+ EffectTireMark* tireMark;
+
+ this->actor.shape.rot.z = 0;
+ Player_OverrideBlureColors(play, this, 0, 4);
+
+ tireMark = Effect_GetByIndex(this->meleeWeaponEffectIndex[2]);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ tireMark->color = D_8085D338;
+ } else {
+ tireMark->color = D_8085D33C;
+ }
+
+ if ((this->csMode == PLAYER_CSMODE_9) || (this->csMode == PLAYER_CSMODE_93)) {
+ Player_SetAction(play, this, func_8085B08C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else {
+ Player_SetAction(play, this, func_80855818, 0);
+ this->actor.shape.rot.y = this->currentYaw;
+
+ if (this->prevMask != PLAYER_MASK_NONE) {
+ func_8082DB90(play, this, &gPlayerAnim_cl_maskoff);
+ } else if (this->transformation == PLAYER_FORM_HUMAN) {
+ PlayerAnimation_Change(play, &this->skelAnime, D_8085D160[this->transformation], -2.0f / 3.0f, 9.0f,
+ 0.0f, ANIMMODE_ONCE, 0.0f);
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_cl_setmaskend);
+ }
+
+ this->stateFlags1 |= (PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000);
+ this->stateFlags3 |= PLAYER_STATE3_20000;
+ this->unk_B10[5] = 3.0f;
+ }
+ return;
+ }
+
+ this->prevMask = this->currentMask;
+
+ Effect_Add(play, &this->meleeWeaponEffectIndex[0], EFFECT_BLURE2, 0, 0, &D_8085D30C);
+ Effect_Add(play, &this->meleeWeaponEffectIndex[1], EFFECT_BLURE2, 0, 0, &D_8085D30C);
+
+ Player_OverrideBlureColors(play, this, 0, 4);
+ if (this->transformation == PLAYER_FORM_GORON) {
+ D_8085D330.color = D_8085D338;
+ } else {
+ D_8085D330.color = D_8085D33C;
+ }
+ Effect_Add(play, &this->meleeWeaponEffectIndex[2], EFFECT_TIRE_MARK, 0, 0, &D_8085D330);
+
+ if (this->actor.shape.rot.x != 0) {
+ this->actor.shape.rot.x = 0;
+ this->csMode = PLAYER_CSMODE_68;
+ Player_SetAction(play, this, func_8085B08C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ return;
+ }
+
+ play->unk_1887C = 0;
+ play->unk_1887D = 0;
+ play->unk_1887E = 0;
+ this->giObjectSegment = ZeldaArena_Malloc(0x2000);
+ this->maskObjectSegment = ZeldaArena_Malloc(0x3800);
+
+ Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 255, 128, 0, -1);
+ this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo);
+ Play_AssignPlayerCsIdsFromScene(&play->state, this->actor.csId);
+
+ respawnFlag = gSaveContext.respawnFlag;
+ if (respawnFlag != 0) {
+ if (respawnFlag == -3) {
+ this->actor.params = gSaveContext.respawn[RESPAWN_MODE_UNK_3].playerParams;
+ } else {
+ if ((respawnFlag == 1) || (respawnFlag == -1)) {
+ this->unk_D6A = -2;
+ }
+
+ if (respawnFlag != -7) {
+ s32 respawnIndex;
+
+ if ((respawnFlag == -8) || (respawnFlag == -5) || (respawnFlag == -4)) {
+ respawnFlag = 1;
+ }
+
+ if ((respawnFlag < 0) && (respawnFlag != -1) && (respawnFlag != -6)) {
+ respawnIndex = RESPAWN_MODE_DOWN;
+ } else {
+ respawnIndex = (respawnFlag < 0) ? RESPAWN_MODE_TOP : respawnFlag - 1;
+
+ Math_Vec3f_Copy(&this->actor.world.pos, &gSaveContext.respawn[respawnIndex].pos);
+ Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
+
+ this->fallStartHeight = this->actor.world.pos.y;
+
+ this->currentYaw = this->actor.shape.rot.y = gSaveContext.respawn[respawnIndex].yaw;
+ this->actor.params = gSaveContext.respawn[respawnIndex].playerParams;
+ }
+
+ play->actorCtx.sceneFlags.switches[2] = gSaveContext.respawn[respawnIndex].tempSwitchFlags;
+ play->actorCtx.sceneFlags.collectible[1] = gSaveContext.respawn[respawnIndex].unk_18;
+ play->actorCtx.sceneFlags.collectible[2] = gSaveContext.respawn[respawnIndex].tempCollectFlags;
+ }
+ }
+ }
+
+ var_a1 = ((respawnFlag == 4) || (gSaveContext.respawnFlag == -4)) ? 1 : 0;
+ if (func_801226E0(play, var_a1) == 0) {
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].playerParams = PLAYER_PARAMS(thisx->params, PLAYER_INITMODE_D);
+ }
+
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1;
+ if (respawnFlag == 0) {
+ gSaveContext.respawn[RESPAWN_MODE_TOP] = gSaveContext.respawn[RESPAWN_MODE_DOWN];
+ }
+ gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams =
+ PLAYER_PARAMS(gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams, PLAYER_INITMODE_D);
+
+ initMode = PLAYER_GET_INITMODE(&this->actor);
+ if (((initMode == PLAYER_INITMODE_5) || (initMode == PLAYER_INITMODE_6)) &&
+ (gSaveContext.save.cutsceneIndex >= 0xFFF0)) {
+ initMode = PLAYER_INITMODE_D;
+ }
+
+ D_8085D2CC[initMode](play, this);
+
+ if ((this->actor.draw != NULL) && gSaveContext.save.hasTatl &&
+ ((gSaveContext.gameMode == GAMEMODE_NORMAL) || (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) &&
+ (play->sceneId != SCENE_SPOT00)) {
+ this->tatlActor = Player_SpawnFairy(play, this, &this->actor.world.pos, &D_8085D340, 0);
+
+ if (gSaveContext.dogParams != 0) {
+ gSaveContext.dogParams |= 0x8000;
+ }
+
+ if (gSaveContext.powderKegTimer != 0) {
+ this->nextModelGroup = Player_ActionToModelGroup(this, PLAYER_IA_POWDER_KEG);
+ this->heldItemId = ITEM_POWDER_KEG;
+ func_8082F8BC(play, this, PLAYER_IA_POWDER_KEG);
+ func_808313F0(this, play);
+ } else if (gSaveContext.unk_1014 != 0) {
+ func_8082F5FC(this, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_MM,
+ this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0, 0x8000));
+ func_808313F0(this, play);
+ }
+ }
+
+ Minimap_SavePlayerRoomInitInfo(play);
+ func_80841A50(play, this);
+ this->unk_3CF = 0;
+ R_PLAY_FILL_SCREEN_ON = 0;
+}
+
+void func_80842510(s16* arg0) {
+ s16 temp_ft0;
+
+ temp_ft0 = (ABS_ALT(*arg0) * 100.0f) / 1000.0f;
+ temp_ft0 = CLAMP(temp_ft0, 0x190, 0xFA0);
+
+ Math_ScaledStepToS(arg0, 0, temp_ft0);
+}
+
+void func_808425B4(Player* this) {
+ if (!(this->unk_AA6 & 2)) {
+ s16 sp26 = this->actor.focus.rot.y - this->actor.shape.rot.y;
+
+ func_80842510(&sp26);
+ this->actor.focus.rot.y = this->actor.shape.rot.y + sp26;
+ }
+ if (!(this->unk_AA6 & 1)) {
+ func_80842510(&this->actor.focus.rot.x);
+ }
+ if (!(this->unk_AA6 & 8)) {
+ func_80842510(&this->headLimbRot.x);
+ }
+ if (!(this->unk_AA6 & 0x40)) {
+ func_80842510(&this->upperLimbRot.x);
+ }
+ if (!(this->unk_AA6 & 4)) {
+ func_80842510(&this->actor.focus.rot.z);
+ }
+ if (!(this->unk_AA6 & 0x10)) {
+ func_80842510(&this->headLimbRot.y);
+ }
+ if (!(this->unk_AA6 & 0x20)) {
+ func_80842510(&this->headLimbRot.z);
+ }
+ if (!(this->unk_AA6 & 0x80)) {
+ if (this->unk_AA8 != 0) {
+ func_80842510(&this->unk_AA8);
+ } else {
+ func_80842510(&this->upperLimbRot.y);
+ }
+ }
+ if (!(this->unk_AA6 & 0x100)) {
+ func_80842510(&this->upperLimbRot.z);
+ }
+
+ this->unk_AA6 = 0;
+}
+
+/**
+ * Sets the DoAction for the interface A/B buttons, depending on a significant number of things
+ */
+void Player_SetDoAction(PlayState* play, Player* this) {
+ DoAction doActionB;
+ s32 sp38;
+
+ if (this != GET_PLAYER(play)) {
+ return;
+ }
+
+ doActionB = -1;
+ sp38 = func_801242B4(this) || (func_8084CA24 == this->actionFunc);
+
+ // Set B do action
+ if (this->transformation == PLAYER_FORM_GORON) {
+ if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ doActionB = DO_ACTION_NONE;
+ } else if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ doActionB = DO_ACTION_POUND;
+ } else {
+ doActionB = DO_ACTION_PUNCH;
+ }
+ } else if (this->transformation == PLAYER_FORM_ZORA) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_8000000)) ||
+ (!sp38 && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ doActionB = DO_ACTION_PUNCH;
+ } else {
+ doActionB = DO_ACTION_DIVE;
+ }
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ doActionB = DO_ACTION_SHOOT;
+ } else { // PLAYER_FORM_HUMAN
+ if (this->currentMask == PLAYER_MASK_BLAST) {
+ doActionB = DO_ACTION_EXPLODE;
+ } else if (this->currentMask == PLAYER_MASK_BREMEN) {
+ doActionB = DO_ACTION_MARCH;
+ } else if (this->currentMask == PLAYER_MASK_KAMARO) {
+ doActionB = DO_ACTION_DANCE;
+ }
+ }
+
+ if (doActionB > -1) {
+ func_801155B4(play, doActionB);
+ } else if (play->interfaceCtx.unk_21C != 0) {
+ play->interfaceCtx.unk_21C = 0;
+ play->interfaceCtx.bButtonDoAction = 0;
+ }
+
+ // Set A do action
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) ||
+ ((play->msgCtx.currentTextId >= 0x100) && (play->msgCtx.currentTextId <= 0x200)) ||
+ ((play->msgCtx.currentTextId >= 0x1BB2) && (play->msgCtx.currentTextId < 0x1BB7))) {
+ Actor* heldActor = this->heldActor;
+ Actor* interactRangeActor = this->interactRangeActor;
+ s32 pad;
+ s32 sp28 = this->unk_AE3[this->unk_ADE];
+ s32 sp24;
+ DoAction doActionA =
+ ((this->transformation == PLAYER_FORM_GORON) && !(this->stateFlags1 & PLAYER_STATE1_400000))
+ ? DO_ACTION_CURL
+ : DO_ACTION_NONE;
+
+ if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
+ doActionA = DO_ACTION_SNAP;
+ } else if (Player_InBlockingCsMode(play, this) || (this->actor.flags & ACTOR_FLAG_20000000) ||
+ (this->stateFlags1 & PLAYER_STATE1_1000) || (this->stateFlags3 & PLAYER_STATE3_80000) ||
+ (func_80854430 == this->actionFunc)) {
+ doActionA = DO_ACTION_NONE;
+ } else if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ doActionA = DO_ACTION_RETURN;
+ } else if ((this->heldItemAction == PLAYER_IA_FISHING_ROD) && (this->unk_B28 != 0)) {
+ doActionA = (this->unk_B28 == 2) ? DO_ACTION_REEL : DO_ACTION_NONE;
+ doActionA = (this->unk_B28 == 2) ? DO_ACTION_REEL : DO_ACTION_NONE; //! FAKE: duplicated statement
+ } else if (this->stateFlags3 & PLAYER_STATE3_2000) {
+ doActionA = DO_ACTION_DOWN;
+ } else if ((this->doorType != PLAYER_DOORTYPE_NONE) && (this->doorType != PLAYER_DOORTYPE_STAIRCASE) &&
+ !(this->stateFlags1 & PLAYER_STATE1_800)) {
+ doActionA = DO_ACTION_OPEN;
+ } else if (this->stateFlags3 & PLAYER_STATE3_200000) {
+ static u8 D_8085D34C[] = {
+ DO_ACTION_1, DO_ACTION_2, DO_ACTION_3, DO_ACTION_4, DO_ACTION_5, DO_ACTION_6, DO_ACTION_7, DO_ACTION_8,
+ };
+
+ doActionA = D_8085D34C[this->remainingHopsCounter];
+ } else if ((!(this->stateFlags1 & PLAYER_STATE1_800) || (heldActor == NULL)) && (interactRangeActor != NULL) &&
+ (this->getItemId < GI_NONE)) {
+ doActionA = DO_ACTION_OPEN;
+ } else if (!sp38 && (this->stateFlags2 & PLAYER_STATE2_1)) {
+ doActionA = DO_ACTION_GRAB;
+ } else if ((this->stateFlags2 & PLAYER_STATE2_4) ||
+ (!(this->stateFlags1 & PLAYER_STATE1_800000) && (this->rideActor != NULL))) {
+ doActionA = DO_ACTION_CLIMB;
+ } else if ((this->stateFlags1 & PLAYER_STATE1_800000) &&
+ (!EN_HORSE_CHECK_4((EnHorse*)this->rideActor) && (func_808505D0 != this->actionFunc))) {
+ if ((this->stateFlags2 & PLAYER_STATE2_2) && (this->talkActor != NULL)) {
+ if ((this->talkActor->category == ACTORCAT_NPC) || (this->talkActor->id == ACTOR_DM_CHAR08)) {
+ doActionA = DO_ACTION_SPEAK;
+ } else {
+ doActionA = DO_ACTION_CHECK;
+ }
+ } else if (!func_8082DA90(play) && !func_800B7128(this) && !(this->stateFlags1 & PLAYER_STATE1_100000)) {
+ doActionA = DO_ACTION_FASTER;
+ } else {
+ doActionA = DO_ACTION_NONE;
+ }
+ } else if ((this->stateFlags2 & PLAYER_STATE2_2) && (this->talkActor != NULL)) {
+ if ((this->talkActor->category == ACTORCAT_NPC) || (this->talkActor->category == ACTORCAT_ENEMY) ||
+ (this->talkActor->id == ACTOR_DM_CHAR08)) {
+ doActionA = DO_ACTION_SPEAK;
+ } else {
+ doActionA = DO_ACTION_CHECK;
+ }
+ } else if ((this->stateFlags1 & (PLAYER_STATE1_2000 | PLAYER_STATE1_200000)) ||
+ ((this->stateFlags1 & PLAYER_STATE1_800000) && (this->stateFlags2 & PLAYER_STATE2_400000))) {
+ doActionA = DO_ACTION_DOWN;
+ } else if ((this->stateFlags1 & PLAYER_STATE1_800) && (this->getItemId == GI_NONE) && (heldActor != NULL)) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (heldActor->id == ACTOR_EN_NIW)) {
+ if (!func_8083D738(this, heldActor)) {
+ doActionA = DO_ACTION_DROP;
+ } else {
+ doActionA = DO_ACTION_THROW;
+ }
+ } else {
+ doActionA = DO_ACTION_NONE;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_10000) {
+ doActionA = DO_ACTION_GRAB;
+ } else if (this->stateFlags2 & PLAYER_STATE2_800) {
+ static u8 D_8085D354[] = { DO_ACTION_1, DO_ACTION_2 };
+ s32 var_v0;
+
+ var_v0 = ((120.0f - this->actor.depthInWater) / 40.0f);
+ var_v0 = CLAMP(var_v0, 0, ARRAY_COUNT(D_8085D354) - 1);
+
+ doActionA = D_8085D354[var_v0];
+ } else if (this->stateFlags3 & PLAYER_STATE3_100) {
+ doActionA = DO_ACTION_JUMP;
+ } else if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ doActionA = DO_ACTION_RETURN;
+ } else if (!func_8082FBE8(this) && (this->stateFlags1 & PLAYER_STATE1_8000000) && !sp38) {
+ doActionA = DO_ACTION_SURFACE;
+ } else if (((this->transformation != PLAYER_FORM_DEKU) &&
+ (sp38 || ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)))) ||
+ ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ func_800C9DDC(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) {
+ doActionA = (this->transformation == PLAYER_FORM_ZORA) ? DO_ACTION_SWIM
+ : ((this->stateFlags1 & PLAYER_STATE1_8000000) && (interactRangeActor != NULL) &&
+ (interactRangeActor->id == ACTOR_EN_ZOG))
+ ? DO_ACTION_GRAB
+ : DO_ACTION_DIVE;
+ } else {
+ sp24 = func_8082FBE8(this);
+ if ((sp24 && (this->transformation != PLAYER_FORM_DEKU)) || !(this->stateFlags1 & PLAYER_STATE1_400000) ||
+ !Player_IsGoronOrDeku(this)) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_4000)) && (sp28 <= 0) &&
+ ((func_80123420(this)) ||
+ ((sPlayerCurrentFloorType != FLOOR_TYPE_7) &&
+ ((func_80123434(this)) || ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) &&
+ !(this->stateFlags1 & PLAYER_STATE1_400000) && (sp28 == 0)))))) {
+ doActionA = DO_ACTION_ATTACK;
+ } else if ((play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_2) && sp24 && (sp28 > 0)) {
+ doActionA = DO_ACTION_JUMP;
+ } else if ((this->transformation == PLAYER_FORM_DEKU) && !(this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ doActionA = DO_ACTION_ATTACK;
+ } else if (((this->transformation == PLAYER_FORM_HUMAN) ||
+ (this->transformation == PLAYER_FORM_ZORA)) &&
+ ((this->heldItemAction >= PLAYER_IA_SWORD_KOKIRI) ||
+ ((this->stateFlags2 & PLAYER_STATE2_100000) &&
+ (play->actorCtx.targetContext.arrowPointedActor == NULL)))) {
+ doActionA = DO_ACTION_PUTAWAY;
+
+ if (play->msgCtx.currentTextId == 0) {} //! FAKE
+ }
+ }
+ }
+
+ if (doActionA != DO_ACTION_PUTAWAY) {
+ this->putAwayCountdown = 20;
+ } else if (this->putAwayCountdown != 0) {
+ doActionA = DO_ACTION_NONE;
+ this->putAwayCountdown--;
+ }
+
+ func_8011552C(play, doActionA);
+
+ // Set Tatl state
+ if (!Play_InCsMode(play) && (this->stateFlags2 & PLAYER_STATE2_200000) &&
+ !(this->stateFlags3 & PLAYER_STATE3_100)) {
+ if (this->targetedActor != NULL) {
+ func_80115764(play, 0x2B);
+ } else {
+ func_80115764(play, 0x2A);
+ }
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else {
+ func_80115764(play, 0x2C);
+ }
+ }
+}
+
+s32 func_808430E0(Player* this) {
+ if ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
+ func_8083784C(this)) {
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ }
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ return false;
+ }
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ sPlayerCurrentFloorType = FLOOR_TYPE_0;
+ }
+ this->unk_B6C = 0;
+ this->unk_B6E = 0;
+ D_80862B28 = 0;
+ return true;
+}
+
+void func_80843178(PlayState* play, Player* this) {
+ u8 spC7 = 0;
+ CollisionPoly* floorPoly;
+ f32 temp_fv0;
+ f32 temp_fv0_3;
+ f32 temp_fv1;
+ u32 updBgCheckInfoFlags;
+ s32 spAC = (func_8084D820 == this->actionFunc) && (this->unk_397 == 4);
+
+ sPlayerPrevFloorProperty = this->floorProperty;
+
+ temp_fv0 = this->ageProperties->unk_38;
+ temp_fv1 = this->ageProperties->unk_00;
+
+ if (this->stateFlags1 & (PLAYER_STATE1_20000000 | PLAYER_STATE1_80000000)) {
+ if ((!(this->stateFlags1 & PLAYER_STATE1_80) && !(this->stateFlags2 & PLAYER_STATE2_4000) &&
+ (this->stateFlags1 & PLAYER_STATE1_80000000)) ||
+ spAC) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ } else {
+ if ((this->stateFlags1 & 1) && (play->roomCtx.curRoom.behaviorType1 != ROOM_BEHAVIOR_TYPE1_1) &&
+ ((this->unk_D68 - (s32)this->actor.world.pos.y) >= 100)) {
+ updBgCheckInfoFlags =
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_1) &&
+ ((func_8084E034 == this->actionFunc) || (func_8084D820 == this->actionFunc))) {
+ updBgCheckInfoFlags =
+ UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ this->actor.bgCheckFlags &= ~(BGCHECKFLAG_WALL | BGCHECKFLAG_PLAYER_WALL_INTERACT);
+ } else {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ }
+ }
+ } else {
+ if (func_808561B0 == this->actionFunc) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_800;
+ } else if ((this->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) && (this->linearVelocity >= 8.0f)) {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20 | UPDBGCHECKINFO_FLAG_100 |
+ UPDBGCHECKINFO_FLAG_200;
+ } else {
+ updBgCheckInfoFlags = UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4 |
+ UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10 | UPDBGCHECKINFO_FLAG_20;
+ }
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_1) {
+ updBgCheckInfoFlags &= ~(UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
+ }
+ if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_4) {
+ this->stateFlags3 |= PLAYER_STATE3_10;
+ }
+
+ if (func_801242B4(this)) {
+ updBgCheckInfoFlags &= ~(UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
+ }
+
+ Actor_UpdateBgCheckInfo(play, &this->actor, 268 * 0.1f, temp_fv0, temp_fv1, updBgCheckInfoFlags);
+
+ this->unk_AC0 -= (this->actor.world.pos.y - this->actor.prevPos.y) / this->actor.scale.y;
+ this->unk_AC0 = CLAMP(this->unk_AC0, -1000.0f, 1000.0f);
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
+ this->actor.velocity.y = 0.0f;
+ }
+
+ D_80862B18 = this->actor.world.pos.y - this->actor.floorHeight;
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ floorPoly = this->actor.floorPoly;
+
+ if ((floorPoly != NULL) && (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_4)) {
+ this->floorProperty = SurfaceType_GetFloorProperty(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (this == GET_PLAYER(play)) {
+ func_801A3CF4(SurfaceType_GetEcho(&play->colCtx, floorPoly, this->actor.floorBgId));
+ if (this->actor.floorBgId == BGCHECK_SCENE) {
+ func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, this->actor.floorBgId));
+ } else {
+ DynaPoly_SetPlayerAbove(&play->colCtx, this->actor.floorBgId);
+ }
+ }
+
+ sPlayerConveyorSpeedIndex = SurfaceType_GetConveyorSpeed(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ sPlayerIsOnFloorConveyor = SurfaceType_IsFloorConveyor(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if ((!sPlayerIsOnFloorConveyor && (this->actor.depthInWater > 20.0f)) ||
+ (sPlayerIsOnFloorConveyor && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ D_80862B16 = SurfaceType_GetConveyorDirection(&play->colCtx, floorPoly, this->actor.floorBgId) << 0xA;
+ } else {
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ }
+ }
+ }
+
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ static Vec3f D_8085D358 = { 0.0f, 0.0f, 0.0f };
+ CollisionPoly* spA8;
+ s32 spA4;
+ s16 temp_v1_3;
+ f32 sp9C;
+
+ D_8085D358.y = 178.0f * 0.1f;
+ D_8085D358.z = this->ageProperties->unk_38 + 10.0f;
+
+ if (func_80835D58(play, this, &D_8085D358, &spA8, &spA4, &D_80862B30)) {
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_WALL_INTERACT;
+ if (spA8 != this->actor.wallPoly) {
+ this->actor.wallPoly = spA8;
+ this->actor.wallBgId = spA4;
+ this->actor.wallYaw = Math_Atan2S_XY(spA8->normal.z, spA8->normal.x);
+ }
+ }
+
+ temp_v1_3 = this->actor.shape.rot.y - BINANG_ADD(this->actor.wallYaw, 0x8000);
+ sPlayerCurrentWallFlags = SurfaceType_GetWallFlags(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId);
+ D_80862B20 = ABS_ALT(temp_v1_3);
+ temp_v1_3 = BINANG_SUB(this->currentYaw, BINANG_ADD(this->actor.wallYaw, 0x8000));
+ D_80862B24 = ABS_ALT(temp_v1_3);
+
+ temp_fv0_3 = D_80862B24 * 0.00008f;
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (temp_fv0_3 >= 1.0f)) {
+ this->unk_B50 = R_RUN_SPEED_LIMIT / 100.0f;
+ } else {
+ temp_fv1 = (R_RUN_SPEED_LIMIT / 100.0f) * temp_fv0_3;
+
+ this->unk_B50 = temp_fv1;
+ if (temp_fv1 < 0.1f) {
+ this->unk_B50 = 0.1f;
+ }
+ }
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (D_80862B20 < 0x3000)) {
+ CollisionPoly* wallPoly = this->actor.wallPoly;
+
+ if (ABS_ALT(wallPoly->normal.y) < 0x258) {
+ f32 wallPolyNormalX = COLPOLY_GET_NORMAL(wallPoly->normal.x);
+ f32 wallPolyNormalY = COLPOLY_GET_NORMAL(wallPoly->normal.y);
+ f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z);
+ f32 temp_fv1_3;
+ CollisionPoly* sp84;
+ CollisionPoly* sp80;
+ s32 sp7C;
+ Vec3f sp70;
+ f32 temp_fv0_5;
+ f32 sp68;
+ s32 temp_v1_6;
+
+ this->wallDistance = Math3D_UDistPlaneToPos(wallPolyNormalX, wallPolyNormalY, wallPolyNormalZ,
+ wallPoly->dist, &this->actor.world.pos);
+ temp_fv1_3 = this->wallDistance + 10.0f;
+ sp70.x = this->actor.world.pos.x - (temp_fv1_3 * wallPolyNormalX);
+ sp70.z = this->actor.world.pos.z - (temp_fv1_3 * wallPolyNormalZ);
+ sp70.y = this->actor.world.pos.y + this->ageProperties->unk_0C;
+ temp_fv0_5 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp84, &sp7C, &this->actor, &sp70);
+
+ this->wallHeight = temp_fv0_5 - this->actor.world.pos.y;
+ if ((this->wallHeight < 178.0f * 0.1f) ||
+ ((BgCheck_EntityCheckCeiling(&play->colCtx, &sp68, &this->actor.world.pos,
+ (temp_fv0_5 - this->actor.world.pos.y) + 20.0f, &sp80, &sp7C,
+ &this->actor) != 0))) {
+ this->wallHeight = 399.96002f;
+ } else {
+ D_8085D358.y = (temp_fv0_5 + 5.0f) - this->actor.world.pos.y;
+
+ if ((func_80835D58(play, this, &D_8085D358, &sp80, &sp7C, &D_80862B30)) &&
+ (temp_v1_6 = this->actor.wallYaw - Math_Atan2S_XY(sp80->normal.z, sp80->normal.x),
+ ABS_ALT(temp_v1_6) < 0x4000) &&
+ !(SurfaceType_CheckWallFlag1(&play->colCtx, sp80, sp7C))) {
+ this->wallHeight = 399.96002f;
+ } else if (SurfaceType_CheckWallFlag0(&play->colCtx, wallPoly, this->actor.wallBgId) == 0) {
+ if (this->ageProperties->unk_1C <= this->wallHeight) {
+ if (ABS_ALT(sp84->normal.y) > 0x5DC0) {
+ if ((this->ageProperties->unk_14 <= this->wallHeight) || func_801242B4(this)) {
+ spC7 = 4;
+ } else if (this->ageProperties->unk_18 <= this->wallHeight) {
+ spC7 = 3;
+ } else {
+ spC7 = 2;
+ }
+ }
+ } else {
+ spC7 = 1;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ this->unk_B50 = R_RUN_SPEED_LIMIT / 100.0f;
+ this->wallHeight = 0.0f;
+ this->unk_B5D = 0;
+ }
+
+ if (spC7 == this->unk_B5C) {
+ if (this->linearVelocity != 0.0f) {
+ if (this->unk_B5D < 0x64) {
+ this->unk_B5D++;
+ }
+ }
+ } else {
+ this->unk_B5C = spC7;
+ this->unk_B5D = 0;
+ }
+
+ sPlayerCurrentFloorType = SurfaceType_GetFloorType(&play->colCtx, floorPoly, this->actor.floorBgId);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ f32 floorPolyNormalX;
+ f32 floorPolyNormalY;
+ f32 floorPolyNormalZ;
+ f32 sp54;
+ s32 pad;
+ f32 sp4C;
+
+ D_80862B40 = SurfaceType_GetFloorEffect(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+ if (func_808430E0(this) == 0) {
+ floorPolyNormalY = COLPOLY_GET_NORMAL(floorPoly->normal.y);
+
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ DynaPoly_SetPlayerOnTop(&play->colCtx, this->actor.floorBgId);
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) && (this->actor.depthInWater <= 24.0f) &&
+ (D_80862B40 != FLOOR_EFFECT_1) && (sPlayerConveyorSpeedIndex == CONVEYOR_SPEED_DISABLED) &&
+ (floorPolyNormalY > 0.5f)) {
+ if (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_SONG_WARP]) {
+ func_80841A50(play, this);
+ }
+ }
+
+ floorPolyNormalX = COLPOLY_GET_NORMAL(floorPoly->normal.x);
+ floorPolyNormalY = 1.0f / floorPolyNormalY;
+ floorPolyNormalZ = COLPOLY_GET_NORMAL(floorPoly->normal.z);
+
+ sp54 = Math_SinS(this->currentYaw);
+ sp4C = Math_CosS(this->currentYaw);
+ this->unk_B6C =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp54) - (floorPolyNormalZ * sp4C)) * floorPolyNormalY);
+ this->unk_B6E =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp4C) - (floorPolyNormalZ * sp54)) * floorPolyNormalY);
+ sp54 = Math_SinS(this->actor.shape.rot.y);
+ sp4C = Math_CosS(this->actor.shape.rot.y);
+ D_80862B28 =
+ Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sp54) - (floorPolyNormalZ * sp4C)) * floorPolyNormalY);
+ func_8083CF68(play, this);
+ }
+ } else {
+ func_808430E0(this);
+ D_80862B40 = FLOOR_EFFECT_0;
+ }
+
+ if (floorPoly != NULL) {
+ this->unk_D66 = this->floorSfxOffset;
+ if (spAC != 0) {
+ this->floorSfxOffset = NA_SE_PL_WALK_CONCRETE - SFX_FLAG;
+ return;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER) {
+ if (this->actor.depthInWater < 50.0f) {
+ if (this->actor.depthInWater < 20.0f) {
+ this->floorSfxOffset = (sPlayerCurrentFloorType == FLOOR_TYPE_13) ? NA_SE_PL_WALK_DIRT - SFX_FLAG
+ : NA_SE_PL_WALK_WATER0 - SFX_FLAG;
+ } else {
+ this->floorSfxOffset = (sPlayerCurrentFloorType == FLOOR_TYPE_13) ? NA_CODE_DIRT_DEEP - SFX_FLAG
+ : NA_SE_PL_WALK_WATER1 - SFX_FLAG;
+ }
+
+ return;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_200) {
+ this->floorSfxOffset = NA_SE_PL_WALK_SAND - SFX_FLAG;
+ } else if (COLPOLY_GET_NORMAL(floorPoly->normal.y) > 0.5f) {
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, floorPoly, this->actor.floorBgId);
+ }
+ }
+}
+
+void Player_UpdateCamAndSeqModes(PlayState* play, Player* this) {
+ u8 seqMode;
+ s32 pad[2];
+ Camera* camera;
+ s32 camMode;
+
+ if (this == GET_PLAYER(play)) {
+ seqMode = SEQ_MODE_DEFAULT;
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ seqMode = SEQ_MODE_STILL;
+ } else if (this->csMode != PLAYER_CSMODE_0) {
+ Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), CAM_MODE_NORMAL);
+ } else {
+ camera = (this->actor.id == ACTOR_PLAYER) ? Play_GetCamera(play, CAM_ID_MAIN)
+ : Play_GetCamera(play, ((EnTest3*)this)->subCamId);
+ if ((this->actor.parent != NULL) && (this->stateFlags3 & PLAYER_STATE3_80)) {
+ camMode = CAM_MODE_HOOKSHOT;
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->actor.parent);
+ } else if (func_8084BC64 == this->actionFunc) {
+ camMode = CAM_MODE_STILL;
+ } else if (this->stateFlags3 & PLAYER_STATE3_8000) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ camMode = CAM_MODE_GORONDASH;
+ } else {
+ camMode = CAM_MODE_FREEFALL;
+ }
+ } else if (this->stateFlags3 & PLAYER_STATE3_80000) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ camMode = CAM_MODE_GORONDASH;
+ } else {
+ camMode = CAM_MODE_GORONJUMP;
+ }
+ } else if (this->stateFlags2 & PLAYER_STATE2_100) {
+ camMode = CAM_MODE_PUSHPULL;
+ } else if (this->targetedActor != NULL) {
+ if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK_REQUESTED)) {
+ camMode = CAM_MODE_TALK;
+ } else if (this->stateFlags1 & PLAYER_STATE1_10000) {
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ camMode = CAM_MODE_FOLLOWBOOMERANG;
+ } else {
+ camMode = CAM_MODE_FOLLOWTARGET;
+ }
+ } else {
+ camMode = CAM_MODE_BATTLE;
+ }
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->targetedActor);
+ } else if (this->stateFlags1 & PLAYER_STATE1_1000) {
+ camMode = CAM_MODE_CHARGE;
+ } else if (this->stateFlags3 & PLAYER_STATE3_100) {
+ camMode = CAM_MODE_DEKUHIDE;
+ } else if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ camMode = CAM_MODE_FOLLOWBOOMERANG;
+ Camera_SetViewParam(camera, CAM_VIEW_TARGET, this->boomerangActor);
+ } else if (this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000)) {
+ if (func_80123434(this)) {
+ camMode = CAM_MODE_HANGZ;
+ } else {
+ camMode = CAM_MODE_HANG;
+ }
+ } else if ((this->stateFlags3 & PLAYER_STATE3_2000) && (this->actor.velocity.y < 0.0f)) {
+ if (this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) {
+ camMode = CAM_MODE_DEKUFLYZ;
+ } else {
+ camMode = CAM_MODE_DEKUFLY;
+ }
+ } else if (this->stateFlags1 & (PLAYER_STATE1_20000 | PLAYER_STATE1_40000000)) {
+ if (func_800B7128(this) || func_8082EF20(this)) {
+ camMode = CAM_MODE_BOWARROWZ;
+ } else if (this->stateFlags1 & PLAYER_STATE1_200000) {
+ camMode = CAM_MODE_CLIMBZ;
+ } else {
+ camMode = CAM_MODE_TARGET;
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_400000) && (this->transformation != 0)) {
+ camMode = CAM_MODE_STILL;
+ } else if (this->stateFlags1 & PLAYER_STATE1_40000) {
+ camMode = CAM_MODE_JUMP;
+ } else if (this->stateFlags1 & PLAYER_STATE1_200000) {
+ camMode = CAM_MODE_CLIMB;
+ } else if (this->stateFlags1 & PLAYER_STATE1_80000) {
+ camMode = CAM_MODE_FREEFALL;
+ } else if (((func_808548B8 == this->actionFunc) &&
+ (this->meleeWeaponAnimation >= PLAYER_MWA_FORWARD_SLASH_1H) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_PUNCH_KICK)) ||
+ (this->stateFlags3 & PLAYER_STATE3_8) ||
+ ((func_8084FE7C == this->actionFunc) && (this->unk_AE8 == 0)) ||
+ (func_808505D0 == this->actionFunc)) {
+ camMode = CAM_MODE_STILL;
+ } else {
+ camMode = CAM_MODE_NORMAL;
+ if ((this->linearVelocity == 0.0f) &&
+ (!(this->stateFlags1 & PLAYER_STATE1_800000) || (this->rideActor->speed == 0.0f))) {
+ seqMode = SEQ_MODE_STILL;
+ }
+ }
+
+ Camera_ChangeMode(camera, camMode);
+ }
+
+ if (play->actorCtx.targetContext.bgmEnemy != NULL) {
+ seqMode = SEQ_MODE_ENEMY;
+ Audio_UpdateEnemyBgmVolume(sqrtf(play->actorCtx.targetContext.bgmEnemy->xyzDistToPlayerSq));
+ }
+
+ Audio_SetSequenceMode(seqMode);
+ }
+}
+
+Vec3f D_8085D364 = { 0.0f, 0.5f, 0.0f };
+Vec3f D_8085D370 = { 0.0f, 0.5f, 0.0f };
+Color_RGBA8 D_8085D37C = { 255, 255, 100, 255 };
+Color_RGBA8 D_8085D380 = { 255, 50, 0, 0 };
+
+void func_808442D8(PlayState* play, Player* this) {
+ f32 var_fa0;
+ f32 temp_fv1;
+
+ if (this->unk_B0C == 0.0f) {
+ func_80831990(play, this, ITEM_NONE);
+ return;
+ }
+
+ var_fa0 = 1.0f;
+ if (DECR(this->unk_B28) == 0) {
+ Inventory_ChangeAmmo(ITEM_STICK, -1);
+ this->unk_B28 = 1;
+ this->unk_B0C = 0.0f;
+ var_fa0 = 0.0f;
+ } else if (this->unk_B28 >= 0xC9) {
+ var_fa0 = (0xD2 - this->unk_B28) / 10.0f;
+ } else if (this->unk_B28 < 0x14) {
+ var_fa0 = this->unk_B28 / 20.0f;
+ this->unk_B0C = var_fa0;
+ }
+
+ if (var_fa0 > 0.0f) {
+ func_800B0EB0(play, &this->meleeWeaponInfo[0].tip, &D_8085D364, &D_8085D370, &D_8085D37C, &D_8085D380,
+ (var_fa0 * 200.0f), 0, 8);
+ if (play->roomCtx.curRoom.enablePosLights || (MREG(93) != 0)) {
+ temp_fv1 = (Rand_ZeroOne() * 30.0f) + 225.0f;
+ Lights_PointSetColorAndRadius(&this->lightInfo, temp_fv1, temp_fv1 * 0.7f, 0, var_fa0 * 300.0f);
+ }
+ }
+}
+
+void func_808445C4(PlayState* play, Player* this) {
+ this->shockTimer--;
+ this->unk_B66 += this->shockTimer;
+ if (this->unk_B66 > 20) {
+ Vec3f pos;
+ Vec3f* bodyPartsPos;
+ s32 scale;
+ s32 randIndex;
+
+ this->unk_B66 -= 20;
+ scale = this->shockTimer * 2;
+ if (scale > 40) {
+ scale = 40;
+ }
+
+ randIndex = Rand_ZeroFloat(PLAYER_BODYPART_MAX - 0.1f);
+ bodyPartsPos = randIndex + this->bodyPartsPos;
+
+ pos.x = (Rand_CenteredFloat(5.0f) + bodyPartsPos->x) - this->actor.world.pos.x;
+ pos.y = (Rand_CenteredFloat(5.0f) + bodyPartsPos->y) - this->actor.world.pos.y;
+ pos.z = (Rand_CenteredFloat(5.0f) + bodyPartsPos->z) - this->actor.world.pos.z;
+ EffectSsFhgFlash_SpawnShock(play, &this->actor, &pos, scale, 1);
+ func_800B8F98(&this->actor, NA_SE_PL_SPARK - SFX_FLAG);
+ }
+}
+
+/**
+ * Rumbles the controller when close to a secret.
+ */
+void Player_DetectSecrets(PlayState* play, Player* this) {
+ f32 step = (SQ(200.0f) * 5.0f) - (this->closestSecretDistSq * 5.0f);
+
+ if (step < 0.0f) {
+ step = 0.0f;
+ }
+
+ this->secretRumbleCharge += step;
+ if (this->secretRumbleCharge > SQ(2000.0f)) {
+ this->secretRumbleCharge = 0.0f;
+ Player_RequestRumble(play, this, 120, 20, 10, SQ(0));
+ }
+}
+
+s8 D_8085D384[92] = {
+ /* 0 */ PLAYER_CSMODE_0,
+ /* 1 */ PLAYER_CSMODE_2,
+ /* 2 */ PLAYER_CSMODE_2,
+ /* 3 */ PLAYER_CSMODE_4,
+ /* 4 */ PLAYER_CSMODE_3,
+ /* 5 */ PLAYER_CSMODE_56,
+ /* 6 */ PLAYER_CSMODE_8,
+ /* 7 */ PLAYER_CSMODE_0,
+ /* 8 */ PLAYER_CSMODE_0,
+ /* 9 */ PLAYER_CSMODE_135,
+ /* 10 */ PLAYER_CSMODE_21,
+ /* 11 */ PLAYER_CSMODE_61,
+ /* 12 */ PLAYER_CSMODE_62,
+ /* 13 */ PLAYER_CSMODE_60,
+ /* 14 */ PLAYER_CSMODE_63,
+ /* 15 */ PLAYER_CSMODE_64,
+ /* 16 */ PLAYER_CSMODE_65,
+ /* 17 */ PLAYER_CSMODE_66,
+ /* 18 */ PLAYER_CSMODE_70,
+ /* 19 */ PLAYER_CSMODE_19,
+ /* 20 */ PLAYER_CSMODE_71,
+ /* 21 */ PLAYER_CSMODE_72,
+ /* 22 */ PLAYER_CSMODE_67,
+ /* 23 */ PLAYER_CSMODE_73,
+ /* 24 */ PLAYER_CSMODE_74,
+ /* 25 */ PLAYER_CSMODE_75,
+ /* 26 */ PLAYER_CSMODE_68,
+ /* 27 */ PLAYER_CSMODE_69,
+ /* 28 */ PLAYER_CSMODE_76,
+ /* 29 */ PLAYER_CSMODE_116,
+ /* 30 */ PLAYER_CSMODE_0,
+ /* 31 */ PLAYER_CSMODE_40,
+ /* 32 */ PLAYER_CSMODE_0,
+ /* 33 */ -PLAYER_CSMODE_52, // the only negative one
+ /* 34 */ PLAYER_CSMODE_42,
+ /* 35 */ PLAYER_CSMODE_43,
+ /* 36 */ PLAYER_CSMODE_57,
+ /* 37 */ PLAYER_CSMODE_81,
+ /* 38 */ PLAYER_CSMODE_41,
+ /* 39 */ PLAYER_CSMODE_53,
+ /* 40 */ PLAYER_CSMODE_54,
+ /* 41 */ PLAYER_CSMODE_44,
+ /* 42 */ PLAYER_CSMODE_55,
+ /* 43 */ PLAYER_CSMODE_45,
+ /* 44 */ PLAYER_CSMODE_46,
+ /* 45 */ PLAYER_CSMODE_47,
+ /* 46 */ PLAYER_CSMODE_48,
+ /* 47 */ PLAYER_CSMODE_49,
+ /* 48 */ PLAYER_CSMODE_50,
+ /* 49 */ PLAYER_CSMODE_51,
+ /* 50 */ PLAYER_CSMODE_77,
+ /* 51 */ PLAYER_CSMODE_78,
+ /* 52 */ PLAYER_CSMODE_79,
+ /* 53 */ PLAYER_CSMODE_80,
+ /* 54 */ PLAYER_CSMODE_81,
+ /* 55 */ PLAYER_CSMODE_82,
+ /* 56 */ PLAYER_CSMODE_83,
+ /* 57 */ PLAYER_CSMODE_84,
+ /* 58 */ PLAYER_CSMODE_85,
+ /* 59 */ PLAYER_CSMODE_86,
+ /* 60 */ PLAYER_CSMODE_87,
+ /* 61 */ PLAYER_CSMODE_88,
+ /* 62 */ PLAYER_CSMODE_89,
+ /* 63 */ PLAYER_CSMODE_90,
+ /* 64 */ PLAYER_CSMODE_91,
+ /* 65 */ PLAYER_CSMODE_92,
+ /* 66 */ PLAYER_CSMODE_94,
+ /* 67 */ PLAYER_CSMODE_95,
+ /* 68 */ PLAYER_CSMODE_100,
+ /* 69 */ PLAYER_CSMODE_101,
+ /* 70 */ PLAYER_CSMODE_98,
+ /* 71 */ PLAYER_CSMODE_99,
+ /* 72 */ PLAYER_CSMODE_102,
+ /* 73 */ PLAYER_CSMODE_103,
+ /* 74 */ PLAYER_CSMODE_104,
+ /* 75 */ PLAYER_CSMODE_112,
+ /* 76 */ PLAYER_CSMODE_113,
+ /* 77 */ PLAYER_CSMODE_117,
+ /* 78 */ PLAYER_CSMODE_104,
+ /* 79 */ PLAYER_CSMODE_104,
+ /* 80 */ PLAYER_CSMODE_105,
+ /* 81 */ PLAYER_CSMODE_106,
+ /* 82 */ PLAYER_CSMODE_107,
+ /* 83 */ PLAYER_CSMODE_108,
+ /* 84 */ PLAYER_CSMODE_109,
+ /* 85 */ PLAYER_CSMODE_110,
+ /* 86 */ PLAYER_CSMODE_118,
+ /* 87 */ PLAYER_CSMODE_119,
+ /* 88 */ PLAYER_CSMODE_120,
+ /* 89 */ PLAYER_CSMODE_114,
+ /* 90 */ PLAYER_CSMODE_111,
+ /* 91 */ PLAYER_CSMODE_122,
+};
+
+f32 D_8085D3E0[PLAYER_FORM_MAX] = {
+ 0.8f, // PLAYER_FORM_FIERCE_DEITY
+ 0.6f, // PLAYER_FORM_GORON
+ 0.8f, // PLAYER_FORM_ZORA
+ 1.5f, // PLAYER_FORM_DEKU
+ 1.0f, // PLAYER_FORM_HUMAN
+};
+
+void func_80844784(PlayState* play, Player* this) {
+ f32 var_fv0;
+ s16 var_a3;
+ f32 temp_ft4;
+ s32 temp_ft2;
+ f32 temp_fv1_2;
+ f32 sp58;
+ f32 sp54;
+ f32 sp50;
+ f32 sp4C;
+ f32 sp48;
+ f32 sp44;
+ f32 temp_fa0;
+ f32 temp_fa1;
+ s16 temp_v0;
+ f32 temp_fv0_2;
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (sPlayerCurrentFloorType == FLOOR_TYPE_5) &&
+ (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ var_a3 = this->currentYaw;
+ var_fv0 = this->linearVelocity;
+ temp_v0 = this->actor.world.rot.y - var_a3;
+
+ if ((ABS_ALT(temp_v0) > 0x6000) && (this->actor.speed != 0.0f)) {
+ var_fv0 = 0.0f;
+ var_a3 += 0x8000;
+ }
+
+ if ((Math_StepToF(&this->actor.speed, var_fv0, 0.35f) != 0) && (var_fv0 == 0.0f)) {
+ this->actor.world.rot.y = this->currentYaw;
+ }
+
+ if (this->linearVelocity != 0.0f) {
+ temp_ft2 = (fabsf(this->linearVelocity) * 700.0f) - (fabsf(this->actor.speed) * 100.0f);
+ temp_ft2 = CLAMP(temp_ft2, 0, 0x546);
+
+ Math_ScaledStepToS(&this->actor.world.rot.y, var_a3, temp_ft2);
+ }
+ if ((this->linearVelocity == 0.0f) && (this->actor.speed != 0.0f)) {
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ this->actor.speed);
+ }
+ } else {
+ this->actor.speed = this->linearVelocity;
+ this->actor.world.rot.y = this->currentYaw;
+ }
+
+ Actor_UpdateVelocityWithGravity(&this->actor);
+ D_80862B3C = 0.0f;
+ if ((gSaveContext.save.saveInfo.playerData.health != 0) &&
+ ((this->pushedSpeed != 0.0f) || (this->windSpeed != 0.0f) || (play->envCtx.windSpeed >= 50.0f)) &&
+ (!Player_InCsMode(play)) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_100) && (func_8084D4EC != this->actionFunc) &&
+ (this->actor.id == ACTOR_PLAYER)) {
+ this->actor.velocity.x += this->pushedSpeed * Math_SinS(this->pushedYaw);
+ this->actor.velocity.z += this->pushedSpeed * Math_CosS(this->pushedYaw);
+ temp_fv1_2 = 10.0f - this->actor.velocity.y;
+ if (temp_fv1_2 > 0.0f) {
+ sp58 = D_8085D3E0[this->transformation];
+ sp54 = this->windSpeed * sp58;
+ sp50 = Math_SinS(this->windAngleX) * sp54;
+ sp4C = Math_CosS(this->windAngleX) * sp54;
+ sp48 = Math_SinS(this->windAngleY) * sp4C;
+ sp44 = Math_CosS(this->windAngleY) * sp4C;
+
+ if ((sp50 > 0.0f) && (this->transformation == PLAYER_FORM_DEKU) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (Player_SetAction(play, this, func_80856918, 1)) {
+ this->stateFlags3 |= PLAYER_STATE3_2000 | PLAYER_STATE3_1000000;
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_OPEN);
+ func_8019FD90(4, 2);
+ }
+
+ this->unk_AE8 = 0x270F;
+ Math_Vec3f_Copy(this->unk_AF0, &this->actor.world.pos);
+ }
+
+ if (play->envCtx.windSpeed >= 50.0f) {
+ temp_fa0 = play->envCtx.windDir.x;
+ temp_fa1 = play->envCtx.windDir.y;
+ temp_ft4 = play->envCtx.windDir.z;
+
+ temp_fv0_2 = sqrtf(SQ(temp_fa0) + SQ(temp_fa1) + SQ(temp_ft4));
+ if (temp_fv0_2 != 0.0f) {
+ temp_fv0_2 = ((play->envCtx.windSpeed - 50.0f) * 0.1f * sp58) / temp_fv0_2;
+
+ sp48 -= temp_fa0 * temp_fv0_2;
+ sp50 -= temp_fa1 * temp_fv0_2;
+ sp44 -= temp_ft4 * temp_fv0_2;
+ }
+ }
+
+ if (temp_fv1_2 < sp50) {
+ temp_fv1_2 /= sp50;
+
+ sp48 *= temp_fv1_2;
+ sp50 *= temp_fv1_2;
+ sp44 *= temp_fv1_2;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ D_80862B3C = (sp44 * Math_CosS(this->currentYaw)) + (Math_SinS(this->currentYaw) * sp48);
+ if (fabsf(D_80862B3C) > 4.0f) {
+ func_8083FBC4(play, this);
+ }
+
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ fabsf(D_80862B3C));
+ }
+
+ this->actor.velocity.x += sp48;
+ this->actor.velocity.z += sp44;
+ this->actor.velocity.y += sp50;
+ }
+ }
+
+ Actor_UpdatePos(&this->actor);
+}
+
+Color_RGBA8 D_8085D3F4 = { 100, 255, 255, 0 };
+Color_RGBA8 D_8085D3F8 = { 0, 100, 100, 0 };
+
+void func_80844D80(PlayState* play, Player* this) {
+ Vec3f pos;
+ Vec3f spA0;
+ Vec3f velocity;
+ Vec3f accel;
+ Vec3f sp7C;
+ s32 i;
+
+ Math_Vec3f_Diff(&this->meleeWeaponInfo[0].tip, &this->meleeWeaponInfo[0].base, &sp7C);
+ Math_Vec3f_SumScaled(&this->meleeWeaponInfo[0].base, &sp7C, 0.3f, &spA0);
+
+ for (i = 0; i < 2; i++) {
+ Math_Vec3f_SumScaled(&this->meleeWeaponInfo[0].base, &sp7C, Rand_ZeroOne(), &pos);
+ Math_Vec3f_AddRand(&pos, 15.0f, &pos);
+ Math_Vec3f_DistXYZAndStoreNormDiff(&spA0, &pos, 1.7f, &velocity);
+ Math_Vec3f_ScaleAndStore(&velocity, 0.01f, &accel);
+ EffectSsKirakira_SpawnDispersed(play, &pos, &velocity, &accel, &D_8085D3F4, &D_8085D3F8,
+ Rand_S16Offset(-20, -120), 15);
+ }
+}
+
+f32 D_8085D3FC[] = { 0.005f, 0.05f };
+
+f32 sWaterConveyorSpeeds[CONVEYOR_SPEED_MAX - 1] = {
+ 2.0f, // CONVEYOR_SPEED_SLOW
+ 4.0f, // CONVEYOR_SPEED_MEDIUM
+ 11.0f, // CONVEYOR_SPEED_FAST
+};
+f32 sFloorConveyorSpeeds[CONVEYOR_SPEED_MAX - 1] = {
+ 0.5f, // CONVEYOR_SPEED_SLOW
+ 1.0f, // CONVEYOR_SPEED_MEDIUM
+ 3.0f, // CONVEYOR_SPEED_FAST
+};
+
+void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
+ f32 temp_fv0;
+ f32 temp_fv1;
+
+ sPlayerControlInput = input;
+ if (this->unk_D6A < 0) {
+ this->unk_D6A++;
+ if (this->unk_D6A == 0) {
+ this->unk_D6A = 1;
+ play_sound(NA_SE_OC_REVENGE);
+ }
+ }
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.home.pos);
+
+ temp_fv1 = fabsf(this->linearVelocity) * (fabsf(Math_SinS(this->unk_B6C) * 800.0f) + 100.0f);
+
+ Math_StepToF(&this->unk_AC0, 0.0f, CLAMP_MIN(temp_fv1, 300.0f));
+
+ if (this->unk_D57 != 0) {
+ this->unk_D57--;
+ }
+
+ if (this->unk_B5E != 0) {
+ this->unk_B5E--;
+ }
+
+ if (this->unk_D6B != 0) {
+ this->unk_D6B--;
+ }
+
+ if (this->invincibilityTimer < 0) {
+ this->invincibilityTimer++;
+ } else if (this->invincibilityTimer > 0) {
+ this->invincibilityTimer--;
+ }
+
+ if (this->unk_B64 != 0) {
+ this->unk_B64--;
+ }
+
+ if (this->blastMaskTimer != 0) {
+ this->blastMaskTimer--;
+ }
+
+ if (gSaveContext.jinxTimer != 0) {
+ gSaveContext.jinxTimer--;
+ }
+
+ func_80122C20(play, &this->unk_3D0);
+ if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) && func_8082FBE8(this)) {
+ func_80844D80(play, this);
+ }
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ s32 var_v0 = (this->stateFlags1 & PLAYER_STATE1_8000000) ? 1 : 0;
+
+ Math_StepToF(&this->unk_B10[0], var_v0, D_8085D3FC[var_v0]);
+ }
+ func_80832888(this, play);
+ if (play->roomCtx.curRoom.enablePosLights) {
+ Lights_PointSetColorAndRadius(&this->lightInfo, 255, 255, 255, 60);
+ } else {
+ this->lightInfo.params.point.radius = -1;
+ }
+
+ if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B28 != 0)) {
+ func_808442D8(play, this);
+ } else if (this->heldItemAction == PLAYER_IA_FISHING_ROD) {
+ if (this->unk_B28 < 0) {
+ this->unk_B28++;
+ }
+ }
+
+ if (this->shockTimer != 0) {
+ func_808445C4(play, this);
+ }
+ if (this->isBurning) {
+ func_808341F4(play, this);
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_8000) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_StopHorizontalMovement(this);
+ Actor_MoveWithGravity(&this->actor);
+ }
+ func_80843178(play, this);
+ } else {
+ f32 temp_fa0;
+ f32 var_fv1_2;
+ s32 var_v1;
+ s32 pad;
+
+ if (this->currentBoots != this->prevBoots) {
+ if (this->currentBoots == PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_8082DC64(play, this);
+ if (this->ageProperties->unk_2C < this->actor.depthInWater) {
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ }
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_8000000) &&
+ ((this->prevBoots == PLAYER_BOOTS_ZORA_UNDERWATER) ||
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))) {
+ func_8083B930(play, this);
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ if (func_808508C8 == this->actionFunc) {
+ this->unk_AE8 = 20;
+ }
+ }
+ this->prevBoots = this->currentBoots;
+ }
+ if ((this->actor.parent == NULL) && (this->stateFlags1 & PLAYER_STATE1_800000)) {
+ this->actor.parent = this->rideActor;
+ func_80837BD0(play, this);
+ this->unk_AE8 = -1;
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_uma_wait_1);
+ func_8082E920(play, this, ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+ }
+
+ if (this->unk_ADC == 0) {
+ this->unk_ADD = 0;
+ } else if (this->unk_ADC < 0) {
+ this->unk_ADC++;
+ } else {
+ this->unk_ADC--;
+ }
+
+ if (!(this->stateFlags3 & PLAYER_STATE3_2000)) {
+ Math_ScaledStepToS(&this->unk_AAA, 0, 0x190);
+ }
+
+ if ((this->transformation >= PLAYER_FORM_GORON) && (this->transformation <= PLAYER_FORM_DEKU)) {
+ func_800BBB74(&this->blinkInfo, 20, 80, 3);
+ } else {
+ func_800BBAC0(&this->blinkInfo, 20, 80, 6);
+ }
+
+ this->actor.shape.face = ((play->gameplayFrames & 0x20) ? 0 : 3) + this->blinkInfo.eyeTexIndex;
+
+ if (this->currentMask == PLAYER_MASK_BUNNY) {
+ Player_UpdateBunnyEars(this);
+ }
+
+ if (func_800B7118(this)) {
+ func_808484F0(this);
+ }
+
+ if ((play->unk_18844 == 0) && !(this->skelAnime.moveFlags & ANIM_FLAG_80)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_2) && (this->actor.parent == NULL)) {
+ func_80844784(play, this);
+ }
+ func_80843178(play, this);
+ } else {
+ sPlayerCurrentFloorType = FLOOR_TYPE_0;
+ this->floorProperty = FLOOR_PROPERTY_0;
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ this->actor.floorPoly = this->rideActor->floorPoly;
+ this->actor.floorBgId = this->rideActor->floorBgId;
+ }
+ sPlayerConveyorSpeedIndex = CONVEYOR_SPEED_DISABLED;
+ this->pushedSpeed = 0.0f;
+ }
+
+ func_8083562C(play, this, this->actor.floorPoly, this->actor.floorBgId);
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ f32 conveyorSpeed;
+ s32 pad2;
+
+ sPlayerConveyorSpeedIndex--;
+ if (!sPlayerIsOnFloorConveyor) {
+ conveyorSpeed = sWaterConveyorSpeeds[sPlayerConveyorSpeedIndex];
+ if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ conveyorSpeed /= 4.0f;
+ }
+ } else {
+ conveyorSpeed = sFloorConveyorSpeeds[sPlayerConveyorSpeedIndex];
+ }
+
+ Math_StepToF(&this->pushedSpeed, conveyorSpeed, conveyorSpeed * 0.1f);
+ Math_ScaledStepToS(&this->pushedYaw, D_80862B16,
+ ((this->stateFlags1 & PLAYER_STATE1_8000000) ? 400.0f : 800.0f) * conveyorSpeed);
+ } else if (this->pushedSpeed != 0.0f) {
+ Math_StepToF(&this->pushedSpeed, 0.0f, (this->stateFlags1 & PLAYER_STATE1_8000000) ? 0.5f : 2.0f);
+ }
+ if (!(this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_80) && (func_80854430 != this->actionFunc)) {
+ func_8083BB4C(play, this);
+ if (!Play_InCsMode(play)) {
+ if ((this->actor.id == ACTOR_PLAYER) && !(this->stateFlags1 & PLAYER_STATE1_80000000) &&
+ (gSaveContext.save.saveInfo.playerData.health == 0) &&
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_DEATH])) {
+ if (this->stateFlags3 & PLAYER_STATE3_1000000) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else if (this->stateFlags1 &
+ (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000)) {
+ func_8082DD2C(play, this);
+ func_80833AA0(this, play);
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) ||
+ (this->stateFlags1 & PLAYER_STATE1_8000000)) {
+ func_80831F34(play, this,
+ func_801242B4(this)
+ ? &gPlayerAnim_link_swimer_swim_down
+ : ((this->shockTimer != 0) ? &gPlayerAnim_link_normal_electric_shock_end
+ : &gPlayerAnim_link_derth_rebirth));
+ }
+ } else {
+ if ((this->actor.parent == NULL) &&
+ (func_8082DA90(play) || (this->unk_D6B != 0) || !func_80834600(this, play))) {
+ func_8083827C(this, play);
+ } else {
+ this->fallStartHeight = this->actor.world.pos.y;
+ }
+
+ Player_DetectSecrets(play, this);
+ }
+ }
+ } else if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (func_8084D820 == this->actionFunc) &&
+ (this->unk_397 == 4)) {
+ this->actor.world.pos.y = this->actor.prevPos.y;
+ }
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if ((this->csMode != PLAYER_CSMODE_5) && !(this->stateFlags1 & PLAYER_STATE1_800000)) {
+ if (!(this->stateFlags2 & PLAYER_STATE2_80) && (this->actor.id == ACTOR_PLAYER)) {
+ if ((play->csCtx.playerCue != NULL) && (D_8085D384[play->csCtx.playerCue->id] != 0)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_5);
+ Player_StopHorizontalMovement(this);
+ } else if (((u32)this->csMode == PLAYER_CSMODE_0) &&
+ !(this->stateFlags2 & (PLAYER_STATE2_400 | PLAYER_STATE2_8000000)) &&
+ (play->csCtx.state != CS_STATE_STOP)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_20);
+ Player_StopHorizontalMovement(this);
+ }
+ }
+ }
+ }
+
+ if ((u32)this->csMode != PLAYER_CSMODE_0) {
+ if ((this->csMode != PLAYER_CSMODE_END) ||
+ !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 |
+ PLAYER_STATE1_200000 | PLAYER_STATE1_4000000))) {
+ if (func_8085B08C != this->actionFunc) {
+ this->unk_AA5 = PLAYER_UNKAA5_4;
+ if (this->csMode == PLAYER_CSMODE_5) {
+ func_808387A0(play, this);
+ func_8082DAD4(this);
+ }
+ }
+ } else if (func_8085B08C != this->actionFunc) {
+ func_8085AACC(play, this, 0);
+ }
+ } else {
+ this->prevCsMode = PLAYER_CSMODE_0;
+ }
+
+ func_8083BF54(play, this);
+ Lights_PointSetPosition(&this->lightInfo, this->actor.world.pos.x, this->actor.world.pos.y + 40.0f,
+ this->actor.world.pos.z);
+
+ if (((this->targetedActor == NULL) || (this->targetedActor == this->talkActor) ||
+ (this->targetedActor->hintId == TATL_HINT_ID_NONE)) &&
+ (this->tatlTextId == 0)) {
+ this->stateFlags2 &= ~(PLAYER_STATE2_2 | PLAYER_STATE2_200000);
+ }
+
+ this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_1000 | PLAYER_STATE1_400000);
+ this->stateFlags2 &= ~(PLAYER_STATE2_1 | PLAYER_STATE2_4 | PLAYER_STATE2_8 | PLAYER_STATE2_20 |
+ PLAYER_STATE2_40 | PLAYER_STATE2_100 | PLAYER_STATE2_200 | PLAYER_STATE2_1000 |
+ PLAYER_STATE2_4000 | PLAYER_STATE2_10000 | PLAYER_STATE2_400000 | PLAYER_STATE2_4000000);
+ this->stateFlags3 &= ~(PLAYER_STATE3_10 | PLAYER_STATE3_40 | PLAYER_STATE3_100 | PLAYER_STATE3_800 |
+ PLAYER_STATE3_1000 | PLAYER_STATE3_100000 | PLAYER_STATE3_2000000 |
+ PLAYER_STATE3_4000000 | PLAYER_STATE3_8000000 | PLAYER_STATE3_10000000);
+ func_808425B4(this);
+ func_8082EB38(play, this);
+
+ D_8085C3E4 = (this->stateFlags1 & PLAYER_STATE1_8000000) ? 0.5f : 1.0f;
+ D_8085C3E8 = 1.0f / D_8085C3E4;
+
+ D_80862B48 = D_80862B4C = 0;
+
+ var_v1 = Play_InCsMode(play);
+ D_80862B2C = this->currentMask;
+ if (!(this->stateFlags3 & PLAYER_STATE3_4)) {
+ this->actionFunc(this, play);
+ }
+
+ if (!var_v1) {
+ Player_SetDoAction(play, this);
+ }
+
+ Player_UpdateCamAndSeqModes(play, this);
+
+ if (this->skelAnime.moveFlags & ANIM_FLAG_8) {
+ AnimationContext_SetMoveActor(play, &this->actor, &this->skelAnime,
+ (this->skelAnime.moveFlags & ANIM_FLAG_4) ? 1.0f
+ : this->ageProperties->unk_08);
+ }
+
+ func_80832578(this, play);
+ if (this->actor.flags & ACTOR_FLAG_TALK_REQUESTED) {
+ this->talkActorDistance = 0.0f;
+ } else {
+ this->talkActor = NULL;
+ this->exchangeItemId = PLAYER_IA_NONE;
+ this->talkActorDistance = FLT_MAX;
+ }
+ if (!(this->actor.flags & ACTOR_FLAG_20000000) && (this->unk_AA5 != PLAYER_UNKAA5_5)) {
+ this->unk_A90 = NULL;
+ this->unk_A94 = FLT_MAX;
+ }
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ this->interactRangeActor = NULL;
+ this->getItemDirection = 0x6000;
+ }
+ if (this->actor.parent == NULL) {
+ this->rideActor = NULL;
+ }
+
+ this->tatlTextId = 0;
+ this->unk_B2B = -1;
+ this->closestSecretDistSq = FLT_MAX;
+ this->doorType = PLAYER_DOORTYPE_NONE;
+ this->unk_B75 = 0;
+ this->unk_A78 = NULL;
+
+ Math_StepToF(&this->windSpeed, 0.0f, 0.5f);
+ if ((this->unk_B62 != 0) ||
+ ((gSaveContext.magicState == MAGIC_STATE_IDLE) && (gSaveContext.save.saveInfo.playerData.magic != 0) &&
+ (this->stateFlags1 & PLAYER_STATE1_10))) {
+ func_8082F1AC(play, this);
+ }
+
+ temp_fv0 = this->actor.world.pos.y - this->actor.prevPos.y;
+ var_fv1_2 =
+ temp_fv0 +
+ ((this->bodyPartsPos[PLAYER_BODYPART_LEFT_FOOT].y + this->bodyPartsPos[PLAYER_BODYPART_RIGHT_FOOT].y) *
+ 0.5f);
+ temp_fv0 += this->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 10.0f;
+
+ if (this->cylinder.info.toucher.dmgFlags == 0x80000) {
+ this->cylinder.dim.height = 80;
+ var_fv1_2 = ((temp_fv0 + var_fv1_2) * 0.5f) - 40.0f;
+ } else {
+ this->cylinder.dim.height = temp_fv0 - var_fv1_2;
+
+ if (this->cylinder.dim.height < 0) {
+ temp_fa0 = temp_fv0;
+ temp_fv0 = var_fv1_2;
+ var_fv1_2 = temp_fa0;
+ this->cylinder.dim.height = -this->cylinder.dim.height;
+ }
+ }
+
+ this->cylinder.dim.yShift = var_fv1_2 - this->actor.world.pos.y;
+
+ if (this->unk_B62 != 0) {
+ this->shieldCylinder.base.acFlags = AC_NONE;
+ this->shieldCylinder.info.toucher.dmgFlags = 0x80000;
+ this->shieldCylinder.info.toucherFlags = TOUCH_ON;
+ this->shieldCylinder.info.bumperFlags = BUMP_NONE;
+ this->shieldCylinder.dim.height = 80;
+ this->shieldCylinder.dim.radius = 50;
+ this->shieldCylinder.dim.yShift = ((temp_fv0 + var_fv1_2) * 0.5f - 40.0f) - this->actor.world.pos.y;
+
+ Collider_UpdateCylinder(&this->actor, &this->shieldCylinder);
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->shieldCylinder.base);
+ } else if (this->stateFlags1 & PLAYER_STATE1_400000) {
+ if ((this->transformation == PLAYER_FORM_GORON) || (this->transformation == PLAYER_FORM_DEKU)) {
+ this->shieldCylinder.base.acFlags = AC_ON | AC_HARD | AC_TYPE_ENEMY;
+ this->shieldCylinder.info.toucher.dmgFlags = 0x100000;
+ this->shieldCylinder.info.toucherFlags = TOUCH_NONE;
+ this->shieldCylinder.info.bumperFlags = BUMP_ON;
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->shieldCylinder.dim.height = 35;
+ } else {
+ this->shieldCylinder.dim.height = 30;
+ }
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ this->shieldCylinder.dim.radius = 30;
+ } else {
+ this->shieldCylinder.dim.radius = 20;
+ }
+
+ this->shieldCylinder.dim.yShift = 0;
+ Collider_UpdateCylinder(&this->actor, &this->shieldCylinder);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->shieldCylinder.base);
+ this->cylinder.dim.yShift = 0;
+ this->cylinder.dim.height = this->shieldCylinder.dim.height;
+ } else {
+ this->cylinder.dim.height = this->cylinder.dim.height * 0.8f;
+ }
+ }
+
+ Collider_UpdateCylinder(&this->actor, &this->cylinder);
+ if (!(this->stateFlags2 & PLAYER_STATE2_4000)) {
+ if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 |
+ PLAYER_STATE1_800000)) &&
+ !(this->stateFlags3 & PLAYER_STATE3_10000000)) {
+ if ((func_808561B0 != this->actionFunc) && (func_80853D68 != this->actionFunc) &&
+ (this->actor.draw != NULL)) {
+ if ((this->actor.id != ACTOR_PLAYER) && (this->csMode == PLAYER_CSMODE_110)) {
+ this->cylinder.dim.radius = 8;
+ }
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ }
+ if (!(this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_4000000)) && (this->invincibilityTimer <= 0)) {
+ if ((func_808561B0 != this->actionFunc) &&
+ ((func_80857BE8 != this->actionFunc) || (this->unk_AE7 != 1))) {
+ if (this->cylinder.base.atFlags != AT_NONE) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->cylinder.base);
+ }
+ }
+ }
+
+ AnimationContext_SetNextQueue(play);
+ }
+
+ func_801229FC(this);
+ Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
+
+ if ((this->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000)) ||
+ (this != GET_PLAYER(play))) {
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ } else {
+ this->actor.colChkInfo.mass = sPlayerMass[this->transformation];
+ }
+
+ this->stateFlags3 &= ~(PLAYER_STATE3_4 | PLAYER_STATE3_400);
+ Collider_ResetCylinderAC(play, &this->cylinder.base);
+ Collider_ResetCylinderAC(play, &this->shieldCylinder.base);
+ Collider_ResetCylinderAT(play, &this->shieldCylinder.base);
+ Collider_ResetQuadAT(play, &this->meleeWeaponQuads[0].base);
+ Collider_ResetQuadAT(play, &this->meleeWeaponQuads[1].base);
+ Collider_ResetQuadAC(play, &this->shieldQuad.base);
+
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) ||
+ (this->actor.floorBgId != BGCHECK_SCENE)) {
+ this->unk_AC0 = 0.0f;
+ }
+ this->actor.shape.yOffset = this->unk_ABC + this->unk_AC0;
+}
+
+Vec3f D_8085D41C = { 0.0f, 0.0f, -30.0f };
+
+void Player_Update(Actor* thisx, PlayState* play) {
+ static Vec3f sDogSpawnPos;
+ Player* this = (Player*)thisx;
+ s32 dogParams;
+ s32 pad;
+ Input input;
+ s32 pad2;
+
+ this->stateFlags3 &= ~PLAYER_STATE3_10;
+
+ // This block is a leftover dog-following mechanic from OoT
+ if (gSaveContext.dogParams < 0) {
+ if (Object_GetIndex(&play->objectCtx, OBJECT_DOG) < 0) {
+ gSaveContext.dogParams = 0;
+ } else {
+ Actor* dog;
+
+ gSaveContext.dogParams &= (u16)~0x8000;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D41C, &sDogSpawnPos);
+
+ dogParams = gSaveContext.dogParams;
+
+ dog = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_DG, sDogSpawnPos.x, sDogSpawnPos.y, sDogSpawnPos.z, 0,
+ this->actor.shape.rot.y, 0, dogParams | 0x8000);
+ if (dog != NULL) {
+ dog->room = -1;
+ }
+ }
+ }
+
+ if ((this->interactRangeActor != NULL) && (this->interactRangeActor->update == NULL)) {
+ this->interactRangeActor = NULL;
+ }
+
+ if ((this->heldActor != NULL) && (this->heldActor->update == NULL)) {
+ func_8082DCA0(play, this);
+ }
+
+ if ((play->actorCtx.unk268 != 0) && (this == GET_PLAYER(play))) {
+ input = play->actorCtx.unk_26C;
+ } else if ((this->csMode == PLAYER_CSMODE_5) || (this->stateFlags1 & (PLAYER_STATE1_20 | PLAYER_STATE1_20000000)) ||
+ (this != GET_PLAYER(play)) || func_8082DA90(play) ||
+ (gSaveContext.save.saveInfo.playerData.health == 0)) {
+ bzero(&input, sizeof(Input));
+ this->fallStartHeight = this->actor.world.pos.y;
+ } else {
+ input = *CONTROLLER1(&play->state);
+ if (this->unk_B5E != 0) {
+ input.cur.button &= ~(BTN_CUP | BTN_B | BTN_A);
+ input.press.button &= ~(BTN_CUP | BTN_B | BTN_A);
+ }
+ }
+
+ Player_UpdateCommon(this, play, &input);
+ play->actorCtx.unk268 = 0;
+ bzero(&play->actorCtx.unk_26C, sizeof(Input));
+
+ MREG(52) = this->actor.world.pos.x;
+ MREG(53) = this->actor.world.pos.y;
+ MREG(54) = this->actor.world.pos.z;
+ MREG(55) = this->actor.world.rot.y;
+}
+
+void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList,
+ OverrideLimbDrawFlex overrideLimbDraw) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x0C, cullDList);
+ gSPSegment(POLY_XLU_DISP++, 0x0C, cullDList);
+
+ Player_DrawImpl(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, lod,
+ this->transformation, 0, this->actor.shape.face, overrideLimbDraw, Player_PostLimbDrawGameplay,
+ &this->actor);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void func_80846460(Player* this) {
+ Vec3f* pos;
+ Vec3f* bodyPartsPos;
+ s32 i;
+
+ this->actor.focus.pos.x = this->actor.world.pos.x;
+ this->actor.focus.pos.z = this->actor.world.pos.z;
+ this->actor.focus.pos.y = this->actor.world.pos.y + 24.0f;
+
+ pos = &this->actor.world.pos;
+ bodyPartsPos = this->bodyPartsPos;
+ for (i = 0; i < ARRAY_COUNT(this->bodyPartsPos); i++) {
+ Math_Vec3f_Copy(bodyPartsPos, pos);
+ bodyPartsPos++;
+ }
+
+ this->bodyPartsPos[PLAYER_BODYPART_HEAD].y = this->actor.world.pos.y + 24.0f;
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y = this->actor.world.pos.y + 60.0f;
+ Math_Vec3f_Copy(this->actor.shape.feetPos, pos);
+ Math_Vec3f_Copy(&this->actor.shape.feetPos[1], pos);
+}
+
+struct_80124618 D_8085D428[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 80, 170, 80 } }, { 3, { 100, 80, 100 } },
+ { 7, { 100, 100, 100 } }, { 8, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D450[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 80, 170, 80 } }, { 3, { 100, 80, 100 } },
+ { 7, { 100, 100, 100 } }, { 8, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D478[] = {
+ { 0, { 0, 0, 0 } },
+ { 8, { 0, 0, 0 } },
+};
+struct_80124618 D_8085D488[] = {
+ { 0, { 100, 100, 100 } }, { 1, { 100, 60, 100 } }, { 3, { 100, 140, 100 } },
+ { 7, { 100, 80, 100 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D4B0[] = {
+ { 0, { 100, 100, 100 } }, { 1, { 100, 70, 100 } }, { 3, { 100, 120, 100 } },
+ { 6, { 100, 80, 100 } }, { 8, { 100, 100, 100 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D4E0[] = {
+ { 0, { 0, 0, 0 } }, { 1, { 0, 0, 0 } }, { 3, { 100, 130, 100 } },
+ { 5, { 130, 130, 130 } }, { 7, { 80, 90, 80 } }, { 9, { 100, 100, 100 } },
+};
+struct_80124618 D_8085D510[] = {
+ { 0, { 0, 50, 0 } },
+ { 1, { 0, 50, 0 } },
+};
+struct_80124618 D_8085D520[] = {
+ { 0, { 100, 120, 100 } },
+ { 1, { 100, 120, 100 } },
+};
+struct_80124618 D_8085D530[] = {
+ { 0, { 160, 120, 160 } },
+ { 1, { 160, 120, 160 } },
+};
+struct_80124618 D_8085D540[] = {
+ { 0, { 0, 0, 0 } },
+ { 2, { 100, 100, 100 } },
+};
+
+struct_80124618* D_8085D550[3] = {
+ D_8085D488,
+ D_8085D4B0,
+ D_8085D4E0,
+};
+struct_80124618* D_8085D55C[3] = {
+ D_8085D428,
+ D_8085D450,
+ D_8085D478,
+};
+struct_80124618* D_8085D568[3] = {
+ D_8085D510,
+ D_8085D520,
+ D_8085D530,
+};
+
+Gfx* D_8085D574[] = {
+ object_link_nuts_DL_009C48,
+ object_link_nuts_DL_009AB8,
+ object_link_nuts_DL_009DB8,
+};
+
+Color_RGB8 D_8085D580 = { 255, 255, 255 };
+Color_RGB8 D_8085D584 = { 80, 80, 200 };
+
+void Player_Draw(Actor* thisx, PlayState* play) {
+ Player* this = THIS;
+ f32 one = 1.0f;
+ s32 spEC = false;
+
+ Math_Vec3f_Copy(&this->unk_D6C, &this->bodyPartsPos[PLAYER_BODYPART_WAIST]);
+ if (this->stateFlags3 & (PLAYER_STATE3_100 | PLAYER_STATE3_40000)) {
+ struct_80124618** spE8 = D_8085D550;
+ struct_80124618** spE4;
+ f32 spE0;
+ Gfx** spDC;
+ s32 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_Push();
+ func_8012C268(&play->state);
+ spEC = true;
+ if (this->stateFlags3 & PLAYER_STATE3_40000) {
+ Matrix_SetTranslateRotateYXZ(this->unk_AF0[0].x, this->unk_AF0[0].y, this->unk_AF0[0].z, &gZeroVec3s);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ spE8 = D_8085D568;
+ spE0 = 0.0f;
+ } else {
+ Matrix_Translate(0.0f, -this->unk_ABC, 0.0f, MTXMODE_APPLY);
+ spE0 = this->unk_AE8 - 6;
+ if (spE0 < 0.0f) {
+ spE8 = D_8085D55C;
+ spE0 = this->unk_B86[0];
+ }
+ }
+
+ spE4 = spE8;
+ spDC = D_8085D574;
+
+ for (i = 0; i < 3; i++, spE4++, spDC++) {
+ Matrix_Push();
+ func_80124618(*spE4, spE0, &this->unk_AF0[1]);
+ Matrix_Scale(this->unk_AF0[1].x, this->unk_AF0[1].y, this->unk_AF0[1].z, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, *spDC);
+
+ Matrix_Pop();
+ }
+ Matrix_Pop();
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ if (!(this->stateFlags2 & PLAYER_STATE2_20000000) && (this->unk_ABC > -3900.0f)) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (!spEC) {
+ func_8012C268(&play->state);
+ }
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+
+ func_800B8050(&this->actor, play, 0);
+ func_800B8118(&this->actor, play, 0);
+ func_80122868(play, this);
+
+ if (this->stateFlags3 & PLAYER_STATE3_1000) {
+ Color_RGB8 spBC;
+ f32 spB8 = this->unk_ABC + 1.0f;
+ f32 spB4 = 1.0f - (this->unk_ABC * 0.5f);
+
+ func_80846460(this);
+ Matrix_Translate(this->actor.world.pos.x, this->actor.world.pos.y + (1200.0f * this->actor.scale.y * spB8),
+ this->actor.world.pos.z, MTXMODE_NEW);
+
+ if (this->unk_B86[0] != 0) {
+ Matrix_RotateYS(this->unk_B28, MTXMODE_APPLY);
+ Matrix_RotateXS(this->unk_B86[0], MTXMODE_APPLY);
+ Matrix_RotateYS(-this->unk_B28, MTXMODE_APPLY);
+ }
+
+ Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
+ Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+
+ Matrix_Scale(this->actor.scale.x * spB4 * 1.15f, this->actor.scale.y * spB8 * 1.15f,
+ CLAMP_MIN(spB8, spB4) * this->actor.scale.z * 1.15f, MTXMODE_APPLY);
+ Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
+ Scene_SetRenderModeXlu(play, 0, 1);
+ Lib_LerpRGB(&D_8085D580, &D_8085D584, this->unk_B10[0], &spBC);
+
+ gDPSetEnvColor(POLY_OPA_DISP++, spBC.r, spBC.g, spBC.b, 255);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gLinkGoronCurledDL);
+
+ if (this->unk_B86[1] != 0) {
+ if (this->unk_B86[1] < 3) {
+ func_80124618(D_8085D540, this->unk_B86[1], this->unk_AF0);
+ Matrix_Scale(this->unk_AF0[0].x, this->unk_AF0[0].y, this->unk_AF0[0].z, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, object_link_goron_DL_00C540);
+ }
+
+ func_80122BA4(play, &this->unk_3D0, 1, 255);
+ func_80122BA4(play, &this->unk_3D0, 2, 255);
+
+ if (this->unk_B86[1] < 3) {
+ if (this->unk_AE7 >= 5) {
+ f32 var_fa1;
+ u8 sp9B;
+
+ var_fa1 = (this->unk_AE7 - 4) * 0.02f;
+
+ if (this->unk_B86[1] != 0) {
+ sp9B = (-this->unk_B86[1] * 0x55) + 0xFF;
+ } else {
+ sp9B = (200.0f * var_fa1);
+ }
+
+ if (this->unk_B86[1] != 0) {
+ var_fa1 = 0.65f;
+ } else {
+ var_fa1 *= one;
+ }
+
+ Matrix_Scale(1.0f, var_fa1, var_fa1, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(&object_link_goron_Matanimheader_013138));
+ gDPSetEnvColor(POLY_XLU_DISP++, 155, 0, 0, sp9B);
+ gSPDisplayList(POLY_XLU_DISP++, object_link_goron_DL_0127B0);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(&object_link_goron_Matanimheader_014684));
+ gSPDisplayList(POLY_XLU_DISP++, object_link_goron_DL_0134D0);
+ }
+ }
+ } else if ((this->transformation == PLAYER_FORM_GORON) && (this->stateFlags1 & PLAYER_STATE1_400000)) {
+ func_80846460(this);
+ SkelAnime_DrawFlexOpa(play, this->unk_2C8.skeleton, this->unk_2C8.jointTable, this->unk_2C8.dListCount,
+ NULL, NULL, NULL);
+ } else {
+ OverrideLimbDrawFlex sp84 = Player_OverrideLimbDrawGameplayDefault;
+ s32 lod = ((this->csMode != PLAYER_CSMODE_0) || (this->actor.projectedPos.z < 320.0f)) ? 0 : 1;
+ Vec3f sp74;
+
+ //! FAKE
+ if (this->transformation == PLAYER_FORM_FIERCE_DEITY) {}
+
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ SkinMatrix_Vec3fMtxFMultXYZ(&play->viewProjectionMtxF, &this->actor.focus.pos, &sp74);
+ if (sp74.z < -4.0f) {
+ sp84 = Player_OverrideLimbDrawGameplayFirstPerson;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_4000000) {
+ s16 temp_s0_2 = play->gameplayFrames * 600;
+ s16 sp70 = (play->gameplayFrames * 1000) & 0xFFFF;
+
+ Matrix_Push();
+
+ this->actor.scale.y = -this->actor.scale.y;
+ Matrix_SetTranslateRotateYXZ(this->actor.world.pos.x,
+ this->actor.world.pos.y + (2.0f * this->actor.depthInWater) +
+ (this->unk_ABC * this->actor.scale.y),
+ this->actor.world.pos.z, &this->actor.shape.rot);
+ Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
+ Matrix_RotateXS(temp_s0_2, MTXMODE_APPLY);
+ Matrix_RotateYS(sp70, MTXMODE_APPLY);
+ Matrix_Scale(1.1f, 0.95f, 1.05f, MTXMODE_APPLY);
+ Matrix_RotateYS(-sp70, MTXMODE_APPLY);
+ Matrix_RotateXS(-temp_s0_2, MTXMODE_APPLY);
+ Player_DrawGameplay(play, this, lod, gCullFrontDList, sp84);
+ this->actor.scale.y = -this->actor.scale.y;
+
+ Matrix_Pop();
+ }
+
+ gSPClearGeometryMode(POLY_OPA_DISP++, G_CULL_BOTH);
+
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BOTH);
+
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->unk_B62 != 0) &&
+ !(this->stateFlags3 & PLAYER_STATE3_8000)) {
+ Matrix_Push();
+ Matrix_RotateXS(-0x4000, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 0.0f, -1800.0f, MTXMODE_APPLY);
+ Player_DrawZoraShield(play, this);
+ Matrix_Pop();
+ }
+
+ Player_DrawGameplay(play, this, lod, gCullBackDList, sp84);
+ }
+
+ func_801229A0(play, this);
+ if (this->stateFlags2 & PLAYER_STATE2_4000) {
+ f32 temp_fa0 = this->unk_B48;
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -(s32)play->gameplayFrames & 0x7F, 0x20, 0x20, 1, 0,
+ ((s32)play->gameplayFrames * -2) & 0x7F, 0x20, 0x20));
+
+ Matrix_Scale(temp_fa0, temp_fa0, temp_fa0, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, 255);
+
+ gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
+ }
+
+ if (this->getItemDrawIdPlusOne > GID_NONE + 1) {
+ Player_DrawGetItem(play, this);
+ }
+
+ func_80122D44(play, &this->unk_3D0);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+ }
+
+ play->actorCtx.flags &= ~ACTORCTX_FLAG_3;
+}
+
+void Player_Destroy(Actor* thisx, PlayState* play) {
+ Player* this = (Player*)thisx;
+
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[0]);
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[1]);
+ Effect_Destroy(play, this->meleeWeaponEffectIndex[2]);
+ LightContext_RemoveLight(play, &play->lightCtx, this->lightNode);
+ Collider_DestroyCylinder(play, &this->cylinder);
+ Collider_DestroyCylinder(play, &this->shieldCylinder);
+ Collider_DestroyQuad(play, &this->meleeWeaponQuads[0]);
+ Collider_DestroyQuad(play, &this->meleeWeaponQuads[1]);
+ Collider_DestroyQuad(play, &this->shieldQuad);
+ ZeldaArena_Free(this->giObjectSegment);
+ ZeldaArena_Free(this->maskObjectSegment);
+ Magic_Reset(play);
+ func_80831454(this);
+}
+
+s32 func_80847190(PlayState* play, Player* this, s32 arg2) {
+ s32 pad;
+ s16 var_s0;
+
+ if (!func_800B7128(this) && !func_8082EF20(this) && !arg2) {
+ var_s0 = sPlayerControlInput->rel.stick_y * 0xF0;
+ Math_SmoothStepToS(&this->actor.focus.rot.x, var_s0, 0xE, 0xFA0, 0x1E);
+
+ var_s0 = sPlayerControlInput->rel.stick_x * -0x10;
+ var_s0 = CLAMP(var_s0, -0xBB8, 0xBB8);
+ this->actor.focus.rot.y += var_s0;
+ } else {
+ s16 temp3;
+
+ temp3 = ((sPlayerControlInput->rel.stick_y >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sPlayerControlInput->rel.stick_y * 0xC8)) * 1500.0f);
+ this->actor.focus.rot.x += temp3;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -0x1F40, 0xFA0);
+ } else {
+ this->actor.focus.rot.x = CLAMP(this->actor.focus.rot.x, -0x36B0, 0x36B0);
+ }
+
+ var_s0 = this->actor.focus.rot.y - this->actor.shape.rot.y;
+ temp3 = ((sPlayerControlInput->rel.stick_x >= 0) ? 1 : -1) *
+ (s32)((1.0f - Math_CosS(sPlayerControlInput->rel.stick_x * 0xC8)) * -1500.0f);
+ var_s0 += temp3;
+
+ this->actor.focus.rot.y = CLAMP(var_s0, -0x4AAA, 0x4AAA) + this->actor.shape.rot.y;
+ }
+
+ this->unk_AA6 |= 2;
+
+ return func_80832754(this, (play->unk_1887C != 0) || func_800B7128(this) || func_8082EF20(this));
+}
+
+void func_8084748C(Player* this, f32* speed, f32 speedTarget, s16 yawTarget) {
+ f32 incrStep = this->skelAnime.curFrame - 10.0f;
+ f32 maxSpeed = (R_RUN_SPEED_LIMIT / 100.0f) * 0.8f;
+
+ if (*speed > maxSpeed) {
+ *speed = maxSpeed;
+ }
+
+ if ((0.0f < incrStep) && (incrStep < 16.0f)) {
+ incrStep = fabsf(incrStep) * 0.5f;
+ } else {
+ speedTarget = 0.0f;
+ incrStep = 0.0f;
+ }
+
+ Math_AsymStepToF(speed, speedTarget * 0.8f, incrStep, (fabsf(*speed) * 0.02f) + 0.05f);
+ Math_ScaledStepToS(&this->currentYaw, yawTarget, 1600); // 1 ESS turn, also one frame of first-person rotation
+}
+
+void func_808475B4(Player* this) {
+ f32 sp4;
+ f32 temp_fa1;
+ f32 temp_fv0;
+ f32 var_ft4 = -5.0f;
+ f32 var_ft5 = this->ageProperties->unk_28;
+ f32 var_ft5_4;
+
+ temp_fv0 = this->actor.depthInWater - var_ft5;
+ if (this->actor.velocity.y < 0.0f) {
+ var_ft5 += 1.0f;
+ }
+
+ if (this->actor.depthInWater < var_ft5) {
+ temp_fv0 = CLAMP(temp_fv0, -0.4f, -0.1f);
+ sp4 = temp_fv0 - ((this->actor.velocity.y <= 0.0f) ? 0.0f : this->actor.velocity.y * 0.5f);
+ } else {
+ if (!(this->stateFlags1 & PLAYER_STATE1_80) && (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) &&
+ (this->actor.velocity.y >= -5.0f)) {
+ sp4 = -0.3f;
+ } else if ((this->transformation == PLAYER_FORM_DEKU) && (this->actor.velocity.y < 0.0f)) {
+ var_ft4 = 0.0f;
+ sp4 = -this->actor.velocity.y;
+ } else {
+ var_ft4 = 2.0f;
+ var_ft5_4 = CLAMP(temp_fv0, 0.1f, 0.4f);
+ sp4 = ((this->actor.velocity.y >= 0.0f) ? 0.0f : this->actor.velocity.y * -0.3f) + var_ft5_4;
+ }
+
+ if (this->actor.depthInWater > 100.0f) {
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ }
+ }
+
+ this->actor.velocity.y += sp4;
+ if (((this->actor.velocity.y - var_ft4) * sp4) > 0.0f) {
+ this->actor.velocity.y = var_ft4;
+ }
+ this->actor.gravity = 0.0f;
+}
+
+void func_808477D0(PlayState* play, Player* this, Input* input, f32 arg3) {
+ f32 var_fv0;
+
+ if ((input != NULL) && CHECK_BTN_ANY(input->press.button, BTN_B | BTN_A)) {
+ var_fv0 = 1.0f;
+ } else {
+ var_fv0 = 0.5f;
+ }
+
+ var_fv0 = var_fv0 * arg3;
+ var_fv0 = CLAMP(var_fv0, 1.0f, 2.5f);
+ this->skelAnime.playSpeed = var_fv0;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+s32 func_80847880(PlayState* play, Player* this) {
+ if (play->unk_1887C != 0) {
+ if (play->sceneId == SCENE_20SICHITAI) {
+ Player_SetAction(play, this, func_80854430, 0);
+ play->unk_1887C = 0;
+ this->csMode = PLAYER_CSMODE_0;
+ return true;
+ }
+
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, func_80854614, 0);
+ if (!func_800B7118(this) || Player_IsHoldingHookshot(this)) {
+ func_80831990(play, this, ITEM_BOW);
+ }
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->csMode = PLAYER_CSMODE_0;
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ Player_StopHorizontalMovement(this);
+ func_80836D8C(this);
+
+ return true;
+ }
+ return false;
+}
+
+s32 func_80847994(PlayState* play, Player* this) {
+ if (this->stateFlags3 & PLAYER_STATE3_20) {
+ this->stateFlags3 &= ~PLAYER_STATE3_20;
+ this->itemAction = PLAYER_IA_OCARINA;
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+ func_80838A90(this, play);
+ return true;
+ }
+ return false;
+}
+
+void func_808479F4(PlayState* play, Player* this, f32 arg2) {
+ if (this->actor.wallBgId != BGCHECK_SCENE) {
+ DynaPolyActor* actor = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ if (actor != NULL) {
+ func_800B72F8(actor, arg2, this->actor.world.rot.y);
+ }
+ }
+}
+
+void func_80847A50(Player* this) {
+ Player_PlaySfx(this, ((this->unk_AE7 != 0) ? NA_SE_PL_WALK_METAL1 : NA_SE_PL_WALK_LADDER) +
+ this->ageProperties->surfaceSfxIdOffset);
+}
+
+Vec3f D_8085D588[] = {
+ { 30.0f, 0.0f, 0.0f },
+ { -30.0f, 0.0f, 0.0f },
+};
+Vec3f D_8085D5A0[] = {
+ { 60.0f, 20.0f, 0.0f },
+ { -60.0f, 20.0f, 0.0f },
+};
+Vec3f D_8085D5B8[] = {
+ { 60.0f, -20.0f, 0.0f },
+ { -60.0f, -20.0f, 0.0f },
+};
+Vec3f D_8085D5D0 = { 0.0f, 0.0f, -30.0f };
+
+// related to mounting/unmounting the horse
+s32 func_80847A94(PlayState* play, Player* this, s32 arg2, f32* arg3) {
+ Actor* rideActor = this->rideActor;
+ f32 sp60 = rideActor->world.pos.y + 20.0f;
+ f32 sp5C = rideActor->world.pos.y - 20.0f;
+ Vec3f sp50;
+ Vec3f sp44;
+ CollisionPoly* sp40;
+ CollisionPoly* sp3C;
+ s32 sp38;
+ s32 sp34;
+
+ *arg3 = func_80835CD8(play, this, &D_8085D588[arg2], &sp50, &sp3C, &sp34);
+
+ if ((sp5C < *arg3) && (*arg3 < sp60)) {
+ if (!func_80835D58(play, this, &D_8085D5A0[arg2], &sp40, &sp38, &sp44)) {
+ if (!func_80835D58(play, this, &D_8085D5B8[arg2], &sp40, &sp38, &sp44)) {
+ this->actor.floorPoly = sp3C;
+ this->actor.floorBgId = sp38;
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, sp3C, sp34);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+s32 func_80847BF0(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+ s32 var_a2;
+ f32 sp34;
+
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8 = 0x63;
+ } else {
+ var_a2 = (this->mountSide < 0) ? 0 : 1;
+
+ if (!func_80847A94(play, this, var_a2, &sp34)) {
+ var_a2 ^= 1;
+ if (!func_80847A94(play, this, var_a2, &sp34)) {
+ return false;
+ }
+
+ this->mountSide = -this->mountSide;
+ }
+
+ if (play->csCtx.state == CS_STATE_IDLE) {
+ if (!func_8082DA90(play)) {
+ if (EN_HORSE_CHECK_1(rideActor) || EN_HORSE_CHECK_4(rideActor)) {
+ this->stateFlags2 |= PLAYER_STATE2_400000;
+
+ if (EN_HORSE_CHECK_1(rideActor) ||
+ (EN_HORSE_CHECK_4(rideActor) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A))) {
+ rideActor->actor.child = NULL;
+
+ func_8083172C(play, this, func_808505D0, 0);
+ this->unk_B48 = sp34 - rideActor->actor.world.pos.y;
+
+ Player_AnimationPlayOnce(play, this,
+ (this->mountSide < 0) ? &gPlayerAnim_link_uma_left_down
+ : &gPlayerAnim_link_uma_right_down);
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// Used in 2 horse-related functions
+void func_80847E2C(Player* this, f32 arg1, f32 minFrame) {
+ f32 addend;
+ f32 dir;
+
+ if ((this->unk_B48 != 0.0f) && (minFrame <= this->skelAnime.curFrame)) {
+ if (arg1 < fabsf(this->unk_B48)) {
+ dir = (this->unk_B48 >= 0.0f) ? 1 : -1;
+ addend = dir * arg1;
+ } else {
+ addend = this->unk_B48;
+ }
+ this->actor.world.pos.y += addend;
+ this->unk_B48 -= addend;
+ }
+}
+
+s32 func_80847ED4(Player* this) {
+ return (this->interactRangeActor != NULL) && (this->interactRangeActor->id == ACTOR_EN_ZOG) &&
+ CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A);
+}
+
+void func_80847F1C(Player* this) {
+ s32 pad;
+ f32 yPos;
+ s16 yaw;
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (func_80847ED4(this)) {
+ yPos = this->actor.world.pos.y;
+ yaw = this->currentYaw - interactRangeActor->shape.rot.y;
+ Lib_Vec3f_TranslateAndRotateY(&interactRangeActor->world.pos, interactRangeActor->shape.rot.y, &D_8085D5D0,
+ &this->actor.world.pos);
+ this->actor.world.pos.y = yPos;
+ this->actor.shape.rot.y = interactRangeActor->shape.rot.y;
+
+ interactRangeActor->speed = Math_CosS(ABS_ALT(yaw)) * this->linearVelocity * 0.5f;
+ if (interactRangeActor->speed < 0.0f) {
+ interactRangeActor->speed = 0.0f;
+ }
+ func_8083133C(this);
+ }
+}
+
+AnimSfxEntry D_8085D5DC[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 0, NA_SE_PL_SWIM, STOP),
+};
+
+void func_80847FF8(Player* this, f32* arg1, f32 arg2, s16 arg3) {
+ func_8084748C(this, arg1, arg2, arg3);
+ Player_PlayAnimSfx(this, D_8085D5DC);
+ func_80847F1C(this);
+}
+
+void func_80848048(PlayState* play, Player* this) {
+ Player_SetAction(play, this, func_80851588, 0);
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+}
+
+s32 func_80848094(PlayState* play, Player* this, f32* arg2, s16* arg3) {
+ PlayerAnimationHeader* anim;
+ s16 temp_v0 = this->currentYaw - *arg3;
+ s32 temp_v0_2;
+
+ if (ABS_ALT(temp_v0) > 0x6000) {
+ anim = &gPlayerAnim_link_swimer_swim_wait;
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = *arg3;
+ } else {
+ *arg2 = 0.0f;
+ *arg3 = this->currentYaw;
+ }
+ } else {
+ temp_v0_2 = func_8083E514(this, arg2, arg3, play);
+ if (temp_v0_2 > 0) {
+ anim = &gPlayerAnim_link_swimer_swim;
+ } else if (temp_v0_2 < 0) {
+ anim = &gPlayerAnim_link_swimer_back_swim;
+ } else {
+ s16 diff = BINANG_SUB(this->actor.shape.rot.y, *arg3);
+
+ if (diff > 0) {
+ anim = &gPlayerAnim_link_swimer_Rside_swim;
+ } else {
+ anim = &gPlayerAnim_link_swimer_Lside_swim;
+ }
+ }
+ }
+
+ if (anim != this->skelAnime.animation) {
+ func_8082E634(play, this, anim);
+ return true;
+ }
+ return false;
+}
+
+void func_808481CC(PlayState* play, Player* this, f32 arg2) {
+ f32 sp2C;
+ s16 sp2A;
+
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+ func_8084748C(this, &this->linearVelocity, sp2C / 2.0f, sp2A);
+ func_8084748C(this, &this->actor.velocity.y, arg2, this->currentYaw);
+}
+
+void func_80848250(PlayState* play, Player* this) {
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->stateFlags1 &= ~(PLAYER_STATE1_400 | PLAYER_STATE1_800);
+ this->getItemId = GI_NONE;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+}
+
+void func_80848294(PlayState* play, Player* this) {
+ func_80848250(play, this);
+ func_8082DC28(this);
+ func_80839E74(this, play);
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+// Player_GetItem?
+s32 func_808482E0(PlayState* play, Player* this) {
+ if (this->getItemId == GI_NONE) {
+ return true;
+ }
+
+ if (this->unk_AE7 == 0) {
+ GetItemEntry* giEntry = &sGetItemTable[this->getItemId - 1];
+
+ this->unk_AE7 = 1;
+ Message_StartTextbox(play, giEntry->textId, &this->actor);
+ Item_Give(play, giEntry->itemId);
+
+ if ((this->getItemId >= GI_MASK_DEKU) && (this->getItemId <= GI_MASK_KAFEIS_MASK)) {
+ Audio_PlayFanfare(NA_BGM_GET_NEW_MASK);
+ } else if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_10)) ||
+ (this->getItemId == GI_RECOVERY_HEART)) {
+ play_sound(NA_SE_SY_GET_BOXITEM);
+ } else {
+ s32 seqId;
+
+ if ((this->getItemId == GI_HEART_CONTAINER) ||
+ ((this->getItemId == GI_HEART_PIECE) && EQ_MAX_QUEST_HEART_PIECE_COUNT)) {
+ seqId = NA_BGM_GET_HEART | 0x900;
+ } else {
+ s32 var_v1;
+
+ if ((this->getItemId == GI_HEART_PIECE) ||
+ ((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_HUGE))) {
+ var_v1 = NA_BGM_GET_SMALL_ITEM;
+ } else {
+ var_v1 = NA_BGM_GET_ITEM | 0x900;
+ }
+ seqId = var_v1;
+ }
+
+ Audio_PlayFanfare(seqId);
+ }
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ if (this->getItemId == GI_OCARINA) {
+ // zelda teaching song of time cs?
+ play->nextEntrance = ENTRANCE(CUTSCENE, 0);
+ gSaveContext.nextCutsceneIndex = 0xFFF2;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ play->transitionType = TRANS_TYPE_FADE_WHITE;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_WAIT);
+ }
+ this->getItemId = GI_NONE;
+ }
+
+ return false;
+}
+
+AnimSfxEntry D_8085D5E0[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 60, NA_SE_IT_MASTER_SWORD_SWING, STOP),
+};
+
+void func_808484CC(Player* this) {
+ Player_PlayAnimSfx(this, D_8085D5E0);
+}
+
+void func_808484F0(Player* this) {
+ this->unk_B08 += this->unk_B0C;
+ this->unk_B0C -= this->unk_B08 * 5.0f;
+ this->unk_B0C *= 0.3f;
+
+ if (fabsf(this->unk_B0C) < 0.00001f) {
+ this->unk_B0C = 0.0f;
+ if (fabsf(this->unk_B08) < 0.00001f) {
+ this->unk_B08 = 0.0f;
+ }
+ }
+}
+
+s32 func_80848570(Player* this, PlayState* play) {
+ if (!func_8083A6C0(play, this)) {
+ if (func_808396B8(play, this)) {
+ PlayerMeleeWeaponAnimation meleeWeaponAnim = func_808335F4(this);
+
+ func_80833864(play, this, meleeWeaponAnim);
+ if ((meleeWeaponAnim >= PLAYER_MWA_SPIN_ATTACK_1H) ||
+ ((this->transformation == PLAYER_FORM_FIERCE_DEITY) && func_8082FBE8(this))) {
+ this->stateFlags2 |= PLAYER_STATE2_20000;
+ func_808332A0(play, this, 0, meleeWeaponAnim < PLAYER_MWA_SPIN_ATTACK_1H);
+ }
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+// elegy of emptiness
+void func_80848640(PlayState* play, Player* this) {
+ EnTorch2* torch2;
+ Actor* effChange;
+
+ torch2 = play->actorCtx.elegyShells[this->transformation];
+ if (torch2 != NULL) {
+ Math_Vec3f_Copy(&torch2->actor.home.pos, &this->actor.world.pos);
+ torch2->actor.home.rot.y = this->actor.shape.rot.y;
+ torch2->state = 0;
+ torch2->framesUntilNextState = 20;
+ } else {
+ torch2 = (EnTorch2*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TORCH2, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
+ this->transformation);
+ }
+
+ if (torch2 != NULL) {
+ play->actorCtx.elegyShells[this->transformation] = torch2;
+ Play_SetupRespawnPoint(&play->state, this->transformation + 3, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B));
+ }
+
+ effChange = Actor_Spawn(&play->actorCtx, play, ACTOR_EFF_CHANGE, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
+ (GET_PLAYER_FORM << 3) | this->transformation);
+ if (effChange != NULL) {
+ //! @bug: This function should only pass Player*: it uses *(this + 0x153), which is meant to be
+ //! player->currentMask, but in this case is garbage in the skelAnime
+ Player_PlaySfx((Player*)effChange, NA_SE_PL_TRANSFORM);
+ }
+}
+
+s32 func_80848780(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+ return false;
+}
+
+s32 func_808487B8(Player* this, PlayState* play) {
+ if (func_80830B88(play, this) || func_80830DF0(this, play)) {
+ return true;
+ }
+ return false;
+}
+
+s32 func_80848808(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284) ||
+ ((Player_ItemToItemAction(this, this->heldItemId) == this->heldItemAction) &&
+ (D_80862B48 = D_80862B48 || ((this->modelAnimType != PLAYER_ANIMTYPE_3) &&
+ (this->heldItemAction != PLAYER_IA_STICK) && (play->unk_1887C == 0))))) {
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ this->unk_ACC = 0;
+ this->unk_AA4 = 0;
+ D_80862B4C = D_80862B48;
+ return this->unk_AC4(this, play);
+ }
+
+ if (func_8082ED94(this) != 0) {
+ func_80830D40(play, this);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->unk_AA4 = 0;
+ } else {
+ func_80830D40(play, this);
+ }
+ return true;
+}
+
+s32 func_8084894C(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->unk_284);
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_R)) {
+ func_80830CE8(play, this);
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ if ((this->transformation == PLAYER_FORM_ZORA) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_8082F164(this, BTN_R | BTN_B);
+ }
+ }
+ return true;
+}
+
+s32 func_80848A0C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ PlayerAnimationHeader* anim;
+ f32 lastFrame;
+
+ anim = func_80830A58(play, this);
+ lastFrame = Animation_GetLastFrame(anim);
+ PlayerAnimation_Change(play, &this->unk_284, anim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f);
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ return true;
+}
+
+s32 func_80848AB0(Player* this, PlayState* play) {
+ // possibly a case of if ((D_80862B48 = D_80862B4C) || PlayerAnimation_Update(play, &this->unk_284))
+ D_80862B48 = D_80862B4C;
+ if ((D_80862B48 != 0) || PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, D_8085C9F0[this->heldItemAction]);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085BE84[PLAYER_ANIMGROUP_0][this->modelAnimType]);
+ this->unk_AA4 = 0;
+ this->unk_AC4(this, play);
+ return false;
+ }
+ return true;
+}
+
+s32 func_80848B6C(Player* this, PlayState* play) {
+ if (this->unk_B28 >= 0) {
+ this->unk_B28 = -this->unk_B28;
+ }
+
+ if (!Player_IsHoldingHookshot(this) || func_80831124(play, this)) {
+ if (!func_80830B88(play, this) && !func_80831094(this, play)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+PlayerAnimationHeader* D_8085D5E4[] = {
+ &gPlayerAnim_link_hook_walk2ready,
+ &gPlayerAnim_link_bow_walk2ready,
+ &gPlayerAnim_pn_tamahakidf,
+};
+
+PlayerAnimationHeader* D_8085D5F0[] = {
+ &gPlayerAnim_link_hook_wait,
+ &gPlayerAnim_link_bow_bow_wait,
+ &gPlayerAnim_pn_tamahakidf,
+};
+
+u16 D_8085D5FC[] = {
+ NA_SE_IT_BOW_FLICK,
+ NA_SE_PL_DEKUNUTS_MISS_FIRE,
+ NA_SE_NONE,
+ NA_SE_NONE,
+};
+
+s32 func_80848BF4(Player* this, PlayState* play) {
+ s32 index;
+ s32 temp;
+
+ if (Player_IsHoldingHookshot(this)) {
+ index = 0;
+ } else {
+ temp = (this->transformation != PLAYER_FORM_DEKU) ? 1 : 2;
+ index = temp;
+ }
+
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ Math_ScaledStepToS(&this->upperLimbRot.z, 0x4B0, 0x190);
+ this->unk_AA6 |= 0x100;
+ }
+
+ if ((this->unk_ACE == 0) && (func_8082ED94(this) == 0) &&
+ (this->skelAnime.animation == &gPlayerAnim_link_bow_side_walk)) {
+ PlayerAnimation_PlayOnce(play, &this->unk_284, D_8085D5E4[index]);
+ this->unk_ACE = -1;
+ } else if (PlayerAnimation_Update(play, &this->unk_284)) {
+ PlayerAnimation_PlayLoop(play, &this->unk_284, D_8085D5F0[index]);
+ this->unk_ACE = 1;
+ } else if (this->unk_ACE == 1) {
+ this->unk_ACE = 2;
+ }
+
+ if (this->unk_ACC >= 0xB) {
+ this->unk_ACC--;
+ }
+
+ func_80831010(this, play);
+ if ((this->unk_ACE > 0) && ((this->unk_B28 < 0) || ((D_80862B4C == 0) && !func_80830FD4(play)))) {
+ func_8082F43C(play, this, func_80848E4C);
+ if (this->unk_B28 >= 0) {
+ if (index != 0) {
+ if (!func_80831194(play, this)) {
+ Player_PlaySfx(this, D_8085D5FC[this->unk_B28 - 1]);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ PlayerAnimation_PlayOnceSetSpeed(play, &this->unk_284, &gPlayerAnim_pn_tamahaki, 2.0f / 3.0f);
+ }
+ } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80831194(play, this);
+ }
+ }
+ this->unk_ACC = 0xA;
+ Player_StopHorizontalMovement(this);
+ } else {
+ this->stateFlags3 |= PLAYER_STATE3_40;
+ }
+
+ return 1;
+}
+
+s32 func_80848E4C(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->unk_284);
+
+ if (Player_IsHoldingHookshot(this) && !func_80831124(play, this)) {
+ return true;
+ }
+
+ if (!func_80830B88(play, this) &&
+ ((((this->unk_B28 < 0) && (D_80862B4C != 0)) ||
+ ((animFinished || (this->transformation != PLAYER_FORM_DEKU)) && (D_80862B48 != 0))) ||
+ func_80830F9C(play))) {
+
+ this->unk_B28 = ABS_ALT(this->unk_B28);
+ if (func_808306F8(this, play)) {
+ if (Player_IsHoldingHookshot(this)) {
+ this->unk_ACE = 1;
+ } else {
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->transformation == PLAYER_FORM_DEKU)
+ ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_shoot_next);
+ }
+ }
+ } else {
+ if (this->unk_ACC != 0) {
+ this->unk_ACC--;
+ }
+
+ if ((func_8082FBE8(this)) || (this->unk_AA5 != PLAYER_UNKAA5_0) || (this->stateFlags1 & PLAYER_STATE1_100000)) {
+ if (this->unk_ACC == 0) {
+ this->unk_ACC++;
+ }
+ return true;
+ }
+
+ if (Player_IsHoldingHookshot(this)) {
+ func_8082F43C(play, this, func_80848B6C);
+ } else {
+ func_8082F43C(play, this, func_80849054);
+ PlayerAnimation_PlayOnce(play, &this->unk_284,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf
+ : &gPlayerAnim_link_bow_bow_shoot_end);
+ }
+ this->unk_ACC = 0;
+ }
+
+ return true;
+}
+
+s32 func_80849054(Player* this, PlayState* play) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_80848B6C);
+ }
+ return true;
+}
+
+s32 func_808490B4(Player* this, PlayState* play) {
+ Actor* heldActor = this->heldActor;
+
+ if (heldActor == NULL) {
+ func_808309CC(play, this);
+ }
+
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_link_normal_carryB_wait);
+ }
+
+ if ((heldActor->id == ACTOR_EN_NIW) && (this->actor.velocity.y <= 0.0f)) {
+ this->actor.terminalVelocity = -2.0f;
+ this->actor.gravity = -0.5f;
+ this->fallStartHeight = this->actor.world.pos.y;
+ }
+ return true;
+ }
+ return func_80848780(this, play);
+}
+
+s32 func_808491B4(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ func_8082F43C(play, this, func_80849570);
+ } else if (func_80831094(this, play)) {
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_8084923C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_808492C4);
+ PlayerAnimation_PlayLoop(play, &this->unk_284, &gPlayerAnim_pz_cutterwaitanim);
+ }
+ if (this->unk_284.animation == &gPlayerAnim_pz_cutterwaitanim) {
+ func_80831010(this, play);
+ }
+ return true;
+}
+
+s32 func_808492C4(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->unk_284);
+ func_80831010(this, play);
+ if (D_80862B4C == 0) {
+ func_8082F43C(play, this, func_8084933C);
+ PlayerAnimation_PlayOnce(play, &this->unk_284, &gPlayerAnim_pz_cutterattack);
+ }
+ return true;
+}
+
+s32 func_8084933C(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ func_8082F43C(play, this, func_80849570);
+ this->unk_ACC = 0;
+ } else if (PlayerAnimation_OnFrame(&this->unk_284, 6.0f)) {
+ Vec3f pos;
+ s16 untargetedRotY;
+
+ func_80835BF8(&this->bodyPartsPos[PLAYER_BODYPART_LEFT_HAND], this->actor.shape.rot.y, 0.0f, &pos);
+ pos.y = this->actor.world.pos.y + 50.0f;
+
+ untargetedRotY = this->actor.shape.rot.y - 0x190;
+ this->boomerangActor = Actor_Spawn(
+ &play->actorCtx, play, ACTOR_EN_BOOM, pos.x, pos.y, pos.z, this->actor.focus.rot.x,
+ (this->targetedActor != NULL) ? this->actor.shape.rot.y + 0x36B0 : untargetedRotY, 0, ZORA_BOOMERANG_LEFT);
+
+ if (this->boomerangActor != NULL) {
+ EnBoom* leftBoomerang = (EnBoom*)this->boomerangActor;
+ EnBoom* rightBoomerang;
+
+ leftBoomerang->moveTo = this->targetedActor;
+ if (leftBoomerang->moveTo != NULL) {
+ leftBoomerang->unk_1CF = 0x10;
+ }
+ leftBoomerang->unk_1CC = leftBoomerang->unk_1CF + 0x24;
+
+ func_80835BF8(&this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND], this->actor.shape.rot.y, 0.0f, &pos);
+
+ untargetedRotY = (this->actor.shape.rot.y + 0x190);
+ rightBoomerang =
+ (EnBoom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOOM, pos.x, pos.y, pos.z, this->actor.focus.rot.x,
+ (this->targetedActor != NULL) ? this->actor.shape.rot.y - 0x36B0 : untargetedRotY,
+ 0, ZORA_BOOMERANG_RIGHT);
+
+ if (rightBoomerang != NULL) {
+ rightBoomerang->moveTo = this->targetedActor;
+ if (rightBoomerang->moveTo != NULL) {
+ rightBoomerang->unk_1CF = 0x10;
+ }
+
+ rightBoomerang->unk_1CC = rightBoomerang->unk_1CF + 0x24;
+ leftBoomerang->actor.child = &rightBoomerang->actor;
+ rightBoomerang->actor.parent = &leftBoomerang->actor;
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_2000000;
+ this->stateFlags3 &= ~PLAYER_STATE3_800000;
+ if (!func_80123420(this)) {
+ func_8083133C(this);
+ }
+
+ this->unk_D57 = 20;
+
+ Player_PlaySfx(this, NA_SE_IT_BOOMERANG_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+ }
+
+ return true;
+}
+
+s32 func_80849570(Player* this, PlayState* play) {
+ if (func_80830B88(play, this)) {
+ return true;
+ }
+
+ if (this->stateFlags3 & PLAYER_STATE3_800000) {
+ func_8082F43C(play, this, func_80849620);
+ PlayerAnimation_PlayOnce(play, &this->unk_284, &gPlayerAnim_pz_cuttercatch);
+ this->stateFlags3 &= ~PLAYER_STATE3_800000;
+ Player_PlaySfx(this, NA_SE_PL_CATCH_BOOMERANG);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80849620(Player* this, PlayState* play) {
+ if (!func_808491B4(this, play) && PlayerAnimation_Update(play, &this->unk_284)) {
+ if (this->stateFlags1 & PLAYER_STATE1_2000000) {
+ func_8082F43C(play, this, func_80849570);
+ this->unk_ACC = 0;
+ } else {
+ func_8082F43C(play, this, func_80848780);
+ }
+ }
+ return true;
+}
+
+void func_808496AC(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (DECR(this->unk_AE8) == 0) {
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) {
+ Player_StopCutscene(this);
+ Player_SetAction(play, this, func_80849FE0, 0);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ }
+ } else if (this->unk_AE8 == 30) {
+ if (Message_GetState(&play->msgCtx) != TEXT_STATE_NONE) {
+ this->unk_AE8++;
+ } else {
+ Message_StartTextbox(play, 0xC03, NULL);
+ }
+ }
+}
+
+void func_808497A0(Player* this, PlayState* play) {
+ this->stateFlags3 |= PLAYER_STATE3_10000000;
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ R_PLAY_FILL_SCREEN_ON = 20;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ R_PLAY_FILL_SCREEN_R = R_PLAY_FILL_SCREEN_G = R_PLAY_FILL_SCREEN_B = R_PLAY_FILL_SCREEN_ALPHA;
+ play_sound(NA_SE_SY_DEKUNUTS_JUMP_FAILED);
+ } else if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ if (this->unk_B86[0] == 0) {
+ this->unk_B86[0] = 1;
+ func_8082DE50(play, this);
+ } else {
+ R_PLAY_FILL_SCREEN_ON = -20;
+ this->stateFlags1 &= ~PLAYER_STATE1_8000000;
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ Player_SetEquipmentData(play, this);
+ this->prevBoots = this->currentBoots;
+
+ if (this->unk_3CF != 0) {
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_3C0);
+ this->actor.shape.rot.y = this->unk_3CC;
+ } else {
+ Math_Vec3f_Copy(&this->actor.world.pos, &gSaveContext.respawn[RESPAWN_MODE_DOWN].pos);
+ this->actor.shape.rot.y = gSaveContext.respawn[RESPAWN_MODE_DOWN].yaw;
+ }
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ this->linearVelocity = 0.0f;
+ this->currentYaw = this->actor.shape.rot.y;
+ this->actor.velocity.y = 0.0f;
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+
+ if ((play->roomCtx.curRoom.num == this->unk_3CE) && (play->roomCtx.prevRoom.num < 0)) {
+ this->unk_AE8 = 5;
+ } else {
+ play->roomCtx.curRoom.num = -1;
+ play->roomCtx.prevRoom.num = -1;
+ play->roomCtx.curRoom.segment = NULL;
+ play->roomCtx.prevRoom.segment = NULL;
+
+ func_8012EBF8(play, &play->roomCtx);
+ this->unk_AE8 = -1;
+ this->unk_AE7 = this->unk_3CE;
+ }
+ }
+ }
+ } else if (this->unk_AE8 < 0) {
+ if (Room_StartRoomTransition(play, &play->roomCtx, this->unk_AE7)) {
+ Map_InitRoomData(play, play->roomCtx.curRoom.num);
+ Minimap_SavePlayerRoomInitInfo(play);
+ this->unk_AE8 = 5;
+ }
+ } else if (this->unk_AE8 > 0) {
+ this->unk_AE8--;
+ } else {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ R_PLAY_FILL_SCREEN_ON = 0;
+ func_808339B4(this, -40);
+ func_8085B384(this, play);
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ }
+ }
+}
+
+void func_80849A9C(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ s32 temp_v0;
+
+ if (this->unk_AE8 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ Player_AnimationPlayLoop(play, this, func_8082EF54(this));
+ this->unk_AE8 = 0;
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+ func_8082FC60(this);
+ } else {
+ func_8083E958(play, this);
+ }
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085CFE4, 1)) {
+ return;
+ }
+
+ if (!func_8082FB68(this) && (!func_80123434(this) || (func_8084894C != this->unk_AC4))) {
+ func_8083B29C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+
+ temp_v0 = func_8083E404(this, sp44, sp42);
+ if (temp_v0 > 0) {
+ func_8083A844(this, play, sp42);
+ } else if (temp_v0 < 0) {
+ func_8083AF8C(this, sp42, play);
+ } else if (sp44 > 4.0f) {
+ func_8083B030(this, play);
+ } else {
+ u32 temp_v0_2;
+
+ func_8083EA44(this, this->linearVelocity * 0.3f + 1.0f);
+ func_8083E8E0(this, sp44, sp42);
+
+ temp_v0_2 = this->unk_B38;
+ if ((temp_v0_2 < 6) || ((temp_v0_2 - 0xE) < 6)) {
+ Math_StepToF(&this->linearVelocity, 0.0f, 1.5f);
+ } else {
+ s16 temp_v0_3 = sp42 - this->currentYaw;
+ s32 var_v1 = ABS_ALT(temp_v0_3);
+
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.5f)) {
+ this->currentYaw = sp42;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp44 * 0.3f, 2.0f, 1.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp42, var_v1 * 0.1f);
+ }
+ }
+ }
+}
+
+void func_80849DD0(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+ s32 temp_v0;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ Player_AnimationPlayOnce(play, this, func_8082ED20(this));
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085CFEC, 1)) {
+ return;
+ }
+
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (!func_80123434(this)) {
+ func_8083172C(play, this, func_80849FE0, 1);
+ this->currentYaw = this->actor.shape.rot.y;
+ return;
+ }
+ if (func_8084894C == this->unk_AC4) {
+ func_8083B23C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+
+ temp_v0 = func_8083E514(this, &sp3C, &sp3A, play);
+ if (temp_v0 > 0) {
+ func_8083A844(this, play, sp3A);
+ } else if (temp_v0 < 0) {
+ func_8083AECC(this, sp3A, play);
+ } else if (sp3C > 4.9f) {
+ func_8083B030(this, play);
+ func_8082FC60(this);
+ } else if (sp3C != 0.0f) {
+ func_8083AF30(this, play);
+ } else {
+ s16 temp_v0_2 = sp3A - this->actor.shape.rot.y;
+
+ if (ABS_ALT(temp_v0_2) > 0x320) {
+ func_8083B0E4(play, this, sp3A);
+ }
+ }
+}
+
+void func_80849FE0(Player* this, PlayState* play) {
+ s32 temp_v0 = func_8082ED94(this);
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp3C;
+ s16 sp3A;
+ s16 temp_v1_2;
+
+ func_8083C85C(this);
+ if (temp_v0 > 0) {
+ func_8082EEA4(this, temp_v0 - 1);
+ }
+
+ if (animFinished ||
+ ((this->currentMask == PLAYER_MASK_SCENTS) && (this->skelAnime.animation != &gPlayerAnim_cl_msbowait)) ||
+ ((this->currentMask != PLAYER_MASK_SCENTS) && (this->skelAnime.animation == &gPlayerAnim_cl_msbowait))) {
+ if (this->unk_AE8 != 0) {
+ if (DECR(this->unk_AE8) == 0) {
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y =
+ (this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].y + ((this->unk_AE8 & 1) * 0x50)) - 0x28;
+ } else {
+ func_8082E794(this);
+ Player_ChooseIdleAnim(play, this);
+ }
+ this->stateFlags3 &= ~PLAYER_STATE3_8;
+ }
+
+ func_80832F24(this);
+ if ((this->unk_AE8 == 0) && !func_80847880(play, this) && !func_80833058(play, this, D_8085D01C, 1)) {
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (func_80123434(this)) {
+ func_8083692C(this, play);
+ return;
+ }
+ func_80832F78(this, &sp3C, &sp3A, 0.018f, play);
+ if (sp3C != 0.0f) {
+ func_8083A844(this, play, sp3A);
+ return;
+ }
+ temp_v1_2 = sp3A - this->actor.shape.rot.y;
+
+ if (ABS_ALT(temp_v1_2) > 0x320) {
+ func_8083B0E4(play, this, sp3A);
+ } else {
+ Math_ScaledStepToS(&this->actor.shape.rot.y, sp3A, 0x4B0);
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8082ED20(this) == this->skelAnime.animation) {
+ func_8083C6E8(this, play);
+ }
+ }
+ }
+}
+
+void func_8084A26C(Player* this, PlayState* play) {
+ f32 var_fv0;
+ s16 temp_v0_3;
+ f32 sp44;
+ s16 sp42;
+ s32 var_v0;
+ s32 temp_v0_2;
+ s32 var_v1;
+ f32 var_fv1;
+
+ this->skelAnime.mode = 0;
+ PlayerAnimation_SetUpdateFunction(&this->skelAnime);
+
+ this->skelAnime.animation = func_8082EFE4(this);
+ if (this->skelAnime.animation == &gPlayerAnim_link_bow_side_walk) {
+ var_fv0 = 24.0f;
+ var_fv1 = -(MREG(95) / 100.0f);
+ } else {
+ var_fv0 = 29.0f;
+ var_fv1 = MREG(95) / 100.0f;
+ }
+
+ this->skelAnime.animLength = var_fv0;
+ this->skelAnime.endFrame = var_fv0 - 1.0f;
+ if (BINANG_SUB(this->currentYaw, this->actor.shape.rot.y) >= 0) {
+ var_v0 = 1;
+ } else {
+ var_v0 = -1;
+ }
+
+ this->skelAnime.playSpeed = var_v0 * (this->linearVelocity * var_fv1);
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 0.0f) || PlayerAnimation_OnFrame(&this->skelAnime, var_fv0 / 2.0f)) {
+ Player_AnimSfx_PlayFloorWalk(this, this->linearVelocity);
+ }
+
+ if (func_80833058(play, this, D_8085CFF8, 1)) {
+ return;
+ }
+
+ if (func_8082FB68(this)) {
+ func_8083B23C(this, play);
+ return;
+ }
+ if (!func_80123434(this)) {
+ func_8085B384(this, play);
+ return;
+ }
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+
+ temp_v0_2 = func_8083E514(this, &sp44, &sp42, play);
+ if (temp_v0_2 > 0) {
+ func_8083A844(this, play, sp42);
+ return;
+ }
+ if (temp_v0_2 < 0) {
+ func_8083AECC(this, sp42, play);
+ return;
+ }
+ if (sp44 > 4.9f) {
+ func_8083B030(this, play);
+ func_8082FC60(this);
+ return;
+ }
+ if ((sp44 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_8083692C(this, play);
+ return;
+ }
+
+ temp_v0_3 = sp42 - this->currentYaw;
+ var_v1 = ABS_ALT(temp_v0_3);
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.5f)) {
+ this->currentYaw = sp42;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp44 * 0.4f, 1.5f, 1.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp42, var_v1 * 0.1f);
+ }
+}
+
+void func_8084A5C0(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 sp2C;
+
+ func_8083EE60(this, play);
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ if (func_8082FC24(this) == 0) {
+ func_8083A844(this, play, this->currentYaw);
+ return;
+ }
+
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+
+ sp2C = func_8083E514(this, &sp34, &sp32, play);
+ if (sp2C >= 0) {
+ if (!func_8083F190(this, &sp34, &sp32, play)) {
+ if (sp2C != 0) {
+ func_8083A794(this, play);
+ } else if (sp34 > 4.9f) {
+ func_8083B030(this, play);
+ } else {
+ func_8083AF30(this, play);
+ }
+ }
+ } else {
+ s16 sp2A = sp32 - this->currentYaw;
+
+ Math_AsymStepToF(&this->linearVelocity, sp34 * 1.5f, 1.5f, 2.0f);
+ Math_ScaledStepToS(&this->currentYaw, sp32, sp2A * 0.1f);
+ if ((sp34 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_8083692C(this, play);
+ }
+ }
+}
+
+void func_8084A794(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ func_80832F24(this);
+
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if (this->linearVelocity != 0.0f) {
+ return;
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8083E514(this, &sp30, &sp2E, play) > 0) {
+ func_8083A794(this, play);
+ } else if ((sp30 != 0.0f) || animFinished) {
+ func_8083F230(this, play);
+ }
+}
+
+void func_8084A884(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (func_80833058(play, this, D_8085D004, 1)) {
+ return;
+ }
+
+ if (animFinished) {
+ func_8083692C(this, play);
+ }
+}
+
+void func_8084A8E8(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+ s32 var_v0;
+
+ func_8083F27C(play, this);
+ if (func_80833058(play, this, D_8085D00C, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+ if (func_80123434(this)) {
+ var_v0 = func_8083E514(this, &sp3C, &sp3A, play);
+ } else {
+ var_v0 = func_8083E404(this, sp3C, sp3A);
+ }
+
+ if (var_v0 > 0) {
+ func_8083A794(this, play);
+ } else if (var_v0 < 0) {
+ if (func_80123434(this)) {
+ func_8083AECC(this, sp3A, play);
+ } else {
+ func_8083AF8C(this, sp3A, play);
+ }
+ } else if ((this->linearVelocity < 3.6f) && (sp3C < 4.0f)) {
+ if ((func_80123420(this) == 0) && (func_80123434(this))) {
+ func_8083AF30(this, play);
+ } else {
+ func_80836988(this, play);
+ }
+ } else {
+ s16 temp_v0;
+ s32 var_v1;
+ s32 pad;
+
+ func_8083E8E0(this, sp3C, sp3A);
+
+ temp_v0 = sp3A - this->currentYaw;
+ var_v1 = ABS_ALT(temp_v0);
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 3.0f)) {
+ this->currentYaw = sp3A;
+ }
+ } else {
+ sp3C = sp3C * 0.9f;
+ Math_AsymStepToF(&this->linearVelocity, sp3C, 2.0f, 3.0f);
+ Math_ScaledStepToS(&this->currentYaw, sp3A, var_v1 * 0.1f);
+ }
+ }
+}
+
+void func_8084AB4C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (Player_IsHoldingTwoHandedWeapon(this)) {
+ AnimationContext_SetLoadFrame(play, func_8082ED20(this), 0, this->skelAnime.limbCount,
+ this->skelAnime.morphTable);
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->skelAnime.morphTable, D_8085B9F0);
+ }
+
+ func_80832F78(this, &sp34, &sp32, 0.018f, play);
+ if ((this != GET_PLAYER(play)) && (this->targetedActor == NULL)) {
+ sp32 = this->actor.home.rot.y;
+ }
+
+ if (func_80833058(play, this, D_8085D018, 1)) {
+ return;
+ }
+
+ if (sp34 != 0.0f) {
+ this->actor.shape.rot.y = sp32;
+ func_8083A794(this, play);
+ } else if (Math_ScaledStepToS(&this->actor.shape.rot.y, sp32, this->unk_B4E)) {
+ func_80839E74(this, play);
+ }
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8084AC84(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (this->linearVelocity < 1.0f) {
+ this->skelAnime.animation = &gPlayerAnim_clink_normal_okarina_walk;
+ } else {
+ this->skelAnime.animation = &gPlayerAnim_clink_normal_okarina_walkB;
+ }
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!func_80847880(play, this) &&
+ (!func_80833058(play, this, D_8085D01C, 1) || (func_8084AC84 == this->actionFunc))) {
+ f32 sp3C;
+ f32 temp_fv0;
+ f32 temp_fv1;
+ s16 sp32;
+ s16 sp30;
+
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80839E74(this, play);
+ return;
+ }
+
+ this->linearVelocity = this->unk_B48;
+ func_80832F78(this, &sp3C, &sp32, 0.018f, play);
+ sp30 = sp32;
+
+ if (!func_8083A4A4(this, &sp3C, &sp32, REG(43) / 100.0f)) {
+ func_8083CB04(this, sp3C, sp32, REG(19) / 100.0f, 1.5f, 0x3E8);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp3C == 0.0f)) {
+ this->currentYaw = sp30;
+ this->actor.shape.rot.y = this->currentYaw;
+ }
+ }
+
+ this->unk_B48 = this->linearVelocity;
+ temp_fv0 = this->skelAnime.curFrame + 5.0f;
+ temp_fv1 = this->skelAnime.animLength / 2.0f;
+
+ // effectively an fmodf
+ temp_fv0 -= temp_fv1 * (s32)(temp_fv0 / temp_fv1);
+ this->linearVelocity *= Math_CosS(temp_fv0 * 1000.0f) * 0.4f;
+ }
+}
+
+void func_8084AEEC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_80832F24(this);
+ if (!func_80847880(play, this)) {
+ if (!func_80833058(play, this, D_8085D01C, 0) || (func_8084AEEC == this->actionFunc)) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80839E74(this, play);
+ }
+ }
+ }
+}
+
+void func_8084AF9C(Player* this, PlayState* play) {
+ f32 sp2C; // player speed?
+ s16 sp2A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_8083F57C(this, play);
+ if (func_80833058(play, this, D_8085D028, 1)) {
+ return;
+ }
+
+ if (func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp2C, &sp2A, 0.018f, play);
+ if (this->currentMask == PLAYER_MASK_BUNNY) {
+ sp2C *= 1.5f;
+ }
+
+ if (!func_8083A4A4(this, &sp2C, &sp2A, REG(43) / 100.0f)) {
+ func_8083CB58(this, sp2C, sp2A);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp2C == 0.0f)) {
+ func_80839E3C(this, play);
+ }
+ }
+}
+
+void func_8084B0EC(Player* this, PlayState* play) {
+ f32 sp2C;
+ s16 sp2A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8083F57C(this, play);
+ if (func_80833058(play, this, D_8085D034, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+ if (!func_8083A4A4(this, &sp2C, &sp2A, REG(43) / 100.0f)) {
+ if (((func_80123434(this) != 0) && (sp2C != 0) && (func_8083E514(this, &sp2C, &sp2A, play) <= 0)) ||
+ (!func_80123434(this) && (func_8083E404(this, sp2C, sp2A) <= 0))) {
+ func_80836988(this, play);
+ } else {
+ func_8083CB58(this, sp2C, sp2A);
+ func_8083C8E8(this, play);
+ if ((this->linearVelocity == 0.0f) && (sp2C == 0.0f)) {
+ func_80836988(this, play);
+ }
+ }
+ }
+}
+
+void func_8084B288(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ if (func_80833058(play, this, D_8085D00C, 1)) {
+ return;
+ }
+
+ if (!func_8082FC24(this)) {
+ func_8083A794(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if ((this->skelAnime.morphWeight == 0.0f) && (this->skelAnime.curFrame > 5.0f)) {
+ func_80832F24(this);
+ if ((this->skelAnime.curFrame > 10.0f) && (func_8083E404(this, sp30, sp2E) < 0)) {
+ func_8083AF8C(this, sp2E, play);
+ } else if (animFinished) {
+ func_8083B090(this, play);
+ }
+ }
+}
+
+void func_8084B3B8(Player* this, PlayState* play) {
+ s32 animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ f32 sp30;
+ s16 sp2E;
+
+ func_80832F24(this);
+ if (func_80833058(play, this, D_8085D044, 1)) {
+ return;
+ }
+
+ func_80832F78(this, &sp30, &sp2E, 0.0f, play);
+ if (this->linearVelocity == 0.0f) {
+ this->currentYaw = this->actor.shape.rot.y;
+ if (func_8083E404(this, sp30, sp2E) > 0) {
+ func_8083A794(this, play);
+ } else if ((sp30 != 0.0f) || animFinished) {
+ func_80836988(this, play);
+ }
+ }
+}
+
+void func_8084B4A8(Player* this, PlayState* play) {
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_backspace) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8082E438(play, this, D_8085BE84[PLAYER_ANIMGROUP_31][this->modelAnimType]);
+ }
+ } else {
+ func_8082E67C(play, this, D_8085BE84[PLAYER_ANIMGROUP_32][this->modelAnimType]);
+ }
+
+ if (DECR(this->unk_AE8) == 0) {
+ if (!func_80838A90(this, play)) {
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_33][this->modelAnimType], play);
+ }
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ }
+}
+
+// Player_Action_Shielding
+void func_8084B5C0(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (this->transformation == PLAYER_FORM_GORON) {
+ SkelAnime_Update(&this->unk_2C8);
+
+ if (!func_8083FE38(this, play)) {
+ if (!func_8083A274(this, play)) {
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_21][this->modelAnimType], play);
+ func_80830B38(this);
+ } else {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ }
+ }
+
+ return;
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (!Player_IsGoronOrDeku(this)) {
+ Player_AnimationPlayLoop(play, this, D_8085BE84[PLAYER_ANIMGROUP_20][this->modelAnimType]);
+ }
+
+ this->unk_AE8 = 1;
+ this->unk_AE7 = 0;
+ }
+
+ if (!Player_IsGoronOrDeku(this)) {
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ func_8083216C(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_8082F164(this, BTN_R | BTN_B);
+ }
+ }
+
+ if (this->unk_AE8 != 0) {
+ f32 yStick = sPlayerControlInput->rel.stick_y * 180;
+ f32 xStick = sPlayerControlInput->rel.stick_x * -120;
+ s16 temp_a0 = this->actor.shape.rot.y - Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ s16 var_a1;
+ s16 temp_ft5;
+ s16 var_a2;
+ s16 var_a3;
+
+ var_a1 = (yStick * Math_CosS(temp_a0)) + (Math_SinS(temp_a0) * xStick);
+ temp_ft5 = (xStick * Math_CosS(temp_a0)) - (Math_SinS(temp_a0) * yStick);
+
+ var_a1 = CLAMP_MAX(var_a1, 0xDAC);
+ var_a2 = ABS_ALT(var_a1 - this->actor.focus.rot.x) * 0.25f;
+ var_a2 = CLAMP_MIN(var_a2, 0x64);
+
+ var_a3 = ABS_ALT(temp_ft5 - this->upperLimbRot.y) * 0.25f;
+ var_a3 = CLAMP_MIN(var_a3, 0x32);
+ Math_ScaledStepToS(&this->actor.focus.rot.x, var_a1, var_a2);
+
+ this->upperLimbRot.x = this->actor.focus.rot.x;
+ Math_ScaledStepToS(&this->upperLimbRot.y, temp_ft5, var_a3);
+
+ if (this->unk_AE7 != 0) {
+ if (!func_808401F4(play, this)) {
+ if (this->skelAnime.curFrame < 2.0f) {
+ func_8082FA5C(play, this, PLAYER_MELEE_WEAPON_STATE_1);
+ }
+ } else {
+ this->unk_AE8 = 1;
+ this->unk_AE7 = 0;
+ }
+ } else if (!func_8083FE38(this, play)) {
+ if (func_8083A274(this, play) != 0) {
+ func_8083FD80(this, play);
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_400000;
+ func_8082DC38(this);
+
+ if (Player_IsGoronOrDeku(this)) {
+ func_80836A5C(this, play);
+ PlayerAnimation_Change(play, &this->skelAnime, this->skelAnime.animation, 1.0f,
+ Animation_GetLastFrame(this->skelAnime.animation), 0.0f, 2, 0.0f);
+ } else {
+ if (this->itemAction <= PLAYER_IA_MINUS1) {
+ func_80123C58(this);
+ }
+
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_21][this->modelAnimType], play);
+ }
+
+ Player_PlaySfx(this, NA_SE_IT_SHIELD_REMOVE);
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ Player_SetModelsForHoldingShield(this);
+ this->unk_AA6 |= 0xC1;
+}
+
+void func_8084BAA4(Player* this, PlayState* play) {
+ func_80832F24(this);
+ if (this->unk_AE7 == 0) {
+ D_80862B04 = func_8083216C(this, play);
+ if ((func_8084894C == this->unk_AC4) || (func_808331FC(play, this, &this->unk_284, 4.0f) > 0)) {
+ Player_SetAction(play, this, func_80849A9C, 1);
+ }
+ } else {
+ s32 temp_v0;
+
+ this->stateFlags1 |= PLAYER_STATE1_400000;
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f);
+ if ((temp_v0 != 0) && ((temp_v0 > 0) || PlayerAnimation_Update(play, &this->skelAnime))) {
+ PlayerAnimationHeader* anim;
+ f32 lastFrame;
+
+ Player_SetAction(play, this, func_8084B5C0, 1);
+ Player_SetModelsForHoldingShield(this);
+ anim = D_8085BE84[PLAYER_ANIMGROUP_19][this->modelAnimType];
+ lastFrame = Animation_GetLastFrame(anim);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 1.0f, lastFrame, lastFrame, ANIMMODE_ONCE, 0.0f);
+ }
+ }
+}
+
+void func_8084BBF0(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ func_80832F24(this);
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 16.0f);
+ if (temp_v0 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) || (temp_v0 > 0)) {
+ func_80836988(this, play);
+ }
+ }
+}
+
+void func_8084BC64(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20 | PLAYER_STATE2_40;
+ func_808345A8(this);
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_20000000) && (this->unk_AE8 == 0) && (this->unk_B75 != 0)) {
+ s16 temp_v0 = this->unk_B76;
+ s16 temp_v1 = this->actor.shape.rot.y - temp_v0;
+
+ this->actor.shape.rot.y = temp_v0;
+ this->currentYaw = temp_v0;
+ this->linearVelocity = this->unk_B78;
+
+ if (ABS_ALT(temp_v1) > 0x4000) {
+ this->actor.shape.rot.y = temp_v0 + 0x8000;
+ }
+
+ if (this->actor.velocity.y < 0.0f) {
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ }
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ func_8085B384(this, play);
+ }
+ } else if ((this->stateFlags1 & PLAYER_STATE1_20000000) ||
+ (!(this->cylinder.base.acFlags & AC_HIT) && (this->unk_B75 == 0))) {
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ this->unk_AE8++;
+ } else {
+ Player_SetAction(play, this, func_8084BE40, 0);
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+ }
+
+ Player_AnimationPlayOnce(play, this,
+ (this->currentYaw != this->actor.shape.rot.y)
+ ? &gPlayerAnim_link_normal_front_downB
+ : &gPlayerAnim_link_normal_back_downB);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_FREEZE);
+ }
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ }
+}
+
+void func_8084BE40(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ func_808345A8(this);
+ func_80832F24(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->linearVelocity == 0.0f)) {
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ this->unk_AE8++;
+ } else {
+ Player_SetAction(play, this, func_8084BF28, 0);
+ this->stateFlags1 |= PLAYER_STATE1_4000000;
+ }
+
+ func_8082DB90(play, this,
+ (this->currentYaw != this->actor.shape.rot.y) ? &gPlayerAnim_link_normal_front_down_wake
+ : &gPlayerAnim_link_normal_back_down_wake);
+ this->currentYaw = this->actor.shape.rot.y;
+ }
+}
+
+AnimSfxEntry D_8085D604[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 20, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 30, NA_SE_NONE, STOP),
+};
+
+void func_8084BF28(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_808345A8(this);
+ if (this->stateFlags1 & PLAYER_STATE1_20000000) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ } else {
+ s32 temp_v0 = func_808331FC(play, this, &this->skelAnime, 16.0f);
+
+ if (temp_v0 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) || (temp_v0 > 0)) {
+ func_80836988(this, play);
+ }
+ }
+ }
+
+ Player_PlayAnimSfx(this, D_8085D604);
+}
+
+AnimSfxEntry D_8085D60C[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 60, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 140, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 164, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_8, 170, NA_SE_NONE, STOP),
+};
+
+void func_8084BFDC(Player* this, PlayState* play) {
+ if ((this->transformation != PLAYER_FORM_GORON) && (this->actor.depthInWater <= 0.0f)) {
+ if ((play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_HOT) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_9) ||
+ ((func_808340AC(sPlayerCurrentFloorType) >= 0) &&
+ !SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) {
+ func_808344C0(play, this);
+ }
+ }
+
+ func_80832F24(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this == GET_PLAYER(play)) {
+ func_80840770(play, this);
+ }
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_derth_rebirth) {
+ Player_PlayAnimSfx(this, D_8085D60C);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_link_normal_electric_shock_end) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 88.0f)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ }
+}
+
+s32 func_8084C124(PlayState* play, Player* this) {
+ if (func_80837730(play, this, 3.0f, 500)) {
+ Player_PlaySfx(this, NA_SE_EV_DIVE_INTO_WATER);
+ return true;
+ }
+ return false;
+}
+
+void func_8084C16C(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ Actor* heldActor;
+
+ if (func_80123420(this) != 0) {
+ this->actor.gravity = -1.2f;
+ }
+
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80832F78(this, &sp44, &sp42, 0.0f, play);
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ heldActor = this->heldActor;
+ if (!func_808313A8(play, this, heldActor) && (heldActor->id == ACTOR_EN_NIW) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) {
+ func_808409A8(play, this, this->linearVelocity + 2.0f, this->actor.velocity.y + 2.0f);
+ }
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->skelAnime.animation == &gPlayerAnim_link_normal_newroll_jump_20f) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_ROLL);
+ }
+
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ s16 prevYaw = this->currentYaw;
+
+ func_808378FC(play, this);
+ func_8083CBC4(this, sp44 * 0.5f, sp42, 2.0f, 0.2f, 0.1f, 0x190);
+
+ if (this->skelAnime.animation == &gPlayerAnim_pn_attack) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ this->unk_B10[0] += -800.0f;
+ this->actor.shape.rot.y += BINANG_ADD((s16)this->unk_B10[0], BINANG_SUB(this->currentYaw, prevYaw));
+ Math_StepToF(&this->unk_B10[1], 0.0f, this->unk_B10[0]);
+ }
+ } else {
+ func_8083CBC4(this, sp44, sp42, 1.0f, 0.05f, 0.1f, 0xC8);
+ }
+
+ func_8083216C(this, play);
+ if ((((this->stateFlags2 & PLAYER_STATE2_80000) && ((this->unk_AE7 == 2) || (this->unk_AE7 >= 4))) ||
+ !func_80839770(this, play)) &&
+ (this->actor.velocity.y < 0.0f)) {
+ if (this->unk_AE8 >= 0) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->unk_AE8 == 0) || (this->fallDistance > 0)) {
+ if ((D_80862B18 > 800.0f) || (this->stateFlags3 & PLAYER_STATE3_10000)) {
+ func_80840980(this, NA_SE_VO_LI_FALL_S);
+ this->stateFlags3 &= ~PLAYER_STATE3_10000;
+ }
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_normal_landing, 1.0f, 0.0f, 0.0f,
+ ANIMMODE_ONCE, 8.0f);
+ this->unk_AE8 = -1;
+ }
+ } else {
+ if ((this->unk_AE8 == -1) && (this->fallDistance > 120) && (D_80862B18 > 280.0f)) {
+ this->unk_AE8 = -2;
+ func_80840980(this, NA_SE_VO_LI_FALL_L);
+ }
+
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) &&
+ !(this->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_8000000)) &&
+ (this->linearVelocity > 0.0f)) {
+ if ((this->transformation != PLAYER_FORM_GORON) &&
+ ((this->transformation != PLAYER_FORM_DEKU) || (this->remainingHopsCounter != 0))) {
+ if ((this->wallHeight >= 150.0f) && (this->unk_AE3[this->unk_ADE] == 0)) {
+ if (func_8083D860(this, play)) {
+ func_8084C124(play, this);
+ }
+ } else if ((this->unk_B5C >= 2) &&
+ ((this->wallHeight < (150.0f * this->ageProperties->unk_08)) &&
+ (((this->actor.world.pos.y - this->actor.floorHeight) + this->wallHeight)) >
+ (70.0f * this->ageProperties->unk_08))) {
+ AnimationContext_DisableQueue(play);
+ if (this->stateFlags3 & PLAYER_STATE3_10000) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HOOKSHOT_HANG);
+ } else {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG);
+ }
+
+ this->actor.world.pos.y += this->wallHeight;
+ func_80837CEC(play, this, this->actor.wallPoly, this->wallDistance,
+ GET_PLAYER_ANIM(PLAYER_ANIMGROUP_38, this->modelAnimType));
+ this->currentYaw += 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ this->stateFlags1 |= PLAYER_STATE1_2000;
+
+ func_8084C124(play, this);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ func_80837134(play, this);
+ func_8083216C(this, play);
+ }
+
+ func_80838A90(this, play);
+}
+
+// sPlayerRollingAnimSfx
+AnimSfxEntry D_8085D61C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_SWORD_N, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 6, NA_SE_PL_WALK_GROUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 6, NA_SE_PL_ROLL, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 18, NA_SE_NONE, STOP),
+};
+
+// Player_Action_Rolling // Handles bonking too?
+void func_8084C6EC(Player* this, PlayState* play) {
+ s32 animFinished;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ this->stateFlags3 |= PLAYER_STATE3_8000000;
+
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ func_808339B4(this, -10);
+ }
+
+ if (this->skelAnime.curFrame >= 8.0f) {
+ if (this->skelAnime.curFrame < 18.0f) {
+ Player_SetCylinderForAttack(this, DMG_NORMAL_ROLL, 1, 12);
+ } else {
+ Player_ResetCylinder(this);
+ }
+ }
+
+ if (func_8083FE38(this, play)) {
+ return;
+ }
+
+ if (this->unk_AE8 != 0) {
+ s32 temp_v0;
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 2.0f);
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 5.0f);
+ if (temp_v0 != 0) {
+ if ((temp_v0 > 0) || animFinished) {
+ func_80836A5C(this, play);
+ }
+ }
+ } else if (!func_80840A30(play, this, &this->linearVelocity, 6.0f)) {
+ if ((this->skelAnime.curFrame < 15.0f) || !func_80848570(this, play)) {
+ f32 sp3C;
+ s16 yaw;
+
+ if (this->skelAnime.curFrame >= 20.0f) {
+ func_80836A5C(this, play);
+ return;
+ }
+
+ func_80832F78(this, &sp3C, &yaw, 0.018f, play);
+ sp3C *= 1.5f;
+ if ((sp3C < 3.0f) || (this->unk_AE3[this->unk_ADE] != 0)) {
+ sp3C = 3.0f;
+ }
+ func_8083CB58(this, sp3C, this->actor.shape.rot.y);
+
+ if (func_8083FBC4(play, this)) {
+ func_800B8F98(&this->actor, (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)
+ ? NA_SE_PL_ROLL_SNOW_DUST - SFX_FLAG
+ : NA_SE_PL_ROLL_DUST - SFX_FLAG);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D61C);
+ }
+ }
+}
+
+void func_8084C94C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_run_jump_water_fall_wait);
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 0.05f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->fallDistance >= 400) {
+ this->actor.colChkInfo.damage = 0x10;
+ func_80833B18(play, this, 1, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
+ } else {
+ func_80836B3C(play, this, 4.0f);
+ }
+ }
+}
+
+void func_8084CA24(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ }
+
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 6, 0x7D0, 0x190);
+ if (!func_80840A30(play, this, &this->linearVelocity, 0.0f)) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ if (this->unk_AAA > 0x36B0) {
+ this->actor.colChkInfo.damage = 0x10;
+ func_80833B18(play, this, 1, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
+ } else {
+ func_80836B3C(play, this, 4.0f);
+ }
+ } else {
+ this->actor.gravity = -1.0f;
+ this->unk_AAA = Math_Atan2S_XY(this->actor.speed, -this->actor.velocity.y);
+ func_8082F164(this, BTN_R);
+ }
+ }
+}
+
+void func_8084CB58(Player* this, PlayState* play) {
+ AttackAnimInfo* attackInfoEntry = &sMeleeAttackAnimInfo[this->meleeWeaponAnimation];
+ f32 sp38;
+ s16 sp36;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ this->actor.gravity = -0.8f;
+ } else {
+ this->actor.gravity = -1.2f;
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!func_808401F4(play, this)) {
+ func_8083FCF0(play, this, 6.0f, attackInfoEntry->unk_C, attackInfoEntry->unk_D);
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80832F78(this, &sp38, &sp36, 0.0f, play);
+ func_8083CBC4(this, sp38, this->currentYaw, 1.0f, 0.05f, 0.1f, 200);
+ } else if (func_80836F10(play, this) >= 0) { // Player didn't die because of this fall
+ this->meleeWeaponAnimation += 3;
+ func_80833864(play, this, this->meleeWeaponAnimation);
+ this->unk_ADD = 3;
+ this->meleeWeaponState = PLAYER_MELEE_WEAPON_STATE_0;
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ }
+}
+
+void func_8084CCEC(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8083133C(this);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000;
+ Player_AnimationPlayLoop(play, this, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)]);
+ this->unk_AE8 = -1;
+ }
+
+ func_80832F24(this);
+ if (!func_8083FE38(this, play) && (this->unk_AE8 != 0)) {
+ func_80840F34(this);
+ if (this->unk_AE8 < 0) {
+ if (this->unk_B08 >= 0.1f) {
+ this->unk_ADD = 0;
+ this->unk_AE8 = 1;
+ } else if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) {
+ func_80840E5C(this, play);
+ }
+ } else if (!func_80840CD4(this, play)) {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E7F8(this, &sp34, &sp32, play);
+ if (temp_v0 > 0) {
+ func_80840DEC(this, play);
+ } else if (temp_v0 < 0) {
+ func_80840E24(this, play);
+ }
+ }
+ }
+}
+
+void func_8084CE84(Player* this, PlayState* play) {
+ s32 var_v1;
+ s32 temp_v0_2;
+ f32 temp_ft4;
+ f32 var_fa0;
+ f32 sp54;
+ s16 sp52;
+ s16 temp_v0;
+ f32 temp_fv1;
+ s32 pad;
+ s32 sp44;
+
+ temp_v0 = this->currentYaw - this->actor.shape.rot.y;
+ var_v1 = ABS_ALT(temp_v0);
+
+ temp_ft4 = fabsf(this->linearVelocity);
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+
+ var_fa0 = temp_ft4 * 1.5f;
+ var_fa0 = CLAMP_MIN(var_fa0, 1.5f);
+
+ var_fa0 = ((var_v1 < 0x4000) ? -1.0f : 1.0f) * var_fa0;
+
+ func_8083EA44(this, var_fa0);
+
+ var_fa0 = CLAMP(temp_ft4 * 0.5f, 0.5f, 1.0f);
+
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)], 0.0f,
+ D_8085CF70[Player_IsHoldingTwoHandedWeapon(this)], this->unk_B38 * 0.7241379f, var_fa0,
+ this->blendTableBuffer);
+ if (!func_8083FE38(this, play) && !func_80840CD4(this, play)) {
+ func_80840F34(this);
+ func_80832F78(this, &sp54, &sp52, 0.0f, play);
+
+ temp_v0_2 = func_8083E7F8(this, &sp54, &sp52, play);
+ if (temp_v0_2 < 0) {
+ func_80840E24(this, play);
+ return;
+ }
+
+ if (temp_v0_2 == 0) {
+ sp54 = 0.0f;
+ sp52 = this->currentYaw;
+ }
+
+ sp44 = ABS_ALT(BINANG_SUB(sp52, this->currentYaw));
+ if (sp44 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = sp52;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp54 * 0.2f, 1.0f, 0.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp52, sp44 * 0.1f);
+ if ((sp54 == 0.0f) && (this->linearVelocity == 0.0f)) {
+ func_80840EC0(this, play);
+ }
+ }
+ }
+}
+
+void func_8084D18C(Player* this, PlayState* play) {
+ f32 sp5C = fabsf(this->linearVelocity);
+ f32 var_fa0;
+
+ this->stateFlags1 |= PLAYER_STATE1_1000;
+
+ if (sp5C == 0.0f) {
+ sp5C = ABS_ALT(this->unk_B4C) * 0.0015f;
+ if (sp5C < 400.0f) {
+ sp5C = 0.0f;
+ }
+
+ func_8083EA44(this, ((this->unk_B4C >= 0) ? 1 : -1) * sp5C);
+ } else {
+ var_fa0 = sp5C * 1.5f;
+ var_fa0 = CLAMP_MIN(var_fa0, 1.5f);
+ func_8083EA44(this, var_fa0);
+ }
+
+ var_fa0 = CLAMP(sp5C * 0.5f, 0.5f, 1.0f);
+
+ PlayerAnimation_BlendToJoint(play, &this->skelAnime, D_8085CF60[Player_IsHoldingTwoHandedWeapon(this)], 0.0f,
+ D_8085CF78[Player_IsHoldingTwoHandedWeapon(this)], this->unk_B38 * 0.7241379f, var_fa0,
+ this->blendTableBuffer);
+ if (!func_8083FE38(this, play) && !func_80840CD4(this, play)) {
+ f32 sp54;
+ s16 sp52;
+ s32 temp_v0;
+ s16 temp_v0_2;
+ s32 var_v1;
+
+ func_80840F34(this);
+ func_80832F78(this, &sp54, &sp52, 0.0f, play);
+ temp_v0 = func_8083E7F8(this, &sp54, &sp52, play);
+ if (temp_v0 > 0) {
+ func_80840DEC(this, play);
+ return;
+ }
+
+ if (temp_v0 == 0) {
+ sp54 = 0.0f;
+ sp52 = this->currentYaw;
+ }
+
+ var_v1 = ABS_ALT(BINANG_SUB(sp52, this->currentYaw));
+ if (var_v1 > 0x4000) {
+ if (Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ this->currentYaw = sp52;
+ }
+ } else {
+ Math_AsymStepToF(&this->linearVelocity, sp54 * 0.2f, 1.0f, 0.5f);
+ Math_ScaledStepToS(&this->currentYaw, sp52, var_v1 * 0.1f);
+ if ((sp54 == 0.0f) && (this->linearVelocity == 0.0f) && (sp5C == 0.0f)) {
+ func_80840EC0(this, play);
+ }
+ }
+ }
+}
+
+void func_8084D4EC(Player* this, PlayState* play) {
+ s32 animFinished;
+ f32 frame;
+ s32 temp_v0;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_250jump_start) {
+ this->linearVelocity = 1.0f;
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ f32 speed = this->wallHeight;
+
+ speed = CLAMP_MAX(speed, this->ageProperties->unk_0C);
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ speed *= 0.085f;
+ } else {
+ speed *= 0.072f;
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ speed += 1.0f;
+ }
+
+ func_80834D50(play, this, NULL, speed, NA_SE_VO_LI_AUTO_JUMP);
+ this->unk_AE8 = -1;
+ }
+ } else {
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f);
+ if (temp_v0 == 0) {
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000);
+ return;
+ }
+ if (animFinished || (temp_v0 > 0)) {
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_4000 | PLAYER_STATE1_40000);
+ this->unk_ABC = 0.0f;
+ return;
+ }
+
+ frame = 0.0f;
+ if (this->skelAnime.animation == &gPlayerAnim_link_swimer_swim_15step_up) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 30.0f)) {
+ func_8083B32C(play, this, 10.0f);
+ }
+ frame = 50.0f;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_150step_up) {
+ frame = 30.0f;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_normal_100step_up) {
+ frame = 16.0f;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, frame)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ }
+
+ if ((this->skelAnime.animation == &gPlayerAnim_link_normal_100step_up) || (this->skelAnime.curFrame > 5.0f)) {
+ if (this->unk_AE8 == 0) {
+ Player_AnimSfx_PlayFloorJump(this);
+ this->unk_AE8 = 1;
+ }
+ Math_SmoothStepToF(&this->unk_ABC, 0.0f, 0.1f, 400.0f, 150.0f);
+ }
+ }
+}
+
+void func_8084D770(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ if (this->unk_D58 == func_80837BF8) {
+ this->stateFlags2 |= PLAYER_STATE2_1;
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083249C(this);
+
+ temp_v0 = func_8083216C(this, play);
+ if (((this->stateFlags1 & PLAYER_STATE1_800) && (this->heldActor != NULL) && (this->getItemId == GI_NONE)) ||
+ (temp_v0 == 0)) {
+ this->unk_D58(play, this);
+ }
+}
+
+void func_8084D820(Player* this, PlayState* play) {
+ if (func_80838A90(this, play) == 0) {
+ if ((this->stateFlags3 & PLAYER_STATE3_10) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ func_80833AA0(this, play);
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ } else if (this->unk_AE8 == 0) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (DECR(this->doorTimer) == 0) {
+ this->linearVelocity = 0.1f;
+ this->unk_AE8 = 1;
+ }
+ } else if (this->unk_AE7 == 0) {
+ f32 sp6C = 5.0f * D_8085C3E4;
+ s32 var_t0 = func_808411D4(play, this, &sp6C, -1);
+
+ if (this->unk_397 == 4) {
+ if (R_PLAY_FILL_SCREEN_ON < 0) {
+ if (play->roomCtx.status != 1) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+
+ this->actor.world.pos.y += (this->doorDirection != 0) ? 3.0f : -3.0f;
+ this->actor.prevPos.y = this->actor.world.pos.y;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON == 0) {
+ CollisionPoly* sp64;
+ s32 sp60;
+
+ if (func_80835DF8(play, this, &sp64, &sp60)) {
+ this->actor.floorPoly = sp64;
+ this->actor.floorBgId = sp60;
+ }
+ }
+ }
+
+ if (var_t0 < 0x1E) {
+ this->unk_AE7 = 1;
+ this->stateFlags1 |= PLAYER_STATE1_20000000;
+ this->unk_3A0.x = this->unk_3AC.x;
+ this->unk_3A0.z = this->unk_3AC.z;
+ }
+ } else {
+ f32 sp5C = 5.0f;
+ s32 sp58 = 0x14;
+ s32 temp_v0_8;
+
+ if (this->stateFlags1 & PLAYER_STATE1_1) {
+ sp5C = gSaveContext.entranceSpeed;
+ if (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) {
+ this->unk_3A0.x = (Math_SinS(D_80862B16) * 400.0f) + this->actor.world.pos.x;
+ this->unk_3A0.z = (Math_CosS(D_80862B16) * 400.0f) + this->actor.world.pos.z;
+ }
+ } else {
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8++;
+ sp5C = gSaveContext.entranceSpeed;
+ sp58 = -1;
+ } else if (this->unk_397 == 4) {
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ R_PLAY_FILL_SCREEN_ON = 16;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+
+ R_PLAY_FILL_SCREEN_R = R_PLAY_FILL_SCREEN_G = R_PLAY_FILL_SCREEN_B = R_PLAY_FILL_SCREEN_ALPHA;
+ } else if (R_PLAY_FILL_SCREEN_ON >= 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ TransitionActorEntry* temp_v1_4; // sp50
+ s32 roomNum;
+
+ temp_v1_4 = &play->doorCtx.transitionActorList[this->doorNext];
+ roomNum = temp_v1_4->sides[0].room;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+
+ if ((roomNum != play->roomCtx.curRoom.num) && (play->roomCtx.curRoom.num >= 0)) {
+ play->roomCtx.prevRoom = play->roomCtx.curRoom;
+
+ play->roomCtx.curRoom.num = -1;
+ play->roomCtx.curRoom.segment = NULL;
+ func_8012EBF8(play, &play->roomCtx);
+ } else {
+ static Vec3f D_8085D62C = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D638 = { 0.0f, 0.0f, 0.0f };
+ static Vec3f D_8085D644 = { 0.0f, 0.0f, 0.0f };
+
+ R_PLAY_FILL_SCREEN_ON = -16;
+ if (play->roomCtx.curRoom.num < 0) {
+ Room_StartRoomTransition(play, &play->roomCtx, temp_v1_4->sides[0].room);
+ play->roomCtx.prevRoom.num = -1;
+ play->roomCtx.prevRoom.segment = NULL;
+ }
+
+ this->actor.world.pos.x = temp_v1_4->pos.x;
+ this->actor.world.pos.y = temp_v1_4->pos.y;
+ this->actor.world.pos.z = temp_v1_4->pos.z;
+
+ this->actor.shape.rot.y = ((((temp_v1_4->rotY >> 7) & 0x1FF) / 180.0f) * 0x8000);
+
+ D_8085D62C.x = (this->doorDirection != 0) ? -120.0f : 120.0f;
+ D_8085D62C.y = (this->doorDirection != 0) ? -75.0f : 75.0f;
+ D_8085D62C.z = -240.0f;
+ if (this->doorDirection != 0) {
+ Camera_ChangeDoorCam(play->cameraPtrs[0], &this->actor, -2, 0.0f,
+ temp_v1_4->pos.x + 0x32, temp_v1_4->pos.y + 0x5F,
+ temp_v1_4->pos.z - 0x32);
+ } else {
+ Camera_ChangeDoorCam(play->cameraPtrs[0], &this->actor, -2, 0.0f,
+ temp_v1_4->pos.x - 0x32, temp_v1_4->pos.y + 5,
+ temp_v1_4->pos.z - 0x32);
+ }
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D62C,
+ &this->actor.world.pos);
+
+ D_8085D638.x = (this->doorDirection != 0) ? 130.0f : -130.0f;
+ D_8085D638.z = 160.0f;
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D638, &this->unk_3A0);
+ D_8085D644.z = 160.0f;
+ Player_TranslateAndRotateY(this, &this->unk_3A0, &D_8085D644, &this->unk_3AC);
+
+ this->actor.shape.rot.y += (this->doorDirection != 0) ? 0x4000 : -0x4000;
+ this->unk_AE7 = 0;
+
+ this->actor.world.rot.y = this->currentYaw = this->actor.shape.rot.y;
+ }
+ }
+
+ this->actor.world.pos.y += (this->doorDirection != 0) ? 3.0f : -3.0f;
+ this->actor.prevPos.y = this->actor.world.pos.y;
+ }
+ }
+ }
+
+ temp_v0_8 = func_808411D4(play, this, &sp5C, sp58);
+ if ((this->unk_AE8 == 0) || ((temp_v0_8 == 0) && (this->linearVelocity == 0.0f) &&
+ (Play_GetCamera(play, CAM_ID_MAIN)->stateFlags & CAM_STATE_4))) {
+ if (this->unk_397 == 4) {
+ Map_InitRoomData(play, play->roomCtx.curRoom.num);
+ Minimap_SavePlayerRoomInitInfo(play);
+ }
+
+ R_PLAY_FILL_SCREEN_ON = 0;
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ Player_StopCutscene(this);
+ if (!(this->stateFlags3 & PLAYER_STATE3_20000)) {
+ func_801226E0(play, ((void)0, gSaveContext.respawn[RESPAWN_MODE_DOWN].data));
+ }
+
+ if (play->unk_1887C != 0) {
+ play->func_18780(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ if (play->sceneId == 0x45) {
+ play->unk_1887C = 0;
+ }
+ } else if (!func_808391D8(this, play)) {
+ func_8083B2E4(this, play);
+ }
+ }
+ }
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ func_8083216C(this, play);
+ }
+}
+
+// door stuff
+void func_8084E034(Player* this, PlayState* play) {
+ EnDoor* doorActor = (EnDoor*)this->doorActor;
+ s32 sp38 = (doorActor != NULL) && (doorActor->doorType == ENDOOR_TYPE_7);
+ s32 animFinished;
+ CollisionPoly* poly;
+ s32 bgId;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (DECR(this->unk_AE7) == 0) {
+ func_80835DF8(play, this, &poly, &bgId);
+ }
+
+ animFinished = PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+
+ if (animFinished) {
+ if (this->unk_AE8 == 0) {
+ if (DECR(this->doorTimer) == 0) {
+ this->unk_AE8 = 1;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+ } else {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+
+ if ((this->actor.category == ACTORCAT_PLAYER) && !sp38) {
+ if (play->roomCtx.prevRoom.num >= 0) {
+ func_8012EBF8(play, &play->roomCtx);
+ }
+
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ Play_SetupRespawnPoint(&play->state, RESPAWN_MODE_DOWN, PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B));
+ }
+ }
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_20000000) && PlayerAnimation_OnFrame(&this->skelAnime, 15.0f)) {
+ Player_StopCutscene(this);
+ play->func_18780(this, play);
+ } else if (sp38 && PlayerAnimation_OnFrame(&this->skelAnime, 15.0f)) {
+ s16 doorRot = (this->doorDirection < 0) ? doorActor->knobDoor.dyna.actor.world.rot.x
+ : doorActor->knobDoor.dyna.actor.world.rot.z;
+
+ if (doorRot != 0) {
+ func_808354A4(play, doorRot - 1, false);
+ }
+ }
+}
+
+// grab/hold an actor (?)
+void func_8084E25C(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ func_808313F0(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (!func_808313A8(play, this, interactRangeActor)) {
+ this->actor.child = interactRangeActor;
+ this->heldActor = interactRangeActor;
+ interactRangeActor->parent = &this->actor;
+ interactRangeActor->bgCheckFlags &=
+ ~(BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_GROUND_LEAVE | BGCHECKFLAG_WALL |
+ BGCHECKFLAG_CEILING | BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH | BGCHECKFLAG_GROUND_STRICT);
+ this->leftHandWorld.rot.y = interactRangeActor->shape.rot.y - this->actor.shape.rot.y;
+ }
+ } else {
+ Math_ScaledStepToS(&this->leftHandWorld.rot.y, 0, 0xFA0);
+ }
+}
+
+// grab/hold an actor (?)
+void func_8084E334(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_silver_wait);
+ this->unk_AE8 = 1;
+ } else if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 27.0f)) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ this->heldActor = interactRangeActor;
+ this->actor.child = interactRangeActor;
+ interactRangeActor->parent = &this->actor;
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 25.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_L);
+ }
+ } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) {
+ Player_SetAction(play, this, func_8084E434, 1);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_silver_throw);
+ }
+}
+
+// throw held actor (?)
+void func_8084E434(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 6.0f)) {
+ Actor* heldActor = this->heldActor;
+
+ heldActor->world.rot.y = this->actor.shape.rot.y;
+ heldActor->speed = 10.0f;
+ heldActor->velocity.y = 20.0f;
+ func_808309CC(play, this);
+ Player_PlaySfx(this, NA_SE_PL_THROW);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+void func_8084E4E4(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_nocarry_free_wait);
+ this->unk_AE8 = 15;
+ } else if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ if (this->unk_AE8 == 0) {
+ func_80836A98(this, &gPlayerAnim_link_normal_nocarry_free_end, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_800;
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+ }
+}
+
+// Player_Action_PutDownObject?
+void func_8084E58C(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ Actor* heldActor = this->heldActor;
+
+ if (!func_808313A8(play, this, heldActor)) {
+ heldActor->velocity.y = 0.0f;
+ heldActor->speed = 0.0f;
+ func_808309CC(play, this);
+ if (heldActor->id == ACTOR_EN_BOM_CHU) {
+ func_80831814(this, play, PLAYER_UNKAA5_0);
+ }
+ }
+ }
+}
+
+// Player_Action_Throwing
+void func_8084E65C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 yaw;
+
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->skelAnime.curFrame >= 8.0f) && func_80832F78(this, &sp34, &yaw, 0.018f, play))) {
+ func_80836988(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 3.0f)) {
+ func_808409A8(play, this, this->linearVelocity + 8.0f, 12.0f);
+ }
+}
+
+void func_8084E724(Player* this, PlayState* play) {
+ u8 temp_v1;
+ u32 new_var;
+
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+ } else {
+ func_80832F24(this);
+ }
+
+ if (this->unk_AA5 == PLAYER_UNKAA5_3) {
+ if (func_800B7118(this) || func_8082ECCC(this)) {
+ func_8083216C(this, play);
+ }
+ }
+
+ temp_v1 = this->unk_AA5;
+ new_var = temp_v1;
+
+ if (((temp_v1 == PLAYER_UNKAA5_2) && !(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) ||
+ ((temp_v1 != PLAYER_UNKAA5_2) &&
+ (((((((((this->csMode != PLAYER_CSMODE_0) || (new_var == 0)) || (temp_v1 >= PLAYER_UNKAA5_5)) ||
+ (func_8082FB68(this) != 0)) ||
+ (this->targetedActor != NULL)) ||
+ (func_8083868C(play, this) == 0)) ||
+ ((this->unk_AA5 == PLAYER_UNKAA5_3) &&
+ (((((Player_ItemToItemAction(this, Inventory_GetBtnBItem(play)) != this->heldItemAction) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_B)) ||
+ CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_R | BTN_A)) ||
+ (func_80123434(this) != 0)) ||
+ (!func_800B7128(this) && (func_8082EF20(this) == 0))))) ||
+ ((this->unk_AA5 == PLAYER_UNKAA5_1) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_B | BTN_A))) ||
+ func_808391D8(this, play)))) {
+ func_80839ED0(this, play);
+ play_sound(NA_SE_SY_CAMERA_ZOOM_UP);
+ } else if ((DECR(this->unk_AE8) == 0) || (this->unk_AA5 != PLAYER_UNKAA5_3)) {
+ if (func_801240DC(this)) {
+ this->unk_AA6 |= 0x43;
+ } else {
+ this->actor.shape.rot.y = func_80847190(play, this, 0);
+ }
+ }
+
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+void func_8084E980(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8083249C(this);
+ func_8083216C(this, play);
+ if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ if (!CHECK_FLAG_ALL(this->talkActor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_4)) {
+ this->stateFlags2 &= ~PLAYER_STATE2_2000;
+ }
+
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+ CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ s32 sp44 = this->unk_AE8;
+
+ func_80837BD0(play, this);
+ this->unk_AE8 = sp44;
+ } else if (!func_80847994(play, this) && !func_80847880(play, this) && !func_808387A0(play, this) &&
+ ((this->talkActor != this->interactRangeActor) || !func_8083D23C(this, play))) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ } else {
+ func_8085B384(this, play);
+ }
+ }
+
+ this->unk_B5E = 0xA;
+ return;
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_800000) {
+ func_8084FE7C(this, play);
+ } else if (func_801242B4(this)) {
+ func_808508C8(this, play);
+ if (this->actor.depthInWater > 100.0f) {
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ }
+ } else if (!func_80123420(this) && PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->skelAnime.moveFlags != 0) {
+ func_8082E794(this);
+ if ((this->talkActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_ROD)) {
+ func_8082DB90(play, this, &gPlayerAnim_link_normal_talk_free);
+ } else {
+ Player_AnimationPlayLoop(play, this, func_8082ED20(this));
+ }
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_link_normal_talk_free_wait);
+ }
+ }
+
+ if (this->targetedActor != NULL) {
+ this->currentYaw = func_8083C62C(this, false);
+ this->actor.shape.rot.y = this->currentYaw;
+ if (this->unk_AE7 != 0) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_800)) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ this->unk_AE7--;
+ if (this->unk_AE7 != 0) {
+ PlayerAnimation_Change(play, &this->unk_284, &gPlayerAnim_link_normal_talk_free, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_normal_talk_free),
+ ANIMMODE_ONCE, -6.0f);
+ }
+ }
+ }
+ AnimationContext_SetCopyFalse(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable, D_8085B9F0);
+ } else if (!(this->stateFlags1 & PLAYER_STATE1_800) &&
+ (this->skelAnime.animation == &gPlayerAnim_link_normal_talk_free_wait)) {
+ s32 temp_v0 = this->actor.focus.rot.y - this->actor.shape.rot.y;
+
+ if (ABS_ALT(temp_v0) > 0xFA0) {
+ PlayerAnimation_Change(
+ play, &this->unk_284, D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType], 0.4f, 0.0f,
+ Animation_GetLastFrame(D_8085BE84[PLAYER_ANIMGROUP_25][this->modelAnimType]), ANIMMODE_ONCE, -6.0f);
+ this->unk_AE7 = 2;
+ }
+ }
+ }
+}
+
+void func_8084ED9C(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+ func_8083DEE4(play, this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && !func_8083E14C(play, this)) {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E758(this, &sp34, &sp32);
+ if (temp_v0 > 0) {
+ func_8083E234(this, play);
+ } else if (temp_v0 < 0) {
+ func_8083E28C(this, play);
+ }
+ }
+}
+
+AnimSfxEntry D_8085D650[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 3, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 21, NA_SE_PL_SLIP, STOP),
+};
+
+void func_8084EE50(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+
+ if (func_8082E67C(play, this, &gPlayerAnim_link_normal_pushing)) {
+ this->unk_AE8 = 1;
+ } else if ((this->unk_AE8 == 0) && PlayerAnimation_OnFrame(&this->skelAnime, 11.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_PUSH);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D650);
+ func_8083DEE4(play, this);
+
+ if (!func_8083E14C(play, this)) {
+ f32 sp34;
+ s16 sp32;
+ s32 temp_v0;
+
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ temp_v0 = func_8083E758(this, &sp34, &sp32);
+ if (temp_v0 < 0) {
+ func_8083E28C(this, play);
+ } else if (temp_v0 == 0) {
+ func_8083DF38(this, &gPlayerAnim_link_normal_push_end, play);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ func_808479F4(play, this, 2.0f);
+ this->linearVelocity = 2.0f;
+ }
+}
+
+AnimSfxEntry D_8085D658[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 4, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 24, NA_SE_PL_SLIP, STOP),
+};
+
+Vec3f D_8085D660 = { 0.0f, 268 * 0.1f, -60.0f };
+
+void func_8084EF9C(Player* this, PlayState* play) {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_35][this->modelAnimType];
+
+ this->stateFlags2 |= (PLAYER_STATE2_1 | PLAYER_STATE2_40 | PLAYER_STATE2_100);
+
+ if (func_8082E67C(play, this, anim)) {
+ this->unk_AE8 = 1;
+ } else if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 11.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_PUSH);
+ }
+
+ //! FAKE
+ if (1) {}
+ } else {
+ Player_PlayAnimSfx(this, D_8085D658);
+ }
+
+ func_8083DEE4(play, this);
+ if (!func_8083E14C(play, this)) {
+ f32 sp78;
+ s16 sp76;
+ s32 temp_v0;
+
+ func_80832F78(this, &sp78, &sp76, 0.0f, play);
+
+ temp_v0 = func_8083E758(this, &sp78, &sp76);
+ if (temp_v0 > 0) {
+ func_8083E234(this, play);
+ } else if (temp_v0 == 0) {
+ func_8083DF38(this, D_8085BE84[PLAYER_ANIMGROUP_36][this->modelAnimType], play);
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_10;
+ }
+ }
+
+ if (this->stateFlags2 & PLAYER_STATE2_10) {
+ Vec3f sp64;
+ f32 yIntersect = func_80835D2C(play, this, &D_8085D660, &sp64) - this->actor.world.pos.y;
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f sp4C;
+ Vec3f sp40;
+
+ if (fabsf(yIntersect) < 268 * 0.1f) {
+ sp64.y -= 7.0f;
+ sp4C.x = this->actor.world.pos.x;
+ sp4C.z = this->actor.world.pos.z;
+ sp4C.y = sp64.y;
+ if (!BgCheck_EntityLineTest2(&play->colCtx, &sp4C, &sp64, &sp40, &poly, 1, 0, 0, 1, &bgId, &this->actor)) {
+ func_808479F4(play, this, -2.0f);
+ return;
+ }
+ }
+ this->stateFlags2 &= ~PLAYER_STATE2_10;
+ }
+}
+
+void func_8084F1B8(Player* this, PlayState* play) {
+ f32 sp3C;
+ s16 sp3A;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this,
+ (this->unk_AE7 > 0) ? &gPlayerAnim_link_normal_fall_wait
+ : D_8085BE84[PLAYER_ANIMGROUP_39][this->modelAnimType]);
+ } else if (this->unk_AE7 == 0) {
+ f32 frame;
+
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_fall) {
+ frame = 11.0f;
+ } else {
+ frame = 1.0f;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, frame)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_WALK_GROUND);
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_fall) {
+ this->unk_AE7 = 1;
+ } else {
+ this->unk_AE7 = -1;
+ }
+ }
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->currentYaw, 0x800);
+ if (this->unk_AE7 != 0) {
+ func_80832F78(this, &sp3C, &sp3A, 0.0f, play);
+ if (this->unk_ADF[this->unk_ADE] >= 0) {
+ func_808381A0(this,
+ (this->unk_AE7 > 0) ? D_8085BE84[PLAYER_ANIMGROUP_37][this->modelAnimType]
+ : D_8085BE84[PLAYER_ANIMGROUP_40][this->modelAnimType],
+ play);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) || (this->actor.shape.feetFloorFlags != 0)) {
+ func_80833A64(this);
+
+ if (this->unk_AE7 < 0) {
+ this->linearVelocity = -0.8f;
+ } else {
+ this->linearVelocity = 0.8f;
+ }
+
+ func_80833AA0(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000);
+ this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
+ }
+ }
+}
+
+void func_8084F3DC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->currentYaw = this->skelAnime.jointTable[PLAYER_LIMB_WAIST - 1].y + this->actor.shape.rot.y;
+ func_8082E820(this, 1);
+ this->actor.shape.rot.y = this->currentYaw;
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~(PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, this->skelAnime.endFrame - 6.0f)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, this->skelAnime.endFrame - 34.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_CLIMB_CLIFF);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_CLIMB_END);
+ func_8084C124(play, this);
+ }
+}
+
+void func_8084F4E8(Player* this, PlayState* play) {
+ s32 yStick = sPlayerControlInput->rel.stick_y;
+ s32 xStick = sPlayerControlInput->rel.stick_x;
+ f32 var_fv0;
+ f32 var_fv1;
+ Vec3f sp7C;
+ s32 sp78;
+ Vec3f sp6C;
+ Vec3f sp60;
+ DynaPolyActor* dyna;
+ PlayerAnimationHeader* anim1;
+ PlayerAnimationHeader* anim2;
+
+ this->fallStartHeight = this->actor.world.pos.y;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ if ((this->unk_AE7 != 0) && (ABS_ALT(yStick) < ABS_ALT(xStick))) {
+ var_fv0 = ABS_ALT(xStick) * 0.0325f;
+ yStick = 0;
+ } else {
+ var_fv0 = ABS_ALT(yStick) * 0.05f;
+ xStick = 0;
+ }
+
+ if (var_fv0 < 1.0f) {
+ var_fv0 = 1.0f;
+ } else if (var_fv0 > 3.35f) {
+ var_fv0 = 3.35f;
+ }
+
+ if (this->skelAnime.playSpeed >= 0.0f) {
+ var_fv1 = 1.0f;
+ } else {
+ var_fv1 = -1.0f;
+ }
+
+ this->skelAnime.playSpeed = var_fv1 * var_fv0;
+
+ if (this->unk_AE8 >= 0) {
+ if ((this->actor.wallPoly != NULL) && (this->actor.wallBgId != BGCHECK_SCENE)) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.wallBgId);
+
+ if (dyna != NULL) {
+ Math_Vec3f_Diff(&dyna->actor.world.pos, &dyna->actor.prevPos, &sp7C);
+ Math_Vec3f_Sum(&this->actor.world.pos, &sp7C, &this->actor.world.pos);
+ }
+ }
+
+ Actor_UpdateBgCheckInfo(play, &this->actor, 268 * 0.1f, 6.0f, this->ageProperties->unk_00 + 15.0f,
+ UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_4);
+ func_8083DD1C(play, this, 268 * 0.1f, this->ageProperties->unk_3C, 50.0f, -20.0f);
+ }
+
+ func_80831944(play, this);
+
+ if ((this->unk_AE8 < 0) || !func_8083E354(this, play)) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 < 0) {
+ this->unk_AE8 = ABS_ALT(this->unk_AE8) & 1;
+ } else if (yStick != 0) {
+ f32 yIntersect;
+
+ sp78 = this->unk_AE7 + this->unk_AE8;
+
+ if (yStick > 0) {
+ sp6C.x = 0.0f;
+ sp6C.y = this->ageProperties->unk_40;
+ sp6C.z = this->ageProperties->unk_3C + 10.0f;
+
+ yIntersect = func_80835D2C(play, this, &sp6C, &sp60);
+
+ if (this->actor.world.pos.y < yIntersect) {
+ if (this->unk_AE7 != 0) {
+ this->actor.world.pos.y = yIntersect;
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ func_80837CEC(play, this, this->actor.wallPoly, this->ageProperties->unk_3C,
+ &gPlayerAnim_link_normal_jump_climb_up_free);
+ this->currentYaw += 0x8000;
+ this->actor.shape.rot.y = this->currentYaw;
+ func_808381A0(this, &gPlayerAnim_link_normal_jump_climb_up_free, play);
+ this->stateFlags1 |= PLAYER_STATE1_4000;
+ } else {
+ func_8083DCC4(this, this->ageProperties->unk_D4[this->unk_AE8], play);
+ }
+ } else {
+ this->skelAnime.prevTransl = this->ageProperties->unk_4A[sp78];
+ Player_AnimationPlayOnce(play, this, this->ageProperties->unk_B4[sp78]);
+ }
+ } else if ((this->actor.world.pos.y - this->actor.floorHeight) < 15.0f) {
+ if (this->unk_AE7 != 0) {
+ func_8083E2F4(this, play);
+ } else {
+ if (this->unk_AE8 != 0) {
+ this->skelAnime.prevTransl = this->ageProperties->unk_44;
+ }
+
+ func_8083DCC4(this, this->ageProperties->unk_CC[this->unk_AE8], play);
+ this->unk_AE8 = 1;
+ }
+ } else {
+ sp78 ^= 1;
+ this->skelAnime.prevTransl = this->ageProperties->unk_62[sp78];
+ anim1 = this->ageProperties->unk_B4[sp78];
+ PlayerAnimation_Change(play, &this->skelAnime, anim1, -1.0f, Animation_GetLastFrame(anim1), 0.0f, 2,
+ 0.0f);
+ }
+
+ this->unk_AE8 ^= 1;
+ } else if ((this->unk_AE7 != 0) && (xStick != 0)) {
+ anim2 = this->ageProperties->unk_C4[this->unk_AE8];
+
+ if (xStick > 0) {
+ this->skelAnime.prevTransl = this->ageProperties->unk_7A[this->unk_AE8];
+ Player_AnimationPlayOnce(play, this, anim2);
+ } else {
+ this->skelAnime.prevTransl = this->ageProperties->unk_7A[this->unk_AE8 + 2];
+ PlayerAnimation_Change(play, &this->skelAnime, anim2, -1.0f, Animation_GetLastFrame(anim2), 0.0f, 2,
+ 0.0f);
+ }
+ } else {
+ this->stateFlags2 |= PLAYER_STATE2_1000;
+ }
+
+ return;
+ }
+ }
+
+ if (this->unk_AE8 < 0) {
+ if (((this->unk_AE8 == -2) &&
+ (PlayerAnimation_OnFrame(&this->skelAnime, 14.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 29.0f))) ||
+ ((this->unk_AE8 == -4) &&
+ (PlayerAnimation_OnFrame(&this->skelAnime, 22.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 35.0f) ||
+ PlayerAnimation_OnFrame(&this->skelAnime, 49.0f) || PlayerAnimation_OnFrame(&this->skelAnime, 55.0f)))) {
+ func_80847A50(this);
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, (this->skelAnime.playSpeed > 0.0f) ? 20.0f : 0.0f)) {
+ func_80847A50(this);
+ }
+}
+
+f32 D_8085D66C[] = { 11.0f, 21.0f };
+f32 D_8085D674[] = { 40.0f, 50.0f };
+
+AnimSfxEntry D_8085D67C[] = {
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 10, NA_SE_PL_WALK_LADDER, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 20, NA_SE_PL_WALK_LADDER, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_SURFACE, 30, NA_SE_PL_WALK_LADDER, STOP),
+};
+
+void func_8084FC0C(Player* this, PlayState* play) {
+ s32 temp_v0;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ temp_v0 = func_808331FC(play, this, &this->skelAnime, 4.0f);
+ if (temp_v0 == 0) {
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ } else if ((temp_v0 > 0) || PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80839E74(this, play);
+ this->stateFlags1 &= ~PLAYER_STATE1_200000;
+ } else {
+ f32* var_v1 = D_8085D66C;
+
+ if (this->unk_AE8 != 0) {
+ Player_PlayAnimSfx(this, D_8085D67C);
+ var_v1 = D_8085D674;
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, var_v1[0]) ||
+ PlayerAnimation_OnFrame(&this->skelAnime, var_v1[1])) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + 20.0f;
+ pos.z = this->actor.world.pos.z;
+ if (BgCheck_EntityRaycastFloor5(&play->colCtx, &poly, &bgId, &this->actor, &pos) != 0.0f) {
+ this->floorSfxOffset = SurfaceType_GetSfxOffset(&play->colCtx, poly, bgId);
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ }
+ }
+}
+
+void func_8084FD7C(PlayState* play, Player* this, Actor* actor) {
+ s16 var_a3;
+
+ if (this->unk_B86[0] != 0) {
+ this->unk_B86[0]--;
+ return;
+ }
+
+ this->upperLimbRot.y = func_80847190(play, this, 1) - this->actor.shape.rot.y;
+
+ var_a3 = ABS_ALT(this->upperLimbRot.y) - 0x4000;
+ if (var_a3 > 0) {
+ var_a3 = CLAMP_MAX(var_a3, 0x15E);
+ actor->shape.rot.y += var_a3 * ((this->upperLimbRot.y >= 0) ? 1 : -1);
+ actor->world.rot.y = actor->shape.rot.y;
+ }
+
+ this->upperLimbRot.y += 0x2710;
+ this->unk_AA8 = -0x1388;
+}
+
+s32 func_8084FE48(Player* this) {
+ return (this->targetedActor == NULL) && !func_8082FC24(this);
+}
+
+PlayerAnimationHeader* D_8085D688[] = {
+ &gPlayerAnim_link_uma_anim_stop, &gPlayerAnim_link_uma_anim_stand, &gPlayerAnim_link_uma_anim_walk,
+ &gPlayerAnim_link_uma_anim_slowrun, &gPlayerAnim_link_uma_anim_fastrun, &gPlayerAnim_link_uma_anim_jump100,
+ &gPlayerAnim_link_uma_anim_jump200,
+};
+
+PlayerAnimationHeader* D_8085D6A4[] = {
+ NULL,
+ NULL,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_walk_muti,
+ &gPlayerAnim_link_uma_anim_slowrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ &gPlayerAnim_link_uma_anim_fastrun_muti,
+ NULL,
+ NULL,
+};
+
+PlayerAnimationHeader* D_8085D6D0[] = {
+ &gPlayerAnim_link_uma_wait_3,
+ &gPlayerAnim_link_uma_wait_1,
+ &gPlayerAnim_link_uma_wait_2,
+};
+
+u8 D_8085D6DC[][2] = {
+ { 32, 58 },
+ { 25, 42 },
+};
+
+Vec3s D_8085D6E0 = { -0x45, 0x1BEA, -0x10A };
+
+AnimSfxEntry D_8085D6E8[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 48, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 58, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 68, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 92, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 110, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 126, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 132, NA_SE_PL_CALM_PAT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 136, NA_SE_PL_CALM_PAT, STOP),
+};
+
+void func_8084FE7C(Player* this, PlayState* play) {
+ EnHorse* rideActor = (EnHorse*)this->rideActor;
+
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ func_80847E2C(this, 1.0f, 10.0f);
+ if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->skelAnime.animation = &gPlayerAnim_link_uma_wait_1;
+ this->unk_AE8 = 0x63;
+ } else {
+ s32 var_v0 = (this->mountSide < 0) ? 0 : 1;
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, D_8085D6DC[var_v0][0])) {
+ Actor_SetCameraHorseSetting(play, this);
+ Player_PlaySfx(this, NA_SE_PL_CLIMB_CLIFF);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, D_8085D6DC[var_v0][1])) {
+ Player_PlaySfx(this, NA_SE_PL_SIT_ON_HORSE);
+ }
+ }
+ } else {
+ if (rideActor->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80841A50(play, this);
+ }
+
+ Actor_SetCameraHorseSetting(play, this);
+
+ this->skelAnime.prevTransl = D_8085D6E0;
+
+ if ((this->unk_AE8 < 0) || ((rideActor->animIndex != (this->unk_AE8 & 0xFFFF)) &&
+ ((rideActor->animIndex >= ENHORSE_ANIM_STOPPING) || (this->unk_AE8 >= 2)))) {
+ s32 animIndex = rideActor->animIndex;
+
+ if (animIndex < ENHORSE_ANIM_STOPPING) {
+ f32 temp_fv0 = Rand_ZeroOne();
+ s32 index = 0;
+
+ animIndex = ENHORSE_ANIM_WHINNY;
+ if (temp_fv0 < 0.1f) {
+ index = 2;
+ } else if (temp_fv0 < 0.2f) {
+ index = 1;
+ }
+
+ Player_AnimationPlayOnce(play, this, D_8085D6D0[index]);
+ } else {
+ this->skelAnime.animation = D_8085D688[animIndex - 2];
+ if (this->unk_AE8 >= 0) {
+ Animation_SetMorph(play, &this->skelAnime, 8.0f);
+ }
+
+ if (animIndex < ENHORSE_ANIM_WALK) {
+ func_808309CC(play, this);
+ this->unk_AE7 = 0;
+ }
+ }
+
+ this->unk_AE8 = animIndex;
+ }
+
+ if (this->unk_AE8 == 1) {
+ if (D_80862B04 || func_8082DAFC(play)) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3);
+ } else if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->unk_AE8 = 0x63;
+ } else if (this->skelAnime.animation == &gPlayerAnim_link_uma_wait_1) {
+ Player_PlayAnimSfx(this, D_8085D6E8);
+ }
+ } else {
+ this->skelAnime.curFrame = rideActor->curFrame;
+ PlayerAnimation_AnimateFrame(play, &this->skelAnime);
+ }
+
+ AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.morphTable,
+ this->skelAnime.jointTable);
+
+ if ((play->csCtx.state != CS_STATE_IDLE) || (this->csMode != PLAYER_CSMODE_0)) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ this->unk_AE7 = 0;
+ } else if ((this->unk_AE8 < 2) || (this->unk_AE8 >= 4)) {
+ D_80862B04 = func_8083216C(this, play);
+ if (D_80862B04) {
+ this->unk_AE7 = 0;
+ }
+ }
+
+ this->actor.world.pos.x = rideActor->actor.world.pos.x + rideActor->riderPos.x;
+ this->actor.world.pos.y = rideActor->actor.world.pos.y + rideActor->riderPos.y - 27.0f;
+ this->actor.world.pos.z = rideActor->actor.world.pos.z + rideActor->riderPos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y;
+
+ if (!D_80862B04) {
+ if (this->unk_AE7 != 0) {
+ if (PlayerAnimation_Update(play, &this->unk_284)) {
+ rideActor->stateFlags &= ~ENHORSE_FLAG_8;
+ this->unk_AE7 = 0;
+ }
+
+ if (this->unk_284.animation == &gPlayerAnim_link_uma_stop_muti) {
+ if (PlayerAnimation_OnFrame(&this->unk_284, 23.0f)) {
+ Player_PlaySfx(this, NA_SE_IT_LASH);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH);
+ }
+
+ AnimationContext_SetCopyAll(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable);
+ } else {
+ if (PlayerAnimation_OnFrame(&this->unk_284, 10.0f)) {
+ Player_PlaySfx(this, NA_SE_IT_LASH);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_LASH);
+ }
+
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->unk_284.jointTable, D_8085B9F0);
+ }
+ } else if (!CHECK_FLAG_ALL(this->actor.flags, 0x100)) {
+ PlayerAnimationHeader* anim = NULL;
+
+ if (EN_HORSE_CHECK_3(rideActor)) {
+ anim = &gPlayerAnim_link_uma_stop_muti;
+ } else if (EN_HORSE_CHECK_2(rideActor)) {
+ if ((this->unk_AE8 >= 2) && (this->unk_AE8 != 0x63)) {
+ anim = D_8085D6A4[this->unk_AE8];
+ }
+ }
+
+ if (anim != NULL) {
+ PlayerAnimation_PlayOnce(play, &this->unk_284, anim);
+ this->unk_AE7 = 1;
+ }
+ }
+ }
+
+ if (this->stateFlags1 & PLAYER_STATE1_100000) {
+ if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_A) || !func_8084FE48(this)) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ this->stateFlags1 &= ~PLAYER_STATE1_100000;
+ } else {
+ func_8084FD7C(play, this, &rideActor->actor);
+ }
+ } else if ((this->csMode != PLAYER_CSMODE_0) ||
+ (!func_8082DAFC(play) && ((rideActor->actor.speed != 0.0f) || !func_808391D8(this, play)) &&
+ !func_80847BF0(this, play) && !func_80838A90(this, play))) {
+ if (this->targetedActor != NULL) {
+ if (func_800B7128(this)) {
+ this->upperLimbRot.y = func_8083C62C(this, true) - this->actor.shape.rot.y;
+ this->upperLimbRot.y = CLAMP(this->upperLimbRot.y, -0x4AAA, 0x4AAA);
+ this->actor.focus.rot.y = this->actor.shape.rot.y + this->upperLimbRot.y;
+ this->upperLimbRot.y += 0xFA0;
+ this->unk_AA6 |= 0x80;
+ } else {
+ func_8083C62C(this, false);
+ }
+
+ this->unk_AA8 = 0;
+ } else if (func_8084FE48(this)) {
+ if (func_800B7128(this)) {
+ func_80831010(this, play);
+ }
+
+ this->unk_B86[0] = 0xC;
+ } else if (func_800B7128(this)) {
+ func_8084FD7C(play, this, &rideActor->actor);
+ }
+ }
+ }
+
+ if (this->csMode == PLAYER_CSMODE_END) {
+ this->csMode = PLAYER_CSMODE_0;
+ }
+}
+
+AnimSfxEntry D_8085D708[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 0, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 10, NA_SE_PL_GET_OFF_HORSE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 25, NA_SE_PL_SLIPDOWN, STOP),
+};
+
+void func_808505D0(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+ func_80847E2C(this, 1.0f, 10.0f);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Actor* rideActor = this->rideActor;
+
+ Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_NORMAL0);
+ func_80839E74(this, play);
+
+ this->stateFlags1 &= ~PLAYER_STATE1_800000;
+ this->actor.parent = NULL;
+ gHorseIsMounted = false;
+
+ if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) || (DREG(1) != 0)) {
+ gSaveContext.save.saveInfo.horseData.sceneId = play->sceneId;
+ gSaveContext.save.saveInfo.horseData.pos.x = rideActor->world.pos.x;
+ gSaveContext.save.saveInfo.horseData.pos.y = rideActor->world.pos.y;
+ gSaveContext.save.saveInfo.horseData.pos.z = rideActor->world.pos.z;
+ gSaveContext.save.saveInfo.horseData.yaw = rideActor->shape.rot.y;
+ }
+ } else {
+ if (this->mountSide < 0) {
+ D_8085D708[0].flags = ANIMSFX_FLAGS(ANIMSFX_TYPE_FLOOR_LAND, 40, CONTINUE);
+ } else {
+ D_8085D708[0].flags = ANIMSFX_FLAGS(ANIMSFX_TYPE_FLOOR_LAND, 29, CONTINUE);
+ }
+
+ Player_PlayAnimSfx(this, D_8085D708);
+ }
+}
+
+s32 func_80850734(PlayState* play, Player* this) {
+ if ((this->transformation == PLAYER_FORM_ZORA) && (this->windSpeed == 0.0f) &&
+ (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ func_8083B850(play, this);
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pz_waterroll, 2.0f / 3.0f, 4.0f,
+ Animation_GetLastFrame(&gPlayerAnim_pz_waterroll), ANIMMODE_ONCE, -6.0f);
+ this->unk_AE8 = 5;
+ this->unk_B86[0] = 0;
+ this->unk_B48 = this->linearVelocity;
+ this->actor.velocity.y = 0.0f;
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SWIM_DASH);
+ return true;
+ }
+ return false;
+}
+
+s32 func_80850854(PlayState* play, Player* this) {
+ if ((this->transformation == PLAYER_FORM_DEKU) && (this->remainingHopsCounter != 0) &&
+ (gSaveContext.save.saveInfo.playerData.health != 0) && (D_80862AFC != 0.0f)) {
+ func_808373F8(play, this, 0);
+ return true;
+ }
+ return false;
+}
+
+void func_808508C8(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8082E67C(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ func_808475B4(this);
+
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ }
+
+ func_8082F164(this, BTN_R);
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ this->unk_AE8 = 0;
+ }
+
+ if (!func_8082DAFC(play) && !func_80833058(play, this, D_8085D048, 1) &&
+ !func_8083B3B4(play, this, sPlayerControlInput) && ((this->unk_AE8 != 0) || !func_80850734(play, this))) {
+ sp34 = 0.0f;
+ sp32 = this->actor.shape.rot.y;
+
+ if (this->unk_AA5 > PLAYER_UNKAA5_2) {
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+ }
+
+ if (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_14][this->modelAnimType], play);
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+ } else if ((func_80850854(play, this) == 0) &&
+ (func_80832F78(this, &sp34, &sp32, 0.0f, play), (sp34 != 0.0f))) {
+ if ((ABS_ALT(BINANG_SUB(this->actor.shape.rot.y, sp32)) > 0x6000) &&
+ !Math_StepToF(&this->linearVelocity, 0.0f, 1.0f)) {
+ return;
+ }
+
+ if (func_8082FC24(this) || func_80847ED4(this)) {
+ func_80848048(play, this);
+ } else {
+ func_8083B73C(play, this, sp32);
+ }
+ }
+
+ func_8084748C(this, &this->linearVelocity, sp34, sp32);
+ func_80847F1C(this);
+ }
+}
+
+void func_80850B18(Player* this, PlayState* play) {
+ if (!func_80838A90(this, play)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_808477D0(play, this, NULL, this->linearVelocity);
+ func_808475B4(this);
+
+ if (DECR(this->unk_AE8) == 0) {
+ func_808353DC(play, this);
+ }
+ }
+}
+
+void func_80850BA8(Player* this) {
+ this->linearVelocity = Math_CosS(this->unk_AAA) * this->unk_B48;
+ this->actor.velocity.y = -Math_SinS(this->unk_AAA) * this->unk_B48;
+}
+
+void func_80850BF8(Player* this, f32 arg1) {
+ f32 temp_fv0;
+ s16 temp_ft0;
+
+ Math_AsymStepToF(&this->unk_B48, arg1, 1.0f, (fabsf(this->unk_B48) * 0.01f) + 0.4f);
+ temp_fv0 = Math_CosS(sPlayerControlInput->rel.stick_x * 0x10E);
+
+ temp_ft0 = (((sPlayerControlInput->rel.stick_x >= 0) ? 1 : -1) * (1.0f - temp_fv0) * -1100.0f);
+ temp_ft0 = CLAMP(temp_ft0, -0x1F40, 0x1F40);
+
+ this->currentYaw += temp_ft0;
+}
+
+void func_80850D20(PlayState* play, Player* this) {
+ func_8083F8A8(play, this, 12.0f, -1, 1.0f, 160, 20, true);
+}
+
+void func_80850D68(Player* this, PlayState* play) {
+ f32 sp44;
+ s16 sp42;
+ s16 sp40;
+ s16 sp3E;
+ s16 sp3C;
+ s16 sp3A;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_808475B4(this);
+ func_8082F164(this, BTN_R);
+
+ if (func_80833058(play, this, D_8085D048, false)) {
+ return;
+ }
+
+ if (func_8083B3B4(play, this, sPlayerControlInput)) {
+ return;
+ }
+
+ if (func_80840A30(play, this, &this->linearVelocity, 0.0f)) {
+ return;
+ }
+
+ sp44 = 0.0f;
+
+ if (this->unk_AE8 != 0) {
+ if ((!func_8082DA90(play) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ (this->currentBoots != PLAYER_BOOTS_ZORA_LAND)) {
+ this->unk_B86[0] = 1;
+ }
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (DECR(this->unk_AE8) == 0)) {
+ if (this->unk_B86[0] != 0) {
+ this->stateFlags3 &= ~PLAYER_STATE3_8000;
+ func_8082DB90(play, this, &gPlayerAnim_pz_swimtowait);
+ } else {
+ func_8082DB60(play, this, &gPlayerAnim_pz_fishswim);
+ }
+ } else {
+ func_80832F78(this, &sp44, &sp40, 0.0f, play);
+ Math_ScaledStepToS(&this->currentYaw, sp40, 0x640);
+
+ if (this->skelAnime.curFrame >= 13.0f) {
+ sp44 = 12.0f;
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 13.0f)) {
+ this->unk_B48 = 16.0f;
+ }
+ this->stateFlags3 |= PLAYER_STATE3_8000;
+ } else {
+ sp44 = 0.0f;
+ }
+ }
+
+ Math_SmoothStepToS(&this->unk_B86[1], sPlayerControlInput->rel.stick_x * 0xC8, 0xA, 0x3E8, 0x64);
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(40) + 1, IREG(41), IREG(42));
+ } else if (this->unk_B86[0] == 0) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if ((!func_8082DA90(play) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ (this->currentBoots != PLAYER_BOOTS_ZORA_LAND) || (this->windSpeed > 9.0f)) {
+ this->stateFlags3 &= ~PLAYER_STATE3_8000;
+ func_8082DB90(play, this, &gPlayerAnim_pz_swimtowait);
+ this->unk_B86[0] = 1;
+ } else {
+ sp44 = 9.0f;
+ func_800B8F98(&this->actor, NA_SE_PL_ZORA_SWIM_LV - SFX_FLAG);
+ }
+
+ // Y
+ sp3E = sPlayerControlInput->rel.stick_y * 0xC8;
+ if (this->unk_B8C != 0) {
+ this->unk_B8C--;
+ sp3E = CLAMP_MAX(sp3E, (s16)(this->unk_B6C - 0xFA0));
+ }
+
+ if ((this->unk_AAA >= -0x1555) && (this->actor.depthInWater < (this->ageProperties->unk_24 + 10.0f))) {
+ sp3E = CLAMP_MIN(sp3E, 0x7D0);
+ }
+ Math_SmoothStepToS(&this->unk_AAA, sp3E, 4, 0xFA0, 0x190);
+
+ // X
+ sp42 = sPlayerControlInput->rel.stick_x * 0x64;
+ if (Math_ScaledStepToS(&this->unk_B8A, sp42, 0x384) && (sp42 == 0)) {
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 4, 0x5DC, 0x64);
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(44) + 1, IREG(45), IREG(46));
+ } else {
+ sp3C = this->unk_B86[1];
+ sp3A = (this->unk_B8A < 0) ? -0x3A98 : 0x3A98;
+ this->unk_B86[1] += this->unk_B8A;
+ Math_SmoothStepToS(&this->unk_B8E, this->unk_B86[1], IREG(47) + 1, IREG(48), IREG(49));
+
+ if ((ABS_ALT(this->unk_B8A) > 0xFA0) && ((((sp3C + this->unk_B8A) - sp3A) * (sp3C - sp3A)) <= 0)) {
+ Player_PlaySfx(this, NA_SE_PL_ZORA_SWIM_ROLL);
+ }
+ }
+
+ if (D_80862B18 < 20.0f) {
+ func_80850D20(play, this);
+ }
+ } else {
+ Math_SmoothStepToS(&this->unk_B86[1], 0, 4, 0xFA0, 0x190);
+ if ((this->skelAnime.curFrame <= 5.0f) || !func_80850734(play, this)) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_808353DC(play, this);
+ }
+ }
+
+ Player_ResetCylinder(this);
+ }
+
+ if ((this->unk_B8C < 8) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ DynaPolyActor* dynaActor;
+
+ if ((this->actor.floorBgId == BGCHECK_SCENE) ||
+ ((dynaActor = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId)) == NULL) ||
+ (dynaActor->actor.id != ACTOR_EN_TWIG)) {
+ this->unk_AAA += (s16)((-this->unk_B6C - this->unk_AAA) * 2);
+ this->unk_B8C = 0xF;
+ }
+
+ func_80850D20(play, this);
+ Player_PlaySfx(this, NA_SE_PL_BODY_BOUND);
+ }
+
+ func_80850BF8(this, sp44);
+ func_80850BA8(this);
+}
+
+void func_808513EC(Player* this, PlayState* play) {
+ f32 sp34;
+ s16 sp32;
+ s16 sp30;
+ s16 var_v0;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_808475B4(this);
+ func_8082F164(this, BTN_R);
+ if (!func_80833058(play, this, D_8085D048, 1) && !func_8083B3B4(play, this, sPlayerControlInput) &&
+ !func_80850854(play, this)) {
+ func_808477D0(play, this, sPlayerControlInput, this->linearVelocity);
+ if (func_8082DA90(play)) {
+ sp34 = this->linearVelocity;
+ sp32 = this->actor.shape.rot.y;
+ } else {
+ func_80832F78(this, &sp34, &sp32, 0.0f, play);
+ }
+ sp30 = this->actor.shape.rot.y - sp32;
+ if (!func_80850734(play, this)) {
+ if (func_8082FC24(this) || func_80847ED4(this)) {
+ func_80848048(play, this);
+ } else {
+ if ((sp34 == 0.0f) || (ABS_ALT(sp30) > 0x6000) ||
+ (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER)) {
+ func_808353DC(play, this);
+ }
+ }
+ func_80847FF8(this, &this->linearVelocity, sp34, sp32);
+ }
+ }
+}
+
+void func_80851588(Player* this, PlayState* play) {
+ f32 sp2C;
+ s16 sp2A;
+
+ func_808477D0(play, this, sPlayerControlInput, this->linearVelocity);
+ func_808475B4(this);
+ func_8082F164(this, BTN_R);
+
+ if (!func_80833058(play, this, D_8085D048, 1) && !func_8083B3B4(play, this, sPlayerControlInput)) {
+ func_80832F78(this, &sp2C, &sp2A, 0.0f, play);
+
+ if (sp2C == 0.0f) {
+ func_808353DC(play, this);
+ } else if (!func_8082FC24(this) && !func_80847ED4(this)) {
+ func_8083B73C(play, this, sp2A);
+ } else {
+ func_80848094(play, this, &sp2C, &sp2A);
+ }
+
+ func_80847FF8(this, &this->linearVelocity, sp2C, sp2A);
+ }
+}
+
+void func_808516B4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ this->actor.gravity = 0.0f;
+ func_8083216C(this, play);
+ func_8082F164(this, BTN_R);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->currentBoots >= PLAYER_BOOTS_ZORA_UNDERWATER) {
+ func_808353DC(play, this);
+ } else if (this->unk_AE7 == 0) {
+ f32 temp_fv0;
+
+ if (this->unk_AE8 == 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->skelAnime.curFrame >= 22.0f) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A))) {
+ func_8083B798(play, this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 20.0f)) {
+ this->actor.velocity.y = -2.0f;
+ }
+ func_80832F24(this);
+ } else {
+ func_808477D0(play, this, sPlayerControlInput, this->actor.velocity.y);
+ this->unk_AAA = 0x3E80;
+
+ if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) && !func_8083D23C(this, play) &&
+ !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.depthInWater < 120.0f)) {
+ func_808481CC(play, this, -2.0f);
+ } else {
+ this->unk_AE7++;
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ }
+ }
+
+ temp_fv0 = (this->actor.depthInWater - this->ageProperties->unk_30) * 0.04f;
+ if (temp_fv0 < this->actor.velocity.y) {
+ this->actor.velocity.y = temp_fv0;
+ }
+ } else if (this->unk_AE7 == 1) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808475B4(this);
+ if (this->unk_AAA < 0x2710) {
+ this->unk_AE7++;
+ this->unk_AE8 = this->actor.depthInWater;
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim);
+ }
+ } else if (!func_8083B3B4(play, this, sPlayerControlInput)) {
+ f32 var_fv1 = (this->unk_AE8 * 0.018f) + 4.0f;
+
+ if (this->stateFlags1 & PLAYER_STATE1_800) {
+ sPlayerControlInput = NULL;
+ }
+
+ func_808477D0(play, this, sPlayerControlInput, fabsf(this->actor.velocity.y));
+ Math_ScaledStepToS(&this->unk_AAA, -0x2710, 0x320);
+
+ var_fv1 = CLAMP_MAX(var_fv1, 8.0f);
+ func_808481CC(play, this, var_fv1);
+ }
+}
+
+void func_808519FC(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ func_8082F164(this, BTN_R);
+ if (((this->stateFlags1 & PLAYER_STATE1_400) || (this->skelAnime.curFrame <= 1.0f) || !func_80850734(play, this)) &&
+ PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (!(this->stateFlags1 & PLAYER_STATE1_400) || func_808482E0(play, this)) {
+ func_80848250(play, this);
+ func_808353DC(play, this);
+ func_8082DC64(play, this);
+ }
+ } else {
+ if ((this->stateFlags1 & PLAYER_STATE1_400) && PlayerAnimation_OnFrame(&this->skelAnime, 10.0f)) {
+ func_8082ECE0(this);
+ func_8082DC64(play, this);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 5.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_BREATH_DRINK);
+ }
+ }
+
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+}
+
+void func_80851B58(Player* this, PlayState* play) {
+ func_808475B4(this);
+ Math_StepToF(&this->linearVelocity, 0.0f, 0.4f);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->linearVelocity < 10.0f)) {
+ func_808353DC(play, this);
+ }
+}
+
+void func_80851BD4(Player* this, PlayState* play) {
+ func_808475B4(this);
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this == GET_PLAYER(play))) {
+ func_80840770(play, this);
+ }
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+}
+
+s32 func_80851C40(PlayState* play, Player* this) {
+ return ((play->sceneId == SCENE_MILK_BAR) && Audio_IsSequencePlaying(NA_BGM_BALLAD_OF_THE_WIND_FISH)) ||
+ (((play->sceneId != SCENE_MILK_BAR) && (this->csMode == PLAYER_CSMODE_68)) ||
+ ((play->msgCtx.msgMode == 0x12) || (play->msgCtx.msgMode == 0x13) || (play->msgCtx.msgMode == 0x14) ||
+ ((play->msgCtx.ocarinaMode != 1) &&
+ ((this->csMode == PLAYER_CSMODE_5) || (play->msgCtx.ocarinaMode == 3) ||
+ play->msgCtx.ocarinaAction == 0x32))));
+}
+
+// Deku playing the pipes? The loops both overwrite unk_AF0[0].y,z and unk_AF0[1].x,y,z
+void func_80851D30(PlayState* play, Player* this) {
+ f32* var_s0 = &this->unk_AF0[0].y; // TODO: what is going on around here in the struct?
+ Vec3f sp50;
+
+ if (func_80851C40(play, this)) {
+ s32 i;
+
+ if (this->skelAnime.mode != ANIMMODE_LOOP) {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+ func_80124618(D_801C03A0, this->skelAnime.curFrame, &sp50);
+
+ for (i = 0; i < 5; i++) {
+ *var_s0 = sp50.x;
+ var_s0++;
+ }
+ } else if (play->msgCtx.ocarinaMode == 1) {
+ if (play->msgCtx.unk12048 != 0xFF) {
+ var_s0[play->msgCtx.unk12048] = 1.2f;
+ func_8082DB90(play, this, D_8085D190[this->transformation]);
+ } else {
+ s32 i;
+
+ for (i = 0; i < 5; i++) {
+ Math_StepToF(var_s0++, 1.0f, 0.04000001f);
+ }
+ }
+ }
+}
+
+void func_80851EAC(Player* this) {
+ this->unk_B86[0] = -1;
+ this->unk_B86[1] = -1;
+ this->unk_B10[0] = 0.0f;
+}
+
+struct_8085D714 D_8085D714[] = {
+ { 1, &gPlayerAnim_pg_gakkiplayA }, { 1, &gPlayerAnim_pg_gakkiplayL }, { 1, &gPlayerAnim_pg_gakkiplayD },
+ { 0, &gPlayerAnim_pg_gakkiplayU }, { 0, &gPlayerAnim_pg_gakkiplayR },
+};
+
+void func_80851EC8(PlayState* play, Player* this) {
+ struct_8085D714* temp3 = &D_8085D714[play->msgCtx.unk12048];
+ f32* temp2 = &this->unk_B10[play->msgCtx.unk12048];
+ s16* temp_a3 = &this->unk_B86[temp3->unk_0];
+
+ temp_a3[0] = play->msgCtx.unk12048;
+ temp2[0] = 3.0f;
+}
+
+void func_80851F18(PlayState* play, Player* this) {
+ struct_8085D714* temp;
+ f32* temp_v0;
+ s32 i;
+
+ i = this->unk_B86[0];
+ if (i >= 0) {
+ temp = &D_8085D714[i];
+ i = 0;
+ temp_v0 = &this->unk_B10[this->unk_B86[i]];
+
+ AnimationContext_SetLoadFrame(play, temp->unk_4, *temp_v0, this->skelAnime.limbCount,
+ this->skelAnime.morphTable);
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ this->skelAnime.morphTable, D_8085BA08);
+ }
+ i = this->unk_B86[1];
+ if (i >= 0) {
+ temp = &D_8085D714[i];
+ i = 1;
+ temp_v0 = &this->unk_B10[this->unk_B86[i]];
+
+ AnimationContext_SetLoadFrame(play, temp->unk_4, *temp_v0, this->skelAnime.limbCount,
+ ALIGN16((uintptr_t)this->blendTableBuffer));
+ AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable,
+ ALIGN16((uintptr_t)this->blendTableBuffer), D_8085BA20);
+ }
+
+ temp_v0 = this->unk_B10;
+ for (i = 0; i < 5; i++) {
+ *temp_v0 += 1.0f;
+ if (*temp_v0 >= 9.0f) {
+ *temp_v0 = 8.0f;
+ if (this->unk_B86[0] == i) {
+ this->unk_B86[0] = -1;
+ } else if (this->unk_B86[1] == i) {
+ this->unk_B86[1] = -1;
+ }
+ }
+ temp_v0++;
+ }
+}
+
+// Goron playing the drums?
+void func_808521E0(PlayState* play, Player* this) {
+ if (func_80851C40(play, this)) {
+ if (this->skelAnime.animation != &gPlayerAnim_pg_gakkiplay) {
+ func_8082DB60(play, this, &gPlayerAnim_pg_gakkiplay);
+ }
+
+ func_80124618(D_801C0490, this->skelAnime.curFrame, &this->unk_AF0[1]);
+ } else if (play->msgCtx.ocarinaMode == 1) {
+ if (play->msgCtx.unk12048 != 0xFF) {
+ func_80851EC8(play, this);
+ }
+
+ func_80851F18(play, this);
+ }
+}
+
+// Zora playing the guitar?
+void func_80852290(PlayState* play, Player* this) {
+ if (func_80851C40(play, this)) {
+ if (this->skelAnime.mode != ANIMMODE_LOOP) {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+
+ this->unk_B8A = 8;
+ } else {
+ f32 sp3C;
+ s16 var_a1_3;
+ s16 sp38;
+
+ if ((play->msgCtx.ocarinaMode == 1) && (play->msgCtx.unk12048 != 0xFF)) {
+ if ((this->unk_A90 != NULL) && (this->unk_A94 < 0.0f)) {
+ this->unk_A90->flags |= ACTOR_FLAG_20000000;
+ this->unk_A94 = 0.0f;
+ }
+
+ func_8082DB90(play, this, D_8085D190[this->transformation]);
+ this->unk_B8A = 8;
+ }
+
+ sPlayerControlInput = play->state.input;
+ func_800FF3A0(&sp3C, &sp38, sPlayerControlInput);
+
+ if (BINANG_ADD(sp38, 0x4000) < 0) {
+ sp38 -= 0x8000;
+ sp3C = -sp3C;
+ }
+
+ if (sp38 < -0x1F40) {
+ sp38 = -0x1F40;
+ } else if (sp38 > 0x2EE0) {
+ sp38 = 0x2EE0;
+ }
+
+ var_a1_3 = (sp3C * -100.0f);
+ var_a1_3 = CLAMP_MAX(var_a1_3, 0xFA0);
+ Math_SmoothStepToS(&this->upperLimbRot.x, var_a1_3, 4, 0x7D0, 0);
+ Math_SmoothStepToS(&this->upperLimbRot.y, sp38, 4, 0x7D0, 0);
+ this->headLimbRot.x = -this->upperLimbRot.x;
+ this->unk_AA6 |= 0xC8;
+
+ var_a1_3 = ABS_ALT(this->upperLimbRot.x);
+ if (var_a1_3 < 0x7D0) {
+ this->actor.shape.face = 0;
+ } else if (var_a1_3 < 0xFA0) {
+ this->actor.shape.face = 13;
+ } else {
+ this->actor.shape.face = 8;
+ }
+ }
+
+ if (DECR(this->unk_B8A) != 0) {
+ this->unk_B86[0] += (s16)(this->upperLimbRot.x * 2.5f);
+ this->unk_B86[1] += (s16)(this->upperLimbRot.y * 3.0f);
+ } else {
+ this->unk_B86[0] = 0;
+ this->unk_B86[1] = 0;
+ }
+}
+
+void func_8085255C(PlayState* play, Player* this) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ func_80851D30(play, this);
+ } else if (this->transformation == PLAYER_FORM_GORON) {
+ func_808521E0(play, this);
+ } else if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80852290(play, this);
+ }
+}
+
+void func_808525C4(PlayState* play, Player* this) {
+ if (this->unk_AE8++ >= 3) {
+ if ((this->transformation == PLAYER_FORM_ZORA) || (this->transformation == PLAYER_FORM_DEKU)) {
+ func_8082E5A8(play, this, D_8085D190[this->transformation]);
+ } else if (this->transformation == PLAYER_FORM_GORON) {
+ func_80851EAC(this);
+ func_8082DB60(play, this, &gPlayerAnim_pg_gakkiwait);
+ } else {
+ func_8082DB60(play, this, D_8085D190[this->transformation]);
+ }
+
+ this->unk_B48 = 1.0f;
+ }
+}
+
+void func_8085269C(Player* this, PlayState* play) {
+ if ((this->unk_AA5 != PLAYER_UNKAA5_4) && ((PlayerAnimation_Update(play, &this->skelAnime) &&
+ (this->skelAnime.animation == D_8085D17C[this->transformation])) ||
+ ((this->skelAnime.mode == 0) && (this->unk_AE8 == 0)))) {
+ func_808525C4(play, this);
+ if (!(this->actor.flags & ACTOR_FLAG_20000000) || (this->unk_A90->id == ACTOR_EN_ZOT)) {
+ func_80152434(play, 1);
+ }
+ } else if (this->unk_AE8 != 0) {
+ if (play->msgCtx.ocarinaMode == 4) {
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+
+ if ((this->talkActor != NULL) && (this->talkActor == this->unk_A90) && (this->unk_A94 >= 0.0f)) {
+ Player_TalkWithPlayer(play, this->talkActor);
+ } else if (this->tatlTextId < 0) {
+ this->talkActor = this->tatlActor;
+ this->tatlActor->textId = -this->tatlTextId;
+ Player_TalkWithPlayer(play, this->talkActor);
+ } else if (!func_80838A90(this, play)) {
+ func_80836A5C(this, play);
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ }
+ } else {
+ s32 var_v1 = (play->msgCtx.ocarinaMode >= 0x1C) && (play->msgCtx.ocarinaMode < 0x27);
+ s32 pad[2];
+
+ if (var_v1 || (play->msgCtx.ocarinaMode == 0x16) || (play->msgCtx.ocarinaMode == 0x1A) ||
+ (play->msgCtx.ocarinaMode == 0x18) || (play->msgCtx.ocarinaMode == 0x19)) {
+ if (play->msgCtx.ocarinaMode == 0x16) {
+ if (!func_8082DA90(play)) {
+ if (gSaveContext.save.saveInfo.playerData.threeDayResetCount == 1) {
+ play->nextEntrance = ENTRANCE(CUTSCENE, 1);
+ } else {
+ play->nextEntrance = ENTRANCE(CUTSCENE, 0);
+ }
+
+ gSaveContext.nextCutsceneIndex = 0xFFF7;
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ }
+ } else {
+ Actor* actor;
+
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+
+ actor = Actor_Spawn(&play->actorCtx, play, var_v1 ? ACTOR_EN_TEST7 : ACTOR_EN_TEST6,
+ this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0,
+ 0, play->msgCtx.ocarinaMode);
+ if (actor != NULL) {
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ this->csMode = PLAYER_CSMODE_0;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_19);
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ } else {
+ func_80836A5C(this, play);
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+ }
+ }
+ } else if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_ELEGY)) {
+ play->interfaceCtx.unk_222 = 0;
+ CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_ITEM_OCARINA]);
+
+ this->actor.flags &= ~ACTOR_FLAG_20000000;
+ func_80831760(play, this, func_80855A7C, 0);
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ } else if (this->unk_AA5 == PLAYER_UNKAA5_4) {
+ f32 temp_fa0 = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x;
+ f32 temp_fa1 = this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z;
+ f32 var_fv1;
+
+ var_fv1 = sqrtf(SQ(temp_fa0) + SQ(temp_fa1));
+ if (var_fv1 != 0.0f) {
+ var_fv1 = (var_fv1 - 100.0f) / var_fv1;
+ var_fv1 = CLAMP_MIN(var_fv1, 0.0f);
+ }
+
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = temp_fa0 * var_fv1;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = temp_fa1 * var_fv1;
+ } else {
+ func_8085255C(play, this);
+ }
+ }
+ }
+}
+
+void func_80852B28(Player* this, PlayState* play) {
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836A98(this, &gPlayerAnim_link_normal_light_bom_end, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 3.0f)) {
+ if (Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].x,
+ this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].y,
+ this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND].z, 0xFA0, this->actor.shape.rot.y, 0,
+ ARROW_TYPE_DEKU_NUT) != NULL) {
+ Inventory_ChangeAmmo(ITEM_NUT, -1);
+ this->unk_D57 = 4;
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ }
+}
+
+AnimSfxEntry D_8085D73C[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 87, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 87, NA_SE_VO_LI_CLIMB_END, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 69, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 123, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085D74C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 13, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 73, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 120, NA_SE_NONE, STOP),
+};
+
+void func_80852C04(Player* this, PlayState* play) {
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 != 0) {
+ if (this->unk_AE8 > 1) {
+ this->unk_AE8--;
+ }
+
+ if (func_808482E0(play, this) && (this->unk_AE8 == 1)) {
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+
+ if ((this->getItemDrawIdPlusOne == GID_REMAINS_ODOLWA + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_GOHT + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_GYORG + 1) ||
+ (this->getItemDrawIdPlusOne == GID_REMAINS_TWINMOLD + 1)) {
+ Player_StopCutscene(this);
+ func_80848250(play, this);
+ this->stateFlags1 &= ~PLAYER_STATE1_20000000;
+ func_8085B28C(play, NULL, PLAYER_CSMODE_93);
+ } else {
+ s32 var_a2 = ((this->talkActor != NULL) && (this->exchangeItemId <= PLAYER_IA_MINUS1)) ||
+ (this->stateFlags3 & PLAYER_STATE3_20);
+
+ if (var_a2 || (gSaveContext.healthAccumulator == 0)) {
+ Player_StopCutscene(this);
+ if (var_a2) {
+ func_80848250(play, this);
+ this->exchangeItemId = PLAYER_IA_NONE;
+ if (!func_80847994(play, this)) {
+ Player_TalkWithPlayer(play, this->talkActor);
+ }
+ } else {
+ func_80848294(play, this);
+ }
+ }
+ }
+ }
+ } else {
+ func_8082E794(this);
+
+ if ((this->getItemId == GI_STRAY_FAIRY) || (this->getItemId == GI_SKULL_TOKEN) ||
+ (this->getItemId == GI_ICE_TRAP)) {
+ Player_StopCutscene(this);
+ this->stateFlags1 &= ~(PLAYER_STATE1_400 | PLAYER_STATE1_800);
+ if (this->getItemId == GI_STRAY_FAIRY) {
+ func_80839E74(this, play);
+ } else {
+ this->actor.colChkInfo.damage = 0;
+ func_80833B18(play, this, 3, 0.0f, 0.0f, 0, 20);
+ }
+ } else {
+ if (this->skelAnime.animation == &gPlayerAnim_link_normal_box_kick) {
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getB
+ : &gPlayerAnim_link_demo_get_itemB);
+ } else {
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getA
+ : &gPlayerAnim_link_demo_get_itemA);
+ }
+
+ func_8082E920(play, this,
+ ANIM_FLAG_1 | ANIM_FLAG_UPDATE_Y | ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE |
+ ANIM_FLAG_80);
+ Player_StopCutscene(this);
+ this->csId = play->playerCsIds[PLAYER_CS_ID_ITEM_GET];
+ this->unk_AE8 = 2;
+ }
+ }
+ } else if (this->unk_AE8 == 0) {
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ Player_PlayAnimSfx(this, D_8085D73C);
+ } else if (this->transformation == PLAYER_FORM_DEKU) {
+ Player_PlayAnimSfx(this, D_8085D74C);
+ }
+ } else {
+ if ((this->skelAnime.animation == &gPlayerAnim_link_demo_get_itemB) ||
+ (this->skelAnime.animation == &gPlayerAnim_pn_getB)) {
+ Math_ScaledStepToS(&this->actor.shape.rot.y,
+ BINANG_ADD(Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamId]), 0x8000), 0xFA0);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_pn_getA) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 10.0f)) {
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+
+ if (PlayerAnimation_OnFrame(&this->skelAnime, 21.0f)) {
+ func_8082ECE0(this);
+ }
+ }
+}
+
+AnimSfxEntry D_8085D75C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 5, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 15, NA_SE_NONE, STOP),
+};
+
+void func_80852FD4(Player* this, PlayState* play) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 == 0) {
+ if (DECR(this->unk_AE8) == 0) {
+ this->unk_AE7 = 1;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ }
+ } else {
+ func_80839E74(this, play);
+ }
+ } else if ((this->transformation == PLAYER_FORM_FIERCE_DEITY) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 158.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_N);
+ } else if (this->transformation != PLAYER_FORM_FIERCE_DEITY) {
+ Player_PlayAnimSfx(this, D_8085D75C);
+ } else {
+ func_808484CC(this);
+ }
+}
+
+Vec3f D_8085D764 = { 0.0f, 24.0f, 19.0f };
+Vec3f D_8085D770 = { 0.0f, 0.0f, 2.0f };
+Vec3f D_8085D77C = { 0.0f, 0.0f, -0.2f };
+
+Color_RGBA8 D_8085D788 = { 255, 255, 255, 255 };
+Color_RGBA8 D_8085D78C = { 255, 255, 255, 255 };
+
+void func_808530E0(PlayState* play, Player* this) {
+ Vec3f pos;
+ Vec3f velocity;
+ Vec3f accel;
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D764, &pos);
+ Player_TranslateAndRotateY(this, &gZeroVec3f, &D_8085D770, &velocity);
+ Player_TranslateAndRotateY(this, &gZeroVec3f, &D_8085D77C, &accel);
+ func_800B0EB0(play, &pos, &velocity, &accel, &D_8085D788, &D_8085D78C, 40, 10, 10);
+}
+
+u8 D_8085D790[] = {
+ 1, // PLAYER_IA_BOTTLE_POTION_RED
+ 1 | 2, // PLAYER_IA_BOTTLE_POTION_BLUE
+ 2, // PLAYER_IA_BOTTLE_POTION_GREEN
+ 4, // PLAYER_IA_BOTTLE_MILK
+ 4, // PLAYER_IA_BOTTLE_MILK_HALF
+ 1 | 2, // PLAYER_IA_BOTTLE_CHATEAU
+};
+
+void func_80853194(Player* this, PlayState* play) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if (this->itemAction == PLAYER_IA_BOTTLE_POE) {
+ s32 health = Rand_S16Offset(-1, 3);
+
+ if (health == 0) {
+ health = 3;
+ }
+ if ((health < 0) && (gSaveContext.save.saveInfo.playerData.health <= 0x10)) {
+ health = 3;
+ }
+
+ if (health < 0) {
+ Health_ChangeBy(play, -0x10);
+ } else {
+ gSaveContext.healthAccumulator = health * 0x10;
+ }
+ } else {
+ s32 temp_v1 = D_8085D790[this->itemAction - PLAYER_IA_BOTTLE_POTION_RED];
+
+ if (temp_v1 & 1) {
+ gSaveContext.healthAccumulator = 0x140;
+ }
+ if (temp_v1 & 2) {
+ Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
+ }
+ if (temp_v1 & 4) {
+ gSaveContext.healthAccumulator = 0x50;
+ }
+
+ if (this->itemAction == PLAYER_IA_BOTTLE_CHATEAU) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI);
+ }
+
+ gSaveContext.jinxTimer = 0;
+ }
+
+ func_8082DB60(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_drink
+ : &gPlayerAnim_link_bottle_drink_demo_wait);
+ this->unk_AE8 = 1;
+
+ //! FAKE
+ dummy_label_235515:;
+ } else if (this->unk_AE8 < 0) {
+ this->unk_AE8++;
+ if (this->unk_AE8 == 0) {
+ this->unk_AE8 = 3;
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ } else if (this->unk_AE8 == -6) {
+ func_808530E0(play, this);
+ }
+ } else {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+ }
+ } else if (this->unk_AE8 == 1) {
+ if ((gSaveContext.healthAccumulator == 0) && (gSaveContext.magicState != MAGIC_STATE_FILL)) {
+ if (this->transformation == PLAYER_FORM_DEKU) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pn_drinkend, 2.0f / 3.0f, 0.0f, 5.0f, 2,
+ -6.0f);
+ this->unk_AE8 = -7;
+ } else {
+ func_8082E4A4(play, this, &gPlayerAnim_link_bottle_drink_demo_end);
+ this->unk_AE8 = 2;
+ }
+
+ Player_UpdateBottleHeld(play, this,
+ (this->itemAction == PLAYER_IA_BOTTLE_MILK) ? ITEM_MILK_HALF : ITEM_BOTTLE,
+ PLAYER_IA_BOTTLE_EMPTY);
+ }
+
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DRINK - SFX_FLAG);
+ } else if ((this->unk_AE8 == 2) && PlayerAnimation_OnFrame(&this->skelAnime, 29.0f)) {
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_BREATH_DRINK);
+ }
+}
+
+struct_8085D798 D_8085D798[] = {
+ { ACTOR_EN_ELF, 2, ITEM_FAIRY, PLAYER_IA_BOTTLE_FAIRY, 0x5E },
+ { ACTOR_EN_FISH, -1, ITEM_FISH, PLAYER_IA_BOTTLE_FISH, 0x62 },
+ { ACTOR_EN_INSECT, -1, ITEM_BUG, PLAYER_IA_BOTTLE_BUG, 0x63 },
+ { ACTOR_EN_MUSHI2, -1, ITEM_BUG, PLAYER_IA_BOTTLE_BUG, 0x63 },
+ { ACTOR_EN_TEST5, 0, ITEM_SPRING_WATER, PLAYER_IA_BOTTLE_SPRING_WATER, 0x67 },
+ { ACTOR_EN_TEST5, 1, ITEM_HOT_SPRING_WATER, PLAYER_IA_BOTTLE_HOT_SPRING_WATER, 0x68 },
+ { ACTOR_BG_GORON_OYU, -1, ITEM_HOT_SPRING_WATER, PLAYER_IA_BOTTLE_HOT_SPRING_WATER, 0x68 },
+ { ACTOR_EN_ZORAEGG, -1, ITEM_ZORA_EGG, PLAYER_IA_BOTTLE_ZORA_EGG, 0x69 },
+ { ACTOR_EN_DNP, -1, ITEM_DEKU_PRINCESS, PLAYER_IA_BOTTLE_DEKU_PRINCESS, 0x5F },
+ { ACTOR_EN_OT, -1, ITEM_SEAHORSE, PLAYER_IA_BOTTLE_SEAHORSE, 0x6E },
+ { ACTOR_OBJ_KINOKO, -1, ITEM_MUSHROOM, PLAYER_IA_BOTTLE_SEAHORSE, 0x6B },
+ { ACTOR_EN_POH, -1, ITEM_POE, PLAYER_IA_BOTTLE_POE, 0x65 },
+ { ACTOR_EN_BIGPO, -1, ITEM_BIG_POE, PLAYER_IA_BOTTLE_BIG_POE, 0x66 },
+ { ACTOR_EN_ELF, 6, ITEM_FAIRY, PLAYER_IA_BOTTLE_FAIRY, 0x5E },
+};
+
+void func_808534C0(Player* this, PlayState* play) {
+ struct_8085D200* sp24 = &D_8085D200[this->unk_AE8];
+
+ func_80832F24(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 != 0) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_SHOW]);
+
+ if (this->unk_AE8 == 0) {
+ Message_StartTextbox(play, D_8085D798[this->unk_AE7 - 1].textId, &this->actor);
+
+ Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
+ this->unk_AE8 = 1;
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ Actor* talkActor;
+
+ this->unk_AE7 = 0;
+ Player_StopCutscene(this);
+ func_800E0238(Play_GetCamera(play, CAM_ID_MAIN));
+
+ talkActor = this->talkActor;
+ if ((talkActor != NULL) && (this->exchangeItemId <= PLAYER_IA_MINUS1)) {
+ Player_TalkWithPlayer(play, talkActor);
+ }
+ }
+ } else {
+ func_80839E74(this, play);
+ }
+ } else {
+ if (this->unk_AE7 == 0) {
+ s32 temp_ft5 = this->skelAnime.curFrame - sp24->unk_8;
+
+ if ((temp_ft5 >= 0) && (sp24->unk_9 >= temp_ft5)) {
+ if ((this->unk_AE8 != 0) && (temp_ft5 == 0)) {
+ Player_PlaySfx(this, NA_SE_IT_SCOOP_UP_WATER);
+ }
+
+ if (func_8012364C(play, this, this->heldItemButton) == ITEM_BOTTLE) {
+ Actor* interactRangeActor = this->interactRangeActor;
+
+ if (interactRangeActor != NULL) {
+ struct_8085D798* entry = D_8085D798;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(D_8085D798); i++) {
+ if (((interactRangeActor->id == entry->actorId) &&
+ ((entry->actorParams < 0) || (interactRangeActor->params == entry->actorParams)))) {
+ break;
+ }
+ entry++;
+ }
+
+ if (i < ARRAY_COUNT(D_8085D798)) {
+ this->unk_AE7 = i + 1;
+ this->unk_AE8 = 0;
+ this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000;
+ interactRangeActor->parent = &this->actor;
+ Player_UpdateBottleHeld(play, this, entry->itemId, entry->itemAction);
+ func_8082DB90(play, this, sp24->unk_4);
+ }
+ }
+ }
+ }
+ }
+
+ if (this->skelAnime.curFrame <= 7.0f) {
+ this->stateFlags3 |= PLAYER_STATE3_800;
+ }
+ }
+}
+
+Vec3f D_8085D7EC = { 0.0f, 0.0f, 5.0f };
+
+void func_80853754(Player* this, PlayState* play) {
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_ITEM_BOTTLE]);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_StopCutscene(this);
+ func_80839E74(this, play);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 37.0f)) {
+ s32 sp2C = 8;
+
+ Player_PlaySfx(this, NA_SE_EV_BOTTLE_CAP_OPEN);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_AUTO_JUMP);
+ if (this->itemAction == PLAYER_IA_BOTTLE_FAIRY) {
+ Player_UpdateBottleHeld(play, this, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
+ Player_PlaySfx(this, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+ sp2C = 1;
+ }
+
+ Player_SpawnFairy(play, this, &this->leftHandWorld.pos, &D_8085D7EC, sp2C);
+ }
+}
+
+void func_80853850(Player* this, PlayState* play) {
+ static Vec3f D_8085D7F8 = { 10.0f, 268 * 0.1f, 30.0f };
+ static s8 D_8085D804[PLAYER_FORM_MAX] = {
+ 0x2D, // PLAYER_FORM_FIERCE_DEITY
+ 0x4B, // PLAYER_FORM_GORON
+ 0x37, // PLAYER_FORM_ZORA
+ 0x23, // PLAYER_FORM_DEKU
+ 0x28, // PLAYER_FORM_HUMAN
+ };
+ static struct_8085D80C D_8085D80C[] = {
+ { ACTOR_EN_FISH, 0 }, // PLAYER_BOTTLE_FISH
+ { ACTOR_OBJ_AQUA, 0 }, // PLAYER_BOTTLE_SPRING_WATER
+ { ACTOR_OBJ_AQUA, 1 }, // PLAYER_BOTTLE_HOT_SPRING_WATER
+ { ACTOR_EN_ZORAEGG, 0x11 }, // PLAYER_BOTTLE_ZORA_EGG
+ { ACTOR_EN_DNP, 1 }, // PLAYER_BOTTLE_DEKU_PRINCESS
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_GOLD_DUST
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_1C
+ { ACTOR_EN_OT, 0x8000 }, // PLAYER_BOTTLE_SEAHORSE
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_MUSHROOM
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_HYLIAN_LOACH
+ { ACTOR_EN_MUSHI2, 0 }, // PLAYER_BOTTLE_BUG
+ };
+ static AnimSfxEntry D_8085D838[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 38, NA_SE_VO_LI_AUTO_JUMP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 40, NA_SE_EV_BOTTLE_CAP_OPEN, STOP),
+ };
+
+ CollisionPoly* sp6C;
+ s32 sp68;
+ Vec3f sp5C;
+ f32 temp_fa0;
+ f32 temp_fv0;
+ f32 temp_fv1;
+ struct_8085D80C* sp4C;
+
+ D_8085D7F8.z = D_8085D804[this->transformation];
+ if (func_80835D58(play, this, &D_8085D7F8, &sp6C, &sp68, &sp5C)) {
+ temp_fv1 = this->actor.world.pos.x - sp5C.x;
+ temp_fa0 = this->actor.world.pos.z - sp5C.z;
+ temp_fv0 = sqrtf(SQ(temp_fv1) + SQ(temp_fa0));
+
+ if (temp_fv0 != 0.0f) {
+ temp_fv0 = 3.0f / temp_fv0;
+
+ this->actor.world.pos.x = this->actor.world.pos.x + (temp_fv1 * temp_fv0);
+ this->actor.world.pos.z = this->actor.world.pos.z + (temp_fa0 * temp_fv0);
+ }
+ }
+
+ func_80832F24(this);
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_StopCutscene(this);
+ if (!func_80838A90(this, play)) {
+ func_80839E74(this, play);
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 76.0f)) {
+ sp4C = &D_8085D80C[GET_BOTTLE_FROM_IA(this->itemAction) - 1];
+
+ Actor_Spawn(&play->actorCtx, play, sp4C->actorId,
+ (Math_SinS(this->actor.shape.rot.y) * 5.0f) + this->leftHandWorld.pos.x, this->leftHandWorld.pos.y,
+ (Math_CosS(this->actor.shape.rot.y) * 5.0f) + this->leftHandWorld.pos.z, 0x4000,
+ this->actor.shape.rot.y, 0, sp4C->params);
+ Player_UpdateBottleHeld(play, this, ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
+ } else {
+ Player_PlayAnimSfx(this, D_8085D838);
+ }
+}
+
+AnimSfxEntry D_8085D840[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_PL_PUT_OUT_ITEM, STOP),
+};
+
+void func_80853A5C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ this->stateFlags3 |= PLAYER_STATE3_4000000;
+
+ func_8083249C(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->exchangeItemId == PLAYER_IA_NONE) {
+ Actor* talkActor = this->talkActor;
+
+ Player_StopCutscene(this);
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+
+ if ((talkActor->textId != 0) && (talkActor->textId != 0xFFFF)) {
+ this->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+ Player_TalkWithPlayer(play, talkActor);
+ } else {
+ GetItemEntry* giEntry = &sGetItemTable[D_8085D1A4[this->exchangeItemId] - 1];
+
+ if (Player_BottleFromIA(this, this->itemAction) <= PLAYER_BOTTLE_NONE) {
+ this->getItemDrawIdPlusOne = ABS_ALT(giEntry->gid);
+ }
+
+ if (this->unk_AE8 == 0) {
+ if ((this->actor.textId != 0) && (this->actor.textId != 0xFFFF)) {
+ Message_StartTextbox(play, this->actor.textId, &this->actor);
+ }
+
+ this->unk_AE8 = 1;
+ } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
+ Player_StopCutscene(this);
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED;
+ func_80839E74(this, play);
+ this->unk_B5E = 0xA;
+ }
+ }
+ } else if (this->unk_AE8 >= 0) {
+ if ((Player_BottleFromIA(this, this->itemAction) > PLAYER_BOTTLE_NONE) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 36.0f)) {
+ Player_SetModels(this, PLAYER_MODELGROUP_BOTTLE);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 2.0f)) {
+ GetItemEntry* giEntry = &sGetItemTable[D_8085D1A4[this->itemAction] - 1];
+
+ func_80838830(this, giEntry->objectId);
+ }
+ Player_PlayAnimSfx(this, D_8085D840);
+ }
+
+ if ((this->unk_AE7 == 0) && (this->targetedActor != NULL)) {
+ this->currentYaw = func_8083C62C(this, 0);
+ this->actor.shape.rot.y = this->currentYaw;
+ }
+}
+
+void func_80853CC0(Player* this, PlayState* play) {
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_normal_re_dead_attack_wait);
+ }
+
+ if (play->sceneId != SCENE_SEA_BS) {
+ func_8082F164(this, BTN_R);
+ }
+
+ if (func_8082DE88(this, 0, 0x64)) {
+ func_80836988(this, play);
+ this->stateFlags2 &= ~PLAYER_STATE2_80;
+ }
+}
+
+void func_80853D68(Player* this, PlayState* play) {
+ CollisionPoly* floorPoly;
+ f32 var_fv0;
+ f32 temp_fv1;
+ f32 var_fa0;
+ s16 downwardSlopeYaw;
+ s16 var_v0;
+ Vec3f slopeNormal;
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083FBC4(play, this);
+ func_8019F780(&this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG),
+ this->actor.speed);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if ((this->transformation == PLAYER_FORM_GORON) && func_8083A114(this, play)) {
+ return;
+ }
+
+ floorPoly = this->actor.floorPoly;
+ if (floorPoly == NULL) {
+ func_80833AA0(this, play);
+ return;
+ }
+
+ Actor_GetSlopeDirection(floorPoly, &slopeNormal, &downwardSlopeYaw);
+ var_v0 = downwardSlopeYaw;
+ if (this->unk_AE7 != 0) {
+ var_v0 = downwardSlopeYaw + 0x8000;
+ }
+ if (this->linearVelocity < 0.0f) {
+ downwardSlopeYaw += 0x8000;
+ }
+
+ var_fv0 = (1.0f - slopeNormal.y) * 40.0f;
+ var_fv0 = CLAMP(var_fv0, 0.0f, 10.0f);
+
+ temp_fv1 = var_fv0 * var_fv0 * 0.015f;
+ var_fa0 = slopeNormal.y * 0.01f;
+ if (SurfaceType_GetFloorEffect(&play->colCtx, floorPoly, this->actor.floorBgId) != FLOOR_EFFECT_1) {
+ var_fv0 = 0.0f;
+ var_fa0 = slopeNormal.y * 10.0f;
+ }
+ temp_fv1 = CLAMP_MIN(temp_fv1, 1.0f);
+
+ if (Math_AsymStepToF(&this->linearVelocity, var_fv0, temp_fv1, var_fa0) && (var_fv0 == 0.0f)) {
+ func_80836A98(this,
+ (this->unk_AE7 == 0) ? D_8085BE84[PLAYER_ANIMGROUP_41][this->modelAnimType]
+ : D_8085BE84[PLAYER_ANIMGROUP_42][this->modelAnimType],
+ play);
+ }
+
+ Math_SmoothStepToS(&this->currentYaw, downwardSlopeYaw, 0xA, 0xFA0, 0x320);
+ Math_ScaledStepToS(&this->actor.shape.rot.y, var_v0, 0x7D0);
+}
+
+void func_80859CE0(PlayState* play, Player* this, s32 arg2);
+
+void func_80854010(Player* this, PlayState* play) {
+ if ((DECR(this->unk_AE8) == 0) && func_808387A0(play, this)) {
+ func_80859CE0(play, this, 0);
+ Player_SetAction(play, this, func_8085B08C, 0);
+ func_8085B08C(this, play);
+ }
+}
+
+void func_808540A0(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80854010, 0);
+ this->unk_AE8 = 0x28;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_KANKYO, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0x10);
+}
+
+void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* playerAction);
+
+void func_80854118(Player* this, PlayState* play) {
+ if (D_80862B18 < 150.0f) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->skelAnime.endFrame = this->skelAnime.animLength - 1.0f;
+ Player_AnimSfx_PlayFloorLand(this);
+ this->unk_AE8 = 1;
+ }
+ } else {
+ func_8085B384(this, play);
+ }
+ }
+
+ Math_SmoothStepToF(&this->actor.velocity.y, 2.0f, 0.3f, 8.0f, 0.5f);
+ }
+
+ if (play->csCtx.state != CS_STATE_IDLE) {
+ if (play->csCtx.playerCue != NULL) {
+ s32 pad;
+ f32 sp28 = this->actor.world.pos.y;
+
+ Player_Cutscene_SetPosAndYawToStart(this, play->csCtx.playerCue);
+ this->actor.world.pos.y = sp28;
+ }
+ }
+}
+
+void func_8085421C(Player* this, PlayState* play) {
+ if (this->skelAnime.animation == NULL) {
+ this->stateFlags2 |= PLAYER_STATE2_4000;
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->skelAnime.animation == &gPlayerAnim_link_derth_rebirth) &&
+ PlayerAnimation_OnFrame(&this->skelAnime, 60.0f)) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_BOUND);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_DAMAGE_S);
+ }
+ }
+
+ if ((this->unk_AE8++ >= 9) && !func_8082DA90(play)) {
+ if (this->unk_AE7 != 0) {
+ if (this->unk_AE7 < 0) {
+ func_80169FDC(&play->state);
+ } else {
+ func_80169EFC(&play->state);
+ }
+ if (!SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) {
+ gSaveContext.respawnFlag = -5;
+ }
+
+ play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
+ play_sound(NA_SE_OC_ABYSS);
+ } else {
+ play->transitionType = TRANS_TYPE_FADE_BLACK;
+ gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ }
+
+ play->transitionTrigger = TRANS_TRIGGER_START;
+ }
+}
+
+void func_8085437C(Player* this, PlayState* play) {
+ func_808365DC(this, play);
+}
+
+void func_8085439C(Player* this, PlayState* play) {
+ this->actor.gravity = -1.0f;
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (this->actor.velocity.y < 0.0f) {
+ func_80833AA0(this, play);
+ } else if (this->actor.velocity.y < 6.0f) {
+ Math_StepToF(&this->linearVelocity, 3.0f, 0.5f);
+ }
+}
+
+void func_80854430(Player* this, PlayState* play) {
+ if (play->unk_1887C < 0) {
+ play->unk_1887C = 0;
+ func_80839ED0(this, play);
+ } else if (this->unk_AE7 == 0) {
+ if ((play->sceneId != SCENE_20SICHITAI) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ play->unk_1887C = 10;
+ func_80847880(play, this);
+ Player_SetAction(play, this, func_80854430, 1);
+ this->unk_AE7 = 1;
+ } else {
+ play->unk_1887C = 0;
+ func_80847190(play, this, 0);
+
+ if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
+ this->stateFlags1 |= PLAYER_STATE1_100000;
+ func_8083868C(play, this);
+ } else {
+ this->stateFlags1 &= ~PLAYER_STATE1_100000;
+ if ((play->sceneId == SCENE_20SICHITAI) &&
+ (func_8012364C(play, this, func_8082FDC4()) == ITEM_PICTO_BOX)) {
+ s32 requiredScopeTemp;
+
+ play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON;
+ }
+ }
+ }
+ } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_A)) {
+ play->unk_1887C = -1;
+ func_80854614(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ this->unk_AE7 = 0;
+ } else {
+ play->unk_1887C = 10;
+ func_80854614(this, play);
+ }
+}
+
+void func_80854614(Player* this, PlayState* play) {
+ this->unk_AA5 = PLAYER_UNKAA5_3;
+ func_8083868C(play, this);
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_8083216C(this, play);
+ this->upperLimbRot.y = func_80847190(play, this, 1) - this->actor.shape.rot.y;
+ this->unk_AA6 |= 0x80;
+
+ if (play->unk_1887C < 0) {
+ play->unk_1887C++;
+ if (play->unk_1887C == 0) {
+ func_80839ED0(this, play);
+ }
+ }
+}
+
+void func_808546D0(Player* this, PlayState* play) {
+ if (this->unk_AE7 >= 0) {
+ if (this->unk_AE7 < 6) {
+ this->unk_AE7++;
+ } else {
+ this->unk_B48 = (this->unk_AE7 >> 1) * 22.0f;
+ if (func_8082DE88(this, 1, 0x64)) {
+ this->unk_AE7 = -1;
+ EffectSsIcePiece_SpawnBurst(play, &this->actor.world.pos, this->actor.scale.x);
+ Player_PlaySfx(this, NA_SE_PL_ICE_BROKEN);
+ }
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ func_80834104(play, this);
+ this->skelAnime.animation = NULL;
+ this->unk_AE8 = -0x28;
+ this->unk_AE7 = 1;
+ this->linearVelocity = 0.0f;
+ } else if (play->gameplayFrames % 4 == 0) {
+ Player_InflictDamage(play, -1);
+ }
+ }
+
+ this->stateFlags2 |= PLAYER_STATE2_4000;
+ } else if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80836988(this, play);
+ func_808339B4(this, 20);
+ }
+}
+
+void func_80854800(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_808345A8(this);
+
+ if (((this->unk_AE8 % 25) != 0) || (func_808339D4(play, this, -1) != 0)) {
+ if (DECR(this->unk_AE8) == 0) {
+ func_80836988(this, play);
+ }
+ }
+
+ this->shockTimer = 40;
+ func_800B8F98(&this->actor, this->ageProperties->voiceSfxIdOffset + (NA_SE_VO_LI_TAKEN_AWAY - SFX_FLAG));
+}
+
+void func_808548B8(Player* this, PlayState* play) {
+ AttackAnimInfo* attackInfoEntry = &sMeleeAttackAnimInfo[this->meleeWeaponAnimation];
+
+ if (this->skelAnime.curFrame < (this->skelAnime.endFrame - 6.0f)) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ }
+
+ if (func_808401F4(play, this)) {
+ return;
+ }
+
+ if (this->linearVelocity >= 0.0f) {
+ func_8083FCF0(play, this, (this->transformation == PLAYER_FORM_GORON) ? 5.0f : 0.0f, attackInfoEntry->unk_C,
+ attackInfoEntry->unk_D);
+ }
+
+ if ((this->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_LEFT) ||
+ (this->meleeWeaponAnimation == PLAYER_MWA_GORON_PUNCH_RIGHT)) {
+ this->unk_3D0.unk_00 = 3;
+ }
+
+ //! @bug Lunge Storage: If this block is prevented from running at the end of an animation that produces a lunge,
+ //! the prepared lunge will be retained until next time execution passes through here, which usually means the next
+ //! sword slash.
+ if ((this->stateFlags2 & PLAYER_STATE2_40000000) && PlayerAnimation_OnFrame(&this->skelAnime, 0.0f)) {
+ this->linearVelocity = 15.0f;
+ this->stateFlags2 &= ~PLAYER_STATE2_40000000;
+ }
+
+ if (this->linearVelocity > 12.0f) {
+ func_8083FBC4(play, this);
+ }
+
+ Math_StepToF(&this->linearVelocity, 0.0f, 5.0f);
+ func_8083A548(this);
+
+ if (PlayerAnimation_Update(play, &this->skelAnime) ||
+ ((this->meleeWeaponAnimation >= PLAYER_MWA_FLIPSLASH_FINISH) &&
+ (this->meleeWeaponAnimation <= PLAYER_MWA_ZORA_JUMPKICK_FINISH) && (this->skelAnime.curFrame > 2.0f) &&
+ func_808333CC(this))) {
+ D_80862B48 = this->unk_AE8;
+
+ if (!func_80848570(this, play)) {
+ PlayerAnimationHeader* anim = func_80123420(this) ? attackInfoEntry->unk_8 : attackInfoEntry->unk_4;
+
+ func_8082DC38(this);
+
+ if (anim == NULL) {
+ this->skelAnime.moveFlags &= ~8;
+ func_8085B384(this, play);
+ } else {
+ u8 moveFlags = this->skelAnime.moveFlags;
+
+ if (this->transformation == PLAYER_FORM_ZORA) {
+ if (func_8083A580(this, play)) {
+ anim = this->unk_284.animation;
+ }
+ this->unk_ADC = 0;
+ } else if ((anim == &gPlayerAnim_link_fighter_Lpower_jump_kiru_end) &&
+ (this->modelAnimType != PLAYER_ANIMTYPE_3)) {
+ anim = &gPlayerAnim_link_fighter_power_jump_kiru_end;
+ }
+
+ this->skelAnime.moveFlags = 0;
+ Player_SetAction(play, this, func_80849FE0, 1);
+ func_8082EC9C(play, this, anim);
+ this->currentYaw = this->actor.shape.rot.y;
+ this->skelAnime.moveFlags = moveFlags;
+ }
+ this->stateFlags3 |= PLAYER_STATE3_8;
+ }
+ } else if (((this->transformation == PLAYER_FORM_ZORA) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_ZORA_PUNCH_KICK) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_ZORA_JUMPKICK_FINISH)) ||
+ ((this->transformation == PLAYER_FORM_GORON) &&
+ (this->meleeWeaponAnimation != PLAYER_MWA_GORON_PUNCH_BUTT))) {
+ this->unk_AE8 |= CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B) ? 1 : 0;
+ }
+}
+
+void func_80854C70(Player* this, PlayState* play) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ func_80832F24(this);
+
+ if (this->skelAnime.curFrame >= 6.0f) {
+ func_80836988(this, play);
+ }
+}
+
+// Array colour interpolation
+// arg0 is the interpolation parameter
+// arg1,5,9 are out colours
+// arg2,6,0xA are first values
+// arg3,7,0xB are second values
+// arg4,8,0xC are subtracted after interpolation
+void func_80854CD0(f32 arg0, s16* arg1, u8* arg2, u8* arg3, u8* arg4, s16* arg5, u8* arg6, u8* arg7, u8* arg8,
+ s16* arg9, u8* argA, u8* argB, u8* argC) {
+ s32 i;
+
+ for (i = 0; i < 3; i++) {
+ *arg1 = ((s32)((*arg2 - *arg3) * arg0) + *arg3) - *arg4;
+ *arg5 = ((s32)((*arg6 - *arg7) * arg0) + *arg7) - *arg8;
+ *arg9 = ((s32)((*argA - *argB) * arg0) + *argB) - *argC;
+
+ arg1++;
+ arg2++;
+ arg3++;
+ arg4++;
+ arg5++;
+ arg6++;
+ arg7++;
+ arg8++;
+ arg9++;
+ argA++;
+ argB++;
+ argC++;
+ }
+}
+
+// Black, probably in-function static
+u8 D_8085D844[] = { 0, 0, 0 };
+
+// arg1 is the colour interpolation parameter
+void func_80854EFC(PlayState* play, f32 arg1, struct_8085D848_unk_00* arg2) {
+ struct_8085D848_unk_00 sp70;
+ struct_8085D848_unk_00* var_t0;
+ struct_8085D848_unk_00* var_v1;
+ u8* var_t3;
+ u8* var_t4;
+ u8* new_var;
+ s32 pad[4];
+
+ new_var = play->envCtx.unk_C4.diffuseColor1;
+ sp70.fogNear = play->envCtx.unk_C4.fogNear;
+ sp70.fogColor[0] = play->envCtx.unk_C4.fogColor[0];
+ sp70.fogColor[1] = play->envCtx.unk_C4.fogColor[1];
+ sp70.fogColor[2] = play->envCtx.unk_C4.fogColor[2];
+ sp70.ambientColor[0] = play->envCtx.unk_C4.ambientColor[0];
+ sp70.ambientColor[1] = play->envCtx.unk_C4.ambientColor[1];
+ sp70.ambientColor[2] = play->envCtx.unk_C4.ambientColor[2];
+
+ if (arg1 <= 1.0f) {
+ arg1 -= 0.0f;
+
+ var_v1 = &arg2[0];
+ var_t0 = &sp70;
+ var_t3 = D_8085D844;
+ var_t4 = new_var;
+ } else if (arg1 <= 2.0f) {
+ arg1 -= 1.0f;
+ var_v1 = &arg2[1];
+ var_t0 = &arg2[0];
+ var_t3 = D_8085D844;
+ var_t4 = D_8085D844;
+
+ } else if (arg1 <= 3.0f) {
+ arg1 -= 2.0f;
+ var_v1 = &arg2[2];
+ var_t0 = &arg2[1];
+ var_t3 = D_8085D844;
+ var_t4 = D_8085D844;
+
+ } else {
+ arg1 -= 3.0f;
+ var_v1 = &sp70;
+ var_t0 = &arg2[2];
+ var_t3 = new_var;
+ var_t4 = D_8085D844;
+ }
+
+ play->envCtx.lightSettings.fogNear =
+ ((s16)((var_v1->fogNear - var_t0->fogNear) * arg1) + var_t0->fogNear) - play->envCtx.unk_C4.fogNear;
+
+ func_80854CD0(arg1, play->envCtx.lightSettings.fogColor, var_v1->fogColor, var_t0->fogColor,
+ play->envCtx.unk_C4.fogColor, play->envCtx.lightSettings.ambientColor, var_v1->ambientColor,
+ var_t0->ambientColor, play->envCtx.unk_C4.ambientColor, play->envCtx.lightSettings.diffuseColor1,
+ var_t3, var_t4, new_var);
+}
+
+struct_8085D848 D_8085D848[] = {
+ {
+ {
+ { 650, { 0, 0, 0 }, { 10, 0, 30 } },
+ { 300, { 200, 200, 255 }, { 0, 0, 0 } },
+ { 600, { 0, 0, 0 }, { 0, 0, 200 } },
+ },
+ {
+ { { -40.0f, 20.0f, -10.0f }, { 120, 200, 255 }, 1000 },
+ { { 0.0f, -10.0f, 0.0f }, { 255, 255, 255 }, 5000 },
+ { { -10.0f, 4.0f, 3.0f }, { 200, 200, 255 }, 5000 },
+ },
+ },
+ {
+ {
+ { 650, { 0, 0, 0 }, { 10, 0, 30 } },
+ { 300, { 200, 200, 255 }, { 0, 0, 0 } },
+ { 600, { 0, 0, 0 }, { 0, 0, 200 } },
+ },
+ {
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ { { 0.0f, 0.0f, 5.0f }, { 155, 255, 255 }, 100 },
+ },
+ },
+};
+
+// arg2 is the colour interpolation parameter
+// arg3 both selects the light to use and scales the radius
+// arg4 selects the env fog/colour info
+void func_808550D0(PlayState* play, Player* this, f32 arg2, f32 arg3, s32 arg4) {
+ struct_8085D848* temp_a2 = &D_8085D848[arg4];
+ struct_8085D848_unk_18* lightInit = temp_a2->light;
+ Vec3f pos;
+
+ func_80854EFC(play, arg2, temp_a2->unk_00);
+
+ if (arg3 > 2.0f) {
+ arg3 -= 2.0f;
+ lightInit += 2;
+ } else if (arg3 > 1.0f) {
+ arg3 -= 1.0f;
+ lightInit++;
+ }
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &lightInit->pos, &pos);
+ Lights_PointNoGlowSetInfo(&this->lightInfo, pos.x, pos.y, pos.z, lightInit->color[0], lightInit->color[1],
+ lightInit->color[2], lightInit->radius * arg3);
+}
+
+AnimSfxEntry D_8085D8F0[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 2, NA_SE_PL_PUT_OUT_ITEM, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_IT_SET_TRANSFORM_MASK, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 11, NA_SE_PL_FREEZE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 30, NA_SE_PL_TRANSFORM_VOICE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 20, NA_SE_IT_TRANSFORM_MASK_BROKEN, STOP),
+};
+
+AnimSfxEntry D_8085D904[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 8, NA_SE_IT_SET_TRANSFORM_MASK, STOP),
+};
+
+void func_80855218(PlayState* play, Player* this, struct_8085D910** arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->skelAnime.animation == &gPlayerAnim_cl_setmask)) {
+ func_8082DB60(play, this, &gPlayerAnim_cl_setmaskend);
+ } else if ((this->skelAnime.animation == &gPlayerAnim_cl_setmask) ||
+ (this->skelAnime.animation == &gPlayerAnim_cl_setmaskend)) {
+ if (this->unk_AE7 >= 58) {
+ Math_StepToS(&this->unk_AE8, 255, 50);
+ }
+
+ if (this->unk_AE7 >= 64) {
+ Math_StepToF(&this->unk_B10[2], 0.0f, 0.015f);
+ } else if (this->unk_AE7 >= 0xE) {
+ Math_StepToF(&this->unk_B10[2], 0.3f, 0.3f);
+ }
+
+ if (this->unk_AE7 > 65) {
+ Math_StepToF(&this->unk_B10[3], 0.0f, 0.02f);
+ } else if (this->unk_AE7 >= 0x10) {
+ Math_StepToF(&this->unk_B10[3], -0.1f, 0.1f);
+ }
+
+ if ((R_PLAY_FILL_SCREEN_ON == 0) && (this->skelAnime.animation == &gPlayerAnim_cl_setmask)) {
+ Player_PlayAnimSfx(this, D_8085D8F0);
+ }
+ } else {
+ if (this->unk_AE7 >= 20) {
+ Math_StepToS(&this->unk_AE8, 255, 20);
+ }
+
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ Player_PlayAnimSfx(this, D_8085D904);
+ if (this->unk_AE7 == 15) {
+ Player_PlaySfx(this, NA_SE_PL_FACE_CHANGE);
+ }
+ }
+ }
+}
+
+u16 D_8085D908[] = {
+ WEEKEVENTREG_30_80, // PLAYER_FORM_FIERCE_DEITY
+ WEEKEVENTREG_30_20, // PLAYER_FORM_GORON
+ WEEKEVENTREG_30_40, // PLAYER_FORM_ZORA
+ WEEKEVENTREG_30_10, // PLAYER_FORM_DEKU
+};
+struct_8085D910 D_8085D910[] = {
+ { 0x10, 0xA, 0x3B, 0x3F },
+ { 9, 0x32, 0xA, 0xD },
+};
+
+void func_808553F4(Player* this, PlayState* play) {
+ struct_8085D910* sp4C = D_8085D910;
+ s32 sp48 = false;
+
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION]);
+ sPlayerControlInput = play->state.input;
+
+ Camera_ChangeMode(play->cameraPtrs[play->activeCamId],
+ (this->transformation == PLAYER_FORM_HUMAN) ? CAM_MODE_NORMAL : CAM_MODE_JUMP);
+ this->stateFlags2 |= PLAYER_STATE2_40;
+ this->actor.shape.rot.y = Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamId]) + 0x8000;
+
+ func_80855218(play, this, &sp4C);
+
+ if (this->unk_AE7 == 0x14) {
+ Play_EnableMotionBlurPriority(100);
+ }
+
+ if (R_PLAY_FILL_SCREEN_ON != 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ Play_DisableMotionBlurPriority();
+ SET_WEEKEVENTREG(D_8085D908[gSaveContext.save.playerForm]);
+ }
+ } else if ((this->unk_AE7++ > ((this->transformation == PLAYER_FORM_HUMAN) ? 0x53 : 0x37)) ||
+ ((this->unk_AE7 >= 5) &&
+ (sp48 = ((this->transformation != PLAYER_FORM_HUMAN) ||
+ CHECK_WEEKEVENTREG(D_8085D908[gSaveContext.save.playerForm])) &&
+ CHECK_BTN_ANY(sPlayerControlInput->press.button,
+ BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A)))) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 220;
+ R_PLAY_FILL_SCREEN_G = 220;
+ R_PLAY_FILL_SCREEN_B = 220;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+
+ if (sp48) {
+ if (CutsceneManager_GetCurrentCsId() == this->csId) {
+ func_800E0348(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(this->csId)));
+ }
+
+ if (this->transformation == PLAYER_FORM_HUMAN) {
+ AudioSfx_StopById(NA_SE_PL_TRANSFORM_VOICE);
+ AudioSfx_StopById(NA_SE_IT_TRANSFORM_MASK_BROKEN);
+ } else {
+ AudioSfx_StopById(NA_SE_PL_FACE_CHANGE);
+ }
+ }
+
+ Player_PlaySfx(this, NA_SE_SY_TRANSFORM_MASK_FLASH);
+ }
+
+ if (this->unk_AE7 >= sp4C->unk_0) {
+ if (this->unk_AE7 < sp4C->unk_2) {
+ Math_StepToF(&this->unk_B10[4], 1.0f, sp4C->unk_1 / 100.0f);
+ } else if (this->unk_AE7 < sp4C->unk_3) {
+ if (this->unk_AE7 == sp4C->unk_2) {
+ func_801000CC(NA_SE_EV_LIGHTNING_HARD);
+ }
+
+ Math_StepToF(&this->unk_B10[4], 2.0f, 0.5f);
+ } else {
+ Math_StepToF(&this->unk_B10[4], 3.0f, 0.2f);
+ }
+ }
+
+ if (this->unk_AE7 >= 0x10) {
+ if (this->unk_AE7 < 0x40) {
+ Math_StepToF(&this->unk_B10[5], 1.0f, 0.2f);
+ } else if (this->unk_AE7 < 0x37) {
+ Math_StepToF(&this->unk_B10[5], 2.0f, 1.0f);
+ } else {
+ Math_StepToF(&this->unk_B10[5], 3.0f, 0.55f);
+ }
+ }
+
+ func_808550D0(play, this, this->unk_B10[4], this->unk_B10[5], (this->transformation == PLAYER_FORM_HUMAN) ? 0 : 1);
+}
+
+void func_80855818(Player* this, PlayState* play) {
+ Camera_ChangeMode(play->cameraPtrs[play->activeCamId],
+ (this->prevMask == PLAYER_MASK_NONE) ? CAM_MODE_NORMAL : CAM_MODE_JUMP);
+
+ if (R_PLAY_FILL_SCREEN_ON != 0) {
+ R_PLAY_FILL_SCREEN_ALPHA -= R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ }
+
+ if (this->unk_AE7++ < 4) {
+ if ((this->prevMask == PLAYER_MASK_NONE) && (this->unk_AE7 == 4)) {
+ PlayerAnimation_Change(play, &this->skelAnime, func_8082ED20(this), 1.0f, 0.0f, 20.0f, ANIMMODE_ONCE,
+ 20.0f);
+ }
+ } else {
+ s32 pad;
+ f32 dist;
+ s16 angle;
+
+ func_800FF3A0(&dist, &angle, play->state.input);
+ if (PlayerAnimation_Update(play, &this->skelAnime) || ((this->unk_AE7 > 10) && (dist != 0.0f))) {
+ if (R_PLAY_FILL_SCREEN_ON == 0) {
+ this->stateFlags1 &= ~PLAYER_STATE1_2;
+ this->prevMask = this->currentMask;
+ this->csId = play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION];
+ Player_StopCutscene(this);
+ play->envCtx.lightSettings = D_80862B50;
+ func_8085B384(this, play);
+ return;
+ }
+ }
+
+ Math_StepToF(&this->unk_B10[5], 4.0f, 0.2f);
+ }
+
+ func_808550D0(play, this, 0, this->unk_B10[5], (this->prevMask == PLAYER_MASK_NONE) ? 0 : 1);
+}
+
+void func_80855A7C(Player* this, PlayState* play) {
+ if (this->unk_AE8++ > 90) {
+ play->msgCtx.ocarinaMode = 4;
+ func_8085B384(this, play);
+ } else if (this->unk_AE8 == 10) {
+ func_80848640(play, this);
+ }
+}
+
+// Giant's Mask
+void func_80855AF4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ func_80855218(play, this, NULL);
+ this->unk_AE7++;
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_100)) {
+ this->prevMask = this->currentMask;
+ gSaveContext.save.equippedMask = this->currentMask = PLAYER_MASK_GIANT;
+ Magic_Consume(play, 0, MAGIC_CONSUME_GIANTS_MASK);
+ this->currentBoots = PLAYER_BOOTS_GIANT;
+ this->prevBoots = PLAYER_BOOTS_GIANT;
+ func_80123140(play, this);
+ func_8085B384(this, play);
+ }
+}
+
+void func_80855B9C(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_40;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (!(this->stateFlags1 & PLAYER_STATE1_100)) {
+ this->prevMask = this->currentMask;
+
+ gSaveContext.save.equippedMask = this->currentMask = PLAYER_MASK_NONE;
+
+ this->currentBoots = PLAYER_BOOTS_HYLIAN;
+ this->prevBoots = PLAYER_BOOTS_HYLIAN;
+ func_80123140(play, this);
+ func_8085B384(this, play);
+ }
+}
+
+void func_80855C28(Player* this, PlayState* play) {
+ s16 sp3E;
+ s32 pad;
+ PlayerAnimationHeader* sp34;
+ s32 var_a0;
+
+ func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]);
+ sp3E = BINANG_SUB(this->actor.shape.rot.y, this->actor.world.rot.y);
+
+ var_a0 = 0;
+ if ((this->actor.floorHeight - this->actor.world.pos.y) < 60.0f) {
+ Math_StepToF(&this->unk_B10[5], 200.0f, 150.0f);
+ var_a0 = Math_StepToS(&this->unk_AE8, 0xFA0, 0x15E);
+ }
+
+ this->actor.shape.rot.y += this->unk_AE8;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].x = 0;
+ this->skelAnime.jointTable[PLAYER_LIMB_ROOT - 1].z = 0;
+ this->unk_ABC += this->unk_B10[5];
+
+ if (this->unk_ABC >= 0.0f) {
+ this->unk_ABC = 0.0f;
+ if ((var_a0 != 0) && (sp3E < 0)) {
+ if (BINANG_SUB(this->actor.shape.rot.y, this->actor.world.rot.y) >= 0) {
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ Player_StopCutscene(this);
+ if (PLAYER_GET_INITMODE(&this->actor) == PLAYER_INITMODE_8) {
+ sp34 = D_8085D17C[this->transformation];
+ func_80836A5C(this, play);
+ PlayerAnimation_Change(play, &this->skelAnime, sp34, -2.0f / 3.0f, Animation_GetLastFrame(sp34),
+ 0.0f, ANIMMODE_ONCE, -6.0f);
+ } else {
+ func_80839E74(this, play);
+ }
+ }
+ }
+ } else if (this->unk_AE7 == 0) {
+ Player_PlaySfx(this, NA_SE_PL_WARP_PLATE_OUT);
+ this->unk_AE7 = 1;
+ }
+}
+
+void func_80855E08(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20;
+
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_hook_fly_wait);
+ }
+
+ Math_Vec3f_Sum(&this->actor.world.pos, &this->actor.velocity, &this->actor.world.pos);
+ if (func_80831124(play, this)) {
+ f32 var_fv0;
+
+ Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
+ func_80843178(play, this);
+
+ var_fv0 = this->actor.world.pos.y - this->actor.floorHeight;
+ var_fv0 = CLAMP_MAX(var_fv0, 20.0f);
+
+ this->actor.world.pos.y = this->actor.world.pos.y - var_fv0;
+ this->actor.shape.rot.x = 0;
+ this->linearVelocity = 1.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.world.rot.x = this->actor.shape.rot.x;
+ func_80833AA0(this, play);
+ this->stateFlags2 &= ~PLAYER_STATE2_400;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
+ this->stateFlags3 |= PLAYER_STATE3_10000;
+ } else if ((this->skelAnime.animation != &gPlayerAnim_link_hook_fly_start) || (this->skelAnime.curFrame >= 4.0f)) {
+ this->actor.gravity = 0.0f;
+ Math_ScaledStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x, 0x800);
+ Player_RequestRumble(play, this, 100, 2, 100, SQ(0));
+ }
+}
+
+void func_80855F9C(PlayState* play, Player* this) {
+ f32 sp24;
+ s16 sp22;
+
+ this->stateFlags2 |= PLAYER_STATE2_20;
+ func_80832F78(this, &sp24, &sp22, 0.018f, play);
+ Math_ScaledStepToS(&this->currentYaw, sp22, 0x258);
+}
+
+s32 func_80856000(PlayState* play, Player* this) {
+ CollisionPoly* poly;
+ s32 bgId;
+ Vec3f pos;
+ f32 sp28;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y - 20.0f;
+ pos.z = this->actor.world.pos.z;
+ return BgCheck_EntityCheckCeiling(&play->colCtx, &sp28, &pos, 30.0f, &poly, &bgId, &this->actor);
+}
+
+void func_80856074(PlayState* play, Player* this) {
+ if (func_8083F8A8(play, this, 12.0f, 4, 0.0f, 10, 50, true)) {
+ EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 4, 8, 2, -1, 10, NULL);
+ }
+}
+
+void func_80856110(PlayState* play, Player* this, f32 arg2, f32 arg3, f32 arg4, s16 scale, s16 scaleStep, s16 life) {
+ static Vec3f D_8085D918 = { 0.0f, 0.5f, 0.0f }; // velocity
+ static Vec3f D_8085D924 = { 0.0f, 0.5f, 0.0f }; // accel
+ static Color_RGBA8 D_8085D930 = { 255, 255, 55, 255 }; // primColor
+ static Color_RGBA8 D_8085D934 = { 100, 50, 0, 0 }; // envColor
+ Vec3f pos;
+
+ pos.x = this->actor.world.pos.x;
+ pos.y = this->actor.world.pos.y + arg2;
+ pos.z = this->actor.world.pos.z;
+
+ D_8085D918.y = arg3;
+ D_8085D924.y = arg4;
+
+ func_800B0EB0(play, &pos, &D_8085D918, &D_8085D924, &D_8085D930, &D_8085D934, scale, scaleStep, life);
+}
+
+// Deku Flower related
+void func_808561B0(Player* this, PlayState* play) {
+ DynaPolyActor* dyna;
+ s32 aux = 0xAE;
+ f32 temp_fv0_2;
+ s32 sp38;
+ s32 var_v1;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->unk_AE7 == 0) {
+ this->unk_ABC += this->unk_B48;
+ if (this->unk_ABC < -1000.0f) {
+ this->unk_ABC = -1000.0f;
+ this->unk_AE7 = 1;
+ this->unk_B48 = 0.0f;
+ }
+ func_80856074(play, this);
+ } else if (this->unk_AE7 == 1) {
+ this->unk_B48 += -22.0f;
+ if (this->unk_B48 < -170.0f) {
+ this->unk_B48 = -170.0f;
+ }
+ this->unk_ABC += this->unk_B48;
+ if (this->unk_ABC < -3900.0f) {
+ this->unk_ABC = -3900.0f;
+ this->unk_AE7 = 2;
+ this->actor.shape.rot.y = Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamId]);
+ this->actor.scale.y = 0.01f;
+ this->currentYaw = this->actor.world.rot.y = this->actor.shape.rot.y;
+ } else {
+ temp_fv0_2 = Math_SinS((1000.0f + this->unk_ABC) * (-30.0f)) * 0.004f;
+ this->actor.scale.y = 0.01f + temp_fv0_2;
+ this->actor.scale.z = this->actor.scale.x = 0.01f - (this->unk_B48 * -0.000015f);
+
+ this->actor.shape.rot.y += (s16)(this->unk_B48 * 130.0f);
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId);
+
+ if (dyna != NULL) {
+ Math_Vec3f_StepToXZ(&this->actor.world.pos, &dyna->actor.world.pos, 1.0f);
+ }
+ }
+ }
+
+ func_80856074(play, this);
+ } else if (this->unk_AE7 == 2) {
+ if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) {
+ if (func_80856000(play, this)) {
+ this->unk_AE8 = 0;
+ } else {
+ this->unk_AE7 = 3;
+ if (this->unk_AE8 >= 10) {
+ this->unk_B48 = 2700.0f;
+ } else {
+ this->unk_B48 = 1450.0f;
+ }
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_OUT_GRD);
+ }
+ } else if (this->unk_AE8 < 15) {
+ this->unk_AE8++;
+ if (this->unk_AE8 == 10) {
+ func_80856110(play, this, 20.0f, 3.8f, -0.1f, 140, 23, 15);
+ }
+ }
+ func_80855F9C(play, this);
+ } else {
+ this->unk_ABC += this->unk_B48;
+
+ temp_fv0_2 = this->unk_ABC;
+ if (temp_fv0_2 >= 0.0f) {
+ f32 speed;
+
+ sp38 = (this->unk_AE8 >= 10);
+ var_v1 = -1;
+ speed = this->unk_B48 * this->actor.scale.y;
+ if (this->actor.floorBgId != BGCHECK_SCENE) {
+ dyna = DynaPoly_GetActor(&play->colCtx, this->actor.floorBgId);
+ var_v1 = 0;
+ if ((dyna != NULL) && (dyna->actor.id == ACTOR_OBJ_ETCETERA) && (dyna->actor.params & 0x100)) {
+ var_v1 = 1;
+ speed *= aux / 100.0f;
+ }
+ }
+
+ Math_Vec3f_Copy(this->unk_AF0, &this->actor.world.pos);
+ this->unk_ABC = 0.0f;
+ this->actor.world.pos.y += temp_fv0_2 * this->actor.scale.y;
+ func_80834DB8(this, &gPlayerAnim_pn_kakku, speed, play);
+ Player_SetAction(play, this, func_80856918, 1);
+ this->boomerangActor = NULL;
+
+ this->stateFlags3 |= PLAYER_STATE3_200;
+ if (sp38 != 0) {
+ this->stateFlags3 |= PLAYER_STATE3_2000;
+ }
+ if (var_v1 < 0) {
+ this->stateFlags3 |= PLAYER_STATE3_40000;
+ }
+
+ this->unk_AE7 = var_v1;
+ this->unk_AE8 = 9999;
+ Player_SetCylinderForAttack(this, DMG_DEKU_LAUNCH, 2, 20);
+ } else if (this->unk_ABC < 0.0f) {
+ func_80856074(play, this);
+ }
+ }
+
+ if (this->unk_ABC < -1500.0f) {
+ this->stateFlags3 |= PLAYER_STATE3_100;
+ if (this->unk_B86[0] < 8) {
+ this->unk_B86[0]++;
+ if (this->unk_B86[0] == 8) {
+ func_8082E1F0(this, NA_SE_PL_DEKUNUTS_BUD);
+ }
+ }
+ }
+}
+
+void func_808566C0(PlayState* play, Player* this, PlayerBodyPart bodyPartIndex, f32 arg3, f32 arg4, f32 arg5,
+ s32 life) {
+ Color_RGBA8 primColor = { 255, 200, 200, 0 };
+ Color_RGBA8 envColor = { 255, 255, 0, 0 };
+ static Vec3f D_8085D940 = { 0.0f, 0.3f, 0.0f };
+ static Vec3f D_8085D94C = { 0.0f, -0.025f, 0.0f };
+ Vec3f pos;
+ s32 scale;
+ f32 sp34;
+ Vec3f* temp_v0;
+
+ if (Rand_ZeroOne() < 0.5f) {
+ sp34 = -1.0f;
+ } else {
+ sp34 = 1.0f;
+ }
+
+ D_8085D940.x = (Rand_ZeroFloat(arg4) + arg3) * sp34;
+ D_8085D94C.x = arg5 * sp34;
+ if (Rand_ZeroOne() < 0.5f) {
+ sp34 = -1.0f;
+ } else {
+ sp34 = 1.0f;
+ }
+
+ temp_v0 = &this->bodyPartsPos[bodyPartIndex];
+ D_8085D940.z = (Rand_ZeroFloat(arg4) + arg3) * sp34;
+ D_8085D94C.z = arg5 * sp34;
+ pos.x = temp_v0->x;
+ pos.y = Rand_ZeroFloat(15.0f) + temp_v0->y;
+ pos.z = temp_v0->z;
+ if (Rand_ZeroOne() < 0.5f) {
+ scale = 2000;
+ } else {
+ scale = -150;
+ }
+
+ EffectSsKirakira_SpawnDispersed(play, &pos, &D_8085D940, &D_8085D94C, &primColor, &envColor, scale, life);
+}
+
+void func_8085687C(Player* this) {
+}
+
+s32 func_80856888(f32* arg0, f32 arg1, f32 arg2) {
+ if (arg2 != 0.0f) {
+ if (arg1 < *arg0) {
+ arg2 = -arg2;
+ }
+
+ *arg0 += arg2;
+ if (((*arg0 - arg1) * arg2) >= 0.0f) {
+ *arg0 = arg1;
+ return true;
+ }
+ } else if (arg1 == *arg0) {
+ return true;
+ }
+
+ return false;
+}
+
+f32 D_8085D958[] = { 600.0f, 960.0f };
+Vec3f D_8085D960 = { -30.0f, 50.0f, 0.0f };
+Vec3f D_8085D96C = { 30.0f, 50.0f, 0.0f };
+
+// Flying as Deku?
+void func_80856918(Player* this, PlayState* play) {
+ if ((this->boomerangActor != NULL) && (this->boomerangActor->update == NULL)) {
+ this->boomerangActor = NULL;
+ }
+
+ if (func_80838A90(this, play)) {
+ return;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80837134(play, this);
+ return;
+ }
+
+ if ((this->actor.velocity.y > 0.0f) && (this->stateFlags3 & PLAYER_STATE3_200)) {
+ this->actor.terminalVelocity = -20.0f;
+ this->actor.gravity = -5.5f;
+ Player_SetCylinderForAttack(this, DMG_DEKU_LAUNCH, 2, 20);
+ func_80856110(play, this, 0.0f, 0.0f, -1.0f, 500, 0, 8);
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_CEILING) {
+ func_80833AA0(this, play);
+ }
+ } else if (!(this->stateFlags3 & PLAYER_STATE3_2000)) {
+ func_80833AA0(this, play);
+ } else if (this->stateFlags3 & PLAYER_STATE3_200) {
+ if (this->actor.velocity.y < 0.0f) {
+ if (this->unk_AE7 < 0) {
+ func_80833AA0(this, play);
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (this->skelAnime.curFrame > 6.0f) {
+ this->actor.velocity.y = 6.0f;
+ this->stateFlags3 &= ~PLAYER_STATE3_200;
+ this->stateFlags3 |= PLAYER_STATE3_1000000;
+ func_8082E1F0(this, NA_SE_IT_DEKUNUTS_FLOWER_OPEN);
+ func_8019FD90(4, 2);
+ }
+ }
+ }
+
+ this->actor.terminalVelocity = -10.0f;
+ this->actor.gravity = -0.5f;
+ Player_ResetCylinder(this);
+ } else if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_A)) {
+ func_808355D8(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else {
+ s16 temp_a0;
+ f32 temp_fv1;
+ s16 sp76;
+ s16 var_v1;
+ s16 var_a1;
+ f32 sp6C;
+ f32 sp68;
+ s16 sp66;
+ s16 temp_ft0;
+ s32 temp;
+ s16 var_v1_4;
+
+ this->linearVelocity = sqrtf(SQXZ(this->actor.velocity));
+ if (this->linearVelocity != 0.0f) {
+ var_a1 = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x);
+
+ temp_a0 = this->actor.shape.rot.y - var_a1;
+ if (ABS_ALT(temp_a0) > 0x4000) {
+ this->linearVelocity = -this->linearVelocity;
+ var_a1 = var_a1 + 0x8000;
+ }
+ this->currentYaw = var_a1;
+ }
+
+ if (this->windSpeed != 0.0f) {
+ Math_SmoothStepToS(&this->unk_B8C, this->windAngleX, 3, 0x1F40, 0x190);
+ }
+
+ func_8085687C(this);
+
+ if (this->unk_AE8 != 0) {
+ this->unk_AE8--;
+ }
+
+ temp_fv1 = D_8085D958[this->unk_AE7] - Math_Vec3f_DistXZ(&this->actor.world.pos, this->unk_AF0);
+ PlayerAnimation_Update(play, &this->skelAnime);
+
+ if ((this->unk_AE8 != 0) && (temp_fv1 > 300.0f)) {
+ sp76 = 0x1770;
+ if (this->skelAnime.animation != &gPlayerAnim_pn_kakku) {
+ func_8082E5EC(play, this, &gPlayerAnim_pn_kakkufinish);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 8.0f)) {
+ s32 i;
+
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D960,
+ &this->bodyPartsPos[PLAYER_BODYPART_LEFT_HAND]);
+ Player_TranslateAndRotateY(this, &this->actor.world.pos, &D_8085D96C,
+ &this->bodyPartsPos[PLAYER_BODYPART_RIGHT_HAND]);
+
+ for (i = 0; i < 13; i++) {
+ func_808566C0(play, this, PLAYER_BODYPART_LEFT_HAND, 0.6f, 1.0f, 0.8f, 17);
+ func_808566C0(play, this, PLAYER_BODYPART_RIGHT_HAND, 0.6f, 1.0f, 0.8f, 17);
+ }
+ }
+ } else if ((this->unk_AE8 == 0) || (temp_fv1 < 0.0f)) {
+ sp76 = 0;
+ func_808355D8(play, this, &gPlayerAnim_pn_rakkafinish);
+ } else {
+ sp76 = 0x1770 - (s32)((300.0f - temp_fv1) * 10.0f);
+
+ if (this->skelAnime.animation != &gPlayerAnim_pn_batabata) {
+ func_8082E55C(play, this, &gPlayerAnim_pn_batabata);
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 6.0f)) {
+ Player_PlaySfx(this, NA_SE_PL_DEKUNUTS_STRUGGLE);
+ }
+ }
+
+ Math_AsymStepToS(&this->unk_B86[1], sp76, 0x190, 0x190);
+
+ this->unk_B8A += this->unk_B86[1];
+ temp = ABS_ALT(this->unk_B86[1]);
+ if (temp > 0xFA0) {
+ this->unk_B66 += (u8)(ABS_ALT(this->unk_B86[1]) * 0.01f);
+ }
+
+ if (this->unk_B66 > 200) {
+ this->unk_B66 -= 200;
+ func_808566C0(play, this, PLAYER_BODYPART_LEFT_HAND, 0.0f, 1.0f, 0.0f, 32);
+ func_808566C0(play, this, PLAYER_BODYPART_RIGHT_HAND, 0.0f, 1.0f, 0.0f, 32);
+ }
+
+ func_8019FCB8(&this->actor.projectedPos, 0x1851, 2.0f * (this->unk_B86[1] * (1.0f / 6000.0f)));
+ if ((this->boomerangActor == NULL) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
+ if (AMMO(ITEM_NUT) == 0) {
+ play_sound(NA_SE_SY_ERROR);
+ } else {
+ this->boomerangActor =
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->bodyPartsPos[PLAYER_BODYPART_WAIST].x,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].y,
+ this->bodyPartsPos[PLAYER_BODYPART_WAIST].z, -1, 0, 0, ARROW_TYPE_DEKU_NUT);
+ if (this->boomerangActor != NULL) {
+ this->boomerangActor->velocity.x = this->actor.velocity.x * 1.5f;
+ this->boomerangActor->velocity.z = this->actor.velocity.z * 1.5f;
+ Inventory_ChangeAmmo(ITEM_NUT, -1);
+ Actor_PlaySfx(this->boomerangActor, NA_SE_PL_DEKUNUTS_DROP_BOMB);
+ }
+ }
+ }
+
+ if (this->actor.velocity.y < 0.0f) {
+ if (sp76 != 0) {
+ this->actor.terminalVelocity = -0.38f;
+ this->actor.gravity = -0.2f;
+ } else {
+ this->actor.terminalVelocity = (this->unk_B86[1] * 0.0033f) + -20.0f;
+ this->actor.gravity = (this->unk_B86[1] * 0.00004f) + (REG(68) / 100.0f);
+ }
+ }
+
+ this->fallStartHeight = this->actor.world.pos.y;
+ func_80832F78(this, &sp6C, &sp66, 0.0f, play);
+ if (sp6C == 0.0f) {
+ sp68 = 0.1f;
+ } else {
+ s16 temp_v0_6 = this->currentYaw - sp66;
+
+ if (ABS_ALT(temp_v0_6) > 0x4000) {
+ sp6C = -sp6C;
+ sp66 += 0x8000;
+ }
+ sp68 = 0.25f;
+ }
+
+ Math_SmoothStepToS(&this->unk_B8C, sp6C * 600.0f, 8, 0xFA0, 0x64);
+ Math_ScaledStepToS(&this->currentYaw, sp66, 0xFA);
+
+ temp_ft0 = BINANG_SUB(sp66, this->currentYaw) * -2.0f;
+ temp_ft0 = CLAMP(temp_ft0, -0x1F40, 0x1F40);
+ Math_SmoothStepToS(&this->unk_B8E, temp_ft0, 0x14, 0x320, 0x14);
+ sp6C = (sp6C * (this->unk_B86[1] * 0.0004f)) * fabsf(Math_SinS(this->unk_B8C));
+ func_80856888(&this->linearVelocity, sp6C, sp68);
+
+ sp6C = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y));
+ if (sp6C > 8.0f) {
+ sp6C = 8.0f / sp6C;
+ this->linearVelocity *= sp6C;
+ this->actor.velocity.y *= sp6C;
+ }
+ }
+
+ func_808378FC(play, this);
+}
+
+// Deku spinning related
+void func_808573A4(Player* this, PlayState* play) {
+ this->stateFlags2 |= PLAYER_STATE2_20 | PLAYER_STATE2_40;
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+ Player_SetCylinderForAttack(this, DMG_DEKU_SPIN, 1, 30);
+
+ if (!func_80838A90(this, play)) {
+ s16 prevYaw = this->currentYaw;
+ f32 sp40;
+ s16 sp3E;
+
+ func_80832F78(this, &sp40, &sp3E, 0.018f, play);
+ sp40 *= 1.0f - (0.9f * ((11100.0f - this->unk_B10[0]) / 11100.0f));
+ if (!func_8083A4A4(this, &sp40, &sp3E, REG(43) / 100.0f)) {
+ func_8083CB58(this, sp40, sp3E);
+ }
+
+ this->unk_B10[0] += -800.0f;
+ this->actor.shape.rot.y += BINANG_ADD((s16)this->unk_B10[0], BINANG_SUB(this->currentYaw, prevYaw));
+
+ if (Math_StepToF(&this->unk_B10[1], 0.0f, this->unk_B10[0])) {
+ this->actor.shape.rot.y = this->currentYaw;
+ func_8083B2E4(this, play);
+ } else if (this->skelAnime.animation == &gPlayerAnim_pn_attack) {
+ this->stateFlags3 |= PLAYER_STATE3_100000;
+
+ if (this->unk_B10[1] < 0.0f) {
+ func_8082E438(play, this, func_8082ED20(this));
+ }
+ }
+
+ func_808566C0(play, this, PLAYER_BODYPART_WAIST, 1.0f, 0.5f, 0.0f, 32);
+
+ if (this->unk_B10[0] > 9500.0f) {
+ func_8083F8A8(play, this, 2.0f, 1, 2.5f, 10, 18, true);
+ }
+
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->meleeWeaponEffectIndex[2]), &this->actor.world.pos, 2.0f,
+ this->currentYaw, this->actor.floorPoly, this->actor.floorBgId);
+ func_800B8F98(&this->actor, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG));
+ }
+}
+
+void func_80857640(Player* this, f32 arg1, s32 arg2) {
+ func_80834CD0(this, arg1, NA_SE_VO_LI_SWORD_N);
+ Player_PlaySfx(this, NA_SE_PL_GORON_BALLJUMP);
+ Player_StopHorizontalMovement(this);
+ if (this->unk_AE8 < arg2) {
+ this->unk_AE8 = arg2;
+ }
+ this->unk_AE7 = 1;
+ this->unk_B48 = 1.0f;
+}
+
+void func_808576BC(PlayState* play, Player* this) {
+ s32 var_v0 = ((this->actor.velocity.z * Math_CosS(this->currentYaw)) +
+ (this->actor.velocity.x * Math_SinS(this->currentYaw))) *
+ 800.0f;
+
+ var_v0 -= this->unk_AE8;
+ var_v0 = ABS_ALT(var_v0);
+
+ if (var_v0 <= 0x7D0) {
+ return;
+ }
+
+ if (var_v0 > 0x1770) {
+ func_800B8F98(&this->actor, NA_SE_PL_GORON_SLIP - SFX_FLAG);
+ }
+
+ if (func_8083F8A8(play, this, 12.0f, -1 - (var_v0 >> 0xC), (var_v0 >> 0xA) + 1.0f, (var_v0 >> 7) + 160, 20, true)) {
+ Player_PlaySfx(this, (this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG)
+ ? NA_SE_PL_ROLL_SNOW_DUST - SFX_FLAG
+ : NA_SE_PL_ROLL_DUST - SFX_FLAG);
+ }
+}
+
+void func_808577E0(Player* this) {
+ f32 temp_fa1 = ABS_ALT(this->unk_AE8) * 0.00004f;
+
+ if (this->unk_ABC < temp_fa1) {
+ this->unk_B48 += 0.08f;
+ } else {
+ this->unk_B48 += -0.07f;
+ }
+
+ this->unk_B48 = CLAMP(this->unk_B48, -0.2f, 0.14f);
+ if (fabsf(this->unk_B48) < 0.12f) {
+ if (Math_StepUntilF(&this->unk_ABC, temp_fa1, this->unk_B48)) {
+ this->unk_B48 = 0.0f;
+ }
+ } else {
+ this->unk_ABC += this->unk_B48;
+ this->unk_ABC = CLAMP(this->unk_ABC, -0.7f, 0.3f);
+ }
+}
+
+s32 func_80857950(PlayState* play, Player* this) {
+ if (((this->unk_B86[1] == 0) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
+ ((this->unk_AE7 == 3) && (this->actor.velocity.y < 0.0f))) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pg_maru_change, -2.0f / 3.0f, 7.0f, 0.0f,
+ ANIMMODE_ONCE, 0.0f);
+ Player_PlaySfx(this, NA_SE_PL_BALL_TO_GORON);
+ return true;
+ }
+
+ return false;
+}
+
+s32 func_80857A44(PlayState* play, Player* this) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+
+ this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
+ this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_800;
+ this->unk_AE7 = 4;
+ this->actor.shape.shadowScale = 30.0f;
+ this->unk_AE8 = this->linearVelocity * 500.0f;
+ this->unk_B08 = this->linearVelocity;
+ this->unk_B0C = 0.0f;
+ this->actor.home.rot.y = this->currentYaw;
+
+ return true;
+ }
+
+ return false;
+}
+
+void func_80857AEC(PlayState* play, Player* this) {
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
+ this->unk_B0C += this->unk_B08 * 0.05f;
+
+ if (this->unk_B86[1] == 0) {
+ if (this->unk_AE7 == 1) {
+ this->unk_AE7 = 2;
+ Player_RequestQuakeAndRumble(play, this, NA_SE_PL_GORON_PUNCH);
+ play->actorCtx.unk2 = 4;
+ EffectSsBlast_SpawnWhiteShockwave(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f);
+ this->unk_AE8 = 0;
+ this->unk_B08 = 0.0f;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TEST, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, 0, 0, 0);
+ } else {
+ this->unk_AE7 = 4;
+ }
+ }
+
+ Player_AnimSfx_PlayFloorLand(this);
+ }
+}
+
+// Goron rolling related
+void func_80857BE8(Player* this, PlayState* play) {
+ if (func_80833058(play, this, D_8085D050, 0)) {
+ return;
+ }
+
+ if ((this->unk_AE7 == 0) && !func_80857A44(play, this)) {
+ return;
+ }
+
+ this->stateFlags3 |= PLAYER_STATE3_1000;
+ func_808577E0(this);
+
+ if (!func_80857950(play, this)) {
+ f32 spE4 = 0.0f;
+ s16 spE2 = this->currentYaw;
+ u16 spE0;
+ s32 spDC;
+ s32 spD8;
+
+ if (func_80840A30(play, this, &this->unk_B08, (this->doorType == PLAYER_DOORTYPE_STAIRCASE) ? 0.0f : 12.0f)) {
+ if (func_80857BE8 != this->actionFunc) {
+ return;
+ }
+
+ this->linearVelocity *= 0.1f;
+ func_80834CD0(this, 10.0f, 0);
+ if (this->unk_B86[1] != 0) {
+ this->unk_B86[1] = 0;
+ this->unk_AE7 = 3;
+ }
+ } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) && (this->unk_B08 >= 12.0f)) {
+ s16 temp_v0 = this->currentYaw - BINANG_ADD(this->actor.wallYaw, 0x8000);
+ s16 temp_v2;
+ s32 var_a2 = ABS_ALT(temp_v0);
+
+ this->unk_B0C += this->unk_B08 * 0.05f;
+ temp_v2 = ((temp_v0 >= 0) ? 1 : -1) * ((var_a2 + 0x100) & ~0x1FF);
+ this->currentYaw += BINANG_SUB(0x8000, (s16)(temp_v2 * 2));
+ this->actor.home.rot.y = this->currentYaw;
+ this->actor.shape.rot.y = this->currentYaw;
+
+ this->unk_B8C = 4;
+ Player_PlaySfx(this, NA_SE_IT_GORON_ROLLING_REFLECTION);
+ }
+
+ this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40);
+
+ if (this->unk_B8E != 0) {
+ this->unk_B8E--;
+ } else {
+ func_80832F78(this, &spE4, &spE2, 0.0f, play);
+ spE4 *= 2.6f;
+ }
+
+ if (this->unk_B8C != 0) {
+ this->unk_B8C--;
+ spE2 = this->currentYaw;
+ }
+
+ if (this->unk_B86[1] != 0) {
+ spE4 = 18.0f;
+ Math_StepToC(&this->unk_AE7, 4, 1);
+
+ if ((this->stateFlags3 & PLAYER_STATE3_80000) && (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A) ||
+ (gSaveContext.save.saveInfo.playerData.magic == 0) ||
+ ((this->unk_AE7 == 4) && (this->unk_B08 < 12.0f)))) {
+ if (Math_StepToS(&this->unk_B86[1], 0, 1) != 0) {
+ this->stateFlags3 &= ~PLAYER_STATE3_80000;
+ Magic_Reset(play);
+ Player_PlaySfx(this, NA_SE_PL_GORON_BALL_CHARGE_FAILED);
+ }
+ this->unk_AE7 = 4;
+ } else if (this->unk_B86[1] < 7) {
+ if (!(this->stateFlags3 & PLAYER_STATE3_80000)) {
+ this->unk_3D0.unk_00 = 2;
+ }
+ this->unk_B86[1]++;
+ }
+ }
+
+ spDC = spE4 * 900.0f;
+
+ Math_AsymStepToF(&this->unk_B10[0], (this->unk_B8A != 0) ? 1.0f : 0.0f, 0.8f, 0.05f);
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ func_80857AEC(play, this);
+ if (this->unk_AE7 == 2) {
+ if (this->unk_B8A == 0) {
+ this->unk_AE7 = 4;
+ } else {
+ this->unk_B8A--;
+ this->unk_ABC = 0.0f;
+ this->unk_B48 = 0.14f;
+ }
+ } else if ((this->unk_B86[1] == 0) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B) &&
+ (Inventory_GetBtnBItem(play) < ITEM_FD)) {
+ func_80857640(this, 14.0f, 0x1F40);
+ } else {
+ f32 spCC;
+ s16 spCA;
+ s16 spC8;
+ s32 var_a0;
+ s32 spC0;
+ f32 spBC;
+ f32 spB8;
+ f32 spB4;
+ f32 spB0;
+ f32 spAC;
+ f32 spA8;
+ f32 spA4;
+ f32 spA0;
+ Vec3f slopeNormal;
+ s16 downwardSlopeYaw;
+ s16 sp90 = this->currentYaw;
+ s16 sp8E = this->currentYaw - this->actor.home.rot.y;
+ f32 sp88 = Math_CosS(sp8E);
+
+ if (this->unk_B86[1] == 0) {
+ this->unk_B0C = 0.0f;
+ if (this->unk_AE7 >= 0x36) {
+ Magic_Consume(play, 2, MAGIC_CONSUME_GORON_ZORA);
+ this->unk_B08 = 18.0f;
+ this->unk_B86[1] = 1;
+ this->stateFlags3 |= PLAYER_STATE3_80000;
+ func_8082E1F0(this, NA_SE_PL_GORON_BALL_CHARGE_DASH);
+ }
+ } else {
+ this->unk_B0C = CLAMP(this->unk_B0C, 0.0f, 0.9f);
+ }
+
+ spBC = (1.0f - this->unk_B0C) * this->unk_B08 * sp88;
+ if ((spBC < 0.0f) || ((spE4 == 0.0f) && (ABS_ALT(sp8E) > 0xFA0))) {
+ spBC = 0.0f;
+ }
+
+ Math_StepToF(&this->unk_B0C, 0.0f, fabsf(sp88) * 20.0f);
+ var_a0 = spBC * 500.0f;
+ var_a0 = CLAMP_MIN(var_a0, 0);
+
+ spC0 = (s32)(spE4 * 400.0f) - var_a0;
+ spC0 = CLAMP_MIN(spC0, 0);
+
+ spDC = CLAMP_MIN(spDC, var_a0);
+
+ spAC = spBC * Math_SinS(this->actor.home.rot.y);
+ spA8 = spBC * Math_CosS(this->actor.home.rot.y);
+ spB4 = this->unk_B08 * Math_SinS(this->currentYaw);
+ spB0 = this->unk_B08 * Math_CosS(this->currentYaw);
+
+ spA4 = spB4 - spAC;
+ spA0 = spB0 - spA8;
+ this->linearVelocity = spBC;
+ this->currentYaw = this->actor.home.rot.y;
+ spCC = spE4;
+ spCA = spE2;
+
+ if (func_8083A4A4(this, &spCC, &spCA, (this->unk_AE7 >= 5) ? 0.0f : 1.0f)) {
+ if (this->unk_B86[1] == 0) {
+ this->unk_AE7 = 4;
+ }
+
+ if (this->unk_AE7 == 4) {
+ spDC = -0xFA0;
+ }
+ } else {
+ static Vec3f D_8085D978 = { -30.0f, 60.0f, 0.0f };
+ static Vec3f D_8085D984 = { 30.0f, 60.0f, 0.0f };
+ f32 sp84 = (((this->floorSfxOffset == NA_SE_PL_WALK_SNOW - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_ICE - SFX_FLAG) ||
+ (this->floorSfxOffset == NA_SE_PL_WALK_SAND - SFX_FLAG) ||
+ (sPlayerCurrentFloorType == FLOOR_TYPE_5)) &&
+ (spC0 >= 0x7D0))
+ ? 0.08f
+ : this->unk_AE8 * 0.0003f;
+ f32 sp80 = (Math_SinS(this->unk_B6C) * 8.0f) + 0.6f;
+ s16 var_a3;
+ s16 sp7C;
+ Vec3f sp70;
+ f32 sp6C;
+ f32 var_fa1;
+
+ if (this->unk_B86[1] == 0) {
+ if ((gSaveContext.magicState == MAGIC_STATE_IDLE) &&
+ (gSaveContext.save.saveInfo.playerData.magic >= 2) && (this->unk_AE8 >= 0x36B0)) {
+ this->unk_AE7++;
+ func_800B8F98(&this->actor, NA_SE_PL_GORON_BALL_CHARGE - SFX_FLAG);
+ } else {
+ this->unk_AE7 = 4;
+ }
+ }
+
+ if (spE4 != spCC) {
+ this->currentYaw = spE2;
+ }
+
+ sp84 = CLAMP_MIN(sp84, 0.0f);
+ sp80 = CLAMP_MIN(sp80, 0.0f);
+
+ Math_AsymStepToF(&this->linearVelocity, spE4, sp84, sp80);
+ spC8 = (s16)(fabsf(this->actor.speed) * 20.0f) + 300;
+ spC8 = CLAMP_MIN(spC8, 100);
+
+ sp7C = (s32)(BINANG_SUB(spE2, this->currentYaw) * -0.5f);
+ this->unk_B0C += (f32)(SQ(sp7C)) * 8e-9f;
+ Math_ScaledStepToS(&this->currentYaw, spE2, spC8);
+ sp6C = func_80835D2C(play, this, &D_8085D978, &sp70);
+
+ var_fa1 = func_80835D2C(play, this, &D_8085D984, &sp70) - sp6C;
+ if (fabsf(var_fa1) > 100.0f) {
+ var_fa1 = 0.0f;
+ }
+
+ var_a3 = Math_Atan2S_XY(60.0f, var_fa1);
+ if (ABS_ALT(var_a3) > 0x2AAA) {
+ var_a3 = 0;
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.z, var_a3 + sp7C, spC8);
+ }
+
+ spBC = this->linearVelocity;
+ this->actor.home.rot.y = this->currentYaw;
+ this->currentYaw = sp90;
+ Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw);
+
+ spB8 = sqrtf(SQ(spA4) + SQ(spA0));
+ if (this->unk_B86[1] != 0) {
+ if ((ABS_ALT(sp8E) + ABS_ALT(this->unk_B6C)) > 15000) {
+ this->unk_B86[1] = 0;
+ this->unk_AE7 = 4;
+ this->unk_B8E = 0x14;
+ this->unk_AE8 = 0;
+ this->stateFlags3 &= ~PLAYER_STATE3_80000;
+ Magic_Reset(play);
+ }
+ } else {
+ f32 temp_ft4_2 = (0.6f * slopeNormal.x) + spA4;
+ f32 temp_ft5 = (0.6f * slopeNormal.z) + spA0;
+ f32 temp_fv0_3 = sqrtf(SQ(temp_ft4_2) + SQ(temp_ft5));
+
+ if ((temp_fv0_3 < spB8) || (temp_fv0_3 < 6.0f)) {
+ spA4 = temp_ft4_2;
+ spA0 = temp_ft5;
+ spB8 = temp_fv0_3;
+ }
+ }
+
+ if (spB8 != 0.0f) {
+ f32 pad;
+ f32 sp54 = spB8 - 0.3f;
+
+ sp54 = CLAMP_MIN(sp54, 0.0f);
+
+ spB8 = sp54 / spB8;
+
+ spA4 *= spB8;
+ spA0 *= spB8;
+
+ if (sp54 != 0.0f) {
+ this->unk_B28 = Math_Atan2S_XY(spA0, spA4);
+ }
+
+ if (this->unk_AE8 == 0) {
+ s32 temp_v0_10 = this->unk_B86[0];
+ s32 temp_ft3_2 = sp54 * 800.0f;
+
+ this->unk_B86[0] += (s16)temp_ft3_2;
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (temp_ft3_2 != 0) &&
+ (((temp_v0_10 + temp_ft3_2) * temp_v0_10) <= 0)) {
+ spE0 = Player_GetFloorSfx(this, NA_SE_PL_GORON_ROLL);
+ func_8019F780(&this->actor.projectedPos, spE0, sp54);
+ }
+ }
+ }
+
+ spAC = Math_SinS(this->actor.home.rot.y) * spBC;
+ spA8 = Math_CosS(this->actor.home.rot.y) * spBC;
+
+ spB4 = spAC + spA4;
+ spB0 = spA8 + spA0;
+
+ this->unk_B08 = sqrtf(SQ(spB4) + SQ(spB0));
+ this->unk_B08 = CLAMP_MAX(this->unk_B08, 18.0f);
+
+ this->currentYaw = Math_Atan2S_XY(spB0, spB4);
+ }
+
+ func_808576BC(play, this);
+
+ if (ABS_ALT(this->unk_AE8) > 0xFA0) {
+ this->stateFlags2 |= PLAYER_STATE2_8;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
+ this->linearVelocity = this->unk_B08 * Math_CosS(this->unk_B6C);
+ this->actor.velocity.y = this->unk_B08 * Math_SinS(this->unk_B6C);
+ }
+
+ if ((this->unk_B86[1] != 0) ||
+ SurfaceType_HasMaterialProperty(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId,
+ MATERIAL_PROPERTY_SOFT_IMPRINT)) {
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->meleeWeaponEffectIndex[2]), &this->actor.world.pos,
+ 15.0f, this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
+ } else {
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ }
+ } else {
+ Math_ScaledStepToS(&this->actor.shape.rot.z, 0, 0x190);
+
+ this->unk_B86[0] = 0;
+ if (this->unk_B86[1] != 0) {
+ this->actor.gravity = -1.0f;
+ Math_ScaledStepToS(&this->actor.home.rot.y, spE2, 0x190);
+
+ this->unk_B08 = sqrtf(SQ(this->linearVelocity) + SQ(this->actor.velocity.y)) *
+ ((this->linearVelocity >= 0.0f) ? 1.0f : -1.0f);
+ this->unk_B08 = CLAMP_MAX(this->unk_B08, 18.0f);
+ } else {
+ this->unk_B48 += this->actor.velocity.y * 0.005f;
+ if (this->unk_AE7 == 1) {
+ if (this->actor.velocity.y > 0.0f) {
+ if ((this->actor.velocity.y + this->actor.gravity) < 0.0f) {
+ this->actor.velocity.y = -this->actor.gravity;
+ }
+ } else {
+ this->unk_B8A = 0xA;
+ if (this->actor.velocity.y > -1.0f) {
+ this->actor.gravity = -0.2f;
+ } else {
+ this->unk_3D0.unk_00 = 1;
+ this->actor.gravity = -10.0f;
+ }
+ }
+ }
+ this->unk_B08 = this->linearVelocity;
+ }
+
+ func_800AEF44(Effect_GetByIndex(this->meleeWeaponEffectIndex[2]));
+ }
+
+ Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 0x7D0);
+
+ Math_AsymStepToS(&this->unk_AE8, spDC, (spDC >= 0) ? 0x7D0 : 0x3E8, 0x4B0);
+
+ if (this->unk_AE8 != 0) {
+ spD8 = this->actor.shape.rot.x;
+ this->actor.shape.rot.x += this->unk_AE8;
+
+ Math_ScaledStepToS(&this->unk_B86[0], 0, ABS_ALT(this->unk_AE8));
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (((this->unk_AE8 + spD8) * spD8) <= 0)) {
+ spE0 =
+ Player_GetFloorSfx(this, (this->unk_B86[1] != 0) ? NA_SE_PL_GORON_CHG_ROLL : NA_SE_PL_GORON_ROLL);
+ func_8019F780(&this->actor.projectedPos, spE0, this->unk_B08);
+ }
+ }
+
+ if (this->unk_AE7 == 2) {
+ Player_SetCylinderForAttack(this, DMG_GORON_POUND, 4, 60);
+ Actor_SetPlayerImpact(play, PLAYER_IMPACT_GORON_GROUND_POUND, 2, 100.0f, &this->actor.world.pos);
+ } else if (this->unk_B86[1] != 0) {
+ Player_SetCylinderForAttack(this, DMG_GORON_SPIKES, 1, 25);
+ } else {
+ Player_SetCylinderForAttack(this, DMG_NORMAL_ROLL, 1, 25);
+ }
+ }
+}
+
+void func_80858C84(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ func_8082E438(play, this, anim);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858CC8(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_ONCE,
+ -8.0f);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858D48(PlayState* play, Player* this, PlayerAnimationHeader* anim) {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858DB4(PlayState* play, Player* this, void* anim) {
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858DDC(PlayState* play, Player* this, void* anim) {
+ func_80858C84(play, this, anim);
+}
+
+void func_80858DFC(PlayState* play, Player* this, void* anim) {
+ func_8082E784(this);
+ func_8082E5A8(play, this, anim);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80858E40(PlayState* play, Player* this, void* anim) {
+ func_80858CC8(play, this, anim);
+}
+
+void func_80858E60(PlayState* play, Player* this, void* anim) {
+ func_80858D48(play, this, anim);
+}
+
+void func_80858E80(PlayState* play, Player* this, void* anim) {
+ func_8082EA60(play, this, anim);
+}
+
+void func_80858EA0(PlayState* play, Player* this, void* anim) {
+ func_8082EA10(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858EC0(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayOnceReverse(play, this, anim);
+ func_8082E920(play, this, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858EFC(PlayState* play, Player* this, void* anim) {
+ func_8082EB18(play, this, anim);
+}
+
+void func_80858F1C(PlayState* play, Player* this, void* anim) {
+ func_8082EAC8(play, this, anim, ANIM_FLAG_4 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE | ANIM_FLAG_80);
+}
+
+void func_80858F3C(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayOnce(play, this, anim);
+}
+
+void func_80858F5C(PlayState* play, Player* this, void* anim) {
+ Player_AnimationPlayLoop(play, this, anim);
+}
+
+void func_80858F7C(PlayState* play, Player* this, void* anim) {
+ func_8082DB90(play, this, anim);
+}
+
+void func_80858F9C(PlayState* play, Player* this, void* anim) {
+ func_8082DB60(play, this, anim);
+}
+
+void func_80858FBC(PlayState* play, Player* this, void* anim) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_80858FE8(Player* this) {
+ if (this->skelAnime.animation == &gPlayerAnim_lost_horse_wait) {
+ Player_AnimSfx_PlayFloor(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG);
+ Player_PlaySfx(this, NA_SE_VO_LK_DRAGGED_DAMAGE - SFX_FLAG);
+ }
+}
+
+void (*D_8085D990[])(PlayState*, Player*, void*) = {
+ /* 0 */ NULL,
+ /* 1 */ func_80858DB4,
+ /* 2 */ func_80858DDC,
+ /* 3 */ func_80858E40,
+ /* 4 */ func_80858E60,
+ /* 5 */ func_80858E80,
+ /* 6 */ func_80858EA0,
+ /* 7 */ func_80858EFC,
+ /* 8 */ func_80858F1C,
+ /* 9 */ func_80858F3C,
+ /* 10 */ func_80858F5C,
+ /* 11 */ func_80858FBC,
+ /* 12 */ func_80859028,
+ /* 13 */ func_808591BC,
+ /* 14 */ func_80858DFC,
+ /* 15 */ func_80858F7C,
+ /* 16 */ func_80858F9C,
+ /* 17 */ func_80859168,
+ /* 18 */ func_80859210,
+ /* 19 */ func_80858EC0,
+};
+
+AnimSfxEntry D_8085D9E0[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 34, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 45, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 51, NA_SE_PL_CALM_HIT, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 64, NA_SE_PL_CALM_HIT, STOP),
+};
+AnimSfxEntry D_8085D9F0[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 7, NA_SE_VO_LI_DEMO_DAMAGE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 18, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 18, NA_SE_VO_LI_FREEZE, STOP),
+};
+AnimSfxEntry D_8085D9FC[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 14, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA00[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 6, NA_SE_PL_GET_UP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 18, NA_SE_VO_LK_WAKE_UP, STOP),
+};
+AnimSfxEntry D_8085DA08[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 26, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA0C[] = {
+ ANIMSFX(ANIMSFX_TYPE_8, 16, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 36, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA14[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 55, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 55, NA_SE_VO_LK_CATCH_DEMO, STOP),
+};
+AnimSfxEntry D_8085DA1C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 4, NA_SE_VO_LK_USING_UP_ENERGY, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 16, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 16, NA_SE_VO_LI_DAMAGE_S, STOP),
+};
+AnimSfxEntry D_8085DA28[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 28, NA_SE_PL_LAND_GROUND, STOP),
+};
+AnimSfxEntry D_8085DA2C[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 1, NA_SE_VO_LK_USING_UP_ENERGY, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_JUMP, 42, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 44, NA_SE_VO_LI_FALL_L, STOP),
+};
+AnimSfxEntry D_8085DA38[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 1, NA_SE_PL_BOUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_DAMAGE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_BY_AGE, 39, NA_SE_PL_LAND_GROUND, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 49, NA_SE_NONE, STOP),
+};
+
+// gPlayerAnim_cl_nigeru
+AnimSfxEntry D_8085DA48[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 1, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 5, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA50[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 10, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 13, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 16, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 19, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 22, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 22, NA_SE_PL_SLIP, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 55, NA_SE_VO_LI_DAMAGE_S, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 62, NA_SE_NONE, STOP),
+};
+
+AnimSfxEntry D_8085DA70[] = {
+ ANIMSFX(ANIMSFX_TYPE_6, 42, NA_SE_NONE, CONTINUE),
+ ANIMSFX(ANIMSFX_TYPE_6, 48, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA78[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR, 2, NA_SE_PL_BOUND, STOP),
+};
+AnimSfxEntry D_8085DA7C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 5, NA_SE_VO_LI_FREEZE, STOP),
+};
+AnimSfxEntry D_8085DA80[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 1, NA_SE_VO_LI_FALL_L, STOP),
+};
+AnimSfxEntry D_8085DA84[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 13, NA_SE_VO_LI_HANG, STOP),
+};
+AnimSfxEntry D_8085DA88[] = {
+ ANIMSFX(ANIMSFX_TYPE_FLOOR_LAND, 26, NA_SE_NONE, STOP),
+};
+AnimSfxEntry D_8085DA8C[] = {
+ ANIMSFX(ANIMSFX_TYPE_VOICE, 4, NA_SE_VO_LI_SURPRISE, STOP),
+};
+AnimSfxEntry D_8085DA90[] = {
+ ANIMSFX(ANIMSFX_TYPE_GENERAL, 18, NA_SE_PL_SIT_ON_HORSE, STOP),
+};
+
+void func_80859028(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80858D48(play, this, anim);
+ this->unk_AE8 = 1;
+ }
+
+ if (this->skelAnime.animation == &gPlayerAnim_okiagaru_tatu) {
+ Player_PlayAnimSfx(this, D_8085DA08);
+ } else if (this->skelAnime.animation == &gPlayerAnim_lost_horse) {
+ Player_PlayAnimSfx(this, D_8085DA14);
+ } else if (this->skelAnime.animation == &gPlayerAnim_sirimochi) {
+ Player_PlayAnimSfx(this, D_8085DA38);
+ } else if (this->skelAnime.animation == &gPlayerAnim_alink_somukeru) {
+ Player_PlayAnimSfx(this, D_8085DA7C);
+ } else if (this->skelAnime.animation == &gPlayerAnim_al_fuwafuwa) {
+ Player_PlayAnimSfx(this, D_8085DA84);
+ } else if (this->skelAnime.animation == &gPlayerAnim_cl_umanoru) {
+ Player_PlayAnimSfx(this, D_8085DA90);
+ } else {
+ func_80858FE8(this);
+ }
+}
+
+void func_80859168(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082E794(this);
+ func_8082DB60(play, this, anim);
+ }
+}
+
+void func_808591BC(PlayState* play, Player* this, void* anim) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082EB18(play, this, anim);
+ this->unk_AE8 = 1;
+ }
+}
+
+void func_80859210(PlayState* play, Player* this, void* arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ Player_PlayAnimSfx(this, arg2);
+}
+
+void func_80859248(Player* this) {
+ if ((this->unk_398 == NULL) || (this->unk_398->update == NULL)) {
+ this->unk_398 = NULL;
+ }
+ this->targetedActor = this->unk_398;
+ if (this->unk_398 != NULL) {
+ this->actor.shape.rot.y = func_8083C62C(this, 0);
+ }
+}
+
+void func_8085929C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->stateFlags1 |= PLAYER_STATE1_8000000;
+ this->stateFlags2 |= PLAYER_STATE2_400;
+ this->stateFlags1 &= ~(PLAYER_STATE1_40000 | PLAYER_STATE1_80000);
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim);
+ this->linearVelocity = 0.0f;
+}
+
+void func_80859300(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->actor.gravity = 0.0f;
+
+ if (this->unk_AE7 == 0) {
+ if ((this->transformation == PLAYER_FORM_DEKU) || func_8083B3B4(play, this, NULL)) {
+ this->unk_AE7 = 1;
+ } else {
+ func_808477D0(play, this, NULL, fabsf(this->actor.velocity.y));
+ Math_ScaledStepToS(&this->unk_AAA, -0x2710, 0x320);
+ func_8084748C(this, &this->actor.velocity.y, 4.0f, this->currentYaw);
+ }
+ } else {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE7 == 1) {
+ func_8082E634(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ } else {
+ Player_AnimationPlayLoop(play, this, &gPlayerAnim_link_swimer_swim_wait);
+ }
+ }
+ func_808475B4(this);
+ func_8084748C(this, &this->linearVelocity, 0.0f, this->actor.shape.rot.y);
+ }
+}
+
+void func_80859414(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80859248(this);
+
+ if (func_801242B4(this)) {
+ func_80859300(play, this, 0);
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_8083216C(this, play);
+ } else if ((this->interactRangeActor != NULL) && (this->interactRangeActor->textId == 0xFFFF)) {
+ func_8083D23C(this, play);
+ }
+ }
+}
+
+void func_808594D0(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_8085929C(play, this, 0);
+ } else {
+ PlayerAnimationHeader* anim = D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType];
+
+ if ((this->unk_396 == 6) || (this->unk_396 == 0x2E)) {
+ Player_AnimationPlayOnce(play, this, anim);
+ } else {
+ func_8082E784(this);
+ PlayerAnimation_Change(play, &this->skelAnime, anim, 2.0f / 3.0f, 0.0f, Animation_GetLastFrame(anim),
+ ANIMMODE_LOOP, -4.0f);
+ }
+ Player_StopHorizontalMovement(this);
+ }
+}
+
+void func_808595B8(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (func_80847880(play, this)) {
+ return;
+ }
+
+ if ((this->csMode == PLAYER_CSMODE_20) && (play->csCtx.state == CS_STATE_IDLE)) {
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
+ } else if (this->stateFlags1 & PLAYER_STATE1_8000000) {
+ func_80859300(play, this, 0);
+ this->actor.velocity.y = 0.0f;
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (func_801240DC(this) || (this->stateFlags1 & PLAYER_STATE1_800)) {
+ func_8083216C(this, play);
+ }
+ }
+}
+
+void func_8085968C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ func_80838830(this, OBJECT_GI_MSSA);
+ this->stateFlags1 |= PLAYER_STATE1_400;
+ }
+
+ func_8082DB90(play, this,
+ (this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_getA : &gPlayerAnim_link_demo_get_itemA);
+}
+
+void func_80859708(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if ((this->actor.id == ACTOR_EN_TEST3) && Animation_OnFrame(&this->skelAnime, 20.0f)) {
+ this->getItemDrawIdPlusOne = GID_MASK_SUN + 1;
+ Message_BombersNotebookQueueEvent(play, 0x1B);
+ Audio_PlayFanfare(NA_BGM_GET_NEW_MASK);
+ }
+}
+
+void func_8085978C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 linearVelocity;
+ s16 yaw;
+
+ this->stateFlags1 &= ~PLAYER_STATE1_2000000;
+
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_3A0);
+ linearVelocity = this->linearVelocity;
+ this->actor.world.rot.y = yaw;
+ this->actor.shape.rot.y = yaw;
+ this->currentYaw = yaw;
+ if (linearVelocity <= 0.0f) {
+ this->linearVelocity = 0.1f;
+ } else if (linearVelocity > 2.5f) {
+ this->linearVelocity = 2.5f;
+ }
+
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_5)) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 255;
+ R_PLAY_FILL_SCREEN_G = 255;
+ R_PLAY_FILL_SCREEN_B = 255;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ play_sound(NA_SE_SY_WHITE_OUT_T);
+ }
+}
+
+void func_80859890(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 sp24;
+
+ if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ON = -64;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ } else {
+ sp24 = 2.5f;
+ func_808411D4(play, this, &sp24, 0xA);
+ this->unk_AE8++;
+ if (this->unk_AE8 >= 0x15) {
+ this->csMode = PLAYER_CSMODE_10;
+ }
+ }
+}
+
+void func_80859990(PlayState* play, Player* this, UNK_TYPE arg2) {
+ this->linearVelocity = 2.5f;
+ func_80835BF8(&this->actor.world.pos, this->actor.shape.rot.y, 180.0f, &this->unk_3A0);
+}
+
+void func_808599DC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ f32 sp1C = 2.5f;
+
+ func_808411D4(play, this, &sp1C, 0xA);
+}
+
+void func_80859A10(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_8083B23C(this, play);
+}
+
+void func_80859A44(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80859248(this);
+ if (this->unk_AE8 != 0) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ Player_AnimationPlayLoop(play, this, func_8082EF54(this));
+ this->unk_AE8 = 0;
+ }
+ func_8082FC60(this);
+ } else {
+ func_8083E958(play, this);
+ }
+}
+
+void func_80859AD0(PlayState* play, Player* this, UNK_PTR arg2) {
+ func_80840F90(play, this, arg2, 0.0f, 0, 0);
+}
+
+void func_80859AF8(PlayState* play, Player* this, UNK_PTR arg2) {
+ this->actor.shape.face = 0xF;
+ func_80840F90(play, this, arg2, 0.0f, 0, 0);
+}
+
+void func_80859B28(PlayState* play, Player* this, UNK_PTR arg2) {
+ func_80840F90(play, this, arg2, 0.0f, 0, 1);
+}
+
+void func_80859B54(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80858CC8(play, this, &gPlayerAnim_link_normal_okarina_start);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+}
+
+void Player_Cutscene_Translate(PlayState* play, Player* this, CsCmdActorCue* playerAction) {
+ f32 startX = playerAction->startPos.x;
+ f32 startY = playerAction->startPos.y;
+ f32 startZ = playerAction->startPos.z;
+ f32 diffX = playerAction->endPos.x - startX;
+ f32 diffY = playerAction->endPos.y - startY;
+ f32 diffZ = playerAction->endPos.z - startZ;
+ f32 progress = (((f32)(play->csCtx.curFrame - playerAction->startFrame)) /
+ ((f32)(playerAction->endFrame - playerAction->startFrame)));
+
+ this->actor.world.pos.x = (diffX * progress) + startX;
+ this->actor.world.pos.y = (diffY * progress) + startY;
+ this->actor.world.pos.z = (diffZ * progress) + startZ;
+}
+
+void func_80859C60(PlayState* play, Player* this, void* arg2) {
+ if (arg2 != NULL) {
+ Player_Cutscene_Translate(play, this, arg2);
+ }
+
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_80859CA0(PlayState* play, Player* this, s32 arg2) {
+ func_8082E514(play, this, D_8085BE84[PLAYER_ANIMGROUP_43][this->modelAnimType]);
+ Player_StopHorizontalMovement(this);
+}
+
+void func_80859CE0(PlayState* play, Player* this, s32 arg2) {
+ this->actor.draw = Player_Draw;
+}
+
+void func_80859CFC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80841358(play, this, false);
+ func_8082DB90(play, this, &gPlayerAnim_link_demo_return_to_past);
+}
+
+void func_80859D44(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+struct_8085DA94 D_8085DA94[PLAYER_CSMODE_MAX] = {
+ /* PLAYER_CSMODE_0 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_1 */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_2 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_3 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_4 */ { 3, { &gPlayerAnim_link_demo_bikkuri } },
+ /* PLAYER_CSMODE_5 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_END */ { 0, { NULL } },
+ /* PLAYER_CSMODE_WAIT */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_8 */ { 2, { &gPlayerAnim_link_demo_furimuki } },
+ /* PLAYER_CSMODE_9 */ { -1, { func_8085978C } },
+ /* PLAYER_CSMODE_10 */ { 3, { &gPlayerAnim_link_demo_warp } },
+ /* PLAYER_CSMODE_11 */ { 5, { &gPlayerAnim_clink_demo_standup } },
+ /* PLAYER_CSMODE_12 */ { 7, { &gPlayerAnim_clink_demo_standup_wait } },
+ /* PLAYER_CSMODE_13 */ { 2, { &gPlayerAnim_link_demo_baru_op3 } },
+ /* PLAYER_CSMODE_14 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_15 */ { 3, { &gPlayerAnim_link_demo_jibunmiru } },
+ /* PLAYER_CSMODE_16 */ { -1, { func_80859B54 } },
+ /* PLAYER_CSMODE_17 */ { 2, { &gPlayerAnim_link_normal_okarina_end } },
+ /* PLAYER_CSMODE_18 */ { 16, { &gPlayerAnim_link_normal_hang_up_down } },
+ /* PLAYER_CSMODE_19 */ { -1, { func_80859CA0 } },
+ /* PLAYER_CSMODE_20 */ { -1, { func_808594D0 } },
+ /* PLAYER_CSMODE_21 */ { 3, { &gPlayerAnim_clink_demo_mimawasi } },
+ /* PLAYER_CSMODE_22 */ { 6, { &gPlayerAnim_om_get_mae } },
+ /* PLAYER_CSMODE_23 */ { 3, { &gPlayerAnim_link_demo_look_hand } },
+ /* PLAYER_CSMODE_24 */ { 3, { &gPlayerAnim_link_normal_wait_typeB_20f } },
+ /* PLAYER_CSMODE_25 */ { -1, { func_80859CFC } },
+ /* PLAYER_CSMODE_26 */ { -1, { func_8085A66C } },
+ /* PLAYER_CSMODE_27 */ { 3, { &gPlayerAnim_link_demo_zeldamiru } },
+ /* PLAYER_CSMODE_28 */ { 3, { &gPlayerAnim_link_demo_kenmiru1 } },
+ /* PLAYER_CSMODE_29 */ { 3, { &gPlayerAnim_link_demo_kenmiru2 } },
+ /* PLAYER_CSMODE_30 */ { 3, { &gPlayerAnim_link_demo_kenmiru2_modori } },
+ /* PLAYER_CSMODE_31 */ { 6, { &gameplay_keep_Linkanim_00D310 } },
+ /* PLAYER_CSMODE_32 */ { -1, { func_80859FCC } },
+ /* PLAYER_CSMODE_33 */ { 3, { &gPlayerAnim_demo_rakka } },
+ /* PLAYER_CSMODE_34 */ { 4, { &gPlayerAnim_demo_pikupiku } },
+ /* PLAYER_CSMODE_35 */ { 3, { &gameplay_keep_Linkanim_00D2B8 } },
+ /* PLAYER_CSMODE_36 */ { -1, { func_8085A120 } },
+ /* PLAYER_CSMODE_37 */ { -1, { func_8085A19C } },
+ /* PLAYER_CSMODE_38 */ { 6, { &gameplay_keep_Linkanim_00D278 } },
+ /* PLAYER_CSMODE_39 */ { 6, { &gameplay_keep_Linkanim_00D288 } },
+ /* PLAYER_CSMODE_40 */ { 5, { &gPlayerAnim_rakuba } },
+ /* PLAYER_CSMODE_41 */ { 5, { &gPlayerAnim_bajyo_furikaeru } },
+ /* PLAYER_CSMODE_42 */ { 5, { &gPlayerAnim_okiagaru } },
+ /* PLAYER_CSMODE_43 */ { 5, { &gPlayerAnim_okiagaru_tatu } },
+ /* PLAYER_CSMODE_44 */ { 7, { &gPlayerAnim_bajyo_walk } },
+ /* PLAYER_CSMODE_45 */ { 5, { &gPlayerAnim_rakka } },
+ /* PLAYER_CSMODE_46 */ { 5, { &gPlayerAnim_sirimochi } },
+ /* PLAYER_CSMODE_47 */ { 5, { &gPlayerAnim_spotlight } },
+ /* PLAYER_CSMODE_48 */ { 3, { &gPlayerAnim_al_hensin } },
+ /* PLAYER_CSMODE_49 */ { 5, { &gPlayerAnim_dl_jibunmiru } },
+ /* PLAYER_CSMODE_50 */ { 5, { &gPlayerAnim_vs_yousei } },
+ /* PLAYER_CSMODE_51 */ { 5, { &gPlayerAnim_urusai } },
+ /* PLAYER_CSMODE_52 */ { 5, { &gPlayerAnim_okarinatori } },
+ /* PLAYER_CSMODE_53 */ { 5, { &gPlayerAnim_lost_horse } },
+ /* PLAYER_CSMODE_54 */ { 4, { &gPlayerAnim_lost_horse_wait } },
+ /* PLAYER_CSMODE_55 */ { 5, { &gPlayerAnim_lost_horse2 } },
+ /* PLAYER_CSMODE_56 */ { 14, { &gPlayerAnim_okarinatori } },
+ /* PLAYER_CSMODE_57 */ { 5, { &gPlayerAnim_cl_tobikakaru } },
+ /* PLAYER_CSMODE_58 */ { -1, { func_8085978C } },
+ /* PLAYER_CSMODE_59 */ { 5, { &gameplay_keep_Linkanim_00D0A0 } },
+ /* PLAYER_CSMODE_60 */ { 2, { &gPlayerAnim_cl_furafura } },
+ /* PLAYER_CSMODE_61 */ { 7, { &gPlayerAnim_cl_nigeru } },
+ /* PLAYER_CSMODE_62 */ { 5, { &gPlayerAnim_cl_ononoki } },
+ /* PLAYER_CSMODE_63 */ { 3, { &gPlayerAnim_al_gaku } },
+ /* PLAYER_CSMODE_64 */ { 3, { &gPlayerAnim_al_fuwafuwa } },
+ /* PLAYER_CSMODE_65 */ { 3, { &gPlayerAnim_al_fuwafuwa_modori } },
+ /* PLAYER_CSMODE_66 */ { 3, { &gPlayerAnim_al_elf_tobidasi } },
+ /* PLAYER_CSMODE_67 */ { -1, { func_8085968C } },
+ /* PLAYER_CSMODE_68 */ { -1, { func_8085A24C } },
+ /* PLAYER_CSMODE_69 */ { -1, { func_8085A330 } },
+ /* PLAYER_CSMODE_70 */ { 7, { &gPlayerAnim_cl_tewofuru } },
+ /* PLAYER_CSMODE_71 */ { 5, { &gPlayerAnim_cl_jibun_miru } },
+ /* PLAYER_CSMODE_72 */ { 5, { &gPlayerAnim_cl_hoo } },
+ /* PLAYER_CSMODE_73 */ { 3, { &gPlayerAnim_al_yareyare } },
+ /* PLAYER_CSMODE_74 */ { 3, { &gPlayerAnim_al_yes } },
+ /* PLAYER_CSMODE_75 */ { 3, { &gPlayerAnim_al_no } },
+ /* PLAYER_CSMODE_76 */ { 3, { &gPlayerAnim_al_unun } },
+ /* PLAYER_CSMODE_77 */ { 7, { &gPlayerAnim_dl_yusaburu } },
+ /* PLAYER_CSMODE_78 */ { 5, { &gPlayerAnim_dl_kokeru } },
+ /* PLAYER_CSMODE_79 */ { 3, { &gPlayerAnim_alink_powerup } },
+ /* PLAYER_CSMODE_80 */ { 4, { &gPlayerAnim_alink_rakkatyu } },
+ /* PLAYER_CSMODE_81 */ { 3, { &gPlayerAnim_alink_kyoro } },
+ /* PLAYER_CSMODE_82 */ { 4, { &gPlayerAnim_alink_yurayura } },
+ /* PLAYER_CSMODE_83 */ { 3, { &gPlayerAnim_alink_somukeru } },
+ /* PLAYER_CSMODE_84 */ { 5, { &gPlayerAnim_alink_fukitobu } },
+ /* PLAYER_CSMODE_85 */ { 3, { &gameplay_keep_Linkanim_00CFC8 } },
+ /* PLAYER_CSMODE_86 */ { 4, { &gPlayerAnim_alink_tereru } },
+ /* PLAYER_CSMODE_87 */ { 5, { &gameplay_keep_Linkanim_00D1D0 } },
+ /* PLAYER_CSMODE_88 */ { 3, { &gPlayerAnim_alink_kaitenmiss } },
+ /* PLAYER_CSMODE_89 */ { 4, { &gameplay_keep_Linkanim_00CFC0 } },
+ /* PLAYER_CSMODE_90 */ { 4, { &gameplay_keep_Linkanim_00CFB8 } },
+ /* PLAYER_CSMODE_91 */ { 4, { &gameplay_keep_Linkanim_00D050 } },
+ /* PLAYER_CSMODE_92 */ { 4, { &gameplay_keep_Linkanim_00D048 } },
+ /* PLAYER_CSMODE_93 */ { -1, { func_8085A8C4 } },
+ /* PLAYER_CSMODE_94 */ { 3, { &gPlayerAnim_alink_ozigi } },
+ /* PLAYER_CSMODE_95 */ { 3, { &gPlayerAnim_alink_ozigi_modori } },
+ /* PLAYER_CSMODE_96 */ { 9, { &gPlayerAnim_link_normal_back_downA } },
+ /* PLAYER_CSMODE_97 */ { -1, { func_8085A530 } },
+ /* PLAYER_CSMODE_98 */ { 15, { &gPlayerAnim_cl_maskoff } },
+ /* PLAYER_CSMODE_99 */ { 7, { &gPlayerAnim_cl_kubisime } },
+ /* PLAYER_CSMODE_100 */ { 3, { &gPlayerAnim_alink_ee } },
+ /* PLAYER_CSMODE_101 */ { 3, { &gameplay_keep_Linkanim_00CFF0 } },
+ /* PLAYER_CSMODE_102 */ { -1, { func_8085A768 } },
+ /* PLAYER_CSMODE_103 */ { -1, { func_8085AA60 } },
+ /* PLAYER_CSMODE_104 */ { 5, { &gPlayerAnim_cl_dakisime } },
+ /* PLAYER_CSMODE_105 */ { 5, { &gPlayerAnim_kf_omen } },
+ /* PLAYER_CSMODE_106 */ { 5, { &gPlayerAnim_kf_dakiau } },
+ /* PLAYER_CSMODE_107 */ { 5, { &gPlayerAnim_kf_hanare } },
+ /* PLAYER_CSMODE_108 */ { 5, { &gPlayerAnim_kf_miseau } },
+ /* PLAYER_CSMODE_109 */ { 5, { &gPlayerAnim_kf_awase } },
+ /* PLAYER_CSMODE_110 */ { 7, { &gPlayerAnim_kf_tetunagu_loop } },
+ /* PLAYER_CSMODE_111 */ { 3, { &gPlayerAnim_link_keirei } },
+ /* PLAYER_CSMODE_112 */ { 5, { &gPlayerAnim_cl_umanoru } },
+ /* PLAYER_CSMODE_113 */ { 5, { &gPlayerAnim_cl_wakare } },
+ /* PLAYER_CSMODE_114 */ { 4, { &gPlayerAnim_alink_dance_loop } },
+ /* PLAYER_CSMODE_115 */ { 2, { &gPlayerAnim_link_demo_goma_furimuki } },
+ /* PLAYER_CSMODE_116 */ { 7, { &gPlayerAnim_link_uma_anim_fastrun } },
+ /* PLAYER_CSMODE_117 */ { 5, { &gPlayerAnim_cl_umamiage } },
+ /* PLAYER_CSMODE_118 */ { 7, { &gPlayerAnim_demo_suwari1 } },
+ /* PLAYER_CSMODE_119 */ { 7, { &gPlayerAnim_demo_suwari2 } },
+ /* PLAYER_CSMODE_120 */ { 7, { &gPlayerAnim_demo_suwari3 } },
+ /* PLAYER_CSMODE_121 */ { -1, { func_80859990 } },
+ /* PLAYER_CSMODE_122 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_123 */ { -1, { func_80859A10 } },
+ /* PLAYER_CSMODE_124 */ { 7, { &gPlayerAnim_clink_demo_get1 } },
+ /* PLAYER_CSMODE_125 */ { 5, { &gPlayerAnim_clink_demo_get2 } },
+ /* PLAYER_CSMODE_126 */ { 5, { &gPlayerAnim_clink_demo_get3 } },
+ /* PLAYER_CSMODE_127 */ { 3, { &gPlayerAnim_link_demo_gurad } },
+ /* PLAYER_CSMODE_128 */ { 4, { &gPlayerAnim_link_demo_sita_wait } },
+ /* PLAYER_CSMODE_129 */ { 3, { &gPlayerAnim_L_1kyoro } },
+ /* PLAYER_CSMODE_130 */ { 3, { &gPlayerAnim_L_2kyoro } },
+ /* PLAYER_CSMODE_131 */ { 3, { &gPlayerAnim_L_sagaru } },
+ /* PLAYER_CSMODE_132 */ { 3, { &gPlayerAnim_L_bouzen } },
+ /* PLAYER_CSMODE_133 */ { 3, { &gPlayerAnim_L_kamaeru } },
+ /* PLAYER_CSMODE_134 */ { 3, { &gPlayerAnim_L_hajikareru } },
+ /* PLAYER_CSMODE_135 */ { 3, { &gPlayerAnim_L_ken_miru } },
+ /* PLAYER_CSMODE_136 */ { 3, { &gPlayerAnim_L_mukinaoru } },
+ /* PLAYER_CSMODE_137 */ { 3, { &gPlayerAnim_link_demo_return_to_past } },
+ /* PLAYER_CSMODE_138 */ { 3, { &gPlayerAnim_link_last_hit_motion1 } },
+ /* PLAYER_CSMODE_139 */ { 3, { &gPlayerAnim_link_last_hit_motion2 } },
+};
+
+struct_8085DA94 D_8085DEF4[PLAYER_CSMODE_MAX] = {
+ /* PLAYER_CSMODE_0 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_1 */ { -1, { func_80859414 } },
+ /* PLAYER_CSMODE_2 */ { -1, { func_80859AD0 } },
+ /* PLAYER_CSMODE_3 */ { -1, { func_80859B28 } },
+ /* PLAYER_CSMODE_4 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_5 */ { -1, { func_8085ADA0 } },
+ /* PLAYER_CSMODE_END */ { -1, { func_8085AACC } },
+ /* PLAYER_CSMODE_WAIT */ { -1, { func_808595B8 } },
+ /* PLAYER_CSMODE_8 */ { 18, { D_8085DA70 } },
+ /* PLAYER_CSMODE_9 */ { -1, { func_80859890 } },
+ /* PLAYER_CSMODE_10 */ { -1, { func_80859C60 } },
+ /* PLAYER_CSMODE_11 */ { 18, { D_8085D9E0 } },
+ /* PLAYER_CSMODE_12 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_13 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_14 */ { 0, { NULL } },
+ /* PLAYER_CSMODE_15 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_16 */ { 17, { &gPlayerAnim_link_normal_okarina_swing } },
+ /* PLAYER_CSMODE_17 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_18 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_19 */ { -1, { func_8085A710 } },
+ /* PLAYER_CSMODE_20 */ { -1, { func_808595B8 } },
+ /* PLAYER_CSMODE_21 */ { 12, { &gPlayerAnim_clink_demo_mimawasi_wait } },
+ /* PLAYER_CSMODE_22 */ { -1, { func_80859D70 } },
+ /* PLAYER_CSMODE_23 */ { 12, { &gPlayerAnim_link_demo_look_hand_wait } },
+ /* PLAYER_CSMODE_24 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_25 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_26 */ { -1, { func_8085A6C0 } },
+ /* PLAYER_CSMODE_27 */ { 12, { &gPlayerAnim_link_demo_zeldamiru_wait } },
+ /* PLAYER_CSMODE_28 */ { 12, { &gPlayerAnim_link_demo_kenmiru1_wait } },
+ /* PLAYER_CSMODE_29 */ { 12, { &gPlayerAnim_link_demo_kenmiru2_wait } },
+ /* PLAYER_CSMODE_30 */ { 12, { &gPlayerAnim_demo_link_nwait } },
+ /* PLAYER_CSMODE_31 */ { 12, { &gameplay_keep_Linkanim_00D318 } },
+ /* PLAYER_CSMODE_32 */ { -1, { func_80859FF4 } },
+ /* PLAYER_CSMODE_33 */ { -1, { Player_Cutscene_TranslateReverse } },
+ /* PLAYER_CSMODE_34 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_35 */ { 12, { &gameplay_keep_Linkanim_00D2C0 } },
+ /* PLAYER_CSMODE_36 */ { -1, { func_8085A144 } },
+ /* PLAYER_CSMODE_37 */ { -1, { func_8085A1D4 } },
+ /* PLAYER_CSMODE_38 */ { 12, { &gameplay_keep_Linkanim_00D280 } },
+ /* PLAYER_CSMODE_39 */ { 12, { &gameplay_keep_Linkanim_00D290 } },
+ /* PLAYER_CSMODE_40 */ { 18, { D_8085D9F0 } },
+ /* PLAYER_CSMODE_41 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_42 */ { 18, { D_8085DA00 } },
+ /* PLAYER_CSMODE_43 */ { 13, { &gPlayerAnim_okiagaru_wait } },
+ /* PLAYER_CSMODE_44 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_45 */ { 18, { D_8085DA2C } },
+ /* PLAYER_CSMODE_46 */ { 12, { &gPlayerAnim_sirimochi_wait } },
+ /* PLAYER_CSMODE_47 */ { 12, { &gPlayerAnim_spotlight_wait } },
+ /* PLAYER_CSMODE_48 */ { 12, { &gPlayerAnim_al_hensin_loop } },
+ /* PLAYER_CSMODE_49 */ { 12, { &gPlayerAnim_dl_jibunmiru_wait } },
+ /* PLAYER_CSMODE_50 */ { 18, { D_8085DA50 } },
+ /* PLAYER_CSMODE_51 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_52 */ { 18, { D_8085D9FC } },
+ /* PLAYER_CSMODE_53 */ { 12, { &gPlayerAnim_lost_horse_wait } },
+ /* PLAYER_CSMODE_54 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_55 */ { 18, { D_8085DA1C } },
+ /* PLAYER_CSMODE_56 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_57 */ { 18, { D_8085DA0C } },
+ /* PLAYER_CSMODE_58 */ { -1, { func_808599DC } },
+ /* PLAYER_CSMODE_59 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_60 */ { 18, { D_8085DA28 } },
+ /* PLAYER_CSMODE_61 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_62 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_63 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_64 */ { 12, { &gPlayerAnim_al_fuwafuwa_loop } },
+ /* PLAYER_CSMODE_65 */ { -1, { func_8085A40C } },
+ /* PLAYER_CSMODE_66 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_67 */ { -1, { func_80859708 } },
+ /* PLAYER_CSMODE_68 */ { -1, { func_8085A2AC } },
+ /* PLAYER_CSMODE_69 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_70 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_71 */ { -1, { func_8085A40C } },
+ /* PLAYER_CSMODE_72 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_73 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_74 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_75 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_76 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_77 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_78 */ { 18, { D_8085DA78 } },
+ /* PLAYER_CSMODE_79 */ { 12, { &gPlayerAnim_alink_powerup_loop } },
+ /* PLAYER_CSMODE_80 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_81 */ { 12, { &gPlayerAnim_alink_kyoro_loop } },
+ /* PLAYER_CSMODE_82 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_83 */ { 12, { &gPlayerAnim_alink_somukeru_loop } },
+ /* PLAYER_CSMODE_84 */ { 18, { D_8085DA80 } },
+ /* PLAYER_CSMODE_85 */ { 12, { &gameplay_keep_Linkanim_00CFD0 } },
+ /* PLAYER_CSMODE_86 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_87 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_88 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_89 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_90 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_91 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_92 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_93 */ { -1, { func_8085A940 } },
+ /* PLAYER_CSMODE_94 */ { 12, { &gPlayerAnim_alink_ozigi_loop } },
+ /* PLAYER_CSMODE_95 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_96 */ { -1, { func_8085A4A4 } },
+ /* PLAYER_CSMODE_97 */ { -1, { func_8085A5DC } },
+ /* PLAYER_CSMODE_98 */ { -1, { func_8085AA84 } },
+ /* PLAYER_CSMODE_99 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_100 */ { 12, { &gPlayerAnim_alink_ee_loop } },
+ /* PLAYER_CSMODE_101 */ { 12, { &gameplay_keep_Linkanim_00CFF8 } },
+ /* PLAYER_CSMODE_102 */ { -1, { func_8085A7C0 } },
+ /* PLAYER_CSMODE_103 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_104 */ { 13, { &gPlayerAnim_cl_dakisime_loop } },
+ /* PLAYER_CSMODE_105 */ { 13, { &gPlayerAnim_kf_omen_loop } },
+ /* PLAYER_CSMODE_106 */ { 13, { &gPlayerAnim_kf_dakiau_loop } },
+ /* PLAYER_CSMODE_107 */ { 13, { &gPlayerAnim_kf_hanare_loop } },
+ /* PLAYER_CSMODE_108 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_109 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_110 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_111 */ { 12, { &gPlayerAnim_link_kei_wait } },
+ /* PLAYER_CSMODE_112 */ { 13, { &gPlayerAnim_cl_umanoru_loop } },
+ /* PLAYER_CSMODE_113 */ { 13, { &gPlayerAnim_cl_wakare_loop } },
+ /* PLAYER_CSMODE_114 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_115 */ { -1, { func_8085AA10 } },
+ /* PLAYER_CSMODE_116 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_117 */ { -1, { func_8085A364 } },
+ /* PLAYER_CSMODE_118 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_119 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_120 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_121 */ { -1, { func_808599DC } },
+ /* PLAYER_CSMODE_122 */ { -1, { func_80859AF8 } },
+ /* PLAYER_CSMODE_123 */ { -1, { func_80859A44 } },
+ /* PLAYER_CSMODE_124 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_125 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_126 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_127 */ { 12, { &gPlayerAnim_link_demo_gurad_wait } },
+ /* PLAYER_CSMODE_128 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_129 */ { 12, { &gPlayerAnim_L_kw } },
+ /* PLAYER_CSMODE_130 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_131 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_132 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_133 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_134 */ { -1, { func_80859D44 } },
+ /* PLAYER_CSMODE_135 */ { 11, { NULL } },
+ /* PLAYER_CSMODE_136 */ { 12, { &gPlayerAnim_L_kennasi_w } },
+ /* PLAYER_CSMODE_137 */ { -1, { func_80859EBC } },
+ /* PLAYER_CSMODE_138 */ { -1, { func_80859F4C } },
+ /* PLAYER_CSMODE_139 */ { -1, { func_80859F4C } },
+};
+
+PlayerAnimationHeader* D_8085E354[PLAYER_FORM_MAX] = {
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_FIERCE_DEITY
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_GORON
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_ZORA
+ &gPlayerAnim_L_okarina_get, // PLAYER_FORM_DEKU
+ &gPlayerAnim_om_get, // PLAYER_FORM_HUMAN
+};
+
+struct_8085E368 D_8085E368[PLAYER_FORM_MAX] = {
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_FIERCE_DEITY
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_GORON
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_ZORA
+ { { -200, 700, 100 }, { 800, 600, 800 } }, // PLAYER_FORM_DEKU
+ { { -200, 500, 0 }, { 600, 400, 600 } }, // PLAYER_FORM_HUMAN
+};
+
+Color_RGBA8 D_8085E3A4 = { 255, 255, 255, 0 };
+Color_RGBA8 D_8085E3A8 = { 0, 128, 128, 0 };
+
+void func_80859D70(PlayState* play, Player* this, UNK_TYPE arg2) {
+ struct_8085E368* posInfo;
+ Vec3f effectPos;
+ Vec3f randPos;
+
+ func_808591BC(play, this, D_8085E354[this->transformation]);
+
+ if (this->rightHandType != 0xFF) {
+ this->rightHandType = 0xFF;
+ } else {
+ posInfo = &D_8085E368[this->transformation];
+ randPos.x = Rand_CenteredFloat(posInfo->range.x) + posInfo->base.x;
+ randPos.y = Rand_CenteredFloat(posInfo->range.y) + posInfo->base.y;
+ randPos.z = Rand_CenteredFloat(posInfo->range.z) + posInfo->base.z;
+ SkinMatrix_Vec3fMtxFMultXYZ(&this->shieldMf, &randPos, &effectPos);
+ EffectSsKirakira_SpawnDispersed(play, &effectPos, &gZeroVec3f, &gZeroVec3f, &D_8085E3A4, &D_8085E3A8, 600, -10);
+ }
+}
+
+void func_80859EBC(PlayState* play, Player* this, s32 arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8085AACC(play, this, arg2);
+ } else if (this->unk_AE8 == 0) {
+ Item_Give(play, ITEM_SWORD_RAZOR);
+ func_80841358(play, this, false);
+ } else {
+ func_808484CC(this);
+ }
+}
+
+void func_80859F4C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8083FCF0(play, this, 0.0f, 99.0f, this->skelAnime.endFrame - 8.0f);
+ }
+ if (this->heldItemAction != PLAYER_IA_SWORD_GILDED) {
+ func_80841358(play, this, true);
+ }
+}
+
+void func_80859FCC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->transformation != PLAYER_FORM_DEKU) {
+ gSaveContext.save.playerForm = PLAYER_FORM_DEKU;
+ }
+}
+
+void func_80859FF4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (gSaveContext.save.playerForm != this->transformation) {
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ }
+}
+
+void Player_Cutscene_TranslateReverse(PlayState* play, Player* this, void* arg) {
+ CsCmdActorCue* playerAction = arg;
+ f32 xEnd = playerAction->endPos.x;
+ f32 yEnd = playerAction->endPos.y;
+ f32 zEnd = playerAction->endPos.z;
+ f32 xDiff;
+ f32 yDiff;
+ f32 zDiff;
+ f32 progress;
+
+ xDiff = playerAction->startPos.x - xEnd;
+ yDiff = playerAction->startPos.y - yEnd;
+ zDiff = playerAction->startPos.z - zEnd;
+
+ progress = ((f32)(playerAction->endFrame - play->csCtx.curFrame)) /
+ ((f32)(playerAction->endFrame - playerAction->startFrame));
+
+ this->actor.world.pos.x = (xDiff * progress) + xEnd;
+ this->actor.world.pos.y = (yDiff * progress) + yEnd;
+ this->actor.world.pos.z = (zDiff * progress) + zEnd;
+ PlayerAnimation_Update(play, &this->skelAnime);
+}
+
+void func_8085A120(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (this->transformation != PLAYER_FORM_FIERCE_DEITY) {
+ gSaveContext.save.playerForm = PLAYER_FORM_FIERCE_DEITY;
+ }
+}
+
+void func_8085A144(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ if (gSaveContext.save.playerForm != this->transformation) {
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ }
+}
+
+void func_8085A19C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_demo_rakka);
+ this->unk_AAA = -0x8000;
+}
+
+void func_8085A1D4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ this->actor.gravity = 0.0f;
+ Math_StepToF(&this->actor.velocity.y, -this->actor.terminalVelocity, -((f32)REG(68) / 100.0f));
+}
+
+void func_8085A24C(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_8082DB90(play, this, D_8085D17C[this->transformation]);
+ this->itemAction = PLAYER_IA_OCARINA;
+ Player_SetModels(this, Player_ActionToModelGroup(this, this->itemAction));
+}
+
+void func_8085A2AC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if ((PlayerAnimation_Update(play, &this->skelAnime)) &&
+ (this->skelAnime.animation == D_8085D17C[this->transformation])) {
+ func_808525C4(play, this);
+ return;
+ }
+ if (this->unk_AE8 != 0) {
+ func_8085255C(play, this);
+ }
+}
+
+void func_8085A330(PlayState* play, Player* this, UNK_TYPE arg2) {
+ Player_AnimationPlayOnceReverse(play, this, D_8085D17C[this->transformation]);
+}
+
+void func_8085A364(PlayState* play, Player* this, void* arg2) {
+ Player_Cutscene_Translate(play, this, arg2);
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_8082EB18(play, this, &gPlayerAnim_cl_umamiage_loop);
+ }
+
+ if (this->skelAnime.animation == &gPlayerAnim_cl_nigeru) {
+ Player_PlayAnimSfx(this, D_8085DA48);
+ } else if (this->skelAnime.animation == &gPlayerAnim_alink_rakkatyu) {
+ func_800B8F98(&this->actor, NA_SE_PL_FLYING_AIR - SFX_FLAG);
+ } else {
+ func_80858FE8(this);
+ }
+}
+
+void func_8085A40C(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ func_80859CA0(play, this, arg2);
+ } else if (this->skelAnime.animation == &gPlayerAnim_al_fuwafuwa_modori) {
+ Player_PlayAnimSfx(this, D_8085DA88);
+ } else if (this->skelAnime.animation == &gPlayerAnim_cl_jibun_miru) {
+ Player_PlayAnimSfx(this, D_8085DA8C);
+ }
+}
+
+void func_8085A4A4(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (this->unk_AE8 == 0) &&
+ (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_back_downB);
+ this->unk_AE8 = 1;
+ }
+ if (this->unk_AE8 != 0) {
+ func_80832F24(this);
+ }
+}
+
+void func_8085A530(PlayState* play, Player* this, void* arg2) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_normal_give_other, 1.0f,
+ (play->sceneId == SCENE_ALLEY) ? IREG(56) : 0.0f,
+ Animation_GetLastFrame(&gPlayerAnim_link_normal_give_other), ANIMMODE_ONCE, -8.0f);
+}
+
+void func_8085A5DC(PlayState* play, Player* this, void* arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8++ >= 0x15) {
+ PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pz_wait, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP,
+ -16.0f);
+ }
+ }
+}
+
+void func_8085A66C(PlayState* play, Player* this, void* arg2) {
+ if (func_801242B4(this)) {
+ func_8085929C(play, this, 0);
+ } else {
+ func_80858E40(play, this, &gPlayerAnim_link_demo_kousan);
+ }
+}
+
+void func_8085A6C0(PlayState* play, Player* this, void* anim) {
+ if (func_801242B4(this)) {
+ func_80859300(play, this, 0);
+ } else {
+ func_80858FBC(play, this, anim);
+ }
+}
+
+void func_8085A710(PlayState* play, Player* this, void* anim) {
+ func_80858FBC(play, this, anim);
+ if (func_8083D23C(this, play)) {
+ play->csCtx.state = CS_STATE_STOP;
+ CutsceneManager_Stop(CutsceneManager_GetCurrentCsId());
+ }
+}
+
+void func_8085A768(PlayState* play, Player* this, void* arg2) {
+ func_80838830(this, OBJECT_GI_RESERVE_C_01);
+ func_80858E40(play, this, &gPlayerAnim_link_normal_give_other);
+ this->stateFlags2 &= ~PLAYER_STATE2_1000000;
+}
+
+void func_8085A7C0(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ if (this->unk_AE8 == 0) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) ||
+ (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) {
+ this->getItemDrawIdPlusOne = GID_NONE + 1;
+ this->unk_AE8 = -1;
+ } else {
+ this->getItemDrawIdPlusOne = GID_PENDANT_OF_MEMORIES + 1;
+ }
+ } else if (this->unk_AE8 < 0) {
+ if (Actor_HasParent(&this->actor, play)) {
+ this->actor.parent = NULL;
+ this->unk_AE8 = 1;
+ } else {
+ Actor_OfferGetItem(&this->actor, play, GI_PENDANT_OF_MEMORIES, 9999.9f, 9999.9f);
+ }
+ }
+ } else if (PlayerAnimation_OnFrame(&this->skelAnime, 4.0f)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES);
+ }
+}
+
+void func_8085A8C4(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if ((this->transformation != PLAYER_FORM_HUMAN) && (play->roomCtx.curRoom.behaviorType1 == ROOM_BEHAVIOR_TYPE1_5)) {
+ R_PLAY_FILL_SCREEN_ON = 45;
+ R_PLAY_FILL_SCREEN_R = 255;
+ R_PLAY_FILL_SCREEN_G = 255;
+ R_PLAY_FILL_SCREEN_B = 255;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ play_sound(NA_SE_SY_WHITE_OUT_T);
+ }
+}
+
+void func_8085A940(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (R_PLAY_FILL_SCREEN_ON > 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA > 255) {
+ R_PLAY_FILL_SCREEN_ON = -64;
+ R_PLAY_FILL_SCREEN_ALPHA = 255;
+ gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
+ this->actor.update = func_8012301C;
+ this->actor.draw = NULL;
+ this->unk_AE7 = 0;
+ }
+ } else if (R_PLAY_FILL_SCREEN_ON < 0) {
+ R_PLAY_FILL_SCREEN_ALPHA += R_PLAY_FILL_SCREEN_ON;
+ if (R_PLAY_FILL_SCREEN_ALPHA < 0) {
+ R_PLAY_FILL_SCREEN_ON = 0;
+ R_PLAY_FILL_SCREEN_ALPHA = 0;
+ }
+ } else {
+ PlayerAnimation_Update(play, &this->skelAnime);
+ }
+}
+
+void func_8085AA10(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime) && (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR)) {
+ CutsceneManager_Stop(CS_ID_GLOBAL_DOOR);
+ }
+}
+
+void func_8085AA60(PlayState* play, Player* this, UNK_TYPE arg2) {
+ func_80848640(play, this);
+}
+
+void func_8085AA84(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (PlayerAnimation_Update(play, &this->skelAnime)) {
+ this->stateFlags2 |= PLAYER_STATE2_1000000;
+ }
+}
+
+void func_8085AACC(PlayState* play, Player* this, UNK_TYPE arg2) {
+ if (func_801242B4(this)) {
+ func_808353DC(play, this);
+ func_8082DC64(play, this);
+ } else {
+ func_80839ED0(this, play);
+ if (!func_808391D8(this, play)) {
+ func_8083D23C(this, play);
+ }
+ }
+
+ this->csMode = PLAYER_CSMODE_0;
+ this->unk_AA5 = PLAYER_UNKAA5_0;
+}
+
+void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* playerAction) {
+ this->actor.world.pos.x = playerAction->startPos.x;
+ this->actor.world.pos.y = playerAction->startPos.y;
+ this->actor.world.pos.z = playerAction->startPos.z;
+
+ this->currentYaw = this->actor.shape.rot.y = playerAction->rot.y;
+}
+
+void Player_Cutscene_8085ABA8(Player* this, CsCmdActorCue* playerAction) {
+ f32 xDiff = playerAction->startPos.x - (s32)this->actor.world.pos.x;
+ f32 yDiff = playerAction->startPos.y - (s32)this->actor.world.pos.y;
+ f32 zDiff = playerAction->startPos.z - (s32)this->actor.world.pos.z;
+ f32 dist;
+ s16 temp_v0;
+
+ temp_v0 = (s16)playerAction->rot.y - this->actor.shape.rot.y;
+ dist = sqrtf(SQ(xDiff) + SQ(yDiff) + SQ(zDiff));
+ if (this->linearVelocity == 0.0f) {
+ if ((dist > 50.0f) || (ABS_ALT(temp_v0) > 0x4000)) {
+ Player_Cutscene_SetPosAndYawToStart(this, playerAction);
+ }
+ }
+
+ this->skelAnime.moveFlags = 0;
+ func_8082E784(this);
+}
+
+void func_8085AC9C(PlayState* play, Player* this, CsCmdActorCue* cue, struct_8085DA94* arg3) {
+ if (arg3->type > 0) {
+ D_8085D990[arg3->type](play, this, arg3->anim);
+ } else if (arg3->type < 0) {
+ arg3->func(play, this, cue);
+ }
+
+ if ((D_80862B6C & 4) && !(this->skelAnime.moveFlags & ANIM_FLAG_4)) {
+ this->skelAnime.morphTable[PLAYER_LIMB_ROOT - 1].y /= this->ageProperties->unk_08;
+ D_80862B6C = 0;
+ }
+}
+
+void func_8085AD5C(PlayState* play, Player* this, PlayerCsMode csMode) {
+ if ((csMode != PLAYER_CSMODE_1) && (csMode != PLAYER_CSMODE_WAIT) && (csMode != PLAYER_CSMODE_20) &&
+ (csMode != PLAYER_CSMODE_END)) {
+ func_8082DCA0(play, this);
+ }
+}
+
+void func_8085ADA0(PlayState* play, Player* this, s32 arg2) {
+ CsCmdActorCue* cue = (this->actor.id == ACTOR_EN_TEST3)
+ ? play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_506)]
+ : play->csCtx.playerCue;
+ s32 var_a0 = false;
+ s32 pad;
+ s32 csMode;
+
+ if ((play->csCtx.state == CS_STATE_IDLE) || (play->csCtx.state == CS_STATE_STOP) ||
+ (play->csCtx.state == CS_STATE_RUN_UNSTOPPABLE)) {
+ if ((D_8085D384[this->unk_396] == PLAYER_CSMODE_68) && (play->sceneId == SCENE_OKUJOU)) {
+ this->unk_AA5 = PLAYER_UNKAA5_5;
+
+ if (func_80838A90(this, play)) {
+ this->csMode = PLAYER_CSMODE_0;
+ }
+ return;
+ } else {
+ var_a0 = true;
+
+ if (D_8085D384[this->unk_396] != PLAYER_CSMODE_16) {
+ this->csMode = PLAYER_CSMODE_END;
+ func_800B7298(play, NULL, PLAYER_CSMODE_END);
+ this->unk_396 = 0;
+ Player_StopHorizontalMovement(this);
+ return;
+ }
+ }
+ }
+
+ if (!var_a0 && (cue == NULL)) {
+ this->actor.flags &= ~ACTOR_FLAG_40;
+ return;
+ }
+
+ if (!var_a0 && (this->unk_396 != cue->id)) {
+ csMode = D_8085D384[cue->id];
+
+ if ((csMode >= PLAYER_CSMODE_0) && (gDisablePlayerCsModeStartPos == 0)) {
+ if ((csMode == PLAYER_CSMODE_2) || (csMode == PLAYER_CSMODE_3)) {
+ Player_Cutscene_8085ABA8(this, cue);
+ } else {
+ Player_Cutscene_SetPosAndYawToStart(this, cue);
+ }
+ }
+
+ if (csMode == PLAYER_CSMODE_108) {
+ this->stateFlags3 |= PLAYER_STATE3_20000000;
+ } else if (csMode == PLAYER_CSMODE_110) {
+ this->stateFlags3 &= ~PLAYER_STATE3_20000000;
+ }
+
+ D_80862B6C = this->skelAnime.moveFlags;
+
+ func_8082E794(this);
+ func_8085AD5C(play, this, ABS_ALT(csMode));
+ func_8085AC9C(play, this, cue, &D_8085DA94[ABS_ALT(csMode)]);
+
+ this->unk_AE8 = 0;
+ this->unk_AE7 = 0;
+ this->unk_396 = cue->id;
+ }
+
+ csMode = D_8085D384[this->unk_396];
+ func_8085AC9C(play, this, cue, &D_8085DEF4[ABS_ALT(csMode)]);
+
+ if ((u16)cue->rot.x != 0) {
+ Math_SmoothStepToS(&this->actor.focus.rot.x, (u16)cue->rot.x, 4, 0x2710, 0);
+ func_80832754(this, false);
+ }
+}
+
+void func_8085B08C(Player* this, PlayState* play) {
+ if (this->csMode != this->prevCsMode) {
+ D_80862B6C = this->skelAnime.moveFlags;
+ func_8082E794(this);
+
+ this->prevCsMode = this->csMode;
+ func_8085AD5C(play, this, this->csMode);
+ func_8085AC9C(play, this, NULL, &D_8085DA94[this->csMode]);
+ }
+
+ func_8085AC9C(play, this, NULL, &D_8085DEF4[this->csMode]);
+}
+
+s32 Player_StartFishing(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+
+ func_8082DE50(play, player);
+ func_80831990(play, player, ITEM_FISHING_ROD);
+ return 1;
+}
+
+// Player_GrabPlayerImpl? Player_GrabPlayerNoChecks?
+void func_8085B170(PlayState* play, Player* this) {
+ func_8082DE50(play, this);
+ Player_SetAction(play, this, func_80853CC0, 0);
+ Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_normal_re_dead_attack);
+ this->stateFlags2 |= PLAYER_STATE2_80;
+ func_8082DAD4(this);
+ Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HELD);
+}
+
+s32 Player_GrabPlayer(PlayState* play, Player* player) {
+ if (!Player_InBlockingCsMode(play, player) && (player->invincibilityTimer >= 0) && !func_801240DC(player)) {
+ if (!(player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_100000 |
+ PLAYER_STATE1_200000 | PLAYER_STATE1_800000))) {
+ if (!(player->stateFlags2 & PLAYER_STATE2_80) && !(player->stateFlags3 & PLAYER_STATE3_80)) {
+ func_8085B170(play, player);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+s32 func_8085B28C(PlayState* play, Player* this, PlayerCsMode csMode) {
+ Player* player = GET_PLAYER(play);
+
+ if (this != NULL) {
+ if (csMode == PLAYER_CSMODE_0) {
+ return func_8084E034 == this->actionFunc;
+ }
+
+ if ((this->actor.id == ACTOR_EN_TEST3) && (csMode < 0)) {
+ func_8083B0E4(play, this, this->actor.home.rot.y);
+ return false;
+ }
+
+ if (this->actor.id == ACTOR_EN_TEST3) {
+ player = this;
+ }
+ }
+
+ if ((player->actor.id == ACTOR_EN_TEST3) || !Player_InBlockingCsMode(play, player)) {
+ func_8082DE50(play, player);
+ Player_SetAction(play, player, func_8085B08C, 0);
+ player->csMode = csMode;
+ player->unk_398 = &this->actor;
+ func_8082DAD4(player);
+
+ return true;
+ }
+
+ return false;
+}
+
+void func_8085B384(Player* this, PlayState* play) {
+ Player_SetAction(play, this, func_80849FE0, 1);
+ func_8082E438(play, this, func_8082ED20(this));
+ this->currentYaw = this->actor.shape.rot.y;
+}
+
+/**
+ * Returns true if Player's health reaches zero
+ */
+s32 Player_InflictDamage(PlayState* play, s32 damage) {
+ Player* player = GET_PLAYER(play);
+
+ if ((player->stateFlags2 & PLAYER_STATE2_80) || !Player_InBlockingCsMode(play, player)) {
+ if (func_808339D4(play, player, damage) == 0) {
+ player->stateFlags2 &= ~PLAYER_STATE2_80;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Start talking with the given actor
+void Player_TalkWithPlayer(PlayState* play, Actor* actor) {
+ s32 pad;
+ Player* player = GET_PLAYER(play);
+
+ func_808323C0(player, CS_ID_GLOBAL_TALK);
+ if ((player->talkActor != NULL) || (actor == player->tatlActor) ||
+ CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_1 | ACTOR_FLAG_40000)) {
+ actor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+
+ player->talkActor = actor;
+ player->exchangeItemId = PLAYER_IA_NONE;
+ player->targetedActor = actor;
+
+ if (actor->textId == 0xFFFF) {
+ func_800B7298(play, actor, PLAYER_CSMODE_1);
+ actor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ func_8082DE14(play, player);
+ } else {
+ if (player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) {
+ player->actor.textId = 0;
+ } else {
+ player->actor.flags |= ACTOR_FLAG_TALK_REQUESTED;
+ player->actor.textId = actor->textId;
+ }
+
+ if (player->stateFlags1 & PLAYER_STATE1_800000) {
+ s32 sp24 = player->unk_AE8;
+
+ func_8082DE14(play, player);
+ func_80837B60(play, player);
+ player->unk_AE8 = sp24;
+ } else {
+ if (func_801242B4(player)) {
+ func_80832558(play, player, func_80837B60);
+ func_8082E634(play, player, &gPlayerAnim_link_swimer_swim_wait);
+ } else if ((actor->category != ACTORCAT_NPC) || (player->heldItemAction == PLAYER_IA_FISHING_ROD)) {
+ func_80837B60(play, player);
+
+ if (!func_80123420(player)) {
+ if ((actor != player->tatlActor) && (actor->xzDistToPlayer < (actor->colChkInfo.cylRadius + 40))) {
+ func_8082DB90(play, player, &gPlayerAnim_link_normal_backspace);
+ } else {
+ Player_AnimationPlayLoop(play, player, func_8082ED20(player));
+ }
+ }
+ } else {
+ func_80832558(play, player, func_80837B60);
+ func_8082DB90(play, player,
+ (actor->xzDistToPlayer < (actor->colChkInfo.cylRadius + 40))
+ ? &gPlayerAnim_link_normal_backspace
+ : &gPlayerAnim_link_normal_talk_free);
+ }
+
+ if (player->skelAnime.animation == &gPlayerAnim_link_normal_backspace) {
+ func_8082E920(play, player, ANIM_FLAG_1 | ANIM_FLAG_8 | ANIM_FLAG_NOMOVE);
+ }
+ func_8082DAD4(player);
+ }
+
+ player->stateFlags1 |= PLAYER_STATE1_40 | PLAYER_STATE1_20000000;
+ }
+
+ if ((player->tatlActor == player->talkActor) && ((player->talkActor->textId & 0xFF00) != 0x200)) {
+ player->tatlActor->flags |= ACTOR_FLAG_TALK_REQUESTED;
+ }
+}
+
+void func_8085B74C(PlayState* play) {
+ Player* player = GET_PLAYER(play);
+ f32 temp_fv1;
+ f32 linearVelocity = player->linearVelocity;
+
+ if (linearVelocity < 0.0f) {
+ linearVelocity = -linearVelocity;
+ player->actor.world.rot.y += 0x8000;
+ }
+
+ temp_fv1 = R_RUN_SPEED_LIMIT / 100.0f;
+
+ if (temp_fv1 < linearVelocity) {
+ gSaveContext.entranceSpeed = temp_fv1;
+ } else {
+ gSaveContext.entranceSpeed = linearVelocity;
+ }
+
+ func_80835324(play, player, 400.0f,
+ (sPlayerConveyorSpeedIndex != CONVEYOR_SPEED_DISABLED) ? D_80862B16 : player->actor.world.rot.y);
+ player->stateFlags1 |= (PLAYER_STATE1_1 | PLAYER_STATE1_20000000);
+}
+
+void func_8085B820(PlayState* play, s16 arg1) {
+ Player* player = GET_PLAYER(play);
+
+ player->actor.focus.rot.y = arg1;
+ func_80836D8C(player);
+}
+
+PlayerItemAction func_8085B854(PlayState* play, Player* player, ItemId itemId) {
+ PlayerItemAction itemAction = Player_ItemToItemAction(player, itemId);
+
+ if ((itemAction >= PLAYER_IA_MASK_MIN) && (itemAction <= PLAYER_IA_MASK_MAX) &&
+ (itemAction == GET_IA_FROM_MASK(player->currentMask))) {
+ itemAction = PLAYER_IA_NONE;
+ }
+
+ if ((itemAction <= PLAYER_IA_NONE) || (itemAction >= PLAYER_IA_MAX)) {
+ return PLAYER_IA_MINUS1;
+ }
+
+ player->itemAction = PLAYER_IA_NONE;
+ player->actionFunc = NULL;
+ func_80831760(play, player, func_80853A5C, 0);
+ player->csId = CS_ID_GLOBAL_TALK;
+ player->itemAction = itemAction;
+ Player_AnimationPlayOnce(play, player, &gPlayerAnim_link_normal_give_other);
+ player->stateFlags1 |= (PLAYER_STATE1_40 | PLAYER_STATE1_20000000);
+ player->getItemDrawIdPlusOne = GID_NONE + 1;
+ player->exchangeItemId = itemAction;
+
+ return itemAction;
+}
+
+s32 func_8085B930(PlayState* play, PlayerAnimationHeader* talkAnim, AnimationMode animMode) {
+ Player* player = GET_PLAYER(play);
+
+ if (!(player->actor.flags & ACTOR_FLAG_TALK_REQUESTED)) {
+ return false;
+ }
+
+ PlayerAnimation_Change(play, &player->skelAnime, (talkAnim == NULL) ? func_8082ED20(player) : talkAnim, 2.0f / 3.0f,
+ 0.0f, Animation_GetLastFrame(talkAnim), animMode, -6.0f);
+ return true;
+}
diff --git a/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c b/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c
index ef88015b7..e63d414d9 100644
--- a/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c
+++ b/src/overlays/effects/ovl_Effect_En_Ice_Block/z_eff_en_ice_block.c
@@ -65,7 +65,7 @@ void EffectEnIceBlock_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPSegment(POLY_XLU_DISP++, 0x06,
play->objectCtx.status[this->rObjId].segment); // object: OBJECT_ICE_BLOCK
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
index 2d80b4161..b1472e55d 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.c
@@ -68,7 +68,7 @@ void EffectSsBlast_Draw(PlayState* play, u32 index, EffectSs* this) {
radius = this->rScale * 0.0025f;
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
Play_GetFloorSurface(play, &mf, &this->pos);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
index b17a43fbe..c9565b968 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.c
@@ -92,7 +92,7 @@ void EffectSsBomb2_DrawFade(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
@@ -135,7 +135,7 @@ void EffectSsBomb2_DrawLayered(PlayState* play, u32 index, EffectSs* this) {
mtx2 = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
if (mtx2 != NULL) {
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
index a3d203992..41c9f0692 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c
@@ -22,7 +22,11 @@ EffectSsInit Effect_Ss_Bubble_InitVars = {
EffectSsBubble_Init,
};
-static f32 sVecAdjMaximums[] = { 291.0f, 582.0f, 1600.0f };
+static f32 sVecAdjMaximums[] = {
+ 291.0f, // CONVEYOR_SPEED_SLOW
+ 582.0f, // CONVEYOR_SPEED_MEDIUM
+ 1600.0f, // CONVEYOR_SPEED_FAST
+};
u32 EffectSsBubble_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
EffectSsBubbleInitParams* initParams = (EffectSsBubbleInitParams*)initParamsx;
@@ -55,7 +59,7 @@ void EffectSsBubble_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 150, 150, 150, 0);
gSPSegment(POLY_OPA_DISP++, 0x08, this->gfx);
@@ -85,17 +89,18 @@ void EffectSsBubble_Update(PlayState* play2, u32 index, EffectSs* this) {
}
if (((play->gameplayFrames + index) % 8) == 0) {
CollisionPoly* colPoly;
- u32 speed;
- s16 direction;
+ ConveyorSpeed conveyorSpeed;
+ s16 conveyorDir;
f32 rVecAdjMax;
BgCheck_EntityRaycastFloor2_1(play, &play->colCtx, &colPoly, &this->pos);
- speed = SurfaceType_GetConveyorSpeed(&play->colCtx, colPoly, BGCHECK_SCENE);
- if ((speed != 0) && !SurfaceType_IsFloorConveyor(&play->colCtx, colPoly, BGCHECK_SCENE)) {
- direction = SurfaceType_GetConveyorDirection(&play->colCtx, colPoly, BGCHECK_SCENE) << 0xA;
- rVecAdjMax = sVecAdjMaximums[speed - 1];
- this->rVecAdjX = Math_SinS(direction) * rVecAdjMax;
- this->rVecAdjZ = Math_CosS(direction) * rVecAdjMax;
+ conveyorSpeed = SurfaceType_GetConveyorSpeed(&play->colCtx, colPoly, BGCHECK_SCENE);
+ if ((conveyorSpeed != CONVEYOR_SPEED_DISABLED) &&
+ !SurfaceType_IsFloorConveyor(&play->colCtx, colPoly, BGCHECK_SCENE)) {
+ conveyorDir = SurfaceType_GetConveyorDirection(&play->colCtx, colPoly, BGCHECK_SCENE) << 10;
+ rVecAdjMax = sVecAdjMaximums[conveyorSpeed - 1];
+ this->rVecAdjX = Math_SinS(conveyorDir) * rVecAdjMax;
+ this->rVecAdjZ = Math_CosS(conveyorDir) * rVecAdjMax;
}
}
this->vec.x += this->rVecAdjX / 100.0f;
diff --git a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
index d8394b159..87e50fb5f 100644
--- a/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_D_Fire/z_eff_ss_d_fire.c
@@ -83,7 +83,7 @@ void EffectSsDFire_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 50, this->rAlpha);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
index 543363ade..556903ca1 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c
@@ -82,7 +82,7 @@ void EffectSsDeadDb_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
index 9f124d39e..c9fa170df 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Dd/z_eff_ss_dead_dd.c
@@ -109,7 +109,7 @@ void EffectSsDeadDd_Draw(PlayState* play, u32 index, EffectSs* this) {
mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
if (mtx != NULL) {
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rAlpha);
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
index 6243b4302..b40513e21 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c
@@ -59,7 +59,7 @@ void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(play->state.gfxCtx);
scale = this->rScale * 0.01f;
- func_8012C974(play->state.gfxCtx);
+ Gfx_SetupDL60_XluNoCD(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, this->rAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
pos = this->pos;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
index b6e3b747f..8a4c80980 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c
@@ -97,7 +97,7 @@ void EffectSsDtBubble_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
(this->rPrimColorA * this->life) / this->rLifespan);
gDPSetEnvColor(POLY_OPA_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB,
diff --git a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
index 10e8fbeed..22580fd81 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Dust/z_eff_ss_dust.c
@@ -107,7 +107,7 @@ void EffectSsDust_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_XLU_DISP++);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[this->rTexIndex]));
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
gDPPipeSync(POLY_XLU_DISP++);
if (this->rDrawFlags & DUST_DRAWFLAG1) {
diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
index 9d78d4d71..a786327fa 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c
@@ -52,7 +52,7 @@ u32 EffectSsEnFire_Init(PlayState* play, u32 index, EffectSs* this, void* initPa
this->rScaleMax = initParams->scale;
- if (initParams->params & ENFIRE_PARAMS_USE_SCALE) {
+ if (initParams->params & ENFIRE_PARAM_USE_SCALE) {
this->rScale = initParams->scale;
} else {
this->rScale = 0;
@@ -88,7 +88,7 @@ void EffectSsEnFire_Draw(PlayState* play, u32 index, EffectSs* this) {
redGreen = 0;
}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, redGreen * 12.7f, 0, 0, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0x0, 0x80, redGreen * 12.7f, redGreen * 12.7f, 0, 255);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
index 0f17477b8..491df81a5 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
@@ -4,7 +4,7 @@
#include "global.h"
#define ENFIRE_FLAGS_BODYPART_POS_VEC3S (1 << 15)
-#define ENFIRE_PARAMS_USE_SCALE (1 << 15)
+#define ENFIRE_PARAM_USE_SCALE (1 << 15)
typedef struct {
/* 0x00 */ Actor* actor;
diff --git a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
index 21a0f1019..cf019c6cf 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c
@@ -60,7 +60,7 @@ u32 EffectSsEnIce_Init(PlayState* play, u32 index, EffectSs* this, void* initPar
this->rEnvColorG = initParams->envColor.g;
this->rEnvColorB = initParams->envColor.b;
this->rAlphaMode = 1;
- this->rPitch = randPlusMinusPoint5Scaled(0x10000);
+ this->rPitch = Rand_CenteredFloat(0x10000);
} else if (initParams->type == ENICE_TYPE_NORMAL) {
Math_Vec3f_Copy(&this->pos, &initParams->pos);
Math_Vec3f_Copy(&this->vec, &initParams->pos);
@@ -112,7 +112,7 @@ void EffectSsEnIce_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
func_800BCC68(&this->pos, play);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, gameplayFrames & 0xFF, 0x20, 0x10, 1, 0,
@@ -142,7 +142,7 @@ void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) {
} else {
this->actor = NULL;
if (this->life >= 9) {
- rand = randPlusMinusPoint5Scaled(0xFFFF);
+ rand = Rand_CenteredFloat(0xFFFF);
this->accel.x = Math_SinS(rand) * (Rand_ZeroOne() + 1.0f);
this->accel.z = Math_CosS(rand) * (Rand_ZeroOne() + 1.0f);
this->life = 8;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c
index 03522f5af..91b699f5f 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c
@@ -72,7 +72,7 @@ void EffectSsExtra_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
index cd7c6d5bd..4edc1e3b1 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.c
@@ -62,11 +62,11 @@ void EffectSsFhgFlash_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
if (this->rParams != FHGFLASH_SHOCK_NO_ACTOR) {
- func_8012C448(play->state.gfxCtx);
+ Gfx_SetupDL44_Xlu(play->state.gfxCtx);
Matrix_RotateXS(this->rXZRot, MTXMODE_APPLY);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_DECAL2);
} else {
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
Matrix_ReplaceRotation(&play->billboardMtxF);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_SURF2);
}
@@ -90,9 +90,9 @@ void EffectSsFhgFlash_Update(PlayState* play, u32 index, EffectSs* this) {
Player* player = GET_PLAYER(play);
randBodyPart = Rand_ZeroFloat(PLAYER_BODYPART_MAX - 0.1f);
- this->pos.x = player->bodyPartsPos[randBodyPart].x + randPlusMinusPoint5Scaled(10.0f);
- this->pos.y = player->bodyPartsPos[randBodyPart].y + randPlusMinusPoint5Scaled(15.0f);
- this->pos.z = player->bodyPartsPos[randBodyPart].z + randPlusMinusPoint5Scaled(10.0f);
+ this->pos.x = player->bodyPartsPos[randBodyPart].x + Rand_CenteredFloat(10.0f);
+ this->pos.y = player->bodyPartsPos[randBodyPart].y + Rand_CenteredFloat(15.0f);
+ this->pos.z = player->bodyPartsPos[randBodyPart].z + Rand_CenteredFloat(10.0f);
} else if ((this->rParams >= FHGFLASH_SHOCK_GOHT_2) && (this->rParams <= FHGFLASH_SHOCK_GOHT_6)) {
s32 pad;
Vec3f* bodyPartPos;
@@ -105,9 +105,9 @@ void EffectSsFhgFlash_Update(PlayState* play, u32 index, EffectSs* this) {
bodyPartPos = &goht->unk_2F00[this->rParams][index].unk_00;
}
- this->pos.x = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->x;
- this->pos.y = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->y;
- this->pos.z = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->z;
+ this->pos.x = Rand_CenteredFloat(70.0f) + bodyPartPos->x;
+ this->pos.y = Rand_CenteredFloat(70.0f) + bodyPartPos->y;
+ this->pos.z = Rand_CenteredFloat(70.0f) + bodyPartPos->z;
}
if (this->life < 100) {
this->rAlpha -= 50;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
index c2f231269..4f8cd94fe 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
@@ -4,30 +4,30 @@
#include "global.h"
typedef enum {
- /* 0x00 */ FHGFLASH_LIGHTBALL,
- /* 0x01 */ FHGFLASH_SHOCK
+ /* 0 */ FHGFLASH_LIGHTBALL,
+ /* 1 */ FHGFLASH_SHOCK
} FhgFlashType;
typedef enum {
- /* 0x00 */ FHGFLASH_LIGHTBALL_GREEN,
- /* 0x01 */ FHGFLASH_LIGHTBALL_LIGHTBLUE,
- /* 0x02 */ FHGFLASH_LIGHTBALL_RED,
- /* 0x03 */ FHGFLASH_LIGHTBALL_YELLOW,
- /* 0x04 */ FHGFLASH_LIGHTBALL_BLUE,
- /* 0x05 */ FHGFLASH_LIGHTBALL_PURPLE,
- /* 0x06 */ FHGFLASH_LIGHTBALL_ORANGE,
- /* 0x07 */ FHGFLASH_LIGHTBALL_WHITE1,
- /* 0x08 */ FHGFLASH_LIGHTBALL_WHITE2
+ /* 0 */ FHGFLASH_LIGHTBALL_GREEN,
+ /* 1 */ FHGFLASH_LIGHTBALL_LIGHTBLUE,
+ /* 2 */ FHGFLASH_LIGHTBALL_RED,
+ /* 3 */ FHGFLASH_LIGHTBALL_YELLOW,
+ /* 4 */ FHGFLASH_LIGHTBALL_BLUE,
+ /* 5 */ FHGFLASH_LIGHTBALL_PURPLE,
+ /* 6 */ FHGFLASH_LIGHTBALL_ORANGE,
+ /* 7 */ FHGFLASH_LIGHTBALL_WHITE1,
+ /* 8 */ FHGFLASH_LIGHTBALL_WHITE2
} FhgFlashLightBallParam;
typedef enum {
- /* 0x00 */ FHGFLASH_SHOCK_NO_ACTOR,
- /* 0x01 */ FHGFLASH_SHOCK_PLAYER,
- /* 0x02 */ FHGFLASH_SHOCK_GOHT_2,
- /* 0x03 */ FHGFLASH_SHOCK_GOHT_3,
- /* 0x04 */ FHGFLASH_SHOCK_GOHT_4,
- /* 0x05 */ FHGFLASH_SHOCK_GOHT_5,
- /* 0x06 */ FHGFLASH_SHOCK_GOHT_6
+ /* 0 */ FHGFLASH_SHOCK_NO_ACTOR,
+ /* 1 */ FHGFLASH_SHOCK_PLAYER,
+ /* 2 */ FHGFLASH_SHOCK_GOHT_2,
+ /* 3 */ FHGFLASH_SHOCK_GOHT_3,
+ /* 4 */ FHGFLASH_SHOCK_GOHT_4,
+ /* 5 */ FHGFLASH_SHOCK_GOHT_5,
+ /* 6 */ FHGFLASH_SHOCK_GOHT_6
} FhgFlashLightningParam;
typedef struct {
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c b/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
index de464ae8d..57ac1af69 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Fire_Tail/z_eff_ss_fire_tail.c
@@ -107,7 +107,7 @@ void EffectSsFireTail_Draw(PlayState* play, u32 index, EffectSs* this) {
temp2 = Math_SinS(yawDiff);
dist = Math_Vec3f_DistXZ(&scale, &this->vec) / (this->rReg10 * 0.1f);
Matrix_RotateYS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(temp2 * this->rReg2 * dist), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(temp2 * this->rReg2 * dist), MTXMODE_APPLY);
temp2 = 1.0f - ((f32)(this->life + 1) / this->rLifespan);
temp2 = 1.0f - SQ(temp2);
scale.x = scale.y = scale.z = temp2 * (this->rScale * (0.001f * 0.01f));
@@ -121,7 +121,7 @@ void EffectSsFireTail_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(1.0f, temp1, 1.0f / temp1, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c b/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
index 24aadc0ec..597379229 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Ripple/z_eff_ss_g_ripple.c
@@ -93,7 +93,7 @@ void EffectSsGRipple_DrawRipple(PlayState* play2, EffectSs* this, TexturePtr tex
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c b/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
index ccc2951c6..e80c02a11 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.c
@@ -97,7 +97,7 @@ void EffectSsGSpk_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sSparkTextures[this->rTexIndex]));
- func_8012C974(gfxCtx);
+ Gfx_SetupDL60_XluNoCD(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
index 8d7647bfe..46397dc19 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.c
@@ -58,7 +58,7 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rType = initParams->type;
} else {
switch (initParams->type) {
- case 0:
+ case EFFSSGSPLASH_TYPE_0:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -67,9 +67,9 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 200;
- this->rType = 0;
+ this->rType = EFFSSGSPLASH_TYPE_0;
break;
- case 1:
+ case EFFSSGSPLASH_TYPE_1:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -78,9 +78,9 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 255;
- this->rType = 1;
+ this->rType = EFFSSGSPLASH_TYPE_1;
break;
- case 2:
+ case EFFSSGSPLASH_TYPE_2:
this->rgPrimColorR = 255;
this->rgPrimColorG = 255;
this->rgPrimColorB = 255;
@@ -89,7 +89,7 @@ u32 EffectSsGSplash_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rgEnvColorG = 255;
this->rgEnvColorB = 255;
this->rgEnvColorA = 200;
- this->rType = 2;
+ this->rType = EFFSSGSPLASH_TYPE_2;
break;
}
}
@@ -100,7 +100,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
s16 texIndex;
switch (this->rType) {
- case 0:
+ case EFFSSGSPLASH_TYPE_0:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -108,7 +108,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
EffectSs_DrawGEffect(play, this, waterSplashTextures[texIndex]);
break;
- case 1:
+ case EFFSSGSPLASH_TYPE_1:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -116,7 +116,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
EffectSs_DrawGEffect(play, this, waterSplashTextures[texIndex]);
break;
- case 2:
+ case EFFSSGSPLASH_TYPE_2:
texIndex = this->rgTexIndex / 100;
if (texIndex > 7) {
texIndex = 7;
@@ -129,7 +129,7 @@ void EffectSsGSplash_Draw(PlayState* play, u32 index, EffectSs* this) {
void EffectSsGSplash_Update(PlayState* play, u32 index, EffectSs* this) {
Vec3f newSplashPos;
- if ((this->rType == 1) && (this->life == 5)) {
+ if ((this->rType == EFFSSGSPLASH_TYPE_1) && (this->life == 5)) {
newSplashPos = this->pos;
newSplashPos.y += ((this->rgScale * 20) * 0.002f);
EffectSsGSplash_Spawn(play, &newSplashPos, 0, 0, 2, this->rgScale / 2);
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
index 9d3fbcd13..363db3e5a 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Splash/z_eff_ss_g_splash.h
@@ -3,6 +3,12 @@
#include "global.h"
+typedef enum EffSsGSplashType {
+ /* 0 */ EFFSSGSPLASH_TYPE_0,
+ /* 1 */ EFFSSGSPLASH_TYPE_1,
+ /* 2 */ EFFSSGSPLASH_TYPE_2
+} EffSsGSplashType;
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ u8 type;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c b/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c
index e1a9371cd..15444ad47 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c
@@ -72,7 +72,7 @@ void EffectSsHahen_DrawOpa(PlayState* play, EffectSs* this) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
}
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
gSPDisplayList(POLY_OPA_DISP++, this->gfx);
CLOSE_DISPS(gfxCtx);
@@ -88,7 +88,7 @@ void EffectSsHahen_DrawXlu(PlayState* play, EffectSs* this) {
gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
}
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
CLOSE_DISPS(gfxCtx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c b/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
index 36eb650f7..b290c05e4 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Hitmark/z_eff_ss_hitmark.c
@@ -134,7 +134,7 @@ void EffectSsHitmark_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
tex = sTextures[(this->rType * 8) + (this->rTexIndex)];
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(tex));
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, 255);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, 0);
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
index 9efadc99e..29a35cf34 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Ice_Piece/z_eff_ss_ice_piece.c
@@ -65,7 +65,7 @@ void EffectSsIcePiece_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_RotateYS(this->rYaw, MTXMODE_APPLY);
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)(s32)alpha);
func_800BCC68(&this->pos, play);
gSPSegment(
diff --git a/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c b/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
index e1c2bc72d..ffd8c300a 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Ice_Smoke/z_eff_ss_ice_smoke.c
@@ -52,7 +52,7 @@ void EffectSsIceSmoke_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 235, 235, this->rAlpha);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, this->rScrollX * this->life, this->rScrollY * this->life, 0x20,
diff --git a/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c b/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
index 17d7edc1e..8c4fc5877 100644
--- a/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c
@@ -55,7 +55,7 @@ void EffectSsKFire_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(xzScale, yScale, xzScale, MTXMODE_APPLY);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, play->state.frames * this->rScroll, 0x20,
0x80));
diff --git a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c
index e424c0b44..1104a28a3 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c
@@ -107,7 +107,7 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) {
if ((((this->rReg4 >> 7) & 1) << 7) == 0x80) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (colorIndex >= 0) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, D_8097EAD8[colorIndex].lod, D_8097EAD8[colorIndex].color.r,
D_8097EAD8[colorIndex].color.g, D_8097EAD8[colorIndex].color.b, 255);
@@ -115,7 +115,7 @@ void EffectSsKakera_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPDisplayList(POLY_XLU_DISP++, this->gfx);
} else {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (colorIndex >= 0) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, D_8097EAD8[colorIndex].lod, D_8097EAD8[colorIndex].color.r,
D_8097EAD8[colorIndex].color.g, D_8097EAD8[colorIndex].color.b, 255);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c b/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
index 540d9e505..4e8f11f5c 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Kirakira/z_eff_ss_kirakira.c
@@ -108,7 +108,7 @@ void EffectSsKirakira_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
(((s8)((55.0f / this->rLifespan) * this->life) + 200)));
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
@@ -139,8 +139,8 @@ void func_80977DB4(PlayState* play, u32 index, EffectSs* this) {
void func_80977E6C(PlayState* play, u32 index, EffectSs* this) {
this->velocity.x *= 0.95f;
this->velocity.z *= 0.95f;
- this->accel.x = randPlusMinusPoint5Scaled(0.2f);
- this->accel.z = randPlusMinusPoint5Scaled(0.2f);
+ this->accel.x = Rand_CenteredFloat(0.2f);
+ this->accel.z = Rand_CenteredFloat(0.2f);
this->rEnvColorA += this->rAlphaStep;
if (this->rEnvColorA < 0) {
diff --git a/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c b/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
index 9037b20f4..61eb3aebd 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Lightning/z_eff_ss_lightning.c
@@ -119,7 +119,7 @@ void EffectSsLightning_Draw(PlayState* play, u32 index, EffectSs* this) {
if (mtx != NULL) {
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, sLightningTextures[texIndex]);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
index 3402eb2b7..69b24c029 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Sbn/z_eff_ss_sbn.c
@@ -68,7 +68,7 @@ u32 EffectSsSbn_Init(PlayState* play, u32 index, EffectSs* this, void* initParam
this->rReg4 = 250;
this->rReg4Step = 30;
- this->rScale = randPlusMinusPoint5Scaled(100.0f) + (initParams->scale * 120.0f);
+ this->rScale = Rand_CenteredFloat(100.0f) + (initParams->scale * 120.0f);
if (this->rScale < 600) {
this->rScale = 600;
} else if (this->rScale > 1500) {
@@ -135,7 +135,7 @@ void EffectSsSbn_DrawSliding(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->rAlpha);
@@ -175,7 +175,7 @@ void EffectSsSbn_Draw(PlayState* play, u32 index, EffectSs* this) {
OPEN_DISPS(gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C2DC(gfxCtx);
+ Gfx_SetupDL25_Xlu(gfxCtx);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, this->rAlpha);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
index a9a190948..312ed5f2f 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c
@@ -70,7 +70,7 @@ void EffectSsSibuki_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB, this->rPrimColorA);
gDPSetEnvColor(POLY_OPA_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, this->rEnvColorA);
gSPSegment(POLY_OPA_DISP++, 0x08, this->gfx);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
index d6d6d1cbc..773984c80 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
@@ -46,21 +46,21 @@ void EffectSsSolderSrchBall_Draw(PlayState* play, u32 index, EffectSs* this) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
f32 scale = this->rgScale / 100.0f;
- func_8012C28C(gfxCtx);
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
OPEN_DISPS(gfxCtx);
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, 255);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
- Matrix_RotateZF(DEGF_TO_RADF(20.0f * play->state.frames), MTXMODE_APPLY);
+ Matrix_RotateZF(DEG_TO_RAD(20.0f * play->state.frames), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c b/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c
index 4f1aa5d91..c1615e2bf 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Stick/z_eff_ss_stick.c
@@ -50,7 +50,7 @@ void EffectSsStick_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Scale(0.01f, 0.0025f, 0.01f, MTXMODE_APPLY);
Matrix_RotateZYX(0, this->rYaw, 0, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C28C(gfxCtx);
+ Gfx_SetupDL25_Opa(gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->rObjBankIndex].segment);
gSPSegment(POLY_OPA_DISP++, 0x0C, gCullBackDList);
gSPDisplayList(POLY_OPA_DISP++, gDekuStickDL);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
index 6e6b48156..1856ba6ac 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
@@ -21,10 +21,10 @@ EffectSsInit Effect_Ss_Stone1_InitVars = {
};
typedef struct {
- /* 0x00 */ TexturePtr texture;
- /* 0x04 */ Color_RGBA8 primColor;
- /* 0x08 */ Color_RGBA8 envColor;
-} EffStoneDrawInfo;
+ /* 0x0 */ TexturePtr texture;
+ /* 0x4 */ Color_RGBA8 primColor;
+ /* 0x8 */ Color_RGBA8 envColor;
+} EffStoneDrawInfo; // size = 0xC
static EffStoneDrawInfo sDrawInfo[] = {
{ gEffStone8Tex, { 200, 0, 0, 255 }, { 0, 0, 0, 255 } },
@@ -65,7 +65,7 @@ void EffectSsStone1_Draw(PlayState* play, u32 index, EffectSs* this) {
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- func_8012C9BC(gfxCtx);
+ Gfx_SetupDL61_Xlu(gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(drawParams->texture));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, drawParams->primColor.r, drawParams->primColor.g, drawParams->primColor.b,
255);
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
index b50868b81..627bbd4f2 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
@@ -4,8 +4,8 @@
#include "global.h"
typedef struct {
- /* 0x00 */ Vec3f pos;
- /* 0x0C */ s32 reg0;
+ /* 0x0 */ Vec3f pos;
+ /* 0xC */ s32 reg0;
} EffectSsStone1InitParams; // size = 0x10
#endif
diff --git a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
index c4eb826c7..cf1000add 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.c
@@ -6,7 +6,7 @@
#include "global.h"
#include "z_fbdemo_triforce.h"
-#include "assets/objects/object_fbdemo_triforce/ovl_fbdemo_triforce.c"
+#include "assets/overlays/ovl_fbdemo_triforce/ovl_fbdemo_triforce.c"
void* TransitionTriforce_Init(void* thisx);
void TransitionTriforce_Destroy(void* thisx);
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
index 1ce5f0d59..94285c45b 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "z_fbdemo_wipe1.h"
+#define THIS ((TransitionWipe1*)thisx)
+
void* TransitionWipe1_Init(void* thisx);
void TransitionWipe1_Destroy(void* thisx);
void TransitionWipe1_Update(void* thisx, s32 updateRate);
@@ -17,35 +19,120 @@ void TransitionWipe1_SetColor(void* thisx, u32 color);
void TransitionWipe1_SetEnvColor(void* thisx, u32 color);
s32 TransitionWipe1_IsDone(void* thisx);
-#if 0
+#include "assets/overlays/ovl_fbdemo_wipe1/ovl_fbdemo_wipe1.c"
+
TransitionInit TransitionWipe1_InitVars = {
- TransitionWipe1_Init,
- TransitionWipe1_Destroy,
- TransitionWipe1_Update,
- TransitionWipe1_Draw,
- TransitionWipe1_Start,
- TransitionWipe1_SetType,
- TransitionWipe1_SetColor,
- TransitionWipe1_SetEnvColor,
- TransitionWipe1_IsDone,
+ TransitionWipe1_Init, TransitionWipe1_Destroy, TransitionWipe1_Update,
+ TransitionWipe1_Draw, TransitionWipe1_Start, TransitionWipe1_SetType,
+ TransitionWipe1_SetColor, TransitionWipe1_SetEnvColor, TransitionWipe1_IsDone,
};
-#endif
+typedef enum {
+ /* 0 */ TRANS_WIPE1_DIR_IN,
+ /* 1 */ TRANS_WIPE1_DIR_OUT
+} TransitionWipe1Direction;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Start.s")
+void TransitionWipe1_Start(void* thisx) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Init.s")
+ this->isDone = false;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Destroy.s")
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ } else {
+ this->texY = (s32)(153.0f * (1 << 2));
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Update.s")
+ guPerspective(&this->projection, &this->normal, 60.0f, (4.0f / 3.0f), 10.0f, 12800.0f, 1.0f);
+ guLookAt(&this->lookAt, 0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_Draw.s")
+void* TransitionWipe1_Init(void* thisx) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_IsDone.s")
+ bzero(this, sizeof(TransitionWipe1));
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetType.s")
+void TransitionWipe1_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetColor.s")
+void TransitionWipe1_Update(void* thisx, s32 updateRate) {
+ TransitionWipe1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe1/TransitionWipe1_SetEnvColor.s")
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY += (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
+ if (this->texY >= (s32)(153.0f * (1 << 2))) {
+ this->texY = (s32)(153.0f * (1 << 2));
+ this->isDone = true;
+ }
+ } else {
+ this->texY -= (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
+ if (this->texY <= (s32)(83.25f * (1 << 2))) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ this->isDone = true;
+ }
+ }
+}
+
+void TransitionWipe1_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView;
+ TransitionWipe1* this = THIS;
+ Gfx* texScroll;
+ s32 pad[4];
+
+ modelView = this->modelView[this->frame];
+ this->frame ^= 1;
+
+ guScale(&modelView[0], 0.56f, 0.56f, 1.0f);
+ guRotate(&modelView[1], 0.0f, 0.0f, 0.0f, 1.0f);
+ guTranslate(&modelView[2], 0.0f, 0.0f, 0.0f);
+ gDPPipeSync(gfx++);
+ texScroll = Gfx_BranchTexScroll(&gfx, this->texX, this->texY, 0, 0);
+ gSPSegment(gfx++, 8, texScroll);
+ gDPSetPrimColor(gfx++, 0, 0x80, this->primColor.r, this->primColor.g, this->primColor.b, 255);
+ gSPMatrix(gfx++, &this->projection, G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPPerspNormalize(gfx++, this->normal);
+ gSPMatrix(gfx++, &this->lookAt, G_MTX_MUL | G_MTX_PROJECTION);
+ gSPMatrix(gfx++, &modelView[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPMatrix(gfx++, &modelView[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+ gSPDisplayList(gfx++, sTransWipe1DL);
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionWipe1_IsDone(void* thisx) {
+ TransitionWipe1* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionWipe1_SetType(void* thisx, s32 type) {
+ TransitionWipe1* this = THIS;
+
+ if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->direction = TRANS_WIPE1_DIR_OUT;
+ } else {
+ this->direction = TRANS_WIPE1_DIR_IN;
+ }
+
+ if (this->direction != TRANS_WIPE1_DIR_IN) {
+ this->texY = (s32)(83.25f * (1 << 2));
+ } else {
+ this->texY = (s32)(153.0f * (1 << 2));
+ }
+}
+
+void TransitionWipe1_SetColor(void* thisx, u32 color) {
+ TransitionWipe1* this = THIS;
+
+ this->primColor.rgba = color;
+}
+
+void TransitionWipe1_SetEnvColor(void* thisx, u32 color) {
+ TransitionWipe1* this = THIS;
+
+ this->envColor.rgba = color;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
index 39f881b39..4906e531c 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h
@@ -5,7 +5,17 @@
#include "color.h"
typedef struct {
- /* 0x000 */ char unk_0[0x218];
+ /* 0x000 */ Color_RGBA8_u32 primColor;
+ /* 0x004 */ Color_RGBA8_u32 envColor;
+ /* 0x008 */ u8 direction;
+ /* 0x009 */ u8 frame;
+ /* 0x00A */ u8 isDone;
+ /* 0x00C */ u16 texX;
+ /* 0x00E */ u16 texY;
+ /* 0x010 */ u16 normal;
+ /* 0x018 */ Mtx projection;
+ /* 0x058 */ Mtx lookAt;
+ /* 0x098 */ Mtx modelView[2][3];
} TransitionWipe1; // size = 0x218
#endif
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
index 759e1511c..03bc1e81d 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "z_fbdemo_wipe3.h"
+#define THIS ((TransitionWipe3*)thisx)
+
void* TransitionWipe3_Init(void* thisx);
void TransitionWipe3_Destroy(void* thisx);
void TransitionWipe3_Update(void* thisx, s32 updateRate);
@@ -17,37 +19,159 @@ void TransitionWipe3_SetColor(void* thisx, u32 color);
void TransitionWipe3_SetEnvColor(void* thisx, u32 color);
s32 TransitionWipe3_IsDone(void* thisx);
-#if 0
-TransitionInit TransitionWipe3_InitVars = {
- TransitionWipe3_Init,
- TransitionWipe3_Destroy,
- TransitionWipe3_Update,
- TransitionWipe3_Draw,
- TransitionWipe3_Start,
- TransitionWipe3_SetType,
- TransitionWipe3_SetColor,
- TransitionWipe3_SetEnvColor,
- TransitionWipe3_IsDone,
+#include "assets/overlays/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.c"
+
+TexturePtr sTransWipe3Textures[] = {
+ fbdemo_tex_000520, fbdemo_tex_000920, fbdemo_tex_000D20, fbdemo_tex_001120,
+ fbdemo_tex_001520, fbdemo_tex_000520, fbdemo_tex_000520, fbdemo_tex_000520,
};
-#endif
+TransitionInit TransitionWipe3_InitVars = {
+ TransitionWipe3_Init, TransitionWipe3_Destroy, TransitionWipe3_Update,
+ TransitionWipe3_Draw, TransitionWipe3_Start, TransitionWipe3_SetType,
+ TransitionWipe3_SetColor, TransitionWipe3_SetEnvColor, TransitionWipe3_IsDone,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Start.s")
+#define TRANS3_GET_SPEED(type) (type & 1)
+#define TRANS3_GET_TEX_INDEX(type) ((type >> 1) & 7)
+#define TRANS3_GET_COLOR(type) ((type >> 4) & 3)
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Init.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_DIR_IN,
+ /* 1 */ TRANS_WIPE3_DIR_OUT
+} TransitionWipe3Direction;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Destroy.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_SPEED_SLOW,
+ /* 1 */ TRANS_WIPE3_SPEED_FAST
+} TransitionWipe3Speed;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/func_80AC68B4.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_COLOR_BLACK,
+ /* 1 */ TRANS_WIPE3_COLOR_WHITE,
+ /* 2 */ TRANS_WIPE3_COLOR_GRAY
+} TransitionWipe3Color;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Update.s")
+void TransitionWipe3_Start(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Draw.s")
+ this->isDone = false;
+ this->curTexture = sTransWipe3Textures[this->texIndex % ARRAY_COUNTU(sTransWipe3Textures)];
+ if (this->speedType == TRANS_WIPE3_SPEED_SLOW) {
+ this->wipeSpeed = 20;
+ } else {
+ this->wipeSpeed = 10;
+ }
+ if (this->colorType == TRANS_WIPE3_COLOR_BLACK) {
+ this->color.rgba = RGBA8(0, 0, 0, 255);
+ } else if (this->colorType == TRANS_WIPE3_COLOR_WHITE) {
+ this->color.rgba = RGBA8(255, 255, 255, 255);
+ } else {
+ this->color.rgba = RGBA8(160, 160, 160, 255);
+ }
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ this->scrollY = 0;
+ } else {
+ this->scrollY = 500;
+ if (this->texIndex == 2) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_OUT);
+ }
+ }
+ guPerspective(&this->projection, &this->normal, 60.0f, 4.0f / 3.0f, 10.0f, 12800.0f, 1.0f);
+ guLookAt(&this->lookAt, 0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_IsDone.s")
+void* TransitionWipe3_Init(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetType.s")
+ bzero(this, sizeof(TransitionWipe3));
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetColor.s")
+void TransitionWipe3_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetEnvColor.s")
+void TransitionWipe3_UpdateScrollY(void* thisx, f32 scroll) {
+ TransitionWipe3* this = THIS;
+
+ this->scrollY = (s32)(500.0f * scroll);
+}
+
+void TransitionWipe3_Update(void* thisx, s32 updateRate) {
+ TransitionWipe3* this = THIS;
+
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ if ((this->scrollY == 0) && (this->texIndex == 2)) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ }
+ this->scrollY += (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY >= 500) {
+ this->scrollY = 500;
+ this->isDone = true;
+ }
+ } else {
+ this->scrollY -= (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY <= 0) {
+ this->scrollY = 0;
+ this->isDone = true;
+ }
+ }
+}
+
+void TransitionWipe3_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView = &THIS->modelView[THIS->frame];
+ f32 scale = 14.8f;
+ Gfx* texScroll;
+
+ THIS->frame ^= 1;
+ gDPPipeSync(gfx++);
+ texScroll = Gfx_BranchTexScroll(&gfx, THIS->scrollX, THIS->scrollY, 16, 64);
+ gSPSegment(gfx++, 0x09, texScroll);
+ gSPSegment(gfx++, 0x08, THIS->curTexture);
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, THIS->color.rgba);
+ gDPSetColor(gfx++, G_SETENVCOLOR, THIS->color.rgba);
+ gSPMatrix(gfx++, &THIS->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPPerspNormalize(gfx++, THIS->normal);
+ gSPMatrix(gfx++, &THIS->lookAt, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+
+ if (scale != 1.0f) {
+ guScale(modelView, scale, scale, 1.0f);
+ gSPMatrix(gfx++, modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+ gSPDisplayList(gfx++, sTransWipe3DL);
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionWipe3_IsDone(void* thisx) {
+ TransitionWipe3* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionWipe3_SetType(void* thisx, s32 type) {
+ TransitionWipe3* this = THIS;
+
+ if (type & TRANS_TYPE_SET_PARAMS) {
+ this->speedType = TRANS3_GET_SPEED(type);
+ this->texIndex = TRANS3_GET_TEX_INDEX(type);
+ this->colorType = TRANS3_GET_COLOR(type);
+ } else if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->dir = TRANS_WIPE3_DIR_OUT;
+ } else {
+ this->dir = TRANS_WIPE3_DIR_IN;
+ }
+}
+
+void TransitionWipe3_SetColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->color.rgba = color;
+}
+
+void TransitionWipe3_SetEnvColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->envColor.rgba = color;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
index b023ecb8b..711f97952 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
@@ -5,7 +5,22 @@
#include "color.h"
typedef struct {
- /* 0x000 */ char unk_0[0x120];
+ /* 0x000 */ Color_RGBA8_u32 color;
+ /* 0x008 */ Color_RGBA8_u32 envColor;
+ /* 0x004 */ u32 scrollX;
+ /* 0x00C */ s32 scrollY;
+ /* 0x010 */ s32 wipeSpeed;
+ /* 0x014 */ u8 dir;
+ /* 0x015 */ u8 colorType;
+ /* 0x016 */ u8 speedType;
+ /* 0x017 */ u8 texIndex;
+ /* 0x018 */ u8 isDone;
+ /* 0x019 */ u8 frame;
+ /* 0x01A */ u16 normal;
+ /* 0x01C */ TexturePtr curTexture;
+ /* 0x020 */ Mtx projection;
+ /* 0x060 */ Mtx lookAt;
+ /* 0x0A0 */ Mtx modelView[2];
} TransitionWipe3; // size = 0x120
#endif
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
index 48c8bdf58..9e11df190 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
@@ -81,7 +81,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
Gfx* gfx = *gfxP;
s32 width = gScreenWidth;
s32 height = gScreenHeight;
- void* sp50 = D_801FBB90;
+ void* workBuffer = gWorkBuffer;
TransitionWipe5* this = THIS;
s32 alpha = (1.0f - this->unk_0C) * 255.0f;
@@ -92,7 +92,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
- func_8014116C(&gfx, D_0F000000, sp50, width, height, 1);
+ func_8014116C(&gfx, D_0F000000, workBuffer, width, height, 1);
} else {
if (alpha == 255) {
gDPSetOtherMode(gfx++,
@@ -108,7 +108,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
ENVIRONMENT);
- func_8014116C(&gfx, sp50, D_0F000000, width, height, 0);
+ func_8014116C(&gfx, workBuffer, D_0F000000, width, height, 0);
}
gDPPipeSync(gfx++);
gSPLoadUcode(gfx++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
index 845baa3cb..134c6457b 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
@@ -4,9 +4,10 @@
* Description: "Dawn of ... day" screen
*/
+#include "global.h"
#include "z_daytelop.h"
+#include "z64save.h"
#include "z64shrink_window.h"
-#include "z64view.h"
#include "misc/daytelop_static/daytelop_static.h"
#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
@@ -129,7 +130,8 @@ void DayTelop_Draw(DayTelopState* this) {
GraphicsContext* gfxCtx = this->state.gfxCtx;
OPEN_DISPS(gfxCtx);
- func_8012C628(this->state.gfxCtx);
+
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
if (gSaveContext.save.day >= 9) {
// Draw a white screen
@@ -139,7 +141,7 @@ void DayTelop_Draw(DayTelopState* this) {
gDPFillRectangle(POLY_OPA_DISP++, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}
- func_8012C628(this->state.gfxCtx);
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.h b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
index a7350e898..da49827c3 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
@@ -1,16 +1,13 @@
#ifndef Z64_DAYTELOP_H
#define Z64_DAYTELOP_H
-#include "global.h"
-
-void DayTelop_Init(GameState* thisx);
-void DayTelop_Destroy(GameState* thisx);
+#include "z64game.h"
+#include "z64view.h"
typedef struct {
/* 0x000 */ GameState state;
/* 0x0A4 */ void* daytelopStaticFile;
/* 0x0A8 */ void* gameoverStaticFile;
- /* 0x0AC */ UNK_TYPE1 unk_AC[0x4];
/* 0x0B0 */ View view;
/* 0x218 */ UNK_TYPE1 unk_218[0x28];
/* 0x240 */ s16 transitionCountdown;
@@ -24,4 +21,7 @@ typedef enum {
/* 2 */ DAYTELOP_HOURSTEXT_ON
} DaytelopFadeState;
+void DayTelop_Init(GameState* thisx);
+void DayTelop_Destroy(GameState* thisx);
+
#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h b/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
deleted file mode 100644
index f3231ec56..000000000
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef Z64_FILE_CHOOSE_H
-#define Z64_FILE_CHOOSE_H
-
-#include "global.h"
-
-void FileSelect_Init(GameState* thisx);
-void FileSelect_Destroy(GameState* thisx);
-
-typedef struct FileSelectState {
- /* 0x00000 */ GameState state;
- /* 0x000A4 */ Vtx* unk_A4;
- /* 0x000A8 */ u8* staticSegment;
- /* 0x000AC */ u8* parameterSegment;
- /* 0x000B0 */ u8* titleSegment;
- /* 0x000B8 */ View view;
- /* 0x00220 */ SramContext sramCtx;
- /* 0x00248 */ SkyboxContext skyboxCtx;
- /* 0x00470 */ MessageContext msgCtx;
- /* 0x12550 */ Font font;
- /* 0x242E0 */ EnvironmentContext envCtx;
- /* 0x243E0 */ Vtx* unk_243E0;
- /* 0x243E4 */ Vtx* unk_243E4;
- /* 0x243E8 */ u8 newf2[2][6];
- /* 0x243F4 */ u8 newf[2][6];
- /* 0x24400 */ UNK_TYPE1 unk_24400[0xC];
- /* 0x2440C */ u16 unk_2440C[2];
- /* 0x24410 */ u16 unk_24410[2];
- /* 0x24414 */ u8 unk_24414[2][8]; // playername
- /* 0x24424 */ u8 unk_24424[2][8]; // playername
- /* 0x24434 */ s16 healthCapacity[2];
- /* 0x24438 */ u16 unk_24438[2];
- /* 0x2443C */ s16 health[2];
- /* 0x24440 */ u16 unk_24440[2];
- /* 0x24444 */ u32 unk_24444[2];
- /* 0x2444C */ u32 unk_2444C[2];
- /* 0x24454 */ s8 unk_24454[2];
- /* 0x24456 */ u8 unk_24456[2];
- /* 0x24458 */ u16 unk_24458[2];
- /* 0x2445C */ u16 unk_2445C[2];
- /* 0x24460 */ s16 unk_24460[2];
- /* 0x24464 */ s16 unk_24464[2];
- /* 0x24468 */ u8 unk_24468[2];
- /* 0x2446A */ u8 unk_2446A[2];
- /* 0x2446C */ s16 rupees[2];
- /* 0x24470 */ s16 unk_24470[2];
- /* 0x24474 */ s8 unk_24474[2];
- /* 0x24476 */ s8 unk_24476[2];
- /* 0x24478 */ s8 maskCount[2];
- /* 0x2447A */ s8 unk_2447A[2];
- /* 0x2447C */ s8 heartPieceCount[2];
- /* 0x2447E */ s8 unk_2447E[2];
- /* 0x24480 */ s16 unk_24480;
- /* 0x24482 */ s16 unk_24482;
- /* 0x24484 */ s16 unk_24484;
- /* 0x24486 */ s16 unk_24486;
- /* 0x24488 */ s16 unk_24488;
- /* 0x2448A */ s16 unk_2448A;
- /* 0x2448C */ s16 unk_2448C;
- /* 0x2448E */ s16 unk_2448E;
- /* 0x24490 */ s16 unk_24490;
- /* 0x24492 */ s16 unk_24492[3];
- /* 0x24498 */ s16 unk_24498;
- /* 0x2449A */ s16 unk_2449A[6];
- /* 0x244A6 */ s16 fileNum;
- /* 0x244A8 */ s16 unk_244A8;
- /* 0x244AA */ s16 unk_244AA;
- /* 0x244AC */ s16 unk_244AC;
- /* 0x244AE */ s16 unk_244AE;
- /* 0x244B0 */ s16 unk_244B0[3];
- /* 0x244B6 */ s16 unk_244B6[2];
- /* 0x244BA */ s16 unk_244BA;
- /* 0x244BC */ s16 unk_244BC[3];
- /* 0x244C2 */ s16 unk_244C2[3];
- /* 0x244C8 */ s16 unk_244C8[3];
- /* 0x244CE */ s16 unk_244CE[3];
- /* 0x244D4 */ s16 unk_244D4[3];
- /* 0x244DA */ s16 unk_244DA[4];
- /* 0x244E2 */ s16 unk_244E2;
- /* 0x244E4 */ s16 unk_244E4;
- /* 0x244E6 */ s16 unk_244E6;
- /* 0x244E8 */ s16 unk_244E8;
- /* 0x244EA */ s16 unk_244EA[4];
- /* 0x244F2 */ s16 unk_244F2;
- /* 0x244F4 */ s16 unk_244F4;
- /* 0x244F6 */ s16 unk_244F6[2];
- /* 0x244FA */ s16 unk_244FA;
- /* 0x244FC */ s16 unk_244FC;
- /* 0x244FE */ s16 unk_244FE;
- /* 0x24500 */ s16 unk_24500;
- /* 0x24502 */ s16 unk_24502;
- /* 0x24504 */ s16 unk_24504;
- /* 0x24506 */ s16 unk_24506;
- /* 0x24508 */ s16 unk_24508;
- /* 0x2450A */ s16 unk_2450A;
- /* 0x2450C */ f32 unk_2450C;
- /* 0x24510 */ s16 unk_24510;
- /* 0x24512 */ s16 unk_24512;
- /* 0x24514 */ s16 unk_24514;
- /* 0x24516 */ s16 unk_24516;
- /* 0x24518 */ s16 unk_24518;
- /* 0x2451A */ s16 unk_2451A;
- /* 0x2451C */ s16 unk_2451C;
- /* 0x2451E */ s16 unk_2451E[5];
- /* 0x24528 */ s16 unk_24528;
- /* 0x2452A */ s16 unk_2452A;
- /* 0x2452C */ s16 unk_2452C[4];
- /* 0x24534 */ s16 unk_24534[4];
- /* 0x2453C */ s16 unk_2453C[4];
- /* 0x24544 */ s16 unk_24544[4];
- /* 0x2454C */ s16 unk_2454C;
- /* 0x2454E */ s16 unk_2454E;
- /* 0x24550 */ s16 unk_24550;
-} FileSelectState; // size = 0x24558
-
-#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c
deleted file mode 100644
index 2e0e9a0d4..000000000
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * File: z_file_choose_80807940.c
- * Overlay: ovl_file_choose
- * Description:
- */
-
-#include "z_file_choose.h"
-#include "z64rumble.h"
-
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
-
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807940.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807A78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807C58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808214.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808D30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80809DF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80809EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A3CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A418.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A4A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A6BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BBFC.s")
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
index da9144e7c..0cc43ad50 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
@@ -4,96 +4,2545 @@
* Description:
*/
-#include "z_file_choose.h"
+#include "z_file_select.h"
+#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "z64rumble.h"
+#include "z64save.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "interface/parameter_static/parameter_static.h"
+#include "misc/title_static/title_static.h"
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
+s32 D_808144F10 = 100;
+f32 D_808144F14 = 8.0f;
+f32 D_808144F18 = 100.0f;
+s32 D_808144F1C = 0;
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
+static Gfx sScreenFillSetupDL[] = {
+ gsDPPipeSync(),
+ gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN |
+ G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_1PRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsSPEndDisplayList(),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC20.s")
+s16 sFileInfoBoxPartWidths[] = {
+ 36, 36, 36, 36, 24, 28, 28,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080bc44.s")
+s16 sWindowContentColors[] = { 100, 150, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080BC4C.s")
+s16 sFileSelectSkyboxRotation = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC58.s")
+s16 sWalletFirstDigit[] = {
+ 1, // tens (Default Wallet)
+ 0, // hundreds (Adult Wallet)
+ 0, // hundreds (Giant Wallet)
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BDAC.s")
+void FileSelect_IncrementConfigMode(FileSelectState* this) {
+ this->configMode++;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_RenderView.s")
+void FileSelect_Noop1(void) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BE60.s")
+void FileSelect_Noop2(FileSelectState* this) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C040.s")
+void FileSelect_InitModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C228.s")
+ if (this->configMode == CM_FADE_IN_START) {
+ if (gSaveContext.options.optionId != 0xA51D) { // Magic number?
+ this->configMode++;
+ } else {
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_FADE_IN_START;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C29C.s")
+ if (this->configMode == CM_FADE_IN_END) {
+ this->screenFillAlpha -= 40;
+ if (this->screenFillAlpha <= 0) {
+ this->screenFillAlpha = 0;
+ this->configMode++; // CM_MAIN_MENU
+ }
+ } else if (this->configMode == CM_MAIN_MENU) {
+ FileSelect_IncrementConfigMode(this); // CM_SETUP_COPY_SOURCE
+ } else {
+ this->screenFillAlpha += 40;
+ if (this->screenFillAlpha >= 255) {
+ this->screenFillAlpha = 255;
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_FADE_IN_START;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C324.s")
+void FileSelect_InitModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C3A8.s")
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
+ FileSelect_Noop2(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D164.s")
+void FileSelect_SetView(FileSelectState* this, f32 eyeX, f32 eyeY, f32 eyeZ) {
+ Vec3f eye;
+ Vec3f lookAt;
+ Vec3f up;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D170.s")
+ eye.x = eyeX;
+ eye.y = eyeY;
+ eye.z = eyeZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D1BC.s")
+ lookAt.x = lookAt.y = lookAt.z = 0.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D220.s")
+ up.x = up.z = 0.0f;
+ up.y = 1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D284.s")
+ View_LookAt(&this->view, &eye, &lookAt, &up);
+ View_Apply(&this->view, VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D2EC.s")
+Gfx* FileSelect_DrawTexQuadIA8(Gfx* gfx, TexturePtr texture, s16 width, s16 height, s16 point) {
+ gDPLoadTextureBlock(gfx++, texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D3D0.s")
+ gSP1Quadrangle(gfx++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D40C.s")
+ return gfx;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D6D4.s")
+/**
+ * Fade in the menu window and title label.
+ * If a file is occupied fade in the name, name box, and connector.
+ * Fade in the copy erase and options button according to the window alpha.
+ */
+void FileSelect_FadeInMenuElements(FileSelectState* this) {
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080F25C.s")
+ this->titleAlpha[FS_TITLE_CUR] += 20;
+ this->windowAlpha += 16;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808108DC.s")
+ for (i = 0; i < 3; i++) {
+ this->fileButtonAlpha[i] = this->windowAlpha;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80811CB8.s")
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->windowAlpha;
+ this->connectorAlpha[i] += 20;
+ if (this->connectorAlpha[i] >= 255) {
+ this->connectorAlpha[i] = 255;
+ }
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->windowAlpha;
+ this->connectorAlpha[i] += 20;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812460.s")
+ if (this->connectorAlpha[i] >= 255) {
+ this->connectorAlpha[i] = 255;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812668.s")
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->windowAlpha;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812760.s")
+/**
+ * Converts a numerical value to hundreds-tens-ones digits
+ */
+void FileSelect_SplitNumber(u16 value, u16* hundreds, u16* tens, u16* ones) {
+ *hundreds = 0;
+ *tens = 0;
+ *ones = value;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812840.s")
+ do {
+ if ((*ones - 100) < 0) {
+ break;
+ }
+ (*hundreds)++;
+ *ones -= 100;
+ } while (true);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812980.s")
+ do {
+ if ((*ones - 10) < 0) {
+ break;
+ }
+ (*tens)++;
+ *ones -= 10;
+ } while (true);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812A6C.s")
+// Start of Config Mode Update Functions
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812D44.s")
+/**
+ * Reduce the alpha of the black screen fill to create a fade in effect.
+ * Additionally, slide the window from the right to the center of the screen.
+ * Update function for `CM_FADE_IN_START`
+ */
+void FileSelect_StartFadeIn(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812D94.s")
+ FileSelect_FadeInMenuElements(this);
+ this->screenFillAlpha -= 40;
+ this->windowPosX -= 20;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812E94.s")
+ if (this->windowPosX <= -94) {
+ this->windowPosX = -94;
+ this->configMode = CM_FADE_IN_END;
+ this->screenFillAlpha = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812ED0.s")
+/**
+ * Finish fading in the remaining menu elements.
+ * Fade in the controls text at the bottom of the screen.
+ * Update function for `CM_FADE_IN_END`
+ */
+void FileSelect_FinishFadeIn(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_UpdateAndDrawSkybox.s")
+ this->controlsAlpha += 20;
+ FileSelect_FadeInMenuElements(this);
-void FileSelect_Main(GameState* thisx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Main.s")
+ if (this->titleAlpha[FS_TITLE_CUR] >= 255) {
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->controlsAlpha = 255;
+ this->windowAlpha = 200;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80813908.s")
+u8 sEmptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Destroy.s")
+/**
+ * Update the cursor and wait for the player to select a button to change menus accordingly.
+ * If an empty file is selected, enter the name entry config mode.
+ * If an occupied file is selected, enter the `Select` menu mode.
+ * If copy, erase, or options is selected, set config mode accordingly.
+ * Lastly, set any warning labels if appropriate.
+ * Update function for `CM_MAIN_MENU`
+ */
+void FileSelect_UpdateMainMenu(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Init.s")
+ if (CHECK_BTN_ALL(input->press.button, BTN_START) || CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ if (this->buttonIndex <= FS_BTN_MAIN_FILE_3) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_ROTATE_TO_NAME_ENTRY;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->charPage = FS_CHAR_PAGE_HIRA;
+ if (gSaveContext.options.language != 0) {
+ this->charPage = FS_CHAR_PAGE_ENG;
+ }
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charIndex = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ this->nameEntryBoxAlpha = 0;
+ Lib_MemCpy(&this->fileNames[this->buttonIndex], &sEmptyName, ARRAY_COUNT(sEmptyName));
+ } else {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->actionTimer = 4;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ this->selectedFileIndex = this->buttonIndex;
+ this->menuMode = FS_MENU_MODE_SELECT;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_ROTATE_TO_NAME_ENTRY;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->charPage = FS_CHAR_PAGE_HIRA;
+ if (gSaveContext.options.language != 0) {
+ this->charPage = FS_CHAR_PAGE_ENG;
+ }
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charIndex = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ this->nameEntryBoxAlpha = 0;
+ Lib_MemCpy(&this->fileNames[this->buttonIndex], &sEmptyName, ARRAY_COUNT(sEmptyName));
+ } else {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->actionTimer = 4;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ this->selectedFileIndex = this->buttonIndex;
+ this->menuMode = FS_MENU_MODE_SELECT;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ } else if (this->warningLabel == FS_WARNING_NONE) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->prevConfigMode = this->configMode;
+
+ if (this->buttonIndex == FS_BTN_MAIN_COPY) {
+ this->configMode = CM_SETUP_COPY_SOURCE;
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ } else if (this->buttonIndex == FS_BTN_MAIN_ERASE) {
+ this->configMode = CM_SETUP_ERASE_SELECT;
+ this->nextTitleLabel = FS_TITLE_ERASE_FILE;
+ } else {
+ this->configMode = CM_MAIN_TO_OPTIONS;
+ this->kbdButton = FS_KBD_BTN_HIRA;
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ }
+ this->actionTimer = 4;
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN;
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
+ } else {
+ if (ABS_ALT(this->stickAdjY) > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY > 30) {
+ this->buttonIndex--;
+ if (this->buttonIndex == FS_BTN_MAIN_FILE_3) {
+ this->buttonIndex = FS_BTN_MAIN_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_MAIN_FILE_1) {
+ this->buttonIndex = FS_BTN_MAIN_OPTIONS;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex == FS_BTN_MAIN_FILE_3) {
+ this->buttonIndex = FS_BTN_MAIN_COPY;
+ }
+ if (this->buttonIndex > FS_BTN_MAIN_OPTIONS) {
+ this->buttonIndex = FS_BTN_MAIN_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex == FS_BTN_MAIN_COPY) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && !NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ !NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_COPY;
+ this->emptyFileTextAlpha = 255;
+ } else if (NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_EMPTY_FILES;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ if (!SLOT_OCCUPIED(this, 0) && !SLOT_OCCUPIED(this, 1) && !SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_COPY;
+ this->emptyFileTextAlpha = 255;
+ } else if (SLOT_OCCUPIED(this, 0) && SLOT_OCCUPIED(this, 1) && SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_EMPTY_FILES;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ } else if (this->buttonIndex == FS_BTN_MAIN_ERASE) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && !NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ !NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_ERASE;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ if (!SLOT_OCCUPIED(this, 0) && !SLOT_OCCUPIED(this, 1) && !SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_ERASE;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+}
+
+/**
+ * Update function for `CM_UNUSED_31`
+ */
+void FileSelect_UnusedCM31(GameState* thisx) {
+}
+
+/**
+ * Delay the next config mode from running until `D_80814564` reaches 254.
+ * Because the timer increments by 2, the delay is 127 frames (assuming the value was not changed by reg editor).
+ * Unused in the final game, was possibly used for debugging.
+ * Update function for `CM_UNUSED_DELAY`
+ */
+void FileSelect_UnusedCMDelay(GameState* thisx) {
+ static s16 D_80814564 = 0;
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ D_80814564 += 2;
+
+ if (D_80814564 == 254) {
+ this->configMode = this->nextConfigMode;
+ D_80814564 = 0;
+ }
+}
+
+/**
+ * Rotate the window from the main menu to the name entry menu.
+ * Update function for `CM_ROTATE_TO_NAME_ENTRY`
+ */
+void FileSelect_RotateToNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 314.0f) {
+ this->windowRot = 314.0f;
+ this->configMode = CM_START_NAME_ENTRY;
+ }
+}
+
+/**
+ * Rotate the window from the main menu to the options menu.
+ * Update function for `CM_MAIN_TO_OPTIONS`
+ */
+void FileSelect_RotateToOptions(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 314.0f) {
+ this->windowRot = 314.0f;
+ this->configMode = CM_START_OPTIONS;
+ }
+}
+
+/**
+ * Rotate the window from the options menu to the main menu.
+ * Update function for `CM_NAME_ENTRY_TO_MAIN` and `CM_OPTIONS_TO_MAIN`
+ */
+void FileSelect_RotateToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 628.0f) {
+ this->windowRot = 0.0f;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
+
+void (*sConfigModeUpdateFuncs[])(GameState*) = {
+ // Main Menu
+ FileSelect_StartFadeIn, // CM_FADE_IN_START
+ FileSelect_FinishFadeIn, // CM_FADE_IN_END
+ FileSelect_UpdateMainMenu, // CM_MAIN_MENU
+ // Copy File
+ FileSelect_SetupCopySource, // CM_SETUP_COPY_SOURCE
+ FileSelect_SelectCopySource, // CM_SELECT_COPY_SOURCE
+ FileSelect_SetupCopyDest1, // CM_SETUP_COPY_DEST_1
+ FileSelect_SetupCopyDest2, // CM_SETUP_COPY_DEST_2
+ FileSelect_SelectCopyDest, // CM_SELECT_COPY_DEST
+ FileSelect_ExitToCopySource1, // CM_EXIT_TO_COPY_SOURCE_1
+ FileSelect_ExitToCopySource2, // CM_EXIT_TO_COPY_SOURCE_2
+ FileSelect_SetupCopyConfirm1, // CM_SETUP_COPY_CONFIRM_1
+ FileSelect_SetupCopyConfirm2, // CM_SETUP_COPY_CONFIRM_2
+ FileSelect_CopyConfirm, // CM_COPY_CONFIRM
+ FileSelect_CopyWaitForFlashSave, // CM_COPY_WAIT_FOR_FLASH_SAVE
+ FileSelect_ReturnToCopyDest, // CM_RETURN_TO_COPY_DEST
+ FileSelect_CopyAnim1, // CM_COPY_ANIM_1
+ FileSelect_CopyAnim2, // CM_COPY_ANIM_2
+ FileSelect_CopyAnim3, // CM_COPY_ANIM_3
+ FileSelect_CopyAnim4, // CM_COPY_ANIM_4
+ FileSelect_CopyAnim5, // CM_COPY_ANIM_5
+ FileSelect_ExitCopyToMain, // CM_COPY_RETURN_MAIN
+ // Erase File
+ FileSelect_SetupEraseSelect, // CM_SETUP_ERASE_SELECT
+ FileSelect_EraseSelect, // CM_ERASE_SELECT
+ FileSelect_SetupEraseConfirm1, // CM_SETUP_ERASE_CONFIRM_1
+ FileSelect_SetupEraseConfirm2, // CM_SETUP_ERASE_CONFIRM_2
+ FileSelect_EraseConfirm, // CM_ERASE_CONFIRM
+ FileSelect_ExitToEraseSelect1, // CM_EXIT_TO_ERASE_SELECT_1
+ FileSelect_ExitToEraseSelect2, // CM_EXIT_TO_ERASE_SELECT_2
+ FileSelect_EraseAnim1, // CM_ERASE_ANIM_1
+ FileSelect_EraseWaitForFlashSave, // CM_ERASE_WAIT_FOR_FLASH_SAVE
+ FileSelect_EraseAnim2, // CM_ERASE_ANIM_2
+ FileSelect_EraseAnim3, // CM_ERASE_ANIM_3
+ FileSelect_ExitEraseToMain, // CM_EXIT_ERASE_TO_MAIN
+ FileSelect_UnusedCM31, // CM_UNUSED_31
+ // New File Name Entry
+ FileSelect_RotateToNameEntry, // CM_ROTATE_TO_NAME_ENTRY
+ FileSelect_StartNameEntry, // CM_START_NAME_ENTRY
+ FileSelect_UpdateKeyboardCursor, // CM_NAME_ENTRY
+ FileSelect_NameEntryWaitForFlashSave, // CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE
+ FileSelect_RotateToMain, // CM_NAME_ENTRY_TO_MAIN
+ // Options
+ FileSelect_RotateToOptions, // CM_MAIN_TO_OPTIONS
+ FileSelect_StartOptions, // CM_START_OPTIONS
+ FileSelect_UpdateOptionsMenu, // CM_OPTIONS_MENU
+ FileSelect_OptionsWaitForFlashSave, // CM_OPTIONS_WAIT_FOR_FLASH_SAVE
+ FileSelect_RotateToMain, // CM_OPTIONS_TO_MAIN
+ // Possible Debug
+ FileSelect_UnusedCMDelay, // CM_UNUSED_DELAY
+};
+
+s16 sCursorAlphaTargets[] = { 70, 200 };
+
+/**
+ * Updates the alpha of the cursor to make it pulsate.
+ */
+void FileSelect_PulsateCursor(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 alphaStep =
+ ABS_ALT(this->highlightColor[3] - sCursorAlphaTargets[this->highlightPulseDir]) / this->highlightTimer;
+
+ if (this->highlightColor[3] >= sCursorAlphaTargets[this->highlightPulseDir]) {
+ this->highlightColor[3] -= alphaStep;
+ } else {
+ this->highlightColor[3] += alphaStep;
+ }
+
+ this->highlightTimer--;
+
+ if (this->highlightTimer == 0) {
+ this->highlightColor[3] = sCursorAlphaTargets[this->highlightPulseDir];
+ this->highlightTimer = 20;
+ this->highlightPulseDir ^= 1;
+ }
+}
+
+void FileSelect_ConfigModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ sConfigModeUpdateFuncs[this->configMode](&this->state);
+}
+
+void FileSelect_SetWindowVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s16 j;
+ s16 x;
+ s32 tmp;
+ s32 tmp2;
+ s32 tmp3;
+
+ this->windowVtx = GRAPH_ALLOC(this->state.gfxCtx, 80 * sizeof(Vtx));
+ tmp = this->windowPosX - 90;
+
+ for (x = 0, i = 0; i < 4; i++) {
+ tmp += 0x40;
+ tmp2 = (i == 3) ? 0x30 : 0x40;
+
+ for (j = 0, tmp3 = 0x50; j < 5; j++, x += 4, tmp3 -= 0x20) {
+ this->windowVtx[x].v.ob[0] = this->windowVtx[x + 2].v.ob[0] = tmp;
+
+ this->windowVtx[x + 1].v.ob[0] = this->windowVtx[x + 3].v.ob[0] = tmp2 + tmp;
+
+ this->windowVtx[x].v.ob[1] = this->windowVtx[x + 1].v.ob[1] = tmp3;
+
+ this->windowVtx[x + 2].v.ob[1] = this->windowVtx[x + 3].v.ob[1] = tmp3 - 0x20;
+
+ this->windowVtx[x].v.ob[2] = this->windowVtx[x + 1].v.ob[2] = this->windowVtx[x + 2].v.ob[2] =
+ this->windowVtx[x + 3].v.ob[2] = 0;
+
+ this->windowVtx[x].v.flag = this->windowVtx[x + 1].v.flag = this->windowVtx[x + 2].v.flag =
+ this->windowVtx[x + 3].v.flag = 0;
+
+ this->windowVtx[x].v.tc[0] = this->windowVtx[x].v.tc[1] = this->windowVtx[x + 1].v.tc[1] =
+ this->windowVtx[x + 2].v.tc[0] = 0;
+
+ this->windowVtx[x + 1].v.tc[0] = this->windowVtx[x + 3].v.tc[0] = tmp2 << 5;
+
+ this->windowVtx[x + 2].v.tc[1] = this->windowVtx[x + 3].v.tc[1] = 32 << 5;
+
+ this->windowVtx[x].v.cn[0] = this->windowVtx[x + 2].v.cn[0] = this->windowVtx[x].v.cn[1] =
+ this->windowVtx[x + 2].v.cn[1] = this->windowVtx[x].v.cn[2] = this->windowVtx[x + 2].v.cn[2] =
+ this->windowVtx[x + 1].v.cn[0] = this->windowVtx[x + 3].v.cn[0] = this->windowVtx[x + 1].v.cn[1] =
+ this->windowVtx[x + 3].v.cn[1] = this->windowVtx[x + 1].v.cn[2] =
+ this->windowVtx[x + 3].v.cn[2] = this->windowVtx[x].v.cn[3] =
+ this->windowVtx[x + 2].v.cn[3] = this->windowVtx[x + 1].v.cn[3] =
+ this->windowVtx[x + 3].v.cn[3] = 255;
+ }
+ }
+}
+
+s16 D_80814620[] = { 8, 8, 8, 0 };
+s16 D_80814628[] = { 12, 12, 12, 0 };
+s16 D_80814630[] = { 12, 12, 12, 0 };
+s16 D_80814638[] = {
+ 88, 104, 120, 940, 944, 948,
+};
+s16 D_80814644[] = { 88, 104, 120, 944 };
+s16 D_8081464C[] = { 940, 944 };
+s16 D_80814650[] = { 940, 944 };
+
+/*
+ * fileSelect->windowContentVtx[0] -> Title Label (4)
+ *
+ * fileSelect->windowContentVtx[4] -> File 1 InfoBox (28)
+ * fileSelect->windowContentVtx[32] -> File 2 InfoBox (28)
+ * fileSelect->windowContentVtx[60] -> File 3 InfoBox (28)
+ *
+ * ** FILE 1 **
+ *
+ * fileSelect->windowContentVtx[88] -> File Button
+ * fileSelect->windowContentVtx[92] -> File Name Box
+ * fileSelect->windowContentVtx[96] -> Connectors
+ * fileSelect->windowContentVtx[100] -> Blank Button (Owl Save)
+ *
+ * ** FILE 2 **
+ *
+ * fileSelect->windowContentVtx[104] -> Repeat of File 1 above
+ *
+ * ** FILE 3 **
+ *
+ * fileSelect->windowContentVtx[120] -> Repeat of File 1 above
+ *
+ * ** FILE 1 Info **
+ *
+ * fileSelect->windowContentVtx[136] -> File Name (32)
+ * fileSelect->windowContentVtx[168] -> File Name Shadow (32)
+ * fileSelect->windowContentVtx[200] -> Rupee Digits (12)
+ * fileSelect->windowContentVtx[212] -> Rupee Digits Shadow (12)
+ * fileSelect->windowContentVtx[224] -> Mask Count (8)
+ * fileSelect->windowContentVtx[232] -> Mask Count Shadow (8)
+ * fileSelect->windowContentVtx[240] -> Hearts (80)
+ * fileSelect->windowContentVtx[320] -> Remains (16)
+ * fileSelect->windowContentVtx[336] -> Rupee Icon (4)
+ * fileSelect->windowContentVtx[340] -> Heart Piece Count (4)
+ * fileSelect->windowContentVtx[344] -> Mask Text (8)
+ * fileSelect->windowContentVtx[352] -> Owl Save Icon (4)
+ * fileSelect->windowContentVtx[356] -> Day Text (8)
+ * fileSelect->windowContentVtx[364] -> Time Digits (20)
+ * fileSelect->windowContentVtx[384] -> Time Digits Shadow (20)
+ *
+ * ** FILE 2 Info **
+ *
+ * fileSelect->windowContentVtx[404] -> Repeat of File 1 above
+ *
+ * ** FILE 3 Info **
+ *
+ * fileSelect->windowContentVtx[672] -> Repeat of File 1 above
+ *
+ * fileSelect->windowContentVtx[940] -> Action buttons (copy/erase/yes/quit)
+ * fileSelect->windowContentVtx[944] -> Action buttons (copy/erase/yes/quit)
+ * fileSelect->windowContentVtx[948] -> Option Button
+ * fileSelect->windowContentVtx[952] -> Highlight over currently selected button
+ * fileSelect->windowContentVtx[956] -> Warning labels
+ */
+
+#ifdef NON_MATCHING
+// regalloc at the beginning is fixed by removing FAKE: labelled code
+void FileSelect_SetWindowContentVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ u16 vtxId;
+ s16 j;
+ s16 index;
+ s16 spAC;
+ s16 i; // a3
+ u16 spA4[3];
+ u16* ptr;
+ s32 posY; // sp9C
+ s32 relPosY; // sp98
+ s32 tempPosY;
+ s32 posX; // s1
+ s32 temp_t5;
+
+ this->windowContentVtx = GRAPH_ALLOC(this->state.gfxCtx, 960 * sizeof(Vtx));
+
+ // Initialize all windowContentVtx
+ for (vtxId = 0; vtxId < 960; vtxId += 4) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = 0x12C;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 16;
+
+ // y-coord (top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = 0;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 16;
+
+ // z-coordinate
+ this->windowContentVtx[vtxId + 0].v.ob[2] = this->windowContentVtx[vtxId + 1].v.ob[2] =
+ this->windowContentVtx[vtxId + 2].v.ob[2] = this->windowContentVtx[vtxId + 3].v.ob[2] = 0;
+
+ //! FAKE:
+ if (index && index && index) {}
+
+ // flag
+ this->windowContentVtx[vtxId + 0].v.flag = this->windowContentVtx[vtxId + 1].v.flag =
+ this->windowContentVtx[vtxId + 2].v.flag = this->windowContentVtx[vtxId + 3].v.flag = 0;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 0].v.tc[0] = this->windowContentVtx[vtxId + 0].v.tc[1] =
+ this->windowContentVtx[vtxId + 1].v.tc[1] = this->windowContentVtx[vtxId + 2].v.tc[0] = 0;
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 2].v.tc[1] =
+ this->windowContentVtx[vtxId + 3].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ // alpha
+ this->windowContentVtx[vtxId + 0].v.cn[0] = this->windowContentVtx[vtxId + 1].v.cn[0] =
+ this->windowContentVtx[vtxId + 2].v.cn[0] = this->windowContentVtx[vtxId + 3].v.cn[0] =
+ this->windowContentVtx[vtxId + 0].v.cn[1] = this->windowContentVtx[vtxId + 1].v.cn[1] =
+ this->windowContentVtx[vtxId + 2].v.cn[1] = this->windowContentVtx[vtxId + 3].v.cn[1] =
+ this->windowContentVtx[vtxId + 0].v.cn[2] = this->windowContentVtx[vtxId + 1].v.cn[2] =
+ this->windowContentVtx[vtxId + 2].v.cn[2] = this->windowContentVtx[vtxId + 3].v.cn[2] =
+ this->windowContentVtx[vtxId + 0].v.cn[3] = this->windowContentVtx[vtxId + 1].v.cn[3] =
+ this->windowContentVtx[vtxId + 2].v.cn[3] =
+ this->windowContentVtx[vtxId + 3].v.cn[3] = 255;
+ }
+
+ /** Title Label **/
+
+ // x-coord (left)
+ this->windowContentVtx[0].v.ob[0] = this->windowContentVtx[2].v.ob[0] = this->windowPosX;
+ // x-coord (right)
+ this->windowContentVtx[1].v.ob[0] = this->windowContentVtx[3].v.ob[0] = this->windowContentVtx[0].v.ob[0] + 0x80;
+ // y-coord (top)
+ this->windowContentVtx[0].v.ob[1] = this->windowContentVtx[1].v.ob[1] = 0x48;
+ // y-coord (bottom)
+ this->windowContentVtx[2].v.ob[1] = this->windowContentVtx[3].v.ob[1] = this->windowContentVtx[0].v.ob[1] - 0x10;
+ // texture coordinates
+ this->windowContentVtx[1].v.tc[0] = this->windowContentVtx[3].v.tc[0] = 0x1000;
+
+ /** File InfoBox **/
+
+ // Loop through 3 files
+ for (vtxId = 4, i = 0; i < 3; i++) {
+ posX = this->windowPosX - 6;
+
+ // Loop through 7 textures
+ for (j = 0; j < 7; j++, vtxId += 4) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + sFileInfoBoxPartWidths[j];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->fileNamesY[i] + 0x2C;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x38;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] =
+ sFileInfoBoxPartWidths[j] << 5;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x700;
+
+ // Update X position
+ posX += sFileInfoBoxPartWidths[j];
+ }
+ }
+
+ // File Buttons
+
+ posX = this->windowPosX - 6;
+ posY = 44;
+
+ // Loop through 3 files
+ for (j = 0; j < 3; j++, vtxId += 16, posY -= 0x10) {
+
+ /* File Button */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+
+ /* File Name Box */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] = posX + 0x40;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x6C;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0xD80;
+
+ /* Connectors */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 8].v.ob[0] = this->windowContentVtx[vtxId + 10].v.ob[0] = posX + 0x34;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 9].v.ob[0] = this->windowContentVtx[vtxId + 11].v.ob[0] =
+ this->windowContentVtx[vtxId + 8].v.ob[0] + 0x18;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 8].v.ob[1] = this->windowContentVtx[vtxId + 9].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 10].v.ob[1] = this->windowContentVtx[vtxId + 11].v.ob[1] =
+ this->windowContentVtx[vtxId + 8].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 9].v.tc[0] = this->windowContentVtx[vtxId + 11].v.tc[0] = 0x300;
+
+ /* Blank Button (Owl Save) */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 12].v.ob[0] = this->windowContentVtx[vtxId + 14].v.ob[0] = posX + 0xA9;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 13].v.ob[0] = this->windowContentVtx[vtxId + 15].v.ob[0] =
+ this->windowContentVtx[vtxId + 12].v.ob[0] + 0x34;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 12].v.ob[1] = this->windowContentVtx[vtxId + 13].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 14].v.ob[1] = this->windowContentVtx[vtxId + 15].v.ob[1] =
+ this->windowContentVtx[vtxId + 12].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 13].v.tc[0] = this->windowContentVtx[vtxId + 15].v.tc[0] = 0x680;
+ }
+
+ posY = 44;
+
+ // Loop through 3 files
+ for (j = 0; j < 3; j++, posY -= 16) {
+ if (!gSaveContext.flashSaveAvailable) {
+ // Should skip vtxId
+ // vtxId += 268;
+ continue;
+ }
+
+ // Account for owl-save offset
+
+ spAC = j;
+ if (this->isOwlSave[j + 2]) {
+ spAC = j + 2;
+ }
+
+ /* File name */
+
+ posX = this->windowPosX - 6;
+
+ if ((this->configMode == 0x10) && (j == this->copyDestFileIndex)) {
+ relPosY = this->fileNamesY[j] + 0x2C;
+ } else if (((this->configMode == 0x11) || (this->configMode == 0x12)) && (j == this->copyDestFileIndex)) {
+ relPosY = this->buttonYOffsets[j] + posY;
+ } else {
+ relPosY = posY + this->buttonYOffsets[j] + this->fileNamesY[j];
+ }
+
+ tempPosY = relPosY - 2;
+
+ // Loop through 8 characters of file name
+ for (i = 0; i < 8; i++, vtxId += 4) {
+
+ index = this->fileNames[j][i];
+
+ /* File Name */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[index] + posX + 0x4E;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xB;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ /* File Name Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 32].v.ob[0] = this->windowContentVtx[vtxId + 34].v.ob[0] =
+ D_80814280[index] + posX + 0x4F;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 33].v.ob[0] = this->windowContentVtx[vtxId + 35].v.ob[0] =
+ this->windowContentVtx[vtxId + 32].v.ob[0] + 0xB;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 32].v.ob[1] = this->windowContentVtx[vtxId + 33].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 34].v.ob[1] = this->windowContentVtx[vtxId + 35].v.ob[1] =
+ this->windowContentVtx[vtxId + 32].v.ob[1] - 0xC;
+
+ // Update X position
+ posX += 10;
+ }
+ // Account for the shadow
+ vtxId += 32;
+
+ /* Rupee Digits */
+
+ posX = this->windowPosX + 14;
+ tempPosY = relPosY - 0x18;
+
+ FileSelect_SplitNumber(this->rupees[spAC], &spA4[0], &spA4[1], &spA4[2]);
+
+ index = sWalletFirstDigit[this->walletUpgrades[spAC]];
+
+ ptr = &spA4[index];
+
+ for (i = 0; i < 3; i++, vtxId += 4, ptr++) {
+
+ /* Rupee Digits */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[*ptr] + posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - D_80814630[i];
+
+ /* Rupee Digits Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 12].v.ob[0] = this->windowContentVtx[vtxId + 14].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 13].v.ob[0] = this->windowContentVtx[vtxId + 15].v.ob[0] =
+ this->windowContentVtx[vtxId + 12].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 12].v.ob[1] = this->windowContentVtx[vtxId + 13].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 14].v.ob[1] = this->windowContentVtx[vtxId + 15].v.ob[1] =
+ this->windowContentVtx[vtxId + 12].v.ob[1] - D_80814630[i];
+
+ // Update X position
+ posX += D_80814620[i];
+ }
+
+ // Account for the shadow
+ vtxId += 12;
+
+ /* Mask Count */
+
+ posX = this->windowPosX + 42;
+ tempPosY = relPosY - 0x2A;
+
+ FileSelect_SplitNumber(this->maskCount[spAC], &spA4[0], &spA4[1], &spA4[2]);
+
+ for (i = 1; i < 3; i++, vtxId += 4) {
+
+ /* Mask Count */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[spA4[i]] + posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - D_80814630[i];
+
+ /* Mask Count Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 8].v.ob[0] = this->windowContentVtx[vtxId + 10].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 9].v.ob[0] = this->windowContentVtx[vtxId + 11].v.ob[0] =
+ this->windowContentVtx[vtxId + 8].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 8].v.ob[1] = this->windowContentVtx[vtxId + 9].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 10].v.ob[1] = this->windowContentVtx[vtxId + 11].v.ob[1] =
+ this->windowContentVtx[vtxId + 8].v.ob[1] - D_80814630[i];
+
+ // Update X position
+ posX += D_80814620[i];
+ }
+
+ // Account for the shadow
+ vtxId += 8;
+
+ /* Hearts */
+
+ posX = this->windowPosX + 63;
+ tempPosY = relPosY - 0x10;
+
+ // Loop through 20 hearts
+ for (i = 0; i < 20; i++, vtxId += 4, posX += 9) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xA;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xA;
+
+ // New row of hearts next iteration
+ if (i == 9) {
+ posX = this->windowPosX + (63 - 9);
+ tempPosY -= 8;
+ }
+ }
+
+ /* Quest Remains */
+
+ posX = this->windowPosX + 64;
+ tempPosY = relPosY - 0x20;
+
+ // Loop through 4 Remains
+ for (i = 0; i < 4; i++, vtxId += 4, posX += 0x18) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x14;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x14;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 2].v.tc[1] =
+ this->windowContentVtx[vtxId + 3].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x400;
+ }
+
+ /* Rupee Icon */
+
+ // posX = this->windowPosX - 1;
+ tempPosY = relPosY - 0x15;
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x10;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x200;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ vtxId += 4;
+
+ /* Heart Piece Count */
+
+ // posX = this->windowPosX + 0x27;
+ tempPosY = relPosY - 0x15;
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX + 0x27;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x18;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x300;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ vtxId += 4;
+
+ /* Mask Text */
+
+ // posX = this->windowPosX - 10;
+ tempPosY = relPosY - 0x27;
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 10;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] = tempPosY - 1;
+
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0x800;
+ this->windowContentVtx[vtxId + 6].v.tc[1] = this->windowContentVtx[vtxId + 7].v.tc[1] = 0x200;
+
+ vtxId += 8;
+
+ /* Owl Save Icon */
+
+ posX = this->windowPosX + 0xA3;
+
+ if ((this->configMode == 0x10) && (j == this->copyDestFileIndex)) {
+ tempPosY = this->fileNamesY[j] + 0x2C;
+ } else if (((this->configMode == 0x11) || (this->configMode == 0x12)) && (j == this->copyDestFileIndex)) {
+ tempPosY = this->buttonYOffsets[j] + posY;
+ } else {
+ tempPosY = posY + this->buttonYOffsets[j] + this->fileNamesY[j];
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX + 0xE;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x18;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - 2;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x300;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x180;
+
+ vtxId += 4;
+
+ /* Day Text */
+
+ for (i = 0; i < 2; i++, vtxId += 4) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = 2 + posX + i;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x30;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - i - 0x12;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x18;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x600;
+
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x300;
+ }
+
+ /* Time Digits */
+
+ posX += 6;
+ temp_t5 = vtxId;
+
+ for (i = 0; i < 5; i++, vtxId += 4, posX += 8) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xC;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - 0x2A;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ this->windowContentVtx[vtxId + 0x14].v.ob[0] = this->windowContentVtx[vtxId + 0x16].v.ob[0] = posX + 1;
+
+ this->windowContentVtx[vtxId + 0x15].v.ob[0] = this->windowContentVtx[vtxId + 0x17].v.ob[0] =
+ this->windowContentVtx[vtxId + 0x14].v.ob[0] + 0xC;
+
+ this->windowContentVtx[vtxId + 0x14].v.ob[1] = this->windowContentVtx[vtxId + 0x15].v.ob[1] =
+ tempPosY - 0x2B;
+
+ this->windowContentVtx[vtxId + 0x16].v.ob[1] = this->windowContentVtx[vtxId + 0x17].v.ob[1] =
+ this->windowContentVtx[vtxId + 0x14].v.ob[1] - 0xC;
+ }
+
+ // Adjust the colon to the right
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] = this->windowContentVtx[temp_t5 + 10].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 3;
+
+ this->windowContentVtx[temp_t5 + 9].v.ob[0] = this->windowContentVtx[temp_t5 + 11].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 0xC;
+
+ this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1E].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 1;
+
+ this->windowContentVtx[temp_t5 + 0x1D].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1F].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] + 0xC;
+
+ vtxId += 20;
+ }
+
+ posX = this->windowPosX - 6;
+ posY = -0xC;
+
+ for (j = 0; j < 2; j++, vtxId += 4, posY -= 0x10) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[j + 3] + posY;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[5] - 0x34;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+
+ vtxId += 4;
+
+ if (((this->menuMode == FS_MENU_MODE_CONFIG) && (this->configMode >= 2)) ||
+ ((this->menuMode == FS_MENU_MODE_SELECT) && (this->selectMode == 3))) {
+ if (this->menuMode == FS_MENU_MODE_CONFIG) {
+ if ((this->configMode == 4) || (this->configMode == 7) || (this->configMode == 0x16)) {
+ j = D_80814644[this->buttonIndex];
+ } else if ((this->configMode == 0x19) || (this->configMode == 0xC)) {
+ j = D_8081464C[this->buttonIndex];
+ } else {
+ j = D_80814638[this->buttonIndex];
+ }
+ } else {
+ j = D_80814650[this->confirmButtonIndex];
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 0xA;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x48;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->windowContentVtx[j].v.ob[1] + 4;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x18;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x900;
+
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x300;
+ }
+
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] = this->windowPosX + 0x3A;
+
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x80;
+
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] =
+ this->windowContentVtx[D_80814638[this->warningButtonIndex]].v.ob[1];
+
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0x1000;
+}
+#else
+void FileSelect_SetWindowContentVtx(GameState* thisx);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_SetWindowContentVtx.s")
+#endif
+
+u16 D_80814654[] = {
+ 0x88,
+ 0x194,
+ 0x2A0,
+};
+TexturePtr sFileSelRemainsTextures[] = {
+ gFileSelOdolwasRemainsTex,
+ gFileSelGohtsRemainsTex,
+ gFileSelGyorgsRemainsTex,
+ gFileSelTwinmoldsRemainsTex,
+};
+TexturePtr sFileSelDayENGTextures[] = {
+ gFileSelFirstDayENGTex,
+ gFileSelFirstDayENGTex,
+ gFileSelSecondDayENGTex,
+ gFileSelFinalDayENGTex,
+};
+TexturePtr sFileSelHeartPieceTextures[] = {
+ gFileSel0QuarterHeartENGTex,
+ gFileSel1QuarterHeartENGTex,
+ gFileSel2QuarterHeartENGTex,
+ gFileSel3QuarterHeartENGTex,
+};
+static TexturePtr sHeartTextures[2][5] = {
+ {
+ gHeartEmptyTex,
+ gHeartQuarterTex,
+ gHeartHalfTex,
+ gHeartThreeQuarterTex,
+ gHeartFullTex,
+ },
+ {
+ gDefenseHeartEmptyTex,
+ gDefenseHeartQuarterTex,
+ gDefenseHeartHalfTex,
+ gDefenseHeartThreeQuarterTex,
+ gDefenseHeartFullTex,
+ },
+};
+u8 sHealthToQuarterHeartCount[] = {
+ 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+};
+s16 sFileSelRupeePrimColors[3][3] = {
+ { 200, 255, 100 }, // Default Wallet
+ { 170, 170, 255 }, // Adult Wallet
+ { 255, 105, 105 }, // Giant Wallet
+};
+s16 sFileSelRupeeEnvColors[3][3] = {
+ { 0, 80, 0 }, // Default Wallet
+ { 10, 10, 80 }, // Adult Wallet
+ { 40, 10, 0 }, // Giant Wallet
+};
+static s16 sHeartPrimColors[2][3] = {
+ { 255, 70, 50 },
+ { 200, 0, 0 },
+};
+static s16 sHeartEnvColors[2][3] = {
+ { 50, 40, 60 },
+ { 255, 255, 255 },
+};
+
+void FileSelect_DrawFileInfo(GameState* thisx, s16 fileIndex) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ s16 j;
+ s16 vtxOffset;
+ s32 heartType;
+ s16 i;
+ s16 sp20C;
+ s16 health;
+ s16 timeDigits[5];
+ u16 digits[3]; // rupees and mask count
+ u8 quarterHeartCount;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ sp20C = fileIndex;
+
+ // draw file name
+ if (this->nameAlpha[fileIndex] != 0) {
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + (4 * 8)], 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->nameAlpha[fileIndex]);
+
+ for (vtxOffset = 0, i = 0; vtxOffset < (4 * 8); i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + this->fileNames[fileIndex][i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex]], 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->nameAlpha[fileIndex]);
+
+ for (vtxOffset = 0, i = 0; vtxOffset < (4 * 8); i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + this->fileNames[fileIndex][i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ if ((fileIndex == this->selectedFileIndex) || (fileIndex == this->copyDestFileIndex)) {
+ if (this->isOwlSave[fileIndex + 2]) {
+ sp20C = fileIndex + 2;
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][0],
+ sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][1],
+ sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][2], this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][0],
+ sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][1],
+ sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][2], 255);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xC8], 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelRupeeTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x4C], 12, 0);
+
+ FileSelect_SplitNumber((u16)this->rupees[sp20C], &digits[0], &digits[1], &digits[2]);
+
+ for (vtxOffset = 0, i = sWalletFirstDigit[this->walletUpgrades[sp20C]]; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ if (this->rupees[sp20C] == gUpgradeCapacities[4][this->walletUpgrades[sp20C]]) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 120, 255, 0, this->fileInfoAlpha[fileIndex]);
+ } else if (this->rupees[sp20C] != 0) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 100, 100, 100, this->fileInfoAlpha[fileIndex]);
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x40], 12, 0);
+
+ for (vtxOffset = 0, i = sWalletFirstDigit[this->walletUpgrades[sp20C]]; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xCC], 4, 0);
+
+ POLY_OPA_DISP = FileSelect_DrawTexQuadIA8(
+ POLY_OPA_DISP, sFileSelHeartPieceTextures[this->heartPieceCount[sp20C]], 0x18, 0x10, (s16)0);
+
+ if (this->defenseHearts[sp20C] == 0) {
+ heartType = 0;
+ } else {
+ heartType = 1;
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, sHeartPrimColors[heartType][0], sHeartPrimColors[heartType][1],
+ sHeartPrimColors[heartType][2], this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sHeartEnvColors[heartType][0], sHeartEnvColors[heartType][1],
+ sHeartEnvColors[heartType][2], 255);
+
+ i = this->healthCapacity[sp20C] / 0x10;
+
+ health = this->health[sp20C];
+ if (health <= 0x30) {
+ health = 0x30;
+ }
+
+ quarterHeartCount = 4;
+ for (vtxOffset = 0, j = 0; j < i; j++, vtxOffset += 4) {
+ if (health < 0x10) {
+ if (health != 0) {
+ quarterHeartCount = sHealthToQuarterHeartCount[health];
+ health = 0;
+ } else {
+ quarterHeartCount = 0;
+ }
+ } else {
+ health -= 0x10;
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x68 + vtxOffset], 4, 0);
+ POLY_OPA_DISP =
+ FileSelect_DrawTexQuadIA8(POLY_OPA_DISP, sHeartTextures[heartType][quarterHeartCount], 0x10, 0x10, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ for (vtxOffset = 0, j = 0; j < 4; j++, vtxOffset += 4) {
+ if (this->questItems[sp20C] & gBitFlags[j]) {
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xB8 + vtxOffset], 4, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileSelRemainsTextures[j], G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xD0], 8, 0);
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelMASKSENGTex, G_IM_FMT_I, 64, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x60], 8, 0);
+
+ FileSelect_SplitNumber(this->maskCount[sp20C], &digits[0], &digits[1], &digits[2]);
+
+ for (vtxOffset = 0, i = 1; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x58], 8, 0);
+
+ for (vtxOffset = 0, i = 1; i < 3; i++, vtxOffset += 4) {
+
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ if (this->isOwlSave[fileIndex + 2]) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->nameAlpha[fileIndex]);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xD8], 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelOwlSaveIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 12, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xDC], 8, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, sFileSelDayENGTextures[this->day[sp20C]], G_IM_FMT_I, 48, 24, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ timeDigits[0] = 0;
+ timeDigits[1] = TIME_TO_MINUTES_F(this->time[sp20C]) / 60.0f;
+
+ while (timeDigits[1] >= 10) {
+ timeDigits[0]++;
+ timeDigits[1] -= 10;
+ }
+
+ timeDigits[3] = 0;
+ timeDigits[4] = (s32)TIME_TO_MINUTES_F(this->time[sp20C]) % 60;
+
+ while (timeDigits[4] >= 10) {
+ timeDigits[3]++;
+ timeDigits[4] -= 10;
+ }
+ timeDigits[2] = 0x41;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xF8], 20, 0);
+
+ for (i = 0, vtxOffset = 0; i < 5; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + timeDigits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xE4], 20, 0);
+
+ for (i = 0, vtxOffset = 0; i < 5; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + timeDigits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+TexturePtr sFileInfoBoxTextures[] = {
+ gFileSelFileInfoBox0Tex, gFileSelFileInfoBox1Tex, gFileSelFileInfoBox2Tex, gFileSelFileInfoBox3Tex,
+ gFileSelFileInfoBox4Tex, gFileSelFileExtraInfoBox0Tex, gFileSelFileExtraInfoBox1Tex,
+};
+
+TexturePtr sTitleLabels[] = {
+ gFileSelPleaseSelectAFileENGTex, gFileSelOpenThisFileENGTex, gFileSelCopyWhichFileENGTex,
+ gFileSelCopyToWhichFileENGTex, gFileSelAreYouSureCopyENGTex, gFileSelFileCopiedENGTex,
+ gFileSelEraseWhichFileENGTex, gFileSelAreYouSureEraseENGTex, gFileSelFileErasedENGTex,
+};
+
+TexturePtr sWarningLabels[] = {
+ gFileSelNoFileToCopyENGTex, gFileSelNoFileToEraseENGTex, gFileSelNoEmptyFileENGTex,
+ gFileSelFileEmptyENGTex, gFileSelFileInUseENGTex,
+};
+
+TexturePtr sFileButtonTextures[] = {
+ gFileSelFile1ButtonENGTex,
+ gFileSelFile2ButtonENGTex,
+ gFileSelFile3ButtonENGTex,
+};
+
+TexturePtr sActionButtonTextures[] = {
+ gFileSelCopyButtonENGTex,
+ gFileSelEraseButtonENGTex,
+ gFileSelYesButtonENGTex,
+ gFileSelQuitButtonENGTex,
+};
+
+/**
+ * Draw most window contents including buttons, labels, and icons.
+ * Does not include anything from the keyboard and settings windows.
+ */
+void FileSelect_DrawWindowContents(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 fileIndex;
+ s16 temp;
+ s16 i;
+ s16 quadVtxIndex;
+
+ if (1) {}
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ // draw title label
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[0], 4, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sTitleLabels[this->titleLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ // draw next title label
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_NEXT]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sTitleLabels[this->nextTitleLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ temp = 4;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // draw file info box (large box when a file is selected)
+ for (fileIndex = 0; fileIndex < 3; fileIndex++, temp += 28) {
+ if (fileIndex < 2) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[temp], 28, 0);
+
+ for (quadVtxIndex = 0, i = 0; i < 7; i++, quadVtxIndex += 4) {
+ if ((i < 5) || (this->isOwlSave[fileIndex + 2] && (i >= 5))) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileInfoBoxTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b,
+ sFileInfoBoxPartWidths[i], 56, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1,
+ 0);
+ }
+ }
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ for (i = 0; i < 3; i++, temp += 16) {
+ if (i < 2) {
+ // draw file button
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[temp], 16, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->fileButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileButtonTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ // draw file name box
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->nameBoxAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelFileNameBoxTex, G_IM_FMT_IA, G_IM_SIZ_16b, 108, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->connectorAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);
+
+ if (this->isOwlSave[i + 2]) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->nameBoxAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelBlankButtonTex, G_IM_FMT_IA, G_IM_SIZ_16b, 52, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 12, 14, 15, 13, 0);
+ }
+ }
+ }
+
+ // draw file info
+ for (fileIndex = 0; fileIndex < 2; fileIndex++) {
+ FileSelect_DrawFileInfo(&this->state, fileIndex);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[0x3AC], 20, 0);
+
+ // draw primary action buttons (copy/erase)
+ for (quadVtxIndex = 0, i = 0; i < 2; i++, quadVtxIndex += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->actionButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sActionButtonTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // draw confirm buttons (yes/quit)
+ for (quadVtxIndex = 0, i = FS_BTN_CONFIRM_YES; i <= FS_BTN_CONFIRM_QUIT; i++, quadVtxIndex += 4) {
+ temp = this->confirmButtonTexIndices[i];
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->confirmButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sActionButtonTextures[temp], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1, 0);
+ }
+
+ // draw options button
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->optionButtonAlpha);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelOptionsButtonENGTex, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);
+
+ // draw highlight over currently selected button
+ if (((this->menuMode == FS_MENU_MODE_CONFIG) &&
+ ((this->configMode == CM_MAIN_MENU) || (this->configMode == CM_SELECT_COPY_SOURCE) ||
+ (this->configMode == CM_SELECT_COPY_DEST) || (this->configMode == CM_COPY_CONFIRM) ||
+ (this->configMode == CM_ERASE_SELECT) || (this->configMode == CM_ERASE_CONFIRM))) ||
+ ((this->menuMode == FS_MENU_MODE_SELECT) && (this->selectMode == SM_CONFIRM_FILE))) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1],
+ this->highlightColor[2], this->highlightColor[3]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelBigButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 72, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 12, 14, 15, 13, 0);
+ }
+
+ // draw warning labels
+ if (this->warningLabel > FS_WARNING_NONE) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->emptyFileTextAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sWarningLabels[this->warningLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 16, 18, 19, 17, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_ConfigModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+ FileSelect_SetWindowVtx(&this->state);
+ FileSelect_SetWindowContentVtx(&this->state);
+
+ if ((this->configMode != CM_NAME_ENTRY) && (this->configMode != CM_START_NAME_ENTRY)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+
+ if (this->windowRot != 0) {
+ Matrix_RotateXFApply(this->windowRot / 100.0f);
+ }
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawWindowContents(&this->state);
+ }
+
+ // draw name entry menu
+ if ((this->configMode >= CM_ROTATE_TO_NAME_ENTRY) && (this->configMode <= CM_NAME_ENTRY_TO_MAIN)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply((this->windowRot - 314.0f) / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawNameEntry(&this->state);
+ }
+
+ // draw options menu
+ if ((this->configMode >= CM_MAIN_TO_OPTIONS) && (this->configMode <= CM_OPTIONS_TO_MAIN)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply((this->windowRot - 314.0f) / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawOptions(&this->state);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+/**
+ * Fade out the main menu elements to transition to select mode.
+ * Update function for `SM_FADE_MAIN_TO_SELECT`
+ */
+void FileSelect_FadeMainToSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] -= 50;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->fileButtonAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameAlpha[i] = this->nameBoxAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] -= 255 / 4;
+ }
+ } else {
+ if (SLOT_OCCUPIED(this, i)) {
+ this->nameAlpha[i] = this->nameBoxAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] -= 255 / 4;
+ }
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->selectMode++; // SM_MOVE_FILE_TO_TOP
+ this->confirmButtonIndex = FS_BTN_CONFIRM_YES;
+ }
+}
+
+// Amount to move by to reach the top of the screen
+s16 sFileYOffsets[] = { 0, 16, 32 };
+
+/**
+ * Moves the selected file to the top of the window.
+ * Update function for `SM_MOVE_FILE_TO_TOP`
+ */
+void FileSelect_MoveSelectedFileToTop(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex] - sFileYOffsets[this->buttonIndex]) / this->actionTimer;
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ this->actionTimer--;
+
+ if ((this->actionTimer == 0) || (this->buttonYOffsets[this->buttonIndex] == sFileYOffsets[this->buttonIndex])) {
+ this->buttonYOffsets[FS_BTN_SELECT_YES] = this->buttonYOffsets[FS_BTN_SELECT_QUIT] = -24;
+ this->actionTimer = 4;
+ this->selectMode++; // SM_FADE_IN_FILE_INFO
+ }
+}
+
+/**
+ * Fade in the file info for the selected file.
+ * Update function for `SM_FADE_IN_FILE_INFO`
+ */
+void FileSelect_FadeInFileInfo(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] += 50;
+ this->nameBoxAlpha[this->buttonIndex] -= 100;
+
+ if (this->nameBoxAlpha[this->buttonIndex] <= 0) {
+ this->nameBoxAlpha[this->buttonIndex] = 0;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileInfoAlpha[this->buttonIndex] = 200;
+ this->actionTimer = 4;
+ this->selectMode++; // SM_CONFIRM_FILE
+ }
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] =
+ this->fileInfoAlpha[this->buttonIndex];
+}
+
+/**
+ * Update the cursor and handle the option that the player picks for confirming the selected file.
+ * Update function for `SM_CONFIRM_FILE`
+ */
+void FileSelect_ConfirmFile(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_START) || (CHECK_BTN_ALL(input->press.button, BTN_A))) {
+ if (this->confirmButtonIndex == FS_BTN_CONFIRM_YES) {
+ Rumble_Request(300.0f, 180, 20, 100);
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->selectMode = SM_FADE_OUT;
+ func_801A4058(0xF);
+ } else { // FS_BTN_CONFIRM_QUIT
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ this->selectMode++; // SM_FADE_OUT_FILE_INFO
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ this->selectMode++; // SM_FADE_OUT_FILE_INFO
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->confirmButtonIndex ^= 1;
+ }
+}
+
+/**
+ * Fade out the file info for the selected file before returning to the main menu.
+ * Update function for `SM_FADE_OUT_FILE_INFO`
+ */
+void FileSelect_FadeOutFileInfo(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[FS_BTN_SELECT_YES] = this->buttonYOffsets[FS_BTN_SELECT_QUIT] = 0;
+ this->nameBoxAlpha[this->buttonIndex] = 200;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->actionTimer = 4;
+ this->selectMode++;
+ }
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] =
+ this->fileInfoAlpha[this->buttonIndex];
+}
+
+/**
+ * Move the selected file back to the slot position then go to config mode for the main menu.
+ * Update function for `SM_MOVE_FILE_TO_SLOT`
+ */
+void FileSelect_MoveSelectedFileToSlot(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s32 yStep;
+ s16 i;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex]) / this->actionTimer;
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+
+ if (this->buttonYOffsets[this->buttonIndex] <= 0) {
+ this->buttonYOffsets[this->buttonIndex] = 0;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (this->fileButtonAlpha[i] >= 200) {
+ this->fileButtonAlpha[i] = 200;
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->fileButtonAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else {
+ if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->actionTimer = 4;
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_MAIN_MENU;
+ this->nextConfigMode = CM_MAIN_MENU;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ }
+}
+
+/**
+ * Fill the screen with black to fade out.
+ * Update function for `SM_FADE_OUT`
+ */
+void FileSelect_FadeOut(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->screenFillAlpha += 40;
+
+ if (this->screenFillAlpha >= 255) {
+ this->screenFillAlpha = 255;
+ this->selectMode++; // SM_LOAD_GAME
+ }
+}
+
+/**
+ * Load the save for the appropriate file and start the game.
+ * Update function for `SM_LOAD_GAME`
+ */
+void FileSelect_LoadGame(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ u16 i;
+
+ gSaveContext.fileNum = this->buttonIndex;
+ Sram_OpenSave(this, &this->sramCtx);
+
+ gSaveContext.gameMode = GAMEMODE_NORMAL;
+
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
+
+ gSaveContext.respawnFlag = 0;
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = ENTR_LOAD_OPENING;
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ gSaveContext.showTitleCard = true;
+ gSaveContext.dogParams = 0;
+
+ for (i = 0; i < TIMER_ID_MAX; i++) {
+ gSaveContext.timerStates[i] = TIMER_STATE_OFF;
+ }
+
+ gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
+ gSaveContext.nayrusLoveTimer = 0;
+ gSaveContext.healthAccumulator = 0;
+ gSaveContext.magicFlag = 0;
+ gSaveContext.forcedSeqId = 0;
+ gSaveContext.skyboxTime = CLOCK_TIME(0, 0);
+ gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
+ gSaveContext.cutsceneTrigger = 0;
+ gSaveContext.chamberCutsceneNum = 0;
+ gSaveContext.nextDayTime = 0xFFFF;
+ gSaveContext.retainWeatherMode = false;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+
+ gSaveContext.hudVisibilityForceButtonAlphasByStatus = false;
+ gSaveContext.nextHudVisibility = HUD_VISIBILITY_IDLE;
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ gSaveContext.hudVisibilityTimer = 0;
+
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
+}
+
+void (*sSelectModeUpdateFuncs[])(GameState*) = {
+ FileSelect_FadeMainToSelect, // SM_FADE_MAIN_TO_SELECT
+ FileSelect_MoveSelectedFileToTop, // SM_MOVE_FILE_TO_TOP
+ FileSelect_FadeInFileInfo, // SM_FADE_IN_FILE_INFO
+ FileSelect_ConfirmFile, // SM_CONFIRM_FILE
+ FileSelect_FadeOutFileInfo, // SM_FADE_OUT_FILE_INFO
+ FileSelect_MoveSelectedFileToSlot, // SM_MOVE_FILE_TO_SLOT
+ FileSelect_FadeOut, // SM_FADE_OUT
+ FileSelect_LoadGame, // SM_LOAD_GAME
+};
+
+void FileSelect_SelectModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ sSelectModeUpdateFuncs[this->selectMode](&this->state);
+}
+
+void FileSelect_SelectModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+ FileSelect_SetWindowVtx(&this->state);
+ FileSelect_SetWindowContentVtx(&this->state);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(this->windowRot / 100.0f);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ FileSelect_DrawWindowContents(&this->state);
+ gDPPipeSync(POLY_OPA_DISP++);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_UpdateAndDrawSkybox(FileSelectState* this) {
+ s32 pad;
+ f32 eyeX;
+ f32 eyeY;
+ f32 eyeZ;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ eyeX = 1000.0f * Math_CosS(sFileSelectSkyboxRotation) - 1000.0f * Math_SinS(sFileSelectSkyboxRotation);
+ eyeY = -700.0f;
+ eyeZ = 1000.0f * Math_SinS(sFileSelectSkyboxRotation) + 1000.0f * Math_CosS(sFileSelectSkyboxRotation);
+
+ FileSelect_SetView(this, eyeX, eyeY, eyeZ);
+ Skybox_Draw(&this->skyboxCtx, this->state.gfxCtx, SKYBOX_NORMAL_SKY, this->envCtx.skyboxBlend, eyeX, eyeY, eyeZ);
+
+ gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_NONE);
+
+ sFileSelectSkyboxRotation += -0xA;
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void (*gFileSelectDrawFuncs[])(GameState*) = {
+ FileSelect_InitModeDraw, // FS_MENU_MODE_INIT
+ FileSelect_ConfigModeDraw, // FS_MENU_MODE_CONFIG
+ FileSelect_SelectModeDraw, // FS_MENU_MODE_SELECT
+};
+void (*gFileSelectUpdateFuncs[])(GameState*) = {
+ FileSelect_InitModeUpdate, // FS_MENU_MODE_INIT
+ FileSelect_ConfigModeUpdate, // FS_MENU_MODE_CONFIG
+ FileSelect_SelectModeUpdate, // FS_MENU_MODE_SELECT
+};
+
+TexturePtr D_808147B4[] = { gFileSelPleaseWaitENGTex, gFileSelDecideCancelENGTex, gFileSelDecideSaveENGTex };
+s16 D_808147C0[] = { 144, 144, 152 };
+s16 D_808147C8[] = { 90, 90, 86 };
+
+void FileSelect_Main(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+ s32 texIndex;
+ s32 pad;
+
+ func_8012CF0C(this->state.gfxCtx, 0, 1, 0, 0, 0);
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x01, this->staticSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x02, this->parameterSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, this->titleSegment);
+
+ this->stickAdjX = input->rel.stick_x;
+ this->stickAdjY = input->rel.stick_y;
+
+ if (this->stickAdjX < -30) {
+ if (this->stickXDir == -1) {
+ this->inputTimerX--;
+ if (this->inputTimerX < 0) {
+ this->inputTimerX = 2;
+ } else {
+ this->stickAdjX = 0;
+ }
+ } else {
+ this->inputTimerX = 10;
+ this->stickXDir = -1;
+ }
+ } else if (this->stickAdjX > 30) {
+ if (this->stickXDir == 1) {
+ this->inputTimerX--;
+ if (this->inputTimerX < 0) {
+ this->inputTimerX = 2;
+ } else {
+ this->stickAdjX = 0;
+ }
+ } else {
+ this->inputTimerX = 10;
+ this->stickXDir = 1;
+ }
+ } else {
+ this->stickXDir = 0;
+ }
+
+ if (this->stickAdjY < -30) {
+ if (this->stickYDir == -1) {
+ this->inputTimerY--;
+ if (this->inputTimerY < 0) {
+ this->inputTimerY = 2;
+ } else {
+ this->stickAdjY = 0;
+ }
+ } else {
+ this->inputTimerY = 10;
+ this->stickYDir = -1;
+ }
+ } else if (this->stickAdjY > 30) {
+ if (this->stickYDir == 1) {
+ this->inputTimerY--;
+ if (this->inputTimerY < 0) {
+ this->inputTimerY = 2;
+ } else {
+ this->stickAdjY = 0;
+ }
+ } else {
+ this->inputTimerY = 10;
+ this->stickYDir = 1;
+ }
+ } else {
+ this->stickYDir = 0;
+ }
+
+ this->emptyFileTextAlpha = 0;
+
+ FileSelect_PulsateCursor(&this->state);
+ gFileSelectUpdateFuncs[this->menuMode](&this->state);
+ FileSelect_UpdateAndDrawSkybox(this);
+ gFileSelectDrawFuncs[this->menuMode](&this->state);
+
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 255, 255, this->controlsAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ if (this->sramCtx.status > 0) {
+ texIndex = 0;
+ } else if ((this->configMode >= CM_MAIN_TO_OPTIONS) && (this->configMode <= CM_OPTIONS_TO_MAIN)) {
+ texIndex = 2;
+ } else {
+ texIndex = 1;
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, D_808147B4[texIndex], G_IM_FMT_IA, G_IM_SIZ_8b, D_808147C0[texIndex], 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
+ G_TX_NOLOD);
+
+ gSPTextureRectangle(POLY_OPA_DISP++, D_808147C8[texIndex] << 2, 204 << 2,
+ (D_808147C8[texIndex] + D_808147C0[texIndex]) << 2, (204 + 16) << 2, G_TX_RENDERTILE, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gSPDisplayList(POLY_OPA_DISP++, sScreenFillSetupDL);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, this->screenFillAlpha);
+ gSPDisplayList(POLY_OPA_DISP++, D_0E000000.fillRect);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_InitContext(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ EnvironmentContext* envCtx = &this->envCtx;
+
+ Sram_Alloc(&this->state, &this->sramCtx);
+ func_801457CC(&this->state, &this->sramCtx);
+
+ this->menuMode = FS_MENU_MODE_INIT;
+
+ this->buttonIndex = this->selectMode = this->selectedFileIndex = this->copyDestFileIndex =
+ this->confirmButtonIndex = 0;
+
+ this->confirmButtonTexIndices[0] = 2;
+ this->confirmButtonTexIndices[1] = 3;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+
+ this->screenFillAlpha = 255;
+ this->highlightPulseDir = 1;
+ this->unk_244F4 = 0xC;
+ this->highlightColor[0] = 155;
+ this->highlightColor[1] = 255;
+ this->highlightColor[2] = 255;
+ this->highlightColor[3] = 70;
+ this->configMode = CM_FADE_IN_START;
+ this->windowRot = 0.0f;
+
+ this->stickXDir = this->inputTimerX = 0;
+ this->stickYDir = this->inputTimerY = 0;
+
+ this->kbdX = this->kbdY = this->charIndex = 0;
+
+ this->kbdButton = FS_KBD_BTN_NONE;
+
+ this->windowColor[0] = 100;
+ this->windowColor[1] = 150;
+ this->windowColor[2] = 255;
+
+ this->windowAlpha = this->titleAlpha[FS_TITLE_CUR] = this->titleAlpha[FS_TITLE_NEXT] = this->fileButtonAlpha[0] =
+ this->fileButtonAlpha[1] = this->fileButtonAlpha[2] = this->nameBoxAlpha[0] = this->nameBoxAlpha[1] =
+ this->nameBoxAlpha[2] = this->nameAlpha[0] = this->nameAlpha[1] = this->nameAlpha[2] =
+ this->connectorAlpha[0] = this->connectorAlpha[1] = this->connectorAlpha[2] = this->fileInfoAlpha[0] =
+ this->fileInfoAlpha[1] = this->fileInfoAlpha[2] = this->actionButtonAlpha[FS_BTN_ACTION_COPY] =
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] = this->actionButtonAlpha[2] =
+ this->actionButtonAlpha[3] = this->optionButtonAlpha = this->nameEntryBoxAlpha =
+ this->controlsAlpha = this->emptyFileTextAlpha = 0;
+
+ this->windowPosX = 6;
+ this->actionTimer = 4;
+ this->warningLabel = FS_WARNING_NONE;
+
+ this->warningButtonIndex = this->buttonYOffsets[0] = this->buttonYOffsets[1] = this->buttonYOffsets[2] =
+ this->buttonYOffsets[3] = this->buttonYOffsets[4] = this->buttonYOffsets[5] = this->fileNamesY[0] =
+ this->fileNamesY[1] = this->fileNamesY[2] = 0;
+
+ this->unk_2451E[0] = 0;
+ this->unk_2451E[1] = 3;
+ this->unk_2451E[2] = 6;
+ this->unk_2451E[3] = 8;
+ this->unk_2451E[4] = 10;
+ this->highlightTimer = 20;
+
+ ShrinkWindow_Letterbox_SetSizeTarget(0);
+
+ gSaveContext.skyboxTime = 0;
+ gSaveContext.save.time = 0;
+
+ Skybox_Init(&this->state, &this->skyboxCtx, 1);
+ R_TIME_SPEED = 10;
+
+ envCtx->changeSkyboxState = 0;
+ envCtx->changeSkyboxTimer = 0;
+ envCtx->changeLightEnabled = false;
+ envCtx->changeLightTimer = 0;
+ envCtx->skyboxDmaState = 0;
+ envCtx->skybox1Index = 99;
+ envCtx->skybox2Index = 99;
+ envCtx->lightConfig = 0;
+ envCtx->changeLightNextConfig = 0;
+ envCtx->lightSetting = 0;
+ envCtx->skyboxConfig = 2;
+ envCtx->skyboxDisabled = 0;
+ envCtx->skyboxBlend = 0;
+ envCtx->glareAlpha = 0.0f;
+ envCtx->lensFlareAlphaScale = 0.0f;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+}
+
+void FileSelect_Destroy(GameState* this) {
+ ShrinkWindow_Destroy();
+}
+
+void FileSelect_Init(GameState* thisx) {
+ s32 pad;
+ FileSelectState* this = (FileSelectState*)thisx;
+ size_t size;
+
+ Game_SetFramerateDivisor(&this->state, 1);
+ Matrix_Init(&this->state);
+ ShrinkWindow_Init();
+ View_Init(&this->view, this->state.gfxCtx);
+ this->state.main = FileSelect_Main;
+ this->state.destroy = FileSelect_Destroy;
+ FileSelect_InitContext(&this->state);
+ Font_LoadOrderedFont(&this->font);
+
+ size = SEGMENT_ROM_SIZE(title_static);
+ this->staticSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(title_static), size);
+
+ size = SEGMENT_ROM_SIZE(parameter_static);
+ this->parameterSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->parameterSegment, SEGMENT_ROM_START(parameter_static), size);
+
+ size = gObjectTable[OBJECT_MAG].vromEnd - gObjectTable[OBJECT_MAG].vromStart;
+ this->titleSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->titleSegment, gObjectTable[OBJECT_MAG].vromStart, size);
+
+ Audio_SetSpec(0xA);
+ // Setting ioData to 1 and writing it to ioPort 7 will skip the harp intro
+ Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, NA_BGM_FILE_SELECT, 0, 7, 1);
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
new file mode 100644
index 000000000..7f8e5789c
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
@@ -0,0 +1,1253 @@
+/*
+ * File: z_file_copy_erase.c
+ * Overlay: ovl_file_choose
+ * Description: Copying and Erasing Files
+ */
+
+#include "z_file_select.h"
+#include "z64rumble.h"
+
+// When choosing a file to copy or erase, the 6 main menu buttons are placed at these offsets
+s16 sChooseFileYOffsets[] = { -48, -48, -48, -24, -24, 0 };
+
+s16 D_8081424C[3][3] = {
+ { 0, -48, -48 },
+ { -64, 16, -48 },
+ { -64, -64, 32 },
+};
+
+s16 sEraseDelayTimer = 15;
+
+/**
+ * Move buttons into place for the select source screen and fade in the proper labels.
+ * Update function for `CM_SETUP_COPY_SOURCE`
+ */
+void FileSelect_SetupCopySource(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+ s16 i;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] -= 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] -= 200 / 4;
+ this->optionButtonAlpha -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 200;
+ this->titleLabel = this->nextTitleLabel;
+
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode++; // CM_SELECT_COPY_SOURCE
+ }
+}
+
+/**
+ * Allow the player to select a file to copy or exit back to the main menu.
+ * Update function for `CM_SELECT_COPY_SOURCE`
+ */
+void FileSelect_SelectCopySource(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_MAIN_COPY;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode = CM_COPY_RETURN_MAIN;
+ this->warningLabel = FS_WARNING_NONE;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_COPY_DEST_1;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_COPY_DEST_1;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ if (this->buttonIndex > FS_BTN_COPY_QUIT) {
+ this->buttonIndex = FS_BTN_COPY_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex != FS_BTN_COPY_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ }
+}
+
+/**
+ * Move the menu buttons into place for the copy destination selection and switch titles.
+ * Update function for `CM_SETUP_COPY_DEST_1`
+ */
+void FileSelect_SetupCopyDest1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+ s16 i;
+
+ for (i = 0; i < 3; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_8081424C[this->buttonIndex][i]) / this->actionTimer;
+
+ if (D_8081424C[this->buttonIndex][i] >= this->buttonYOffsets[i]) {
+ this->buttonYOffsets[i] += yStep;
+ } else {
+ this->buttonYOffsets[i] -= yStep;
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->nameBoxAlpha[this->buttonIndex] -= 200 / 4;
+
+ this->actionTimer--;
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[this->buttonIndex] = D_8081424C[this->buttonIndex][this->buttonIndex];
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_SETUP_COPY_DEST_2
+ }
+}
+
+/**
+ * Show the file info of the file selected to copy from.
+ * Update function for `CM_SETUP_COPY_DEST_2`
+ */
+void FileSelect_SetupCopyDest2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameBoxAlpha[this->buttonIndex] -= 200 / 4;
+ this->fileInfoAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->nameBoxAlpha[this->buttonIndex] = 0;
+ this->fileInfoAlpha[this->buttonIndex] = 200;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->actionTimer = 4;
+ this->configMode = CM_SELECT_COPY_DEST;
+ }
+}
+
+/**
+ * Allow the player to select a slot to copy to or exit to the copy select screen.
+ * Update function for `CM_SELECT_COPY_DEST`
+ */
+void FileSelect_SelectCopyDest(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = this->selectedFileIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ this->actionTimer = 4;
+ this->configMode = CM_EXIT_TO_COPY_SOURCE_1;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->copyDestFileIndex = this->buttonIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_CONFIRM;
+ this->actionTimer = 4;
+ this->configMode = CM_SETUP_COPY_CONFIRM_1;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->copyDestFileIndex = this->buttonIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_CONFIRM;
+ this->actionTimer = 4;
+ this->configMode = CM_SETUP_COPY_CONFIRM_1;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ if (this->buttonIndex == this->selectedFileIndex) {
+ this->buttonIndex--;
+ if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ } else if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex > FS_BTN_COPY_QUIT) {
+ this->buttonIndex = FS_BTN_COPY_FILE_1;
+ }
+ if (this->buttonIndex == this->selectedFileIndex) {
+ this->buttonIndex++;
+ }
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ }
+ }
+ if (this->buttonIndex != FS_BTN_COPY_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_IN_USE;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_IN_USE;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ }
+}
+
+/**
+ * Fade out file info, bring back the name box, and get ready to return to copy source screen.
+ * Update function for `CM_EXIT_TO_COPY_SOURCE_1`
+ */
+void FileSelect_ExitToCopySource1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ this->nameBoxAlpha[this->buttonIndex] = 200;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_EXIT_TO_COPY_SOURCE_2
+ }
+}
+
+/**
+ * Move the buttons back into place and return to copy source select.
+ * Update function for `CM_EXIT_TO_COPY_SOURCE_2`
+ */
+void FileSelect_ExitToCopySource2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 3; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode = CM_SELECT_COPY_SOURCE;
+ }
+}
+
+s16 D_80814264[] = { -56, -40, -24, 0 };
+
+/**
+ * Rearrange buttons on the screen to prepare for copy confirmation.
+ * Update function for `CM_SETUP_COPY_CONFIRM_1`
+ */
+void FileSelect_SetupCopyConfirm1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+
+ for (i = 0; i < 3; i++) {
+ if ((i != this->copyDestFileIndex) && (i != this->selectedFileIndex)) {
+ this->fileButtonAlpha[i] -= 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (i == this->copyDestFileIndex) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_80814264[i]) / this->actionTimer;
+ this->buttonYOffsets[i] += yStep;
+
+ if (this->buttonYOffsets[i] >= D_80814264[i]) {
+ this->buttonYOffsets[i] = D_80814264[i];
+ }
+ }
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->configMode++;
+ }
+}
+
+/**
+ * Fade in the 'Yes' button before allowing the player to decide.
+ * Update function for `CM_SETUP_COPY_CONFIRM_2`
+ */
+void FileSelect_SetupCopyConfirm2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->configMode = CM_COPY_CONFIRM;
+ this->buttonIndex = FS_BTN_CONFIRM_QUIT;
+ }
+}
+
+/**
+ * Allow the player to confirm the copy, or quit back to the destination select.
+ * If yes is selected, the actual copy occurs in this function before moving on to the animation.
+ * Update function for `CM_COPY_CONFIRM`
+ */
+void FileSelect_CopyConfirm(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+ u16 dayTime;
+
+ if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ this->configMode = CM_RETURN_TO_COPY_DEST;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ dayTime = gSaveContext.save.time;
+ gSaveContext.save.time = dayTime;
+ this->nameAlpha[this->copyDestFileIndex] = 0;
+ this->fileInfoAlpha[this->copyDestFileIndex] = this->nameAlpha[this->copyDestFileIndex];
+ this->nextTitleLabel = FS_TITLE_COPY_COMPLETE;
+ this->actionTimer = 4;
+ Sram_CopySave(this, sramCtx);
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_COPY_ANIM_1;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->copyDestFileIndex * 2],
+ gFlashSpecialSaveNumPages[this->copyDestFileIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_COPY_WAIT_FOR_FLASH_SAVE;
+ }
+ Rumble_Request(300.0f, 180, 20, 100);
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->buttonIndex ^= 1;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_COPY_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_CopyWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ u16 i;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_COPY_ANIM_1;
+
+ for (i = 0; i < 6; i++) {
+ this->newf[this->copyDestFileIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
+ }
+
+ this->threeDayResetCount[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
+
+ for (i = 0; i < 8; i++) {
+ this->fileNames[this->copyDestFileIndex][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
+ }
+
+ this->healthCapacity[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ this->health[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.health;
+ this->defenseHearts[this->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ }
+}
+
+/**
+ * Move buttons back in place and return to copy destination select.
+ * Update function for `CM_RETURN_TO_COPY_DEST`
+ */
+void FileSelect_ReturnToCopyDest(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+
+ for (i = 0; i < 3; i++) {
+ if ((i != this->copyDestFileIndex) && (i != this->selectedFileIndex)) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_8081424C[this->selectedFileIndex][i]) / this->actionTimer;
+
+ if (D_8081424C[this->selectedFileIndex][i] >= this->buttonYOffsets[i]) {
+ this->buttonYOffsets[i] += yStep;
+ } else {
+ this->buttonYOffsets[i] -= yStep;
+ }
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode = CM_SELECT_COPY_DEST;
+ }
+}
+
+/**
+ * Hide title
+ * Update function for `CM_COPY_ANIM_1`
+ */
+void FileSelect_CopyAnim1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleAlpha[FS_TITLE_CUR] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_COPY_ANIM_2
+ }
+}
+
+/**
+ * Move a copy of the file window down and fade in the file info.
+ * Update function for `CM_COPY_ANIM_2`
+ */
+void FileSelect_CopyAnim2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+
+ this->fileInfoAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->nameAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ yStep = ABS_ALT(this->fileNamesY[this->copyDestFileIndex] + 56) / this->actionTimer;
+ this->fileNamesY[this->copyDestFileIndex] -= yStep;
+
+ if (this->fileNamesY[this->copyDestFileIndex] <= -56) {
+ this->fileNamesY[this->copyDestFileIndex] = -56;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 45;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode++; // CM_COPY_ANIM_3
+ }
+}
+
+/**
+ * Play a sound effect to indicate that the copy has completed. Wait for a timer or for
+ * the player to press a button before moving on.
+ * Update function for `CM_COPY_ANIM_3`
+ */
+void FileSelect_CopyAnim3(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (this->actionTimer == 38) {
+ this->connectorAlpha[this->copyDestFileIndex] = 255;
+ play_sound(NA_SE_EV_DIAMOND_SWITCH);
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer < 37) {
+ if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_B | BTN_START) || (this->actionTimer == 0)) {
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_COPY_ANIM_4;
+ }
+ }
+}
+
+/**
+ * Fade out the info boxes for both files and bring in their name boxes. Fade out title.
+ * Update function for `CM_COPY_ANIM_4`
+ */
+void FileSelect_CopyAnim4(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->selectedFileIndex] -= 200 / 4;
+ this->fileInfoAlpha[this->copyDestFileIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->selectedFileIndex] += 200 / 4;
+ this->nameBoxAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileNamesY[this->copyDestFileIndex] = this->buttonYOffsets[3] = 0;
+ this->actionTimer = 4;
+ this->titleAlpha[FS_TITLE_CUR] = 0;
+ this->configMode++;
+ }
+}
+
+/**
+ * Restore all buttons and labels back to their original place and go back to the main menu.
+ * Update function for `CM_COPY_ANIM_5`
+ */
+void FileSelect_CopyAnim5(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] += 200 / 4;
+ this->optionButtonAlpha += 200 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ for (i = 0; i < 3; i++) {
+ this->connectorAlpha[i] = 0;
+ this->fileButtonAlpha[i] = 200;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->connectorAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] = 255;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] = 255;
+ }
+ }
+
+ this->fileNamesY[this->selectedFileIndex] = 0;
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
+
+/**
+ * Exit from the copy source screen to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_COPY_RETURN_MAIN`
+ */
+void FileSelect_ExitCopyToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
+
+/**
+ * Move buttons into place for the erase select screen and fade in the proper labels.
+ * Update function for `CM_SETUP_ERASE_SELECT`
+ */
+void FileSelect_SetupEraseSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] -= 100;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] -= 100;
+ this->optionButtonAlpha -= 100;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] += 200 / 4;
+
+ if (this->actionButtonAlpha[FS_BTN_ACTION_COPY] <= 0) {
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 200;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ this->configMode++; // CM_ERASE_SELECT
+ }
+}
+
+/**
+ * Allow the player to select a file to erase or exit back to the main menu.
+ * Update function for `CM_ERASE_SELECT`
+ */
+void FileSelect_EraseSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = FS_BTN_MAIN_ERASE;
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode = CM_EXIT_ERASE_TO_MAIN;
+ this->warningLabel = FS_WARNING_NONE;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_ERASE_CONFIRM_1;
+ this->nextTitleLabel = FS_TITLE_ERASE_CONFIRM;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_ERASE_CONFIRM_1;
+ this->nextTitleLabel = FS_TITLE_ERASE_CONFIRM;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ if (this->buttonIndex == FS_BTN_ERASE_FILE_3) {
+ this->buttonIndex = FS_BTN_ERASE_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_ERASE_FILE_1) {
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex == FS_BTN_ERASE_FILE_3) {
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ }
+ if (this->buttonIndex > FS_BTN_ERASE_QUIT) {
+ this->buttonIndex = FS_BTN_ERASE_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex != FS_BTN_ERASE_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+}
+
+s16 D_8081426C[] = { 0, 16, 32 };
+
+/**
+ * Update function for `CM_SETUP_ERASE_CONFIRM_1`
+ */
+void FileSelect_SetupEraseConfirm1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] -= 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else {
+ this->nameBoxAlpha[i] -= 200 / 4;
+ }
+ }
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 8;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 8;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex] - D_8081426C[this->buttonIndex]) / this->actionTimer;
+
+ if (this->buttonYOffsets[this->buttonIndex] >= D_8081426C[this->buttonIndex]) {
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+ } else {
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] = 0;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] = 0;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i] = 0;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] = 0;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i] = 0;
+ }
+ } else {
+ this->nameBoxAlpha[i] = 0;
+ }
+ }
+
+ this->buttonYOffsets[this->buttonIndex] = D_8081426C[this->buttonIndex];
+ this->actionTimer = 4;
+ this->configMode++;
+ }
+}
+
+/**
+ * Show the file info of the file selected to erase.
+ * Update function for `CM_SETUP_ERASE_CONFIRM_2`
+ */
+void FileSelect_SetupEraseConfirm2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 8;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 8;
+ this->fileInfoAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->titleLabel = this->nextTitleLabel;
+ this->fileInfoAlpha[this->buttonIndex] = this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = 200;
+ this->buttonIndex = FS_BTN_CONFIRM_QUIT;
+ this->configMode = CM_ERASE_CONFIRM;
+ }
+}
+
+/**
+ * Allow the player to confirm their choice to erase or return back to erase select.
+ * Update function for `CM_ERASE_CONFIRM`
+ */
+void FileSelect_EraseConfirm(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = this->selectedFileIndex;
+ this->nextTitleLabel = FS_TITLE_ERASE_FILE;
+ this->configMode = CM_EXIT_TO_ERASE_SELECT_1;
+ this->actionTimer = 4;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ Sram_EraseSave(this, sramCtx, this->selectedFileIndex);
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_ERASE_ANIM_1;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->selectedFileIndex * 2],
+ gFlashSpecialSaveNumPages[this->selectedFileIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_ERASE_WAIT_FOR_FLASH_SAVE;
+ }
+ this->connectorAlpha[this->selectedFileIndex] = 0;
+ play_sound(NA_SE_EV_DIAMOND_SWITCH);
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_ERASE_COMPLETE;
+ Rumble_Request(200.0f, 255, 20, 150);
+ sEraseDelayTimer = 15;
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->buttonIndex ^= 1;
+ }
+}
+
+/**
+ * Fade out file info, bring back the name box, and get ready to return to erase select screen.
+ * Update function for `CM_EXIT_TO_ERASE_SELECT_1`
+ */
+void FileSelect_ExitToEraseSelect1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->configMode++; // CM_EXIT_TO_ERASE_SELECT_2
+ }
+}
+
+/**
+ * Move the buttons back into place and return to erase select.
+ * Update function for `CM_EXIT_TO_ERASE_SELECT_2`
+ */
+void FileSelect_ExitToEraseSelect2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ yStep =
+ ABS_ALT(this->buttonYOffsets[this->buttonIndex] - sChooseFileYOffsets[this->buttonIndex]) / this->actionTimer;
+
+ if (this->buttonYOffsets[this->buttonIndex] >= sChooseFileYOffsets[this->buttonIndex]) {
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+ } else {
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[this->buttonIndex] = sChooseFileYOffsets[this->buttonIndex];
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_ERASE_SELECT;
+ }
+}
+
+/**
+ * Wait for an initial delay, then start fading out the selected file.
+ * The actual file deletion occurs in this function.
+ * Update function for `CM_ERASE_ANIM_1`
+ */
+void FileSelect_EraseAnim1(GameState* thisx) {
+ static s16 D_80814E80;
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ if (sEraseDelayTimer == 0) {
+ if (this->actionTimer == 4) {
+ D_80814E80 = 1;
+ }
+
+ if (this->actionTimer != 0) {
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->fileInfoAlpha[this->selectedFileIndex] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ }
+
+ this->fileNamesY[this->selectedFileIndex] -= D_80814E80;
+ D_80814E80 += 2;
+
+ this->actionTimer--;
+ if (this->actionTimer == 0) {
+ this->configMode = CM_ERASE_ANIM_2;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = this->connectorAlpha[this->selectedFileIndex] = 0;
+
+ //! FAKE: there should be a better chained assignment
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ if (1) {}
+ if (0) {}
+ this->fileInfoAlpha[this->selectedFileIndex] = this->nameAlpha[this->selectedFileIndex] =
+ this->nameBoxAlpha[this->selectedFileIndex] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT];
+
+ this->actionTimer = 45;
+ }
+ } else {
+ sEraseDelayTimer--;
+
+ if (sEraseDelayTimer == 0) {
+ play_sound(NA_SE_OC_ABYSS);
+ }
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_ERASE_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_EraseWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ u16 i;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_ERASE_ANIM_1;
+ for (i = 0; i < 6; i++) {
+ this->newf[this->selectedFileIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
+ }
+ }
+}
+
+/**
+ * Wait for a delay timer or for the palyer to press a button before returning to the main menu.
+ * Update function for `CM_ERASE_ANIM_2`
+ */
+void FileSelect_EraseAnim2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_B | BTN_START) || (--this->actionTimer == 0)) {
+ this->buttonYOffsets[3] = 0;
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode++; // CM_ERASE_ANIM_3
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+}
+
+/**
+ * Exit from the erase animation to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_ERASE_ANIM_3`
+ */
+void FileSelect_EraseAnim3(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+
+ if (this->fileButtonAlpha[this->selectedFileIndex] >= 200) {
+ this->fileButtonAlpha[this->selectedFileIndex] = 200;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileNamesY[this->selectedFileIndex] = 0;
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
+
+/**
+ * Exit from the erase select screen to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_EXIT_ERASE_TO_MAIN`
+ */
+void FileSelect_ExitEraseToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] += 200 / 4;
+ this->optionButtonAlpha += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 2;
+
+ if (this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] <= 0) {
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
index c6e3983d8..02236002a 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
@@ -1,78 +1,1059 @@
/*
* File: z_file_nameset_NES.c
* Overlay: ovl_file_choose
- * Description:
+ * Description: Entering name on a new file, selecting options from the options menu
*/
-#include "z_file_choose.h"
+#include "prevent_bss_reordering.h"
+#include "z_file_select.h"
#include "z64rumble.h"
+#include "misc/title_static/title_static.h"
+#include "overlays/ovl_file_choose/ovl_file_choose.h"
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
+void FileSelect_DrawTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture, s16 point) {
+ OPEN_DISPS(gfxCtx);
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804010.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808041A0.s")
+void FileSelect_DrawMultiTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture1, TexturePtr texture2, s16 point) {
+ OPEN_DISPS(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804654.s")
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture1, 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);
+ gDPLoadMultiBlock_4b(POLY_OPA_DISP++, texture2, 0x0080, 1, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808047D8.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080489C.s")
+s16 D_80814280[] = {
+ 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 0, 3, 1, 0,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804DAC.s")
+s16 D_80814304[] = {
+ 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3,
+ 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804E74.s")
+s16 D_80814384[] = {
+ 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804F98.s")
+s16 D_80814404[] = {
+ -94, -96, -48, 0, 32, 64,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080525C.s")
+s16 D_80814410[] = {
+ 56, 44, 44, 28, 28, 44,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808052B0.s")
+s16 D_8081441C[] = {
+ 72, -48, -48, -48, -48, -48,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808054A4.s")
+void FileSelect_SetKeyboardVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 phi_t2;
+ s16 phi_t0;
+ s16 phi_t3;
+ s16 phi_s1;
+ s16 phi_t1;
+ s16 phi_s2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808055D0.s")
+ this->keyboardVtx = GRAPH_ALLOC(this->state.gfxCtx, sizeof(Vtx) * 4 * 5 * 13);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808058A4.s")
+ phi_s1 = 0x26;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805918.s")
+ for (phi_t2 = 0, phi_s2 = 0, phi_t3 = 0; phi_s2 < 5; phi_s2++) {
+ phi_t0 = -0x60;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805A58.s")
+ for (phi_t1 = 0; phi_t1 < 13; phi_t1++, phi_t3 += 4, phi_t2++) {
+ //! @bug D_80814304 is accessed out of bounds when drawing the empty space character (value of 64). Under
+ //! normal circumstances it reads a halfword from D_80814384.
+ this->keyboardVtx[phi_t3].v.ob[0] = this->keyboardVtx[phi_t3 + 2].v.ob[0] = D_80814304[phi_t2] + phi_t0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805B30.s")
+ this->keyboardVtx[phi_t3 + 1].v.ob[0] = this->keyboardVtx[phi_t3 + 3].v.ob[0] =
+ D_80814304[phi_t2] + phi_t0 + 12;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805C1C.s")
+ this->keyboardVtx[phi_t3].v.ob[1] = this->keyboardVtx[phi_t3 + 1].v.ob[1] = phi_s1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806014.s")
+ this->keyboardVtx[phi_t3 + 2].v.ob[1] = this->keyboardVtx[phi_t3 + 3].v.ob[1] = phi_s1 - 12;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806148.s")
+ this->keyboardVtx[phi_t3].v.ob[2] = this->keyboardVtx[phi_t3 + 1].v.ob[2] =
+ this->keyboardVtx[phi_t3 + 2].v.ob[2] = this->keyboardVtx[phi_t3 + 3].v.ob[2] = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806310.s")
+ this->keyboardVtx[phi_t3].v.flag = this->keyboardVtx[phi_t3 + 1].v.flag =
+ this->keyboardVtx[phi_t3 + 2].v.flag = this->keyboardVtx[phi_t3 + 3].v.flag = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808067E0.s")
+ this->keyboardVtx[phi_t3].v.tc[0] = this->keyboardVtx[phi_t3].v.tc[1] =
+ this->keyboardVtx[phi_t3 + 1].v.tc[1] = this->keyboardVtx[phi_t3 + 2].v.tc[0] = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806BC8.s")
+ this->keyboardVtx[phi_t3 + 1].v.tc[0] = this->keyboardVtx[phi_t3 + 2].v.tc[1] =
+ this->keyboardVtx[phi_t3 + 3].v.tc[0] = this->keyboardVtx[phi_t3 + 3].v.tc[1] = 16 << 5;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806CA0.s")
+ this->keyboardVtx[phi_t3].v.cn[0] = this->keyboardVtx[phi_t3 + 1].v.cn[0] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[0] = this->keyboardVtx[phi_t3 + 3].v.cn[0] =
+ this->keyboardVtx[phi_t3].v.cn[1] = this->keyboardVtx[phi_t3 + 1].v.cn[1] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[1] = this->keyboardVtx[phi_t3 + 3].v.cn[1] =
+ this->keyboardVtx[phi_t3].v.cn[2] = this->keyboardVtx[phi_t3 + 1].v.cn[2] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[2] = this->keyboardVtx[phi_t3 + 3].v.cn[2] =
+ this->keyboardVtx[phi_t3].v.cn[3] = this->keyboardVtx[phi_t3 + 1].v.cn[3] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[3] = this->keyboardVtx[phi_t3 + 3].v.cn[3] =
+ 255;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806E84.s")
+ phi_t0 += 0x10;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806F30.s")
+ phi_s1 -= 0x10;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808071E4.s")
+ this->keyboard2Vtx = GRAPH_ALLOC(this->state.gfxCtx, sizeof(Vtx) * 24);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807390.s")
+ for (phi_t1 = 0, phi_t3 = 0; phi_t3 < 6; phi_t3++, phi_t1 += 4) {
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080742C.s")
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[0] = this->keyboard2Vtx[phi_t1 + 2].v.ob[0] = D_80814404[phi_t3] + 1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808074B4.s")
+ this->keyboard2Vtx[phi_t1 + 1].v.ob[0] = this->keyboard2Vtx[phi_t1 + 3].v.ob[0] =
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[0] + D_80814410[phi_t3] - 2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808077AC.s")
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[1] = this->keyboard2Vtx[phi_t1 + 1].v.ob[1] = D_8081441C[phi_t3] - 1;
+
+ this->keyboard2Vtx[phi_t1 + 2].v.ob[1] = this->keyboard2Vtx[phi_t1 + 3].v.ob[1] =
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[1] - 0xE;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[2] = this->keyboard2Vtx[phi_t1 + 1].v.ob[2] =
+ this->keyboard2Vtx[phi_t1 + 2].v.ob[2] = this->keyboard2Vtx[phi_t1 + 3].v.ob[2] = 0;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.flag = this->keyboard2Vtx[phi_t1 + 1].v.flag =
+ this->keyboard2Vtx[phi_t1 + 2].v.flag = this->keyboard2Vtx[phi_t1 + 3].v.flag = 0;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.tc[0] = this->keyboard2Vtx[phi_t1 + 0].v.tc[1] =
+ this->keyboard2Vtx[phi_t1 + 1].v.tc[1] = this->keyboard2Vtx[phi_t1 + 2].v.tc[0] = 0;
+
+ this->keyboard2Vtx[phi_t1 + 1].v.tc[0] = this->keyboard2Vtx[phi_t1 + 3].v.tc[0] = D_80814410[phi_t3] << 5;
+
+ this->keyboard2Vtx[phi_t1 + 2].v.tc[1] = this->keyboard2Vtx[phi_t1 + 3].v.tc[1] = 16 << 5;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[0] = this->keyboard2Vtx[phi_t1 + 1].v.cn[0] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[0] = this->keyboard2Vtx[phi_t1 + 3].v.cn[0] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[1] = this->keyboard2Vtx[phi_t1 + 1].v.cn[1] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[1] = this->keyboard2Vtx[phi_t1 + 3].v.cn[1] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[2] = this->keyboard2Vtx[phi_t1 + 1].v.cn[2] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[2] = this->keyboard2Vtx[phi_t1 + 3].v.cn[2] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[3] = this->keyboard2Vtx[phi_t1 + 1].v.cn[3] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[3] = this->keyboard2Vtx[phi_t1 + 3].v.cn[3] =
+ 255;
+ }
+}
+
+TexturePtr sBackspaceEndTextures[] = {
+ gFileSelBackspaceButtonTex,
+ gFileSelENDButtonENGTex,
+};
+
+u16 sBackspaceEndWidths[] = { 28, 44 };
+
+s16 D_80814434[] = {
+ -30, -16, -6, 4, 14, 24, 34, 44, 54, -16, -16, 0,
+};
+
+s16 D_8081444C[] = {
+ 72, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0,
+};
+
+/**
+ * Set vertices used by all elements of the name entry screen that are NOT the keyboard.
+ * This includes the cursor highlight, the name entry plate and characters, and the buttons.
+ */
+void FileSelect_SetNameEntryVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ u8 temp;
+ s16 var_s0;
+ s16 var_t1;
+ s16 sp108;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gSPVertex(POLY_OPA_DISP++, this->keyboard2Vtx, 24, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelNameENGTex, G_IM_FMT_IA, G_IM_SIZ_8b, 56, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ for (var_t1 = 0, var_s0 = 0x10; var_t1 < 2; var_t1++, var_s0 += 4) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sBackspaceEndTextures[var_t1], G_IM_FMT_IA, G_IM_SIZ_16b,
+ sBackspaceEndWidths[var_t1], 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, var_s0, var_s0 + 2, var_s0 + 3, var_s0 + 1, 0);
+ }
+
+ this->nameEntryVtx = GRAPH_ALLOC(this->state.gfxCtx, 44 * sizeof(Vtx));
+
+ for (var_s0 = 0, var_t1 = 0; var_t1 < 44; var_t1 += 4, var_s0++) {
+ if ((var_s0 > 0) && (var_s0 < 9)) {
+ temp = this->fileNames[this->buttonIndex][var_s0 - 1];
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] = this->nameEntryVtx[var_t1 + 2].v.ob[0] =
+ D_80814434[var_s0] + this->nameEntryBoxPosX + D_80814280[temp];
+
+ this->nameEntryVtx[var_t1 + 1].v.ob[0] = this->nameEntryVtx[var_t1 + 3].v.ob[0] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] + 10;
+ } else {
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] = this->nameEntryVtx[var_t1 + 2].v.ob[0] =
+ D_80814434[var_s0] + this->nameEntryBoxPosX;
+
+ this->nameEntryVtx[var_t1 + 1].v.ob[0] = this->nameEntryVtx[var_t1 + 3].v.ob[0] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] + 10;
+ }
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[1] = this->nameEntryVtx[var_t1 + 1].v.ob[1] = D_8081444C[var_s0];
+
+ this->nameEntryVtx[var_t1 + 2].v.ob[1] = this->nameEntryVtx[var_t1 + 3].v.ob[1] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[1] - 10;
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[2] = this->nameEntryVtx[var_t1 + 1].v.ob[2] =
+ this->nameEntryVtx[var_t1 + 2].v.ob[2] = this->nameEntryVtx[var_t1 + 3].v.ob[2] = 0;
+
+ this->nameEntryVtx[var_t1 + 0].v.flag = this->nameEntryVtx[var_t1 + 1].v.flag =
+ this->nameEntryVtx[var_t1 + 2].v.flag = this->nameEntryVtx[var_t1 + 3].v.flag = 0;
+
+ this->nameEntryVtx[var_t1 + 0].v.tc[0] = this->nameEntryVtx[var_t1 + 0].v.tc[1] =
+ this->nameEntryVtx[var_t1 + 1].v.tc[1] = this->nameEntryVtx[var_t1 + 2].v.tc[0] = 0;
+
+ this->nameEntryVtx[var_t1 + 1].v.tc[0] = this->nameEntryVtx[var_t1 + 2].v.tc[1] =
+ this->nameEntryVtx[var_t1 + 3].v.tc[0] = this->nameEntryVtx[var_t1 + 3].v.tc[1] = 16 << 5;
+
+ this->nameEntryVtx[var_t1 + 0].v.cn[0] = this->nameEntryVtx[var_t1 + 1].v.cn[0] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[0] = this->nameEntryVtx[var_t1 + 3].v.cn[0] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[1] = this->nameEntryVtx[var_t1 + 1].v.cn[1] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[1] = this->nameEntryVtx[var_t1 + 3].v.cn[1] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[2] = this->nameEntryVtx[var_t1 + 1].v.cn[2] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[2] = this->nameEntryVtx[var_t1 + 3].v.cn[2] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[3] = this->nameEntryVtx[var_t1 + 1].v.cn[3] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[3] = this->nameEntryVtx[var_t1 + 3].v.cn[3] =
+ 255;
+ }
+
+ this->nameEntryVtx[1].v.ob[0] = this->nameEntryVtx[3].v.ob[0] = this->nameEntryVtx[0].v.ob[0] + 0x6C;
+ this->nameEntryVtx[2].v.ob[1] = this->nameEntryVtx[3].v.ob[1] = this->nameEntryVtx[0].v.ob[1] - 0x10;
+ this->nameEntryVtx[1].v.tc[0] = this->nameEntryVtx[3].v.tc[0] = 108 << 5;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->nameEntryBoxAlpha);
+ gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx, 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelFileNameBoxTex, G_IM_FMT_IA, G_IM_SIZ_16b, 108, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx + 4, 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->nameEntryBoxAlpha);
+
+ for (sp108 = 0, var_s0 = 0; var_s0 < 0x20; var_s0 += 4, sp108++) {
+ FileSelect_DrawTexQuadI4(
+ this->state.gfxCtx, font->fontBuf + this->fileNames[this->buttonIndex][sp108] * FONT_CHAR_TEX_SIZE, var_s0);
+ }
+
+ this->nameEntryVtx[37].v.tc[0] = this->nameEntryVtx[38].v.tc[1] = this->nameEntryVtx[39].v.tc[0] =
+ this->nameEntryVtx[39].v.tc[1] = this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[42].v.tc[1] =
+ this->nameEntryVtx[43].v.tc[0] = this->nameEntryVtx[43].v.tc[1] = 24 << 5;
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 56 << 5;
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 40 << 5;
+ }
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawKeyboard(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ s16 i;
+ s16 tmp;
+ s16 vtx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, COMBINED, 0,
+ 0, 0, COMBINED);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, this->charBgAlpha, 255, 255, 255, 255);
+
+ for (i = 0, vtx = 0; vtx < 0x100; vtx += 32) {
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0);
+
+ for (tmp = 0; tmp < 32; i++, tmp += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + D_808141F0[i] * FONT_CHAR_TEX_SIZE, tmp);
+ }
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0);
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + D_808141F0[i] * FONT_CHAR_TEX_SIZE, 0);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Font* font = &this->font;
+ Input* input = CONTROLLER1(&this->state);
+ s16 i;
+ s16 tmp;
+ u16 time;
+ s16 validName;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ FileSelect_SetKeyboardVtx(&this->state);
+ FileSelect_SetNameEntryVtx(&this->state);
+ FileSelect_PulsateCursor(&this->state);
+
+ tmp = (this->newFileNameCharCount * 4) + 4;
+ this->nameEntryVtx[36].v.ob[0] = this->nameEntryVtx[38].v.ob[0] = this->nameEntryVtx[tmp].v.ob[0] - 6;
+ this->nameEntryVtx[37].v.ob[0] = this->nameEntryVtx[39].v.ob[0] = this->nameEntryVtx[36].v.ob[0] + 24;
+ this->nameEntryVtx[36].v.ob[1] = this->nameEntryVtx[37].v.ob[1] = this->nameEntryVtx[tmp].v.ob[1] + 7;
+ this->nameEntryVtx[38].v.ob[1] = this->nameEntryVtx[39].v.ob[1] = this->nameEntryVtx[36].v.ob[1] - 24;
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[0] - 4;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 52;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[1] + 4;
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[0] - 4;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 40;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[1] + 4;
+ } else {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboardVtx[this->charIndex * 4].v.ob[0] - D_80814304[this->charIndex] - 6;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 24;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboardVtx[this->charIndex * 4].v.ob[1] + 6;
+ }
+
+ this->nameEntryVtx[42].v.ob[1] = this->nameEntryVtx[43].v.ob[1] = this->nameEntryVtx[40].v.ob[1] - 24;
+
+ gSPVertex(POLY_OPA_DISP++, &this->nameEntryVtx[36], 8, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1], this->highlightColor[2],
+ this->highlightColor[3]);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelCharHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 24, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelMediumButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 56, 24, 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);
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelSmallButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 40, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ }
+
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ FileSelect_DrawKeyboard(&this->state);
+ gDPPipeSync(POLY_OPA_DISP++);
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ if (this->configMode == CM_NAME_ENTRY) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_START)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ // place cursor on END button
+ this->kbdY = 5;
+ this->kbdX = 4;
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+ }
+ } else {
+ if (this->charPage <= FS_CHAR_PAGE_ENG) {
+ if (this->kbdY != 5) {
+ // draw the character the cursor is hovering over in yellow
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 0, 255);
+
+ //! @bug D_80814384 is accessed out of bounds when drawing the empty space character (value of 64).
+ //! Under normal circumstances it reads a halfword from D_80814404.
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 2].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] + D_80814384[this->charIndex] - 2;
+
+ this->keyboardVtx[(this->charIndex * 4) + 1].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 3].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] + 0x10;
+
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 1].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] + 2;
+
+ this->keyboardVtx[(this->charIndex * 4) + 2].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 3].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] - 0x10;
+
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[this->charIndex * 4], 4, 0);
+
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + D_808141F0[this->charIndex] * FONT_CHAR_TEX_SIZE, 0);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_S);
+ this->fileNames[this->buttonIndex][this->newFileNameCharCount] = D_808141F0[this->charIndex];
+
+ this->newFileNameCharCount++;
+
+ if (this->newFileNameCharCount > 7) {
+ this->newFileNameCharCount = 7;
+ }
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ if (this->charPage != this->kbdButton) {
+ if (this->kbdButton == FS_KBD_BTN_BACKSPACE) {
+ if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ }
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+ } else if (this->kbdButton == FS_KBD_BTN_END) {
+ validName = false;
+
+ for (i = 0; i < 8; i++) {
+ if (this->fileNames[this->buttonIndex][i] != 0x3E) {
+ validName = true;
+ break;
+ }
+ }
+
+ if (validName) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ gSaveContext.fileNum = this->buttonIndex;
+ time = ((void)0, gSaveContext.save.time);
+ Sram_InitSave(this, sramCtx);
+ gSaveContext.save.time = time;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->buttonIndex * 2],
+ gFlashSpecialSaveNumPages[this->buttonIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE;
+ }
+
+ this->nameBoxAlpha[this->buttonIndex] = this->nameAlpha[this->buttonIndex] = 200;
+ this->connectorAlpha[this->buttonIndex] = 255;
+ Rumble_Request(300.0f, 180, 20, 100);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ }
+ }
+ }
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->newFileNameCharCount++;
+
+ if (this->newFileNameCharCount > 7) {
+ this->newFileNameCharCount = 7;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ }
+ }
+ }
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+/**
+ * Fade in the name entry box and slide it to the center of the screen from the right side.
+ * After the name entry box is in place, init the keyboard/cursor and change modes.
+ * Update function for `CM_START_NAME_ENTRY`
+ */
+void FileSelect_StartNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameEntryBoxAlpha += 25;
+
+ if (this->nameEntryBoxAlpha >= 255) {
+ this->nameEntryBoxAlpha = 255;
+ }
+
+ this->nameEntryBoxPosX -= 30;
+
+ if (this->nameEntryBoxPosX <= 0) {
+ this->nameEntryBoxPosX = 0;
+ this->nameEntryBoxAlpha = 255;
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->configMode = CM_NAME_ENTRY;
+ }
+}
+
+/**
+ * Update the keyboard cursor and play sound effects at the appropriate times.
+ * There are many special cases for warping the cursor depending on where
+ * the cursor currently is.
+ * Update function for `CM_NAME_ENTRY`
+ */
+void FileSelect_UpdateKeyboardCursor(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 prevKbdX;
+
+ this->kbdButton = FS_KBD_BTN_NONE;
+
+ if (this->kbdY != 5) {
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->charIndex--;
+ this->kbdX--;
+ if (this->kbdX < 0) {
+ this->kbdX = 12;
+ this->charIndex = (this->kbdY * 13) + this->kbdX;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->charIndex++;
+ this->kbdX++;
+ if (this->kbdX > 12) {
+ this->kbdX = 0;
+ this->charIndex = (this->kbdY * 13) + this->kbdX;
+ }
+ }
+ } else {
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdX--;
+ if (this->kbdX < 3) {
+ this->kbdX = 4;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdX++;
+ if (this->kbdX > 4) {
+ this->kbdX = 3;
+ }
+ }
+ }
+
+ if (this->stickAdjY > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ this->kbdY--;
+
+ if (this->kbdY < 0) {
+ // Don't go to bottom row
+ if (this->kbdX < 8) {
+ this->kbdY = 4;
+ this->charIndex = (s32)(this->kbdX + 52);
+ } else {
+ this->kbdY = 5;
+ this->charIndex += 52;
+ prevKbdX = this->kbdX;
+
+ if (this->kbdX < 10) {
+ this->kbdX = 3;
+ } else if (this->kbdX < 13) {
+ this->kbdX = 4;
+ }
+ this->unk_2451E[this->kbdX] = prevKbdX;
+ }
+ } else {
+ this->charIndex -= 13;
+
+ if (this->kbdY == 4) {
+ this->charIndex = 52;
+ this->kbdX = this->unk_2451E[this->kbdX];
+ this->charIndex += this->kbdX;
+ }
+ }
+ } else if (this->stickAdjY < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdY++;
+
+ if (this->kbdY > 5) {
+ this->kbdY = 0;
+ this->kbdX = this->unk_2451E[this->kbdX];
+ this->charIndex = this->kbdX;
+ } else {
+ this->charIndex += 13;
+
+ if (this->kbdY == 5) {
+ if (this->kbdX < 8) {
+ this->kbdY = 0;
+ this->charIndex = this->kbdX;
+ } else {
+ prevKbdX = this->kbdX;
+
+ if (this->kbdX < 3) {
+ this->kbdX = 0;
+ } else if (this->kbdX < 6) {
+ this->kbdX = 1;
+ } else if (this->kbdX < 8) {
+ this->kbdX = 2;
+ } else if (this->kbdX < 10) {
+ this->kbdX = 3;
+ } else if (this->kbdX < 13) {
+ this->kbdX = 4;
+ }
+ this->unk_2451E[this->kbdX] = prevKbdX;
+ }
+ }
+ }
+ }
+ if (this->kbdY == 5) {
+ this->kbdButton = this->kbdX;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_NameEntryWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ }
+}
+
+/**
+ * This function is mostly a copy paste of `FileSelect_StartNameEntry`.
+ * The name entry box fades and slides in even though it is not visible.
+ * After this is complete, change to the options config mode.
+ * Update function for `CM_START_OPTIONS`
+ */
+void FileSelect_StartOptions(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameEntryBoxAlpha += 25;
+
+ if (this->nameEntryBoxAlpha >= 255) {
+ this->nameEntryBoxAlpha = 255;
+ }
+
+ this->nameEntryBoxPosX -= 30;
+
+ if (this->nameEntryBoxPosX <= 0) {
+ this->nameEntryBoxPosX = 0;
+ this->nameEntryBoxAlpha = 255;
+ this->configMode = CM_OPTIONS_MENU;
+ }
+}
+
+u8 sSelectedSetting;
+// bss padding
+s32 D_80814E94;
+s32 D_80814E98;
+s32 D_80814E9C;
+s32 D_80814EA0;
+
+/**
+ * Update the cursor and appropriate settings for the options menu.
+ * If the player presses B, write the selected options to the SRAM header
+ * and set config mode to rotate back to the main menu.
+ * Update function for `CM_OPTIONS_MENU`
+ */
+void FileSelect_UpdateOptionsMenu(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ Sram_WriteSaveOptionsToBuffer(sramCtx);
+
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_OPTIONS_TO_MAIN;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[8], gFlashSpecialSaveNumPages[8]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_OPTIONS_WAIT_FOR_FLASH_SAVE;
+ }
+ func_801A3D98(gSaveContext.options.audioSetting);
+ return;
+ }
+
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gSaveContext.options.audioSetting--;
+
+ // because audio setting is unsigned, can't check for < 0
+ if (gSaveContext.options.audioSetting > 0xF0) {
+ gSaveContext.options.audioSetting = SAVE_AUDIO_SURROUND;
+ }
+ } else {
+ gSaveContext.options.zTargetSetting ^= 1;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gSaveContext.options.audioSetting++;
+ if (gSaveContext.options.audioSetting > SAVE_AUDIO_SURROUND) {
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
+ }
+ } else {
+ gSaveContext.options.zTargetSetting ^= 1;
+ }
+ }
+
+ if ((this->stickAdjY < -30) || (this->stickAdjY > 30)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ sSelectedSetting ^= 1;
+ return;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ sSelectedSetting ^= 1;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_OPTIONS_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_OptionsWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_OPTIONS_TO_MAIN;
+ }
+}
+
+typedef struct {
+ /* 0x0 */ TexturePtr texture;
+ /* 0x4 */ u16 width;
+ /* 0x6 */ u16 height;
+} OptionsMenuTextureInfo; // size = 0x8
+
+OptionsMenuTextureInfo gOptionsMenuHeaders[] = {
+ { gFileSelOptionsENGTex, 128, 16 }, { gFileSelSoundENGTex, 64, 16 },
+ { gFileSelTargetingENGTex, 64, 16 }, { gFileSelCheckBrightnessENGTex, 96, 16 },
+ { gFileSelDolbySurroundLogoENGTex, 48, 17 },
+};
+
+OptionsMenuTextureInfo gOptionsMenuSettings[] = {
+ { gFileSelStereoENGTex, 48, 16 }, { gFileSelMonoENGTex, 48, 16 }, { gFileSelHeadsetENGTex, 48, 16 },
+ { gFileSelSurroundENGTex, 48, 16 }, { gFileSelSwitchENGTex, 48, 16 }, { gFileSelHoldENGTex, 48, 16 },
+};
+
+void FileSelect_DrawOptionsImpl(GameState* thisx) {
+ static s16 sCursorPrimRed = 255;
+ static s16 sCursorPrimGreen = 255;
+ static s16 sCursorPrimBlue = 255;
+ static s16 sCursorEnvRed = 0;
+ static s16 sCursorEnvGreen = 0;
+ static s16 sCursorEnvBlue = 0;
+ static s16 sCursorPulseDir = 1;
+ static s16 sCursorFlashTimer = 20;
+ static s16 sCursorPrimColors[][3] = {
+ { 255, 255, 255 },
+ { 0, 255, 255 },
+ };
+ static s16 sCursorEnvColors[][3] = {
+ { 0, 0, 0 },
+ { 0, 150, 150 },
+ };
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 cursorRedStep;
+ s16 cursorGreenStep;
+ s16 cursorBlueStep;
+ s16 i;
+ s16 j;
+ s16 vtx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ cursorRedStep = ABS_ALT(sCursorPrimRed - sCursorPrimColors[sCursorPulseDir][0]) / sCursorFlashTimer;
+ cursorGreenStep = ABS_ALT(sCursorPrimGreen - sCursorPrimColors[sCursorPulseDir][1]) / sCursorFlashTimer;
+ cursorBlueStep = ABS_ALT(sCursorPrimBlue - sCursorPrimColors[sCursorPulseDir][2]) / sCursorFlashTimer;
+
+ if (sCursorPrimRed >= sCursorPrimColors[sCursorPulseDir][0]) {
+ sCursorPrimRed -= cursorRedStep;
+ } else {
+ sCursorPrimRed += cursorRedStep;
+ }
+
+ if (sCursorPrimGreen >= sCursorPrimColors[sCursorPulseDir][1]) {
+ sCursorPrimGreen -= cursorGreenStep;
+ } else {
+ sCursorPrimGreen += cursorGreenStep;
+ }
+
+ if (sCursorPrimBlue >= sCursorPrimColors[sCursorPulseDir][2]) {
+ sCursorPrimBlue -= cursorBlueStep;
+ } else {
+ sCursorPrimBlue += cursorBlueStep;
+ }
+
+ cursorRedStep = ABS_ALT(sCursorEnvRed - sCursorEnvColors[sCursorPulseDir][0]) / sCursorFlashTimer;
+ cursorGreenStep = ABS_ALT(sCursorEnvGreen - sCursorEnvColors[sCursorPulseDir][1]) / sCursorFlashTimer;
+ cursorBlueStep = ABS_ALT(sCursorEnvBlue - sCursorEnvColors[sCursorPulseDir][2]) / sCursorFlashTimer;
+
+ if (sCursorEnvRed >= sCursorEnvColors[sCursorPulseDir][0]) {
+ sCursorEnvRed -= cursorRedStep;
+ } else {
+ sCursorEnvRed += cursorRedStep;
+ }
+
+ if (sCursorEnvGreen >= sCursorEnvColors[sCursorPulseDir][1]) {
+ sCursorEnvGreen -= cursorGreenStep;
+ } else {
+ sCursorEnvGreen += cursorGreenStep;
+ }
+
+ if (sCursorEnvBlue >= sCursorEnvColors[sCursorPulseDir][2]) {
+ sCursorEnvBlue -= cursorBlueStep;
+ } else {
+ sCursorEnvBlue += cursorBlueStep;
+ }
+
+ if (--sCursorFlashTimer == 0) {
+ sCursorPrimRed = sCursorPrimColors[sCursorPulseDir][0];
+ sCursorPrimGreen = sCursorPrimColors[sCursorPulseDir][1];
+ sCursorPrimBlue = sCursorPrimColors[sCursorPulseDir][2];
+
+ sCursorEnvRed = sCursorEnvColors[sCursorPulseDir][0];
+ sCursorEnvGreen = sCursorEnvColors[sCursorPulseDir][1];
+ sCursorEnvBlue = sCursorEnvColors[sCursorPulseDir][2];
+
+ sCursorFlashTimer = 20;
+
+ if (++sCursorPulseDir > 1) {
+ sCursorPulseDir = 0;
+ }
+ }
+
+ // blue divider lines
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelOptionsDividerTex, G_IM_FMT_IA, 256, 2, 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);
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.1f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerTopVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.2f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerMiddleVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.4f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerBottomVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ gSPVertex(POLY_OPA_DISP++, D_80813DF0, 32, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ for (i = 0, vtx = 0; i < 5; i++, vtx += 4) {
+ if (i == 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ if (gSaveContext.options.audioSetting == SAVE_AUDIO_SURROUND) {
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuHeaders[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuHeaders[i].width, gOptionsMenuHeaders[i].height, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ gSPVertex(POLY_OPA_DISP++, D_80813F30, 32, 0);
+
+ for (i = 0, vtx = 0; i < 4; i++, vtx += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ if (i == gSaveContext.options.audioSetting) {
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimRed, sCursorPrimGreen, sCursorPrimBlue,
+ this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvRed, sCursorEnvGreen, sCursorEnvBlue, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuSettings[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuSettings[i].width, gOptionsMenuHeaders[i].height, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ for (; i < 6; i++, vtx += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ if (i == (gSaveContext.options.zTargetSetting + 4)) {
+ if (sSelectedSetting == FS_SETTING_ZTARGET) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimRed, sCursorPrimGreen, sCursorPrimBlue,
+ this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvRed, sCursorEnvGreen, sCursorEnvBlue, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuSettings[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuSettings[i].width, gOptionsMenuHeaders[i].height, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // check brightness bars
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelBrightnessCheckTex, G_IM_FMT_IA, 96, 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);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 55, 55, 55, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 40, 40, 40, 255);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+
+ vtx += 4;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 30, 30, 30, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawOptions(GameState* thisx) {
+ FileSelect_DrawOptionsImpl(thisx);
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
new file mode 100644
index 000000000..47619b66d
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
@@ -0,0 +1,17 @@
+#include "z_file_select.h"
+
+// Vtx Data
+#include "overlays/ovl_file_choose/ovl_file_choose.c"
+
+u8 D_808141F0[] = {
+ // 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M'
+ /* Row 0 */ 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
+ // 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z'
+ /* Row 1 */ 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23,
+ // 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm'
+ /* Row 2 */ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
+ // 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z'
+ /* Row 3 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
+ // '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' '.' '-' ' '
+ /* Row 4 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x40, 0x3F, 0x3E
+};
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_select.h b/src/overlays/gamestates/ovl_file_choose/z_file_select.h
new file mode 100644
index 000000000..88236e63e
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_select.h
@@ -0,0 +1,332 @@
+#ifndef FILE_SELECT_H
+#define FILE_SELECT_H
+
+#include "global.h"
+#include "z64game.h"
+#include "z64message.h"
+#include "z64skybox.h"
+#include "z64view.h"
+
+
+// `sramCtx->noFlashSaveBuf` is never allocated space, so should never be used
+// Slot offsets are also based on OoT SaveContext sizes, and contains incorrect sizes from MM
+// Macros appear to be remnant from OoT
+#define NO_FLASH_GET_NEWF(sramCtx, slotNum, index) \
+ (sramCtx->noFlashSaveBuf[gSramSlotOffsets[slotNum] + offsetof(SaveContext, save.saveInfo.playerData.newf[index])])
+#define NO_FLASH_SLOT_OCCUPIED(sramCtx, slotNum) \
+ ((NO_FLASH_GET_NEWF(sramCtx, slotNum, 0) == 'Z') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 1) == 'E') || \
+ (NO_FLASH_GET_NEWF(sramCtx, slotNum, 2) == 'L') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 3) == 'D') || \
+ (NO_FLASH_GET_NEWF(sramCtx, slotNum, 4) == 'A') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 5) == '3'))
+
+#define GET_NEWF(fileSelect, slotNum, index) (fileSelect->newf[slotNum][index])
+#define SLOT_OCCUPIED(fileSelect, slotNum) \
+ ((GET_NEWF(fileSelect, slotNum, 0) == 'Z') && (GET_NEWF(fileSelect, slotNum, 1) == 'E') && \
+ (GET_NEWF(fileSelect, slotNum, 2) == 'L') && (GET_NEWF(fileSelect, slotNum, 3) == 'D') && \
+ (GET_NEWF(fileSelect, slotNum, 4) == 'A') && (GET_NEWF(fileSelect, slotNum, 5) == '3'))
+
+// Init mode: Initial setup as the file select is starting up, fades and slides in various menu elements
+// Config mode: Handles the bulk of the file select, various configuration tasks like picking a file, copy/erase, and the options menu
+// Select mode: Displays the selected file with various details about it, and allows the player to confirm and open it
+typedef enum {
+ /* 0 */ FS_MENU_MODE_INIT,
+ /* 1 */ FS_MENU_MODE_CONFIG,
+ /* 2 */ FS_MENU_MODE_SELECT
+} MenuMode;
+
+typedef enum {
+ /* 0x00 */ CM_FADE_IN_START,
+ /* 0x01 */ CM_FADE_IN_END,
+ /* 0x02 */ CM_MAIN_MENU,
+ /* 0x03 */ CM_SETUP_COPY_SOURCE,
+ /* 0x04 */ CM_SELECT_COPY_SOURCE,
+ /* 0x05 */ CM_SETUP_COPY_DEST_1,
+ /* 0x06 */ CM_SETUP_COPY_DEST_2,
+ /* 0x07 */ CM_SELECT_COPY_DEST,
+ /* 0x08 */ CM_EXIT_TO_COPY_SOURCE_1,
+ /* 0x09 */ CM_EXIT_TO_COPY_SOURCE_2,
+ /* 0x0A */ CM_SETUP_COPY_CONFIRM_1,
+ /* 0x0B */ CM_SETUP_COPY_CONFIRM_2,
+ /* 0x0C */ CM_COPY_CONFIRM,
+ /* 0x0D */ CM_COPY_WAIT_FOR_FLASH_SAVE,
+ /* 0x0E */ CM_RETURN_TO_COPY_DEST,
+ /* 0x0F */ CM_COPY_ANIM_1,
+ /* 0x10 */ CM_COPY_ANIM_2,
+ /* 0x11 */ CM_COPY_ANIM_3,
+ /* 0x12 */ CM_COPY_ANIM_4,
+ /* 0x13 */ CM_COPY_ANIM_5,
+ /* 0x14 */ CM_COPY_RETURN_MAIN,
+ /* 0x15 */ CM_SETUP_ERASE_SELECT,
+ /* 0x16 */ CM_ERASE_SELECT,
+ /* 0x17 */ CM_SETUP_ERASE_CONFIRM_1,
+ /* 0x18 */ CM_SETUP_ERASE_CONFIRM_2,
+ /* 0x19 */ CM_ERASE_CONFIRM,
+ /* 0x1A */ CM_EXIT_TO_ERASE_SELECT_1,
+ /* 0x1B */ CM_EXIT_TO_ERASE_SELECT_2,
+ /* 0x1C */ CM_ERASE_ANIM_1,
+ /* 0x1D */ CM_ERASE_WAIT_FOR_FLASH_SAVE,
+ /* 0x1E */ CM_ERASE_ANIM_2,
+ /* 0x1F */ CM_ERASE_ANIM_3,
+ /* 0x20 */ CM_EXIT_ERASE_TO_MAIN,
+ /* 0x21 */ CM_UNUSED_31,
+ /* 0x22 */ CM_ROTATE_TO_NAME_ENTRY,
+ /* 0x23 */ CM_START_NAME_ENTRY,
+ /* 0x24 */ CM_NAME_ENTRY,
+ /* 0x25 */ CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE,
+ /* 0x26 */ CM_NAME_ENTRY_TO_MAIN,
+ /* 0x27 */ CM_MAIN_TO_OPTIONS,
+ /* 0x28 */ CM_START_OPTIONS,
+ /* 0x29 */ CM_OPTIONS_MENU,
+ /* 0x2A */ CM_OPTIONS_WAIT_FOR_FLASH_SAVE,
+ /* 0x2B */ CM_OPTIONS_TO_MAIN,
+ /* 0x2C */ CM_UNUSED_DELAY
+} ConfigMode;
+
+typedef enum {
+ /* 0 */ SM_FADE_MAIN_TO_SELECT,
+ /* 1 */ SM_MOVE_FILE_TO_TOP,
+ /* 2 */ SM_FADE_IN_FILE_INFO,
+ /* 3 */ SM_CONFIRM_FILE,
+ /* 4 */ SM_FADE_OUT_FILE_INFO,
+ /* 5 */ SM_MOVE_FILE_TO_SLOT,
+ /* 6 */ SM_FADE_OUT,
+ /* 7 */ SM_LOAD_GAME
+} SelectMode;
+
+typedef enum {
+ /* 0 */ FS_TITLE_SELECT_FILE, // "Please select a file."
+ /* 1 */ FS_TITLE_OPEN_FILE, // "Open this file?"
+ /* 2 */ FS_TITLE_COPY_FROM, // "Copy which file?"
+ /* 3 */ FS_TITLE_COPY_TO, // "Copy to which file?"
+ /* 4 */ FS_TITLE_COPY_CONFIRM, // "Are you sure?"
+ /* 5 */ FS_TITLE_COPY_COMPLETE, // "File copied."
+ /* 6 */ FS_TITLE_ERASE_FILE, // "Erase which file?"
+ /* 7 */ FS_TITLE_ERASE_CONFIRM, // "Are you sure?"
+ /* 8 */ FS_TITLE_ERASE_COMPLETE // "File erased."
+} TitleLabel;
+
+typedef enum {
+ /* 0 */ FS_TITLE_CUR,
+ /* 1 */ FS_TITLE_NEXT
+} TitleIndex;
+
+typedef enum {
+ /* -1 */ FS_WARNING_NONE = -1,
+ /* 0 */ FS_WARNING_NO_FILE_COPY, // "No file to copy."
+ /* 1 */ FS_WARNING_NO_FILE_ERASE, // "No file to erase."
+ /* 2 */ FS_WARNING_NO_EMPTY_FILES, // "There is no empty file."
+ /* 3 */ FS_WARNING_FILE_EMPTY, // "This is an empty file."
+ /* 4 */ FS_WARNING_FILE_IN_USE // "This file is in use."
+} WarningLabel;
+
+typedef enum {
+ /* 0 */ FS_BTN_MAIN_FILE_1,
+ /* 1 */ FS_BTN_MAIN_FILE_2,
+ /* 2 */ FS_BTN_MAIN_FILE_3,
+ /* 3 */ FS_BTN_MAIN_COPY,
+ /* 4 */ FS_BTN_MAIN_ERASE,
+ /* 5 */ FS_BTN_MAIN_OPTIONS
+} MainMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_COPY_FILE_1,
+ /* 1 */ FS_BTN_COPY_FILE_2,
+ /* 2 */ FS_BTN_COPY_FILE_3,
+ /* 3 */ FS_BTN_COPY_QUIT
+} CopyMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_ERASE_FILE_1,
+ /* 1 */ FS_BTN_ERASE_FILE_2,
+ /* 2 */ FS_BTN_ERASE_FILE_3,
+ /* 3 */ FS_BTN_ERASE_QUIT
+} EraseMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_SELECT_FILE_1,
+ /* 1 */ FS_BTN_SELECT_FILE_2,
+ /* 2 */ FS_BTN_SELECT_FILE_3,
+ /* 3 */ FS_BTN_SELECT_YES,
+ /* 4 */ FS_BTN_SELECT_QUIT
+} SelectMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_CONFIRM_YES,
+ /* 1 */ FS_BTN_CONFIRM_QUIT
+} ConfirmButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_ACTION_COPY,
+ /* 1 */ FS_BTN_ACTION_ERASE
+} ActionButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_SETTING_AUDIO,
+ /* 1 */ FS_SETTING_ZTARGET
+} SettingIndex;
+
+typedef enum {
+ /* 0 */ FS_CHAR_PAGE_HIRA,
+ /* 1 */ FS_CHAR_PAGE_KATA,
+ /* 2 */ FS_CHAR_PAGE_ENG
+} CharPage;
+
+typedef enum {
+ /* 0 */ FS_KBD_BTN_HIRA,
+ /* 1 */ FS_KBD_BTN_KATA,
+ /* 2 */ FS_KBD_BTN_ENG,
+ /* 3 */ FS_KBD_BTN_BACKSPACE,
+ /* 4 */ FS_KBD_BTN_END,
+ /* 99 */ FS_KBD_BTN_NONE = 99
+} KeyboardButton;
+
+typedef struct FileSelectState {
+ /* 0x00000 */ GameState state;
+ /* 0x000A4 */ Vtx* windowVtx;
+ /* 0x000A8 */ u8* staticSegment;
+ /* 0x000AC */ u8* parameterSegment;
+ /* 0x000B0 */ u8* titleSegment;
+ /* 0x000B8 */ View view;
+ /* 0x00220 */ SramContext sramCtx;
+ /* 0x00248 */ SkyboxContext skyboxCtx;
+ /* 0x00470 */ MessageContext msgCtx;
+ /* 0x12550 */ Font font;
+ /* 0x242E0 */ EnvironmentContext envCtx;
+ /* 0x243E0 */ UNK_TYPE1 pad243E0[0x4];
+ /* 0x243E4 */ Vtx* windowContentVtx;
+ /* 0x243E8 */ Vtx* keyboardVtx;
+ /* 0x243EC */ Vtx* nameEntryVtx;
+ /* 0x243F0 */ Vtx* keyboard2Vtx;
+ /* 0x243F4 */ u8 newf[4][6];
+ /* 0x2440C */ u16 threeDayResetCount[4];
+ /* 0x24414 */ char fileNames[4][8];
+ /* 0x24434 */ s16 healthCapacity[4];
+ /* 0x2443C */ s16 health[4];
+ /* 0x24444 */ u32 questItems[4];
+ /* 0x24454 */ s8 defenseHearts[4];
+ /* 0x24458 */ u16 time[4];
+ /* 0x24460 */ s16 day[4];
+ /* 0x24468 */ u8 isOwlSave[4];
+ /* 0x2446C */ s16 rupees[4];
+ /* 0x24474 */ u8 walletUpgrades[4];
+ /* 0x24478 */ u8 maskCount[4];
+ /* 0x2447C */ u8 heartPieceCount[4];
+ /* 0x24480 */ s16 buttonIndex; // enum will depend on `ConfigMode`
+ /* 0x24482 */ s16 confirmButtonIndex; // see `ConfirmButtonIndex` enum
+ /* 0x24484 */ s16 menuMode; // see `MenuMode` enum
+ /* 0x24486 */ s16 configMode; // see `ConfigMode` enum
+ /* 0x24488 */ s16 prevConfigMode; // see `ConfigMode` enum
+ /* 0x2448A */ s16 nextConfigMode; // see `ConfigMode` enum
+ /* 0x2448C */ s16 selectMode; // see `SelectMode` enum
+ /* 0x2448E */ s16 selectedFileIndex;
+ /* 0x24490 */ UNK_TYPE1 pad24490[0x2];
+ /* 0x24492 */ s16 fileNamesY[3];
+ /* 0x24498 */ s16 actionTimer;
+ /* 0x2449A */ s16 buttonYOffsets[6];
+ /* 0x244A6 */ s16 copyDestFileIndex;
+ /* 0x244A8 */ s16 warningLabel;
+ /* 0x244AA */ s16 warningButtonIndex;
+ /* 0x244AC */ s16 titleLabel; // see `TitleLabel` enum
+ /* 0x244AE */ s16 nextTitleLabel; // see `TitleLabel` enum
+ /* 0x244B0 */ s16 windowColor[3];
+ /* 0x244B6 */ s16 titleAlpha[2]; // see `TitleIndex` enum
+ /* 0x244BA */ s16 windowAlpha;
+ /* 0x244BC */ s16 fileButtonAlpha[3];
+ /* 0x244C2 */ s16 nameBoxAlpha[3];
+ /* 0x244C8 */ s16 nameAlpha[3];
+ /* 0x244CE */ s16 connectorAlpha[3];
+ /* 0x244D4 */ s16 fileInfoAlpha[3];
+ /* 0x244DA */ s16 actionButtonAlpha[2];
+ /* 0x244DA */ s16 confirmButtonAlpha[2];
+ /* 0x244E2 */ s16 optionButtonAlpha;
+ /* 0x244E4 */ s16 nameEntryBoxAlpha;
+ /* 0x244E6 */ s16 controlsAlpha;
+ /* 0x244E8 */ s16 emptyFileTextAlpha;
+ /* 0x244EA */ s16 highlightColor[4];
+ /* 0x244F2 */ s16 highlightPulseDir;
+ /* 0x244F4 */ s16 unk_244F4;
+ /* 0x244F6 */ s16 confirmButtonTexIndices[2];
+ /* 0x244FA */ s16 inputTimerX;
+ /* 0x244FC */ s16 inputTimerY;
+ /* 0x244FE */ s16 stickXDir;
+ /* 0x24500 */ s16 stickYDir;
+ /* 0x24502 */ s16 stickAdjX;
+ /* 0x24504 */ s16 stickAdjY;
+ /* 0x24506 */ s16 nameEntryBoxPosX;
+ /* 0x24508 */ s16 windowPosX;
+ /* 0x2450A */ s16 screenFillAlpha;
+ /* 0x2450C */ f32 windowRot;
+ /* 0x24510 */ s16 kbdButton;
+ /* 0x24512 */ s16 charPage;
+ /* 0x24514 */ s16 charBgAlpha;
+ /* 0x24516 */ s16 charIndex;
+ /* 0x24518 */ s16 kbdX;
+ /* 0x2451A */ s16 kbdY;
+ /* 0x2451C */ s16 newFileNameCharCount;
+ /* 0x2451E */ s16 unk_2451E[5];
+ /* 0x24528 */ s16 highlightTimer;
+ /* 0x2452A */ s16 unk_2452A;
+ /* 0x2452C */ s16 unk_2452C[4];
+ /* 0x24534 */ s16 unk_24534[4];
+ /* 0x2453C */ s16 unk_2453C[4];
+ /* 0x24544 */ s16 unk_24544[4];
+ /* 0x2454C */ s16 unk_2454C;
+ /* 0x2454E */ s16 unk_2454E;
+ /* 0x24550 */ s16 unk_24550;
+} FileSelectState; // size = 0x24558
+
+void FileSelect_Init(GameState* thisx);
+void FileSelect_Destroy(GameState* thisx);
+
+void FileSelect_PulsateCursor(GameState* thisx);
+void FileSelect_DrawNameEntry(GameState* thisx);
+void FileSelect_DrawOptions(GameState* thisx);
+void FileSelect_DrawTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture, s16 point);
+
+// Copying Files
+void FileSelect_SetupCopySource(GameState* thisx);
+void FileSelect_SelectCopySource(GameState* thisx);
+void FileSelect_SetupCopyDest1(GameState* thisx);
+void FileSelect_SetupCopyDest2(GameState* thisx);
+void FileSelect_SelectCopyDest(GameState* thisx);
+void FileSelect_ExitToCopySource1(GameState* thisx);
+void FileSelect_ExitToCopySource2(GameState* thisx);
+void FileSelect_SetupCopyConfirm1(GameState* thisx);
+void FileSelect_SetupCopyConfirm2(GameState* thisx);
+void FileSelect_CopyConfirm(GameState* thisx);
+void FileSelect_CopyWaitForFlashSave(GameState* thisx);
+void FileSelect_ReturnToCopyDest(GameState* thisx);
+void FileSelect_CopyAnim1(GameState* thisx);
+void FileSelect_CopyAnim2(GameState* thisx);
+void FileSelect_CopyAnim3(GameState* thisx);
+void FileSelect_CopyAnim4(GameState* thisx);
+void FileSelect_CopyAnim5(GameState* thisx);
+void FileSelect_ExitCopyToMain(GameState* thisx);
+
+// Erasing Files
+void FileSelect_SetupEraseSelect(GameState* thisx);
+void FileSelect_EraseSelect(GameState* thisx);
+void FileSelect_SetupEraseConfirm1(GameState* thisx);
+void FileSelect_SetupEraseConfirm2(GameState* thisx);
+void FileSelect_EraseConfirm(GameState* thisx);
+void FileSelect_ExitToEraseSelect1(GameState* thisx);
+void FileSelect_ExitToEraseSelect2(GameState* thisx);
+void FileSelect_EraseAnim1(GameState* thisx);
+void FileSelect_EraseWaitForFlashSave(GameState* thisx);
+void FileSelect_EraseAnim2(GameState* thisx);
+void FileSelect_EraseAnim3(GameState* thisx);
+void FileSelect_ExitEraseToMain(GameState* thisx);
+
+// Entering Name
+void FileSelect_StartNameEntry(GameState* thisx);
+void FileSelect_UpdateKeyboardCursor(GameState* thisx);
+void FileSelect_NameEntryWaitForFlashSave(GameState* thisx);
+
+// Selecting Options
+void FileSelect_StartOptions(GameState* thisx);
+void FileSelect_UpdateOptionsMenu(GameState* thisx);
+void FileSelect_OptionsWaitForFlashSave(GameState* thisx);
+
+extern u8 D_808141F0[];
+extern s16 D_80814280[];
+
+#endif
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.c b/src/overlays/gamestates/ovl_opening/z_opening.c
index 7edfb8e78..84425cc73 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.c
+++ b/src/overlays/gamestates/ovl_opening/z_opening.c
@@ -4,9 +4,12 @@
* Description: Initializes the game into the title screen
*/
+#include "global.h"
#include "z_opening.h"
+#include "z64save.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "regs.h"
void TitleSetup_SetupTitleScreen(TitleSetupState* this) {
static s32 sOpeningEntrances[] = { ENTRANCE(CUTSCENE, 0), ENTRANCE(CUTSCENE, 1) };
@@ -17,8 +20,8 @@ void TitleSetup_SetupTitleScreen(TitleSetupState* this) {
Sram_InitNewSave();
- gSaveContext.save.entrance = sOpeningEntrances[D_801BB12C];
- gSaveContext.nextCutsceneIndex = gSaveContext.save.cutscene = sOpeningCutscenes[D_801BB12C];
+ gSaveContext.save.entrance = sOpeningEntrances[gOpeningEntranceIndex];
+ gSaveContext.nextCutsceneIndex = gSaveContext.save.cutsceneIndex = sOpeningCutscenes[gOpeningEntranceIndex];
gSaveContext.sceneLayer = 0;
gSaveContext.save.time = CLOCK_TIME(8, 0);
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.h b/src/overlays/gamestates/ovl_opening/z_opening.h
index 36a01ffe9..530b069e1 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.h
+++ b/src/overlays/gamestates/ovl_opening/z_opening.h
@@ -1,15 +1,15 @@
-#ifndef _Z64_OPENING_H_
-#define _Z64_OPENING_H_
+#ifndef Z64_OPENING_H
+#define Z64_OPENING_H
-#include "global.h"
+#include "z64game.h"
+#include "z64view.h"
+
+typedef struct {
+ /* 0x000 */ GameState state;
+ /* 0x0A8 */ View view;
+} TitleSetupState; // size = 0x210
void TitleSetup_Init(GameState* thisx);
void TitleSetup_Destroy(GameState* thisx);
-typedef struct {
- /* 0x000 */ GameState state;
- /* 0x0A4 */ UNK_TYPE1 unk_A4[0x4];
- /* 0x0A8 */ View view;
-} TitleSetupState; // size = 0x210
-
#endif
diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c
index ab34ebffe..88d9ccdc4 100644
--- a/src/overlays/gamestates/ovl_select/z_select.c
+++ b/src/overlays/gamestates/ovl_select/z_select.c
@@ -533,69 +533,69 @@ void MapSelect_UpdateMenu(MapSelectState* this) {
}
if (CHECK_BTN_ALL(controller1->press.button, BTN_Z)) {
- if (gSaveContext.save.cutscene == 0x8000) {
- gSaveContext.save.cutscene = 0;
- } else if (gSaveContext.save.cutscene == 0) {
- gSaveContext.save.cutscene = 0x8800;
- } else if (gSaveContext.save.cutscene == 0x8800) {
- gSaveContext.save.cutscene = 0xFFF0;
- } else if (gSaveContext.save.cutscene == 0xFFF0) {
- gSaveContext.save.cutscene = 0xFFF1;
- } else if (gSaveContext.save.cutscene == 0xFFF1) {
- gSaveContext.save.cutscene = 0xFFF2;
- } else if (gSaveContext.save.cutscene == 0xFFF2) {
- gSaveContext.save.cutscene = 0xFFF3;
- } else if (gSaveContext.save.cutscene == 0xFFF3) {
- gSaveContext.save.cutscene = 0xFFF4;
- } else if (gSaveContext.save.cutscene == 0xFFF4) {
- gSaveContext.save.cutscene = 0xFFF5;
- } else if (gSaveContext.save.cutscene == 0xFFF5) {
- gSaveContext.save.cutscene = 0xFFF6;
- } else if (gSaveContext.save.cutscene == 0xFFF6) {
- gSaveContext.save.cutscene = 0xFFF7;
- } else if (gSaveContext.save.cutscene == 0xFFF7) {
- gSaveContext.save.cutscene = 0xFFF8;
- } else if (gSaveContext.save.cutscene == 0xFFF8) {
- gSaveContext.save.cutscene = 0xFFF9;
- } else if (gSaveContext.save.cutscene == 0xFFF9) {
- gSaveContext.save.cutscene = 0xFFFA;
- } else if (gSaveContext.save.cutscene == 0xFFFA) {
- gSaveContext.save.cutscene = 0x8000;
+ if (gSaveContext.save.cutsceneIndex == 0x8000) {
+ gSaveContext.save.cutsceneIndex = 0;
+ } else if (gSaveContext.save.cutsceneIndex == 0) {
+ gSaveContext.save.cutsceneIndex = 0x8800;
+ } else if (gSaveContext.save.cutsceneIndex == 0x8800) {
+ gSaveContext.save.cutsceneIndex = 0xFFF0;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF0) {
+ gSaveContext.save.cutsceneIndex = 0xFFF1;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF1) {
+ gSaveContext.save.cutsceneIndex = 0xFFF2;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF2) {
+ gSaveContext.save.cutsceneIndex = 0xFFF3;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF3) {
+ gSaveContext.save.cutsceneIndex = 0xFFF4;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF4) {
+ gSaveContext.save.cutsceneIndex = 0xFFF5;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF5) {
+ gSaveContext.save.cutsceneIndex = 0xFFF6;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF6) {
+ gSaveContext.save.cutsceneIndex = 0xFFF7;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF7) {
+ gSaveContext.save.cutsceneIndex = 0xFFF8;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF8) {
+ gSaveContext.save.cutsceneIndex = 0xFFF9;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF9) {
+ gSaveContext.save.cutsceneIndex = 0xFFFA;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFFA) {
+ gSaveContext.save.cutsceneIndex = 0x8000;
}
} else if (CHECK_BTN_ALL(controller1->press.button, BTN_R)) {
- if (gSaveContext.save.cutscene == 0x8000) {
- gSaveContext.save.cutscene = 0xFFFA;
- } else if (gSaveContext.save.cutscene == 0) {
- gSaveContext.save.cutscene = 0x8000;
- } else if (gSaveContext.save.cutscene == 0x8800) {
- gSaveContext.save.cutscene = 0;
- } else if (gSaveContext.save.cutscene == 0xFFF0) {
- gSaveContext.save.cutscene = 0x8800;
- } else if (gSaveContext.save.cutscene == 0xFFF1) {
- gSaveContext.save.cutscene = 0xFFF0;
- } else if (gSaveContext.save.cutscene == 0xFFF2) {
- gSaveContext.save.cutscene = 0xFFF1;
- } else if (gSaveContext.save.cutscene == 0xFFF3) {
- gSaveContext.save.cutscene = 0xFFF2;
- } else if (gSaveContext.save.cutscene == 0xFFF4) {
- gSaveContext.save.cutscene = 0xFFF3;
- } else if (gSaveContext.save.cutscene == 0xFFF5) {
- gSaveContext.save.cutscene = 0xFFF4;
- } else if (gSaveContext.save.cutscene == 0xFFF6) {
- gSaveContext.save.cutscene = 0xFFF5;
- } else if (gSaveContext.save.cutscene == 0xFFF7) {
- gSaveContext.save.cutscene = 0xFFF6;
- } else if (gSaveContext.save.cutscene == 0xFFF8) {
- gSaveContext.save.cutscene = 0xFFF7;
- } else if (gSaveContext.save.cutscene == 0xFFF9) {
- gSaveContext.save.cutscene = 0xFFF8;
- } else if (gSaveContext.save.cutscene == 0xFFFA) {
- gSaveContext.save.cutscene = 0xFFF9;
+ if (gSaveContext.save.cutsceneIndex == 0x8000) {
+ gSaveContext.save.cutsceneIndex = 0xFFFA;
+ } else if (gSaveContext.save.cutsceneIndex == 0) {
+ gSaveContext.save.cutsceneIndex = 0x8000;
+ } else if (gSaveContext.save.cutsceneIndex == 0x8800) {
+ gSaveContext.save.cutsceneIndex = 0;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF0) {
+ gSaveContext.save.cutsceneIndex = 0x8800;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF1) {
+ gSaveContext.save.cutsceneIndex = 0xFFF0;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF2) {
+ gSaveContext.save.cutsceneIndex = 0xFFF1;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF3) {
+ gSaveContext.save.cutsceneIndex = 0xFFF2;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF4) {
+ gSaveContext.save.cutsceneIndex = 0xFFF3;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF5) {
+ gSaveContext.save.cutsceneIndex = 0xFFF4;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF6) {
+ gSaveContext.save.cutsceneIndex = 0xFFF5;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF7) {
+ gSaveContext.save.cutsceneIndex = 0xFFF6;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF8) {
+ gSaveContext.save.cutsceneIndex = 0xFFF7;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFF9) {
+ gSaveContext.save.cutsceneIndex = 0xFFF8;
+ } else if (gSaveContext.save.cutsceneIndex == 0xFFFA) {
+ gSaveContext.save.cutsceneIndex = 0xFFF9;
}
}
gSaveContext.save.isNight = false;
- if (gSaveContext.save.cutscene == 0x8800) {
+ if (gSaveContext.save.cutsceneIndex == 0x8800) {
gSaveContext.save.isNight = true;
}
@@ -987,7 +987,7 @@ void MapSelect_DrawMenu(MapSelectState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C4C0(gfxCtx);
+ Gfx_SetupDL28_Opa(gfxCtx);
printer = alloca(sizeof(GfxPrint));
GfxPrint_Init(printer);
@@ -995,7 +995,7 @@ void MapSelect_DrawMenu(MapSelectState* this) {
MapSelect_PrintMenu(this, printer);
MapSelect_PrintAgeSetting(this, printer, GET_PLAYER_FORM);
- MapSelect_PrintCutsceneSetting(this, printer, ((void)0, gSaveContext.save.cutscene));
+ MapSelect_PrintCutsceneSetting(this, printer, ((void)0, gSaveContext.save.cutsceneIndex));
POLY_OPA_DISP = GfxPrint_Close(printer);
GfxPrint_Destroy(printer);
@@ -1009,7 +1009,7 @@ void MapSelect_DrawLoadingScreen(MapSelectState* this) {
OPEN_DISPS(gfxCtx);
- func_8012C4C0(gfxCtx);
+ Gfx_SetupDL28_Opa(gfxCtx);
GfxPrint_Init(&printer);
GfxPrint_Open(&printer, POLY_OPA_DISP);
@@ -1085,7 +1085,7 @@ void MapSelect_Init(GameState* thisx) {
}
Game_SetFramerateDivisor(&this->state, 1);
- gSaveContext.save.cutscene = 0;
+ gSaveContext.save.cutsceneIndex = 0;
gSaveContext.save.playerForm = PLAYER_FORM_HUMAN;
gSaveContext.save.linkAge = 0;
}
diff --git a/src/overlays/gamestates/ovl_select/z_select.h b/src/overlays/gamestates/ovl_select/z_select.h
index 69312e986..876c9e3ff 100644
--- a/src/overlays/gamestates/ovl_select/z_select.h
+++ b/src/overlays/gamestates/ovl_select/z_select.h
@@ -1,16 +1,17 @@
-#ifndef _Z64_SELECT_H_
-#define _Z64_SELECT_H_
+#ifndef Z64_SELECT_H
+#define Z64_SELECT_H
-#include "global.h"
+#include "z64game.h"
+#include "z64view.h"
struct MapSelectState;
typedef void (*SelectLoadFunc)(struct MapSelectState*, u32, s32);
typedef struct {
- /* 0x00 */ char* name;
- /* 0x04 */ SelectLoadFunc loadFunc;
- /* 0x08 */ s32 entrance;
+ /* 0x0 */ char* name;
+ /* 0x4 */ SelectLoadFunc loadFunc;
+ /* 0x8 */ s32 entrance;
} SceneSelectEntry; // size = 0xC
typedef struct MapSelectState {
diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c
index 01e29668e..abde294e5 100644
--- a/src/overlays/gamestates/ovl_title/z_title.c
+++ b/src/overlays/gamestates/ovl_title/z_title.c
@@ -81,7 +81,7 @@ void ConsoleLogo_Draw(GameState* thisx) {
gSPSetLights1(POLY_OPA_DISP++, sTitleLights);
ConsoleLogo_RenderView(this, 0.0f, 150.0f, 300.0f);
- func_8012C28C(this->state.gfxCtx);
+ Gfx_SetupDL25_Opa(this->state.gfxCtx);
Matrix_Translate(-53.0f, -5.0f, 0.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
Matrix_RotateZYX(0, sTitleRotation, 0, MTXMODE_APPLY);
@@ -89,7 +89,7 @@ void ConsoleLogo_Draw(GameState* thisx) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoNDL);
- func_8012C628(this->state.gfxCtx);
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
@@ -165,13 +165,13 @@ void ConsoleLogo_Init(GameState* thisx) {
this->state.destroy = ConsoleLogo_Destroy;
this->exit = false;
- if (!(Padmgr_GetControllerBitmask() & 1)) {
+ if (!(PadMgr_GetValidControllersMask() & 1)) {
gSaveContext.fileNum = 0xFEDC;
} else {
gSaveContext.fileNum = 0xFF;
}
- gSaveContext.unk_3F3F = true;
+ gSaveContext.flashSaveAvailable = true;
Sram_Alloc(thisx, &this->sramCtx);
this->ult = 0;
this->timer = 20;
diff --git a/src/overlays/gamestates/ovl_title/z_title.h b/src/overlays/gamestates/ovl_title/z_title.h
index 0cb19da1a..ee5d5c841 100644
--- a/src/overlays/gamestates/ovl_title/z_title.h
+++ b/src/overlays/gamestates/ovl_title/z_title.h
@@ -2,9 +2,8 @@
#define Z64_TITLE_H
#include "global.h"
-
-void ConsoleLogo_Init(GameState* thisx);
-void ConsoleLogo_Destroy(GameState* thisx);
+#include "z64game.h"
+#include "z64view.h"
typedef struct {
/* 0x000 */ GameState state;
@@ -20,4 +19,7 @@ typedef struct {
/* 0x244 */ u8 exit;
} ConsoleLogoState; // size = 0x248
+void ConsoleLogo_Init(GameState* thisx);
+void ConsoleLogo_Destroy(GameState* thisx);
+
#endif
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
index fe72ee840..1b18adcd1 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_collect.c
@@ -13,7 +13,7 @@ extern TexturePtr D_08061000; // gBombersNotebookIconTex
extern TexturePtr D_08062000; // gSongNoteIconTex
s16 sQuestRemainsColorTimerInit[] = { 120, 60, 2, 80 };
-s16 sQuestHpColorTimerInit[] = { 20, 4, 20, 10 };
+s16 sQuestHpColorTimerInits[] = { 20, 4, 20, 10 };
s16 sQuestSongPlayedOcarinaButtonsNum = 0;
u8 sQuestSongPlayedOcarinaButtons[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
s16 sQuestSongPlayedOcarinaButtonsAlpha[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
@@ -62,9 +62,6 @@ s16 sQuestRemainsEnvBlue[] = {
150, // Unused
};
-#ifdef NON_EQUIVALENT
-// TODO: is actually NON_MATCHING, update once `z_kaleido_scope_NES.c` is decompiled
-// A single small regalloc at the first `Gfx_DrawTexQuadIA8` for the heart piece count (see `gItemIcons`)
void KaleidoScope_DrawQuestStatus(PlayState* play) {
static s16 sQuestRemainsColorTimer = 20;
static s16 sQuestRemainsColorTimerIndex = 0;
@@ -135,10 +132,11 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
s16 k;
s16 skullTokenDigits[3];
u16 isDigitDrawn;
+ u32* questItemsPtr;
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_QUEST] * 4, pauseCtx->questVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_QUEST] * 4, pauseCtx->questVtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -315,13 +313,18 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
sQuestHpPrimGreen = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][1];
sQuestHpPrimBlue = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][2];
sQuestHpPrimAlpha = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][3];
- sQuestHpColorTimer = sQuestHpColorTimerInit[sQuestHpPrimColorTargetIndex];
+ sQuestHpColorTimer = sQuestHpColorTimerInits[sQuestHpPrimColorTargetIndex];
if (++sQuestHpPrimColorTargetIndex > 3) {
sQuestHpPrimColorTargetIndex = 0;
}
}
- if ((GET_SAVE_INVENTORY_QUEST_ITEMS >> QUEST_HEART_PIECE_COUNT) != 0) {
+ //! FAKE: Used to load `0xF0000000` early
+ if ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) != 0) {}
+ questItemsPtr = &gSaveContext.save.saveInfo.inventory.questItems;
+ if (1) {}
+
+ if ((*questItemsPtr >> QUEST_HEART_PIECE_COUNT) != 0) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
@@ -391,7 +394,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
POLY_OPA_DISP, sOcarinaButtonTextures[sQuestSongPlayedOcarinaButtons[i]], 16, 16, 0);
}
}
- } else if (IS_PAUSE_MAIN_STATE_SAVE_PROMPT || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
+ } else if (IS_PAUSE_MAIN_STATE_SONG_PROMPT || (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
// Draw the buttons for playing a song
sp1C8 = pauseCtx->ocarinaSongIndex;
sp1CA = gOcarinaSongButtons[sp1C8].numButtons;
@@ -548,34 +551,6 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-s16 sQuestRemainsColorTimer = 20;
-s16 sQuestRemainsColorTimerIndex = 0;
-s16 sQuestHpPrimRed = 0;
-s16 sQuestHpPrimGreen = 0;
-s16 sQuestHpPrimBlue = 0;
-s16 sQuestHpPrimAlpha = 0;
-s16 sQuestHpColorTimer = 20;
-s16 sQuestHpPrimColorTargetIndex = 0;
-TexturePtr sOcarinaButtonTextures[] = {
- gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex,
-};
-s16 sQuestSongsPrimRed[] = {
- 150, 255, 100, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-};
-s16 sQuestSongsPrimGreen[] = {
- 255, 80, 150, 160, 100, 240, 255, 255, 255, 255, 255, 255,
-};
-s16 sQuestSongsPrimBlue[] = {
- 100, 40, 255, 0, 255, 100, 255, 255, 255, 255, 255, 255,
-};
-TexturePtr sQuestUpgradeTextures[][3] = {
- { 0x08053000, 0x08054000, 0x08055000 },
- { 0x08056000, 0x08057000, 0x08058000 },
-};
-u8 sQuestUpgrades[] = { UPG_QUIVER, UPG_BOMB_BAG };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_DrawQuestStatus.s")
-#endif
typedef enum {
/* -3 */ CURSOR_TO_LEFT = -3, // Cursor on the "scroll to left page" position
@@ -588,7 +563,7 @@ typedef struct {
/* 0x2 */ s16 down;
/* 0x4 */ s16 left;
/* 0x6 */ s16 right;
-} CursorPointDirection;
+} CursorPointDirection; // size = 0x8
void KaleidoScope_UpdateQuestCursor(PlayState* play) {
static s16 sQuestSongPlaybackDelayTimer = 0;
@@ -643,7 +618,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].left;
if (nextCursorPoint == CURSOR_TO_LEFT) {
@@ -666,7 +641,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].right;
if (nextCursorPoint == CURSOR_TO_RIGHT) {
@@ -691,7 +666,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
nextCursorPoint = sCursorPointLinks[oldCursorPoint].down;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -704,7 +679,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
}
nextCursorPoint = sCursorPointLinks[oldCursorPoint].up;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -932,7 +907,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_BOMBERS_NOTEBOOK;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
@@ -950,7 +925,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_REMAINS_GOHT;
if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
index b8858b7ca..f643d8d40 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c
@@ -37,7 +37,7 @@ typedef struct {
/* 0x0 */ s16 screenX;
/* 0x2 */ s16 screenY;
/* 0x4 */ s16 width;
-} SectionPosition; // size = 0x6;
+} SectionPosition; // size = 0x6
// clang-format off
SectionPosition sSectionPositions[] = {
@@ -285,7 +285,7 @@ void KaleidoScope_DrawInventoryEditorText(Gfx** gfxp) {
GfxPrint_SetPos(&printer, 23, 22);
GfxPrint_Printf(&printer, "%s", "セイ");
- // Life (double defence)
+ // Life (double defense)
GfxPrint_SetPos(&printer, 4, 25);
GfxPrint_Printf(&printer, "%s", "イ");
GfxPrint_SetPos(&printer, 4, 26);
@@ -345,7 +345,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
@@ -370,14 +370,14 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
// Current Health Quarter (X / 4)
- KaleidoScope_DrawDigit(play, (((void)0, gSaveContext.save.playerData.health) % 0x10) / 4, 217, 15);
+ KaleidoScope_DrawDigit(play, (((void)0, gSaveContext.save.saveInfo.playerData.health) % 0x10) / 4, 217, 15);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
// Rupees
counterDigits[0] = counterDigits[1] = counterDigits[2] = 0;
- counterDigits[3] = gSaveContext.save.playerData.rupees;
+ counterDigits[3] = gSaveContext.save.saveInfo.playerData.rupees;
while (counterDigits[3] >= 1000) {
counterDigits[0]++;
counterDigits[3] -= 1000;
@@ -400,7 +400,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Health capacity
counterDigits[2] = 0;
- counterDigits[3] = gSaveContext.save.playerData.healthCapacity / 0x10;
+ counterDigits[3] = gSaveContext.save.saveInfo.playerData.healthCapacity / 0x10;
while (counterDigits[3] >= 10) {
counterDigits[2]++;
counterDigits[3] -= 10;
@@ -411,7 +411,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Health
counterDigits[2] = 0;
- counterDigits[3] = gSaveContext.save.playerData.health / 0x10;
+ counterDigits[3] = gSaveContext.save.saveInfo.playerData.health / 0x10;
while (counterDigits[3] >= 10) {
counterDigits[2]++;
counterDigits[3] -= 10;
@@ -431,10 +431,10 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
(slot == SLOT_MAGIC_BEANS)) {
counterDigits[3] = AMMO(gAmmoItems[slot]);
} else if ((slot == SLOT_TRADE_DEED) || (slot == SLOT_TRADE_KEY_MAMA) || (slot == SLOT_TRADE_COUPLE)) {
- counterDigits[3] = gSaveContext.save.inventory.items[slot];
+ counterDigits[3] = gSaveContext.save.saveInfo.inventory.items[slot];
} else if (slot >= SLOT_BOTTLE_1) {
- counterDigits[3] = gSaveContext.save.inventory.items[slot];
- } else if (gSaveContext.save.inventory.items[slot] != ITEM_NONE) {
+ counterDigits[3] = gSaveContext.save.saveInfo.inventory.items[slot];
+ } else if (gSaveContext.save.saveInfo.inventory.items[slot] != ITEM_NONE) {
counterDigits[3] = 1;
}
@@ -461,7 +461,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
for (j = 0, rectLeft = 204; j < 6; j++, slot++, rectLeft += 14) {
counterDigits[2] = 0;
- if (gSaveContext.save.inventory.items[SLOT_MASK_POSTMAN + slot] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[SLOT_MASK_POSTMAN + slot] != ITEM_NONE) {
counterDigits[2] = 1;
}
KaleidoScope_DrawDigit(play, counterDigits[2], rectLeft, rectTop);
@@ -583,7 +583,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Dungeon Items
// Loop over columns (i), (counterDigits[1] stores rectLeft)
for (counterDigits[1] = 129, i = 0; i < 4; i++) {
- counterDigits[2] = gSaveContext.save.inventory.dungeonItems[i] & gEquipMasks[0];
+ counterDigits[2] = gSaveContext.save.saveInfo.inventory.dungeonItems[i] & gEquipMasks[0];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 168);
counterDigits[1] += 12;
}
@@ -591,7 +591,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Stray Fairies
// Loop over columns (i), (counterDigits[1] stores rectLeft)
for (counterDigits[1] = 202, i = 0; i < 4; i++) {
- counterDigits[3] = gSaveContext.save.inventory.strayFairies[i];
+ counterDigits[3] = gSaveContext.save.saveInfo.inventory.strayFairies[i];
counterDigits[2] = counterDigits[3] / 10;
counterDigits[3] -= counterDigits[2] * 10;
if (counterDigits[2] != 0) {
@@ -601,23 +601,23 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
counterDigits[1] += 21;
}
- // Double Defence
- KaleidoScope_DrawDigit(play, gSaveContext.save.playerData.doubleDefense, 44, 202);
+ // Double Defense
+ KaleidoScope_DrawDigit(play, gSaveContext.save.saveInfo.playerData.doubleDefense, 44, 202);
// Magic
- //! @bug should be gSaveContext.save.playerData.doubleMagic
- KaleidoScope_DrawDigit(play, gSaveContext.save.playerData.doubleDefense, 75, 202);
+ //! @bug should be gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired
+ KaleidoScope_DrawDigit(play, gSaveContext.save.saveInfo.playerData.doubleDefense, 75, 202);
// Lottery
// Loop over columns (i), (counterDigits[1] stores rectLeft)
for (counterDigits[1] = 139, i = 0; i < 3; i++) {
- counterDigits[2] = gSaveContext.save.lotteryCodes[0][i];
+ counterDigits[2] = gSaveContext.save.saveInfo.lotteryCodes[0][i];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 184);
- counterDigits[2] = gSaveContext.save.lotteryCodes[1][i];
+ counterDigits[2] = gSaveContext.save.saveInfo.lotteryCodes[1][i];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 198);
- counterDigits[2] = gSaveContext.save.lotteryCodes[2][i];
+ counterDigits[2] = gSaveContext.save.saveInfo.lotteryCodes[2][i];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 212);
counterDigits[1] += 12;
@@ -626,7 +626,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Oceanside Spider House Mask Order
// Loop over columns (i), (counterDigits[1] stores rectLeft)
for (counterDigits[1] = 217, i = 0; i < 6; i++) {
- counterDigits[2] = gSaveContext.save.spiderHouseMaskOrder[i];
+ counterDigits[2] = gSaveContext.save.saveInfo.spiderHouseMaskOrder[i];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 186);
counterDigits[1] += 12;
@@ -635,7 +635,7 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
// Bombers code
// Loop over columns (i), (counterDigits[1] stores rectLeft)
for (counterDigits[1] = 220, i = 0; i < 5; i++) {
- counterDigits[2] = gSaveContext.save.bomberCode[i];
+ counterDigits[2] = gSaveContext.save.saveInfo.bomberCode[i];
KaleidoScope_DrawDigit(play, counterDigits[2], counterDigits[1], 210);
counterDigits[1] += 12;
@@ -709,24 +709,24 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
case INV_EDITOR_SECTION_RUPEE:
// Rupees
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
- gSaveContext.save.playerData.rupees -= 100;
- if (gSaveContext.save.playerData.rupees < 0) {
- gSaveContext.save.playerData.rupees = 0;
+ gSaveContext.save.saveInfo.playerData.rupees -= 100;
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0) {
+ gSaveContext.save.saveInfo.playerData.rupees = 0;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
- gSaveContext.save.playerData.rupees += 100;
- if (gSaveContext.save.playerData.rupees >= 9999) {
- gSaveContext.save.playerData.rupees = 9999;
+ gSaveContext.save.saveInfo.playerData.rupees += 100;
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 9999) {
+ gSaveContext.save.saveInfo.playerData.rupees = 9999;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.playerData.rupees--;
- if (gSaveContext.save.playerData.rupees < 0) {
- gSaveContext.save.playerData.rupees = 0;
+ gSaveContext.save.saveInfo.playerData.rupees--;
+ if (gSaveContext.save.saveInfo.playerData.rupees < 0) {
+ gSaveContext.save.saveInfo.playerData.rupees = 0;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.playerData.rupees++;
- if (gSaveContext.save.playerData.rupees >= 9999) {
- gSaveContext.save.playerData.rupees = 9999;
+ gSaveContext.save.saveInfo.playerData.rupees++;
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 9999) {
+ gSaveContext.save.saveInfo.playerData.rupees = 9999;
}
}
break;
@@ -734,15 +734,15 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
case INV_EDITOR_SECTION_HEALTH_CAPACITY:
// Health Capacity
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.playerData.healthCapacity -= 0x10;
- if (gSaveContext.save.playerData.healthCapacity < 0x30) {
- gSaveContext.save.playerData.healthCapacity = 0x30;
+ gSaveContext.save.saveInfo.playerData.healthCapacity -= 0x10;
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity < 0x30) {
+ gSaveContext.save.saveInfo.playerData.healthCapacity = 0x30;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.playerData.healthCapacity += 0x10;
- if (gSaveContext.save.playerData.healthCapacity >= 0x140) {
- gSaveContext.save.playerData.healthCapacity = 0x140;
+ gSaveContext.save.saveInfo.playerData.healthCapacity += 0x10;
+ if (gSaveContext.save.saveInfo.playerData.healthCapacity >= 0x140) {
+ gSaveContext.save.saveInfo.playerData.healthCapacity = 0x140;
}
}
break;
@@ -806,48 +806,48 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
} else if (slot == SLOT_TRADE_DEED) {
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_MOON_TEAR;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_MOON_TEAR;
} else if ((INV_CONTENT(ITEM_MOON_TEAR) >= ITEM_MOON_TEAR) &&
(INV_CONTENT(ITEM_MOON_TEAR) <= ITEM_DEED_MOUNTAIN)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) + 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) + 1;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (INV_CONTENT(ITEM_MOON_TEAR) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_DEED_OCEAN;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_DEED_OCEAN;
} else if ((INV_CONTENT(ITEM_MOON_TEAR) >= ITEM_DEED_LAND) &&
(INV_CONTENT(ITEM_MOON_TEAR) <= ITEM_DEED_OCEAN)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) - 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_MOON_TEAR) - 1;
}
}
} else if (slot == SLOT_TRADE_KEY_MAMA) {
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_ROOM_KEY;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_ROOM_KEY;
} else if ((INV_CONTENT(ITEM_ROOM_KEY) >= ITEM_ROOM_KEY) &&
(INV_CONTENT(ITEM_ROOM_KEY) <= ITEM_ROOM_KEY)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) + 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) + 1;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (INV_CONTENT(ITEM_ROOM_KEY) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_LETTER_MAMA;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_LETTER_MAMA;
} else if ((INV_CONTENT(ITEM_ROOM_KEY) >= ITEM_LETTER_MAMA) &&
(INV_CONTENT(ITEM_ROOM_KEY) <= ITEM_LETTER_MAMA)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) - 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_ROOM_KEY) - 1;
}
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (INV_CONTENT(ITEM_LETTER_TO_KAFEI) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_LETTER_TO_KAFEI;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_LETTER_TO_KAFEI;
} else if ((INV_CONTENT(ITEM_LETTER_TO_KAFEI) >= ITEM_LETTER_TO_KAFEI) &&
(INV_CONTENT(ITEM_LETTER_TO_KAFEI) <= ITEM_LETTER_TO_KAFEI)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) + 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) + 1;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (INV_CONTENT(ITEM_LETTER_TO_KAFEI) == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_PENDANT_OF_MEMORIES;
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_PENDANT_OF_MEMORIES;
} else if ((INV_CONTENT(ITEM_LETTER_TO_KAFEI) >= ITEM_PENDANT_OF_MEMORIES) &&
(INV_CONTENT(ITEM_LETTER_TO_KAFEI) <= ITEM_PENDANT_OF_MEMORIES)) {
- gSaveContext.save.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) - 1;
+ gSaveContext.save.saveInfo.inventory.items[slot] = INV_CONTENT(ITEM_LETTER_TO_KAFEI) - 1;
}
}
} else if ((slot >= SLOT_BOTTLE_1) && (slot <= SLOT_BOTTLE_6)) {
@@ -855,18 +855,20 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
value = ITEM_BOTTLE + slot - SLOT_BOTTLE_1;
Inventory_DeleteItem(value, SLOT(ITEM_BOTTLE) + slot - SLOT_BOTTLE_1);
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_BOTTLE;
- } else if ((gSaveContext.save.inventory.items[slot] >= ITEM_BOTTLE) &&
- (gSaveContext.save.inventory.items[slot] <= ITEM_HYLIAN_LOACH)) {
- gSaveContext.save.inventory.items[slot] = gSaveContext.save.inventory.items[slot] + 1;
+ if (gSaveContext.save.saveInfo.inventory.items[slot] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_BOTTLE;
+ } else if ((gSaveContext.save.saveInfo.inventory.items[slot] >= ITEM_BOTTLE) &&
+ (gSaveContext.save.saveInfo.inventory.items[slot] <= ITEM_HYLIAN_LOACH)) {
+ gSaveContext.save.saveInfo.inventory.items[slot] =
+ gSaveContext.save.saveInfo.inventory.items[slot] + 1;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
- gSaveContext.save.inventory.items[slot] = ITEM_OBABA_DRINK;
- } else if ((gSaveContext.save.inventory.items[slot] >= ITEM_POTION_RED) &&
- (gSaveContext.save.inventory.items[slot] <= ITEM_OBABA_DRINK)) {
- gSaveContext.save.inventory.items[slot] = gSaveContext.save.inventory.items[slot] - 1;
+ if (gSaveContext.save.saveInfo.inventory.items[slot] == ITEM_NONE) {
+ gSaveContext.save.saveInfo.inventory.items[slot] = ITEM_OBABA_DRINK;
+ } else if ((gSaveContext.save.saveInfo.inventory.items[slot] >= ITEM_POTION_RED) &&
+ (gSaveContext.save.saveInfo.inventory.items[slot] <= ITEM_OBABA_DRINK)) {
+ gSaveContext.save.saveInfo.inventory.items[slot] =
+ gSaveContext.save.saveInfo.inventory.items[slot] - 1;
}
}
} else {
@@ -874,7 +876,7 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
value = sSlotItems[slot];
- if (gSaveContext.save.inventory.items[slot] == ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[slot] == ITEM_NONE) {
INV_CONTENT(value) = value;
} else {
Inventory_DeleteItem(value, slot);
@@ -895,7 +897,7 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
if (value != 0) {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = value + (ITEM_SWORD_KOKIRI - 1);
- gSaveContext.save.playerData.swordHealth = 100;
+ gSaveContext.save.saveInfo.playerData.swordHealth = 100;
} else {
CUR_FORM_EQUIP(EQUIP_SLOT_B) = ITEM_NONE;
}
@@ -910,7 +912,7 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
SET_EQUIP_VALUE(EQUIP_TYPE_SWORD, value);
CUR_FORM_EQUIP(EQUIP_SLOT_B) = value + (ITEM_SWORD_KOKIRI - 1);
- gSaveContext.save.playerData.swordHealth = 100;
+ gSaveContext.save.saveInfo.playerData.swordHealth = 100;
}
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
@@ -974,41 +976,43 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
} else if (sCurSection == INV_EDITOR_SECTION_SWAMP_GOLD_SKULLS) {
// Gold Skulls (Swamp Spider House)
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- if (((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) != 0) {
- gSaveContext.save.skullTokenCount =
- ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) - 1) << 0x10) |
- (gSaveContext.save.skullTokenCount & 0xFFFF);
+ if (((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000) >> 0x10) != 0) {
+ gSaveContext.save.saveInfo.skullTokenCount =
+ ((u16)(((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000) >> 0x10) - 1) << 0x10) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF);
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.skullTokenCount =
- ((u16)(((gSaveContext.save.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
- (gSaveContext.save.skullTokenCount & 0xFFFF);
+ gSaveContext.save.saveInfo.skullTokenCount =
+ ((u16)(((gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000) >> 0x10) + 1) << 0x10) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF);
}
} else if (sCurSection == INV_EDITOR_SECTION_OCEAN_GOLD_SKULLS) {
// Gold Skulls (Oceans Spider House)
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- if (((u16)gSaveContext.save.skullTokenCount) != 0) {
- gSaveContext.save.skullTokenCount = (((u16)gSaveContext.save.skullTokenCount - 1) & 0xFFFF) |
- (gSaveContext.save.skullTokenCount & 0xFFFF0000);
+ if (((u16)gSaveContext.save.saveInfo.skullTokenCount) != 0) {
+ gSaveContext.save.saveInfo.skullTokenCount =
+ (((u16)gSaveContext.save.saveInfo.skullTokenCount - 1) & 0xFFFF) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000);
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.skullTokenCount = (((u16)gSaveContext.save.skullTokenCount + 1) & 0xFFFF) |
- (gSaveContext.save.skullTokenCount & 0xFFFF0000);
+ gSaveContext.save.saveInfo.skullTokenCount =
+ (((u16)gSaveContext.save.saveInfo.skullTokenCount + 1) & 0xFFFF) |
+ (gSaveContext.save.saveInfo.skullTokenCount & 0xFFFF0000);
}
} else if (sCurSection == INV_EDITOR_SECTION_NOTEBOOK) {
// Bombers Notebook
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.inventory.questItems ^= gBitFlags[QUEST_BOMBERS_NOTEBOOK];
+ gSaveContext.save.saveInfo.inventory.questItems ^= gBitFlags[QUEST_BOMBERS_NOTEBOOK];
}
} else if (sCurSection == INV_EDITOR_SECTION_LULLABY_INTRO) {
// Goron Lullaby Intro
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.inventory.questItems ^= gBitFlags[QUEST_SONG_LULLABY_INTRO];
+ gSaveContext.save.saveInfo.inventory.questItems ^= gBitFlags[QUEST_SONG_LULLABY_INTRO];
}
} else if (sCurSection < INV_EDITOR_SECTION_LULLABY_INTRO) {
@@ -1017,7 +1021,7 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
//! have also been taken
slot = sCurSection - INV_EDITOR_SECTION_BOSS;
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.inventory.questItems ^= gBitFlags[slot];
+ gSaveContext.save.saveInfo.inventory.questItems ^= gBitFlags[slot];
}
} else if (sCurSection < INV_EDITOR_SECTION_DUNGEON_ITEMS) {
@@ -1044,43 +1048,40 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
// Dungeon Items
slot = sCurSection - INV_EDITOR_SECTION_DUNGEON_ITEMS;
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- // Map
- gSaveContext.save.inventory.dungeonItems[slot] ^= 4;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_MAP);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
- // Compass
- gSaveContext.save.inventory.dungeonItems[slot] ^= 2;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_COMPASS);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- // Boss Key
- gSaveContext.save.inventory.dungeonItems[slot] ^= 1;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_BOSS_KEY);
}
} else if (sCurSection < INV_EDITOR_SECTION_DOUBLE_DEFENSE) {
// Stray Fairies
slot = sCurSection - INV_EDITOR_SECTION_STRAY_FAIRIES;
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- gSaveContext.save.inventory.strayFairies[slot]--;
- if (gSaveContext.save.inventory.strayFairies[slot] < 0) {
- gSaveContext.save.inventory.strayFairies[slot] = 0;
+ gSaveContext.save.saveInfo.inventory.strayFairies[slot]--;
+ if (gSaveContext.save.saveInfo.inventory.strayFairies[slot] < 0) {
+ gSaveContext.save.saveInfo.inventory.strayFairies[slot] = 0;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.inventory.strayFairies[slot]++;
- if (gSaveContext.save.inventory.strayFairies[slot] >= 99) {
- gSaveContext.save.inventory.strayFairies[slot] = 99;
+ gSaveContext.save.saveInfo.inventory.strayFairies[slot]++;
+ if (gSaveContext.save.saveInfo.inventory.strayFairies[slot] >= 99) {
+ gSaveContext.save.saveInfo.inventory.strayFairies[slot] = 99;
}
}
} else {
- // Double Defence
+ // Double Defense
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT) ||
CHECK_BTN_ALL(input->press.button, BTN_CDOWN) || CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- gSaveContext.save.playerData.doubleDefense ^= 1;
- if (!gSaveContext.save.playerData.doubleDefense) {
- gSaveContext.save.inventory.defenseHearts = 0;
+ gSaveContext.save.saveInfo.playerData.doubleDefense ^= 1;
+ if (!gSaveContext.save.saveInfo.playerData.doubleDefense) {
+ gSaveContext.save.saveInfo.inventory.defenseHearts = 0;
} else {
- gSaveContext.save.inventory.defenseHearts = 20;
+ gSaveContext.save.saveInfo.inventory.defenseHearts = 20;
}
}
}
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
index 474180826..f46db573c 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c
@@ -15,7 +15,7 @@ s16 sEquipMagicArrowSlotHoldTimer = 0;
// Number of frames to move icon from slot to target position when equipping.
s16 sEquipAnimTimer = 10;
-u8 gPlayerFormSlotRestrictions[PLAYER_FORM_MAX][NUM_ITEM_SLOTS] = {
+u8 gPlayerFormSlotRestrictions[PLAYER_FORM_MAX][ITEM_NUM_SLOTS] = {
// Fierce Deity
{
false, // SLOT_OCARINA
@@ -236,9 +236,9 @@ void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx,
CLOSE_DISPS(gfxCtx);
}
-void KaleidoScope_SetCursorVtx(PauseContext* pauseCtx, u16 index, Vtx* vtx) {
- pauseCtx->cursorVtx[0].v.ob[0] = vtx[index].v.ob[0];
- pauseCtx->cursorVtx[0].v.ob[1] = vtx[index].v.ob[1];
+void KaleidoScope_SetCursorVtxPos(PauseContext* pauseCtx, u16 vtxIndex, Vtx* vtx) {
+ pauseCtx->cursorVtx[0].v.ob[0] = vtx[vtxIndex].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = vtx[vtxIndex].v.ob[1];
}
static s16 sMagicArrowEffectsR[] = { 255, 100, 255 };
@@ -252,15 +252,15 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
// Draw a white box around the items that are equipped on the C buttons
// Loop over c-buttons (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- for (i = 0, j = NUM_ITEM_SLOTS * 4; i < 3; i++, j += 4) {
+ for (i = 0, j = ITEM_NUM_SLOTS * 4; i < 3; i++, j += 4) {
if (GET_CUR_FORM_BTN_ITEM(i + 1) != ITEM_NONE) {
- if (GET_CUR_FORM_BTN_SLOT(i + 1) < NUM_ITEM_SLOTS) {
+ if (GET_CUR_FORM_BTN_SLOT(i + 1) < ITEM_NUM_SLOTS) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j], 4, 0);
POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0);
}
@@ -272,10 +272,10 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
// Draw the item icons
// Loop over slots (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- for (j = 0, i = 0; i < NUM_ITEM_SLOTS; i++, j += 4) {
+ for (j = 0, i = 0; i < ITEM_NUM_SLOTS; i++, j += 4) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- if (((void)0, gSaveContext.save.inventory.items[i]) != ITEM_NONE) {
+ if (((void)0, gSaveContext.save.saveInfo.inventory.items[i]) != ITEM_NONE) {
if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->pageIndex == PAUSE_ITEM) &&
(pauseCtx->cursorSpecialPos == 0) &&
gPlayerFormSlotRestrictions[(void)0, gSaveContext.save.playerForm][i]) {
@@ -309,8 +309,8 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
}
gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j + 0], 4, 0);
- KaleidoScope_DrawTexQuadRGBA32(play->state.gfxCtx,
- gItemIcons[((void)0, gSaveContext.save.inventory.items[i])], 32, 32, 0);
+ KaleidoScope_DrawTexQuadRGBA32(
+ play->state.gfxCtx, gItemIcons[((void)0, gSaveContext.save.saveInfo.inventory.items[i])], 32, 32, 0);
}
}
@@ -319,20 +319,20 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
if ((pauseCtx->state == PAUSE_STATE_MAIN) &&
((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) || (pauseCtx->mainState == PAUSE_MAIN_STATE_EQUIP_ITEM)) &&
(pauseCtx->state != PAUSE_STATE_SAVEPROMPT) && !IS_PAUSE_STATE_GAMEOVER) {
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
// Loop over slots (i) and ammoIndex (j)
- for (j = 0, i = 0; i < NUM_ITEM_SLOTS; i++) {
+ for (j = 0, i = 0; i < ITEM_NUM_SLOTS; i++) {
if (gAmmoItems[i] != ITEM_NONE) {
- if (((void)0, gSaveContext.save.inventory.items[i]) != ITEM_NONE) {
+ if (((void)0, gSaveContext.save.saveInfo.inventory.items[i]) != ITEM_NONE) {
KaleidoScope_DrawAmmoCount(pauseCtx, play->state.gfxCtx,
- ((void)0, gSaveContext.save.inventory.items[i]), j);
+ ((void)0, gSaveContext.save.saveInfo.inventory.items[i]), j);
}
j++;
}
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
@@ -382,7 +382,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorXIndex[PAUSE_ITEM]--;
pauseCtx->cursorPoint[PAUSE_ITEM]--;
@@ -398,7 +398,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_ITEM] =
pauseCtx->cursorXIndex[PAUSE_ITEM] + (pauseCtx->cursorYIndex[PAUSE_ITEM] * 6);
- if (pauseCtx->cursorPoint[PAUSE_ITEM] >= NUM_ITEM_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_ITEM] >= ITEM_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_ITEM] = pauseCtx->cursorXIndex[PAUSE_ITEM];
}
@@ -413,7 +413,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] <= 4) {
pauseCtx->cursorXIndex[PAUSE_ITEM]++;
pauseCtx->cursorPoint[PAUSE_ITEM]++;
@@ -429,7 +429,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_ITEM] =
pauseCtx->cursorXIndex[PAUSE_ITEM] + (pauseCtx->cursorYIndex[PAUSE_ITEM] * 6);
- if (pauseCtx->cursorPoint[PAUSE_ITEM] >= NUM_ITEM_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_ITEM] >= ITEM_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_ITEM] = pauseCtx->cursorXIndex[PAUSE_ITEM];
}
@@ -446,12 +446,12 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
+ cursorItem = gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
}
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_OCARINA)
@@ -459,7 +459,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if (gSaveContext.save.inventory.items[cursorPoint] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[cursorPoint] != ITEM_NONE) {
pauseCtx->cursorPoint[PAUSE_ITEM] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_ITEM] = cursorXIndex;
pauseCtx->cursorYIndex[PAUSE_ITEM] = cursorYIndex;
@@ -489,7 +489,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else { // PAUSE_CURSOR_PAGE_RIGHT
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right columne (SLOT_TRADE_DEED)
cursorYIndex = 0;
@@ -497,7 +497,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if (gSaveContext.save.inventory.items[cursorPoint] != ITEM_NONE) {
+ if (gSaveContext.save.saveInfo.inventory.items[cursorPoint] != ITEM_NONE) {
pauseCtx->cursorPoint[PAUSE_ITEM] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_ITEM] = cursorXIndex;
pauseCtx->cursorYIndex[PAUSE_ITEM] = cursorYIndex;
@@ -541,7 +541,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorYIndex[PAUSE_ITEM]--;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
@@ -553,7 +553,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] < 3) {
pauseCtx->cursorYIndex[PAUSE_ITEM]++;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
@@ -568,9 +568,9 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
pauseCtx->cursorColorSet = PAUSE_CURSOR_COLOR_SET_YELLOW;
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
+ cursorItem = gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
} else if (moveCursorResult != PAUSE_CURSOR_RESULT_SPECIAL_POS) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
+ cursorItem = gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]];
}
if (cursorItem == ITEM_NONE) {
@@ -737,7 +737,7 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
}
if (sEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
- bowItemVtx = &pauseCtx->itemVtx[4];
+ bowItemVtx = &pauseCtx->itemVtx[SLOT_BOW * 4];
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipAnimTimer;
} else {
@@ -761,13 +761,13 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) {
// Update coordinates of item icon while being equipped
if (sEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
// target is the bow slot
- if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[4].v.ob[0] * 10)) {
+ if (pauseCtx->equipAnimX >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[0] * 10)) {
pauseCtx->equipAnimX -= offsetX;
} else {
pauseCtx->equipAnimX += offsetX;
}
- if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[4].v.ob[1] * 10)) {
+ if (pauseCtx->equipAnimY >= (pauseCtx->itemVtx[SLOT_BOW * 4].v.ob[1] * 10)) {
pauseCtx->equipAnimY -= offsetY;
} else {
pauseCtx->equipAnimY += offsetY;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
index 87acfaa6c..a4df2c889 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_map.c
@@ -10,14 +10,8 @@
#include "interface/icon_item_dungeon_static/icon_item_dungeon_static.h"
#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
-extern s16 D_8082B7F0[];
-extern s16 D_8082B838[];
-
extern TexturePtr D_09007500; // gPlayerFaceIcon
-#define WORLD_MAP_IMAGE_TEX_WIDTH 216
-#define WORLD_MAP_IMAGE_TEX_HEIGHT 128
-
void KaleidoScope_DrawDungeonStrayFairyCount(PlayState* play) {
s16 counterDigits[2];
s16 rectLeft;
@@ -59,7 +53,7 @@ void KaleidoScope_DrawDungeonStrayFairyCount(PlayState* play) {
1 << 10);
// Get digits for current number of stray fairies collected
- counterDigits[1] = gSaveContext.save.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex];
+ counterDigits[1] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex];
counterDigits[0] = counterDigits[1] / 10;
counterDigits[1] -= (s16)(counterDigits[0] * 10);
@@ -142,8 +136,8 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- j = 72 + (pauseCtx->cursorSlot[PAUSE_MAP] * 4);
- KaleidoScope_SetCursorVtx(pauseCtx, j, pauseCtx->mapPageVtx);
+ j = (QUAD_MAP_PAGE_DUNGEON_MAP + pauseCtx->cursorSlot[PAUSE_MAP]) * 4;
+ KaleidoScope_SetCursorVtxPos(pauseCtx, j, pauseCtx->mapPageVtx);
pauseCtx->cursorItem[PAUSE_MAP] = PAUSE_ITEM_NONE;
if (pauseCtx->cursorSpecialPos == 0) {
@@ -153,11 +147,19 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP];
}
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 16, 0);
+ // Set vertices for:
+ // QUAD_MAP_PAGE_DUNGEON_TITLE,
+ // QUAD_MAP_PAGE_DUNGEON_BOSS_KEY,
+ // QUAD_MAP_PAGE_DUNGEON_COMPASS,
+ // QUAD_MAP_PAGE_DUNGEON_MAP
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_DUNGEON_TITLE * 4], 4 * 4, 0);
+
+ // Dungeon Title
gDPPipeSync(POLY_OPA_DISP++);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA);
+ // QUAD_MAP_PAGE_DUNGEON_TITLE
POLY_OPA_DISP =
Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sDungeonTitleTextures[((void)0, gSaveContext.dungeonIndex)], 128, 16, 0);
@@ -189,7 +191,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
sStrayFairyIconAlphaScaleTimer = 15;
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
@@ -211,6 +213,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ // QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
pauseCtx->mapPageVtx[76].v.ob[0] = pauseCtx->mapPageVtx[78].v.ob[0] = -16;
pauseCtx->mapPageVtx[77].v.ob[0] = pauseCtx->mapPageVtx[79].v.ob[0] =
@@ -221,12 +224,13 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
pauseCtx->mapPageVtx[78].v.ob[1] = pauseCtx->mapPageVtx[79].v.ob[1] =
pauseCtx->mapPageVtx[76].v.ob[1] - 24;
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[76], 4, 0);
+ gSPVertex(POLY_OPA_DISP++,
+ &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE * 4], 4, 0);
POLY_OPA_DISP =
Gfx_DrawTexQuad4b(POLY_OPA_DISP, gStrayFairyGlowingCircleIconTex, G_IM_FMT_I, 32, 24, 0);
KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
@@ -250,7 +254,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
sStrayFairyIconRectS[sStrayFairyIconIndex], 0, 1 << 10, 1 << 10);
KaleidoScope_DrawDungeonStrayFairyCount(play);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
} else if (CHECK_DUNGEON_ITEM(i, gSaveContext.dungeonIndex)) {
@@ -258,6 +262,9 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
+ // QUAD_MAP_PAGE_DUNGEON_BOSS_KEY
+ // QUAD_MAP_PAGE_DUNGEON_COMPASS
+ // QUAD_MAP_PAGE_DUNGEON_MAP
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
}
@@ -270,7 +277,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) &&
!IS_PAUSE_STATE_GAMEOVER) {
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -287,7 +294,7 @@ void KaleidoScope_DrawDungeonMap(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
}
}
@@ -310,9 +317,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
pauseCtx->cursorColorSet = PAUSE_CURSOR_COLOR_SET_WHITE;
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 0;
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->unk_256;
pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->unk_256;
@@ -338,9 +345,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 1;
pauseCtx->cursorPoint[PAUSE_MAP] = DUNGEON_MAP;
if (!CHECK_DUNGEON_ITEM(DUNGEON_MAP, gSaveContext.dungeonIndex)) {
@@ -379,11 +386,11 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
} else if ((pauseCtx->cursorSpecialPos == 0) && (pauseCtx->stickAdjY > 30)) {
if (pauseCtx->cursorPoint[PAUSE_MAP] >= DUNGEON_FLOOR_INDEX_4) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] - (DUNGEON_FLOOR_INDEX_4 + 1); i >= 0; i--) {
- if ((gSaveContext.save.permanentSceneFlags[(void)0, gSaveContext.dungeonIndex].unk_14 &
+ if ((gSaveContext.save.saveInfo.permanentSceneFlags[(void)0, gSaveContext.dungeonIndex].unk_14 &
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -400,11 +407,11 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
(pauseCtx->cursorPoint[PAUSE_MAP] <= DUNGEON_FLOOR_INDEX_1)) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] - (DUNGEON_FLOOR_INDEX_4 - 1); i <= DUNGEON_FLOOR_INDEX_0;
i++) {
- if ((gSaveContext.save.permanentSceneFlags[(void)0, gSaveContext.dungeonIndex].unk_14 &
+ if ((gSaveContext.save.saveInfo.permanentSceneFlags[(void)0, gSaveContext.dungeonIndex].unk_14 &
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -486,6 +493,7 @@ s16 sWorldMapDotPrimColors[][3] = {
{ 0, 0, 255 },
{ 255, 255, 0 },
};
+
s16 sWorldMapDotEnvColors[][3] = {
{ 255, 255, 0 },
{ 0, 0, 255 },
@@ -537,7 +545,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_MAP] * 4, pauseCtx->mapPageVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_MAP] * 4, pauseCtx->mapPageVtx);
// Draw the world map image
if ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->state == PAUSE_STATE_MAIN) &&
@@ -550,7 +558,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Each loaded chunk must have `size <= TMEM_SIZE / 2`
// because the texture is color-indexed, so the TLUT uses the other half of TMEM.
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT);
gDPLoadTLUT_pal256(POLY_OPA_DISP++, gWorldMapImageTLUT);
@@ -561,17 +569,17 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Process the 128 rows of pixels for gWorldMapImageTex, 8 rows at a time over 16 iterations
// Loop over yPos (t), textureIndex (j)
for (t = 62, j = 0; j < 16; j++, t += 8) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + j * (WORLD_MAP_IMAGE_TEX_WIDTH * 8),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 8, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + j * (WORLD_MAP_IMAGE_WIDTH * 8), G_IM_FMT_CI,
+ G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, 8, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
rectLeft = 51 << 2;
- rectRight = rectLeft + (WORLD_MAP_IMAGE_TEX_WIDTH << 2);
+ rectRight = rectLeft + (WORLD_MAP_IMAGE_WIDTH << 2);
gSPTextureRectangle(POLY_OPA_DISP++, rectLeft, t << 2, rectRight, (t << 2) + (8 << 2), G_TX_RENDERTILE, 0,
0, 1 << 10, 1 << 10);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
} else {
// Draw the world map angled
@@ -593,41 +601,44 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
// Set the vertices for the first 8 quads attached to the world map texture.
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[204], 8 * 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[QUAD_MAP_PAGE_WORLD_IMAGE_FIRST * 4], 8 * 4, 0);
// Process the first 72 rows of pixels for gWorldMapImageTex, 9 rows at a time over 8 iterations
// Loop over quadIndex of this loop (i), quadIndex of the entire texture (k), vtxIndex (j)
for (i = 0, k = 0, j = 0; i < 8; i++, k++, j += 4) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 9, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_FRAG_HEIGHT, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
// Set the vertices for the last 7 quads attached to the world map texture:
// 6 quads with a height of 9, 1 quad with a height of 2
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[236], (6 + 1) * 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_IMAGE_FIRST + 8) * 4], (6 + 1) * 4, 0);
// Process the next 54 rows of pixels for gWorldMapImageTex, 9 rows at a time over 6 iterations
// Loop over quadIndex of this loop (i), quadIndex of the entire texture (k), vtxIndex (j)
for (i = 0, j = 0; i < 6; i++, k++, j += 4) {
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9),
- G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 9, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_FRAG_HEIGHT, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
// Process the last 2 rows of pixels for gWorldMapImageTex
- gDPLoadTextureBlock(POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_TEX_WIDTH * 9), G_IM_FMT_CI,
- G_IM_SIZ_8b, WORLD_MAP_IMAGE_TEX_WIDTH, 2, 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);
+ gDPLoadTextureBlock(
+ POLY_OPA_DISP++, (u8*)gWorldMapImageTex + k * (WORLD_MAP_IMAGE_WIDTH * WORLD_MAP_IMAGE_FRAG_HEIGHT),
+ G_IM_FMT_CI, G_IM_SIZ_8b, WORLD_MAP_IMAGE_WIDTH, WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
@@ -641,12 +652,13 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Draw clouds over the world map
// Iterate over cloud bits (n)
- for (n = 0; n < 15; n++) {
- if (!(((void)0, gSaveContext.save.worldMapCloudVisibility) & gBitFlags[n])) {
+ for (n = 0; n < WORLD_MAP_NUM_CLOUDS; n++) {
+ if (!(((void)0, gSaveContext.save.saveInfo.worldMapCloudVisibility) & gBitFlags[n])) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60 + n * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST + n) * 4], 4, 0);
- POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sCloudTextures[n], D_8082B7F0[n], D_8082B838[n], 0);
+ POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, sCloudTextures[n], gVtxPageMapWorldQuadsWidth[n],
+ gVtxPageMapWorldQuadsHeight[n], 0);
}
}
@@ -658,7 +670,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
gDPFillRectangle(POLY_OPA_DISP++, 50, 62, 270, 190);
}
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
if (!IS_PAUSE_STATE_OWLWARP) {
// Browsing the world map regions on the pause menu
@@ -674,8 +686,9 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
sWorldMapDotEnvColors[0][2], 0);
if (R_PAUSE_DBG_MAP_CLOUD_ON) {
- gSaveContext.save.worldMapCloudVisibility |= (u16)~0x8000;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= (u16)~0x8000;
+ // QUAD_MAP_PAGE_WORLD_REGION_FIRST
pauseCtx->mapPageVtx[120].v.ob[0] = pauseCtx->mapPageVtx[122].v.ob[0] = R_PAUSE_DBG_MAP_CLOUD_X;
pauseCtx->mapPageVtx[121].v.ob[0] = pauseCtx->mapPageVtx[123].v.ob[0] =
@@ -690,7 +703,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Loop over RegionId (i), unused vtxIndex (j), unused (k)
for (i = 0, j = 0; i < REGION_MAX; i++, k++, j += 4) {
if (pauseCtx->worldMapPoints[i]) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[120 + i * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_REGION_FIRST + i) * 4], 4, 0);
gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
}
}
@@ -706,8 +719,9 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
if (R_PAUSE_DBG_MAP_CLOUD_ON) {
- gSaveContext.save.worldMapCloudVisibility |= (u16)~0x8000;
+ gSaveContext.save.saveInfo.worldMapCloudVisibility |= (u16)~0x8000;
+ // QUAD_MAP_PAGE_WORLD_WARP_FIRST
pauseCtx->mapPageVtx[164].v.ob[0] = pauseCtx->mapPageVtx[166].v.ob[0] = R_PAUSE_DBG_MAP_CLOUD_X;
pauseCtx->mapPageVtx[165].v.ob[0] = pauseCtx->mapPageVtx[167].v.ob[0] =
@@ -722,7 +736,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Loop over OwlWarpId (i), unused vtxIndex (j), unused (k)
for (i = 0, j = 0; i < OWL_WARP_ENTRANCE; i++, k++, j += 4) {
if (pauseCtx->worldMapPoints[i]) {
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[164 + i * 4], 4, 0);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[(QUAD_MAP_PAGE_WORLD_WARP_FIRST + i) * 4], 4, 0);
gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
}
}
@@ -795,7 +809,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play) {
// Draw Player's face at the current region
if (n != REGION_MAX) {
KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
- func_8012C628(play->state.gfxCtx);
+ Gfx_SetupDL39_Opa(play->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
@@ -840,7 +854,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->cursorSpecialPos == 0) {
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -855,7 +869,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -884,7 +898,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->stickAdjX > 30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = -1;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -909,7 +923,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
} else if (pauseCtx->stickAdjX < -30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 11;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
@@ -944,7 +958,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -953,7 +967,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
} while (!pauseCtx->worldMapPoints[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]]);
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
index 219ecd7a9..228f0d16a 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c
@@ -15,7 +15,7 @@ s16 sMaskEquipMagicArrowSlotHoldTimer = 0;
// Number of frames to move icon from slot to target position when equipping.
s16 sMaskEquipAnimTimer = 10;
-u8 gMaskPlayerFormSlotRestrictions[PLAYER_FORM_MAX][NUM_MASK_SLOTS] = {
+u8 gMaskPlayerFormSlotRestrictions[PLAYER_FORM_MAX][MASK_NUM_SLOTS] = {
// Fierce Deity
{
false, // SLOT_MASK_POSTMAN
@@ -196,17 +196,17 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
- KaleidoScope_SetCursorVtx(pauseCtx, pauseCtx->cursorSlot[PAUSE_MASK] * 4, pauseCtx->maskVtx);
+ KaleidoScope_SetCursorVtxPos(pauseCtx, pauseCtx->cursorSlot[PAUSE_MASK] * 4, pauseCtx->maskVtx);
- func_8012C8AC(play->state.gfxCtx);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
// Draw a white box around the items that are equipped on the C buttons
// Loop over c-buttons (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- for (i = 0, j = NUM_MASK_SLOTS * 4; i < 3; i++, j += 4) {
+ for (i = 0, j = MASK_NUM_SLOTS * 4; i < 3; i++, j += 4) {
if (GET_CUR_FORM_BTN_ITEM(i + 1) != ITEM_NONE) {
- if (GET_CUR_FORM_BTN_SLOT(i + 1) >= NUM_ITEM_SLOTS) {
+ if (GET_CUR_FORM_BTN_SLOT(i + 1) >= ITEM_NUM_SLOTS) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->maskVtx[j], 4, 0);
POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0);
}
@@ -218,10 +218,10 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
// Draw the item icons
// Loop over slots (i) and vtx offset (j)
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- for (j = 0, i = 0; i < NUM_MASK_SLOTS; i++, j += 4) {
+ for (j = 0, i = 0; i < MASK_NUM_SLOTS; i++, j += 4) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha);
- if (((void)0, gSaveContext.save.inventory.items[i + NUM_ITEM_SLOTS]) != ITEM_NONE) {
+ if (((void)0, gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS]) != ITEM_NONE) {
if (!CHECK_GIVEN_MASK_ON_MOON(i)) {
if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && (pauseCtx->pageIndex == PAUSE_MASK) &&
(pauseCtx->cursorSpecialPos == 0) &&
@@ -258,8 +258,8 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) {
gSPVertex(POLY_OPA_DISP++, &pauseCtx->maskVtx[j + 0], 4, 0);
KaleidoScope_DrawTexQuadRGBA32(
- play->state.gfxCtx, gItemIcons[((void)0, gSaveContext.save.inventory.items[i + NUM_ITEM_SLOTS])],
- 32, 32, 0);
+ play->state.gfxCtx,
+ gItemIcons[((void)0, gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS])], 32, 32, 0);
}
}
}
@@ -309,7 +309,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] != 0) {
pauseCtx->cursorXIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK]--;
@@ -324,7 +324,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MASK] =
pauseCtx->cursorXIndex[PAUSE_MASK] + (pauseCtx->cursorYIndex[PAUSE_MASK] * 6);
- if (pauseCtx->cursorPoint[PAUSE_MASK] >= NUM_MASK_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_MASK] >= MASK_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_MASK] = pauseCtx->cursorXIndex[PAUSE_MASK];
}
@@ -339,7 +339,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] <= 4) {
pauseCtx->cursorXIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[PAUSE_MASK]++;
@@ -354,7 +354,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MASK] =
pauseCtx->cursorXIndex[PAUSE_MASK] + (pauseCtx->cursorYIndex[PAUSE_MASK] * 6);
- if (pauseCtx->cursorPoint[PAUSE_MASK] >= NUM_MASK_SLOTS) {
+ if (pauseCtx->cursorPoint[PAUSE_MASK] >= MASK_NUM_SLOTS) {
pauseCtx->cursorPoint[PAUSE_MASK] = pauseCtx->cursorXIndex[PAUSE_MASK];
}
@@ -371,7 +371,8 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ cursorItem =
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
@@ -379,7 +380,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_MASK_POSTMAN)
@@ -387,7 +388,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if ((gSaveContext.save.inventory.items[cursorPoint + NUM_ITEM_SLOTS] != ITEM_NONE) &&
+ if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + ITEM_NUM_SLOTS] != ITEM_NONE) &&
!CHECK_GIVEN_MASK_ON_MOON(cursorPoint)) {
pauseCtx->cursorPoint[PAUSE_MASK] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_MASK] = cursorXIndex;
@@ -420,7 +421,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
//! FAKE:
if (1) {}
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right column (SLOT_MASK_DEKU)
cursorYIndex = 0;
@@ -428,7 +429,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Search for slot to move to
while (true) {
// Check if current cursor has an item in its slot
- if ((gSaveContext.save.inventory.items[cursorPoint + NUM_ITEM_SLOTS] != ITEM_NONE) &&
+ if ((gSaveContext.save.saveInfo.inventory.items[cursorPoint + ITEM_NUM_SLOTS] != ITEM_NONE) &&
!CHECK_GIVEN_MASK_ON_MOON(cursorPoint)) {
pauseCtx->cursorPoint[PAUSE_MASK] = cursorPoint;
pauseCtx->cursorXIndex[PAUSE_MASK] = cursorXIndex;
@@ -472,7 +473,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor up
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] != 0) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
@@ -484,7 +485,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor down
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] < 3) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[PAUSE_MASK] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
@@ -500,12 +501,14 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
pauseCtx->cursorColorSet = PAUSE_CURSOR_COLOR_SET_YELLOW;
if (moveCursorResult == PAUSE_CURSOR_RESULT_SLOT) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ cursorItem =
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
} else if (moveCursorResult != PAUSE_CURSOR_RESULT_SPECIAL_POS) {
- cursorItem = gSaveContext.save.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + NUM_ITEM_SLOTS];
+ cursorItem =
+ gSaveContext.save.saveInfo.inventory.items[pauseCtx->cursorPoint[PAUSE_MASK] + ITEM_NUM_SLOTS];
if (CHECK_GIVEN_MASK_ON_MOON(pauseCtx->cursorPoint[PAUSE_MASK])) {
cursorItem = ITEM_NONE;
}
@@ -568,8 +571,8 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
(Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE) &&
- ((cursorSlot == (SLOT_MASK_DEKU - NUM_ITEM_SLOTS)) ||
- (cursorSlot == (SLOT_MASK_GORON - NUM_ITEM_SLOTS)))) {
+ ((cursorSlot == (SLOT_MASK_DEKU - ITEM_NUM_SLOTS)) ||
+ (cursorSlot == (SLOT_MASK_GORON - ITEM_NUM_SLOTS)))) {
play_sound(NA_SE_SY_ERROR);
return;
}
@@ -584,7 +587,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// Equip item to the C buttons
pauseCtx->equipTargetItem = cursorItem;
- pauseCtx->equipTargetSlot = cursorSlot + NUM_ITEM_SLOTS;
+ pauseCtx->equipTargetSlot = cursorSlot + ITEM_NUM_SLOTS;
pauseCtx->mainState = PAUSE_MAIN_STATE_EQUIP_MASK;
vtxIndex = cursorSlot * 4;
pauseCtx->equipAnimX = pauseCtx->maskVtx[vtxIndex].v.ob[0] * 10;
@@ -656,7 +659,10 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) {
}
if (sMaskEquipState == EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT) {
- bowItemVtx = &pauseCtx->itemVtx[12];
+ //! Note: Copied from OoT when `SLOT_BOW` was still valued at 3.
+ // Due to a shift, `SLOT_ARROW_ICE` now occupies slot 3 but this value was not updated
+ // Block is never reached as you can not equip magic arrows from the mask page
+ bowItemVtx = &pauseCtx->itemVtx[SLOT_ARROW_ICE * 4];
offsetX = ABS_ALT(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sMaskEquipAnimTimer;
offsetY = ABS_ALT(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sMaskEquipAnimTimer;
} else {
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
index 13e233b58..9bf89cdd2 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.c
@@ -14,7 +14,7 @@ void KaleidoScope_UpdatePrompt(PlayState* play) {
static s16 sPromptAlphaTimer = 10;
PauseContext* pauseCtx = &play->pauseCtx;
Input* input = CONTROLLER1(&play->state);
- s8 relStickX = input->rel.stick_x;
+ s8 stickAdjX = input->rel.stick_x;
s16 alphaStep;
if (((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_1)) ||
@@ -22,11 +22,11 @@ void KaleidoScope_UpdatePrompt(PlayState* play) {
(pauseCtx->state == PAUSE_STATE_GAMEOVER_CONTINUE_PROMPT)) {
// Move the prompt
- if ((pauseCtx->promptChoice == PAUSE_PROMPT_YES) && (relStickX >= 30)) {
+ if ((pauseCtx->promptChoice == PAUSE_PROMPT_YES) && (stickAdjX >= 30)) {
// Move right to the no prompt
play_sound(NA_SE_SY_CURSOR);
pauseCtx->promptChoice = PAUSE_PROMPT_NO;
- } else if ((pauseCtx->promptChoice != PAUSE_PROMPT_YES) && (relStickX <= -30)) {
+ } else if ((pauseCtx->promptChoice != PAUSE_PROMPT_YES) && (stickAdjX <= -30)) {
// Move left to the yes prompt
play_sound(NA_SE_SY_CURSOR);
pauseCtx->promptChoice = PAUSE_PROMPT_YES;
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
index 849c7020e..c82a40e67 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h
@@ -76,9 +76,9 @@ typedef enum {
} PauseMainState;
typedef enum {
- /* 0x00 */ PAUSE_SAVEPROMPT_STATE_0,
+ /* 0x00 */ PAUSE_SAVEPROMPT_STATE_APPEARING,
/* 0x01 */ PAUSE_SAVEPROMPT_STATE_1,
- /* 0x02 */ PAUSE_SAVEPROMPT_STATE_2,
+ /* 0x02 */ PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU,
/* 0x03 */ PAUSE_SAVEPROMPT_STATE_3,
/* 0x04 */ PAUSE_SAVEPROMPT_STATE_4,
/* 0x05 */ PAUSE_SAVEPROMPT_STATE_5,
@@ -92,7 +92,7 @@ typedef enum {
#define IS_PAUSE_STATE_OWLWARP \
((pauseCtx->state >= PAUSE_STATE_OWLWARP_2) && (pauseCtx->state <= PAUSE_STATE_OWLWARP_6))
-#define IS_PAUSE_MAIN_STATE_SAVE_PROMPT \
+#define IS_PAUSE_MAIN_STATE_SONG_PROMPT \
((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) && \
(pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_DONE))
@@ -125,9 +125,213 @@ typedef enum {
/* 5 */ PAUSE_BG_PRERENDER_MAX
} PauseBgPreRenderState;
+typedef enum {
+ /* 0 */ VTX_PAGE_MASK,
+ /* 1 */ VTX_PAGE_ITEM,
+ /* 2 */ VTX_PAGE_MAP_DUNGEON,
+ /* 3 */ VTX_PAGE_QUEST,
+ /* 4 */ VTX_PAGE_MAP_WORLD,
+ /* 5 */ VTX_PAGE_PROMPT,
+ /* 6 */ VTX_PAGE_MAX
+} VtxPage;
+
+#define VTX_PAGE_MASK_QUADS 0 // VTX_PAGE_MASK
+#define VTX_PAGE_ITEM_QUADS 0 // VTX_PAGE_ITEM
+#define VTX_PAGE_MAP_DUNGEON_QUADS 6 // VTX_PAGE_MAP_DUNGEON
+#define VTX_PAGE_QUEST_QUADS 0 // VTX_PAGE_QUEST
+#define VTX_PAGE_MAP_WORLD_QUADS 36 // VTX_PAGE_MAP_WORLD
+#define VTX_PAGE_SAVE_QUADS 5 // VTX_PAGE_PROMPT
+
+#define PAGE_BG_COLS 3
+#define PAGE_BG_ROWS 5
+#define PAGE_BG_QUADS (PAGE_BG_COLS * PAGE_BG_ROWS)
+#define PAGE_BG_QUAD_WIDTH 80
+#define PAGE_BG_QUAD_HEIGHT 32
+#define PAGE_BG_QUAD_TEX_WIDTH 80
+#define PAGE_BG_QUAD_TEX_HEIGHT 32
+
+// === ITEM === //
+
+#define ITEM_GRID_ROWS 4
+#define ITEM_GRID_COLS 6
+#define ITEM_GRID_CELL_WIDTH 32
+#define ITEM_GRID_CELL_HEIGHT 32
+#define ITEM_GRID_QUAD_MARGIN 2
+#define ITEM_GRID_QUAD_WIDTH (ITEM_GRID_CELL_WIDTH - (2 * ITEM_GRID_QUAD_MARGIN))
+#define ITEM_GRID_QUAD_HEIGHT (ITEM_GRID_CELL_HEIGHT - (2 * ITEM_GRID_QUAD_MARGIN))
+#define ITEM_GRID_QUAD_TEX_SIZE 32 // both width and height
+#define ITEM_GRID_QUAD_ENLARGE_OFFSET 2
+
+#define ITEM_GRID_SELECTED_QUAD_MARGIN (-2)
+#define ITEM_GRID_SELECTED_QUAD_WIDTH (ITEM_GRID_QUAD_WIDTH - (2 * ITEM_GRID_SELECTED_QUAD_MARGIN))
+#define ITEM_GRID_SELECTED_QUAD_HEIGHT (ITEM_GRID_QUAD_HEIGHT - (2 * ITEM_GRID_SELECTED_QUAD_MARGIN))
+#define ITEM_GRID_SELECTED_QUAD_TEX_SIZE 32 // both width and height
+
+#define ITEM_NUM_SLOTS (ITEM_GRID_ROWS * ITEM_GRID_COLS)
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_ITEM_PAGE_BG_FIRST,
+ /* 14 */ QUAD_ITEM_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_ITEM_QUADS is 0
+ /* 15 */ QUAD_ITEM_PAGE_MAX
+} ItemPageQuad;
+
+typedef enum {
+ // 0..23 are the ITEM_GRID_ROWS*ITEM_GRID_COLS item grid
+ // The values follow the `InventorySlot` enum
+ /* 0 */ QUAD_ITEM_GRID_FIRST,
+ /* 23 */ QUAD_ITEM_GRID_LAST = ITEM_GRID_ROWS * ITEM_GRID_COLS - 1,
+ // White-box Markers indicating the currently equipped items
+ /* 24 */ QUAD_ITEM_GRID_SELECTED_C_LEFT,
+ /* 25 */ QUAD_ITEM_GRID_SELECTED_C_DOWN,
+ /* 26 */ QUAD_ITEM_GRID_SELECTED_C_RIGHT,
+ /* 27 */ QUAD_ITEM_MAX
+} ItemQuad;
+
+// === MASK === //
+
+#define MASK_GRID_ROWS 4
+#define MASK_GRID_COLS 6
+#define MASK_GRID_CELL_WIDTH 32
+#define MASK_GRID_CELL_HEIGHT 32
+#define MASK_GRID_QUAD_MARGIN 2
+#define MASK_GRID_QUAD_WIDTH (MASK_GRID_CELL_WIDTH - (2 * MASK_GRID_QUAD_MARGIN))
+#define MASK_GRID_QUAD_HEIGHT (MASK_GRID_CELL_HEIGHT - (2 * MASK_GRID_QUAD_MARGIN))
+#define MASK_GRID_QUAD_TEX_SIZE 32 // both width and height
+#define MASK_GRID_QUAD_ENLARGE_OFFSET 2
+
+#define MASK_GRID_SELECTED_QUAD_MARGIN (-2)
+#define MASK_GRID_SELECTED_QUAD_WIDTH (MASK_GRID_QUAD_WIDTH - (2 * MASK_GRID_SELECTED_QUAD_MARGIN))
+#define MASK_GRID_SELECTED_QUAD_HEIGHT (MASK_GRID_QUAD_HEIGHT - (2 * MASK_GRID_SELECTED_QUAD_MARGIN))
+#define MASK_GRID_SELECTED_QUAD_TEX_SIZE 32 // both width and height
+
+#define MASK_NUM_SLOTS (MASK_GRID_ROWS * MASK_GRID_COLS)
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MASK_PAGE_BG_FIRST,
+ /* 14 */ QUAD_MASK_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_MASK_QUADS is 0
+ /* 15 */ QUAD_MASK_PAGE_MAX
+} MaskPageQuad;
+
+typedef enum {
+ // 0..23 are the MASK_GRID_ROWS*MASK_GRID_COLS item grid
+ // The values follow the `InventorySlot` enum offset by ITEM_NUM_SLOTS
+ /* 0 */ QUAD_MASK_GRID_FIRST,
+ /* 23 */ QUAD_MASK_GRID_LAST = MASK_GRID_ROWS * MASK_GRID_COLS - 1,
+ // Markers indicating the currently equipped items
+ /* 24 */ QUAD_MASK_GRID_SELECTED_C_LEFT,
+ /* 25 */ QUAD_MASK_GRID_SELECTED_C_DOWN,
+ /* 26 */ QUAD_MASK_GRID_SELECTED_C_RIGHT,
+ /* 27 */ QUAD_MASK_MAX
+} MaskQuad;
+
+// === QUEST === //
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_QUEST_PAGE_BG_FIRST,
+ /* 14 */ QUAD_QUEST_PAGE_BG_LAST = PAGE_BG_QUADS - 1,
+ // VTX_PAGE_QUEST_QUADS is 0
+ /* 15 */ QUAD_QUEST_PAGE_MAX
+} QuestPageQuad;
+
+typedef enum {
+ // 0 to 24 matches the `QuestItem` enum
+ // Notes showing the correct song
+ /* 25 */ QUAD_QUEST_SONG_NOTE_A1 = QUEST_HEART_PIECE + 1,
+ /* 26 */ QUAD_QUEST_SONG_NOTE_A2,
+ /* 27 */ QUAD_QUEST_SONG_NOTE_A3,
+ /* 28 */ QUAD_QUEST_SONG_NOTE_A4,
+ /* 29 */ QUAD_QUEST_SONG_NOTE_A5,
+ /* 30 */ QUAD_QUEST_SONG_NOTE_A6,
+ /* 31 */ QUAD_QUEST_SONG_NOTE_A7,
+ /* 32 */ QUAD_QUEST_SONG_NOTE_A8,
+ // Notes appearing when playing
+ /* 33 */ QUAD_QUEST_SONG_NOTE_B1,
+ /* 34 */ QUAD_QUEST_SONG_NOTE_B2,
+ /* 35 */ QUAD_QUEST_SONG_NOTE_B3,
+ /* 36 */ QUAD_QUEST_SONG_NOTE_B4,
+ /* 37 */ QUAD_QUEST_SONG_NOTE_B5,
+ /* 38 */ QUAD_QUEST_SONG_NOTE_B6,
+ /* 39 */ QUAD_QUEST_SONG_NOTE_B7,
+ /* 40 */ QUAD_QUEST_SONG_NOTE_B8,
+ /* 41 */ QUAD_QUEST_MAX
+} QuestQuad;
+
+// === DUNGEON MAP === //
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MAP_PAGE_DUNGEON_BG_FIRST,
+ /* 14 */ QUAD_MAP_PAGE_DUNGEON_BG_LAST = PAGE_BG_QUADS - 1,
+ /* 15 */ QUAD_MAP_PAGE_DUNGEON_TITLE,
+ /* 16 */ QUAD_MAP_PAGE_DUNGEON_BOSS_KEY,
+ /* 17 */ QUAD_MAP_PAGE_DUNGEON_COMPASS,
+ /* 18 */ QUAD_MAP_PAGE_DUNGEON_MAP,
+ /* 19 */ QUAD_MAP_PAGE_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE,
+ /* 20 */ QUAD_MAP_PAGE_DUNGEON_UNUSED,
+ /* 21 */ QUAD_MAP_PAGE_DUNGEON_MAX
+} DungeonMapPageQuad;
+
+// === WORLD MAP === //
+
+#define WORLD_MAP_IMAGE_WIDTH 216
+#define WORLD_MAP_IMAGE_HEIGHT 128
+#define WORLD_MAP_IMAGE_FRAG_HEIGHT ((TMEM_SIZE / 2) / (WORLD_MAP_IMAGE_WIDTH * G_IM_SIZ_8b_BYTES))
+#define WORLD_MAP_IMAGE_FRAG_NUM (((WORLD_MAP_IMAGE_HEIGHT - 1) / WORLD_MAP_IMAGE_FRAG_HEIGHT) + 1)
+#define WORLD_MAP_NUM_CLOUDS 15
+
+typedef enum {
+ // 0..59 are the 15 background textures
+ /* 0 */ QUAD_MAP_PAGE_WORLD_BG_FIRST,
+ /* 14 */ QUAD_MAP_PAGE_WORLD_BG_LAST = PAGE_BG_QUADS - 1,
+ // Clouds covering the world map
+ /* 15 */ QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST,
+ /* 29 */ QUAD_MAP_PAGE_WORLD_CLOUDS_LAST = QUAD_MAP_PAGE_WORLD_CLOUDS_FIRST + WORLD_MAP_NUM_CLOUDS - 1,
+ // Markers for regions
+ /* 30 */ QUAD_MAP_PAGE_WORLD_REGION_FIRST,
+ /* 40 */ QUAD_MAP_PAGE_WORLD_REGION_LAST = QUAD_MAP_PAGE_WORLD_REGION_FIRST + REGION_MAX - 1,
+ // Markers for owl warps
+ /* 41 */ QUAD_MAP_PAGE_WORLD_WARP_FIRST,
+ /* 50 */ QUAD_MAP_PAGE_WORLD_WARP_LAST = QUAD_MAP_PAGE_WORLD_WARP_FIRST + OWL_WARP_ENTRANCE - 1,
+ // Fragments of the world map
+ /* 51 */ QUAD_MAP_PAGE_WORLD_IMAGE_FIRST,
+ /* 65 */ QUAD_MAP_PAGE_WORLD_IMAGE_LAST = QUAD_MAP_PAGE_WORLD_IMAGE_FIRST + WORLD_MAP_IMAGE_FRAG_NUM - 1,
+ /* 66 */ QUAD_MAP_PAGE_WORLD_MAX
+} WorldMapPageQuad;
+
+// === INFO PANEL === //
+
+/**
+ * infoPanelVtx
+ *
+ * infoPanelVtx[0] name panel left texture
+ * infoPanelVtx[4] name panel right texture
+ * infoPanelVtx[8] Z Button icon
+ * infoPanelVtx[12] R Button icon
+ * infoPanelVtx[16] A button icon (or name segment)
+ * infoPanelVtx[20] pause-to-decide texture
+ * infoPanelVtx[24] (unused) oot remnant of Gold Skulltula Icon Texture
+ */
+
#define PAUSE_NAME_COLOR_SET_WHITE 0
#define PAUSE_NAME_COLOR_SET_GREY 1
+// === CURSOR === //
+
+/**
+ * cursorVtx
+ *
+ * cursorVtx[0] cursor circle
+ * cursorVtx[4] (unused) oot remnant of top-right corner of cursor
+ * cursorVtx[8] (unused) oot remnant of bottom-left corner of cursor
+ * cursorVtx[12] (unused) oot remnant of bottom-right corner of cursor
+ * cursorVtx[16] equipping item icon (while moving)
+ */
+
#define PAUSE_CURSOR_COLOR_SET_WHITE 0
#define PAUSE_CURSOR_COLOR_SET_YELLOW 2
#define PAUSE_CURSOR_COLOR_SET_BLUE 4
@@ -139,17 +343,62 @@ typedef enum {
/* 2 */ PAUSE_CURSOR_RESULT_SPECIAL_POS
} PauseMoveCursorResult;
-#define NUM_ITEM_SLOTS 24
-#define NUM_MASK_SLOTS 24
+typedef enum {
+ /* 0 */ PAUSE_QUAD_CURSOR_0,
+ /* 1 */ PAUSE_QUAD_CURSOR_1,
+ /* 2 */ PAUSE_QUAD_CURSOR_2,
+ /* 3 */ PAUSE_QUAD_CURSOR_3,
+ /* 4 */ PAUSE_QUAD_CURSOR_4,
+ /* 5 */ PAUSE_QUAD_CURSOR_MAX
+} PauseCursorQuad;
+
+// === PROMPT === //
+
+/**
+ * promptPageVtx (unused in MM, inferred from OoT)
+ *
+ * // PAGE_BG_QUADS
+ * promptPageVtx[0] prompt page background texture: row 0, column 0
+ * promptPageVtx[4] prompt page background texture: row 1, column 0
+ * promptPageVtx[8] prompt page background texture: row 2, column 0
+ * promptPageVtx[12] prompt page background texture: row 3, column 0
+ * promptPageVtx[16] prompt page background texture: row 4, column 0
+ * promptPageVtx[20] prompt page background texture: row 0, column 1
+ * promptPageVtx[24] prompt page background texture: row 1, column 1
+ * promptPageVtx[28] prompt page background texture: row 2, column 1
+ * promptPageVtx[32] prompt page background texture: row 3, column 1
+ * promptPageVtx[36] prompt page background texture: row 4, column 1
+ * promptPageVtx[40] prompt page background texture: row 0, column 2
+ * promptPageVtx[44] prompt page background texture: row 1, column 2
+ * promptPageVtx[48] prompt page background texture: row 2, column 2
+ * promptPageVtx[52] prompt page background texture: row 3, column 2
+ * promptPageVtx[56] prompt page background texture: row 4, column 2
+ *
+ * // QUAD_PROMPT_MAX
+ * promptPageVtx[60] message
+ * promptPageVtx[64] cursor left
+ * promptPageVtx[68] cursor right
+ * promptPageVtx[72] choice (yes)
+ * promptPageVtx[76] choice (no)
+ */
#define PAUSE_PROMPT_YES 0
#define PAUSE_PROMPT_NO 4
+typedef enum {
+ /* 0 */ QUAD_PROMPT_MESSAGE,
+ /* 1 */ QUAD_PROMPT_CURSOR_LEFT,
+ /* 2 */ QUAD_PROMPT_CURSOR_RIGHT,
+ /* 3 */ QUAD_PROMPT_CHOICE_YES,
+ /* 4 */ QUAD_PROMPT_CHOICE_NO,
+ /* 5 */ QUAD_PROMPT_MAX
+} PromptQuad;
+
// NES
void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos);
void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point);
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ);
-void func_80821A04(PlayState* play);
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play);
// Map
void KaleidoScope_DrawDungeonMap(PlayState* play);
@@ -162,7 +411,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play);
void KaleidoScope_UpdateQuestCursor(PlayState* play);
// Item
-void KaleidoScope_SetCursorVtx(PauseContext* pauseCtx, u16 index, Vtx* vtx);
+void KaleidoScope_SetCursorVtxPos(PauseContext* pauseCtx, u16 vtxIndex, Vtx* vtx);
void KaleidoScope_DrawItemSelect(PlayState* play);
void KaleidoScope_UpdateItemCursor(PlayState* play);
void KaleidoScope_UpdateItemEquip(PlayState* play);
@@ -179,4 +428,7 @@ void KaleidoScope_UpdatePrompt(PlayState* play);
void KaleidoScope_DrawInventoryEditor(PlayState* play);
void KaleidoScope_UpdateInventoryEditor(PlayState* play);
+extern s16 gVtxPageMapWorldQuadsWidth[];
+extern s16 gVtxPageMapWorldQuadsHeight[];
+
#endif
diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
index 721ca7a18..b60a00f9e 100644
--- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
+++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c
@@ -1,51 +1,181 @@
/*
* File: z_kaleido_scope_NES.c
* Overlay: ovl_kaleido_scope
- * Description:
+ * Description: Pause Menu
*/
-
+#include "prevent_bss_reordering.h"
#include "z_kaleido_scope.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
+#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
+#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
#include "z64view.h"
+#include "overlays/gamestates/ovl_opening/z_opening.h"
+#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
+#include "interface/icon_item_jpn_static/icon_item_jpn_static.h"
+#include "interface/icon_item_vtx_static/icon_item_vtx_static.h"
-extern UNK_TYPE D_02001360;
-extern UNK_TYPE D_020044A0;
-extern UNK_TYPE D_02004AA0;
-extern UNK_TYPE D_0200B998;
-extern UNK_TYPE D_08062000;
-extern UNK_TYPE D_08064340;
-extern UNK_TYPE D_0B000000;
-extern UNK_TYPE D_0C000000;
-extern UNK_TYPE D_0C006C00;
+// iconItemSegment
+extern TexturePtr D_08064340; // gPauseMenuCursorTex
-extern u8 sUnpausedButtonStatus[5];
-
-void* D_8082B700[] = {
- 0x08064440, 0x0806E440, 0x08077A40, 0x08081040, 0x0808A640, 0x0D003A00, 0x0806EE40, 0x08078440,
- 0x08081A40, 0x0808B040, 0x08065840, 0x0806F840, 0x08078E40, 0x08082440, 0x0808BA40,
+// Page Textures (Background of Page):
+// Broken up into multiple textures.
+// Numbered by column/row.
+TexturePtr sMaskPageBgTextures[] = {
+ // Column 0
+ 0x08064440, // gPauseMasks00Tex
+ 0x0806E440, // gPauseMasks01Tex
+ 0x08077A40, // gPauseMasks02Tex
+ 0x08081040, // gPauseMasks03Tex
+ 0x0808A640, // gPauseMasks04Tex
+ // Column 1
+ gPauseMasks10ENGTex,
+ 0x0806EE40, // gPauseMasks11Tex
+ 0x08078440, // gPauseMasks12Tex
+ 0x08081A40, // gPauseMasks13Tex
+ 0x0808B040, // gPauseMasks14Tex
+ // Column 2
+ 0x08065840, // gPauseMasks20Tex
+ 0x0806F840, // gPauseMasks21Tex
+ 0x08078E40, // gPauseMasks22Tex
+ 0x08082440, // gPauseMasks23Tex
+ 0x0808BA40, // gPauseMasks24Tex
};
-void* D_8082B73C[] = {
- 0x0D004400, 0x08070240, 0x08079840, 0x08082E40, 0x0808C440, 0x0D004E00, 0x08070C40, 0x0807A240,
- 0x08083840, 0x0808CE40, 0x0D005800, 0x08071640, 0x0807AC40, 0x08084240, 0x0808D840,
+TexturePtr sItemPageBgTextures[] = {
+ // Column 0
+ gPauseSelectItem00ENGTex,
+ 0x08070240, // gPauseSelectItem01Tex
+ 0x08079840, // gPauseSelectItem02Tex
+ 0x08082E40, // gPauseSelectItem03Tex
+ 0x0808C440, // gPauseSelectItem04Tex
+ // Column 1
+ gPauseSelectItem10ENGTex,
+ 0x08070C40, // gPauseSelectItem11Tex
+ 0x0807A240, // gPauseSelectItem12Tex
+ 0x08083840, // gPauseSelectItem13Tex
+ 0x0808CE40, // gPauseSelectItem14Tex
+ // Column 2
+ gPauseSelectItem20ENGTex,
+ 0x08071640, // gPauseSelectItem21Tex
+ 0x0807AC40, // gPauseSelectItem22Tex
+ 0x08084240, // gPauseSelectItem23Tex
+ 0x0808D840, // gPauseSelectItem24Tex
};
-void* D_8082B778[] = {
- 0x08068040, 0x08072040, 0x0807B640, 0x08084C40, 0x0808E240, 0x0D006200, 0x08072A40, 0x0807C040,
- 0x08085640, 0x0808EC40, 0x08069440, 0x08073440, 0x0807CA40, 0x08086040, 0x0808F640,
+TexturePtr sMapPageBgTextures[] = {
+ // Column 0
+ 0x08068040, // gPauseMap00Tex
+ 0x08072040, // gPauseMap01Tex
+ 0x0807B640, // gPauseMap02Tex
+ 0x08084C40, // gPauseMap03Tex
+ 0x0808E240, // gPauseMap04Tex
+ // Column 1
+ gPauseMap10ENGTex,
+ 0x08072A40, // gPauseMap11Tex
+ 0x0807C040, // gPauseMap12Tex
+ 0x08085640, // gPauseMap13Tex
+ 0x0808EC40, // gPauseMap14Tex
+ // Column 2
+ 0x08069440, // gPauseMap20Tex
+ 0x08073440, // gPauseMap21Tex
+ 0x0807CA40, // gPauseMap22Tex
+ 0x08086040, // gPauseMap23Tex
+ 0x0808F640, // gPauseMap24Tex
};
-void* D_8082B7B4[] = {
- 0x0D006C00, 0x08073E40, 0x0807D440, 0x08086A40, 0x08090040, 0x0D007600, 0x08074840, 0x0807DE40,
- 0x08087440, 0x08090A40, 0x0D008000, 0x08075240, 0x0807E840, 0x08087E40, 0x08091440,
+TexturePtr sQuestPageBgTextures[] = {
+ // Column 0
+ gPauseQuestStatus00ENGTex,
+ 0x08073E40, // gPauseQuestStatus01Tex
+ 0x0807D440, // gPauseQuestStatus02Tex
+ 0x08086A40, // gPauseQuestStatus03Tex
+ 0x08090040, // gPauseQuestStatus04Tex
+ // Column 1
+ gPauseQuestStatus10ENGTex,
+ 0x08074840, // gPauseQuestStatus11Tex
+ 0x0807DE40, // gPauseQuestStatus12Tex
+ 0x08087440, // gPauseQuestStatus13Tex
+ 0x08090A40, // gPauseQuestStatus14Tex
+ // Column 2
+ gPauseQuestStatus20ENGTex,
+ 0x08075240, // gPauseQuestStatus21Tex
+ 0x0807E840, // gPauseQuestStatus22Tex
+ 0x08087E40, // gPauseQuestStatus23Tex
+ 0x08091440, // gPauseQuestStatus24Tex
};
-s16 D_8082B7F0[] = {
- 0x0050, 0x0040, 0x0040, 0x0040, 0x0010, 0x0040, 0x0070, 0x0070, 0x0030, 0x0040, 0x0040, 0x0040,
- 0x0040, 0x0030, 0x0040, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0008, 0x0008, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+s16 gVtxPageMapWorldQuadsWidth[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 80, // mapPageVtx[60] clouds Clock Town 1
+ 64, // mapPageVtx[64] clouds Clock Town 2
+ 64, // mapPageVtx[68] clouds Woodfall 1
+ 64, // mapPageVtx[72] clouds Woodfall 2
+ 16, // mapPageVtx[76] clouds Woodfall 3
+ 64, // mapPageVtx[80] clouds Snowhead 1
+ 112, // mapPageVtx[84] clouds Snowhead 2
+ 112, // mapPageVtx[88] clouds Snowhead 3
+ 48, // mapPageVtx[92] clouds Romani Ranch
+ 64, // mapPageVtx[96] clouds Great Bay 1
+ 64, // mapPageVtx[100] clouds Great Bay 2
+ 64, // mapPageVtx[104] clouds Great Bay 3
+ 64, // mapPageVtx[108] clouds Great Bay 4
+ 48, // mapPageVtx[112] clouds Stone Tower 1
+ 64, // mapPageVtx[116] clouds Stone Tower 2
+ 8, // mapPageVtx[120] region Great Bay
+ 8, // mapPageVtx[124] region Zora Hall
+ 8, // mapPageVtx[128] region Romani Ranch
+ 8, // mapPageVtx[132] region Deku Palace
+ 8, // mapPageVtx[136] region Woodfall
+ 8, // mapPageVtx[140] region Clock Town
+ 8, // mapPageVtx[144] region Snowhead
+ 8, // mapPageVtx[148] region Ikana Graveyard
+ 8, // mapPageVtx[152] region Ikana Canyon
+ 8, // mapPageVtx[156] region Goron Village
+ 8, // mapPageVtx[160] region Stone Tower
+ 24, // mapPageVtx[164] owl warp Great Bay Coast
+ 24, // mapPageVtx[168] owl warp Zora Cape
+ 24, // mapPageVtx[172] owl warp Snowhead
+ 24, // mapPageVtx[176] owl warp Mountain Village
+ 24, // mapPageVtx[180] owl warp Clock Town
+ 24, // mapPageVtx[184] owl warp Milk Road
+ 24, // mapPageVtx[188] owl warp Woodfall
+ 24, // mapPageVtx[192] owl warp Southern Swamp
+ 24, // mapPageVtx[196] owl warp Ikana Canyon
+ 24, // mapPageVtx[200] owl warp Stone Tower
};
-s16 D_8082B838[] = {
- 0x0028, 0x001F, 0x0035, 0x0035, 0x0035, 0x0034, 0x0023, 0x0023, 0x0020, 0x0040, 0x0040, 0x0040,
- 0x0040, 0x0052, 0x003D, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0008, 0x0008, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+s16 gVtxPageMapWorldQuadsHeight[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 40, // mapPageVtx[60] clouds Clock Town 1
+ 31, // mapPageVtx[64] clouds Clock Town 2
+ 53, // mapPageVtx[68] clouds Woodfall 1
+ 53, // mapPageVtx[72] clouds Woodfall 2
+ 53, // mapPageVtx[76] clouds Woodfall 3
+ 52, // mapPageVtx[80] clouds Snowhead 1
+ 35, // mapPageVtx[84] clouds Snowhead 2
+ 35, // mapPageVtx[88] clouds Snowhead 3
+ 32, // mapPageVtx[92] clouds Romani Ranch
+ 64, // mapPageVtx[96] clouds Great Bay 1
+ 64, // mapPageVtx[100] clouds Great Bay 2
+ 64, // mapPageVtx[104] clouds Great Bay 3
+ 64, // mapPageVtx[108] clouds Great Bay 4
+ 82, // mapPageVtx[112] clouds Stone Tower 1
+ 61, // mapPageVtx[116] clouds Stone Tower 2
+ 8, // mapPageVtx[120] region Great Bay
+ 8, // mapPageVtx[124] region Zora Hall
+ 8, // mapPageVtx[128] region Romani Ranch
+ 8, // mapPageVtx[132] region Deku Palace
+ 8, // mapPageVtx[136] region Woodfall
+ 8, // mapPageVtx[140] region Clock Town
+ 8, // mapPageVtx[144] region Snowhead
+ 8, // mapPageVtx[148] region Ikana Graveyard
+ 8, // mapPageVtx[152] region Ikana Canyon
+ 8, // mapPageVtx[156] region Goron Village
+ 8, // mapPageVtx[160] region Stone Tower
+ 12, // mapPageVtx[164] owl warp Great Bay Coast
+ 12, // mapPageVtx[168] owl warp Zora Cape
+ 12, // mapPageVtx[172] owl warp Snowhead
+ 12, // mapPageVtx[176] owl warp Mountain Village
+ 12, // mapPageVtx[180] owl warp Clock Town
+ 12, // mapPageVtx[184] owl warp Milk Road
+ 12, // mapPageVtx[188] owl warp Woodfall
+ 12, // mapPageVtx[192] owl warp Southern Swamp
+ 12, // mapPageVtx[196] owl warp Ikana Canyon
+ 12, // mapPageVtx[200] owl warp Stone Tower
};
s16 sGameOverPrimR = 0;
@@ -107,144 +237,1543 @@ s16 sPauseCursorRightX = 0;
s16 D_8082B920 = 10;
-u8 D_8082B924[] = {
- 0x00, 0x14, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0A, 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
- 0x07, 0x07, 0x03, 0x0F, 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
+s16 sPauseZRCursorColorTimerInits[] = { 20, 4, 20, 10 };
+
+// Unused remnant of OoT
+u8 gAreaGsFlags[] = {
+ 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x07, 0x07, 0x03, 0x0F,
+ 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
};
// TODO: Also applies to owl warps
s16 sGameOverRectPosY = 66;
-s16 D_8082B948[][3] = {
- { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x00FF }, { 0x00FF, 0x00FF, 0x0000 },
- { 0x00FF, 0x00FF, 0x0000 }, { 0x0064, 0x0096, 0x00FF }, { 0x0064, 0x00FF, 0x00FF },
+void Kaleido_LoadMapNameStatic(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
+}
+
+void Kaleido_LoadMapNameStaticLarge(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
+}
+
+void Kaleido_LoadItemNameStatic(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
+}
+
+void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->cursorSpecialPos = cursorSpecialPos;
+ pauseCtx->pageSwitchInputTimer = 0;
+
+ play_sound(NA_SE_SY_DECIDE);
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ pauseCtx->nameDisplayTimer = 0;
+ pauseCtx->cursorSpecialPos = 0;
+
+ play_sound(NA_SE_SY_CURSOR);
+
+ pauseCtx->cursorShrinkRate = 4.0f;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+void KaleidoScope_DrawTexQuadRGBA32(GraphicsContext* gfxCtx, TexturePtr texture, u16 width, u16 height, u16 point) {
+ OPEN_DISPS(gfxCtx);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+#define SWITCH_PAGE_LEFT 0
+#define SWITCH_PAGE_RIGHT 2
+
+void KaleidoScope_SwitchPage(PauseContext* pauseCtx, u8 direction) {
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->mainState = PAUSE_MAIN_STATE_SWITCHING_PAGE;
+ pauseCtx->switchPageTimer = 0;
+
+ if (direction == SWITCH_PAGE_LEFT) {
+ pauseCtx->nextPageMode = (pauseCtx->pageIndex * 2) + 1;
+ play_sound(NA_SE_SY_WIN_SCROLL_LEFT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
+ } else { // SWITCH_PAGE_RIGHT
+ pauseCtx->nextPageMode = pauseCtx->pageIndex * 2;
+ play_sound(NA_SE_SY_WIN_SCROLL_RIGHT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+/**
+ * Process inputs to decide whether to switch pages
+ */
+void KaleidoScope_HandlePageToggles(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+
+ //! FAKE
+ if (1) {}
+
+ if ((pauseCtx->debugEditor != DEBUG_EDITOR_NONE) || pauseCtx->itemDescriptionOn) {
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT) || CHECK_BTN_ALL(input->press.button, BTN_R)) {
+ // Switch the page to the right regardless of where the cursor is
+ if (interfaceCtx->unk_212 == 6) {
+ func_8011552C(play, 0x15);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT) || CHECK_BTN_ALL(input->press.button, BTN_Z)) {
+ // Switch the page to the left regardless of where the cursor is
+ if (interfaceCtx->unk_212 == 6) {
+ func_8011552C(play, 0x15);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ return;
+ }
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ if (pauseCtx->stickAdjX < -30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the left after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ }
+ } else {
+ // stickAdjX is no longer held, so that the next input to the left will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
+ if (pauseCtx->stickAdjX > 30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the right after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ }
+ } else {
+ // stickAdjY is no longer held, so that the next input to the right will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ }
+}
+
+// Draw 15 (PAGE_BG_QUADS) quads with IA8 80x32 textures
+Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, TexturePtr* textures) {
+ s32 i;
+ s32 j;
+
+ gSPVertex(gfx++, vertices, 8 * 4, 0);
+
+ i = 0;
+ j = 0;
+ // Draw first 8/15 background textures
+ while (j < 32) {
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, textures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 80, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(gfx++, j, j + 2, j + 3, j + 1, 0);
+
+ j += 4;
+ i++;
+ }
+
+ gSPVertex(gfx++, vertices + (8 * 4), 7 * 4, 0);
+
+ j = 0;
+ // Draw last 7/15 background textures
+ while (j < 28) {
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, textures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 80, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(gfx++, j, j + 2, j + 3, j + 1, 0);
+
+ j += 4;
+ i++;
+ }
+
+ return gfx;
+}
+
+s16 sCursorPrimColorTarget[][3] = {
+ { 255, 255, 255 }, { 255, 255, 255 }, { 255, 255, 0 }, { 255, 255, 0 }, { 100, 150, 255 }, { 100, 255, 255 },
};
-s16 D_8082B96C[][3] = {
- { 0x0000, 0x0000, 0x0000 }, { 0x00AA, 0x00AA, 0x00AA }, { 0x0000, 0x0000, 0x0000 },
- { 0x00FF, 0x00A0, 0x0000 }, { 0x0000, 0x0000, 0x0064 }, { 0x0000, 0x0096, 0x00FF },
+s16 sCursorEnvColorTarget[][3] = {
+ { 0, 0, 0 }, { 170, 170, 170 }, { 0, 0, 0 }, { 255, 160, 0 }, { 0, 0, 100 }, { 0, 150, 255 },
};
-s16 D_8082B990 = 10;
-s16 D_8082B994 = 0;
+void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
+ static s16 sCursorColorTimer = 10;
+ static s16 sCursorColorTargetIndex = 0;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
-s32 D_8082B998[] = {
- 0x0D003300,
- 0x0D002700,
- 0x0D002B00,
- 0x0D002F00,
+ OPEN_DISPS(gfxCtx);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ if (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) {
+
+ stepR =
+ ABS_ALT(sCursorPrimR - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
+ sCursorColorTimer;
+ stepG =
+ ABS_ALT(sCursorPrimG - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
+ sCursorColorTimer;
+ stepB =
+ ABS_ALT(sCursorPrimB - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
+ sCursorColorTimer;
+
+ if (sCursorPrimR >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
+ sCursorPrimR -= stepR;
+ } else {
+ sCursorPrimR += stepR;
+ }
+
+ if (sCursorPrimG >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
+ sCursorPrimG -= stepG;
+ } else {
+ sCursorPrimG += stepG;
+ }
+
+ if (sCursorPrimB >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
+ sCursorPrimB -= stepB;
+ } else {
+ sCursorPrimB += stepB;
+ }
+
+ stepR =
+ ABS_ALT(sCursorEnvR - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
+ sCursorColorTimer;
+ stepG =
+ ABS_ALT(sCursorEnvG - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
+ sCursorColorTimer;
+ stepB =
+ ABS_ALT(sCursorEnvB - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
+ sCursorColorTimer;
+
+ if (sCursorEnvR >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
+ sCursorEnvR -= stepR;
+ } else {
+ sCursorEnvR += stepR;
+ }
+
+ if (sCursorEnvG >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
+ sCursorEnvG -= stepG;
+ } else {
+ sCursorEnvG += stepG;
+ }
+
+ if (sCursorEnvB >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
+ sCursorEnvB -= stepB;
+ } else {
+ sCursorEnvB += stepB;
+ }
+
+ sCursorColorTimer--;
+ if (sCursorColorTimer == 0) {
+ sCursorPrimR = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
+ sCursorPrimG = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
+ sCursorPrimB = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
+ sCursorEnvR = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
+ sCursorEnvG = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
+ sCursorEnvB = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
+ sCursorColorTargetIndex ^= 1;
+ sCursorColorTimer = 10;
+ }
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_ITEM) && (pauseCtx->pageIndex != PAUSE_QUEST)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(0.0f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
+
+ KaleidoScope_DrawItemSelect(play);
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_MAP) && (pauseCtx->pageIndex != PAUSE_MASK)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ if (sInDungeonScene) {
+ KaleidoScope_DrawDungeonMap(play);
+ Gfx_SetupDL42_Opa(gfxCtx);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ func_801091F0(play);
+ } else {
+ KaleidoScope_DrawWorldMap(play);
+ }
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_QUEST) && (pauseCtx->pageIndex != PAUSE_ITEM)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-3.14f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
+
+ KaleidoScope_DrawQuestStatus(play);
+ }
+
+ if ((pauseCtx->pageIndex != PAUSE_MASK) && (pauseCtx->pageIndex != PAUSE_MAP)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0,
+ TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
+
+ KaleidoScope_DrawMaskSelect(play);
+ }
+
+ switch (pauseCtx->pageIndex) {
+ case PAUSE_ITEM:
+ if (pauseCtx->mainState <= PAUSE_MAIN_STATE_EQUIP_MASK) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0,
+ PRIMITIVE, 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(0.0f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
+
+ KaleidoScope_DrawItemSelect(play);
+ }
+ break;
+
+ case PAUSE_MAP:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ if (sInDungeonScene) {
+ KaleidoScope_DrawDungeonMap(play);
+ Gfx_SetupDL42_Opa(gfxCtx);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ func_801091F0(play);
+ } else {
+ Matrix_RotateYF(R_PAUSE_WORLD_MAP_YAW / 1000.0f, MTXMODE_NEW);
+
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) &&
+ ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ Matrix_Translate(0.0f, (R_PAUSE_WORLD_MAP_Y_OFFSET - 8000) / 100.0f,
+ R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY);
+ } else {
+ Matrix_Translate(0.0f, R_PAUSE_WORLD_MAP_Y_OFFSET / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f,
+ MTXMODE_APPLY);
+ }
+
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ KaleidoScope_DrawWorldMap(play);
+ }
+ break;
+
+ case PAUSE_QUEST:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
+
+ Matrix_RotateYF(-3.14f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
+
+ KaleidoScope_DrawQuestStatus(play);
+ break;
+
+ case PAUSE_MASK:
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE,
+ 0, TEXEL0, 0, SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP =
+ KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
+
+ KaleidoScope_DrawMaskSelect(play);
+ break;
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+TexturePtr D_8082B998[] = {
+ gPauseToMasksENGTex,
+ gPauseToSelectItemENGTex,
+ gPauseToMapENGTex,
+ gPauseToQuestStatusENGTex,
+};
+TexturePtr D_8082B9A8[] = {
+ gPauseToMapENGTex,
+ gPauseToQuestStatusENGTex,
+ gPauseToMasksENGTex,
+ gPauseToSelectItemENGTex,
+};
+void KaleidoScope_DrawInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
+
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
+
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gZButtonIconDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if (pauseCtx->itemDescriptionOn ||
+ ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) &&
+ (pauseCtx->cursorSpecialPos == 0))) {
+ if (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+ } else if ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK)) {
+ pauseCtx->infoPanelVtx[20].v.ob[1] = pauseCtx->infoPanelVtx[21].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[22].v.ob[1] = pauseCtx->infoPanelVtx[23].v.ob[1] =
+ pauseCtx->infoPanelVtx[20].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 16 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0);
+
+ if (pauseCtx->state == PAUSE_STATE_SAVEPROMPT) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -33;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x10;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x30;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 48 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ //! @bug: Incorrect dimensions. Should be 64x16
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToDecideENGTex, G_IM_FMT_IA, 48, 16, 4);
+
+ } else if (pauseCtx->cursorSpecialPos != 0) {
+ if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 200, 0, 255);
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ } else {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ }
+ }
+ } else if ((!pauseCtx->pageIndex || (pauseCtx->pageIndex == PAUSE_MASK)) &&
+ (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -49;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 48;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 47;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 64;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 48 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 64 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gCButtonIconsDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToEquipENGTex, G_IM_FMT_IA, 64, 16, 4);
+ } else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) {
+ // No code in this case
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) {
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ // The cursor is on the bombers notebook
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -58;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x14;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x60;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToViewNotebookENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ // The cursor is on a learned song
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -55;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 20;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 96;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToPlayMelodyENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+u8 sUnpausedButtonStatus[5];
+f32 sCursorCirclesX[4];
+f32 sCursorCirclesY[4];
+
+void KaleidoScope_UpdateNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 namedItem;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ namedItem = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, namedItem);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, namedItem);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM) || (pauseCtx->pageIndex == PAUSE_MASK)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
+
+void KaleidoScope_DrawOwlWarpMapPage(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0,
+ SHADE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
+
+ Matrix_RotateYF(-1.57f, MTXMODE_NEW);
+ Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
+
+ Matrix_RotateYF(R_PAUSE_WORLD_MAP_YAW / 1000.0f, MTXMODE_NEW);
+
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ Matrix_Translate(0.0f, (R_PAUSE_WORLD_MAP_Y_OFFSET - 8000) / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f,
+ MTXMODE_APPLY);
+ } else {
+ Matrix_Translate(0.0f, R_PAUSE_WORLD_MAP_Y_OFFSET / 100.0f, R_PAUSE_WORLD_MAP_DEPTH / 100.0f, MTXMODE_APPLY);
+ }
+
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ KaleidoScope_DrawWorldMap(play);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_DrawOwlWarpInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
+
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
+
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if ((pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 texIndex;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ texIndex = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, texIndex);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, texIndex);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
+
+void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ //! FAKE
+ if (1) {
+ pauseCtx->eye.x += sPageSwitchEyeDx[pauseCtx->nextPageMode] * 2.0f;
+ pauseCtx->eye.z += sPageSwitchEyeDz[pauseCtx->nextPageMode] * 2.0f;
+
+ if (pauseCtx->switchPageTimer < 32) {
+ sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
+ } else {
+ sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+ }
+
+ pauseCtx->switchPageTimer += 8;
+
+ if (pauseCtx->switchPageTimer == 64) {
+ pauseCtx->switchPageTimer = 0;
+ pauseCtx->pageIndex = sPageSwitchNextPageIndex[pauseCtx->nextPageMode];
+ pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
+
+ KaleidoScope_HandlePageToggles(play, input);
+ }
+ }
+}
+
+void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ) {
+ Vec3f eye;
+ Vec3f at;
+ Vec3f up;
+
+ eye.x = eyeX;
+ eye.y = eyeY;
+ eye.z = eyeZ;
+ at.x = at.y = at.z = 0.0f;
+ up.x = up.z = 0.0f;
+ up.y = 1.0f;
+
+ View_LookAt(&pauseCtx->view, &eye, &at, &up);
+ View_Apply(&pauseCtx->view,
+ VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE);
+}
+
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsX[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsX[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsX[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ -21, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ -104, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ -76, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ -48, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ -104, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ -40 // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsX[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageMapWorldQuadsX[VTX_PAGE_MAP_WORLD_QUADS] = {
+ -41, // mapPageVtx[60] world map clouds Clock Town 1
+ 9, // mapPageVtx[64] world map clouds Clock Town 2
+ 43, // mapPageVtx[68] world map clouds Woodfall 1
+ -21, // mapPageVtx[72] world map clouds Woodfall 2
+ -37, // mapPageVtx[76] world map clouds Woodfall 3
+ 43, // mapPageVtx[80] world map clouds Snowhead 1
+ -69, // mapPageVtx[84] world map clouds Snowhead 2
+ -69, // mapPageVtx[88] world map clouds Snowhead 3
+ -32, // mapPageVtx[92] world map clouds Romani Ranch
+ -109, // mapPageVtx[96] world map clouds Great Bay 1
+ -45, // mapPageVtx[100] world map clouds Great Bay 2
+ -109, // mapPageVtx[104] world map clouds Great Bay 3
+ -45, // mapPageVtx[108] world map clouds Great Bay 4
+ 59, // mapPageVtx[112] world map clouds Stone Tower 1
+ -5, // mapPageVtx[116] world map clouds Stone Tower 2
+ -70, // mapPageVtx[120] world map region Great Bay
+ -52, // mapPageVtx[124] world map region Zora Hall
+ -11, // mapPageVtx[128] world map region Romani Ranch
+ -2, // mapPageVtx[132] world map region Deku Palace
+ 8, // mapPageVtx[136] world map region Woodfall
+ 2, // mapPageVtx[140] world map region Clock Town
+ 1, // mapPageVtx[144] world map region Snowhead
+ 43, // mapPageVtx[148] world map region Ikana Graveyard
+ 52, // mapPageVtx[152] world map region Ikana Canyon
+ 54, // mapPageVtx[156] world map region Goron Village
+ 62, // mapPageVtx[160] world map region Stone Tower
+ -80, // mapPageVtx[164] world map owl warp Great Bay Coast
+ -64, // mapPageVtx[168] world map owl warp Zora Cape
+ -9, // mapPageVtx[172] world map owl warp Snowhead
+ -3, // mapPageVtx[176] world map owl warp Mountain Village
+ -7, // mapPageVtx[180] world map owl warp Clock Town
+ -16, // mapPageVtx[184] world map owl warp Milk Road
+ -1, // mapPageVtx[188] world map owl warp Woodfall
+ 23, // mapPageVtx[192] world map owl warp Southern Swamp
+ 44, // mapPageVtx[196] world map owl warp Ikana Canyon
+ 54, // mapPageVtx[200] world map owl warp Stone Tower
+};
+s16 sVtxPagePromptQuadsX[VTX_PAGE_SAVE_QUADS] = {
+ -76, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ -58, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -58, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 10, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082B9A8[] = {
- 0x0D002B00,
- 0x0D002F00,
- 0x0D003300,
- 0x0D002700,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsWidth[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsWidth[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsWidth[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ 128, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ 24, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ 24, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ 24, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ 32, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsWidth[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPagePromptQuadsWidth[VTX_PAGE_SAVE_QUADS] = {
+ 152, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ 48, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 48, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s16 D_8082B9B8[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsY[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsY[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+
+s16 sVtxPageMapDungeonQuadsY[VTX_PAGE_MAP_DUNGEON_QUADS] = {
+ 54, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ -42, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ -42, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ -42, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ -24, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 50, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsY[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPageMapWorldQuadsY[VTX_PAGE_MAP_WORLD_QUADS] = {
+ 11, // mapPageVtx[60] world map clouds Clock Town 1
+ 22, // mapPageVtx[64] world map clouds Clock Town 2
+ -16, // mapPageVtx[68] world map clouds Woodfall 1
+ -16, // mapPageVtx[72] world map clouds Woodfall 2
+ -16, // mapPageVtx[76] world map clouds Woodfall 3
+ 59, // mapPageVtx[80] world map clouds Snowhead 1
+ 24, // mapPageVtx[84] world map clouds Snowhead 2
+ 59, // mapPageVtx[88] world map clouds Snowhead 3
+ -11, // mapPageVtx[92] world map clouds Romani Ranch
+ -5, // mapPageVtx[96] world map clouds Great Bay 1
+ -5, // mapPageVtx[100] world map clouds Great Bay 2
+ 59, // mapPageVtx[104] world map clouds Great Bay 3
+ 59, // mapPageVtx[108] world map clouds Great Bay 4
+ 39, // mapPageVtx[112] world map clouds Stone Tower 1
+ 31, // mapPageVtx[116] world map clouds Stone Tower 2
+ -10, // mapPageVtx[120] world map region Great Bay
+ -36, // mapPageVtx[124] world map region Zora Hall
+ -19, // mapPageVtx[128] world map region Romani Ranch
+ -53, // mapPageVtx[132] world map region Deku Palace
+ -27, // mapPageVtx[136] world map region Woodfall
+ -2, // mapPageVtx[140] world map region Clock Town
+ 41, // mapPageVtx[144] world map region Snowhead
+ 11, // mapPageVtx[148] world map region Ikana Graveyard
+ -3, // mapPageVtx[152] world map region Ikana Canyon
+ 45, // mapPageVtx[156] world map region Goron Village
+ 18, // mapPageVtx[160] world map region Stone Tower
+ -8, // mapPageVtx[164] world map owl warp Great Bay Coast
+ -38, // mapPageVtx[168] world map owl warp Zora Cape
+ 39, // mapPageVtx[172] world map owl warp Snowhead
+ 26, // mapPageVtx[176] world map owl warp Mountain Village
+ 1, // mapPageVtx[180] world map owl warp Clock Town
+ -7, // mapPageVtx[184] world map owl warp Milk Road
+ -28, // mapPageVtx[188] world map owl warp Woodfall
+ -27, // mapPageVtx[192] world map owl warp Southern Swamp
+ -1, // mapPageVtx[196] world map owl warp Ikana Canyon
+ 24, // mapPageVtx[200] world map owl warp Stone Tower
+};
+s16 sVtxPagePromptQuadsY[VTX_PAGE_SAVE_QUADS] = {
+ 36, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 10, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 10, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -6, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ -6, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s16 D_8082B9C8 = 20;
-
-s32 D_8082B9CC = 0;
-
-s16 D_8082B9D0[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+// CLAMP_MIN(*, 1) because C arrays can't have 0 length
+s16 sVtxPageMaskQuadsHeight[CLAMP_MIN(VTX_PAGE_MASK_QUADS, 1)] = { 0 };
+s16 sVtxPageItemQuadsHeight[CLAMP_MIN(VTX_PAGE_ITEM_QUADS, 1)] = { 0 };
+s16 sVtxPageMapDungeonQuadsHeight[] = {
+ 16, // mapPageVtx[60] QUAD_MAP_DUNGEON_TITLE
+ 24, // mapPageVtx[64] QUAD_MAP_DUNGEON_BOSS_KEY
+ 24, // mapPageVtx[68] QUAD_MAP_DUNGEON_COMPASS
+ 24, // mapPageVtx[72] QUAD_MAP_DUNGEON_MAP
+ 24, // mapPageVtx[76] QUAD_MAP_DUNGEON_STRAY_FAIRY_GLOWING_CIRCLE
+ 24, // mapPageVtx[80] QUAD_MAP_DUNGEON_UNUSED
+};
+s16 sVtxPageQuestQuadsHeight[CLAMP_MIN(VTX_PAGE_QUEST_QUADS, 1)] = { 0 };
+s16 sVtxPagePromptQuadsHeight[VTX_PAGE_SAVE_QUADS] = {
+ 16, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ 48, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ 48, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ 16, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ 16, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s16 D_8082B9E0 = 20;
-
-s32 D_8082B9E4 = 0;
-
-s32 D_8082B9E8 = 0;
-
-s32 D_8082B9EC = 0;
-
-s16 D_8082B9F0[] = {
- 0xFFEB, 0xFF98, 0xFFB4, 0xFFD0, 0xFF98, 0xFFD8,
+s16* sVtxPageQuadsX[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsX, // VTX_PAGE_MASK
+ sVtxPageItemQuadsX, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsX, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsX, // VTX_PAGE_QUEST
+ sVtxPageMapWorldQuadsX, // VTX_PAGE_MAP_WORLD
+ sVtxPagePromptQuadsX, // VTX_PAGE_PROMPT
};
-s32 D_8082B9FC = 0;
-
-s16 D_8082BA00[] = {
- 0xFFD7, 0x0009, 0x002B, 0xFFEB, 0xFFDB, 0x002B, 0xFFBB, 0xFFBB, 0xFFE0, 0xFF93, 0xFFD3, 0xFF93,
- 0xFFD3, 0x003B, 0xFFFB, 0xFFBA, 0xFFCC, 0xFFF5, 0xFFFE, 0x0008, 0x0002, 0x0001, 0x002B, 0x0034,
- 0x0036, 0x003E, 0xFFB0, 0xFFC0, 0xFFF7, 0xFFFD, 0xFFF9, 0xFFF0, 0xFFFF, 0x0017, 0x002C, 0x0036,
+s16* sVtxPageQuadsWidth[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsWidth, // VTX_PAGE_MASK
+ sVtxPageItemQuadsWidth, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsWidth, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsWidth, // VTX_PAGE_QUEST
+ gVtxPageMapWorldQuadsWidth, // VTX_PAGE_MAP_WORLD
+ sVtxPagePromptQuadsWidth, // VTX_PAGE_PROMPT
};
-s16 D_8082BA48[] = {
- 0xFFB4, 0xFFC6, 0x000A, 0xFFC6, 0x000A, 0x0000,
+s16* sVtxPageQuadsY[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsY, // VTX_PAGE_MASK
+ sVtxPageItemQuadsY, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsY, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsY, // VTX_PAGE_QUEST
+ sVtxPageMapWorldQuadsY, // VTX_PAGE_MAP_WORLD
+ sVtxPagePromptQuadsY, // VTX_PAGE_PROMPT
};
-s32 D_8082BA54 = 0;
-
-s32 D_8082BA58 = 0;
-
-s16 D_8082BA5C[] = {
- 0x0080, 0x0018, 0x0018, 0x0018, 0x0020, 0x0018,
+s16* sVtxPageQuadsHeight[VTX_PAGE_MAX] = {
+ sVtxPageMaskQuadsHeight, // VTX_PAGE_MASK
+ sVtxPageItemQuadsHeight, // VTX_PAGE_ITEM
+ sVtxPageMapDungeonQuadsHeight, // VTX_PAGE_MAP_DUNGEON
+ sVtxPageQuestQuadsHeight, // VTX_PAGE_QUEST
+ gVtxPageMapWorldQuadsHeight, // VTX_PAGE_MAP_WORLD
+ sVtxPagePromptQuadsHeight, // VTX_PAGE_PROMPT
};
-s32 D_8082BA68 = 0;
-
-s16 D_8082BA6C[] = {
- 0x0098, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000,
+s16 sVtxPageGameOverSaveQuadsY[VTX_PAGE_SAVE_QUADS] = {
+ 14, // promptPageVtx[60] QUAD_PROMPT_MESSAGE
+ -2, // promptPageVtx[64] QUAD_PROMPT_CURSOR_LEFT
+ -2, // promptPageVtx[68] QUAD_PROMPT_CURSOR_RIGHT
+ -18, // promptPageVtx[72] QUAD_PROMPT_CHOICE_YES
+ -18, // promptPageVtx[76] QUAD_PROMPT_CHOICE_NO
};
-s32 D_8082BA78 = 0;
+s16 KaleidoScope_SetPageVertices(PlayState* play, Vtx* vtx, s16 vtxPage, s16 numQuads) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ GameOverContext* gameOverCtx = &play->gameOverCtx;
+ s16* quadsX;
+ s16* quadsWidth;
+ s16* quadsY;
+ s16* quadsHeight;
+ s16 pageBgQuadX;
+ s16 pageBgQuadY;
+ s16 i;
+ s16 j;
+ s16 k;
-s32 D_8082BA7C = 0;
+ // Vertices for KaleidoScope_DrawPageSections
-s16 D_8082BA80[] = {
- 0x0036, 0xFFD6, 0xFFD6, 0xFFD6, 0xFFE8, 0x0032,
-};
+ pageBgQuadX = 0 - (PAGE_BG_COLS * PAGE_BG_QUAD_WIDTH) / 2 - PAGE_BG_QUAD_WIDTH;
-s32 D_8082BA8C = 0;
+ // For each column
+ for (k = 0, i = 0; i < 3; i++) {
+ pageBgQuadX += PAGE_BG_QUAD_WIDTH;
-s16 D_8082BA90[] = {
- 0x000B, 0x0016, 0xFFF0, 0xFFF0, 0xFFF0, 0x003B, 0x0018, 0x003B, 0xFFF5, 0xFFFB, 0xFFFB, 0x003B,
- 0x003B, 0x0027, 0x001F, 0xFFF6, 0xFFDC, 0xFFED, 0xFFCB, 0xFFE5, 0xFFFE, 0x0029, 0x000B, 0xFFFD,
- 0x002D, 0x0012, 0xFFF8, 0xFFDA, 0x0027, 0x001A, 0x0001, 0xFFF9, 0xFFE4, 0xFFE5, 0xFFFF, 0x0018,
-};
+ // For each row
+ for (pageBgQuadY = (PAGE_BG_ROWS * PAGE_BG_QUAD_HEIGHT) / 2, j = 0; j < 5; j++, k += 4, pageBgQuadY -= 32) {
+ vtx[k + 0].v.ob[0] = vtx[k + 2].v.ob[0] = pageBgQuadX;
+ vtx[k + 1].v.ob[0] = vtx[k + 3].v.ob[0] = vtx[k + 0].v.ob[0] + PAGE_BG_QUAD_WIDTH;
-s16 D_8082BAD8[] = {
- 0x0024, 0x000A, 0x000A, 0xFFFA, 0xFFFA, 0x0000,
-};
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = pageBgQuadY + pauseCtx->offsetY;
+ vtx[k + 2].v.ob[1] = vtx[k + 3].v.ob[1] = vtx[k + 0].v.ob[1] - PAGE_BG_QUAD_HEIGHT;
-s32 D_8082BAE4 = 0;
+ vtx[k + 0].v.ob[2] = vtx[k + 1].v.ob[2] = vtx[k + 2].v.ob[2] = vtx[k + 3].v.ob[2] = 0;
-s32 D_8082BAE8 = 0;
+ vtx[k + 0].v.flag = vtx[k + 1].v.flag = vtx[k + 2].v.flag = vtx[k + 3].v.flag = 0;
-s16 D_8082BAEC[] = {
- 0x0010, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
-};
+ vtx[k + 0].v.tc[0] = vtx[k + 0].v.tc[1] = 0;
+ vtx[k + 1].v.tc[1] = vtx[k + 2].v.tc[0] = 0;
+ vtx[k + 1].v.tc[0] = vtx[k + 3].v.tc[0] = PAGE_BG_QUAD_TEX_WIDTH * (1 << 5);
+ vtx[k + 2].v.tc[1] = vtx[k + 3].v.tc[1] = PAGE_BG_QUAD_TEX_HEIGHT * (1 << 5);
-s32 D_8082BAF8 = 0;
+ vtx[k + 0].v.cn[0] = vtx[k + 2].v.cn[0] = vtx[k + 0].v.cn[1] = vtx[k + 2].v.cn[1] = vtx[k + 0].v.cn[2] =
+ vtx[k + 2].v.cn[2] = 0;
-s16 D_8082BAFC[] = {
- 0x0010, 0x0030, 0x0030, 0x0010, 0x0010, 0x0000,
-};
+ vtx[k + 1].v.cn[0] = vtx[k + 3].v.cn[0] = vtx[k + 1].v.cn[1] = vtx[k + 3].v.cn[1] = vtx[k + 1].v.cn[2] =
+ vtx[k + 3].v.cn[2] = 0;
-void* D_8082BB08[] = {
- &D_8082B9E8, &D_8082B9EC, &D_8082B9F0, &D_8082B9FC, &D_8082BA00, &D_8082BA48,
-};
+ vtx[k + 0].v.cn[3] = vtx[k + 2].v.cn[3] = vtx[k + 1].v.cn[3] = vtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
-void* D_8082BB20[] = {
- &D_8082BA54, &D_8082BA58, &D_8082BA5C, &D_8082BA68, &D_8082B7F0, &D_8082BA6C,
-};
+ if (numQuads != 0) {
+ quadsX = sVtxPageQuadsX[vtxPage];
+ quadsWidth = sVtxPageQuadsWidth[vtxPage];
+ quadsY = sVtxPageQuadsY[vtxPage];
+ quadsHeight = sVtxPageQuadsHeight[vtxPage];
-void* D_8082BB38[] = {
- &D_8082BA78, &D_8082BA7C, &D_8082BA80, &D_8082BA8C, &D_8082BA90, &D_8082BAD8,
-};
+ for (i = 0; i < numQuads; i++, k += 4) {
+ vtx[k + 2].v.ob[0] = vtx[k + 0].v.ob[0] = quadsX[i];
-void* D_8082BB50[] = {
- &D_8082BAE4, &D_8082BAE8, &D_8082BAEC, &D_8082BAF8, &D_8082B838, &D_8082BAFC,
-};
+ vtx[k + 1].v.ob[0] = vtx[k + 3].v.ob[0] = vtx[k + 0].v.ob[0] + quadsWidth[i];
-s16 D_8082BB68[] = {
- 0x000E, 0xFFFE, 0xFFFE, 0xFFEE, 0xFFEE, 0x0000,
-};
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = quadsY[i] + pauseCtx->offsetY;
+ } else if (gameOverCtx->state == GAMEOVER_INACTIVE) {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = quadsY[i] + pauseCtx->offsetY;
+ } else {
+ vtx[k + 0].v.ob[1] = vtx[k + 1].v.ob[1] = sVtxPageGameOverSaveQuadsY[i] + pauseCtx->offsetY;
+ }
+
+ vtx[k + 2].v.ob[1] = vtx[k + 3].v.ob[1] = vtx[k + 0].v.ob[1] - quadsHeight[i];
+
+ vtx[k + 0].v.ob[2] = vtx[k + 1].v.ob[2] = vtx[k + 2].v.ob[2] = vtx[k + 3].v.ob[2] = 0;
+
+ vtx[k + 0].v.flag = vtx[k + 1].v.flag = vtx[k + 2].v.flag = vtx[k + 3].v.flag = 0;
+
+ vtx[k + 0].v.tc[0] = vtx[k + 0].v.tc[1] = vtx[k + 1].v.tc[1] = vtx[k + 2].v.tc[0] = 0;
+ vtx[k + 1].v.tc[0] = vtx[k + 3].v.tc[0] = quadsWidth[i] << 5;
+ vtx[k + 2].v.tc[1] = vtx[k + 3].v.tc[1] = quadsHeight[i] << 5;
+
+ vtx[k + 0].v.cn[0] = vtx[k + 2].v.cn[0] = vtx[k + 0].v.cn[1] = vtx[k + 2].v.cn[1] = vtx[k + 0].v.cn[2] =
+ vtx[k + 2].v.cn[2] = 255;
+
+ vtx[k + 1].v.cn[0] = vtx[k + 3].v.cn[0] = vtx[k + 1].v.cn[1] = vtx[k + 3].v.cn[1] = vtx[k + 1].v.cn[2] =
+ vtx[k + 3].v.cn[2] = 255;
+
+ vtx[k + 0].v.cn[3] = vtx[k + 2].v.cn[3] = vtx[k + 1].v.cn[3] = vtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
+ return k;
+}
s16 sQuestVtxRectLeft[] = {
45, // QUEST_REMAINS_ODOLWA
@@ -413,111 +1942,829 @@ s16 sQuestVtxHeights[] = {
16, // ocarina input button index 6
16, // ocarina input button index 7
};
-f32 D_8082BCB4[] = {
- -62.0f, -36.0f, -10.0f, 16.0f, 42.0f, 68.0f,
-};
-f32 D_8082BCCC[] = {
- 31.0f,
- 5.0f,
- -21.0f,
- -47.0f,
-};
+void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+ s16 j;
+ s16 k;
+ s16 vtx_x;
+ s16 vtx_y;
-f32 D_8082BCDC[] = {
- -49.0f, -35.0f, -3.0f, 4.0f, 12.0f, 8.0f, 7.0f, 40.0f, 47.0f, 49.0f, 55.0f,
-};
+ pauseCtx->offsetY = 0;
-f32 D_8082BD08[] = {
- -15.0f, -36.0f, -23.0f, -49.0f, -29.0f, -8.0f, 25.0f, 2.0f, -9.0f, 28.0f, 7.0f,
-};
+ if ((pauseCtx->state == PAUSE_STATE_OPENING_3) || (pauseCtx->state == PAUSE_STATE_OWLWARP_3) ||
+ (pauseCtx->state >= PAUSE_STATE_OWLWARP_6) ||
+ ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) && ((pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_3) ||
+ (pauseCtx->savePromptState == PAUSE_SAVEPROMPT_STATE_7)))) {
+ pauseCtx->offsetY = 80;
+ }
-f32 D_8082BD34[] = {
- -50.0f, -38.0f, 6.0f, 11.0f, 8.0f, 0.0f, 12.0f, 31.0f, 48.0f, 56.0f,
-};
+ if (pauseCtx->pageIndex != PAUSE_QUEST) {
+ pauseCtx->itemPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_ITEM_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->itemPageVtx, VTX_PAGE_ITEM, VTX_PAGE_ITEM_QUADS);
-f32 D_8082BD5C[] = {
- -14.0f, -39.0f, 23.0f, 11.0f, -8.0f, -15.0f, -31.0f, -30.0f, -10.0f, 11.0f,
-};
+ pauseCtx->itemVtx = GRAPH_ALLOC(gfxCtx, (QUAD_ITEM_MAX * 4) * sizeof(Vtx));
-f32 D_8082BD84[] = {
- -72.0f, -47.0f, -26.0f, -50.0f, -48.0f, -48.0f, -48.0f, -48.0f, -48.0f,
-};
+ // QUAD_ITEM_GRID_FIRST..QUAD_ITEM_GRID_LAST
-f32 D_8082BDA8[] = {
- -47.0f, -47.0f, -47.0f, -30.0f, 33.0f, 22.0f, 11.0f, -2.0f, -13.0f,
-};
+ // Loop over grid rows
+ for (k = 0, i = 0, vtx_y = (ITEM_GRID_ROWS * ITEM_GRID_CELL_HEIGHT) / 2 - 6; k < ITEM_GRID_ROWS;
+ k++, vtx_y -= ITEM_GRID_CELL_HEIGHT) {
+ // Loop over grid columns
+ for (vtx_x = 0 - (ITEM_GRID_COLS * ITEM_GRID_CELL_WIDTH) / 2, j = 0; j < ITEM_GRID_COLS;
+ j++, i += 4, vtx_x += ITEM_GRID_CELL_WIDTH) {
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0] = vtx_x + ITEM_GRID_QUAD_MARGIN;
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_QUAD_WIDTH;
-f32 D_8082BDCC[] = {
- 52.0f, 80.0f, 24.0f, 52.0f, 81.0f, 24.0f, -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f,
- -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f, -68.0f, 22.0f, 83.0f, -67.0f, -21.0f,
-};
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] =
+ vtx_y + pauseCtx->offsetY - ITEM_GRID_QUAD_MARGIN;
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_QUAD_WIDTH;
-f32 D_8082BE28[] = {
- 33.0f, 18.0f, 18.0f, 0.0f, -23.0f, -23.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f,
- -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, 27.0f, -53.0f, -53.0f, 14.0f, 26.0f,
-};
+ pauseCtx->itemVtx[i + 0].v.ob[2] = pauseCtx->itemVtx[i + 1].v.ob[2] = pauseCtx->itemVtx[i + 2].v.ob[2] =
+ pauseCtx->itemVtx[i + 3].v.ob[2] = 0;
-s16 D_8082BE84 = 0;
+ pauseCtx->itemVtx[i + 0].v.flag = pauseCtx->itemVtx[i + 1].v.flag = pauseCtx->itemVtx[i + 2].v.flag =
+ pauseCtx->itemVtx[i + 3].v.flag = 0;
-void func_80821900(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
+ pauseCtx->itemVtx[i + 0].v.tc[0] = pauseCtx->itemVtx[i + 0].v.tc[1] = pauseCtx->itemVtx[i + 1].v.tc[1] =
+ pauseCtx->itemVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->itemVtx[i + 1].v.tc[0] = pauseCtx->itemVtx[i + 2].v.tc[1] = pauseCtx->itemVtx[i + 3].v.tc[0] =
+ pauseCtx->itemVtx[i + 3].v.tc[1] = ITEM_GRID_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->itemVtx[i + 0].v.cn[0] = pauseCtx->itemVtx[i + 1].v.cn[0] = pauseCtx->itemVtx[i + 2].v.cn[0] =
+ pauseCtx->itemVtx[i + 3].v.cn[0] = pauseCtx->itemVtx[i + 0].v.cn[1] =
+ pauseCtx->itemVtx[i + 1].v.cn[1] = pauseCtx->itemVtx[i + 2].v.cn[1] =
+ pauseCtx->itemVtx[i + 3].v.cn[1] = pauseCtx->itemVtx[i + 0].v.cn[2] =
+ pauseCtx->itemVtx[i + 1].v.cn[2] = pauseCtx->itemVtx[i + 2].v.cn[2] =
+ pauseCtx->itemVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->itemVtx[i + 0].v.cn[3] = pauseCtx->itemVtx[i + 1].v.cn[3] = pauseCtx->itemVtx[i + 2].v.cn[3] =
+ pauseCtx->itemVtx[i + 3].v.cn[3] = 255;
+ }
+ }
+
+ // QUAD_ITEM_GRID_SELECTED_C_LEFT, QUAD_ITEM_GRID_SELECTED_C_DOWN, QUAD_ITEM_GRID_SELECTED_C_RIGHT
+
+ for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++, i += 4) {
+ if (GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) {
+ k = GET_CUR_FORM_BTN_SLOT(j) * 4;
+
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0] =
+ pauseCtx->itemVtx[k].v.ob[0] + ITEM_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] =
+ pauseCtx->itemVtx[k].v.ob[1] - ITEM_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[2] = pauseCtx->itemVtx[i + 1].v.ob[2] = pauseCtx->itemVtx[i + 2].v.ob[2] =
+ pauseCtx->itemVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->itemVtx[i + 0].v.flag = pauseCtx->itemVtx[i + 1].v.flag = pauseCtx->itemVtx[i + 2].v.flag =
+ pauseCtx->itemVtx[i + 3].v.flag = 0;
+
+ pauseCtx->itemVtx[i + 0].v.tc[0] = pauseCtx->itemVtx[i + 0].v.tc[1] = pauseCtx->itemVtx[i + 1].v.tc[1] =
+ pauseCtx->itemVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->itemVtx[i + 1].v.tc[0] = pauseCtx->itemVtx[i + 2].v.tc[1] = pauseCtx->itemVtx[i + 3].v.tc[0] =
+ pauseCtx->itemVtx[i + 3].v.tc[1] = ITEM_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->itemVtx[i + 0].v.cn[0] = pauseCtx->itemVtx[i + 1].v.cn[0] = pauseCtx->itemVtx[i + 2].v.cn[0] =
+ pauseCtx->itemVtx[i + 3].v.cn[0] = pauseCtx->itemVtx[i + 0].v.cn[1] =
+ pauseCtx->itemVtx[i + 1].v.cn[1] = pauseCtx->itemVtx[i + 2].v.cn[1] =
+ pauseCtx->itemVtx[i + 3].v.cn[1] = pauseCtx->itemVtx[i + 0].v.cn[2] =
+ pauseCtx->itemVtx[i + 1].v.cn[2] = pauseCtx->itemVtx[i + 2].v.cn[2] =
+ pauseCtx->itemVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->itemVtx[i + 0].v.cn[3] = pauseCtx->itemVtx[i + 1].v.cn[3] = pauseCtx->itemVtx[i + 2].v.cn[3] =
+ pauseCtx->itemVtx[i + 3].v.cn[3] = pauseCtx->alpha;
+ } else {
+ // No item equipped on the C button, put the quad out of view
+
+ pauseCtx->itemVtx[i + 2].v.ob[0] = -300;
+ pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0];
+
+ pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] =
+ pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] = 300;
+ pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] =
+ pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_HEIGHT;
+ }
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_MASK) {
+ if (!sInDungeonScene) {
+ pauseCtx->mapPageVtx = GRAPH_ALLOC(
+ gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MAP_WORLD_QUADS + WORLD_MAP_IMAGE_FRAG_NUM) * 4) * sizeof(Vtx));
+ j = KaleidoScope_SetPageVertices(play, pauseCtx->mapPageVtx, VTX_PAGE_MAP_WORLD, VTX_PAGE_MAP_WORLD_QUADS);
+
+ for (i = 0, vtx_y = 59; i < WORLD_MAP_IMAGE_FRAG_NUM; i++, j += 4, vtx_y -= WORLD_MAP_IMAGE_FRAG_HEIGHT) {
+ pauseCtx->mapPageVtx[j + 2].v.ob[0] = 0 - (WORLD_MAP_IMAGE_WIDTH / 2) - 1;
+ pauseCtx->mapPageVtx[j + 0].v.ob[0] = pauseCtx->mapPageVtx[j + 2].v.ob[0];
+
+ pauseCtx->mapPageVtx[j + 1].v.ob[0] = pauseCtx->mapPageVtx[j + 3].v.ob[0] =
+ pauseCtx->mapPageVtx[j + 0].v.ob[0] + WORLD_MAP_IMAGE_WIDTH;
+
+ pauseCtx->mapPageVtx[j + 0].v.ob[1] = pauseCtx->mapPageVtx[j + 1].v.ob[1] = vtx_y + pauseCtx->offsetY;
+
+ pauseCtx->mapPageVtx[j + 2].v.ob[1] = pauseCtx->mapPageVtx[j + 3].v.ob[1] =
+ pauseCtx->mapPageVtx[j + 0].v.ob[1] - WORLD_MAP_IMAGE_FRAG_HEIGHT;
+
+ pauseCtx->mapPageVtx[j + 0].v.ob[2] = pauseCtx->mapPageVtx[j + 1].v.ob[2] =
+ pauseCtx->mapPageVtx[j + 2].v.ob[2] = pauseCtx->mapPageVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->mapPageVtx[j + 0].v.flag = pauseCtx->mapPageVtx[j + 1].v.flag =
+ pauseCtx->mapPageVtx[j + 2].v.flag = pauseCtx->mapPageVtx[j + 3].v.flag = 0;
+
+ pauseCtx->mapPageVtx[j + 0].v.tc[0] = pauseCtx->mapPageVtx[j + 0].v.tc[1] =
+ pauseCtx->mapPageVtx[j + 1].v.tc[1] = pauseCtx->mapPageVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->mapPageVtx[j + 1].v.tc[0] = pauseCtx->mapPageVtx[j + 3].v.tc[0] =
+ WORLD_MAP_IMAGE_WIDTH * (1 << 5);
+ pauseCtx->mapPageVtx[j + 2].v.tc[1] = pauseCtx->mapPageVtx[j + 3].v.tc[1] =
+ WORLD_MAP_IMAGE_FRAG_HEIGHT * (1 << 5);
+
+ pauseCtx->mapPageVtx[j + 0].v.cn[0] = pauseCtx->mapPageVtx[j + 2].v.cn[0] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[1] = pauseCtx->mapPageVtx[j + 2].v.cn[1] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[2] = pauseCtx->mapPageVtx[j + 2].v.cn[2] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[0] = pauseCtx->mapPageVtx[j + 3].v.cn[0] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[1] = pauseCtx->mapPageVtx[j + 3].v.cn[1] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[2] = pauseCtx->mapPageVtx[j + 3].v.cn[2] =
+ pauseCtx->mapPageVtx[j + 0].v.cn[3] = pauseCtx->mapPageVtx[j + 2].v.cn[3] =
+ pauseCtx->mapPageVtx[j + 1].v.cn[3] = pauseCtx->mapPageVtx[j + 3].v.cn[3] =
+ pauseCtx->alpha;
+ }
+
+ pauseCtx->mapPageVtx[j - 2].v.ob[1] = pauseCtx->mapPageVtx[j - 1].v.ob[1] =
+ pauseCtx->mapPageVtx[j - 4].v.ob[1] - (WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT);
+
+ pauseCtx->mapPageVtx[j - 2].v.tc[1] = pauseCtx->mapPageVtx[j - 1].v.tc[1] =
+ (WORLD_MAP_IMAGE_HEIGHT % WORLD_MAP_IMAGE_FRAG_HEIGHT) * (1 << 5);
+
+ } else {
+ pauseCtx->mapPageVtx =
+ GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MAP_DUNGEON_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->mapPageVtx, VTX_PAGE_MAP_DUNGEON, VTX_PAGE_MAP_DUNGEON_QUADS);
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_ITEM) {
+ pauseCtx->questPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_QUEST_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->questPageVtx, VTX_PAGE_QUEST, VTX_PAGE_QUEST_QUADS);
+
+ pauseCtx->questVtx = GRAPH_ALLOC(gfxCtx, (39 * 4) * sizeof(Vtx));
+
+ for (k = 0, j = 0; j < 39; j++, k += 4) {
+ if (j <= QUEST_SWORD) {
+ pauseCtx->questVtx[k + 0].v.ob[0] = pauseCtx->questVtx[k + 2].v.ob[0] = sQuestVtxRectLeft[j];
+
+ pauseCtx->questVtx[k + 1].v.ob[0] = pauseCtx->questVtx[k + 3].v.ob[0] =
+ pauseCtx->questVtx[k + 0].v.ob[0] + sQuestVtxWidths[j];
+
+ pauseCtx->questVtx[k + 0].v.ob[1] = pauseCtx->questVtx[k + 1].v.ob[1] =
+ sQuestVtxRectTop[j] + pauseCtx->offsetY;
+
+ pauseCtx->questVtx[k + 2].v.ob[1] = pauseCtx->questVtx[k + 3].v.ob[1] =
+ pauseCtx->questVtx[k + 0].v.ob[1] - sQuestVtxHeights[j];
+ } else {
+ pauseCtx->questVtx[k + 0].v.ob[0] = pauseCtx->questVtx[k + 2].v.ob[0] = sQuestVtxRectLeft[j] + 2;
+
+ pauseCtx->questVtx[k + 1].v.ob[0] = pauseCtx->questVtx[k + 3].v.ob[0] =
+ pauseCtx->questVtx[k + 0].v.ob[0] + sQuestVtxWidths[j] - 4;
+
+ pauseCtx->questVtx[k + 0].v.ob[1] = pauseCtx->questVtx[k + 1].v.ob[1] =
+ sQuestVtxRectTop[j] + pauseCtx->offsetY - 2;
+
+ pauseCtx->questVtx[k + 2].v.ob[1] = pauseCtx->questVtx[k + 3].v.ob[1] =
+ pauseCtx->questVtx[k + 0].v.ob[1] - sQuestVtxHeights[j] + 4;
+ }
+
+ pauseCtx->questVtx[k + 0].v.ob[2] = pauseCtx->questVtx[k + 1].v.ob[2] = pauseCtx->questVtx[k + 2].v.ob[2] =
+ pauseCtx->questVtx[k + 3].v.ob[2] = 0;
+
+ pauseCtx->questVtx[k + 0].v.flag = pauseCtx->questVtx[k + 1].v.flag = pauseCtx->questVtx[k + 2].v.flag =
+ pauseCtx->questVtx[k + 3].v.flag = 0;
+
+ pauseCtx->questVtx[k + 0].v.tc[0] = pauseCtx->questVtx[k + 0].v.tc[1] = pauseCtx->questVtx[k + 1].v.tc[1] =
+ pauseCtx->questVtx[k + 2].v.tc[0] = 0;
+
+ pauseCtx->questVtx[k + 1].v.tc[0] = pauseCtx->questVtx[k + 3].v.tc[0] = sQuestVtxWidths[j] << 5;
+ pauseCtx->questVtx[k + 2].v.tc[1] = pauseCtx->questVtx[k + 3].v.tc[1] = sQuestVtxHeights[j] << 5;
+
+ pauseCtx->questVtx[k + 0].v.cn[0] = pauseCtx->questVtx[k + 1].v.cn[0] = pauseCtx->questVtx[k + 2].v.cn[0] =
+ pauseCtx->questVtx[k + 3].v.cn[0] = pauseCtx->questVtx[k + 0].v.cn[1] =
+ pauseCtx->questVtx[k + 1].v.cn[1] = pauseCtx->questVtx[k + 2].v.cn[1] =
+ pauseCtx->questVtx[k + 3].v.cn[1] = pauseCtx->questVtx[k + 0].v.cn[2] =
+ pauseCtx->questVtx[k + 1].v.cn[2] = pauseCtx->questVtx[k + 2].v.cn[2] =
+ pauseCtx->questVtx[k + 3].v.cn[2] = 255;
+
+ pauseCtx->questVtx[k + 0].v.cn[3] = pauseCtx->questVtx[k + 1].v.cn[3] = pauseCtx->questVtx[k + 2].v.cn[3] =
+ pauseCtx->questVtx[k + 3].v.cn[3] = pauseCtx->alpha;
+ }
+ }
+
+ if (pauseCtx->pageIndex != PAUSE_MAP) {
+ pauseCtx->maskPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MASK_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->maskPageVtx, VTX_PAGE_MASK, VTX_PAGE_MASK_QUADS);
+
+ pauseCtx->maskVtx = GRAPH_ALLOC(gfxCtx, (QUAD_MASK_MAX * 4) * sizeof(Vtx));
+
+ // Loop over grid rows
+ for (k = 0, i = 0, vtx_y = (MASK_GRID_ROWS * MASK_GRID_CELL_HEIGHT) / 2 - 6; k < MASK_GRID_ROWS;
+ k++, vtx_y -= MASK_GRID_CELL_HEIGHT) {
+ // Loop over grid columns
+ for (vtx_x = 0 - (MASK_GRID_COLS * MASK_GRID_CELL_WIDTH) / 2, j = 0; j < MASK_GRID_COLS;
+ j++, i += 4, vtx_x += MASK_GRID_CELL_WIDTH) {
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0] = vtx_x + MASK_GRID_QUAD_MARGIN;
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] =
+ vtx_y + pauseCtx->offsetY - MASK_GRID_QUAD_MARGIN;
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_QUAD_HEIGHT;
+
+ pauseCtx->maskVtx[i + 0].v.ob[2] = pauseCtx->maskVtx[i + 1].v.ob[2] = pauseCtx->maskVtx[i + 2].v.ob[2] =
+ pauseCtx->maskVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->maskVtx[i + 0].v.flag = pauseCtx->maskVtx[i + 1].v.flag = pauseCtx->maskVtx[i + 2].v.flag =
+ pauseCtx->maskVtx[i + 3].v.flag = 0;
+
+ pauseCtx->maskVtx[i + 0].v.tc[0] = pauseCtx->maskVtx[i + 0].v.tc[1] = pauseCtx->maskVtx[i + 1].v.tc[1] =
+ pauseCtx->maskVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->maskVtx[i + 1].v.tc[0] = pauseCtx->maskVtx[i + 2].v.tc[1] = pauseCtx->maskVtx[i + 3].v.tc[0] =
+ pauseCtx->maskVtx[i + 3].v.tc[1] = MASK_GRID_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->maskVtx[i + 0].v.cn[0] = pauseCtx->maskVtx[i + 1].v.cn[0] = pauseCtx->maskVtx[i + 2].v.cn[0] =
+ pauseCtx->maskVtx[i + 3].v.cn[0] = pauseCtx->maskVtx[i + 0].v.cn[1] =
+ pauseCtx->maskVtx[i + 1].v.cn[1] = pauseCtx->maskVtx[i + 2].v.cn[1] =
+ pauseCtx->maskVtx[i + 3].v.cn[1] = pauseCtx->maskVtx[i + 0].v.cn[2] =
+ pauseCtx->maskVtx[i + 1].v.cn[2] = pauseCtx->maskVtx[i + 2].v.cn[2] =
+ pauseCtx->maskVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->maskVtx[i + 0].v.cn[3] = pauseCtx->maskVtx[i + 1].v.cn[3] = pauseCtx->maskVtx[i + 2].v.cn[3] =
+ pauseCtx->maskVtx[i + 3].v.cn[3] = 255;
+ }
+ }
+
+ // QUAD_MASK_GRID_SELECTED_C_LEFT, QUAD_MASK_GRID_SELECTED_C_DOWN, QUAD_MASK_GRID_SELECTED_C_RIGHT
+
+ for (j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++, i += 4) {
+ if (GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) {
+ k = (GET_CUR_FORM_BTN_SLOT(j) - ITEM_NUM_SLOTS) * 4;
+
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0] =
+ pauseCtx->maskVtx[k].v.ob[0] + MASK_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] =
+ pauseCtx->maskVtx[k].v.ob[1] - MASK_GRID_SELECTED_QUAD_MARGIN;
+
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT;
+
+ pauseCtx->maskVtx[i + 0].v.ob[2] = pauseCtx->maskVtx[i + 1].v.ob[2] = pauseCtx->maskVtx[i + 2].v.ob[2] =
+ pauseCtx->maskVtx[i + 3].v.ob[2] = 0;
+
+ pauseCtx->maskVtx[i + 0].v.flag = pauseCtx->maskVtx[i + 1].v.flag = pauseCtx->maskVtx[i + 2].v.flag =
+ pauseCtx->maskVtx[i + 3].v.flag = 0;
+
+ pauseCtx->maskVtx[i + 0].v.tc[0] = pauseCtx->maskVtx[i + 0].v.tc[1] = pauseCtx->maskVtx[i + 1].v.tc[1] =
+ pauseCtx->maskVtx[i + 2].v.tc[0] = 0;
+
+ pauseCtx->maskVtx[i + 1].v.tc[0] = pauseCtx->maskVtx[i + 2].v.tc[1] = pauseCtx->maskVtx[i + 3].v.tc[0] =
+ pauseCtx->maskVtx[i + 3].v.tc[1] = MASK_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5);
+
+ pauseCtx->maskVtx[i + 0].v.cn[0] = pauseCtx->maskVtx[i + 1].v.cn[0] = pauseCtx->maskVtx[i + 2].v.cn[0] =
+ pauseCtx->maskVtx[i + 3].v.cn[0] = pauseCtx->maskVtx[i + 0].v.cn[1] =
+ pauseCtx->maskVtx[i + 1].v.cn[1] = pauseCtx->maskVtx[i + 2].v.cn[1] =
+ pauseCtx->maskVtx[i + 3].v.cn[1] = pauseCtx->maskVtx[i + 0].v.cn[2] =
+ pauseCtx->maskVtx[i + 1].v.cn[2] = pauseCtx->maskVtx[i + 2].v.cn[2] =
+ pauseCtx->maskVtx[i + 3].v.cn[2] = 255;
+
+ pauseCtx->maskVtx[i + 0].v.cn[3] = pauseCtx->maskVtx[i + 1].v.cn[3] = pauseCtx->maskVtx[i + 2].v.cn[3] =
+ pauseCtx->maskVtx[i + 3].v.cn[3] = pauseCtx->alpha;
+ } else {
+ pauseCtx->maskVtx[i + 2].v.ob[0] = -300;
+ pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0];
+
+ pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] =
+ pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH;
+
+ pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] = 300;
+ pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] =
+ pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT;
+ }
+ }
+ }
+
+ pauseCtx->cursorVtx = GRAPH_ALLOC(play->state.gfxCtx, (PAUSE_QUAD_CURSOR_MAX * 4) * sizeof(Vtx));
+
+ for (i = 0; i < (PAUSE_QUAD_CURSOR_MAX * 4); i++) {
+ pauseCtx->cursorVtx[i].v.ob[0] = pauseCtx->cursorVtx[i].v.ob[1] = pauseCtx->cursorVtx[i].v.ob[2] = 0;
+
+ pauseCtx->cursorVtx[i].v.flag = 0;
+
+ pauseCtx->cursorVtx[i].v.tc[0] = pauseCtx->cursorVtx[i].v.tc[1] = 0;
+
+ pauseCtx->cursorVtx[i].v.cn[0] = pauseCtx->cursorVtx[i].v.cn[1] = pauseCtx->cursorVtx[i].v.cn[2] =
+ pauseCtx->cursorVtx[i].v.cn[3] = 255;
+ }
+
+ // PAUSE_QUAD_CURSOR_0
+ pauseCtx->cursorVtx[1].v.tc[0] = pauseCtx->cursorVtx[2].v.tc[1] = pauseCtx->cursorVtx[3].v.tc[0] =
+ pauseCtx->cursorVtx[3].v.tc[1]
+ // PAUSE_QUAD_CURSOR_1
+ = pauseCtx->cursorVtx[5].v.tc[0] = pauseCtx->cursorVtx[6].v.tc[1] = pauseCtx->cursorVtx[7].v.tc[0] =
+ pauseCtx->cursorVtx[7].v.tc[1]
+ // PAUSE_QUAD_CURSOR_2
+ = pauseCtx->cursorVtx[9].v.tc[0] = pauseCtx->cursorVtx[10].v.tc[1] = pauseCtx->cursorVtx[11].v.tc[0] =
+ pauseCtx->cursorVtx[11].v.tc[1]
+ // PAUSE_QUAD_CURSOR_3
+ = pauseCtx->cursorVtx[13].v.tc[0] = pauseCtx->cursorVtx[14].v.tc[1] = pauseCtx->cursorVtx[15].v.tc[0] =
+ pauseCtx->cursorVtx[15].v.tc[1] = 16 * (1 << 5);
+
+ // PAUSE_QUAD_CURSOR_4
+ pauseCtx->cursorVtx[17].v.tc[0] = pauseCtx->cursorVtx[18].v.tc[1] = pauseCtx->cursorVtx[19].v.tc[0] =
+ pauseCtx->cursorVtx[19].v.tc[1] = 32 * (1 << 5);
+
+ pauseCtx->infoPanelVtx = GRAPH_ALLOC(gfxCtx, 28 * sizeof(Vtx));
+
+ if ((pauseCtx->state == PAUSE_STATE_SAVEPROMPT) || IS_PAUSE_STATE_GAMEOVER) {
+ pauseCtx->promptPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_SAVE_QUADS) * 4) * sizeof(Vtx));
+ KaleidoScope_SetPageVertices(play, pauseCtx->promptPageVtx, VTX_PAGE_PROMPT, VTX_PAGE_SAVE_QUADS);
+ }
}
-void func_8082192C(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
+f32 sItemMaskCursorsX[] = {
+ -62.0f, // Column 1
+ -36.0f, // Column 2
+ -10.0f, // Column 3
+ 16.0f, // Column 4
+ 42.0f, // Column 5
+ 68.0f, // Column 6
+};
+
+f32 sItemMaskCursorsY[] = {
+ 31.0f, // Row 1
+ 5.0f, // Row 2
+ -21.0f, // Row 3
+ -47.0f, // Row 4
+};
+
+f32 sWorldMapCursorsX[REGION_MAX] = {
+ -49.0f, // REGION_GREAT_BAY
+ -35.0f, // REGION_ZORA_HALL
+ -3.0f, // REGION_ROMANI_RANCH
+ 4.0f, // REGION_DEKU_PALACE
+ 12.0f, // REGION_WOODFALL
+ 8.0f, // REGION_CLOCK_TOWN
+ 7.0f, // REGION_SNOWHEAD
+ 40.0f, // REGION_IKANA_GRAVEYARD
+ 47.0f, // REGION_IKANA_CANYON
+ 49.0f, // REGION_GORON_VILLAGE
+ 55.0f, // REGION_STONE_TOWER
+};
+
+f32 sWorldMapCursorsY[REGION_MAX] = {
+ -15.0f, // REGION_GREAT_BAY
+ -36.0f, // REGION_ZORA_HALL
+ -23.0f, // REGION_ROMANI_RANCH
+ -49.0f, // REGION_DEKU_PALACE
+ -29.0f, // REGION_WOODFALL
+ -8.0f, // REGION_CLOCK_TOWN
+ 25.0f, // REGION_SNOWHEAD
+ 2.0f, // REGION_IKANA_GRAVEYARD
+ -9.0f, // REGION_IKANA_CANYON
+ 28.0f, // REGION_GORON_VILLAGE
+ 7.0f, // REGION_STONE_TOWER
+};
+
+f32 sOwlWarpWorldMapCursorsX[OWL_WARP_MAX - 1] = {
+ -50.0f, // OWL_WARP_GREAT_BAY_COAST
+ -38.0f, // OWL_WARP_ZORA_CAPE
+ 6.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ 8.0f, // OWL_WARP_CLOCK_TOWN
+ 0.0f, // OWL_WARP_MILK_ROAD
+ 12.0f, // OWL_WARP_WOODFALL
+ 31.0f, // OWL_WARP_SOUTHERN_SWAMP
+ 48.0f, // OWL_WARP_IKANA_CANYON
+ 56.0f, // OWL_WARP_STONE_TOWER
+};
+
+f32 sOwlWarpWorldMapCursorsY[OWL_WARP_MAX - 1] = {
+ -14.0f, // OWL_WARP_GREAT_BAY_COAST
+ -39.0f, // OWL_WARP_ZORA_CAPE
+ 23.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ -8.0f, // OWL_WARP_CLOCK_TOWN
+ -15.0f, // OWL_WARP_MILK_ROAD
+ -31.0f, // OWL_WARP_WOODFALL
+ -30.0f, // OWL_WARP_SOUTHERN_SWAMP
+ -10.0f, // OWL_WARP_IKANA_CANYON
+ 11.0f, // OWL_WARP_STONE_TOWER
+};
+
+f32 sDungeonMapCursorsX[] = {
+ -72.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -26.0f, // DUNGEON_MAP
+ -50.0f, // DUNGEON_STRAY_FAIRIES
+ -48.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ -48.0f, // DUNGEON_FLOOR_INDEX_3
+ -48.0f, // DUNGEON_FLOOR_INDEX_2
+ -48.0f, // DUNGEON_FLOOR_INDEX_1
+ -48.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
+};
+
+f32 sDungeonMapCursorsY[] = {
+ -47.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -47.0f, // DUNGEON_MAP
+ -30.0f, // DUNGEON_STRAY_FAIRIES
+ 33.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ 22.0f, // DUNGEON_FLOOR_INDEX_3
+ 11.0f, // DUNGEON_FLOOR_INDEX_2
+ -2.0f, // DUNGEON_FLOOR_INDEX_1
+ -13.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
+};
+
+f32 sQuestStatusCursorsX[] = {
+ 52.0f, // QUEST_REMAINS_ODOLWA
+ 80.0f, // QUEST_REMAINS_GOHT
+ 24.0f, // QUEST_REMAINS_GYORG
+ 52.0f, // QUEST_REMAINS_TWINMOLD
+ 81.0f, // QUEST_SHIELD
+ 24.0f, // QUEST_SWORD
+ -78.0f, // QUEST_SONG_SONATA
+ -61.0f, // QUEST_SONG_LULLABY
+ -44.0f, // QUEST_SONG_BOSSA_NOVA
+ -24.0f, // QUEST_SONG_ELEGY
+ -6.0f, // QUEST_SONG_OATH
+ -3.0f, // QUEST_SONG_SARIA
+ -78.0f, // QUEST_SONG_TIME
+ -61.0f, // QUEST_SONG_HEALING
+ -44.0f, // QUEST_SONG_EPONA
+ -24.0f, // QUEST_SONG_SOARING
+ -6.0f, // QUEST_SONG_STORMS
+ -3.0f, // QUEST_SONG_SUN
+ -68.0f, // QUEST_BOMBERS_NOTEBOOK
+ 22.0f, // QUEST_QUIVER
+ 83.0f, // QUEST_BOMB_BAG
+ -67.0f, // QUEST_SKULL_TOKEN
+ -21.0f, // QUEST_HEART_PIECE
+};
+
+f32 sQuestStatusCursorsY[] = {
+ 33.0f, // QUEST_REMAINS_ODOLWA
+ 18.0f, // QUEST_REMAINS_GOHT
+ 18.0f, // QUEST_REMAINS_GYORG
+ 0.0f, // QUEST_REMAINS_TWINMOLD
+ -23.0f, // QUEST_SHIELD
+ -23.0f, // QUEST_SWORD
+ -29.0f, // QUEST_SONG_SONATA
+ -29.0f, // QUEST_SONG_LULLABY
+ -29.0f, // QUEST_SONG_BOSSA_NOVA
+ -29.0f, // QUEST_SONG_ELEGY
+ -29.0f, // QUEST_SONG_OATH
+ -29.0f, // QUEST_SONG_SARIA
+ -11.0f, // QUEST_SONG_TIME
+ -11.0f, // QUEST_SONG_HEALING
+ -11.0f, // QUEST_SONG_EPONA
+ -11.0f, // QUEST_SONG_SOARING
+ -11.0f, // QUEST_SONG_STORMS
+ -11.0f, // QUEST_SONG_SUN
+ 27.0f, // QUEST_BOMBERS_NOTEBOOK
+ -53.0f, // QUEST_QUIVER
+ -53.0f, // QUEST_BOMB_BAG
+ 14.0f, // QUEST_SKULL_TOKEN
+ 26.0f, // QUEST_HEART_PIECE
+};
+
+void KaleidoScope_UpdateCursorSize(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 index;
+
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->cursorVtx[2].v.ob[0] = -8;
+ pauseCtx->cursorVtx[1].v.ob[0] = pauseCtx->cursorVtx[3].v.ob[0] = pauseCtx->cursorVtx[0].v.ob[0] + 16;
+
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->cursorVtx[1].v.ob[1] = 8;
+ pauseCtx->cursorVtx[2].v.ob[1] = pauseCtx->cursorVtx[3].v.ob[1] = pauseCtx->cursorVtx[0].v.ob[1] - 16;
+
+ if (pauseCtx->cursorSpecialPos == 0) {
+ switch (pauseCtx->pageIndex) {
+ case PAUSE_ITEM:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_ITEM]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_ITEM]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
+
+ case PAUSE_MAP:
+ if (!sInDungeonScene) {
+ if (IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorX = sOwlWarpWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sOwlWarpWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ } else {
+ pauseCtx->cursorX = sWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ }
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorHeight = 10.0f;
+ pauseCtx->cursorWidth = 10.0f;
+ } else {
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ } else {
+ pauseCtx->cursorX = sDungeonMapCursorsX[pauseCtx->cursorPoint[PAUSE_MAP]];
+ pauseCtx->cursorY = sDungeonMapCursorsY[pauseCtx->cursorPoint[PAUSE_MAP]];
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] >= DUNGEON_FLOOR_INDEX_4) {
+ // Floors
+ pauseCtx->cursorWidth = 18.0f;
+ pauseCtx->cursorHeight = 12.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == DUNGEON_STRAY_FAIRIES) {
+ // Stray Fairies
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 40.0f;
+ } else {
+ // Map, Compass, Boss Key
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ }
+ break;
+
+ case PAUSE_QUEST:
+ if (!R_PAUSE_DBG_QUEST_CURSOR_ON) {
+ pauseCtx->cursorX = sQuestStatusCursorsX[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ pauseCtx->cursorY = sQuestStatusCursorsY[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ } else {
+ pauseCtx->cursorX = R_PAUSE_DBG_QUEST_CURSOR_X;
+ pauseCtx->cursorY = R_PAUSE_DBG_QUEST_CURSOR_Y;
+ }
+ pauseCtx->cursorHeight = 17.0f;
+ pauseCtx->cursorWidth = 17.0f;
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == QUEST_17) {
+ pauseCtx->cursorHeight = 25.0f;
+ pauseCtx->cursorWidth = 25.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SWORD) {
+ pauseCtx->cursorHeight = 18.0f;
+ pauseCtx->cursorWidth = 18.0f;
+ } else if ((pauseCtx->cursorSlot[pauseCtx->pageIndex] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SONG_SUN)) {
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 12.0f;
+ }
+ break;
+
+ case PAUSE_MASK:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_MASK]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_MASK]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ pauseCtx->cursorSpinPhase += 0x300;
+ } else {
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ pauseCtx->cursorX = -93.0f;
+ } else { // PAUSE_CURSOR_PAGE_RIGHT
+ pauseCtx->cursorX = 101.0f;
+ }
+ pauseCtx->cursorSpinPhase += 0x300;
+ pauseCtx->cursorHeight = 16.0f;
+ pauseCtx->cursorWidth = 16.0f;
+ pauseCtx->cursorY = -4.0f;
+ }
+
+ if (pauseCtx->cursorWidth < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorWidth = 0;
+ } else {
+ pauseCtx->cursorWidth -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorHeight < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorHeight = 0.0f;
+ } else {
+ pauseCtx->cursorHeight -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorShrinkRate != 0.0f) {
+ pauseCtx->cursorShrinkRate -= 1.0f;
+ }
+
+ sCursorCirclesX[0] = Math_SinS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorWidth;
+ sCursorCirclesX[1] = Math_SinS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[2] = Math_SinS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[3] = Math_SinS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorWidth;
+ sCursorCirclesY[0] = Math_CosS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorHeight;
+ sCursorCirclesY[1] = Math_CosS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[2] = Math_CosS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[3] = Math_CosS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorHeight;
}
-void func_80821958(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
+void KaleidoScope_DrawCursor(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)))) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimR, sCursorPrimG, sCursorPrimB, 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvR, sCursorEnvG, sCursorEnvB, 255);
+
+ Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ for (i = 0; i < 4; i++) {
+ Matrix_Push();
+ Matrix_Translate(sCursorCirclesX[i], sCursorCirclesY[i], -50.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, &D_08064340, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
+void KaleidoScope_DrawGameOver(PlayState* play) {
+ static s16 sGameOverUlt = 0;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821A04.s")
+ OPEN_DISPS(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_DrawTexQuadRGBA32.s")
+ Gfx_SetupDL39_Opa(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821CC4.s")
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT,
+ COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0);
-void KaleidoScope_HandlePageToggles(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_HandlePageToggles.s")
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, sGameOverPrimR, sGameOverPrimG, sGameOverPrimB, sGameOverPrimAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, sGameOverEnvR, sGameOverEnvG, sGameOverEnvB, 255);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821F30.s")
+ sGameOverUlt -= 2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808221DC.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP1Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80823350.s")
+ gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverMaskTex, 256, 1, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, 5, G_TX_NOLOD, G_TX_NOLOD);
-void KaleidoScope_UpdateNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateNamePanel.s")
+ gDPSetTileSize(POLY_OPA_DISP++, 1, 0, sGameOverUlt & 0x7F, 252, (sGameOverUlt & 0x7F) + 124);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808248D0.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x100, sGameOverRectPosY << 2, 0x200, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80824B90.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP2Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
-void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateOwlWarpNamePanel.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x200, sGameOverRectPosY << 2, 0x300, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateSwitchPage.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP3Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_SetView.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x300, sGameOverRectPosY << 2, 0x400, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825A50.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825E28.s")
+void KaleidoScope_Draw(PlayState* play) {
+ s32 pad;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808274DC.s")
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827A8C.s")
+ gSPSegment(POLY_OPA_DISP++, 0x02, interfaceCtx->parameterSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0D, pauseCtx->iconItemLangSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0B, pauseCtx->iconItemVtxSegment);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827E08.s")
+ if (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) {
+ KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Draw.s")
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ // Draw Default or Game Over Menus
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
-void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_GrayOutTextureRGBA32.s")
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ KaleidoScope_DrawInfoPanel(play);
+ }
+
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_MAIN) {
+ KaleidoScope_DrawCursor(play);
+ }
+
+ if ((pauseCtx->state >= PAUSE_STATE_GAMEOVER_3) && (pauseCtx->state <= PAUSE_STATE_GAMEOVER_10) &&
+ (play->gameOverCtx.state != GAMEOVER_INACTIVE)) {
+ KaleidoScope_DrawGameOver(play);
+ }
+ } else {
+ // Draw Owl Warp Menu
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
+ KaleidoScope_DrawOwlWarpMapPage(play);
+
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+ KaleidoScope_DrawOwlWarpInfoPanel(play);
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) {
+ KaleidoScope_DrawCursor(play);
+ }
+ }
+ }
+
+ if ((pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY_INIT) || (pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY)) {
+ KaleidoScope_DrawInventoryEditor(play);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount) {
+ u32 rgb;
+ u32 gray;
+ u16 i;
+ s32 j;
+
+ //! FAKE
+ if (texture == NULL) {}
+
+ for (i = 0; i < pixelCount; i++) {
+ //! FAKE
+ j = i;
+ if ((texture[j] & 0xFFFFFF00) != 0) {
+ rgb = texture[j] >> 8;
+ gray = ((((rgb & 0xFF0000) >> 16) + ((rgb & 0xFF00) >> 7) + (rgb & 0xFF)) / 7) & 0xFF;
+
+ rgb = gray;
+ rgb <<= 8;
+ rgb |= gray;
+ rgb <<= 8;
+ rgb |= gray;
+
+ texture[j] = (rgb << 8) | (texture[j] & 0xFF);
+ }
+ }
+}
void KaleidoScope_UpdateOpening(PlayState* play) {
PauseContext* pauseCtx = &play->pauseCtx;
@@ -531,10 +2778,10 @@ void KaleidoScope_UpdateOpening(PlayState* play) {
Interface_UpdateButtonsAlt(play, 1);
if (pauseCtx->cursorSpecialPos == 0) {
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
} else {
gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
@@ -613,7 +2860,7 @@ void KaleidoScope_Update(PlayState* play) {
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
- gSegments[0x08] = PHYSICAL_TO_VIRTUAL(pauseCtx->iconItemSegment);
+ gSegments[0x08] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment);
for (itemId = 0; itemId <= ITEM_BOW_ARROW_FIRE; itemId++) {
if (!gPlayerFormItemRestrictions[(void)0, gSaveContext.save.playerForm][(s32)itemId]) {
@@ -650,7 +2897,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
func_8011552C(play, DO_ACTION_INFO);
if (((void)0, gSaveContext.worldMapArea) < 0x16) {
- func_8082192C(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
+ Kaleido_LoadMapNameStaticLarge(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
}
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
@@ -793,7 +3040,7 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_STATE_SAVEPROMPT:
switch (pauseCtx->savePromptState) {
- case PAUSE_SAVEPROMPT_STATE_0:
+ case PAUSE_SAVEPROMPT_STATE_APPEARING:
pauseCtx->roll -= 78.5f;
sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
@@ -807,18 +3054,18 @@ void KaleidoScope_Update(PlayState* play) {
if (CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
if (pauseCtx->promptChoice != PAUSE_PROMPT_YES) {
func_8011552C(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
} else {
play_sound(NA_SE_SY_PIECE_OF_HEART);
Play_SaveCycleSceneFlags(&play->state);
- gSaveContext.save.playerData.savedSceneId = play->sceneId;
+ gSaveContext.save.saveInfo.playerData.savedSceneId = play->sceneId;
func_8014546C(sramCtx);
- if (gSaveContext.unk_3F3F == 0) {
+ if (!gSaveContext.flashSaveAvailable) {
pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_5;
} else {
- func_80147008(sramCtx, D_801C67C8[gSaveContext.fileNum],
- D_801C67F0[gSaveContext.fileNum]);
- func_80147020(sramCtx);
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[gSaveContext.fileNum],
+ gFlashSaveNumPages[gSaveContext.fileNum]);
+ Sram_StartWriteToFlashDefault(sramCtx);
pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_4;
}
sDelayTimer = 90;
@@ -831,7 +3078,7 @@ void KaleidoScope_Update(PlayState* play) {
func_801A3AEC(0);
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
func_8011552C(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
D_8082B90C = pauseCtx->roll;
}
break;
@@ -877,26 +3124,31 @@ void KaleidoScope_Update(PlayState* play) {
}
break;
- case PAUSE_SAVEPROMPT_STATE_2:
+ case PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU:
pauseCtx->roll += 78.5f;
sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+
if (pauseCtx->roll >= -314.0f) {
pauseCtx->state = PAUSE_STATE_MAIN;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->roll = -314.0f;
pauseCtx->itemPageRoll = pauseCtx->mapPageRoll = pauseCtx->questPageRoll =
pauseCtx->maskPageRoll = 0.0f;
func_8011552C(play, DO_ACTION_INFO);
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex + 1][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) ||
(pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT)) {
KaleidoScope_MoveCursorToSpecialPos(play, pauseCtx->cursorSpecialPos);
} else {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
}
}
break;
@@ -1072,14 +3324,15 @@ void KaleidoScope_Update(PlayState* play) {
play_sound(NA_SE_SY_PIECE_OF_HEART);
pauseCtx->promptChoice = PAUSE_PROMPT_YES;
Play_SaveCycleSceneFlags(&play->state);
- gSaveContext.save.playerData.savedSceneId = play->sceneId;
- gSaveContext.save.playerData.health = 0x30;
+ gSaveContext.save.saveInfo.playerData.savedSceneId = play->sceneId;
+ gSaveContext.save.saveInfo.playerData.health = 0x30;
func_8014546C(sramCtx);
- if (gSaveContext.unk_3F3F == 0) {
+ if (!gSaveContext.flashSaveAvailable) {
pauseCtx->state = PAUSE_STATE_GAMEOVER_8;
} else {
- func_80147008(sramCtx, D_801C67C8[gSaveContext.fileNum], D_801C67F0[gSaveContext.fileNum]);
- func_80147020(sramCtx);
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[gSaveContext.fileNum],
+ gFlashSaveNumPages[gSaveContext.fileNum]);
+ Sram_StartWriteToFlashDefault(sramCtx);
pauseCtx->state = PAUSE_STATE_GAMEOVER_7;
}
sDelayTimer = 90;
@@ -1145,15 +3398,15 @@ void KaleidoScope_Update(PlayState* play) {
func_80169FDC(&play->state);
gSaveContext.respawnFlag = -2;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- gSaveContext.save.playerData.health = 0x30;
+ gSaveContext.save.saveInfo.playerData.health = 0x30;
Audio_SetSpec(0xA);
gSaveContext.healthAccumulator = 0;
gSaveContext.magicState = MAGIC_STATE_IDLE;
gSaveContext.magicFlag = 0;
gSaveContext.magicCapacity = 0;
- gSaveContext.magicFillTarget = gSaveContext.save.playerData.magic;
- gSaveContext.save.playerData.magicLevel = 0;
- gSaveContext.save.playerData.magic = 0;
+ gSaveContext.magicFillTarget = gSaveContext.save.saveInfo.playerData.magic;
+ gSaveContext.save.saveInfo.playerData.magicLevel = 0;
+ gSaveContext.save.saveInfo.playerData.magic = 0;
} else { // PAUSE_PROMPT_NO
STOP_GAMESTATE(&play->state);
SET_NEXT_GAMESTATE(&play->state, TitleSetup_Init, sizeof(TitleSetupState));
@@ -1194,7 +3447,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
func_8011552C(play, DO_ACTION_WARP);
worldMapCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
- func_80821900(pauseCtx->nameSegment, worldMapCursorPoint);
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, worldMapCursorPoint);
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
DmaMgr_SendRequest0(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static),
diff --git a/tools/disasm/disasm.py b/tools/disasm/disasm.py
index 0f5e16464..78d66d337 100755
--- a/tools/disasm/disasm.py
+++ b/tools/disasm/disasm.py
@@ -169,7 +169,6 @@ variable_addrs = None
files_text = {}
-
def proper_name(symbol, in_data=False, is_symbol=True):
# hacks
# ovl_En_Encount4 fake symbol at the very end of the data section
@@ -177,14 +176,22 @@ def proper_name(symbol, in_data=False, is_symbol=True):
return variables_ast[0x809C46DC][0] + " + 0x14"
elif symbol == 0x801EF66D: # z_message_nes constant-folding stray fairy array
return variables_ast[0x801EF670][0] + f" - 0x{0x801EF670 - 0x801EF66D:X}"
+ elif symbol == 0x801EF51D: # z_message constant-folding stray fairy array
+ return variables_ast[0x801EF670][0] + f" - 0x{0x801EF670 - 0x801EF51D:X}"
+ elif symbol == 0x801D0D7A: # play_hireso constant-folding D_801D0D80 array
+ return variables_ast[0x801D0D80][0] + f" - 0x{0x801D0D80 - 0x801D0D7A:X}"
+ elif symbol == 0x801D11F4: # play_hireso constant-folding D_801D1244 array
+ return variables_ast[0x801D1244][0] + f" - 0x{0x801D1244 - 0x801D11F4:X}"
+ elif symbol == 0x801D12C0: # play_hireso constant-folding D_801D12E8 array
+ return variables_ast[0x801D12E8][0] + f" - 0x{0x801D12E8 - 0x801D12C0:X}"
elif symbol == 0x80A09740: # boss_07 symbol with large addend folded into %lo
return variables_ast[0x80A09A60][0] + f" - 0x{0x80A09A60 - 0x80A09740:X}"
# bg_ikana_mirror symbol with large addend folded into %lo
elif symbol == 0x80B80248:
return variables_ast[0x80B801A8][0] + f" + 0x{0x80B80248 - 0x80B801A8:X}"
- # player symbol with very large addend folded into %lo, since we don't know the real symbol just use the first data symbol for now
+ # player symbol with very large addend folded into %lo
elif symbol == 0x8084D2FC:
- return variables_ast[0x8085B9F0][0] + f" - 0x{0x8085B9F0 - 0x8084D2FC:X}"
+ return variables_ast[0x8085D0FA][0] + f" - 0x{0x8085D0FA - 0x8084D2FC:X}"
# OS_K0_TO_PHYSICAL on rspS2DEX text and data symbols
elif symbol == 0x001ABAB0 or symbol == 0x001E3BB0:
return variables_ast[symbol + 0x80000000][0] + " - 0x80000000"
diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt
index 81701e140..df205189f 100644
--- a/tools/disasm/files.txt
+++ b/tools/disasm/files.txt
@@ -57,7 +57,7 @@
0x80085570 : "gfxprint",
0x80086110 : "mtxuty-cvt",
0x80086280 : "assert",
- 0x800862E0 : "",
+ 0x800862E0 : "system_heap",
0x80086620 : "padsetup",
0x80086760 : "boot_80086760",
0x80086C70 : "fp",
@@ -256,7 +256,7 @@
0x80096C30 : "loadfragment2",
0x80096C40 : "stackcheck",
0x80096C50 : "gfxprint",
- 0x80097500 : "boot_800862E0",
+ 0x80097500 : "system_heap",
0x80097520 : "fp",
0x80097530 : "rand",
0x80097540 : "osViModeNtscHpf1",
@@ -431,7 +431,7 @@
0x80140CE0 : "code_80140CE0",
0x80140E80 : "code_80140E80",
0x801418B0 : "z_vismono",
- 0x801420C0 : "code_801420C0",
+ 0x801420C0 : "z_viszbuf",
0x80142440 : "z_vr_box",
0x801435A0 : "z_vr_box_draw",
0x80143A10 : "z_sram_NES",
@@ -440,7 +440,7 @@
0x8015E750 : "z_message_staff",
0x80160A90 : "z_player_call",
0x80160C00 : "z_shrink_window",
- 0x80161180 : "db_camera",
+ 0x80161180 : "cutscene_camera",
0x80163700 : "z_kaleido_manager",
0x801639A0 : "z_kaleido_scope_call",
0x80163C90 : "z_fbdemo_dlftbls",
@@ -652,7 +652,7 @@
0x801DF150 : "z_message",
0x801DF730 : "z_message_nes",
0x801DF860 : "z_message_staff",
- 0x801DF900 : "db_camera",
+ 0x801DF900 : "cutscene_camera",
0x801DF9C0 : "z_kaleido_manager",
0x801DF9E0 : "z_fbdemo_circle",
0x801DFA00 : "z_play",
@@ -723,7 +723,7 @@
0x801F6B00 : "z_message",
0x801F6B30 : "z_player_call",
0x801F6B40 : "z_shrink_window",
- 0x801F6B50 : "db_camera",
+ 0x801F6B50 : "cutscene_camera",
0x801F6BF0 : "z_kaleido_manager",
0x801F6C00 : "z_kaleido_scope_call",
0x801F6C10 : "z_play",
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index e4a63bfde..89e1c153b 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -157,48 +157,48 @@
0x80086258:("MtxConv_L2F",),
0x80086280:("__assert",),
0x800862B4:("func_800862B4",),
- 0x800862E0:("SystemArena_MallocMin1",),
- 0x80086310:("SystemArena_FreeNullCheck",),
- 0x8008633C:("SystemArena_RunBlockFunc",),
- 0x800863AC:("SystemArena_RunBlockFunc1",),
- 0x8008641C:("SystemArena_RunBlockFunc8",),
- 0x800864EC:("SystemArena_RunBlockFunc1Reverse",),
- 0x80086588:("SystemArena_RunInits",),
- 0x800865F8:("SystemArena_Init",),
+ 0x800862E0:("SystemHeap_Malloc",),
+ 0x80086310:("SystemHeap_Free",),
+ 0x8008633C:("SystemHeap_RunBlockFunc",),
+ 0x800863AC:("SystemHeap_RunBlockFunc1",),
+ 0x8008641C:("SystemHeap_RunBlockFunc8",),
+ 0x800864EC:("SystemHeap_RunBlockFunc1Reverse",),
+ 0x80086588:("SystemHeap_RunInits",),
+ 0x800865F8:("SystemHeap_Init",),
0x80086620:("PadSetup_Init",),
- 0x80086760:("func_80086760",),
- 0x80086794:("func_80086794",),
- 0x800867B4:("func_800867B4",),
- 0x800867D4:("func_800867D4",),
- 0x800867F4:("func_800867F4",),
- 0x80086814:("func_80086814",),
- 0x80086834:("func_80086834",),
- 0x80086880:("func_80086880",),
- 0x800869A4:("func_800869A4",),
- 0x80086AF0:("func_80086AF0",),
- 0x80086B30:("func_80086B30",),
- 0x80086C18:("func_80086C18",),
- 0x80086C48:("func_80086C48",),
- 0x80086C70:("func_80086C70",),
- 0x80086C7C:("func_80086C7C",),
- 0x80086C88:("func_80086C88",),
- 0x80086C98:("func_80086C98",),
- 0x80086CA8:("func_80086CA8",),
- 0x80086CB4:("func_80086CB4",),
- 0x80086CC0:("func_80086CC0",),
- 0x80086CD0:("func_80086CD0",),
- 0x80086CE0:("func_80086CE0",),
- 0x80086CEC:("func_80086CEC",),
- 0x80086CF8:("func_80086CF8",),
- 0x80086D08:("func_80086D08",),
- 0x80086D18:("func_80086D18",),
- 0x80086D24:("func_80086D24",),
- 0x80086D30:("func_80086D30",),
- 0x80086D40:("func_80086D40",),
- 0x80086D50:("func_80086D50",),
- 0x80086D6C:("func_80086D6C",),
- 0x80086D8C:("func_80086D8C",),
- 0x80086DAC:("func_80086DAC",),
+ 0x80086760:("Math_FTanF",),
+ 0x80086794:("Math_FFloorF",),
+ 0x800867B4:("Math_FCeilF",),
+ 0x800867D4:("Math_FRoundF",),
+ 0x800867F4:("Math_FTruncF",),
+ 0x80086814:("Math_FNearbyIntF",),
+ 0x80086834:("Math_FAtanTaylorQF",),
+ 0x80086880:("Math_FAtanTaylorF",),
+ 0x800869A4:("Math_FAtanContFracF",),
+ 0x80086AF0:("Math_FAtanF",),
+ 0x80086B30:("Math_FAtan2F",),
+ 0x80086C18:("Math_FAsinF",),
+ 0x80086C48:("Math_FAcosF",),
+ 0x80086C70:("floorf",),
+ 0x80086C7C:("floor",),
+ 0x80086C88:("lfloorf",),
+ 0x80086C98:("lfloor",),
+ 0x80086CA8:("ceilf",),
+ 0x80086CB4:("ceil",),
+ 0x80086CC0:("lceilf",),
+ 0x80086CD0:("lceil",),
+ 0x80086CE0:("truncf",),
+ 0x80086CEC:("trunc",),
+ 0x80086CF8:("ltruncf",),
+ 0x80086D08:("ltrunc",),
+ 0x80086D18:("nearbyintf",),
+ 0x80086D24:("nearbyint",),
+ 0x80086D30:("lnearbyintf",),
+ 0x80086D40:("lnearbyint",),
+ 0x80086D50:("roundf",),
+ 0x80086D6C:("round",),
+ 0x80086D8C:("lroundf",),
+ 0x80086DAC:("lround",),
0x80086DD0:("SystemArena_Malloc",),
0x80086DF8:("SystemArena_MallocR",),
0x80086E20:("SystemArena_Realloc",),
@@ -206,7 +206,7 @@
0x80086E78:("SystemArena_Calloc",),
0x80086ECC:("SystemArena_GetSizes",),
0x80086F04:("SystemArena_CheckArena",),
- 0x80086F28:("SystemArena_InitArena",),
+ 0x80086F28:("SystemArena_Init",),
0x80086F58:("SystemArena_Cleanup",),
0x80086F7C:("SystemArena_IsInitialized",),
0x80086FA0:("Rand_Next",),
@@ -696,10 +696,10 @@
0x800B5E68:("TitleCard_Update",),
0x800B5F24:("TitleCard_Draw",),
0x800B6434:("func_800B6434",),
- 0x800B6468:("func_800B6468",),
- 0x800B6474:("func_800B6474",),
- 0x800B648C:("func_800B648C",),
- 0x800B64FC:("func_800B64FC",),
+ 0x800B6468:("Actor_InitPlayerImpact",),
+ 0x800B6474:("Actor_UpdatePlayerImpact",),
+ 0x800B648C:("Actor_SetPlayerImpact",),
+ 0x800B64FC:("Actor_GetPlayerImpact",),
0x800B6584:("func_800B6584",),
0x800B6608:("func_800B6608",),
0x800B6680:("func_800B6680",),
@@ -743,7 +743,7 @@
0x800B7170:("Actor_SetCameraHorseSetting",),
0x800B71DC:("Actor_MountHorse",),
0x800B7200:("func_800B7200",),
- 0x800B722C:("func_800B722C",),
+ 0x800B722C:("Actor_SpawnHorse",),
0x800B724C:("func_800B724C",),
0x800B7298:("func_800B7298",),
0x800B72E0:("func_800B72E0",),
@@ -859,9 +859,9 @@
0x800BC5B8:("Actor_IsTargeted",),
0x800BC5EC:("Actor_OtherIsTargeted",),
0x800BC620:("func_800BC620",),
- 0x800BC770:("Actor_AddQuake",),
- 0x800BC7D8:("Actor_AddQuakeWithSpeed",),
- 0x800BC848:("func_800BC848",),
+ 0x800BC770:("Actor_RequestQuake",),
+ 0x800BC7D8:("Actor_RequestQuakeWithSpeed",),
+ 0x800BC848:("Actor_RequestQuakeAndRumble",),
0x800BC8B8:("Actor_DrawDoorLock",),
0x800BCB50:("Actor_SpawnShieldParticlesMetal",),
0x800BCB70:("Actor_SetColorFilter",),
@@ -1016,18 +1016,18 @@
0x800C6098:("DynaPoly_Alloc",),
0x800C6188:("DynaPoly_SetBgActor",),
0x800C6248:("DynaPoly_GetActor",),
- 0x800C62BC:("func_800C62BC",),
- 0x800C6314:("func_800C6314",),
- 0x800C636C:("func_800C636C",),
- 0x800C63C4:("func_800C63C4",),
- 0x800C641C:("func_800C641C",),
- 0x800C6474:("func_800C6474",),
+ 0x800C62BC:("DynaPoly_DisableCollision",),
+ 0x800C6314:("DynaPoly_EnableCollision",),
+ 0x800C636C:("DynaPoly_DisableCeilingCollision",),
+ 0x800C63C4:("DynaPoly_EnableCeilingCollision",),
+ 0x800C641C:("DynaPoly_DisableFloorCollision",),
+ 0x800C6474:("DynaPoly_EnableFloorCollision",),
0x800C64CC:("DynaPoly_DeleteBgActor",),
- 0x800C6554:("func_800C6554",),
+ 0x800C6554:("DynaPoly_InvalidateLookup",),
0x800C656C:("BgCheck_CalcWaterboxDimensions",),
- 0x800C6838:("DynaPoly_ExpandSRT",),
- 0x800C734C:("BgCheck_ResetFlagsIfLoadedActor",),
- 0x800C73E4:("DynaPoly_Setup",),
+ 0x800C6838:("DynaPoly_AddBgActorToLookup",),
+ 0x800C734C:("DynaPoly_UnsetAllInteractFlags",),
+ 0x800C73E4:("DynaPoly_UpdateContext",),
0x800C756C:("func_800C756C",),
0x800C765C:("DynaPoly_UpdateBgActorTransforms",),
0x800C76EC:("BgCheck_RaycastFloorDynaList",),
@@ -1055,21 +1055,21 @@
0x800C98CC:("BgCheck_GetBgCamFuncDataImpl",),
0x800C9924:("BgCheck_GetBgCamFuncData",),
0x800C99AC:("SurfaceType_GetSceneExitIndex",),
- 0x800C99D4:("func_800C99D4",),
+ 0x800C99D4:("SurfaceType_GetFloorType",),
0x800C99FC:("func_800C99FC",),
- 0x800C9A24:("func_800C9A24",),
- 0x800C9A4C:("func_800C9A4C",),
- 0x800C9A7C:("func_800C9A7C",),
- 0x800C9AB0:("func_800C9AB0",),
- 0x800C9AE4:("func_800C9AE4",),
- 0x800C9B18:("func_800C9B18",),
- 0x800C9B40:("func_800C9B40",),
- 0x800C9B68:("func_800C9B68",),
+ 0x800C9A24:("SurfaceType_GetWallType",),
+ 0x800C9A4C:("SurfaceType_GetWallFlags",),
+ 0x800C9A7C:("SurfaceType_CheckWallFlag0",),
+ 0x800C9AB0:("SurfaceType_CheckWallFlag1",),
+ 0x800C9AE4:("SurfaceType_CheckWallFlag2",),
+ 0x800C9B18:("SurfaceType_GetFloorProperty2",),
+ 0x800C9B40:("SurfaceType_GetFloorProperty",),
+ 0x800C9B68:("SurfaceType_IsSoft",),
0x800C9B90:("SurfaceType_IsHorseBlocked",),
- 0x800C9BB8:("func_800C9BB8",),
- 0x800C9BDC:("SurfaceType_GetSfx",),
- 0x800C9C24:("func_800C9C24",),
- 0x800C9C74:("SurfaceType_GetSlope",),
+ 0x800C9BB8:("SurfaceType_GetMaterial",),
+ 0x800C9BDC:("SurfaceType_GetSfxOffset",),
+ 0x800C9C24:("SurfaceType_HasMaterialProperty",),
+ 0x800C9C74:("SurfaceType_GetFloorEffect",),
0x800C9C9C:("SurfaceType_GetLightSettingIndex",),
0x800C9CC4:("SurfaceType_GetEcho",),
0x800C9CEC:("SurfaceType_IsHookshotSurface",),
@@ -1092,39 +1092,39 @@
0x800CA6F0:("func_800CA6F0",),
0x800CA9D0:("func_800CA9D0",),
0x800CAA14:("func_800CAA14",),
- 0x800CAAD0:("BgCheck2_UpdateActorPosition",),
- 0x800CAC0C:("BgCheck2_UpdateActorYRotation",),
- 0x800CACA0:("BgCheck2_AttachToMesh",),
- 0x800CAD2C:("BgCheck2_UpdateActorAttachedToMesh",),
+ 0x800CAAD0:("DynaPolyActor_UpdateCarriedActorPos",),
+ 0x800CAC0C:("DynaPolyActor_UpdateCarriedActorRotY",),
+ 0x800CACA0:("DynaPolyActor_AttachCarriedActor",),
+ 0x800CAD2C:("DynaPolyActor_TransformCarriedActor",),
0x800CAE10:("DynaPolyActor_Init",),
0x800CAE34:("DynaPolyActor_LoadMesh",),
- 0x800CAE7C:("DynaPolyActor_ResetState",),
- 0x800CAE88:("DynaPolyActor_SetRidingFallingState",),
- 0x800CAE9C:("DynaPolyActor_SetRidingMovingState",),
- 0x800CAEB0:("DynaPolyActor_SetRidingMovingStateByIndex",),
- 0x800CAEE0:("DynaPolyActor_SetRidingRotatingState",),
- 0x800CAEF4:("DynaPolyActor_SetRidingRotatingStateByIndex",),
- 0x800CAF24:("DynaPolyActor_SetSwitchPressedState",),
- 0x800CAF38:("DynaPolyActor_SetHeavySwitchPressedState",),
- 0x800CAF4C:("DynaPolyActor_IsInRidingFallingState",),
- 0x800CAF70:("DynaPolyActor_IsInRidingMovingState",),
- 0x800CAF94:("DynaPolyActor_IsInRidingRotatingState",),
- 0x800CAFB8:("DynaPolyActor_IsInSwitchPressedState",),
- 0x800CAFDC:("DynaPolyActor_IsInHeavySwitchPressedState",),
+ 0x800CAE7C:("DynaPolyActor_UnsetAllInteractFlags",),
+ 0x800CAE88:("DynaPolyActor_SetActorOnTop",),
+ 0x800CAE9C:("DynaPolyActor_SetPlayerOnTop",),
+ 0x800CAEB0:("DynaPoly_SetPlayerOnTop",),
+ 0x800CAEE0:("DynaPolyActor_SetPlayerAbove",),
+ 0x800CAEF4:("DynaPoly_SetPlayerAbove",),
+ 0x800CAF24:("DynaPolyActor_SetActorOnSwitch",),
+ 0x800CAF38:("DynaPolyActor_SetActorOnHeavySwitch",),
+ 0x800CAF4C:("DynaPolyActor_IsActorOnTop",),
+ 0x800CAF70:("DynaPolyActor_IsPlayerOnTop",),
+ 0x800CAF94:("DynaPolyActor_IsPlayerAbove",),
+ 0x800CAFB8:("DynaPolyActor_IsSwitchPressed",),
+ 0x800CAFDC:("DynaPolyActor_IsHeavySwitchPressed",),
0x800CB000:("DynaPolyActor_ValidateMove",),
0x800CB210:("Camera_fabsf",),
0x800CB240:("Camera_Vec3fMagnitude",),
0x800CB270:("Camera_QuadraticAttenuation",),
- 0x800CB330:("Camera_LerpCeilF",),
- 0x800CB398:("Camera_LerpCeilS",),
- 0x800CB42C:("Camera_LerpFloorS",),
- 0x800CB4C0:("Camera_LerpCeilVec3f",),
+ 0x800CB330:("Camera_ScaledStepToCeilF",),
+ 0x800CB398:("Camera_ScaledStepToCeilS",),
+ 0x800CB42C:("Camera_ScaledStepToFloorS",),
+ 0x800CB4C0:("Camera_ScaledStepToCeilVec3f",),
0x800CB544:("Camera_SetUpdateRatesFastPitch",),
0x800CB584:("Camera_SetUpdateRatesFastYaw",),
0x800CB5DC:("Camera_SetUpdateRatesSlow",),
0x800CB60C:("Camera_Vec3sToVec3f",),
0x800CB674:("Camera_AngleDiffAndScale",),
- 0x800CB6C8:("Camera_UpdateAtActorOffset",),
+ 0x800CB6C8:("Camera_SetFocalActorAtOffset",),
0x800CB700:("Camera_GetFocalActorHeight",),
0x800CB780:("Camera_GetRunSpeedLimit",),
0x800CB7CC:("func_800CB7CC",),
@@ -1147,41 +1147,41 @@
0x800CBC30:("func_800CBC30",),
0x800CBC84:("func_800CBC84",),
0x800CBFA4:("func_800CBFA4",),
- 0x800CC000:("func_800CC000",),
- 0x800CC128:("func_800CC128",),
- 0x800CC1C4:("func_800CC1C4",),
+ 0x800CC000:("Camera_BgCheckInfo",),
+ 0x800CC128:("Camera_BgCheck",),
+ 0x800CC1C4:("Camera_CheckOOB",),
0x800CC260:("func_800CC260",),
- 0x800CC488:("func_800CC488",),
- 0x800CC56C:("func_800CC56C",),
- 0x800CC5C8:("func_800CC5C8",),
+ 0x800CC488:("Camera_GetFloorYNorm",),
+ 0x800CC56C:("Camera_GetFloorY",),
+ 0x800CC5C8:("Camera_GetFloorYLayer",),
0x800CC740:("Camera_GetBgCamOrActorCsCamSetting",),
0x800CC7A8:("Camera_GetBgCamOrActorCsCamFuncData",),
0x800CC804:("Camera_GetBgCamIndex",),
0x800CC874:("Camera_GetWaterBoxBgCamSetting",),
0x800CC938:("func_800CC938",),
- 0x800CC958:("func_800CC958",),
- 0x800CC9C0:("func_800CC9C0",),
+ 0x800CC958:("Camera_CalcXZAngle",),
+ 0x800CC9C0:("Camera_GetPitchAdjFromFloorHeightDiffs",),
0x800CCCEC:("func_800CCCEC",),
- 0x800CD04C:("func_800CD04C",),
- 0x800CD288:("func_800CD288",),
- 0x800CD2E0:("func_800CD2E0",),
- 0x800CD2F0:("func_800CD2F0",),
- 0x800CD3E4:("func_800CD3E4",),
+ 0x800CD04C:("Camera_CalcUpVec",),
+ 0x800CD288:("Camera_ClampLerpScale",),
+ 0x800CD2E0:("Camera_ResetActionFuncState",),
+ 0x800CD2F0:("Camera_UpdateInterface",),
+ 0x800CD3E4:("Camera_BgCheckCorner",),
0x800CD44C:("func_800CD44C",),
- 0x800CD634:("func_800CD634",),
+ 0x800CD634:("Camera_CalcSlopeYAdj",),
0x800CD6CC:("func_800CD6CC",),
- 0x800CD6F8:("func_800CD6F8",),
- 0x800CD834:("func_800CD834",),
- 0x800CDA14:("func_800CDA14",),
- 0x800CDB6C:("func_800CDB6C",),
- 0x800CDE6C:("func_800CDE6C",),
- 0x800CE2B8:("func_800CE2B8",),
- 0x800CE5E0:("func_800CE5E0",),
- 0x800CE79C:("func_800CE79C",),
- 0x800CE930:("func_800CE930",),
- 0x800CEAD8:("func_800CEAD8",),
- 0x800CEC38:("func_800CEC38",),
- 0x800CED90:("func_800CED90",),
+ 0x800CD6F8:("Camera_CalcAtDefault",),
+ 0x800CD834:("Camera_CalcAtForScreen",),
+ 0x800CDA14:("Camera_CalcAtForNormal1",),
+ 0x800CDB6C:("Camera_CalcAtForParallel",),
+ 0x800CDE6C:("Camera_CalcAtForFriendlyLockOn",),
+ 0x800CE2B8:("Camera_CalcAtForEnemyLockOn",),
+ 0x800CE5E0:("Camera_CalcAtForHorse",),
+ 0x800CE79C:("Camera_ClampDist1",),
+ 0x800CE930:("Camera_ClampDist2",),
+ 0x800CEAD8:("Camera_CalcDefaultPitch",),
+ 0x800CEC38:("Camera_CalcDefaultYaw",),
+ 0x800CED90:("Camera_CalcDefaultSwing",),
0x800CF3A4:("Camera_Noop",),
0x800CF3B4:("Camera_Normal1",),
0x800D0874:("Camera_Normal2",),
@@ -1253,48 +1253,48 @@
0x800DD11C:("Camera_Special7",),
0x800DD13C:("Camera_Special8",),
0x800DD5B8:("Camera_Special9",),
- 0x800DDD58:("Camera_Alloc",),
- 0x800DDDA8:("Camera_Free",),
+ 0x800DDD58:("Camera_Create",),
+ 0x800DDDA8:("Camera_Destroy",),
0x800DDDD0:("Camera_Init",),
0x800DDFE0:("func_800DDFE0",),
- 0x800DE0E0:("func_800DE0E0",),
- 0x800DE0EC:("Camera_InitPlayerSettings",),
+ 0x800DE0E0:("Camera_Stub800DE0E0",),
+ 0x800DE0EC:("Camera_InitFocalActorSettings",),
0x800DE308:("Camera_ChangeStatus",),
- 0x800DE324:("func_800DE324",),
- 0x800DE62C:("func_800DE62C",),
- 0x800DE840:("func_800DE840",),
- 0x800DE890:("func_800DE890",),
- 0x800DE954:("func_800DE954",),
+ 0x800DE324:("Camera_UpdateWater",),
+ 0x800DE62C:("Camera_EarthquakeDay3",),
+ 0x800DE840:("Camera_UpdateHotRoom",),
+ 0x800DE890:("Camera_SetSwordDistortion",),
+ 0x800DE954:("Camera_RequestGiantsMaskSetting",),
0x800DE9B0:("Camera_Update",),
0x800DF498:("func_800DF498",),
- 0x800DF4D0:("Camera_SetMode",),
+ 0x800DF4D0:("Camera_ChangeModeFlags",),
0x800DF840:("Camera_ChangeMode",),
- 0x800DF86C:("func_800DF86C",),
- 0x800DF8EC:("func_800DF8EC",),
+ 0x800DF86C:("Camera_CheckValidMode",),
+ 0x800DF8EC:("Camera_ChangeSettingFlags",),
0x800DFAC8:("Camera_ChangeSetting",),
- 0x800DFB14:("Camera_ChangeDataIdx",),
- 0x800DFC1C:("func_800DFC1C",),
- 0x800DFC40:("func_800DFC40",),
+ 0x800DFB14:("Camera_ChangeActorCsCamIndex",),
+ 0x800DFC1C:("Camera_GetInputDir",),
+ 0x800DFC40:("Camera_GetInputDirPitch",),
0x800DFC68:("Camera_GetInputDirYaw",),
0x800DFC90:("Camera_GetCamDir",),
0x800DFCB4:("Camera_GetCamDirPitch",),
0x800DFCDC:("Camera_GetCamDirYaw",),
0x800DFD04:("Camera_AddQuake",),
0x800DFD78:("Camera_SetViewParam",),
- 0x800DFEF0:("func_800DFEF0",),
- 0x800DFF18:("func_800DFF18",),
- 0x800DFF34:("func_800DFF34",),
- 0x800DFF44:("func_800DFF44",),
- 0x800DFF60:("Camera_SetFlags",),
- 0x800DFF84:("Camera_ClearFlags",),
+ 0x800DFEF0:("Camera_UnsetViewFlag",),
+ 0x800DFF18:("Camera_OverwriteStateFlags",),
+ 0x800DFF34:("Camera_ResetActionFuncStateUnused",),
+ 0x800DFF44:("Camera_SetCsParams",),
+ 0x800DFF60:("Camera_SetStateFlag",),
+ 0x800DFF84:("Camera_UnsetStateFlag",),
0x800DFFAC:("Camera_ChangeDoorCam",),
0x800E007C:("Camera_Copy",),
- 0x800E01AC:("func_800E01AC",),
+ 0x800E01AC:("Camera_IsDbgCamEnabled",),
0x800E01B8:("Camera_GetQuakeOffset",),
- 0x800E01DC:("func_800E01DC",),
- 0x800E0228:("func_800E0228",),
+ 0x800E01DC:("Camera_SetCameraData",),
+ 0x800E0228:("Camera_GetNegOne",),
0x800E0238:("func_800E0238",),
- 0x800E02AC:("Camera_SetToTrackActor",),
+ 0x800E02AC:("Camera_SetFocalActor",),
0x800E0308:("Camera_SetTargetActor",),
0x800E031C:("Camera_GetWaterYPos",),
0x800E0348:("func_800E0348",),
@@ -1533,54 +1533,54 @@
0x800E9DBC:("DebugCamera_ScreenText",),
0x800E9E94:("DebugCamera_DrawScreenText",),
0x800E9F78:("Debug_DrawText",),
- 0x800EA060:("Cutscene_Init",),
- 0x800EA0D4:("Cutscene_Start",),
- 0x800EA0EC:("Cutscene_End",),
- 0x800EA110:("Cutscene_Update1",),
- 0x800EA15C:("Cutscene_Update2",),
- 0x800EA210:("Cutscene_DoNothing",),
- 0x800EA220:("func_800EA220",),
- 0x800EA258:("func_800EA258",),
- 0x800EA2B8:("func_800EA2B8",),
- 0x800EA324:("Cutscene_Command_Misc",),
- 0x800EABAC:("Cutscene_Command_SetLighting",),
- 0x800EAC08:("Cutscene_Command_PlaySequence",),
- 0x800EAC44:("Cutscene_Command_StopSequence",),
- 0x800EAC94:("Cutscene_Command_FadeSequence",),
- 0x800EAD14:("Cutscene_Command_PlayAmbienceSequence",),
- 0x800EAD48:("func_800EAD48",),
- 0x800EAD7C:("func_800EAD7C",),
- 0x800EADB0:("func_800EADB0",),
- 0x800EAECC:("Cutscene_Command_FadeAmbienceSequence",),
- 0x800EAF20:("Cutscene_Command_Rumble",),
- 0x800EAFE0:("Cutscene_Command_FadeColorScreen",),
- 0x800EB1DC:("Cutscene_Command_SetTime",),
- 0x800EB364:("Cutscene_TerminatorImpl",),
- 0x800EB4B4:("Cutscene_Command_Terminator",),
- 0x800EB6F8:("Cutscene_Command_ChooseCreditsScenes",),
- 0x800EBB68:("Cutscene_Command_MotionBlur",),
- 0x800EBCD0:("Cutscene_Command_GiveTatlToPlayer",),
- 0x800EBD60:("Cutscene_Command_TransitionFX",),
- 0x800EC678:("Cutscene_Command_Camera",),
+ 0x800EA060:("Cutscene_InitContext",),
+ 0x800EA0D4:("Cutscene_StartManual",),
+ 0x800EA0EC:("Cutscene_StopManual",),
+ 0x800EA110:("Cutscene_UpdateManual",),
+ 0x800EA15C:("Cutscene_UpdateScripted",),
+ 0x800EA210:("CutsceneHandler_DoNothing",),
+ 0x800EA220:("Cutscene_StepTimer",),
+ 0x800EA258:("CutsceneHandler_StartManual",),
+ 0x800EA2B8:("CutsceneHandler_StartScript",),
+ 0x800EA324:("CutsceneCmd_Misc",),
+ 0x800EABAC:("CutsceneCmd_SetLightSetting",),
+ 0x800EAC08:("CutsceneCmd_StartSequence",),
+ 0x800EAC44:("CutsceneCmd_StopSequence",),
+ 0x800EAC94:("CutsceneCmd_FadeOutSequence",),
+ 0x800EAD14:("CutsceneCmd_StartAmbience",),
+ 0x800EAD48:("Cutscene_SetSfxReverbIndexTo2",),
+ 0x800EAD7C:("Cutscene_SetSfxReverbIndexTo1",),
+ 0x800EADB0:("CutsceneCmd_ModifySequence",),
+ 0x800EAECC:("CutsceneCmd_FadeOutAmbience",),
+ 0x800EAF20:("CutsceneCmd_RumbleController",),
+ 0x800EAFE0:("CutsceneCmd_TransitionGeneral",),
+ 0x800EB1DC:("CutsceneCmd_SetTime",),
+ 0x800EB364:("CutsceneCmd_DestinationDefault",),
+ 0x800EB4B4:("CutsceneCmd_Destination",),
+ 0x800EB6F8:("CutsceneCmd_ChooseCreditsScenes",),
+ 0x800EBB68:("CutsceneCmd_MotionBlur",),
+ 0x800EBCD0:("CutsceneCmd_GiveTatlToPlayer",),
+ 0x800EBD60:("CutsceneCmd_Transition",),
+ 0x800EC678:("CutsceneCmd_UpdateCamSpline",),
0x800EC6D4:("Cutscene_CountNormalMasks",),
- 0x800EC924:("Cutscene_Command_Textbox",),
- 0x800ECD7C:("func_800ECD7C",),
- 0x800ECE40:("Cutscene_ProcessCommands",),
- 0x800ED980:("func_800ED980",),
- 0x800ED9C4:("func_800ED9C4",),
- 0x800EDA04:("func_800EDA04",),
- 0x800EDA84:("func_800EDA84",),
- 0x800EDBE0:("func_800EDBE0",),
+ 0x800EC924:("CutsceneCmd_Text",),
+ 0x800ECD7C:("Cutscene_SetActorCue",),
+ 0x800ECE40:("Cutscene_ProcessScript",),
+ 0x800ED980:("CutsceneHandler_RunScript",),
+ 0x800ED9C4:("CutsceneHandler_StopManual",),
+ 0x800EDA04:("CutsceneHandler_StopScript",),
+ 0x800EDA84:("Cutscene_SetupScripted",),
+ 0x800EDBE0:("Cutscene_HandleEntranceTriggers",),
0x800EDDB0:("func_800EDDB0",),
0x800EDDBC:("func_800EDDBC",),
- 0x800EDDCC:("Cutscene_LoadCutsceneData",),
+ 0x800EDDCC:("Cutscene_StartScripted",),
0x800EDE34:("Cutscene_ActorTranslate",),
0x800EDF24:("Cutscene_ActorTranslateAndYaw",),
0x800EDF78:("Cutscene_ActorTranslateAndYawSmooth",),
0x800EE0CC:("Cutscene_ActorTranslateXZAndYawSmooth",),
0x800EE1D8:("Cutscene_GetSceneLayer",),
- 0x800EE200:("Cutscene_GetActorActionIndex",),
- 0x800EE29C:("Cutscene_CheckActorAction",),
+ 0x800EE200:("Cutscene_GetCueChannel",),
+ 0x800EE29C:("Cutscene_IsCueInChannel",),
0x800EE2F4:("Cutscene_IsPlaying",),
0x800EE320:("GetItem_Draw",),
0x800EE364:("GetItem_DrawBombchu",),
@@ -1632,35 +1632,35 @@
0x800F10AC:("EnHy_UpdateCollider",),
0x800F112C:("EnHy_PlayWalkingSound",),
0x800F1250:("Text_GetFaceReaction",),
- 0x800F12D0:("EnvFlags_UnsetAll",),
- 0x800F1304:("EnvFlags_Set",),
- 0x800F1374:("EnvFlags_Unset",),
- 0x800F13E8:("EnvFlags_Get",),
- 0x800F1460:("func_800F1460",),
- 0x800F14F8:("ActorCutscene_GetCutsceneImpl",),
- 0x800F1544:("ActorCutscene_Init",),
- 0x800F15D8:("func_800F15D8",),
- 0x800F1648:("ActorCutscene_ClearWaiting",),
- 0x800F1678:("ActorCutscene_ClearNextCutscenes",),
- 0x800F16A8:("ActorCutscene_MarkNextCutscenes",),
- 0x800F17FC:("ActorCutscene_End",),
- 0x800F1A7C:("ActorCutscene_Update",),
- 0x800F1BA4:("ActorCutscene_SetIntentToPlay",),
- 0x800F1BE4:("ActorCutscene_GetCanPlayNext",),
- 0x800F1C68:("ActorCutscene_StartAndSetUnkLinkFields",),
- 0x800F1CE0:("ActorCutscene_StartAndSetFlag",),
- 0x800F1D84:("ActorCutscene_Start",),
- 0x800F1FBC:("ActorCutscene_Stop",),
- 0x800F207C:("ActorCutscene_GetCurrentIndex",),
- 0x800F208C:("ActorCutscene_GetCutscene",),
- 0x800F20B8:("ActorCutscene_GetAdditionalCutscene",),
- 0x800F20F8:("ActorCutscene_GetLength",),
- 0x800F2138:("func_800F2138",),
- 0x800F2178:("func_800F2178",),
- 0x800F21B8:("ActorCutscene_GetCurrentSubCamId",),
- 0x800F21CC:("func_800F21CC",),
+ 0x800F12D0:("CutsceneFlags_UnsetAll",),
+ 0x800F1304:("CutsceneFlags_Set",),
+ 0x800F1374:("CutsceneFlags_Unset",),
+ 0x800F13E8:("CutsceneFlags_Get",),
+ 0x800F1460:("CutsceneManager_SetHudVisibility",),
+ 0x800F14F8:("CutsceneManager_GetCutsceneEntryImpl",),
+ 0x800F1544:("CutsceneManager_Init",),
+ 0x800F15D8:("CutsceneManager_StoreCamera",),
+ 0x800F1648:("CutsceneManager_ClearWaiting",),
+ 0x800F1678:("CutsceneManager_ClearNextCutscenes",),
+ 0x800F16A8:("CutsceneManager_MarkNextCutscenes",),
+ 0x800F17FC:("CutsceneManager_End",),
+ 0x800F1A7C:("CutsceneManager_Update",),
+ 0x800F1BA4:("CutsceneManager_Queue",),
+ 0x800F1BE4:("CutsceneManager_IsNext",),
+ 0x800F1C68:("CutsceneManager_StartWithPlayerCs",),
+ 0x800F1CE0:("CutsceneManager_StartWithPlayerCsAndSetFlag",),
+ 0x800F1D84:("CutsceneManager_Start",),
+ 0x800F1FBC:("CutsceneManager_Stop",),
+ 0x800F207C:("CutsceneManager_GetCurrentCsId",),
+ 0x800F208C:("CutsceneManager_GetCutsceneEntry",),
+ 0x800F20B8:("CutsceneManager_GetAdditionalCsId",),
+ 0x800F20F8:("CutsceneManager_GetLength",),
+ 0x800F2138:("CutsceneManager_GetCutsceneScriptIndex",),
+ 0x800F2178:("CutsceneManager_GetCutsceneCustomValue",),
+ 0x800F21B8:("CutsceneManager_GetCurrentSubCamId",),
+ 0x800F21CC:("CutsceneManager_FindEntranceCsId",),
0x800F22C4:("func_800F22C4",),
- 0x800F23C4:("ActorCutscene_SetReturnCamera",),
+ 0x800F23C4:("CutsceneManager_SetReturnCamera",),
0x800F23E0:("Curve_CubicHermiteSpline",),
0x800F2478:("Curve_Interpolate",),
0x800F2620:("SkelCurve_Clear",),
@@ -1683,16 +1683,16 @@
0x800F37B0:("FireObj_Destroy",),
0x800F37F0:("FireObj_SetState2",),
0x800F3820:("FireObj_Update",),
- 0x800F3940:("func_800F3940",),
- 0x800F39B4:("func_800F39B4",),
- 0x800F3A64:("func_800F3A64",),
- 0x800F3B2C:("func_800F3B2C",),
- 0x800F3B68:("func_800F3B68",),
- 0x800F3C44:("func_800F3C44",),
- 0x800F3ED4:("func_800F3ED4",),
- 0x800F40A0:("func_800F40A0",),
- 0x800F415C:("func_800F415C",),
- 0x800F41E4:("func_800F41E4",),
+ 0x800F3940:("Horse_GetJumpingFencePathIndex",),
+ 0x800F39B4:("Horse_CopyPointFromPathList",),
+ 0x800F3A64:("Horse_IsValidSpawn",),
+ 0x800F3B2C:("Horse_ResetHorseData",),
+ 0x800F3B68:("Horse_IsValidSceneLayer",),
+ 0x800F3C44:("Horse_SpawnOverworld",),
+ 0x800F3ED4:("Horse_SpawnMinigame",),
+ 0x800F40A0:("Horse_Spawn",),
+ 0x800F415C:("Horse_RotateToPoint",),
+ 0x800F41E4:("Horse_IsActive",),
0x800F42A0:("Jpeg_ScheduleDecoderTask",),
0x800F43BC:("Jpeg_CopyToZbuffer",),
0x800F44F4:("Jpeg_GetUnalignedU16",),
@@ -1707,7 +1707,7 @@
0x800F4FC0:("Font_LoadMessageBoxEndIcon",),
0x800F5004:("Font_LoadOrderedFont",),
0x800F5090:("func_800F5090",),
- 0x800F50D4:("func_800F50D4",),
+ 0x800F50D4:("Environment_ZBufValToFixedPoint",),
0x800F510C:("Environment_Init",),
0x800F5954:("func_800F5954",),
0x800F5A8C:("Environment_LerpWeight",),
@@ -2072,17 +2072,17 @@
0x8010C36C:("OLib_ClampMaxDist",),
0x8010C3D4:("OLib_Vec3fDistNormalize",),
0x8010C484:("OLib_VecSphToVec3f",),
- 0x8010C530:("OLib_VecSphGeoToVec3f",),
+ 0x8010C530:("OLib_VecGeoToVec3f",),
0x8010C574:("OLib_Vec3fToVecSph",),
- 0x8010C6C8:("OLib_Vec3fToVecSphGeo",),
+ 0x8010C6C8:("OLib_Vec3fToVecGeo",),
0x8010C710:("OLib_Vec3fDiffToVecSph",),
- 0x8010C764:("OLib_Vec3fDiffToVecSphGeo",),
- 0x8010C7B8:("OLib_VecSphAddToVec3f",),
+ 0x8010C764:("OLib_Vec3fDiffToVecGeo",),
+ 0x8010C7B8:("OLib_AddVecGeoToVec3f",),
0x8010C838:("OLib_Vec3fDiffRad",),
0x8010C8C8:("OLib_Vec3fDiffDegF",),
0x8010C930:("OLib_Vec3fDiffBinAng",),
- 0x8010C9C8:("OLib_DbCameraVec3fDiff",),
- 0x8010CAA0:("OLib_DbCameraVec3fSum",),
+ 0x8010C9C8:("OLib_Vec3fDiff",),
+ 0x8010CAA0:("OLib_Vec3fAdd",),
0x8010CB80:("Gfx_DrawTexRectRGBA16",),
0x8010CD98:("Gfx_DrawTexRectIA8",),
0x8010CFBC:("Gfx_DrawTexRectIA8_DropShadow",),
@@ -2221,23 +2221,23 @@
0x80124088:("Player_IsHoldingMirrorShield",),
0x801240C8:("Player_IsHoldingHookshot",),
0x801240DC:("func_801240DC",),
- 0x80124110:("func_80124110",),
- 0x80124148:("func_80124148",),
- 0x80124168:("Player_ActionToMeleeWeapon",),
+ 0x80124110:("Player_BButtonSwordFromIA",),
+ 0x80124148:("Player_GetHeldBButtonSword",),
+ 0x80124168:("Player_MeleeWeaponFromIA",),
0x80124190:("Player_GetMeleeWeaponHeld",),
0x801241B4:("Player_IsHoldingTwoHandedWeapon",),
- 0x801241E0:("Player_ActionToBottle",),
+ 0x801241E0:("Player_BottleFromIA",),
0x8012420C:("Player_GetBottleHeld",),
- 0x8012422C:("Player_ActionToExplosive",),
+ 0x8012422C:("Player_ExplosiveFromIA",),
0x80124258:("Player_GetExplosiveHeld",),
- 0x80124278:("Player_ActionToSword",),
+ 0x80124278:("Player_SwordFromIA",),
0x801242B4:("func_801242B4",),
0x801242DC:("Player_GetEnvironmentalHazard",),
- 0x80124420:("func_80124420",),
+ 0x80124420:("Player_UpdateBunnyEars",),
0x80124618:("func_80124618",),
0x801246F4:("Player_DrawImpl",),
- 0x80124870:("func_80124870",),
- 0x80124CC4:("func_80124CC4",),
+ 0x80124870:("Player_AdjustSingleLeg",),
+ 0x80124CC4:("Player_DrawHookshotReticle",),
0x80124F18:("func_80124F18",),
0x80124FF0:("func_80124FF0",),
0x801251C4:("func_801251C4",),
@@ -2246,13 +2246,13 @@
0x8012536C:("func_8012536C",),
0x801253A4:("Player_DrawZoraShield",),
0x80125500:("func_80125500",),
- 0x80125580:("func_80125580",),
+ 0x80125580:("Player_OverrideLimbDrawGameplayCommon",),
0x80125CE0:("func_80125CE0",),
- 0x80125D4C:("func_80125D4C",),
- 0x801262C8:("func_801262C8",),
- 0x801263FC:("func_801263FC",),
+ 0x80125D4C:("Player_OverrideLimbDrawGameplayDefault",),
+ 0x801262C8:("Player_OverrideLimbDrawGameplayFirstPerson",),
+ 0x801263FC:("Player_OverrideLimbDrawGameplayCrawling",),
0x80126440:("func_80126440",),
- 0x801265C8:("func_801265C8",),
+ 0x801265C8:("Player_UpdateShieldCollider",),
0x8012669C:("func_8012669C",),
0x80126808:("Player_DrawGetItemImpl",),
0x8012697C:("Player_DrawGetItem",),
@@ -2267,13 +2267,13 @@
0x801278F8:("Player_DrawBlastMask",),
0x80127A60:("Player_DrawBunnyHood",),
0x80127B64:("func_80127B64",),
- 0x80127BE8:("func_80127BE8",),
+ 0x80127BE8:("Player_DrawStrayFairyParticles",),
0x80127DA4:("func_80127DA4",),
0x80128388:("func_80128388",),
0x801284A0:("Player_DrawGreatFairysMask",),
0x80128640:("func_80128640",),
- 0x80128B74:("func_80128B74",),
- 0x80128BD0:("func_80128BD0",),
+ 0x80128B74:("Player_SetFeetPos",),
+ 0x80128BD0:("Player_PostLimbDrawGameplay",),
0x80129EF0:("PreNMI_Stop",),
0x80129F04:("PreNMI_Update",),
0x80129F4C:("PreNMI_Draw",),
@@ -2289,97 +2289,97 @@
0x8012A4D0:("Quake_CallbackType2",),
0x8012A540:("Quake_CallbackType4",),
0x8012A5D8:("Quake_GetFreeIndex",),
- 0x8012A638:("Quake_AddImpl",),
- 0x8012A6F0:("Quake_RemoveRequest",),
+ 0x8012A638:("Quake_RequestImpl",),
+ 0x8012A6F0:("Quake_Remove",),
0x8012A718:("Quake_GetRequest",),
0x8012A774:("Quake_SetValue",),
0x8012A8A8:("Quake_SetSpeed",),
- 0x8012A8F0:("Quake_SetCountdown",),
- 0x8012A940:("Quake_GetCountdown",),
- 0x8012A978:("Quake_SetQuakeValues",),
- 0x8012A9E0:("Quake_SetQuakeValues2",),
+ 0x8012A8F0:("Quake_SetDuration",),
+ 0x8012A940:("Quake_GetTimeLeft",),
+ 0x8012A978:("Quake_SetPerturbations",),
+ 0x8012A9E0:("Quake_SetOrientation",),
0x8012AA48:("Quake_Init",),
- 0x8012AA9C:("Quake_Add",),
- 0x8012AAC0:("Quake_Remove",),
- 0x8012AB08:("Quake_Calc",),
+ 0x8012AA9C:("Quake_Request",),
+ 0x8012AAC0:("Quake_RemoveRequest",),
+ 0x8012AB08:("Quake_Update",),
0x8012AE68:("Distortion_Init",),
- 0x8012AEAC:("Distortion_SetCountdown",),
- 0x8012AED4:("Distortion_GetCountdown",),
+ 0x8012AEAC:("Distortion_SetDuration",),
+ 0x8012AED4:("Distortion_GetTimeLeft",),
0x8012AEE4:("Distortion_GetType",),
- 0x8012AEF4:("Distortion_SetType",),
- 0x8012AF18:("Distortion_ClearType",),
+ 0x8012AEF4:("Distortion_Request",),
+ 0x8012AF18:("Distortion_RemoveRequest",),
0x8012AF38:("Distortion_GetUnderwaterCurrentSpeed",),
0x8012AF9C:("Distortion_Update",),
- 0x8012BBE8:("Quake_NumActiveQuakes",),
+ 0x8012BBE8:("Quake_GetNumActiveQuakes",),
0x8012BC50:("Gfx_SetFog",),
0x8012BD8C:("Gfx_SetFogWithSync",),
0x8012BF08:("Gfx_SetFog2",),
- 0x8012BF3C:("Gfx_CallSetupDLImpl",),
- 0x8012BF78:("Gfx_CallSetupDL",),
- 0x8012BF98:("Gfx_CallSetupDLAtPtr",),
- 0x8012BFC4:("func_8012BFC4",),
- 0x8012BFEC:("func_8012BFEC",),
- 0x8012C014:("func_8012C014",),
- 0x8012C058:("func_8012C058",),
- 0x8012C080:("func_8012C080",),
- 0x8012C0A8:("func_8012C0A8",),
- 0x8012C0D0:("func_8012C0D0",),
- 0x8012C0F8:("func_8012C0F8",),
- 0x8012C120:("func_8012C120",),
- 0x8012C148:("func_8012C148",),
- 0x8012C170:("func_8012C170",),
- 0x8012C198:("func_8012C198",),
- 0x8012C1C0:("func_8012C1C0",),
- 0x8012C1EC:("func_8012C1EC",),
- 0x8012C214:("func_8012C214",),
- 0x8012C240:("func_8012C240",),
+ 0x8012BF3C:("Gfx_SetupDLImpl",),
+ 0x8012BF78:("Gfx_SetupDL",),
+ 0x8012BF98:("Gfx_SetupDLAtPtr",),
+ 0x8012BFC4:("Gfx_SetupDL57",),
+ 0x8012BFEC:("Gfx_SetupDL57_b",),
+ 0x8012C014:("Gfx_SetupDL52_NoCD",),
+ 0x8012C058:("Gfx_SetupDL58_Opa",),
+ 0x8012C080:("Gfx_SetupDL57_Opa",),
+ 0x8012C0A8:("Gfx_SetupDL50_Opa",),
+ 0x8012C0D0:("Gfx_SetupDL51_Opa",),
+ 0x8012C0F8:("Gfx_SetupDL52_Xlu",),
+ 0x8012C120:("Gfx_SetupDL53_Opa",),
+ 0x8012C148:("Gfx_SetupDL54_Opa",),
+ 0x8012C170:("Gfx_SetupDL55_Xlu",),
+ 0x8012C198:("Gfx_SetupDL26",),
+ 0x8012C1C0:("Gfx_SetupDL26_Opa",),
+ 0x8012C1EC:("Gfx_SetupDL23",),
+ 0x8012C214:("Gfx_SetupDL23_Opa",),
+ 0x8012C240:("Gfx_SetupDL25_Xlu2",),
0x8012C268:("func_8012C268",),
- 0x8012C28C:("func_8012C28C",),
- 0x8012C2B4:("func_8012C2B4",),
- 0x8012C2DC:("func_8012C2DC",),
- 0x8012C304:("func_8012C304",),
- 0x8012C32C:("func_8012C32C",),
- 0x8012C354:("func_8012C354",),
- 0x8012C37C:("func_8012C37C",),
- 0x8012C3A4:("func_8012C3A4",),
- 0x8012C3CC:("func_8012C3CC",),
- 0x8012C3F4:("func_8012C3F4",),
- 0x8012C420:("func_8012C420",),
- 0x8012C448:("func_8012C448",),
- 0x8012C470:("func_8012C470",),
- 0x8012C498:("func_8012C498",),
- 0x8012C4C0:("func_8012C4C0",),
- 0x8012C4E8:("func_8012C4E8",),
- 0x8012C510:("func_8012C510",),
- 0x8012C538:("func_8012C538",),
- 0x8012C560:("func_8012C560",),
- 0x8012C588:("func_8012C588",),
- 0x8012C5B0:("func_8012C5B0",),
- 0x8012C5D8:("func_8012C5D8",),
- 0x8012C600:("func_8012C600",),
- 0x8012C628:("func_8012C628",),
- 0x8012C654:("func_8012C654",),
- 0x8012C680:("func_8012C680",),
- 0x8012C6AC:("func_8012C6AC",),
- 0x8012C6D4:("func_8012C6D4",),
- 0x8012C6FC:("func_8012C6FC",),
- 0x8012C724:("func_8012C724",),
- 0x8012C74C:("func_8012C74C",),
- 0x8012C774:("func_8012C774",),
- 0x8012C7B8:("func_8012C7B8",),
- 0x8012C7FC:("func_8012C7FC",),
- 0x8012C840:("func_8012C840",),
- 0x8012C868:("func_8012C868",),
- 0x8012C8AC:("func_8012C8AC",),
- 0x8012C8D4:("func_8012C8D4",),
- 0x8012C8FC:("func_8012C8FC",),
- 0x8012C924:("func_8012C924",),
- 0x8012C94C:("func_8012C94C",),
- 0x8012C974:("func_8012C974",),
- 0x8012C9BC:("func_8012C9BC",),
- 0x8012C9E4:("func_8012C9E4",),
- 0x8012CA0C:("func_8012CA0C",),
- 0x8012CA38:("func_8012CA38",),
+ 0x8012C28C:("Gfx_SetupDL25_Opa",),
+ 0x8012C2B4:("Gfx_SetupDL71",),
+ 0x8012C2DC:("Gfx_SetupDL25_Xlu",),
+ 0x8012C304:("Gfx_SetupDL72",),
+ 0x8012C32C:("Gfx_SetupDL31_Opa",),
+ 0x8012C354:("Gfx_SetupDL32_Opa",),
+ 0x8012C37C:("Gfx_SetupDL33_Opa",),
+ 0x8012C3A4:("Gfx_SetupDL64",),
+ 0x8012C3CC:("Gfx_SetupDL34",),
+ 0x8012C3F4:("Gfx_SetupDL34_Opa",),
+ 0x8012C420:("Gfx_SetupDL35_Opa",),
+ 0x8012C448:("Gfx_SetupDL44_Xlu",),
+ 0x8012C470:("Gfx_SetupDL36_Opa",),
+ 0x8012C498:("Gfx_SetupDL28",),
+ 0x8012C4C0:("Gfx_SetupDL28_Opa",),
+ 0x8012C4E8:("Gfx_SetupDL43_Opa",),
+ 0x8012C510:("Gfx_SetupDL45_Opa",),
+ 0x8012C538:("Gfx_SetupDL46_Overlay",),
+ 0x8012C560:("Gfx_SetupDL38_Xlu",),
+ 0x8012C588:("Gfx_SetupDL4_Xlu",),
+ 0x8012C5B0:("Gfx_SetupDL37_Opa",),
+ 0x8012C5D8:("Gfx_SetupDL2_Opa",),
+ 0x8012C600:("Gfx_SetupDL39",),
+ 0x8012C628:("Gfx_SetupDL39_Opa",),
+ 0x8012C654:("Gfx_SetupDL39_Overlay",),
+ 0x8012C680:("Gfx_SetupDL39_Ptr",),
+ 0x8012C6AC:("Gfx_SetupDL40_Opa",),
+ 0x8012C6D4:("Gfx_SetupDL41_Opa",),
+ 0x8012C6FC:("Gfx_SetupDL47_Xlu",),
+ 0x8012C724:("Gfx_SetupDL66",),
+ 0x8012C74C:("Gfx_SetupDL67",),
+ 0x8012C774:("Gfx_SetupDL68_NoCD",),
+ 0x8012C7B8:("Gfx_SetupDL69_NoCD",),
+ 0x8012C7FC:("Gfx_SetupDL65_NoCD",),
+ 0x8012C840:("Gfx_SetupDL70",),
+ 0x8012C868:("Gfx_SetupDL20_NoCD",),
+ 0x8012C8AC:("Gfx_SetupDL42_Opa",),
+ 0x8012C8D4:("Gfx_SetupDL42_Overlay",),
+ 0x8012C8FC:("Gfx_SetupDL48_Opa",),
+ 0x8012C924:("Gfx_SetupDL49_Xlu",),
+ 0x8012C94C:("Gfx_SetupDL27_Xlu",),
+ 0x8012C974:("Gfx_SetupDL60_XluNoCD",),
+ 0x8012C9BC:("Gfx_SetupDL61_Xlu",),
+ 0x8012C9E4:("Gfx_SetupDL56_Opa",),
+ 0x8012CA0C:("Gfx_SetupDL56_Ptr",),
+ 0x8012CA38:("Gfx_SetupDL59_Opa",),
0x8012CA60:("Gfx_BranchTexScroll",),
0x8012CB04:("func_8012CB04",),
0x8012CB28:("func_8012CB28",),
@@ -2447,8 +2447,8 @@
0x801303E0:("Scene_CommandSoundSettings",),
0x8013043C:("Scene_CommandEchoSetting",),
0x80130454:("Scene_CommandAltHeaderList",),
- 0x801304CC:("Scene_CommandCutsceneList",),
- 0x80130500:("Scene_CommandActorCutsceneList",),
+ 0x801304CC:("Scene_CommandCutsceneScriptList",),
+ 0x80130500:("Scene_CommandCutsceneList",),
0x80130540:("Scene_CommandMiniMap",),
0x80130578:("Scene_Command1D",),
0x80130588:("Scene_CommandMiniMapCompassInfo",),
@@ -2537,9 +2537,9 @@
0x80134B54:("SkelAnime_DrawFlexLimb",),
0x80134DBC:("SkelAnime_DrawFlex",),
0x80134FFC:("SkelAnime_GetFrameDataLegacy",),
- 0x801353D4:("Animation_GetLimbCount2",),
- 0x801353F8:("Animation_GetLength2",),
- 0x8013541C:("Animation_GetLastFrame2",),
+ 0x801353D4:("Animation_GetLimbCountLegacy",),
+ 0x801353F8:("Animation_GetLengthLegacy",),
+ 0x8013541C:("Animation_GetLastFrameLegacy",),
0x80135448:("SkelAnime_InterpFrameTable",),
0x801358C8:("AnimationContext_Reset",),
0x801358D4:("AnimationContext_SetNextQueue",),
@@ -2558,29 +2558,29 @@
0x80135DB8:("AnimationContext_CopyFalse",),
0x80135E3C:("AnimationContext_MoveActor",),
0x80135EE8:("AnimationContext_Update",),
- 0x80135F88:("SkelAnime_InitLink",),
- 0x801360A8:("LinkAnimation_SetUpdateFunction",),
- 0x801360E0:("LinkAnimation_Update",),
- 0x80136104:("LinkAnimation_Morph",),
- 0x801361BC:("LinkAnimation_AnimateFrame",),
- 0x80136288:("LinkAnimation_Loop",),
- 0x8013631C:("LinkAnimation_Once",),
+ 0x80135F88:("SkelAnime_InitPlayer",),
+ 0x801360A8:("PlayerAnimation_SetUpdateFunction",),
+ 0x801360E0:("PlayerAnimation_Update",),
+ 0x80136104:("PlayerAnimation_Morph",),
+ 0x801361BC:("PlayerAnimation_AnimateFrame",),
+ 0x80136288:("PlayerAnimation_Loop",),
+ 0x8013631C:("PlayerAnimation_Once",),
0x801363F0:("Animation_SetMorph",),
- 0x80136414:("LinkAnimation_Change",),
- 0x8013658C:("LinkAnimation_PlayOnce",),
- 0x801365EC:("LinkAnimation_PlayOnceSetSpeed",),
- 0x80136650:("LinkAnimation_PlayLoop",),
- 0x801366AC:("LinkAnimation_PlayLoopSetSpeed",),
- 0x8013670C:("LinkAnimation_CopyJointToMorph",),
- 0x8013673C:("LinkAnimation_CopyMorphToJoint",),
- 0x8013676C:("LinkAnimation_LoadToMorph",),
- 0x801367B0:("LinkAnimation_LoadToJoint",),
- 0x801367F4:("LinkAnimation_InterpJointMorph",),
- 0x8013682C:("LinkAnimation_BlendToJoint",),
- 0x801368CC:("LinkAnimation_BlendToMorph",),
- 0x8013696C:("LinkAnimation_EndLoop",),
+ 0x80136414:("PlayerAnimation_Change",),
+ 0x8013658C:("PlayerAnimation_PlayOnce",),
+ 0x801365EC:("PlayerAnimation_PlayOnceSetSpeed",),
+ 0x80136650:("PlayerAnimation_PlayLoop",),
+ 0x801366AC:("PlayerAnimation_PlayLoopSetSpeed",),
+ 0x8013670C:("PlayerAnimation_CopyJointToMorph",),
+ 0x8013673C:("PlayerAnimation_CopyMorphToJoint",),
+ 0x8013676C:("PlayerAnimation_LoadToMorph",),
+ 0x801367B0:("PlayerAnimation_LoadToJoint",),
+ 0x801367F4:("PlayerAnimation_InterpJointMorph",),
+ 0x8013682C:("PlayerAnimation_BlendToJoint",),
+ 0x801368CC:("PlayerAnimation_BlendToMorph",),
+ 0x8013696C:("PlayerAnimation_EndLoop",),
0x80136990:("Animation_OnFrameImpl",),
- 0x80136A48:("LinkAnimation_OnFrame",),
+ 0x80136A48:("PlayerAnimation_OnFrame",),
0x80136A7C:("SkelAnime_Init",),
0x80136B30:("SkelAnime_InitFlex",),
0x80136BEC:("SkelAnime_InitSkin",),
@@ -2701,7 +2701,7 @@
0x8013E07C:("SubS_ActorPathing_MoveWithoutGravityReverse",),
0x8013E0A4:("SubS_ActorPathing_SetNextPoint",),
0x8013E1C8:("SubS_ChangeAnimationBySpeedInfo",),
- 0x8013E2D4:("SubS_StartActorCutscene",),
+ 0x8013E2D4:("SubS_StartCutscene",),
0x8013E3B8:("SubS_FillCutscenesList",),
0x8013E4B0:("SubS_ConstructPlane",),
0x8013E5CC:("SubS_LineSegVsPlane",),
@@ -2748,17 +2748,17 @@
0x8013FD74:("View_ApplyPerspectiveToOverlay",),
0x80140024:("View_UpdateViewingMatrix",),
0x801400CC:("View_ApplyTo",),
- 0x80140260:("func_80140260",),
- 0x8014026C:("func_8014026C",),
- 0x80140730:("func_80140730",),
- 0x80140810:("func_80140810",),
- 0x80140898:("func_80140898",),
- 0x80140900:("func_80140900",),
- 0x8014090C:("func_8014090C",),
- 0x80140970:("func_80140970",),
- 0x80140CE0:("func_80140CE0",),
- 0x80140D04:("func_80140D04",),
- 0x80140D10:("func_80140D10",),
+ 0x80140260:("ViMode_LogPrint",),
+ 0x8014026C:("ViMode_Configure",),
+ 0x80140730:("ViMode_Save",),
+ 0x80140810:("ViMode_Load",),
+ 0x80140898:("ViMode_Init",),
+ 0x80140900:("ViMode_Destroy",),
+ 0x8014090C:("ViMode_ConfigureFeatures",),
+ 0x80140970:("ViMode_Update",),
+ 0x80140CE0:("VisCvg_Init",),
+ 0x80140D04:("VisCvg_Destroy",),
+ 0x80140D10:("VisCvg_Draw",),
0x80140E80:("func_80140E80",),
0x80140EA0:("func_80140EA0",),
0x80140EAC:("func_80140EAC",),
@@ -2775,9 +2775,9 @@
0x80141C34:("VisMono_DesaturateDList",),
0x80141E60:("VisMono_Draw",),
0x8014204C:("VisMono_DrawOld",),
- 0x801420C0:("func_801420C0",),
- 0x801420F4:("func_801420F4",),
- 0x80142100:("func_80142100",),
+ 0x801420C0:("VisZbuf_Init",),
+ 0x801420F4:("VisZbuf_Destroy",),
+ 0x80142100:("VisZbuf_Draw",),
0x80142440:("func_80142440",),
0x80143148:("func_80143148",),
0x801431E8:("Skybox_Setup",),
@@ -2797,26 +2797,26 @@
0x80144684:("Sram_GenerateRandomSaveFields",),
0x80144890:("Sram_InitNewSave",),
0x80144968:("Sram_InitDebugSave",),
- 0x80144A94:("func_80144A94",),
+ 0x80144A94:("Sram_ResetSaveFromMoonCrash",),
0x80144E78:("Sram_OpenSave",),
0x8014546C:("func_8014546C",),
0x80145698:("func_80145698",),
0x801457CC:("func_801457CC",),
- 0x80146580:("func_80146580",),
- 0x80146628:("func_80146628",),
+ 0x80146580:("Sram_EraseSave",),
+ 0x80146628:("Sram_CopySave",),
0x80146AA0:("Sram_InitSave",),
- 0x80146DF8:("func_80146DF8",),
+ 0x80146DF8:("Sram_WriteSaveOptionsToBuffer",),
0x80146E40:("Sram_InitSram",),
0x80146E70:("Sram_Alloc",),
- 0x80146EBC:("func_80146EBC",),
+ 0x80146EBC:("Sram_SyncWriteToFlash",),
0x80146EE8:("Sram_SaveSpecialEnterClockTown",),
0x80146F5C:("Sram_SaveSpecialNewDay",),
- 0x80147008:("func_80147008",),
- 0x80147020:("func_80147020",),
- 0x80147068:("func_80147068",),
- 0x80147138:("func_80147138",),
- 0x80147150:("func_80147150",),
- 0x80147198:("func_80147198",),
+ 0x80147008:("Sram_SetFlashPagesDefault",),
+ 0x80147020:("Sram_StartWriteToFlashDefault",),
+ 0x80147068:("Sram_UpdateWriteToFlashDefault",),
+ 0x80147138:("Sram_SetFlashPagesOwlSave",),
+ 0x80147150:("Sram_StartWriteToFlashOwlSave",),
+ 0x80147198:("Sram_UpdateWriteToFlashOwlSave",),
0x80147314:("func_80147314",),
0x80147414:("func_80147414",),
0x8014750C:("Sram_nop8014750C",),
@@ -2855,7 +2855,7 @@
0x801518B0:("Message_StartTextbox",),
0x80151938:("Message_ContinueTextbox",),
0x80151A68:("func_80151A68",),
- 0x80151BB4:("func_80151BB4",),
+ 0x80151BB4:("Message_BombersNotebookQueueEvent",),
0x80151C9C:("func_80151C9C",),
0x80151DA4:("func_80151DA4",),
0x80152434:("func_80152434",),
@@ -2905,13 +2905,13 @@
0x80160CE4:("ShrinkWindow_Update",),
0x80160D98:("ShrinkWindow_Draw",),
0x80161180:("func_80161180",),
- 0x8016119C:("func_8016119C",),
- 0x8016122C:("func_8016122C",),
- 0x801612B8:("func_801612B8",),
- 0x80161998:("func_80161998",),
+ 0x8016119C:("CutsceneCamera_Init",),
+ 0x8016122C:("CutsceneCamera_Interpolate",),
+ 0x801612B8:("CutsceneCamera_ProcessSpline",),
+ 0x80161998:("CutsceneCamera_UpdateSplines",),
0x80161BAC:("func_80161BAC",),
- 0x80161BE0:("func_80161BE0",),
- 0x80161C0C:("func_80161C0C",),
+ 0x80161BE0:("CutsceneCamera_SetState",),
+ 0x80161C0C:("CutsceneCamera_Reset",),
0x80161C20:("func_80161C20",),
0x80161E4C:("func_80161E4C",),
0x801620CC:("func_801620CC",),
@@ -3037,19 +3037,19 @@
0x8016A02C:("func_8016A02C",),
0x8016A0AC:("Play_IsUnderwater",),
0x8016A168:("Play_IsDebugCamEnabled",),
- 0x8016A178:("Play_AssignPlayerActorCsIdsFromScene",),
+ 0x8016A178:("Play_AssignPlayerCsIdsFromScene",),
0x8016A268:("Play_FillScreen",),
0x8016A2C8:("Play_Init",),
- 0x8016AC10:("func_8016AC10",),
- 0x8016AE1C:("func_8016AE1C",),
- 0x8016B278:("func_8016B278",),
- 0x8016B4B0:("func_8016B4B0",),
- 0x8016C344:("func_8016C344",),
- 0x8016CD4C:("func_8016CD4C",),
- 0x8016E40C:("func_8016E40C",),
- 0x8016EA90:("func_8016EA90",),
+ 0x8016AC10:("BombersNotebook_DrawScisTexRect",),
+ 0x8016AE1C:("BombersNotebook_DrawHeaders",),
+ 0x8016B278:("BombersNotebook_DrawColumns",),
+ 0x8016B4B0:("BombersNotebook_DrawEntries",),
+ 0x8016C344:("BombersNotebook_DrawRows",),
+ 0x8016CD4C:("BombersNotebook_DrawTimeOfDay",),
+ 0x8016E40C:("BombersNotebook_DrawCursor",),
+ 0x8016EA90:("BombersNotebook_DrawArrows",),
0x8016F1A8:("BombersNotebook_Draw",),
- 0x8016F4EC:("func_8016F4EC",),
+ 0x8016F4EC:("BombersNotebook_LoadFiles",),
0x8016F5A8:("BombersNotebook_Update",),
0x8016FC78:("BombersNotebook_Init",),
0x8016FC98:("BombersNotebook_Destroy",),
@@ -3164,33 +3164,33 @@
0x80174B20:("ListAlloc_Free",),
0x80174BA0:("ListAlloc_FreeAll",),
0x80174BF0:("Main",),
- 0x80174F10:("Padmgr_GetControllerBitmask",),
- 0x80174F24:("func_80174F24",),
- 0x80174F44:("func_80174F44",),
- 0x80174F7C:("func_80174F7C",),
- 0x80174F9C:("func_80174F9C",),
- 0x80174FD4:("Padmgr_GetEventCallback",),
- 0x80175008:("func_80175008",),
- 0x8017503C:("Padmgr_SetEventCallback",),
- 0x8017506C:("func_8017506C",),
- 0x8017509C:("Padmgr_Lock",),
- 0x801750CC:("Padmgr_Unlock",),
- 0x801750FC:("func_801750FC",),
- 0x80175364:("func_80175364",),
- 0x80175434:("func_80175434",),
- 0x8017544C:("func_8017544C",),
+ 0x80174F10:("PadMgr_GetValidControllersMask",),
+ 0x80174F24:("PadMgr_SetRumbleRetraceCallback",),
+ 0x80174F44:("PadMgr_UnsetRumbleRetraceCallback",),
+ 0x80174F7C:("PadMgr_SetInputRetraceCallback",),
+ 0x80174F9C:("PadMgr_UnsetInputRetraceCallback",),
+ 0x80174FD4:("PadMgr_AcquireSerialEventQueue",),
+ 0x80175008:("PadMgr_VoiceAcquireSerialEventQueue",),
+ 0x8017503C:("PadMgr_ReleaseSerialEventQueue",),
+ 0x8017506C:("PadMgr_VoiceReleaseSerialEventQueue",),
+ 0x8017509C:("PadMgr_LockPadData",),
+ 0x801750CC:("PadMgr_UnlockPadData",),
+ 0x801750FC:("PadMgr_UpdateRumble",),
+ 0x80175364:("PadMgr_RumbleStop",),
+ 0x80175434:("PadMgr_RumblePause",),
+ 0x8017544C:("PadMgr_RumbleSetSingle",),
0x80175474:("PadMgr_RumbleSet",),
0x801754C0:("PadMgr_ControllerHasRumblePak",),
- 0x801754E0:("Padmgr_CalcStickEdges",),
- 0x801757A4:("Padmgr_ParseState",),
- 0x801759BC:("func_801759BC",),
- 0x80175AE0:("func_80175AE0",),
- 0x80175C80:("Padmgr_Update",),
- 0x80175E3C:("Padmgr_Stop",),
- 0x80175E68:("func_80175E68",),
- 0x80175F98:("Padmgr_GetInput",),
- 0x80175FD4:("Padmgr_GetInput2",),
- 0x80176010:("Padmgr_ThreadEntry",),
+ 0x801754E0:("PadMgr_AdjustInput",),
+ 0x801757A4:("PadMgr_UpdateInputs",),
+ 0x801759BC:("PadMgr_InitVoice",),
+ 0x80175AE0:("PadMgr_UpdateConnections",),
+ 0x80175C80:("PadMgr_HandleRetrace",),
+ 0x80175E3C:("PadMgr_HandlePreNMI",),
+ 0x80175E68:("PadMgr_GetInputNoLock",),
+ 0x80175F98:("PadMgr_GetInput",),
+ 0x80175FD4:("PadMgr_GetInput2",),
+ 0x80176010:("PadMgr_ThreadEntry",),
0x80176194:("PadMgr_Init",),
0x80176280:("Sched_SwapFramebuffer",),
0x80176314:("Sched_RetraceUpdateFramebuffer",),
@@ -3225,15 +3225,15 @@
0x801780F0:("Mtx_SetTranslateScaleMtx",),
0x801781EC:("Mtx_SetRotationMtx",),
0x8017842C:("Mtx_SetTranslationRotationScaleMtx",),
- 0x80178750:("func_80178750",),
- 0x80178818:("func_80178818",),
- 0x80178978:("func_80178978",),
- 0x801789D4:("func_801789D4",),
- 0x801789EC:("SysCfb_GetFbPtr",),
+ 0x80178750:("SysCfb_SetLoResMode",),
+ 0x80178818:("SysCfb_SetHiResMode",),
+ 0x80178978:("SysCfb_Init",),
+ 0x801789D4:("SysCfb_Reset",),
+ 0x801789EC:("SysCfb_GetFramebuffer",),
0x80178A14:("SysCfb_GetZBuffer",),
- 0x80178A24:("func_80178A24",),
- 0x80178A34:("func_80178A34",),
- 0x80178A94:("func_80178A94",),
+ 0x80178A24:("SysCfb_GetWorkBuffer",),
+ 0x80178A34:("SysCfb_GetZBufferPixel",),
+ 0x80178A94:("SysCfb_GetZBufferInt",),
0x80178AC0:("func_80178AC0",),
0x80178C80:("CmpDma_GetFileInfo",),
0x80178D7C:("CmpDma_Decompress",),
@@ -3248,13 +3248,13 @@
0x801791CC:("Check_DrawRegionLockErrorMessage",),
0x80179260:("Check_ExpansionPak",),
0x801792A4:("Check_RegionIsSupported",),
- 0x80179300:("func_80179300",),
- 0x80179400:("func_80179400",),
- 0x801794C4:("pow_int",),
- 0x801794EC:("sin_rad",),
- 0x80179540:("cos_rad",),
+ 0x80179300:("Math_FactorialF",),
+ 0x80179400:("Math_Factorial",),
+ 0x801794C4:("Math_PowF",),
+ 0x801794EC:("Math_SinF",),
+ 0x80179540:("Math_CosF",),
0x80179594:("Rand_ZeroFloat",),
- 0x801795C0:("randPlusMinusPoint5Scaled",),
+ 0x801795C0:("Rand_CenteredFloat",),
0x801795F0:("Math3D_Normalize",),
0x80179678:("Math3D_PlaneVsLineSegClosestPoint",),
0x80179798:("func_80179798",),
@@ -3447,21 +3447,21 @@
0x801856FC:("Slowly_ThreadEntry",),
0x8018571C:("Slowly_Init",),
0x801857A0:("Slowly_Destroy",),
- 0x801857C0:("func_801857C0",),
- 0x801857D0:("func_801857D0",),
- 0x80185864:("func_80185864",),
- 0x80185908:("func_80185908",),
- 0x80185968:("func_80185968",),
- 0x801859F0:("func_801859F0",),
- 0x80185A2C:("func_80185A2C",),
- 0x80185B1C:("func_80185B1C",),
- 0x80185BE4:("func_80185BE4",),
+ 0x801857C0:("SysFlashrom_IsInit",),
+ 0x801857D0:("SysFlashrom_GetVendorStr",),
+ 0x80185864:("SysFlashrom_CheckFlashType",),
+ 0x80185908:("SysFlashrom_InitFlash",),
+ 0x80185968:("SysFlashrom_ReadData",),
+ 0x801859F0:("SysFlashrom_EraseSector",),
+ 0x80185A2C:("SysFlashrom_ExecWrite",),
+ 0x80185B1C:("SysFlashrom_AttemptWrite",),
+ 0x80185BE4:("SysFlashrom_NeedsToErase",),
0x80185C24:("func_80185C24",),
0x80185D40:("SysFlashrom_ThreadEntry",),
- 0x80185DDC:("func_80185DDC",),
- 0x80185EC4:("func_80185EC4",),
- 0x80185F04:("func_80185F04",),
- 0x80185F64:("func_80185F64",),
+ 0x80185DDC:("SysFlashrom_WriteDataAsync",),
+ 0x80185EC4:("SysFlashrom_IsBusy",),
+ 0x80185F04:("SysFlashrom_AwaitResult",),
+ 0x80185F64:("SysFlashrom_WriteDataSync",),
0x80185F90:("func_80185F90",),
0x80186A70:("osFlashGetAddr",),
0x80186AB8:("osFlashReInit",),
@@ -3845,7 +3845,7 @@
0x8019D488:("AudioOcarina_MemoryGameInit",),
0x8019D4F8:("AudioOcarina_MemoryGameNextNote",),
0x8019D600:("AudioOcarina_Update",),
- 0x8019D758:("AudioOcarina_PlayLongScarecrowAfterCredits",),
+ 0x8019D758:("AudioOcarina_PlayLongScarecrowSong",),
0x8019D864:("AudioOcarina_SetCustomSequence",),
0x8019D8B4:("AudioOcarina_PlayCustomSequence",),
0x8019D8E4:("AudioOcarina_CreateCustomSequence",),
@@ -4107,87 +4107,87 @@
0x80803EC0:("TitleSetup_Main",),
0x80803F0C:("TitleSetup_Destroy",),
0x80803F30:("TitleSetup_Init",),
- 0x80804010:("func_80804010",),
- 0x808041A0:("func_808041A0",),
- 0x80804654:("func_80804654",),
- 0x808047D8:("func_808047D8",),
- 0x8080489C:("func_8080489C",),
- 0x80804DAC:("func_80804DAC",),
- 0x80804E74:("func_80804E74",),
- 0x80804F98:("func_80804F98",),
- 0x8080525C:("func_8080525C",),
- 0x808052B0:("func_808052B0",),
- 0x808054A4:("func_808054A4",),
- 0x808055D0:("func_808055D0",),
- 0x808058A4:("func_808058A4",),
- 0x80805918:("func_80805918",),
- 0x80805A58:("func_80805A58",),
- 0x80805B30:("func_80805B30",),
- 0x80805C1C:("func_80805C1C",),
- 0x80806014:("func_80806014",),
- 0x80806148:("func_80806148",),
- 0x80806310:("func_80806310",),
- 0x808067E0:("func_808067E0",),
- 0x80806BC8:("func_80806BC8",),
- 0x80806CA0:("func_80806CA0",),
- 0x80806E84:("func_80806E84",),
- 0x80806F30:("func_80806F30",),
- 0x808071E4:("func_808071E4",),
- 0x80807390:("func_80807390",),
- 0x8080742C:("func_8080742C",),
- 0x808074B4:("func_808074B4",),
- 0x808077AC:("func_808077AC",),
- 0x80807940:("func_80807940",),
- 0x80807A78:("func_80807A78",),
- 0x80807C58:("func_80807C58",),
- 0x80808214:("func_80808214",),
- 0x80808D30:("func_80808D30",),
- 0x80808F1C:("func_80808F1C",),
- 0x80809DF0:("func_80809DF0",),
- 0x80809EA0:("func_80809EA0",),
- 0x8080A3CC:("func_8080A3CC",),
- 0x8080A418:("func_8080A418",),
- 0x8080A4A0:("func_8080A4A0",),
- 0x8080A6BC:("func_8080A6BC",),
- 0x8080A708:("func_8080A708",),
- 0x8080BBFC:("func_8080BBFC",),
- 0x8080BC20:("func_8080BC20",),
- 0x8080BC44:("FileSelect_nop8080bc44",),
- 0x8080BC4C:("FileSelect_nop8080BC4C",),
- 0x8080BC58:("func_8080BC58",),
- 0x8080BDAC:("func_8080BDAC",),
- 0x8080BDDC:("FileSelect_RenderView",),
- 0x8080BE60:("func_8080BE60",),
- 0x8080C040:("func_8080C040",),
- 0x8080C228:("func_8080C228",),
- 0x8080C29C:("func_8080C29C",),
- 0x8080C324:("func_8080C324",),
- 0x8080C3A8:("func_8080C3A8",),
- 0x8080D164:("func_8080D164",),
- 0x8080D170:("func_8080D170",),
- 0x8080D1BC:("func_8080D1BC",),
- 0x8080D220:("func_8080D220",),
- 0x8080D284:("func_8080D284",),
- 0x8080D2EC:("func_8080D2EC",),
- 0x8080D3D0:("func_8080D3D0",),
- 0x8080D40C:("func_8080D40C",),
- 0x8080D6D4:("func_8080D6D4",),
- 0x8080F25C:("func_8080F25C",),
- 0x808108DC:("func_808108DC",),
- 0x80811CB8:("func_80811CB8",),
- 0x80812460:("func_80812460",),
- 0x80812668:("func_80812668",),
- 0x80812760:("func_80812760",),
- 0x80812840:("func_80812840",),
- 0x80812980:("func_80812980",),
- 0x80812A6C:("func_80812A6C",),
- 0x80812D44:("func_80812D44",),
- 0x80812D94:("func_80812D94",),
- 0x80812E94:("func_80812E94",),
- 0x80812ED0:("func_80812ED0",),
+ 0x80804010:("FileSelect_SetupCopySource",),
+ 0x808041A0:("FileSelect_SelectCopySource",),
+ 0x80804654:("FileSelect_SetupCopyDest1",),
+ 0x808047D8:("FileSelect_SetupCopyDest2",),
+ 0x8080489C:("FileSelect_SelectCopyDest",),
+ 0x80804DAC:("FileSelect_ExitToCopySource1",),
+ 0x80804E74:("FileSelect_ExitToCopySource2",),
+ 0x80804F98:("FileSelect_SetupCopyConfirm1",),
+ 0x8080525C:("FileSelect_SetupCopyConfirm2",),
+ 0x808052B0:("FileSelect_CopyConfirm",),
+ 0x808054A4:("FileSelect_CopyWaitForFlashSave",),
+ 0x808055D0:("FileSelect_ReturnToCopyDest",),
+ 0x808058A4:("FileSelect_CopyAnim1",),
+ 0x80805918:("FileSelect_CopyAnim2",),
+ 0x80805A58:("FileSelect_CopyAnim3",),
+ 0x80805B30:("FileSelect_CopyAnim4",),
+ 0x80805C1C:("FileSelect_CopyAnim5",),
+ 0x80806014:("FileSelect_ExitCopyToMain",),
+ 0x80806148:("FileSelect_SetupEraseSelect",),
+ 0x80806310:("FileSelect_EraseSelect",),
+ 0x808067E0:("FileSelect_SetupEraseConfirm1",),
+ 0x80806BC8:("FileSelect_SetupEraseConfirm2",),
+ 0x80806CA0:("FileSelect_EraseConfirm",),
+ 0x80806E84:("FileSelect_ExitToEraseSelect1",),
+ 0x80806F30:("FileSelect_ExitToEraseSelect2",),
+ 0x808071E4:("FileSelect_EraseAnim1",),
+ 0x80807390:("FileSelect_EraseWaitForFlashSave",),
+ 0x8080742C:("FileSelect_EraseAnim2",),
+ 0x808074B4:("FileSelect_EraseAnim3",),
+ 0x808077AC:("FileSelect_ExitEraseToMain",),
+ 0x80807940:("FileSelect_DrawTexQuadI4",),
+ 0x80807A78:("FileSelect_DrawMultiTexQuadI4",),
+ 0x80807C58:("FileSelect_SetKeyboardVtx",),
+ 0x80808214:("FileSelect_SetNameEntryVtx",),
+ 0x80808D30:("FileSelect_DrawKeyboard",),
+ 0x80808F1C:("FileSelect_DrawNameEntry",),
+ 0x80809DF0:("FileSelect_StartNameEntry",),
+ 0x80809EA0:("FileSelect_UpdateKeyboardCursor",),
+ 0x8080A3CC:("FileSelect_NameEntryWaitForFlashSave",),
+ 0x8080A418:("FileSelect_StartOptions",),
+ 0x8080A4A0:("FileSelect_UpdateOptionsMenu",),
+ 0x8080A6BC:("FileSelect_OptionsWaitForFlashSave",),
+ 0x8080A708:("FileSelect_DrawOptionsImpl",),
+ 0x8080BBFC:("FileSelect_DrawOptions",),
+ 0x8080BC20:("FileSelect_IncrementConfigMode",),
+ 0x8080BC44:("FileSelect_Noop1",),
+ 0x8080BC4C:("FileSelect_Noop2",),
+ 0x8080BC58:("FileSelect_InitModeUpdate",),
+ 0x8080BDAC:("FileSelect_InitModeDraw",),
+ 0x8080BDDC:("FileSelect_SetView",),
+ 0x8080BE60:("FileSelect_DrawTexQuadIA8",),
+ 0x8080C040:("FileSelect_FadeInMenuElements",),
+ 0x8080C228:("FileSelect_SplitNumber",),
+ 0x8080C29C:("FileSelect_StartFadeIn",),
+ 0x8080C324:("FileSelect_FinishFadeIn",),
+ 0x8080C3A8:("FileSelect_UpdateMainMenu",),
+ 0x8080D164:("FileSelect_UnusedCM31",),
+ 0x8080D170:("FileSelect_UnusedCMDelay",),
+ 0x8080D1BC:("FileSelect_RotateToNameEntry",),
+ 0x8080D220:("FileSelect_RotateToOptions",),
+ 0x8080D284:("FileSelect_RotateToMain",),
+ 0x8080D2EC:("FileSelect_PulsateCursor",),
+ 0x8080D3D0:("FileSelect_ConfigModeUpdate",),
+ 0x8080D40C:("FileSelect_SetWindowVtx",),
+ 0x8080D6D4:("FileSelect_SetWindowContentVtx",),
+ 0x8080F25C:("FileSelect_DrawFileInfo",),
+ 0x808108DC:("FileSelect_DrawWindowContents",),
+ 0x80811CB8:("FileSelect_ConfigModeDraw",),
+ 0x80812460:("FileSelect_FadeMainToSelect",),
+ 0x80812668:("FileSelect_MoveSelectedFileToTop",),
+ 0x80812760:("FileSelect_FadeInFileInfo",),
+ 0x80812840:("FileSelect_ConfirmFile",),
+ 0x80812980:("FileSelect_FadeOutFileInfo",),
+ 0x80812A6C:("FileSelect_MoveSelectedFileToSlot",),
+ 0x80812D44:("FileSelect_FadeOut",),
+ 0x80812D94:("FileSelect_LoadGame",),
+ 0x80812E94:("FileSelect_SelectModeUpdate",),
+ 0x80812ED0:("FileSelect_SelectModeDraw",),
0x8081313C:("FileSelect_UpdateAndDrawSkybox",),
0x80813268:("FileSelect_Main",),
- 0x80813908:("func_80813908",),
+ 0x80813908:("FileSelect_InitContext",),
0x80813C74:("FileSelect_Destroy",),
0x80813C98:("FileSelect_Init",),
0x80814EB0:("DayTelop_Update",),
@@ -4205,7 +4205,7 @@
0x80819238:("KaleidoScope_DrawInventoryEditor",),
0x80819F04:("KaleidoScope_UpdateInventoryEditor",),
0x8081B240:("KaleidoScope_DrawAmmoCount",),
- 0x8081B6BC:("KaleidoScope_SetCursorVtx",),
+ 0x8081B6BC:("KaleidoScope_SetCursorVtxPos",),
0x8081B6EC:("KaleidoScope_DrawItemSelect",),
0x8081BCA8:("KaleidoScope_UpdateItemCursor",),
0x8081C684:("KaleidoScope_UpdateItemEquip",),
@@ -4218,41 +4218,41 @@
0x808204AC:("KaleidoScope_UpdateMaskCursor",),
0x80820FA4:("KaleidoScope_UpdateMaskEquip",),
0x80821730:("KaleidoScope_UpdatePrompt",),
- 0x80821900:("func_80821900",),
- 0x8082192C:("func_8082192C",),
- 0x80821958:("func_80821958",),
+ 0x80821900:("Kaleido_LoadMapNameStatic",),
+ 0x8082192C:("Kaleido_LoadMapNameStaticLarge",),
+ 0x80821958:("Kaleido_LoadItemNameStatic",),
0x80821984:("KaleidoScope_MoveCursorToSpecialPos",),
- 0x80821A04:("func_80821A04",),
+ 0x80821A04:("KaleidoScope_MoveCursorFromSpecialPos",),
0x80821AD4:("KaleidoScope_DrawTexQuadRGBA32",),
- 0x80821CC4:("func_80821CC4",),
+ 0x80821CC4:("KaleidoScope_SwitchPage",),
0x80821D84:("KaleidoScope_HandlePageToggles",),
- 0x80821F30:("func_80821F30",),
- 0x808221DC:("func_808221DC",),
- 0x80823350:("func_80823350",),
+ 0x80821F30:("KaleidoScope_DrawPageSections",),
+ 0x808221DC:("KaleidoScope_DrawPages",),
+ 0x80823350:("KaleidoScope_DrawInfoPanel",),
0x80824738:("KaleidoScope_UpdateNamePanel",),
- 0x808248D0:("func_808248D0",),
- 0x80824B90:("func_80824B90",),
+ 0x808248D0:("KaleidoScope_DrawOwlWarpMapPage",),
+ 0x80824B90:("KaleidoScope_DrawOwlWarpInfoPanel",),
0x808256E4:("KaleidoScope_UpdateOwlWarpNamePanel",),
0x8082585C:("KaleidoScope_UpdateSwitchPage",),
0x808259D4:("KaleidoScope_SetView",),
- 0x80825A50:("func_80825A50",),
- 0x80825E28:("func_80825E28",),
- 0x808274DC:("func_808274DC",),
- 0x80827A8C:("func_80827A8C",),
- 0x80827E08:("func_80827E08",),
+ 0x80825A50:("KaleidoScope_SetPageVertices",),
+ 0x80825E28:("KaleidoScope_SetVertices",),
+ 0x808274DC:("KaleidoScope_UpdateCursorSize",),
+ 0x80827A8C:("KaleidoScope_DrawCursor",),
+ 0x80827E08:("KaleidoScope_DrawGameOver",),
0x808283D8:("KaleidoScope_Draw",),
0x808286D8:("KaleidoScope_GrayOutTextureRGBA32",),
0x80828788:("KaleidoScope_UpdateOpening",),
0x8082895C:("KaleidoScope_Update",),
0x8082DA90:("func_8082DA90",),
- 0x8082DABC:("func_8082DABC",),
+ 0x8082DABC:("Player_StopHorizontalMovement",),
0x8082DAD4:("func_8082DAD4",),
0x8082DAFC:("func_8082DAFC",),
- 0x8082DB18:("func_8082DB18",),
- 0x8082DB3C:("func_8082DB3C",),
+ 0x8082DB18:("Player_AnimationPlayOnce",),
+ 0x8082DB3C:("Player_AnimationPlayLoop",),
0x8082DB60:("func_8082DB60",),
0x8082DB90:("func_8082DB90",),
- 0x8082DBC0:("func_8082DBC0",),
+ 0x8082DBC0:("Player_AnimationPlayOnceReverse",),
0x8082DC28:("func_8082DC28",),
0x8082DC38:("func_8082DC38",),
0x8082DC64:("func_8082DC64",),
@@ -4262,18 +4262,18 @@
0x8082DE50:("func_8082DE50",),
0x8082DE88:("func_8082DE88",),
0x8082DF2C:("func_8082DF2C",),
- 0x8082DF48:("func_8082DF48",),
- 0x8082DF8C:("func_8082DF8C",),
+ 0x8082DF48:("Player_RequestRumble",),
+ 0x8082DF8C:("Player_AnimSfx_PlayVoice",),
0x8082E00C:("func_8082E00C",),
- 0x8082E078:("func_8082E078",),
- 0x8082E094:("func_8082E094",),
- 0x8082E0CC:("func_8082E0CC",),
- 0x8082E0F4:("func_8082E0F4",),
- 0x8082E12C:("func_8082E12C",),
- 0x8082E188:("func_8082E188",),
- 0x8082E1BC:("func_8082E1BC",),
+ 0x8082E078:("Player_GetFloorSfx",),
+ 0x8082E094:("Player_AnimSfx_PlayFloor",),
+ 0x8082E0CC:("Player_GetFloorSfxByAge",),
+ 0x8082E0F4:("Player_AnimSfx_PlayFloorByAge",),
+ 0x8082E12C:("Player_AnimSfx_PlayFloorWalk",),
+ 0x8082E188:("Player_AnimSfx_PlayFloorJump",),
+ 0x8082E1BC:("Player_AnimSfx_PlayFloorLand",),
0x8082E1F0:("func_8082E1F0",),
- 0x8082E224:("func_8082E224",),
+ 0x8082E224:("Player_PlayAnimSfx",),
0x8082E438:("func_8082E438",),
0x8082E4A4:("func_8082E4A4",),
0x8082E514:("func_8082E514",),
@@ -4309,22 +4309,22 @@
0x8082EF9C:("func_8082EF9C",),
0x8082EFE4:("func_8082EFE4",),
0x8082F02C:("func_8082F02C",),
- 0x8082F09C:("func_8082F09C",),
- 0x8082F0E4:("func_8082F0E4",),
+ 0x8082F09C:("Player_ResetCylinder",),
+ 0x8082F0E4:("Player_SetCylinderForAttack",),
0x8082F164:("func_8082F164",),
0x8082F1AC:("func_8082F1AC",),
0x8082F43C:("func_8082F43C",),
0x8082F470:("func_8082F470",),
- 0x8082F524:("func_8082F524",),
+ 0x8082F524:("Player_ItemToItemAction",),
0x8082F594:("func_8082F594",),
0x8082F5A4:("func_8082F5A4",),
0x8082F5C0:("func_8082F5C0",),
0x8082F5FC:("func_8082F5FC",),
- 0x8082F62C:("func_8082F62C",),
+ 0x8082F62C:("Player_SpawnExplosive",),
0x8082F7F4:("func_8082F7F4",),
0x8082F8A0:("func_8082F8A0",),
0x8082F8BC:("func_8082F8BC",),
- 0x8082F938:("func_8082F938",),
+ 0x8082F938:("Player_OverrideBlureColors",),
0x8082FA5C:("func_8082FA5C",),
0x8082FB68:("func_8082FB68",),
0x8082FBE8:("func_8082FBE8",),
@@ -4359,7 +4359,7 @@
0x808313A8:("func_808313A8",),
0x808313F0:("func_808313F0",),
0x80831454:("func_80831454",),
- 0x80831494:("func_80831494",),
+ 0x80831494:("Player_SetAction",),
0x8083172C:("func_8083172C",),
0x80831760:("func_80831760",),
0x808317C4:("func_808317C4",),
@@ -4420,16 +4420,16 @@
0x808354A4:("func_808354A4",),
0x808355D8:("func_808355D8",),
0x8083562C:("func_8083562C",),
- 0x80835BC8:("func_80835BC8",),
+ 0x80835BC8:("Player_TranslateAndRotateY",),
0x80835BF8:("func_80835BF8",),
- 0x80835C64:("func_80835C64",),
+ 0x80835C64:("Player_SpawnFairy",),
0x80835CD8:("func_80835CD8",),
0x80835D2C:("func_80835D2C",),
0x80835D58:("func_80835D58",),
0x80835DF8:("func_80835DF8",),
- 0x80835EAC:("func_80835EAC",),
- 0x8083604C:("func_8083604C",),
- 0x80836258:("func_80836258",),
+ 0x80835EAC:("Player_Door_Staircase",),
+ 0x8083604C:("Player_Door_Sliding",),
+ 0x80836258:("Player_Door_Knob",),
0x808365DC:("func_808365DC",),
0x80836888:("func_80836888",),
0x8083692C:("func_8083692C",),
@@ -4442,7 +4442,7 @@
0x80836C70:("func_80836C70",),
0x80836D8C:("func_80836D8C",),
0x80836DC0:("func_80836DC0",),
- 0x80836EA0:("func_80836EA0",),
+ 0x80836EA0:("Player_RequestQuake",),
0x80836F10:("func_80836F10",),
0x808370D4:("func_808370D4",),
0x80837134:("func_80837134",),
@@ -4464,7 +4464,7 @@
0x808381F8:("func_808381F8",),
0x8083827C:("func_8083827C",),
0x8083868C:("func_8083868C",),
- 0x80838760:("func_80838760",),
+ 0x80838760:("Player_StopCutscene",),
0x808387A0:("func_808387A0",),
0x80838830:("func_80838830",),
0x808388B8:("func_808388B8",),
@@ -4500,11 +4500,11 @@
0x8083A844:("func_8083A844",),
0x8083A878:("func_8083A878",),
0x8083A98C:("func_8083A98C",),
- 0x8083AD04:("func_8083AD04",),
- 0x8083AD8C:("func_8083AD8C",),
- 0x8083ADB8:("func_8083ADB8",),
+ 0x8083AD04:("Player_InitMode_Telescope",),
+ 0x8083AD8C:("Player_InitMode_B",),
+ 0x8083ADB8:("Player_InitMode_D",),
0x8083ADF0:("func_8083ADF0",),
- 0x8083AE38:("func_8083AE38",),
+ 0x8083AE38:("Player_InitMode_F",),
0x8083AECC:("func_8083AECC",),
0x8083AF30:("func_8083AF30",),
0x8083AF8C:("func_8083AF8C",),
@@ -4557,7 +4557,7 @@
0x8083E958:("func_8083E958",),
0x8083E9C4:("func_8083E9C4",),
0x8083EA44:("func_8083EA44",),
- 0x8083EBD0:("func_8083EBD0",),
+ 0x8083EBD0:("Player_ChooseIdleAnim",),
0x8083EE60:("func_8083EE60",),
0x8083F144:("func_8083F144",),
0x8083F190:("func_8083F190",),
@@ -4571,7 +4571,7 @@
0x8083FCF0:("func_8083FCF0",),
0x8083FD80:("func_8083FD80",),
0x8083FE38:("func_8083FE38",),
- 0x8083FE90:("func_8083FE90",),
+ 0x8083FE90:("Player_RequestQuakeAndRumble",),
0x8083FEF4:("func_8083FEF4",),
0x8083FF30:("func_8083FF30",),
0x8083FFEC:("func_8083FFEC",),
@@ -4590,33 +4590,33 @@
0x80840F34:("func_80840F34",),
0x80840F90:("func_80840F90",),
0x808411D4:("func_808411D4",),
- 0x808412A0:("func_808412A0",),
- 0x808412BC:("func_808412BC",),
+ 0x808412A0:("Player_InitMode_0",),
+ 0x808412BC:("Player_InitMode_2",),
0x80841358:("func_80841358",),
- 0x80841408:("func_80841408",),
- 0x808414E0:("func_808414E0",),
- 0x80841528:("func_80841528",),
- 0x808415A0:("func_808415A0",),
- 0x808415E4:("func_808415E4",),
- 0x80841624:("func_80841624",),
+ 0x80841408:("Player_InitMode_1",),
+ 0x808414E0:("Player_InitMode_3",),
+ 0x80841528:("Player_InitMode_4",),
+ 0x808415A0:("Player_InitMode_7",),
+ 0x808415E4:("Player_InitMode_5",),
+ 0x80841624:("Player_InitMode_6",),
0x80841744:("func_80841744",),
- 0x8084182C:("func_8084182C",),
+ 0x8084182C:("Player_InitCommon",),
0x80841A50:("func_80841A50",),
0x80841AC4:("Player_Init",),
0x80842510:("func_80842510",),
0x808425B4:("func_808425B4",),
- 0x808426F0:("func_808426F0",),
+ 0x808426F0:("Player_SetDoAction",),
0x808430E0:("func_808430E0",),
0x80843178:("func_80843178",),
- 0x80843EC0:("func_80843EC0",),
+ 0x80843EC0:("Player_UpdateCamAndSeqModes",),
0x808442D8:("func_808442D8",),
0x808445C4:("func_808445C4",),
- 0x808446F4:("func_808446F4",),
+ 0x808446F4:("Player_DetectSecrets",),
0x80844784:("func_80844784",),
0x80844D80:("func_80844D80",),
- 0x80844EF8:("func_80844EF8",),
+ 0x80844EF8:("Player_UpdateCommon",),
0x808460B8:("Player_Update",),
- 0x808463C0:("func_808463C0",),
+ 0x808463C0:("Player_DrawGameplay",),
0x80846460:("func_80846460",),
0x80846528:("Player_Draw",),
0x808470D4:("Player_Destroy",),
@@ -4834,7 +4834,7 @@
0x80859AF8:("func_80859AF8",),
0x80859B28:("func_80859B28",),
0x80859B54:("func_80859B54",),
- 0x80859BA8:("func_80859BA8",),
+ 0x80859BA8:("Player_Cutscene_Translate",),
0x80859C60:("func_80859C60",),
0x80859CA0:("func_80859CA0",),
0x80859CE0:("func_80859CE0",),
@@ -4845,7 +4845,7 @@
0x80859F4C:("func_80859F4C",),
0x80859FCC:("func_80859FCC",),
0x80859FF4:("func_80859FF4",),
- 0x8085A04C:("func_8085A04C",),
+ 0x8085A04C:("Player_Cutscene_TranslateReverse",),
0x8085A120:("func_8085A120",),
0x8085A144:("func_8085A144",),
0x8085A19C:("func_8085A19C",),
@@ -4869,19 +4869,19 @@
0x8085AA60:("func_8085AA60",),
0x8085AA84:("func_8085AA84",),
0x8085AACC:("func_8085AACC",),
- 0x8085AB58:("func_8085AB58",),
- 0x8085ABA8:("func_8085ABA8",),
+ 0x8085AB58:("Player_Cutscene_SetPosAndYawToStart",),
+ 0x8085ABA8:("Player_Cutscene_8085ABA8",),
0x8085AC9C:("func_8085AC9C",),
0x8085AD5C:("func_8085AD5C",),
0x8085ADA0:("func_8085ADA0",),
0x8085B08C:("func_8085B08C",),
- 0x8085B134:("func_8085B134",),
+ 0x8085B134:("Player_StartFishing",),
0x8085B170:("func_8085B170",),
- 0x8085B1F0:("func_8085B1F0",),
+ 0x8085B1F0:("Player_GrabPlayer",),
0x8085B28C:("func_8085B28C",),
0x8085B384:("func_8085B384",),
- 0x8085B3E0:("func_8085B3E0",),
- 0x8085B460:("func_8085B460",),
+ 0x8085B3E0:("Player_InflictDamage",),
+ 0x8085B460:("Player_TalkWithPlayer",),
0x8085B74C:("func_8085B74C",),
0x8085B820:("func_8085B820",),
0x8085B854:("func_8085B854",),
@@ -6033,7 +6033,7 @@
0x808BCDF0:("ItemBHeart_Init",),
0x808BCEA8:("ItemBHeart_Destroy",),
0x808BCEB8:("ItemBHeart_Update",),
- 0x808BCF54:("func_808BCF54",),
+ 0x808BCF54:("ItemBHeart_UpdateModel",),
0x808BCFC4:("ItemBHeart_Draw",),
0x808BD1E0:("EnDekunuts_Init",),
0x808BD31C:("EnDekunuts_Destroy",),
@@ -6504,7 +6504,7 @@
0x808E06B0:("DoorAna_Update",),
0x808E0704:("DoorAna_Draw",),
0x808E0830:("EnEncount1_Init",),
- 0x808E0954:("func_808E0954",),
+ 0x808E0954:("EnEncount1_SpawnActor",),
0x808E0DA8:("EnEncount1_Update",),
0x808E0E40:("DemoTreLgt_Init",),
0x808E0EBC:("DemoTreLgt_Destroy",),
@@ -7124,7 +7124,7 @@
0x8092C86C:("func_8092C86C",),
0x8092C934:("func_8092C934",),
0x8092C9BC:("func_8092C9BC",),
- 0x8092CA74:("func_8092CA74",),
+ 0x8092CA74:("EnDns_GetCueType",),
0x8092CAD0:("func_8092CAD0",),
0x8092CB98:("func_8092CB98",),
0x8092CC68:("func_8092CC68",),
@@ -8591,24 +8591,24 @@
0x8099BE48:("EnCrow_OverrideLimbDraw",),
0x8099BF20:("EnCrow_PostLimbDraw",),
0x8099BFA4:("EnCrow_Draw",),
- 0x8099C290:("func_8099C290",),
- 0x8099C328:("func_8099C328",),
- 0x8099C41C:("func_8099C41C",),
+ 0x8099C290:("EnCow_RotatePoint",),
+ 0x8099C328:("EnCow_SetColliderPos",),
+ 0x8099C41C:("EnCow_SetTailPos",),
0x8099C498:("EnCow_Init",),
0x8099C834:("EnCow_Destroy",),
- 0x8099C880:("func_8099C880",),
- 0x8099CAA8:("func_8099CAA8",),
- 0x8099CB20:("func_8099CB20",),
- 0x8099CB68:("func_8099CB68",),
- 0x8099CBCC:("func_8099CBCC",),
- 0x8099CC68:("func_8099CC68",),
- 0x8099CCF8:("func_8099CCF8",),
- 0x8099CDA0:("func_8099CDA0",),
- 0x8099CFAC:("func_8099CFAC",),
+ 0x8099C880:("EnCow_UpdateAnimation",),
+ 0x8099CAA8:("EnCow_TalkEnd",),
+ 0x8099CB20:("EnCow_GiveMilkEnd",),
+ 0x8099CB68:("EnCow_GiveMilkWait",),
+ 0x8099CBCC:("EnCow_GiveMilk",),
+ 0x8099CC68:("EnCow_CheckForEmptyBottle",),
+ 0x8099CCF8:("EnCow_Talk",),
+ 0x8099CDA0:("EnCow_Idle",),
+ 0x8099CFAC:("EnCow_DoTail",),
0x8099D144:("EnCow_Update",),
- 0x8099D3C0:("func_8099D3C0",),
- 0x8099D4AC:("func_8099D4AC",),
- 0x8099D4FC:("func_8099D4FC",),
+ 0x8099D3C0:("EnCow_UpdateTail",),
+ 0x8099D4AC:("EnCow_OverrideLimbDraw",),
+ 0x8099D4FC:("EnCow_PostLimbDraw",),
0x8099D53C:("EnCow_Draw",),
0x8099D59C:("func_8099D59C",),
0x8099D780:("OceffWipe4_Init",),
@@ -8997,37 +8997,37 @@
0x809C0E30:("EnWarpTag_GrottoReturn",),
0x809C0F18:("EnWarptag_Update",),
0x809C0F3C:("EnWarpTag_Draw",),
- 0x809C10B0:("func_809C10B0",),
- 0x809C1124:("func_809C1124",),
- 0x809C1158:("func_809C1158",),
- 0x809C11EC:("func_809C11EC",),
- 0x809C1304:("func_809C1304",),
- 0x809C1424:("func_809C1424",),
- 0x809C14D0:("func_809C14D0",),
- 0x809C15BC:("func_809C15BC",),
- 0x809C165C:("func_809C165C",),
- 0x809C16DC:("func_809C16DC",),
- 0x809C1C9C:("func_809C1C9C",),
- 0x809C1D64:("func_809C1D64",),
- 0x809C1EC8:("func_809C1EC8",),
- 0x809C2060:("func_809C2060",),
- 0x809C21E0:("func_809C21E0",),
- 0x809C2504:("func_809C2504",),
- 0x809C2594:("func_809C2594",),
- 0x809C25E4:("func_809C25E4",),
- 0x809C2680:("func_809C2680",),
- 0x809C26E4:("func_809C26E4",),
- 0x809C2730:("func_809C2730",),
- 0x809C2788:("func_809C2788",),
- 0x809C2824:("func_809C2824",),
- 0x809C28B8:("func_809C28B8",),
- 0x809C2A64:("func_809C2A64",),
- 0x809C2BE4:("func_809C2BE4",),
- 0x809C2C9C:("func_809C2C9C",),
- 0x809C2D0C:("func_809C2D0C",),
- 0x809C2EC4:("func_809C2EC4",),
- 0x809C2F34:("func_809C2F34",),
- 0x809C2FA0:("func_809C2FA0",),
+ 0x809C10B0:("EnAob01_Blink",),
+ 0x809C1124:("EnAob01_AdvanceTime",),
+ 0x809C1158:("EnAob01_InitializeDogPaths",),
+ 0x809C11EC:("EnAob01_SpawnDogs",),
+ 0x809C1304:("EnAob01_SpawnRacedogs",),
+ 0x809C1424:("EnAob01_ProcessLaughAnim",),
+ 0x809C14D0:("EnAob01_ProcessSurpriseAnim",),
+ 0x809C15BC:("EnAob01_ProcessIdleAnim",),
+ 0x809C165C:("EnAob01_UpdateCollision",),
+ 0x809C16DC:("EnAob01_BeforeRace_HandleConversation",),
+ 0x809C1C9C:("EnAob01_BeforeRace_StartRace",),
+ 0x809C1D64:("EnAob01_BeforeRace_RespondToPlayAgainQuestion",),
+ 0x809C1EC8:("EnAob01_UpdateCommon",),
+ 0x809C2060:("EnAob01_BeforeRace_Idle",),
+ 0x809C21E0:("EnAob01_BeforeRace_Talk",),
+ 0x809C2504:("EnAob01_Race_DogHasReachedNextCutsceneTrigger",),
+ 0x809C2594:("EnAob01_Race_FollowSelectedDog",),
+ 0x809C25E4:("EnAob01_Race_IsRaceOver",),
+ 0x809C2680:("EnAob01_Race_CurrentCutsceneHasEnded",),
+ 0x809C26E4:("EnAob01_Race_SkipNonRaceCutscene",),
+ 0x809C2730:("EnAob01_Race_HandleRaceCutscene",),
+ 0x809C2788:("EnAob01_Race_HandleRaceEndCutscene",),
+ 0x809C2824:("EnAob01_Race_StartCutscene",),
+ 0x809C28B8:("EnAob01_AfterRace_GiveRaceResult",),
+ 0x809C2A64:("EnAob01_AfterRace_GiveReward",),
+ 0x809C2BE4:("EnAob01_AfterRace_AfterGivingReward",),
+ 0x809C2C9C:("EnAob01_AfterRace_AskToPlayAgain",),
+ 0x809C2D0C:("EnAob01_AfterRace_Talk",),
+ 0x809C2EC4:("EnAob01_PlayerIsHoldingDog",),
+ 0x809C2F34:("EnAob01_Race_HidePlayer",),
+ 0x809C2FA0:("EnAob01_InitializeDogTextOffsets",),
0x809C3190:("EnAob01_Init",),
0x809C3350:("EnAob01_Destroy",),
0x809C339C:("EnAob01_Update",),
@@ -9675,76 +9675,76 @@
0x80A10368:("EnSob1_ZoraShopkeeper_Draw",),
0x80A104E4:("EnSob1_GoronShopkeeper_Draw",),
0x80A10608:("EnSob1_BombShopkeeper_Draw",),
- 0x80A10FD0:("func_80A10FD0",),
- 0x80A11144:("func_80A11144",),
- 0x80A1143C:("func_80A1143C",),
- 0x80A115B4:("func_80A115B4",),
- 0x80A118F8:("func_80A118F8",),
- 0x80A11BF8:("func_80A11BF8",),
- 0x80A11EC0:("func_80A11EC0",),
- 0x80A1203C:("func_80A1203C",),
- 0x80A1213C:("func_80A1213C",),
- 0x80A121F4:("func_80A121F4",),
- 0x80A1222C:("func_80A1222C",),
- 0x80A122EC:("func_80A122EC",),
- 0x80A123A0:("func_80A123A0",),
- 0x80A124A0:("func_80A124A0",),
- 0x80A124FC:("func_80A124FC",),
- 0x80A125BC:("func_80A125BC",),
- 0x80A12660:("func_80A12660",),
- 0x80A126BC:("func_80A126BC",),
- 0x80A12774:("func_80A12774",),
- 0x80A12868:("func_80A12868",),
- 0x80A12954:("func_80A12954",),
- 0x80A12A64:("func_80A12A64",),
- 0x80A12B78:("func_80A12B78",),
- 0x80A12C48:("func_80A12C48",),
- 0x80A12D6C:("func_80A12D6C",),
- 0x80A12DF4:("func_80A12DF4",),
- 0x80A12E80:("func_80A12E80",),
- 0x80A12FE8:("func_80A12FE8",),
- 0x80A131F8:("func_80A131F8",),
- 0x80A132C8:("func_80A132C8",),
- 0x80A133A8:("func_80A133A8",),
- 0x80A13400:("func_80A13400",),
- 0x80A134B0:("func_80A134B0",),
- 0x80A134F4:("func_80A134F4",),
- 0x80A13564:("func_80A13564",),
- 0x80A136B8:("func_80A136B8",),
- 0x80A13728:("func_80A13728",),
- 0x80A137C0:("func_80A137C0",),
- 0x80A139E4:("func_80A139E4",),
- 0x80A13B1C:("func_80A13B1C",),
- 0x80A13E80:("func_80A13E80",),
- 0x80A14018:("func_80A14018",),
- 0x80A14104:("func_80A14104",),
- 0x80A141D4:("func_80A141D4",),
- 0x80A1428C:("func_80A1428C",),
- 0x80A14324:("func_80A14324",),
- 0x80A143A8:("func_80A143A8",),
- 0x80A14430:("func_80A14430",),
- 0x80A1449C:("func_80A1449C",),
- 0x80A144F4:("func_80A144F4",),
- 0x80A145AC:("func_80A145AC",),
- 0x80A14668:("func_80A14668",),
- 0x80A146CC:("func_80A146CC",),
- 0x80A14798:("func_80A14798",),
- 0x80A149B0:("func_80A149B0",),
- 0x80A14B30:("func_80A14B30",),
- 0x80A14E14:("func_80A14E14",),
- 0x80A14E74:("func_80A14E74",),
- 0x80A14EB0:("func_80A14EB0",),
- 0x80A14FC8:("func_80A14FC8",),
- 0x80A153FC:("func_80A153FC",),
- 0x80A15684:("func_80A15684",),
- 0x80A157C4:("func_80A157C4",),
+ 0x80A10FD0:("EnGo_InitSteam",),
+ 0x80A11144:("EnGo_DrawSteam",),
+ 0x80A1143C:("EnGo_InitDust",),
+ 0x80A115B4:("EnGo_DrawDust",),
+ 0x80A118F8:("EnGo_InitSnow",),
+ 0x80A11BF8:("EnGo_UpdateSnow",),
+ 0x80A11EC0:("EnGo_DrawSnow",),
+ 0x80A1203C:("EnGo_UpdateEffects",),
+ 0x80A1213C:("EnGo_DrawEffects",),
+ 0x80A121F4:("EnGo_CanSnowballHurtPlayer",),
+ 0x80A1222C:("EnGo_IsFallingAsleep",),
+ 0x80A122EC:("EnGo_UpdateFocus",),
+ 0x80A123A0:("EnGo_UpdateSnowballCollider",),
+ 0x80A124A0:("EnGo_UpdateMedigoronCollider",),
+ 0x80A124FC:("EnGo_UpdateRolledUpCollider",),
+ 0x80A125BC:("EnGo_UpdateFrozenCollider",),
+ 0x80A12660:("EnGo_UpdateStandingCollider",),
+ 0x80A126BC:("EnGo_UpdateCollider",),
+ 0x80A12774:("EnGo_UpdateTalking",),
+ 0x80A12868:("EnGo_DetectCollisions",),
+ 0x80A12954:("EnGo_UpdateSpringArrivalCutscene",),
+ 0x80A12A64:("EnGo_UpdateAnimationToCurrent",),
+ 0x80A12B78:("EnGo_UpdateSfx",),
+ 0x80A12C48:("EnGo_ChangeAnim",),
+ 0x80A12D6C:("EnGo_UpdateEyes",),
+ 0x80A12DF4:("EnGo_UpdateShiverSurprisedAnimation",),
+ 0x80A12E80:("EnGo_UpdateGraveyardAttentionTargetAndReactions",),
+ 0x80A12FE8:("EnGo_UpdateRotationToTarget",),
+ 0x80A131F8:("EnGo_UpdateAttentionTargetAndReactions",),
+ 0x80A132C8:("EnGo_GravemakerIdle",),
+ 0x80A133A8:("EnGo_FrozenIdle",),
+ 0x80A13400:("EnGo_FindGravemaker",),
+ 0x80A134B0:("EnGo_UpdateMedigoronColliderRadius",),
+ 0x80A134F4:("EnGo_ChangeCutscene",),
+ 0x80A13564:("EnGo_HandleGatekeeperPoundCutscene",),
+ 0x80A136B8:("EnGo_RequestQuake",),
+ 0x80A13728:("EnGo_CreateGatekeeperPoundEffects",),
+ 0x80A137C0:("EnGo_DrawIceBlockWhenFrozen",),
+ 0x80A139E4:("EnGo_MakeSteam",),
+ 0x80A13B1C:("EnGo_HandleOpenShrineCutscene",),
+ 0x80A13E80:("EnGo_HandleGivePowderKegCutscene",),
+ 0x80A14018:("EnGo_ChangeToStretchingAnimation",),
+ 0x80A14104:("EnGo_ChangeToSpectatingAnimation",),
+ 0x80A141D4:("EnGo_ChangeToFrozenAnimation",),
+ 0x80A1428C:("EnGo_ChangeToSnowballAnimation",),
+ 0x80A14324:("EnGo_ChangeToCoveringEarsAnimation",),
+ 0x80A143A8:("EnGo_ChangeToShiveringAnimation",),
+ 0x80A14430:("EnGo_SetupAthletic",),
+ 0x80A1449C:("EnGo_SetupSpectator",),
+ 0x80A144F4:("EnGo_SetupGatekeeper",),
+ 0x80A145AC:("EnGo_SetupGraveyardGoron",),
+ 0x80A14668:("EnGo_SetupShrineGoron",),
+ 0x80A146CC:("EnGo_SetupMedigoron",),
+ 0x80A14798:("EnGo_SetupInitialAction",),
+ 0x80A149B0:("EnGo_Idle",),
+ 0x80A14B30:("EnGo_Sleep",),
+ 0x80A14E14:("EnGo_Frozen",),
+ 0x80A14E74:("EnGo_AwaitThaw",),
+ 0x80A14EB0:("EnGo_Thaw",),
+ 0x80A14FC8:("EnGo_HandleSpringArrivalCutscene",),
+ 0x80A153FC:("EnGo_Snowball",),
+ 0x80A15684:("EnGo_GetMsgEventScript",),
+ 0x80A157C4:("EnGo_Talk",),
0x80A1590C:("EnGo_Init",),
0x80A15960:("EnGo_Destroy",),
0x80A159B0:("EnGo_Update",),
- 0x80A15B80:("func_80A15B80",),
+ 0x80A15B80:("EnGo_Draw_NoSkeleton",),
0x80A15D04:("EnGo_OverrideLimbDraw",),
0x80A15E38:("EnGo_TransfromLimbDraw",),
- 0x80A15FEC:("func_80A15FEC",),
+ 0x80A15FEC:("EnGo_Draw",),
0x80A16D40:("EnRaf_ClearPixelTeeth",),
0x80A16D6C:("EnRaf_ClearPixelPetal",),
0x80A16D90:("EnRaf_Init",),
@@ -10126,43 +10126,43 @@
0x80A2EBE8:("DmSa_Draw",),
0x80A2EDA0:("EnSlime_Init",),
0x80A2EF80:("EnSlime_Destroy",),
- 0x80A2EFAC:("func_80A2EFAC",),
- 0x80A2F028:("func_80A2F028",),
- 0x80A2F0A8:("func_80A2F0A8",),
- 0x80A2F110:("func_80A2F110",),
- 0x80A2F140:("func_80A2F140",),
- 0x80A2F180:("func_80A2F180",),
- 0x80A2F1A4:("func_80A2F1A4",),
- 0x80A2F354:("func_80A2F354",),
- 0x80A2F418:("func_80A2F418",),
- 0x80A2F684:("func_80A2F684",),
- 0x80A2F6CC:("func_80A2F6CC",),
- 0x80A2F8B4:("func_80A2F8B4",),
- 0x80A2F8E0:("func_80A2F8E0",),
- 0x80A2F9A0:("func_80A2F9A0",),
- 0x80A2FA88:("func_80A2FA88",),
- 0x80A2FB60:("func_80A2FB60",),
- 0x80A2FBA0:("func_80A2FBA0",),
- 0x80A2FD94:("func_80A2FD94",),
- 0x80A2FE38:("func_80A2FE38",),
- 0x80A30018:("func_80A30018",),
- 0x80A30344:("func_80A30344",),
- 0x80A30454:("func_80A30454",),
- 0x80A304B8:("func_80A304B8",),
- 0x80A3072C:("func_80A3072C",),
- 0x80A30778:("func_80A30778",),
- 0x80A30820:("func_80A30820",),
- 0x80A30924:("func_80A30924",),
- 0x80A30944:("func_80A30944",),
- 0x80A309C8:("func_80A309C8",),
- 0x80A30A20:("func_80A30A20",),
- 0x80A30A90:("func_80A30A90",),
- 0x80A30AE4:("func_80A30AE4",),
- 0x80A30BE0:("func_80A30BE0",),
- 0x80A30C2C:("func_80A30C2C",),
- 0x80A30C68:("func_80A30C68",),
- 0x80A30CEC:("func_80A30CEC",),
- 0x80A30F98:("func_80A30F98",),
+ 0x80A2EFAC:("EnSlime_Freeze",),
+ 0x80A2F028:("EnSlime_Thaw",),
+ 0x80A2F0A8:("EnSlime_Blink",),
+ 0x80A2F110:("EnSlime_SetupInitializeIdle",),
+ 0x80A2F140:("EnSlime_InitializeIdle",),
+ 0x80A2F180:("EnSlime_SetupIdle",),
+ 0x80A2F1A4:("EnSlime_Idle",),
+ 0x80A2F354:("EnSlime_SetupMoveInDirection",),
+ 0x80A2F418:("EnSlime_MoveInDirection",),
+ 0x80A2F684:("EnSlime_SetupMoveToHome",),
+ 0x80A2F6CC:("EnSlime_MoveToHome",),
+ 0x80A2F8B4:("EnSlime_SetupTurnToPlayer",),
+ 0x80A2F8E0:("EnSlime_TurnToPlayer",),
+ 0x80A2F9A0:("EnSlime_SetupJump",),
+ 0x80A2FA88:("EnSlime_Jump",),
+ 0x80A2FB60:("EnSlime_SetupLand",),
+ 0x80A2FBA0:("EnSlime_Land",),
+ 0x80A2FD94:("EnSlime_SetupReactToBluntHit",),
+ 0x80A2FE38:("EnSlime_ReactToBluntHit",),
+ 0x80A30018:("EnSlime_SetupDamaged",),
+ 0x80A30344:("EnSlime_Damaged",),
+ 0x80A30454:("EnSlime_SetupDead",),
+ 0x80A304B8:("EnSlime_Dead",),
+ 0x80A3072C:("EnSlime_SnapIceBlockPosition",),
+ 0x80A30778:("EnSlime_SetupSpawnIceBlock",),
+ 0x80A30820:("EnSlime_SpawnIceBlock",),
+ 0x80A30924:("EnSlime_SetupIceBlock",),
+ 0x80A30944:("EnSlime_IceBlock",),
+ 0x80A309C8:("EnSlime_SetupStun",),
+ 0x80A30A20:("EnSlime_Stun",),
+ 0x80A30A90:("EnSlime_SetupIceBlockThaw",),
+ 0x80A30AE4:("EnSlime_IceBlockThaw",),
+ 0x80A30BE0:("EnSlime_SetupWaitForRevive",),
+ 0x80A30C2C:("EnSlime_WaitForRevive",),
+ 0x80A30C68:("EnSlime_SetupRevive",),
+ 0x80A30CEC:("EnSlime_Revive",),
+ 0x80A30F98:("EnSlime_UpdateDamage",),
0x80A311E8:("EnSlime_Update",),
0x80A3148C:("EnSlime_Draw",),
0x80A32210:("EnPr_Init",),
@@ -10620,7 +10620,7 @@
0x80A53E60:("func_80A53E60",),
0x80A541F4:("func_80A541F4",),
0x80A54600:("func_80A54600",),
- 0x80A54980:("ObjHugebombiwa_AddQuake",),
+ 0x80A54980:("ObjHugebombiwa_RequestQuakeAndRumble",),
0x80A54A0C:("func_80A54A0C",),
0x80A54AC0:("ObjHugebombiwa_Init",),
0x80A54BC4:("ObjHugebombiwa_Destroy",),
@@ -11433,7 +11433,7 @@
0x80A9BC0C:("func_80A9BC0C",),
0x80A9BD24:("func_80A9BD24",),
0x80A9C058:("func_80A9C058",),
- 0x80A9C18C:("func_80A9C18C",),
+ 0x80A9C18C:("BgHakuginPost_RequestQuakeAndRumble",),
0x80A9C228:("func_80A9C228",),
0x80A9C634:("func_80A9C634",),
0x80A9C854:("func_80A9C854",),
@@ -11971,7 +11971,7 @@
0x80AC6740:("TransitionWipe3_Start",),
0x80AC687C:("TransitionWipe3_Init",),
0x80AC68A8:("TransitionWipe3_Destroy",),
- 0x80AC68B4:("func_80AC68B4",),
+ 0x80AC68B4:("TransitionWipe3_UpdateScrollY",),
0x80AC68E0:("TransitionWipe3_Update",),
0x80AC69F8:("TransitionWipe3_Draw",),
0x80AC6BE4:("TransitionWipe3_IsDone",),
@@ -12211,7 +12211,7 @@
0x80AD566C:("EnTrt2_TransformLimbDraw",),
0x80AD56E8:("func_80AD56E8",),
0x80AD5BB0:("ObjTokeiStep_SetSysMatrix",),
- 0x80AD5BE8:("ObjTokeiStep_AddQuake",),
+ 0x80AD5BE8:("ObjTokeiStep_RequestQuakeAndRumble",),
0x80AD5C70:("ObjTokeiStep_SpawnDust",),
0x80AD5DFC:("ObjTokeiStep_InitSteps",),
0x80AD5EB8:("ObjTokeiStep_InitStepsOpen",),
@@ -12870,7 +12870,7 @@
0x80B01B30:("EnGiant_Init",),
0x80B01E74:("EnGiant_Destroy",),
0x80B01E84:("EnGiant_ChangeToStartOrLoopAnimation",),
- 0x80B01EE8:("EnGiant_ChangeAnimBasedOnCsAction",),
+ 0x80B01EE8:("EnGiant_ChangeAnimBasedOnCueId",),
0x80B020A0:("EnGiant_UpdateAlpha",),
0x80B0211C:("EnGiant_PlayAndUpdateAnimation",),
0x80B02234:("EnGiant_PlaySound",),
@@ -14411,7 +14411,7 @@
0x80B73AE4:("EnJg_UpdateCollision",),
0x80B73B98:("EnJg_GetWalkingYRotation",),
0x80B73C58:("EnJg_ReachedPoint",),
- 0x80B73DF4:("EnJg_GetCutsceneForTeachingLullabyIntro",),
+ 0x80B73DF4:("EnJg_GetCsIdForTeachingLullabyIntro",),
0x80B73E3C:("EnJg_SetupGoronShrineCheer",),
0x80B73F1C:("EnJg_SetupTalk",),
0x80B7406C:("EnJg_Idle",),
@@ -15161,7 +15161,7 @@
0x80BA78F8:("EnRailgibud_PostLimbDraw",),
0x80BA79D4:("EnRailgibud_Draw",),
0x80BA7B6C:("EnRailgibud_InitCutsceneGibdo",),
- 0x80BA7C78:("EnRailgibud_InitActorActionCommand",),
+ 0x80BA7C78:("EnRailgibud_InitCueType",),
0x80BA7CF0:("EnRailgibud_SetupDoNothing",),
0x80BA7D04:("EnRailgibud_DoNothing",),
0x80BA7D14:("EnRailgibud_SetupSinkIntoGround",),
@@ -15199,7 +15199,7 @@
0x80BAA6D0:("EnSuttari_UpdateCollider",),
0x80BAA848:("EnSuttari_GetActorById",),
0x80BAA88C:("EnSuttari_TriggerTransition",),
- 0x80BAA8D0:("EnSuttari_UpdateTime",),
+ 0x80BAA8D0:("EnSuttari_AdvanceTime",),
0x80BAA904:("func_80BAA904",),
0x80BAA9B4:("func_80BAA9B4",),
0x80BAAA94:("func_80BAAA94",),
@@ -16662,7 +16662,7 @@
0x80C0A740:("func_80C0A740",),
0x80C0A804:("func_80C0A804",),
0x80C0A838:("func_80C0A838",),
- 0x80C0A86C:("func_80C0A86C",),
+ 0x80C0A86C:("BgIkninSusceil_RequestQuakeAndRumble",),
0x80C0A95C:("func_80C0A95C",),
0x80C0AA70:("BgIkninSusceil_Init",),
0x80C0AAE0:("BgIkninSusceil_Destroy",),
@@ -16868,13 +16868,13 @@
0x80C18928:("BgLastBwall_DoNothing",),
0x80C18938:("BgLastBwall_Update",),
0x80C1895C:("BgLastBwall_Draw",),
- 0x80C18B90:("func_80C18B90",),
- 0x80C18BD8:("func_80C18BD8",),
- 0x80C18C50:("func_80C18C50",),
+ 0x80C18B90:("EnAnd_ChangeAnimation",),
+ 0x80C18BD8:("EnAnd_Blink",),
+ 0x80C18C50:("EnAnd_HandleCsAction",),
0x80C18DC8:("EnAnd_Init",),
0x80C18E84:("EnAnd_Destroy",),
0x80C18E94:("EnAnd_Update",),
- 0x80C18ED0:("func_80C18ED0",),
+ 0x80C18ED0:("EnAnd_TransformLimbDraw",),
0x80C19084:("EnAnd_Draw",),
0x80C192A0:("func_80C192A0",),
0x80C192B0:("func_80C192B0",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index d896f3ae7..592bb4650 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -289,7 +289,7 @@
0x80099520:("sIdleThread","OSThread","",0x1b0),
0x800996D0:("sIdleThreadStack","u8","[1024]",0x400),
0x80099AD0:("sIdleStackInfo","StackEntry","",0x1c),
- 0x80099AF0:("sBootThreadStack","u8","[1024]",0x400),
+ 0x80099AF0:("sBootStack","u8","[1024]",0x400),
0x80099EF0:("gIrqMgr","IrqMgr","",0x280),
0x8009A170:("sIrqMgrStack","u8","[1280]",0x500),
0x8009A670:("sIrqMgrStackInfo","StackEntry","",0x1c),
@@ -328,7 +328,7 @@
0x8009CD50:("sRandFloat","f32","",0x4),
0x8009CD60:("sArenaLockMsg","OSMesg","[1]",0x4),
0x8009CD70:("tmp_task","OSTask","",0x40),
- 0x8009CDB0:("osPifBuffers","OSPifRam","[4]",0x100),
+ 0x8009CDB0:("__MotorDataBuf","OSPifRam","[4]",0x100),
0x8009CEB0:("siAccessBuf","OSMesg","[1]",0x4),
0x8009CEB8:("__osSiAccessQueue","OSMesgQueue","",0x18),
0x8009CED0:("__osContPifRam","OSPifRam","",0x40),
@@ -451,6 +451,11 @@
0x801AEFC0:("D_801AEFC0","UNK_TYPE1","",0x1),
0x801AEFD0:("gActorOverlayTable","ActorOverlay","[ACTOR_ID_MAX]",0x5640),
0x801B4610:("gMaxActorId","s32","",0x4),
+ 0x801B4620:("sWallFlags","u32","",0x80),
+ 0x801B46A0:("sSurfaceSfxOffsets","u16","",0x1E),
+ 0x801B46C0:("sSurfaceMaterialProperties","u8","",0xF),
+ 0x801B46D0:("sSmallMemSceneIds","s16","",0x2),
+ 0x801B46D4:("sSceneMemList","BgCheckSceneMemEntry","",0x8),
0x801B46DC:("sSceneSubdivisionList","BgCheckSceneSubdivisionEntry","[3]",0x24),
0x801B4700:("sCustomDynapolyMem","BgSpecialSceneMaxObjects","[1]",0x8),
0x801B4708:("D_801B4708","UNK_TYPE1","",0x1),
@@ -467,19 +472,6 @@
0x801B48B0:("sSetNormal0ModeBoomerangData","UNK_TYPE1","",0x1),
0x801B48D4:("sSetNormal0ModeSlingshotData","UNK_TYPE1","",0x1),
0x801B48F8:("sSetNormal0ModeClimbZData","UNK_TYPE1","",0x1),
- 0x801B4710:("sSetNormal0ModeNormalData","UNK_TYPE1","",0x1),
- 0x801B4738:("sSetNormal0ModeTargetData","UNK_TYPE1","",0x1),
- 0x801B4768:("sSetNormal0ModeFollowTargetData","UNK_TYPE1","",0x1),
- 0x801B4798:("sSetNormal0ModeBattleData","UNK_TYPE1","",0x1),
- 0x801B47CC:("sSetNormal0ModeFirstPersonData","UNK_TYPE1","",0x1),
- 0x801B47F0:("sSetNormal0ModeTalkData","UNK_TYPE1","",0x1),
- 0x801B4824:("sSetNormal0ModeClimbData","UNK_TYPE1","",0x1),
- 0x801B4848:("sSetNormal0ModeBowArrowData","UNK_TYPE1","",0x1),
- 0x801B486C:("sSetNormal0ModeBowArrowZData","UNK_TYPE1","",0x1),
- 0x801B4890:("sSetNormal0ModeHookshotData","UNK_TYPE1","",0x1),
- 0x801B48B0:("sSetNormal0ModeBoomerangData","UNK_TYPE1","",0x1),
- 0x801B48D4:("sSetNormal0ModeSlingshotData","UNK_TYPE1","",0x1),
- 0x801B48F8:("sSetNormal0ModeClimbZData","UNK_TYPE1","",0x1),
0x801B491C:("sSetNormal0ModeJumpData","UNK_TYPE1","",0x1),
0x801B4944:("sSetNormal0ModeHangData","UNK_TYPE1","",0x1),
0x801B4974:("sSetNormal0ModeHangZData","UNK_TYPE1","",0x1),
@@ -918,14 +910,14 @@
0x801BB0DC:("D_801BB0DC","UNK_TYPE1","",0x1),
0x801BB0FC:("D_801BB0FC","UNK_TYPE2","",0x2),
0x801BB100:("D_801BB100","UNK_TYPE1","",0x1),
- 0x801BB124:("D_801BB124","UNK_TYPE2","",0x2),
- 0x801BB128:("D_801BB128","UNK_TYPE2","",0x2),
- 0x801BB12C:("D_801BB12C","UNK_TYPE1","",0x1),
+ 0x801BB124:("sCurTextId","UNK_TYPE2","",0x2),
+ 0x801BB128:("sCurOcarinaAction","UNK_TYPE2","",0x2),
+ 0x801BB12C:("gOpeningEntranceIndex","UNK_TYPE1","",0x1),
0x801BB130:("sCutsceneStoredPlayerForm","UNK_TYPE1","",0x1),
- 0x801BB134:("sCsStateHandlers1","cutscene_update_func","[5]",0x14),
- 0x801BB148:("sCsStateHandlers2","cutscene_update_func","[5]",0x14),
+ 0x801BB134:("sManualCutsceneHandlers","cutscene_update_func","[5]",0x14),
+ 0x801BB148:("sScriptedCutsceneHandlers","cutscene_update_func","[5]",0x14),
0x801BB15C:("D_801BB15C","UNK_TYPE2","",0x2),
- 0x801BB160:("D_801BB160","UNK_TYPE4","",0x4),
+ 0x801BB160:("sCutsceneTextboxType","UNK_TYPE4","",0x4),
0x801BB170:("sDrawItemTable","DrawItemTableEntry","[118]",0x1098),
0x801BC210:("gEffFootprintVtx","UNK_TYPE1","",0x1),
0x801BC240:("gEffFootprintMaterialDL","Gfx","[9]",0x48),
@@ -935,36 +927,18 @@
0x801BC400:("gEnHyParentBodyParts","UNK_TYPE1","",0x1),
0x801BC410:("gEnHyShadowSizes","s32",[],0x10),
0x801BC420:("sReactionTextIds","u16","[]",0x140A),
- 0x801BD830:("actorCutscenesGlobalCutscenes","ActorCutscene","[8]",0x80),
- 0x801BD8B0:("actorCutsceneCurrent","s16","",0x2),
- 0x801BD8B2:("actorCutsceneCurrentLength","s16","",0x2),
- 0x801BD8B4:("actorCutsceneEnding","s16","",0x2),
- 0x801BD8B6:("actorCutsceneCurrentCamera","s16","",0x2),
- 0x801BD8B8:("actorCutsceneCurrentCutsceneActor","Actor*","",0x4),
- 0x801BD8BC:("actorCutsceneStartMethod","UNK_TYPE4","",0x4),
- 0x801BD8C0:("actorCutscenesPlayState","PlayState*","",0x4),
- 0x801BD8C4:("actorCutsceneReturnCamera","s16","",0x2),
- 0x801BD8C6:("D_801BD8C6","s16","",0x2),
+ 0x801BD830:("sGlobalCutsceneList","ActorCutscene","[8]",0x80),
+ 0x801BD8B0:("sCutsceneMgr","ActorCutsceneManager","",0x18),
0x801BD8D0:("sFireObjCollisionInit","ColliderCylinderInit","",0x2c),
0x801BD8FC:("sFireObjColors","FireObjColors","[1]",0x08),
0x801BD904:("sFireObjLightParams","FireObjLightParams","[1]",0x08),
0x801BD910:("gGameStateOverlayTable","GameStateOverlay","[7]",0x150),
- 0x801BDA60:("graphNumGameStates","UNK_TYPE4","",0x4),
- 0x801BDA70:("D_801BDA70","UNK_TYPE2","",0x2),
- 0x801BDA74:("D_801BDA74","UNK_TYPE2","",0x2),
- 0x801BDA78:("D_801BDA78","UNK_TYPE2","",0x2),
- 0x801BDA7C:("D_801BDA7C","UNK_TYPE2","",0x2),
- 0x801BDA9C:("D_801BDA9C","UNK_TYPE4","",0x4),
- 0x801BDAA0:("D_801BDAA0","UNK_TYPE4","",0x4),
- 0x801BDAA4:("D_801BDAA4","UNK_TYPE4","",0x4),
- 0x801BDAA8:("D_801BDAA8","UNK_TYPE2","",0x2),
- 0x801BDAAA:("D_801BDAAA","UNK_TYPE2","",0x2),
- 0x801BDAAC:("D_801BDAAC","UNK_TYPE2","",0x2),
- 0x801BDAAE:("D_801BDAAE","UNK_TYPE2","",0x2),
- 0x801BDAB0:("D_801BDAB0","UNK_TYPE2","",0x2),
- 0x801BDAB2:("D_801BDAB2","UNK_TYPE2","",0x2),
- 0x801BDAB4:("D_801BDAB4","UNK_TYPE2","",0x2),
- 0x801BDAB6:("D_801BDAB6","UNK_TYPE2","",0x2),
+ 0x801BDA60:("gGraphNumGameStates","UNK_TYPE4","",0x4),
+ 0x801BDA70:("sHorseValidScenes","struct_801BDAA8","[11]",0x2C),
+ 0x801BDA9C:("gHorseIsMounted","s32","",0x4),
+ 0x801BDAA0:("D_801BDAA0","s32","",0x4),
+ 0x801BDAA4:("gHorsePlayedEponasSong","s32","",0x4),
+ 0x801BDAA8:("sHorseValidSceneLayers","struct_801BDAA8","[4]",0x10),
0x801BDAC0:("D_801BDAC0","UNK_TYPE4","",0x4),
0x801BDAC4:("D_801BDAC4","UNK_TYPE4","",0x4),
0x801BDAC8:("D_801BDAC8","UNK_TYPE4","",0x4),
@@ -1014,10 +988,10 @@
0x801BE9F4:("sHeartsDDEnvColors","s16","[3][3]",0x12),
0x801BEA08:("sHeartsDDPrimFactors","s16","[3][3]",0x12),
0x801BEA1C:("sHeartsDDEnvFactors","s16","[3][3]",0x12),
- 0x801BEA30:("HeartTextures","UNK_TYPE1","",0x1),
- 0x801BEA70:("HeartDDTextures","UNK_TYPE1","",0x1),
- 0x801BEAB0:("posBindFuncs","LightsPosBindFunc","[3]",0xc),
- 0x801BEABC:("dirBindFuncs","LightsBindFunc","[3]",0xc),
+ 0x801BEA30:("sHeartTextures","UNK_TYPE1","",0x1),
+ 0x801BEA70:("sHeartDDTextures","UNK_TYPE1","",0x1),
+ 0x801BEAB0:("sPosBindFuncs","LightsPosBindFunc","[3]",0xc),
+ 0x801BEABC:("sDirBindFuncs","LightsBindFunc","[3]",0xc),
0x801BEAD4:("D_801BEAD4","UNK_TYPE4","",0x4),
0x801BEAD8:("D_801BEAD8","UNK_TYPE4","",0x4),
0x801BEAE0:("D_801BEAE0","UNK_TYPE1","",0x1),
@@ -1140,30 +1114,30 @@
0x801BFB1C:("sMagicArrowEffectsG","UNK_TYPE1","",0x1),
0x801BFB24:("sMagicArrowEffectsB","UNK_TYPE1","",0x1),
0x801BFB2C:("sThreeDayClockAlpha","UNK_TYPE2","",0x2),
- 0x801BFB30:("D_801BFB30","UNK_TYPE2","",0x2),
- 0x801BFB34:("D_801BFB34","UNK_TYPE2","",0x2),
+ 0x801BFB30:("sClockAlphaTimer1","UNK_TYPE2","",0x2),
+ 0x801BFB34:("sClockAlphaTimer2","UNK_TYPE2","",0x2),
0x801BFB38:("sThreeDayClockHours","UNK_TYPE1","",0x1),
0x801BFB6C:("sThreeDayClockHourTextures","UNK_TYPE1","",0x1),
- 0x801BFBCC:("D_801BFBCC","UNK_TYPE2","",0x2),
- 0x801BFBD0:("D_801BFBD0","UNK_TYPE2","",0x2),
- 0x801BFBD4:("D_801BFBD4","UNK_TYPE2","",0x2),
- 0x801BFBD8:("D_801BFBD8","UNK_TYPE2","",0x2),
- 0x801BFBDC:("D_801BFBDC","UNK_TYPE2","",0x2),
- 0x801BFBE0:("D_801BFBE0","UNK_TYPE2","",0x2),
- 0x801BFBE4:("D_801BFBE4","UNK_TYPE2","",0x2),
- 0x801BFBE8:("D_801BFBE8","UNK_TYPE2","",0x2),
- 0x801BFBEC:("D_801BFBEC","UNK_TYPE1","",0x1),
- 0x801BFBF0:("D_801BFBF0","UNK_TYPE1","",0x1),
- 0x801BFBF4:("D_801BFBF4","UNK_TYPE1","",0x1),
- 0x801BFBF8:("D_801BFBF8","UNK_TYPE1","",0x1),
- 0x801BFBFC:("D_801BFBFC","UNK_TYPE1","",0x1),
- 0x801BFC00:("D_801BFC00","UNK_TYPE1","",0x1),
- 0x801BFC04:("D_801BFC04","UNK_TYPE1","",0x1),
- 0x801BFC08:("D_801BFC08","UNK_TYPE1","",0x1),
- 0x801BFC0C:("D_801BFC0C","UNK_TYPE1","",0x1),
- 0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1),
+ 0x801BFBCC:("sClockInvDiamondPrimRed","UNK_TYPE2","",0x2),
+ 0x801BFBD0:("sClockInvDiamondPrimGreen","UNK_TYPE2","",0x2),
+ 0x801BFBD4:("sClockInvDiamondPrimBlue","UNK_TYPE2","",0x2),
+ 0x801BFBD8:("sClockInvDiamondEnvRed","UNK_TYPE2","",0x2),
+ 0x801BFBDC:("sClockInvDiamondEnvGreen","UNK_TYPE2","",0x2),
+ 0x801BFBE0:("sClockInvDiamondEnvBlue","UNK_TYPE2","",0x2),
+ 0x801BFBE4:("sClockInvDiamondTimer","UNK_TYPE2","",0x2),
+ 0x801BFBE8:("sClockInvDiamondTargetIndex","UNK_TYPE2","",0x2),
+ 0x801BFBEC:("sClockInvDiamondPrimRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF0:("sClockInvDiamondPrimGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF4:("sClockInvDiamondPrimBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF8:("sClockInvDiamondEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBFC:("sClockInvDiamondEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC00:("sClockInvDiamondEnvBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFC04:("sFinalHoursClockDigitsRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC08:("sFinalHoursClockFrameEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC0C:("sFinalHoursClockFrameEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC10:("sFinalHoursClockFrameEnvBlueTargets","UNK_TYPE1","",0x1),
0x801BFC14:("sFinalHoursDigitTextures","UNK_TYPE1","",0x1),
- 0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1),
+ 0x801BFC40:("sFinalHoursDigitSlotPosXOffset","UNK_TYPE1","",0x1),
0x801BFC50:("sPerfectLettersType1OffScreenAngles","UNK_TYPE2","",0x2),
0x801BFC60:("sPerfectLettersType1PrimColorTargets","s16","[6]",0xC),
0x801BFC6C:("sPerfectLettersType2SpellingOffsetsX","UNK_TYPE4","",0x4),
@@ -1205,9 +1179,9 @@
0x801C0034:("gPlayerSheath12DLs","UNK_TYPE1","",0x1),
0x801C005C:("gPlayerSheath13DLs","UNK_TYPE1","",0x1),
0x801C0084:("gPlayerSheath14DLs","UNK_TYPE1","",0x1),
- 0x801C00AC:("gPlayerShields","UNK_TYPE1","",0x1),
- 0x801C00BC:("gPlayerSheathedSwords","UNK_TYPE1","",0x1),
- 0x801C00D4:("gPlayerSwordSheaths","UNK_TYPE1","",0x1),
+ 0x801C00AC:("gPlayerShields","Gfx*","",0x10),
+ 0x801C00BC:("gPlayerSheathedSwords","Gfx*","",0x18),
+ 0x801C00D4:("gPlayerSwordSheaths","Gfx*","",0x18),
0x801C00EC:("gPlayerLeftHandTwoHandSwordDLs","UNK_TYPE1","",0x1),
0x801C0114:("gPlayerLeftHandOpenDLs","UNK_TYPE1","",0x1),
0x801C013C:("gPlayerLeftHandClosedDLs","UNK_TYPE1","",0x1),
@@ -1219,11 +1193,11 @@
0x801C021C:("gPlayerRightHandInstrumentDLs","UNK_TYPE1","",0x1),
0x801C0244:("gPlayerRightHandHookshotDLs","UNK_TYPE1","",0x1),
0x801C026C:("gPlayerLeftHandBottleDLs","UNK_TYPE1","",0x1),
- 0x801C0294:("D_801C0294","UNK_TYPE1","",0x1),
- 0x801C02A8:("D_801C02A8","UNK_TYPE1","",0x1),
- 0x801C02BC:("D_801C02BC","UNK_TYPE1","",0x1),
- 0x801C02D0:("D_801C02D0","UNK_TYPE1","",0x1),
- 0x801C02E4:("D_801C02E4","UNK_TYPE1","",0x1),
+ 0x801C0294:("sPlayerFirstPersonLeftForearmDLs","UNK_TYPE1","",0x1),
+ 0x801C02A8:("sPlayerFirstPersonLeftHandDLs","UNK_TYPE1","",0x1),
+ 0x801C02BC:("sPlayerFirstPersonRightShoulderDLs","UNK_TYPE1","",0x1),
+ 0x801C02D0:("sPlayerFirstPersonRightHandDLs","UNK_TYPE1","",0x1),
+ 0x801C02E4:("sPlayerFirstPersonRightHandHookshotDLs","UNK_TYPE1","",0x1),
0x801C02F8:("sPlayerDListGroups","UNK_PTR","",0x4),
0x801C0340:("D_801C0340","UNK_TYPE1","",0x1),
0x801C0368:("D_801C0368","UNK_TYPE1","",0x1),
@@ -1274,7 +1248,7 @@
0x801C0958:("D_801C0958","UNK_TYPE4","",0x4),
0x801C095C:("D_801C095C","UNK_PTR","",0x4),
0x801C0964:("D_801C0964","UNK_TYPE1","",0x1),
- 0x801C096C:("D_801C096C","UNK_TYPE1","",0x1),
+ 0x801C096C:("sPlayerShieldCollisionTypes","UNK_TYPE1","",0x1),
0x801C0970:("D_801C0970","UNK_TYPE1","",0x1),
0x801C0994:("D_801C0994","UNK_TYPE4","",0x4),
0x801C09B8:("D_801C09B8","UNK_TYPE1","",0x1),
@@ -1308,35 +1282,34 @@
0x801C0C0C:("D_801C0C0C","UNK_TYPE4","",0x4),
0x801C0C30:("D_801C0C30","UNK_TYPE1","",0x1),
0x801C0C54:("D_801C0C54","struct_80128388_arg1","",0x54),
- 0x801C0CA8:("D_801C0CA8","UNK_TYPE1","",0x1),
+ 0x801C0CA8:("sPlayerBottleColors","UNK_TYPE1","",0x1),
0x801C0CE8:("D_801C0CE8","UNK_TYPE4","",0x4),
- 0x801C0D24:("D_801C0D24","UNK_TYPE1","",0x1),
+ 0x801C0D24:("sPlayerFootPos","UNK_TYPE1","",0x1),
0x801C0D60:("D_801C0D60","UNK_TYPE1","",0x1),
0x801C0D6C:("D_801C0D6C","UNK_TYPE1","",0x1),
- 0x801C0D78:("D_801C0D78","UNK_TYPE1","",0x1),
+ 0x801C0D78:("sMeleeWeaponLengths","f32","[7]",0x1C),
0x801C0D94:("D_801C0D94","UNK_TYPE4","",0x4),
- 0x801C0D98:("D_801C0D98","UNK_TYPE4","",0x4),
- 0x801C0D9C:("D_801C0D9C","UNK_TYPE4","",0x4),
- 0x801C0DA0:("D_801C0DA0","UNK_TYPE4","",0x4),
- 0x801C0DA8:("D_801C0DA8","UNK_TYPE1","",0x1),
+ 0x801C0D98:("D_801C0D98","Vec3f","",0xC),
+ 0x801C0DA4:("D_801C0DA4","UNK_TYPE4","",0x4),
+ 0x801C0DA8:("sRightHandLimbModelShieldQuadVertices","Vec3f","[4]",0x30),
0x801C0DD8:("D_801C0DD8","UNK_TYPE1","",0x1),
0x801C0DE4:("D_801C0DE4","UNK_TYPE1","",0x1),
0x801C0DF0:("D_801C0DF0","UNK_TYPE4","",0x4),
0x801C0E04:("D_801C0E04","UNK_TYPE1","",0x1),
0x801C0E2C:("D_801C0E2C","UNK_TYPE4","",0x4),
0x801C0E40:("D_801C0E40","UNK_TYPE4","",0x4),
- 0x801C0E7C:("D_801C0E7C","UNK_TYPE1","",0x1),
+ 0x801C0E7C:("sPlayerFocusHeadLimbModelPos","Vec3f","",0xC),
0x801C0E94:("D_801C0E94","UNK_TYPE1","",0x1),
0x801C0EA0:("D_801C0EA0","UNK_TYPE1","",0x1),
- 0x801C0EAC:("D_801C0EAC","UNK_TYPE1","",0x1),
- 0x801C0EB8:("D_801C0EB8","UNK_TYPE1","",0x1),
- 0x801C0EC0:("sIsQuakeInitialized","UNK_TYPE2","",0x2),
+ 0x801C0EAC:("sSheathLimbModelShieldOnBackPos","Vec3f","",0xC),
+ 0x801C0EB8:("sSheathLimbModelShieldOnBackZyxRot","Vec3s","",0x6),
+ 0x801C0EC0:("sQuakeUnused","UNK_TYPE2","",0x2),
0x801C0EC4:("sQuakeRequestCount","s16","",0x2),
0x801C0EC8:("sQuakeCallbacks","quake_callback_func","[7]",0x1c),
0x801C0EE4:("D_801C0EE4","s16","",0x2),
0x801C0EE8:("D_801C0EE8","s16","",0x2),
0x801C0EEC:("D_801C0EEC","s16","",0x2),
- 0x801C0EF0:("sSetupDL","Gfx","[438]",0xdb0),
+ 0x801C0EF0:("gSetupDLs","Gfx","[438]",0xdb0),
0x801C1CA0:("sFillSetupDL","Gfx","[12]",0x60),
0x801C1D00:("gEmptyDL","Gfx","[1]",0x8),
0x801C1D10:("sZeroVec","Vec3f","",0xc),
@@ -1952,16 +1925,16 @@
0x801C5EB0:("D_801C5EB0","UNK_TYPE4","",0x4),
0x801C5EC4:("D_801C5EC4","UNK_TYPE2","",0x2),
0x801C5F44:("D_801C5F44","UNK_TYPE4","",0x4),
- 0x801C5FC0:("D_801C5FC0","u32","[452]",0x710),
+ 0x801C5FC0:("sPersistentCycleFlags","u32","[452]",0x710),
0x801C66D0:("D_801C66D0","UNK_TYPE2","",0x2),
- 0x801C6798:("D_801C6798","UNK_TYPE4","",0x4),
+ 0x801C6798:("gSramSlotOffsets","UNK_TYPE4","",0x4),
0x801C67B0:("gAmmoItems","UNK_TYPE1","",0x1),
- 0x801C67C8:("D_801C67C8","s32","[10]",0x28),
- 0x801C67F0:("D_801C67F0","s32","[10]",0x28),
- 0x801C6818:("D_801C6818","s32","[10]",0x28),
- 0x801C6840:("D_801C6840","UNK_TYPE1","",0x1),
- 0x801C6850:("D_801C6850","UNK_TYPE1","",0x1),
- 0x801C6870:("D_801C6870","UNK_TYPE1","",0x1),
+ 0x801C67C8:("gFlashSaveStartPages","s32","[10]",0x28),
+ 0x801C67F0:("gFlashSaveNumPages","s32","[10]",0x28),
+ 0x801C6818:("gFlashSpecialSaveNumPages","s32","[10]",0x28),
+ 0x801C6840:("gFlashOwlSaveStartPages","UNK_TYPE1","",0x1),
+ 0x801C6850:("gFlashOwlSaveNumPages","UNK_TYPE1","",0x1),
+ 0x801C6870:("gFlashSaveSizes","UNK_TYPE1","",0x1),
0x801C6890:("D_801C6890","UNK_TYPE1","",0x1),
0x801C6898:("sSaveDefaultPlayerData","SavePlayerData","",0x28),
0x801C68C0:("sSaveDefaultItemEquips","ItemEquips","",0x22),
@@ -1984,9 +1957,9 @@
0x801C6A8C:("D_801C6A8C","UNK_TYPE2","",0x2),
0x801C6A90:("D_801C6A90","UNK_TYPE2","",0x2),
0x801C6A94:("D_801C6A94","UNK_TYPE2","",0x2),
- 0x801C6A98:("D_801C6A98","UNK_TYPE1","",0x1),
- 0x801C6AB8:("D_801C6AB8","UNK_TYPE1","",0x1),
- 0x801C6B28:("D_801C6B28","UNK_TYPE1","",0x1),
+ 0x801C6A98:("gPageSwitchNextButtonStatus","UNK_TYPE1","",0x1),
+ 0x801C6AB8:("sBombersNotebookEventMessages","UNK_TYPE1","",0x1),
+ 0x801C6B28:("gBombersNotebookWeekEventFlags","UNK_TYPE1","",0x1),
0x801C6B98:("D_801C6B98","UNK_TYPE1","",0x1),
0x801CED40:("D_801CED40","UNK_TYPE1","",0x1),
0x801CFB08:("D_801CFB08","UNK_TYPE1","",0x1),
@@ -2130,7 +2103,7 @@
0x801D0B70:("gKaleidoMgrOverlayTable","KaleidoMgrOverlay","",0x38),
0x801D0BA8:("sKaleidoAreaPtr","void*","",0x4),
0x801D0BAC:("gKaleidoMgrCurOvl","KaleidoMgrOverlay*","",0x4),
- 0x801D0BB0:("D_801D0BB0","UNK_TYPE4","",0x4),
+ 0x801D0BB0:("gTransitionOverlayTable","UNK_TYPE4","",0x4),
0x801D0C80:("D_801D0C80","UNK_TYPE1","",0x1),
0x801D0CB0:("D_801D0CB0","UNK_TYPE1","",0x1),
0x801D0CD8:("TransitionFade_InitVars","UNK_PTR","",0x4),
@@ -2141,21 +2114,15 @@
0x801D0D58:("sQuakeIndex","UNK_TYPE2","",0x2),
0x801D0D5C:("sIsCameraUnderwater","UNK_TYPE2","",0x2),
0x801D0D60:("D_801D0D60","Input*","",0x4),
- 0x801D0D64:("D_801D0D64","s16","[10]",0x14),
- 0x801D0D78:("D_801D0D78","u16","[4]",0x4),
- 0x801D0D80:("D_801D0D80","UNK_TYPE1","",0x1),
- 0x801D11F4:("D_801D11F4","UNK_TYPE1","",0x1),
- 0x801D1230:("D_801D1230","UNK_TYPE1","",0x1),
- 0x801D1234:("D_801D1234","UNK_TYPE1","",0x1),
- 0x801D1238:("D_801D1238","UNK_TYPE4","",0x4),
- 0x801D1244:("D_801D1244","UNK_TYPE1","",0x1),
- 0x801D12C0:("D_801D12C0","UNK_TYPE1","",0x1),
- 0x801D12D0:("D_801D12D0","UNK_TYPE1","",0x1),
- 0x801D12D4:("D_801D12D4","UNK_TYPE1","",0x1),
- 0x801D12D8:("D_801D12D8","UNK_TYPE1","",0x1),
+ 0x801D0D64:("sPlayerCsIdToCsCamId","s16","[10]",0x14),
+ 0x801D0D80:("D_801D0D80","UNK_TYPE1","",0x4B0),
+ 0x801D1230:("D_801D1230","UNK_TYPE1","",0x8),
+ 0x801D1238:("D_801D1238","UNK_TYPE4","",0x1),
+ 0x801D1244:("D_801D1244","UNK_TYPE1","",0x8C),
+ 0x801D12D0:("D_801D12D0","UNK_TYPE1","",0xC),
0x801D12DC:("D_801D12DC","UNK_TYPE1","",0x1),
- 0x801D1330:("D_801D1330","UNK_TYPE2","",0x2),
- 0x801D1342:("D_801D1342","UNK_TYPE1","",0x1),
+ 0x801D12E8:("D_801D12E8","UNK_TYPE1","",0x1),
+ 0x801D1330:("D_801D1330","UNK_TYPE1","",0x14),
0x801D1344:("D_801D1344","UNK_TYPE2","",0x2),
0x801D1368:("D_801D1368","UNK_TYPE1","",0x1),
0x801D1374:("D_801D1374","UNK_TYPE2","",0x2),
@@ -2198,9 +2165,9 @@
0x801D1520:("gScreenWidth","s32","",0x4),
0x801D1524:("gScreenHeight","s32","",0x4),
0x801D1528:("startHeapSize","UNK_TYPE4","",0x4),
- 0x801D1530:("padmgrContext","PadMgr*","",0x4),
- 0x801D1534:("controllerInputsCaptured","UNK_TYPE4","",0x4),
- 0x801D1538:("D_801D1538","UNK_TYPE4","",0x4),
+ 0x801D1530:("sPadMgrInstance","PadMgr*","",0x4),
+ 0x801D1534:("sPadMgrRetraceCount","UNK_TYPE4","",0x4),
+ 0x801D1538:("sVoiceInitStatus","UNK_TYPE4","",0x4),
0x801D1540:("D_801D1540","UNK_PTR","",0x4),
0x801D1570:("D_801D1570","f32","[13]",0x34),
0x801D15B0:("gZeroVec3f","Vec3f","",0xC),
@@ -3855,14 +3822,14 @@
0x801ED8D8:("D_801ED8D8","UNK_TYPE1","",0x1),
0x801ED8DC:("D_801ED8DC","UNK_TYPE1","",0x1),
0x801ED8E0:("D_801ED8E0","Mtx","",0x40),
- 0x801ED920:("D_801ED920","UNK_TYPE1","",0x1),
+ 0x801ED920:("D_801ED920","Actor*","",0x1),
0x801ED930:("D_801ED930","FaultClient","",0x10),
0x801ED940:("sActorOverlayTableFaultAddrConvClient","FaultAddrConvClient","",0xC),
0x801ED950:("D_801ED950","char","[80]",0x50),
0x801ED9A0:("D_801ED9A0","char","[80]",0x50),
0x801ED9F0:("D_801ED9F0","Vec3f","[3]",0x24),
0x801EDA18:("D_801EDA18","Vec3f","[3]",0x24),
- 0x801EDA40:("D_801EDA40","MtxF","",0x40),
+ 0x801EDA40:("sModelToWorldMtxF","MtxF","",0x40),
0x801EDA80:("D_801EDA80","Vec3f","[3]",0x24),
0x801EDAA8:("D_801EDAA8","char","[80]",0x50),
0x801EDAF8:("D_801EDAF8","char","[80]",0x50),
@@ -3872,9 +3839,9 @@
0x801EDBA8:("D_801EDBA8","Sphere16","",0x8),
0x801EDBB0:("D_801EDBB0","TriNorm","",0x34),
0x801EDBF0:("D_801EDBF0","s16","",0x2),
- 0x801EDBF4:("D_801EDBF4","f32","",0x4),
- 0x801EDBF8:("D_801EDBF8","f32","",0x4),
- 0x801EDC00:("D_801EDC00","CameraCollision","",0x28),
+ 0x801EDBF4:("sFloorYNear","f32","",0x4),
+ 0x801EDBF8:("sFloorYFar","f32","",0x4),
+ 0x801EDC00:("sFarColChk","CameraCollision","",0x28),
0x801EDC28:("sCamPlayState","PlayState*","",0x4),
0x801EDC30:("D_801EDC30","SwingAnimation","[4]",0x1A0),
0x801EDDD0:("D_801EDDD0","Vec3f","",0xc),
@@ -3927,18 +3894,18 @@
0x801F3F60:("gRegEditor","RegEditor*","",0x4),
0x801F3F70:("sDebugObjectListHead","UNK_TYPE1","",0x1),
0x801F3F80:("D_801F3F80","UNK_TYPE1","",0xDC0),
- 0x801F4D40:("seqId","u16","",0x2),
+ 0x801F4D40:("sSeqId","u16","",0x2),
0x801F4D42:("sCutsceneQuakeIndex","UNK_TYPE2","",0x2),
0x801F4D48:("sCutsceneCameraInfo","UNK_TYPE","",0x80),
- 0x801F4DC8:("D_801F4DC8","u16","[10]",0x14),
+ 0x801F4DC8:("sCueTypeList","u16","[10]",0x14),
0x801F4DDC:("D_801F4DDC","UNK_TYPE1","",0x1),
- 0x801F4DE0:("D_801F4DE0","UNK_TYPE1","",0x1),
- 0x801F4DE2:("D_801F4DE2","UNK_TYPE2","",0x2),
- 0x801F4DF0:("actorCutscenes","ActorCutscene*","",0x4),
- 0x801F4DF4:("actorCutsceneCount","s16","",0x2),
- 0x801F4DF8:("actorCutsceneWaiting","u8","[16]",0x10),
+ 0x801F4DE0:("gDisablePlayerCsModeStartPos","UNK_TYPE1","",0x1),
+ 0x801F4DE2:("gDungeonBossWarpSceneId","UNK_TYPE2","",0x2),
+ 0x801F4DF0:("sSceneCutsceneList","ActorCutscene*","",0x4),
+ 0x801F4DF4:("sSceneCutsceneCount","s16","",0x2),
+ 0x801F4DF8:("sWaitingCutsceneList","u8","[16]",0x10),
0x801F4E08:("D_801F4E08","UNK_TYPE1","",0x1),
- 0x801F4E10:("actorCutsceneNextCutscenes","u8","[16]",0x10),
+ 0x801F4E10:("sNextCutsceneList","u8","[16]",0x10),
0x801F4E20:("D_801F4E20","UNK_TYPE1","",0x1),
0x801F4E30:("D_801F4E30","UNK_TYPE1","",0x1),
0x801F4E31:("D_801F4E31","UNK_TYPE1","",0x1),
@@ -4004,14 +3971,14 @@
0x801F59AC:("D_801F59AC","UNK_TYPE1","",0x1),
0x801F59B0:("D_801F59B0","Vec3f","[2]",0x18),
0x801F59C8:("D_801F59C8","s32","[2]",0x8),
- 0x801F59D0:("D_801F59D0","struct_801F59D0","",0x0A),
- 0x801F59DC:("D_801F59DC","Vec3f*","",0x4),
+ 0x801F59D0:("sBunnyEarKinematics","struct_801F59D0","",0x0A),
+ 0x801F59DC:("sPlayerCurBodyPartPos","Vec3f*","",0x4),
0x801F59E0:("D_801F59E0","s32","",0x4),
- 0x801F59E4:("D_801F59E4","s32","",0x4),
- 0x801F59E8:("D_801F59E8","Vec3f","",0xC),
- 0x801F59F4:("D_801F59F4","s32","",0x4),
- 0x801F59F8:("D_801F59F8","s32","",0x4),
- 0x801F5A00:("sQuakeRequest","QuakeRequest","[4]",0x90),
+ 0x801F59E4:("sPlayerLod","s32","",0x4),
+ 0x801F59E8:("sPlayerGetItemRefPos","Vec3f","",0xC),
+ 0x801F59F4:("sPlayerLeftHandType","s32","",0x4),
+ 0x801F59F8:("sPlayerRightHandType","s32","",0x4),
+ 0x801F5A00:("sQuakeRequests","QuakeRequest","[4]",0x90),
0x801F5A90:("sDistortionRequest","DistortionRequest","",0xc),
0x801F5AA0:("sMatAnimStep","s32","",0x4),
0x801F5AA4:("sMatAnimFlags","u32","",0x4),
@@ -4045,7 +4012,7 @@
0x801F6B3C:("sPlayerCallDrawFunc","UNK_TYPE1","",0x1),
0x801F6B40:("sShrinkWindow","ShrinkWindow","",0x4),
0x801F6B44:("sShrinkWindowPtr","ShrinkWindow*","",0x4),
- 0x801F6B50:("D_801F6B50","UNK_TYPE4","",0x4),
+ 0x801F6B50:("sCurCsCamera","UNK_TYPE4","",0x4),
0x801F6B58:("D_801F6B58","UNK_TYPE1","",0x1),
0x801F6BF0:("sKaleidoMgrFaultAddrConvClient","FaultAddrConvClient","",0xC),
0x801F6C00:("sKaleidoScopeUpdateFunc","void*","",0x4),
@@ -4067,9 +4034,9 @@
0x801F6FE8:("sSlowlyStack","u8","[4096]",0x1000),
0x801F7FF0:("D_801F7FF0","UNK_TYPE1","",0x1),
0x801F8010:("D_801F8010","struct_801F8010","",0x10),
- 0x801F8020:("D_801F8020","struct_801F8020","",0x10),
+ 0x801F8020:("sVisZbuf","VisZbuf","",0x10),
0x801F8030:("sMonoColors","VisMono","",0x18),
- 0x801F8048:("D_801F8048","UNK_TYPE1","",0x1),
+ 0x801F8048:("D_801F8048","ViMode","",0x88),
0x801F80D0:("sGraphFaultAddrConvClient","FaultAddrConvClient","",0xc),
0x801F80E0:("sGraphFaultClient","FaultClient","",0x10),
0x801F80F0:("gGfxMasterDL","Gfx*","",0x4),
@@ -4112,30 +4079,30 @@
0x801FBB14:("D_801FBB14","UNK_TYPE1","",0x1),
0x801FBB20:("gRDPTotalTime","UNK_TYPE1","",0x1),
0x801FBB28:("D_801FBB28","UNK_TYPE1","",0x1),
- 0x801FBB30:("D_801FBB30","OSViMode","",0x50),
+ 0x801FBB30:("sNotebookViMode","OSViMode","",0x50),
0x801FBB80:("gFramebuffers","u32*","[2]",0x8),
- 0x801FBB88:("D_801FBB88","OSViMode*","",0x4),
+ 0x801FBB88:("gActiveViMode","OSViMode*","",0x4),
0x801FBB8C:("gZBufferPtr","u16*","",0x4),
- 0x801FBB90:("D_801FBB90","UNK_TYPE4","",0x4),
+ 0x801FBB90:("gWorkBuffer","UNK_TYPE4","",0x4),
0x801FBB94:("gGfxSPTaskOutputBufferPtr","UNK_TYPE1","",0x1),
- 0x801FBB98:("gGfxSPTaskOutputBufferSize","UNK_TYPE1","",0x1),
- 0x801FBB9C:("D_801FBB9C","UNK_TYPE1","",0x1),
- 0x801FBBA0:("D_801FBBA0","UNK_TYPE1","",0x1),
- 0x801FBBA4:("gZBuffer","u16*","",0x4),
- 0x801FBBA8:("gWorkBuffer","u16**","",0x4),
- 0x801FBBAC:("gGfxSPTaskOutputBuffer","u16**","",0x4),
- 0x801FBBB0:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
- 0x801FBBB4:("D_801FBBB4","UNK_TYPE1","",0x1),
- 0x801FBBB8:("D_801FBBB8","UNK_TYPE1","",0x1),
- 0x801FBBBC:("D_801FBBBC","UNK_TYPE1","",0x1),
- 0x801FBBC0:("D_801FBBC0","UNK_TYPE1","",0x1),
- 0x801FBBC4:("gGfxSPTaskOutputBuffer2","UNK_TYPE1","",0x1),
- 0x801FBBC8:("gGfxSPTaskOutputBufferEnd2","UNK_TYPE1","",0x1),
- 0x801FBBCC:("D_801FBBCC","UNK_TYPE2","",0x2),
- 0x801FBBCE:("D_801FBBCE","UNK_TYPE2","",0x2),
- 0x801FBBD0:("D_801FBBD0","UNK_TYPE1","",0x1),
- 0x801FBBD2:("D_801FBBD2","UNK_TYPE1","",0x1),
- 0x801FBBD4:("D_801FBBD4","UNK_TYPE1","",0x1),
+ 0x801FBB98:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
+ 0x801FBB9C:("sCfbLoRes1","UNK_TYPE1","",0x1),
+ 0x801FBBA0:("sCfbLoRes0","UNK_TYPE1","",0x1),
+ 0x801FBBA4:("gZBufferLoRes","u16*","",0x4),
+ 0x801FBBA8:("gWorkBufferLoRes","u16**","",0x4),
+ 0x801FBBAC:("gGfxSPTaskOutputBufferLoRes","u16**","",0x4),
+ 0x801FBBB0:("gGfxSPTaskOutputBufferEndLoRes","UNK_TYPE1","",0x1),
+ 0x801FBBB4:("sCfbHiRes1","UNK_TYPE1","",0x1),
+ 0x801FBBB8:("sCfbHiRes0","UNK_TYPE1","",0x1),
+ 0x801FBBBC:("gZBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC0:("gWorkBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC4:("gGfxSPTaskOutputBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC8:("gGfxSPTaskOutputBufferEndHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBCC:("gCfbWidth","UNK_TYPE2","",0x2),
+ 0x801FBBCE:("gCfbHeight","UNK_TYPE2","",0x2),
+ 0x801FBBD0:("gCfbLeftAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD2:("gCfbUpperAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD4:("gSysCfbHiResEnabled","UNK_TYPE1","",0x1),
0x801FBBE0:("sDmaBuffer","u32","[2]",0x8),
0x801FBBF0:("D_801FBBF0","Vec3f","",0xc),
0x801FBC00:("Math3D_ColSphereTri_line","LineSegment","",0x18),
@@ -4211,14 +4178,14 @@
0x801FBDE8:("D_801FBDE8","Vec3f","",0xc),
0x801FBE00:("sMatrixStack","MtxF*","",0x4),
0x801FBE04:("sCurrentMatrix","MtxF*","",0x4),
- 0x801FBE10:("D_801FBE10","UNK_TYPE1","",0x1),
- 0x801FBE28:("D_801FBE28","UNK_TYPE1","",0x1),
- 0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1),
- 0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4),
+ 0x801FBE10:("sFlashromMesgQueue","UNK_TYPE1","",0x1),
+ 0x801FBE28:("sFlashromMesg","UNK_TYPE1","",0x1),
+ 0x801FBE2C:("sFlashromIsInit","UNK_TYPE1","",0x1),
+ 0x801FBE30:("sFlashromVendor","UNK_TYPE4","",0x4),
0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000),
- 0x801FCE38:("sys_flashromStackEntry","StackEntry","",0x1c),
- 0x801FCE58:("sys_flashromOSThread","OSThread","",0x1b0),
- 0x801FD008:("D_801FD008","s80185D40","",0x2c),
+ 0x801FCE38:("sSysFlashromStackInfo","StackEntry","",0x1c),
+ 0x801FCE58:("sSysFlashromThread","OSThread","",0x1b0),
+ 0x801FD008:("sFlashromRequest","s80185D40","",0x2c),
0x801FD034:("D_801FD034","OSMesg","",0x4),
0x801FD040:("D_801FD040","s32","",0x10),
0x801FD050:("D_801FD050","OSIoMesg","",0x18),
@@ -4310,7 +4277,7 @@
0x801FD598:("sCustomSequencePc","UNK_TYPE1","",0x1),
0x801FD5A0:("D_801FD5A0","UNK_TYPE1","",0x1),
0x801FD5A4:("D_801FD5A4","UNK_TYPE1","",0x1),
- 0x801FD5B8:("D_801FD5B8","UNK_TYPE1","",0x1),
+ 0x801FD5B8:("gVoiceHandle","UNK_TYPE1","",0x1),
0x801FD5C4:("D_801FD5C4","UNK_TYPE1","",0x1),
0x801FD5C8:("D_801FD5C8","UNK_TYPE1","",0x1),
0x801FD5E8:("D_801FD5E8","UNK_TYPE1","",0x1),
@@ -4572,13 +4539,13 @@
0x80803FC8:("openingCutscenes","u32","[2]",0x8),
0x80813DF0:("D_80813DF0","UNK_TYPE1","",0x1),
0x80813F30:("D_80813F30","UNK_TYPE1","",0x1),
- 0x80814130:("D_80814130","UNK_TYPE1","",0x1),
- 0x80814170:("D_80814170","UNK_TYPE1","",0x1),
- 0x808141B0:("D_808141B0","UNK_TYPE1","",0x1),
+ 0x80814130:("gOptionsDividerTopVtx","UNK_TYPE1","",0x1),
+ 0x80814170:("gOptionsDividerMiddleVtx","UNK_TYPE1","",0x1),
+ 0x808141B0:("gOptionsDividerBottomVtx","UNK_TYPE1","",0x1),
0x808141F0:("D_808141F0","UNK_TYPE1","",0x1),
- 0x80814240:("D_80814240","UNK_TYPE2","",0x2),
+ 0x80814240:("sChooseFileYOffsets","UNK_TYPE2","",0x2),
0x8081424C:("D_8081424C","UNK_TYPE2","",0x2),
- 0x80814260:("D_80814260","UNK_TYPE2","",0x2),
+ 0x80814260:("sEraseDelayTimer","UNK_TYPE2","",0x2),
0x80814264:("D_80814264","UNK_TYPE2","",0x2),
0x8081426C:("D_8081426C","UNK_TYPE1","",0x1),
0x80814280:("D_80814280","UNK_TYPE1","",0x1),
@@ -4587,31 +4554,31 @@
0x80814404:("D_80814404","UNK_TYPE2","",0x2),
0x80814410:("D_80814410","UNK_TYPE2","",0x2),
0x8081441C:("D_8081441C","UNK_TYPE2","",0x2),
- 0x80814428:("D_80814428","UNK_TYPE4","",0x4),
- 0x80814430:("D_80814430","UNK_TYPE2","",0x2),
+ 0x80814428:("sBackspaceEndTextures","UNK_TYPE4","",0x4),
+ 0x80814430:("sBackspaceEndWidths","UNK_TYPE2","",0x2),
0x80814434:("D_80814434","UNK_TYPE2","",0x2),
0x8081444C:("D_8081444C","UNK_TYPE1","",0x1),
- 0x80814464:("D_80814464","UNK_TYPE4","",0x4),
- 0x8081448C:("D_8081448C","UNK_TYPE4","",0x4),
- 0x808144BC:("D_808144BC","UNK_TYPE2","",0x2),
- 0x808144C0:("D_808144C0","UNK_TYPE2","",0x2),
- 0x808144C4:("D_808144C4","UNK_TYPE2","",0x2),
- 0x808144C8:("D_808144C8","UNK_TYPE2","",0x2),
- 0x808144CC:("D_808144CC","UNK_TYPE2","",0x2),
- 0x808144D0:("D_808144D0","UNK_TYPE2","",0x2),
- 0x808144D4:("D_808144D4","UNK_TYPE2","",0x2),
- 0x808144D8:("D_808144D8","UNK_TYPE2","",0x2),
- 0x808144DC:("D_808144DC","UNK_TYPE1","",0x1),
- 0x808144E8:("D_808144E8","UNK_TYPE1","",0x1),
- 0x80814510:("D_80814510","Gfx","[5]",0x28),
- 0x80814538:("D_80814538","UNK_TYPE2","",0x2),
- 0x80814548:("D_80814548","UNK_TYPE2","",0x2),
- 0x80814550:("fileChooseSkyboxRotation","s16","",0x2),
- 0x80814554:("D_80814554","UNK_TYPE1","",0x1),
- 0x8081455C:("D_8081455C","UNK_TYPE1","",0x1),
+ 0x80814464:("gOptionsMenuHeaders","UNK_TYPE4","",0x4),
+ 0x8081448C:("gOptionsMenuSettings","UNK_TYPE4","",0x4),
+ 0x808144BC:("sCursorPrimRed","UNK_TYPE2","",0x2),
+ 0x808144C0:("sCursorPrimGreen","UNK_TYPE2","",0x2),
+ 0x808144C4:("sCursorPrimBlue","UNK_TYPE2","",0x2),
+ 0x808144C8:("sCursorEnvRed","UNK_TYPE2","",0x2),
+ 0x808144CC:("sCursorEnvGreen","UNK_TYPE2","",0x2),
+ 0x808144D0:("sCursorEnvBlue","UNK_TYPE2","",0x2),
+ 0x808144D4:("sCursorPulseDir","UNK_TYPE2","",0x2),
+ 0x808144D8:("sCursorFlashTimer","UNK_TYPE2","",0x2),
+ 0x808144DC:("sCursorPrimColors","UNK_TYPE1","",0x1),
+ 0x808144E8:("sCursorEnvColors","UNK_TYPE1","",0x1),
+ 0x80814510:("sScreenFillSetupDL","Gfx","[5]",0x28),
+ 0x80814538:("sFileInfoBoxPartWidths","UNK_TYPE2","",0x2),
+ 0x80814548:("sWindowContentColors","UNK_TYPE2","",0x2),
+ 0x80814550:("sFileSelectSkyboxRotation","s16","",0x2),
+ 0x80814554:("sWalletFirstDigit","UNK_TYPE1","",0x1),
+ 0x8081455C:("sEmptyName","UNK_TYPE1","",0x1),
0x80814564:("D_80814564","UNK_TYPE2","",0x2),
- 0x80814568:("D_80814568","UNK_TYPE","[45]",0xb4),
- 0x8081461C:("D_8081461C","s16","[2]",0x4),
+ 0x80814568:("sConfigModeUpdateFuncs","UNK_TYPE","[45]",0xb4),
+ 0x8081461C:("sCursorAlphaTargets","s16","[2]",0x4),
0x80814620:("D_80814620","UNK_TYPE2","",0x2),
0x80814628:("D_80814628","UNK_TYPE2","",0x2),
0x80814630:("D_80814630","UNK_TYPE2","",0x2),
@@ -4620,24 +4587,24 @@
0x8081464C:("D_8081464C","UNK_TYPE1","",0x1),
0x80814650:("D_80814650","UNK_TYPE1","",0x1),
0x80814654:("D_80814654","UNK_TYPE1","",0x1),
- 0x8081465C:("D_8081465C","UNK_TYPE4","",0x4),
- 0x8081466C:("D_8081466C","UNK_TYPE1","",0x1),
- 0x8081467C:("D_8081467C","UNK_TYPE1","",0x1),
- 0x8081468C:("D_8081468C","UNK_TYPE4","",0x4),
- 0x808146B4:("D_808146B4","UNK_TYPE1","",0x1),
- 0x808146C4:("D_808146C4","UNK_TYPE1","",0x1),
- 0x808146D8:("D_808146D8","UNK_TYPE1","",0x1),
- 0x808146EC:("D_808146EC","UNK_TYPE2","",0x2),
- 0x808146F8:("D_808146F8","UNK_TYPE2","",0x2),
- 0x80814704:("D_80814704","UNK_TYPE4","",0x4),
- 0x80814720:("D_80814720","UNK_TYPE1","",0x1),
- 0x80814744:("D_80814744","UNK_TYPE1","",0x1),
- 0x80814758:("D_80814758","UNK_TYPE4","",0x4),
- 0x80814764:("D_80814764","UNK_TYPE4","",0x4),
- 0x80814774:("D_80814774","UNK_TYPE1","",0x1),
- 0x8081477C:("D_8081477C","UNK_TYPE","[8]",0x20),
- 0x8081479C:("D_8081479C","UNK_TYPE","[3]",0xc),
- 0x808147A8:("D_808147A8","UNK_TYPE","[3]",0xc),
+ 0x8081465C:("sFileSelRemainsTextures","UNK_TYPE4","",0x4),
+ 0x8081466C:("sFileSelDayENGTextures","UNK_TYPE1","",0x1),
+ 0x8081467C:("sFileSelHeartPieceTextures","UNK_TYPE1","",0x1),
+ 0x8081468C:("sHeartTextures","UNK_TYPE4","",0x4),
+ 0x808146B4:("sHealthToQuarterHeartCount","UNK_TYPE1","",0x1),
+ 0x808146C4:("sFileSelRupeePrimColors","UNK_TYPE1","",0x1),
+ 0x808146D8:("sFileSelRupeeEnvColors","UNK_TYPE1","",0x1),
+ 0x808146EC:("sHeartPrimColors","UNK_TYPE2","",0x2),
+ 0x808146F8:("sHeartEnvColors","UNK_TYPE2","",0x2),
+ 0x80814704:("sFileInfoBoxTextures","UNK_TYPE4","",0x4),
+ 0x80814720:("sTitleLabels","UNK_TYPE1","",0x1),
+ 0x80814744:("sWarningLabels","UNK_TYPE1","",0x1),
+ 0x80814758:("sFileButtonTextures","UNK_TYPE4","",0x4),
+ 0x80814764:("sActionButtonTextures","UNK_TYPE4","",0x4),
+ 0x80814774:("sFileYOffsets","UNK_TYPE1","",0x1),
+ 0x8081477C:("sSelectModeUpdateFuncs","UNK_TYPE","[8]",0x20),
+ 0x8081479C:("gFileSelectDrawFuncs","UNK_TYPE","[3]",0xc),
+ 0x808147A8:("gFileSelectUpdateFuncs","UNK_TYPE","[3]",0xc),
0x808147B4:("D_808147B4","UNK_TYPE4","",0x4),
0x808147C0:("D_808147C0","UNK_TYPE2","",0x2),
0x808147C8:("D_808147C8","UNK_TYPE2","",0x2),
@@ -4650,13 +4617,13 @@
0x808147EC:("D_808147EC","f32","",0x4),
0x808147F0:("D_808147F0","f32","",0x4),
0x80814E80:("D_80814E80","UNK_TYPE1","",0x1),
- 0x80814E90:("D_80814E90","UNK_TYPE1","",0x1),
+ 0x80814E90:("sSelectedSetting","UNK_TYPE1","",0x1),
0x80815FF0:("D_80815FF0","u8","",0x1),
0x80815FF4:("sDayLeftTextures","TexturePtr","[4]",0x10),
0x80816004:("sDayRightTextures","TexturePtr","[4]",0x10),
0x80816014:("sHoursLeftTextures","TexturePtr","[3]",0xC),
0x8082AED0:("sQuestRemainsColorTimerInit","UNK_TYPE1","",0x1),
- 0x8082AED8:("sQuestHpColorTimerInit","UNK_TYPE1","",0x1),
+ 0x8082AED8:("sQuestHpColorTimerInits","UNK_TYPE1","",0x1),
0x8082AEE0:("sQuestSongPlayedOcarinaButtonsNum","UNK_TYPE2","",0x2),
0x8082AEE4:("sQuestSongPlayedOcarinaButtons","UNK_TYPE1","",0x1),
0x8082AEF0:("sQuestSongPlayedOcarinaButtonsAlpha","UNK_TYPE2","",0x2),
@@ -4732,12 +4699,12 @@
0x8082B6F0:("sPromptAlphaTargets","UNK_TYPE1","",0x1),
0x8082B6F4:("sPromptAlphaTargetIndex","UNK_TYPE2","",0x2),
0x8082B6F8:("sPromptAlphaTimer","UNK_TYPE2","",0x2),
- 0x8082B700:("D_8082B700","UNK_TYPE1","",0x1),
- 0x8082B73C:("D_8082B73C","UNK_TYPE1","",0x1),
- 0x8082B778:("D_8082B778","UNK_TYPE1","",0x1),
- 0x8082B7B4:("D_8082B7B4","UNK_TYPE1","",0x1),
- 0x8082B7F0:("D_8082B7F0","UNK_TYPE2","",0x2),
- 0x8082B838:("D_8082B838","UNK_TYPE2","",0x2),
+ 0x8082B700:("sMaskPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B73C:("sItemPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B778:("sMapPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B7B4:("sQuestPageBgTextures","UNK_TYPE1","",0x1),
+ 0x8082B7F0:("gVtxPageMapWorldQuadsWidth","UNK_TYPE2","",0x2),
+ 0x8082B838:("gVtxPageMapWorldQuadsHeight","UNK_TYPE2","",0x2),
0x8082B880:("sGameOverPrimR","UNK_TYPE2","",0x2),
0x8082B884:("sGameOverPrimG","UNK_TYPE2","",0x2),
0x8082B888:("sGameOverPrimB","UNK_TYPE2","",0x2),
@@ -4762,62 +4729,62 @@
0x8082B918:("sPauseCursorLeftX","UNK_TYPE2","",0x2),
0x8082B91C:("sPauseCursorRightX","UNK_TYPE2","",0x2),
0x8082B920:("D_8082B920","UNK_TYPE2","",0x2),
- 0x8082B924:("D_8082B924","UNK_TYPE2","",0x2),
+ 0x8082B924:("sPauseZRCursorColorTimerInits","UNK_TYPE2","",0x2),
0x8082B944:("sGameOverRectPosY","UNK_TYPE2","",0x2),
- 0x8082B948:("D_8082B948","UNK_TYPE2","",0x2),
- 0x8082B96C:("D_8082B96C","UNK_TYPE2","",0x2),
- 0x8082B990:("D_8082B990","UNK_TYPE2","",0x2),
- 0x8082B994:("D_8082B994","UNK_TYPE2","",0x2),
+ 0x8082B948:("sCursorPrimColorTarget","UNK_TYPE2","",0x2),
+ 0x8082B96C:("sCursorEnvColorTarget","UNK_TYPE2","",0x2),
+ 0x8082B990:("sCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B994:("sCursorColorTargetIndex","UNK_TYPE2","",0x2),
0x8082B998:("D_8082B998","UNK_TYPE1","",0x1),
0x8082B9A8:("D_8082B9A8","UNK_TYPE1","",0x1),
- 0x8082B9B8:("D_8082B9B8","UNK_TYPE1","",0x1),
- 0x8082B9C8:("D_8082B9C8","UNK_TYPE2","",0x2),
- 0x8082B9CC:("D_8082B9CC","UNK_TYPE2","",0x2),
- 0x8082B9D0:("D_8082B9D0","UNK_TYPE1","",0x1),
- 0x8082B9E0:("D_8082B9E0","UNK_TYPE2","",0x2),
- 0x8082B9E4:("D_8082B9E4","UNK_TYPE2","",0x2),
- 0x8082B9E8:("D_8082B9E8","UNK_TYPE1","",0x1),
- 0x8082B9EC:("D_8082B9EC","UNK_TYPE1","",0x1),
- 0x8082B9F0:("D_8082B9F0","UNK_TYPE1","",0x1),
- 0x8082B9FC:("D_8082B9FC","UNK_TYPE1","",0x1),
- 0x8082BA00:("D_8082BA00","UNK_TYPE1","",0x1),
- 0x8082BA48:("D_8082BA48","UNK_TYPE1","",0x1),
- 0x8082BA54:("D_8082BA54","UNK_TYPE1","",0x1),
- 0x8082BA58:("D_8082BA58","UNK_TYPE1","",0x1),
- 0x8082BA5C:("D_8082BA5C","UNK_TYPE1","",0x1),
- 0x8082BA68:("D_8082BA68","UNK_TYPE1","",0x1),
- 0x8082BA6C:("D_8082BA6C","UNK_TYPE1","",0x1),
- 0x8082BA78:("D_8082BA78","UNK_TYPE1","",0x1),
- 0x8082BA7C:("D_8082BA7C","UNK_TYPE1","",0x1),
- 0x8082BA80:("D_8082BA80","UNK_TYPE1","",0x1),
- 0x8082BA8C:("D_8082BA8C","UNK_TYPE1","",0x1),
- 0x8082BA90:("D_8082BA90","UNK_TYPE1","",0x1),
- 0x8082BAD8:("D_8082BAD8","UNK_TYPE1","",0x1),
- 0x8082BAE4:("D_8082BAE4","UNK_TYPE1","",0x1),
- 0x8082BAE8:("D_8082BAE8","UNK_TYPE1","",0x1),
- 0x8082BAEC:("D_8082BAEC","UNK_TYPE1","",0x1),
- 0x8082BAF8:("D_8082BAF8","UNK_TYPE1","",0x1),
- 0x8082BAFC:("D_8082BAFC","UNK_TYPE1","",0x1),
- 0x8082BB08:("D_8082BB08","UNK_PTR","",0x4),
- 0x8082BB20:("D_8082BB20","UNK_PTR","",0x4),
- 0x8082BB38:("D_8082BB38","UNK_PTR","",0x4),
- 0x8082BB50:("D_8082BB50","UNK_PTR","",0x4),
- 0x8082BB68:("D_8082BB68","UNK_TYPE2","",0x2),
+ 0x8082B9B8:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9C8:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9CC:("sPauseZRCursorColorIndex","UNK_TYPE2","",0x2),
+ 0x8082B9D0:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9E0:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9E4:("sPauseZRCursorColorIndex","UNK_TYPE2","",0x2),
+ 0x8082B9E8:("sVtxPageMaskQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9EC:("sVtxPageItemQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9F0:("sVtxPageMapDungeonQuadsX","UNK_TYPE1","",0x1),
+ 0x8082B9FC:("sVtxPageQuestQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA00:("sVtxPageMapWorldQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA48:("sVtxPagePromptQuadsX","UNK_TYPE1","",0x1),
+ 0x8082BA54:("sVtxPageMaskQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA58:("sVtxPageItemQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA5C:("sVtxPageMapDungeonQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA68:("sVtxPageQuestQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA6C:("sVtxPagePromptQuadsWidth","UNK_TYPE1","",0x1),
+ 0x8082BA78:("sVtxPageMaskQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA7C:("sVtxPageItemQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA80:("sVtxPageMapDungeonQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA8C:("sVtxPageQuestQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BA90:("sVtxPageMapWorldQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BAD8:("sVtxPagePromptQuadsY","UNK_TYPE1","",0x1),
+ 0x8082BAE4:("sVtxPageMaskQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAE8:("sVtxPageItemQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAEC:("sVtxPageMapDungeonQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAF8:("sVtxPageQuestQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BAFC:("sVtxPagePromptQuadsHeight","UNK_TYPE1","",0x1),
+ 0x8082BB08:("sVtxPageQuadsX","UNK_PTR","",0x4),
+ 0x8082BB20:("sVtxPageQuadsWidth","UNK_PTR","",0x4),
+ 0x8082BB38:("sVtxPageQuadsY","UNK_PTR","",0x4),
+ 0x8082BB50:("sVtxPageQuadsHeight","UNK_PTR","",0x4),
+ 0x8082BB68:("sVtxPageGameOverSaveQuadsY","UNK_TYPE2","",0x2),
0x8082BB74:("sQuestVtxRectLeft","UNK_TYPE2","",0x2),
0x8082BBC4:("sQuestVtxRectTop","UNK_TYPE2","",0x2),
0x8082BC14:("sQuestVtxWidths","UNK_TYPE2","",0x2),
0x8082BC64:("sQuestVtxHeights","UNK_TYPE2","",0x2),
- 0x8082BCB4:("D_8082BCB4","UNK_TYPE1","",0x1),
- 0x8082BCCC:("D_8082BCCC","UNK_TYPE1","",0x1),
- 0x8082BCDC:("D_8082BCDC","UNK_TYPE1","",0x1),
- 0x8082BD08:("D_8082BD08","UNK_TYPE1","",0x1),
- 0x8082BD34:("D_8082BD34","UNK_TYPE1","",0x1),
- 0x8082BD5C:("D_8082BD5C","UNK_TYPE1","",0x1),
- 0x8082BD84:("D_8082BD84","UNK_TYPE1","",0x1),
- 0x8082BDA8:("D_8082BDA8","UNK_TYPE1","",0x1),
- 0x8082BDCC:("D_8082BDCC","UNK_TYPE1","",0x1),
- 0x8082BE28:("D_8082BE28","UNK_TYPE1","",0x1),
- 0x8082BE84:("D_8082BE84","UNK_TYPE2","",0x2),
+ 0x8082BCB4:("sItemMaskCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BCCC:("sItemMaskCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BCDC:("sWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD08:("sWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD34:("sOwlWarpWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD5C:("sOwlWarpWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD84:("sDungeonMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BDA8:("sDungeonMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BDCC:("sQuestStatusCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BE28:("sQuestStatusCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BE84:("sGameOverUlt","UNK_TYPE2","",0x2),
0x8082BE88:("sCursorPointsToOcarinaModes","UNK_TYPE1","",0x1),
0x8082BE9C:("sUnpausedHudVisibility","UNK_TYPE2","",0x2),
0x8082BEA0:("sNextMainState","UNK_TYPE2","",0x2),
@@ -4939,72 +4906,29 @@
0x8082C0E4:("jtbl_8082C0E4","UNK_PTR","",0x4),
0x8082C148:("jtbl_8082C148","UNK_PTR","",0x4),
0x8082C18C:("jtbl_8082C18C","UNK_PTR","",0x4),
- 0x8082DA50:("D_8082DA50","UNK_TYPE1","",0x1),
- 0x8082DA52:("D_8082DA52","UNK_TYPE1","",0x1),
- 0x8082DA54:("D_8082DA54","UNK_TYPE1","",0x1),
- 0x8082DA56:("D_8082DA56","UNK_TYPE1","",0x1),
+ 0x8082DA50:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA52:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA54:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA56:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
0x8082DA58:("sUnpausedButtonStatus","UNK_TYPE1","",0x1),
- 0x8082DA60:("D_8082DA60","f32","",0x4),
+ 0x8082DA60:("sCursorCirclesX","f32","",0x4),
0x8082DA64:("D_8082DA64","f32","",0x4),
0x8082DA68:("D_8082DA68","f32","",0x4),
0x8082DA6C:("D_8082DA6C","f32","",0x4),
- 0x8082DA70:("D_8082DA70","f32","",0x4),
+ 0x8082DA70:("sCursorCirclesY","f32","",0x4),
0x8082DA74:("D_8082DA74","f32","",0x4),
0x8082DA78:("D_8082DA78","f32","",0x4),
0x8082DA7C:("D_8082DA7C","f32","",0x4),
- 0x8082DA80:("D_8082DA80","UNK_TYPE1","",0x1),
- 0x8082DA82:("D_8082DA82","UNK_TYPE1","",0x1),
- 0x8082DA84:("D_8082DA84","UNK_TYPE1","",0x1),
- 0x8082DA86:("D_8082DA86","UNK_TYPE1","",0x1),
+ 0x8082DA80:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA82:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA84:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA86:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
0x8085B9F0:("D_8085B9F0","UNK_TYPE1","",0x1),
0x8085BA08:("D_8085BA08","UNK_TYPE1","",0x1),
0x8085BA20:("D_8085BA20","UNK_TYPE1","",0x1),
- 0x8085BA38:("D_8085BA38","UNK_TYPE1","",0x1),
- 0x8085BE84:("D_8085BE84","UNK_TYPE1","",0x1),
- 0x8085BE9C:("D_8085BE9C","UNK_TYPE1","",0x1),
- 0x8085BEB4:("D_8085BEB4","UNK_TYPE1","",0x1),
- 0x8085BECC:("D_8085BECC","UNK_TYPE1","",0x1),
- 0x8085BEE4:("D_8085BEE4","UNK_TYPE1","",0x1),
- 0x8085BEFC:("D_8085BEFC","UNK_TYPE1","",0x1),
- 0x8085BF14:("D_8085BF14","UNK_TYPE1","",0x1),
- 0x8085BF44:("D_8085BF44","UNK_TYPE1","",0x1),
- 0x8085BF5C:("D_8085BF5C","UNK_TYPE1","",0x1),
- 0x8085BF74:("D_8085BF74","UNK_TYPE1","",0x1),
- 0x8085BF8C:("D_8085BF8C","UNK_TYPE1","",0x1),
- 0x8085BFA4:("D_8085BFA4","UNK_TYPE1","",0x1),
- 0x8085BFBC:("D_8085BFBC","UNK_TYPE1","",0x1),
- 0x8085BFD4:("D_8085BFD4","UNK_TYPE1","",0x1),
- 0x8085BFEC:("D_8085BFEC","UNK_TYPE1","",0x1),
- 0x8085C004:("D_8085C004","UNK_TYPE1","",0x1),
- 0x8085C01C:("D_8085C01C","UNK_TYPE1","",0x1),
- 0x8085C034:("D_8085C034","UNK_TYPE1","",0x1),
- 0x8085C04C:("D_8085C04C","UNK_TYPE1","",0x1),
- 0x8085C064:("D_8085C064","UNK_TYPE1","",0x1),
- 0x8085C07C:("D_8085C07C","UNK_TYPE1","",0x1),
- 0x8085C094:("D_8085C094","UNK_TYPE1","",0x1),
- 0x8085C0C4:("D_8085C0C4","UNK_TYPE1","",0x1),
- 0x8085C0DC:("D_8085C0DC","UNK_TYPE1","",0x1),
- 0x8085C0F4:("D_8085C0F4","UNK_TYPE1","",0x1),
- 0x8085C10C:("D_8085C10C","UNK_TYPE1","",0x1),
- 0x8085C124:("D_8085C124","UNK_TYPE1","",0x1),
- 0x8085C13C:("D_8085C13C","UNK_TYPE1","",0x1),
- 0x8085C154:("D_8085C154","UNK_TYPE1","",0x1),
- 0x8085C16C:("D_8085C16C","UNK_TYPE1","",0x1),
- 0x8085C184:("D_8085C184","UNK_TYPE1","",0x1),
- 0x8085C19C:("D_8085C19C","UNK_TYPE1","",0x1),
- 0x8085C1B4:("D_8085C1B4","UNK_TYPE1","",0x1),
- 0x8085C1CC:("D_8085C1CC","UNK_TYPE1","",0x1),
- 0x8085C1E4:("D_8085C1E4","UNK_TYPE1","",0x1),
- 0x8085C1FC:("D_8085C1FC","UNK_TYPE1","",0x1),
- 0x8085C214:("D_8085C214","UNK_TYPE1","",0x1),
- 0x8085C22C:("D_8085C22C","UNK_TYPE1","",0x1),
- 0x8085C244:("D_8085C244","UNK_TYPE1","",0x1),
- 0x8085C25C:("D_8085C25C","UNK_TYPE1","",0x1),
- 0x8085C274:("D_8085C274","UNK_TYPE1","",0x1),
- 0x8085C28C:("D_8085C28C","UNK_TYPE1","",0x1),
- 0x8085C2A4:("D_8085C2A4","UNK_TYPE4","",0x4),
- 0x8085C2A8:("D_8085C2A8","UNK_TYPE4","",0x4),
- 0x8085C2AC:("D_8085C2AC","UNK_TYPE4","",0x4),
+ 0x8085BA38:("sPlayerAgeProperties","UNK_TYPE1","",0x1),
+ 0x8085BE84:("D_8085BE84","LinkAnimationHeader*","[264]",0x420),
+ 0x8085C2A4:("D_8085C2A4","struct_8085C2A4","[6]",0x48),
0x8085C2EC:("D_8085C2EC","UNK_TYPE1","",0x1),
0x8085C318:("D_8085C318","UNK_TYPE1","",0x1),
0x8085C344:("D_8085C344","UNK_TYPE1","",0x1),
@@ -5012,9 +4936,8 @@
0x8085C3E4:("D_8085C3E4","f32","",0x4),
0x8085C3E8:("D_8085C3E8","f32","",0x4),
0x8085C3EC:("D_8085C3EC","UNK_TYPE2","",0x2),
- 0x8085C3F4:("D_8085C3F4","UNK_TYPE1","",0x1),
- 0x8085C84C:("D_8085C84C","UNK_TYPE4","",0x4),
- 0x8085C850:("D_8085C850","UNK_TYPE4","",0x4),
+ 0x8085C3F4:("sGetItemTable","GetItemEntry","[0xB9]",0x456),
+ 0x8085C84C:("sPlayerIdleAnimations","UNK_TYPE4","",0x78),
0x8085C8C4:("D_8085C8C4","UNK_TYPE1","",0x1),
0x8085C8C8:("D_8085C8C8","UNK_TYPE1","",0x1),
0x8085C8CC:("D_8085C8CC","UNK_TYPE1","",0x1),
@@ -5025,19 +4948,17 @@
0x8085C90C:("D_8085C90C","UNK_TYPE1","",0x1),
0x8085C91C:("D_8085C91C","UNK_TYPE1","",0x1),
0x8085C924:("D_8085C924","UNK_TYPE1","",0x1),
- 0x8085C928:("D_8085C928","UNK_TYPE1","",0x1),
- 0x8085C938:("D_8085C938","UNK_TYPE1","",0x1),
+ 0x8085C928:("D_8085C928","UNK_TYPE1","",0x14),
+ 0x8085C93C:("D_8085C93C","UNK_TYPE1","",0x1),
0x8085C96C:("D_8085C96C","UNK_TYPE1","",0x1),
0x8085C98C:("D_8085C98C","UNK_TYPE1","",0x1),
- 0x8085C99C:("D_8085C99C","UNK_TYPE1","",0x1),
+ 0x8085C99C:("sItemActionParams","UNK_TYPE1","",0x1),
0x8085C9F0:("D_8085C9F0","UNK_PTR","",0x4),
0x8085CB3C:("D_8085CB3C","UNK_PTR","",0x4),
0x8085CC88:("D_8085CC88","UNK_TYPE1","",0x1),
- 0x8085CD00:("D_8085CD00","UNK_TYPE1","",0x1),
- 0x8085CD24:("D_8085CD24","UNK_TYPE1","",0x1),
- 0x8085CD30:("D_8085CD30","UNK_TYPE1","",0x1),
- 0x8085CE30:("D_8085CE30","UNK_TYPE1","",0x1),
- 0x8085CE60:("D_8085CE60","UNK_TYPE1","",0x1),
+ 0x8085CD00:("D_8085CD00","s8","[36]",0x24),
+ 0x8085CD24:("sPlayerExplosiveInfo","UNK_TYPE1","",0x1),
+ 0x8085CD30:("sMeleeAttackAnimInfo","UNK_TYPE1","",0x220),
0x8085CF50:("D_8085CF50","UNK_TYPE1","",0x1),
0x8085CF58:("D_8085CF58","UNK_TYPE1","",0x1),
0x8085CF60:("D_8085CF60","UNK_TYPE1","",0x1),
@@ -5046,10 +4967,10 @@
0x8085CF78:("D_8085CF78","UNK_TYPE1","",0x1),
0x8085CF80:("D_8085CF80","UNK_TYPE1","",0x1),
0x8085CF84:("D_8085CF84","UNK_TYPE1","",0x1),
- 0x8085CF88:("D_8085CF88","UNK_TYPE1","",0x1),
- 0x8085CFA8:("D_8085CFA8","UNK_TYPE2","",0x2),
- 0x8085CFAE:("D_8085CFAE","UNK_TYPE1","",0x1),
- 0x8085CFB8:("D_8085CFB8","UNK_TYPE1","",0x1),
+ 0x8085CF88:("D_8085CF88","BlureColors","[2]",0x20),
+ 0x8085CFA8:("D_8085CFA8","u16","[4]",0x8),
+ 0x8085CFB0:("D_8085CFB0","UNK_TYPE1","",0x1),
+ 0x8085CFB8:("sMagicArrowCosts","u8","[4]",0x4),
0x8085CFBC:("D_8085CFBC","UNK_TYPE1","",0x1),
0x8085CFC4:("D_8085CFC4","UNK_TYPE1","",0x1),
0x8085CFCC:("D_8085CFCC","UNK_TYPE1","",0x1),
@@ -5069,47 +4990,42 @@
0x8085D050:("D_8085D050","UNK_TYPE1","",0x1),
0x8085D054:("D_8085D054","UNK_PTR","",0x4),
0x8085D090:("D_8085D090","UNK_TYPE1","",0x1),
- 0x8085D094:("D_8085D094","UNK_TYPE1","",0x1),
- 0x8085D097:("D_8085D097","UNK_TYPE1","",0x1),
+ 0x8085D094:("D_8085D094","UNK_TYPE1","",0x6),
0x8085D09C:("D_8085D09C","UNK_TYPE4","",0x4),
0x8085D0D4:("D_8085D0D4","UNK_TYPE1","",0x1),
0x8085D0E4:("D_8085D0E4","UNK_TYPE1","",0x1),
0x8085D0F4:("D_8085D0F4","UNK_TYPE4","",0x4),
- 0x8085D0F8:("D_8085D0F8","UNK_TYPE1","",0x1),
+ 0x8085D0F8:("sReturnEntranceGroupData","s16","[1]",0x2),
+ 0x8085D0FA:("sReturnEntranceGroupIndices","u8","[1]",0x1),
0x8085D100:("D_8085D100","UNK_TYPE1","",0x1),
- 0x8085D10C:("D_8085D10C","f32","",0x4),
- 0x8085D114:("D_8085D114","f32","",0x4),
+ 0x8085D10C:("D_8085D10C","Vec3f","",0xC),
0x8085D118:("D_8085D118","UNK_TYPE1","",0x1),
0x8085D124:("D_8085D124","UNK_TYPE1","",0x1),
- 0x8085D130:("D_8085D130","UNK_TYPE1","",0x1),
- 0x8085D134:("D_8085D134","f32","",0x4),
- 0x8085D13C:("D_8085D13C","UNK_TYPE1","",0x1),
+ 0x8085D130:("D_8085D130","Vec3f","",0xC),
+ 0x8085D13C:("sFallImpactInfos","UNK_TYPE1","",0x1),
0x8085D148:("D_8085D148","UNK_TYPE1","",0x1),
0x8085D154:("D_8085D154","UNK_TYPE1","",0x1),
0x8085D160:("D_8085D160","UNK_TYPE1","",0x1),
- 0x8085D174:("D_8085D174","UNK_TYPE1","",0x1),
+ 0x8085D174:("sPlayerMass","u8","[5]",0x5),
0x8085D17C:("D_8085D17C","UNK_TYPE1","",0x1),
0x8085D190:("D_8085D190","UNK_TYPE1","",0x1),
0x8085D1A4:("D_8085D1A4","UNK_TYPE1","",0x1),
0x8085D1F8:("D_8085D1F8","UNK_TYPE1","",0x1),
0x8085D200:("D_8085D200","UNK_TYPE4","",0x4),
0x8085D218:("D_8085D218","UNK_TYPE1","",0x1),
- 0x8085D224:("D_8085D224","UNK_TYPE1","",0x1),
- 0x8085D23C:("D_8085D23C","UNK_TYPE1","",0x1),
- 0x8085D252:("D_8085D252","UNK_TYPE1","",0x1),
+ 0x8085D224:("D_8085D224","UNK_TYPE1","",0x30),
+ 0x8085D254:("D_8085D254","u16","[4]",0x8),
0x8085D25C:("D_8085D25C","UNK_TYPE1","",0x1),
0x8085D264:("D_8085D264","UNK_TYPE1","",0x1),
0x8085D26C:("D_8085D26C","UNK_TYPE1","",0x1),
0x8085D270:("D_8085D270","UNK_TYPE1","",0x1),
- 0x8085D27C:("D_8085D27C","f32","",0x4),
- 0x8085D284:("D_8085D284","f32","",0x4),
- 0x8085D288:("D_8085D288","UNK_TYPE1","",0x1),
- 0x8085D28C:("D_8085D28C","f32","",0x4),
+ 0x8085D27C:("D_8085D27C","Vec3f","",0xC),
+ 0x8085D288:("D_8085D288","Vec3f","",0xC),
0x8085D294:("D_8085D294","UNK_TYPE1","",0x1),
0x8085D2A4:("D_8085D2A4","UNK_TYPE1","",0x1),
0x8085D2B0:("D_8085D2B0","UNK_TYPE1","",0x1),
0x8085D2B4:("D_8085D2B4","UNK_TYPE1","",0x1),
- 0x8085D2C0:("D_8085D2C0","ActorInitVar","",0x4),
+ 0x8085D2C0:("sInitChain","ActorInitVar","",0x4),
0x8085D2C4:("D_8085D2C4","UNK_TYPE4","",0x4),
0x8085D2CC:("D_8085D2CC","UNK_PTR","",0x4),
0x8085D30C:("D_8085D30C","EffectBlureInit2","",0x24),
@@ -5119,9 +5035,7 @@
0x8085D340:("D_8085D340","UNK_TYPE1","",0x1),
0x8085D34C:("D_8085D34C","UNK_TYPE1","",0x1),
0x8085D354:("D_8085D354","UNK_TYPE1","",0x1),
- 0x8085D358:("D_8085D358","UNK_TYPE1","",0x1),
- 0x8085D35C:("D_8085D35C","f32","",0x4),
- 0x8085D360:("D_8085D360","f32","",0x4),
+ 0x8085D358:("D_8085D358","Vec3f","",0xC),
0x8085D364:("D_8085D364","UNK_TYPE1","",0x1),
0x8085D370:("D_8085D370","UNK_TYPE1","",0x1),
0x8085D37C:("D_8085D37C","UNK_TYPE1","",0x1),
@@ -5131,8 +5045,8 @@
0x8085D3F4:("D_8085D3F4","UNK_TYPE1","",0x1),
0x8085D3F8:("D_8085D3F8","UNK_TYPE1","",0x1),
0x8085D3FC:("D_8085D3FC","UNK_TYPE4","",0x4),
- 0x8085D404:("D_8085D404","UNK_TYPE1","",0x1),
- 0x8085D410:("D_8085D410","UNK_TYPE1","",0x1),
+ 0x8085D404:("sWaterConveyorSpeeds","UNK_TYPE1","",0x1),
+ 0x8085D410:("sFloorConveyorSpeeds","UNK_TYPE1","",0x1),
0x8085D41C:("D_8085D41C","UNK_TYPE1","",0x1),
0x8085D428:("D_8085D428","UNK_TYPE1","",0x1),
0x8085D450:("D_8085D450","UNK_TYPE1","",0x1),
@@ -5150,32 +5064,28 @@
0x8085D574:("D_8085D574","UNK_TYPE4","",0x4),
0x8085D580:("D_8085D580","UNK_TYPE1","",0x1),
0x8085D584:("D_8085D584","UNK_TYPE1","",0x1),
- 0x8085D588:("D_8085D588","UNK_TYPE1","",0x1),
- 0x8085D5A0:("D_8085D5A0","UNK_TYPE1","",0x1),
- 0x8085D5B8:("D_8085D5B8","UNK_TYPE1","",0x1),
+ 0x8085D588:("D_8085D588","Vec3f","[2]",0x18),
+ 0x8085D5A0:("D_8085D5A0","Vec3f","[2]",0x18),
+ 0x8085D5B8:("D_8085D5B8","Vec3f","[2]",0x18),
0x8085D5D0:("D_8085D5D0","UNK_TYPE1","",0x1),
0x8085D5DC:("D_8085D5DC","UNK_TYPE1","",0x1),
0x8085D5E0:("D_8085D5E0","UNK_TYPE1","",0x1),
0x8085D5E4:("D_8085D5E4","UNK_TYPE1","",0x1),
- 0x8085D5F0:("D_8085D5F0","UNK_TYPE1","",0x1),
- 0x8085D5FA:("D_8085D5FA","UNK_TYPE1","",0x1),
- 0x8085D604:("D_8085D604","UNK_TYPE1","",0x1),
- 0x8085D60C:("D_8085D60C","UNK_TYPE1","",0x1),
- 0x8085D61C:("D_8085D61C","UNK_TYPE1","",0x1),
- 0x8085D62C:("D_8085D62C","f32","",0x4),
- 0x8085D630:("D_8085D630","f32","",0x4),
- 0x8085D634:("D_8085D634","f32","",0x4),
- 0x8085D638:("D_8085D638","f32","",0x4),
- 0x8085D640:("D_8085D640","f32","",0x4),
- 0x8085D644:("D_8085D644","UNK_TYPE1","",0x1),
- 0x8085D64C:("D_8085D64C","f32","",0x4),
+ 0x8085D5F0:("D_8085D5F0","UNK_TYPE1","",0xC),
+ 0x8085D5FC:("D_8085D5FC","UNK_TYPE1","",0x1),
+ 0x8085D604:("D_8085D604","UNK_TYPE1","",0x8),
+ 0x8085D60C:("D_8085D60C","UNK_TYPE1","",0x10),
+ 0x8085D61C:("D_8085D61C","UNK_TYPE1","",0x10),
+ 0x8085D62C:("D_8085D62C","Vec3f","",0xC),
+ 0x8085D638:("D_8085D638","Vec3f","",0xC),
+ 0x8085D644:("D_8085D644","Vec3f","",0xC),
0x8085D650:("D_8085D650","UNK_TYPE1","",0x1),
0x8085D658:("D_8085D658","UNK_TYPE1","",0x1),
0x8085D660:("D_8085D660","UNK_TYPE1","",0x1),
0x8085D66C:("D_8085D66C","UNK_TYPE4","",0x4),
0x8085D674:("D_8085D674","UNK_TYPE4","",0x4),
- 0x8085D67C:("D_8085D67C","UNK_TYPE1","",0x1),
- 0x8085D680:("D_8085D680","UNK_TYPE1","",0x1),
+ 0x8085D67C:("D_8085D67C","UNK_TYPE1","",0xC),
+ 0x8085D688:("D_8085D688","UNK_TYPE1","",0x1),
0x8085D6A4:("D_8085D6A4","UNK_TYPE1","",0x1),
0x8085D6D0:("D_8085D6D0","UNK_PTR","",0x4),
0x8085D6DC:("D_8085D6DC","UNK_TYPE1","",0x1),
@@ -5186,18 +5096,16 @@
0x8085D73C:("D_8085D73C","UNK_TYPE1","",0x1),
0x8085D74C:("D_8085D74C","UNK_TYPE1","",0x1),
0x8085D75C:("D_8085D75C","UNK_TYPE1","",0x1),
- 0x8085D764:("D_8085D764","UNK_TYPE1","",0x1),
- 0x8085D76D:("D_8085D76D","UNK_TYPE1","",0x1),
+ 0x8085D764:("D_8085D764","Vec3f","",0xC),
0x8085D770:("D_8085D770","UNK_TYPE1","",0x1),
0x8085D77C:("D_8085D77C","UNK_TYPE1","",0x1),
0x8085D788:("D_8085D788","UNK_TYPE1","",0x1),
- 0x8085D78C:("D_8085D78C","UNK_TYPE1","",0x1),
- 0x8085D797:("D_8085D797","UNK_TYPE1","",0x1),
+ 0x8085D78C:("D_8085D78C","Color_RGBA8","",0x4),
+ 0x8085D790:("D_8085D790","u8","[6]",0x6),
0x8085D798:("D_8085D798","UNK_TYPE2","",0x2),
- 0x8085D7EC:("D_8085D7EC","UNK_TYPE1","",0x1),
- 0x8085D7F8:("D_8085D7F8","UNK_TYPE1","",0x1),
- 0x8085D800:("D_8085D800","f32","",0x4),
- 0x8085D804:("D_8085D804","UNK_TYPE1","",0x1),
+ 0x8085D7EC:("D_8085D7EC","Vec3f","",0xC),
+ 0x8085D7F8:("D_8085D7F8","Vec3f","",0xC),
+ 0x8085D804:("D_8085D804","s8","[5]",0x5),
0x8085D80C:("D_8085D80C","UNK_TYPE1","",0x1),
0x8085D838:("D_8085D838","UNK_TYPE1","",0x1),
0x8085D840:("D_8085D840","UNK_TYPE1","",0x1),
@@ -5207,18 +5115,14 @@
0x8085D904:("D_8085D904","UNK_TYPE1","",0x1),
0x8085D908:("D_8085D908","UNK_TYPE1","",0x1),
0x8085D910:("D_8085D910","UNK_TYPE1","",0x1),
- 0x8085D918:("D_8085D918","UNK_TYPE1","",0x1),
- 0x8085D91C:("D_8085D91C","f32","",0x4),
- 0x8085D924:("D_8085D924","UNK_TYPE1","",0x1),
- 0x8085D928:("D_8085D928","f32","",0x4),
+ 0x8085D918:("D_8085D918","Vec3f","",0xC),
+ 0x8085D924:("D_8085D924","Vec3f","",0xC),
0x8085D930:("D_8085D930","UNK_TYPE1","",0x1),
0x8085D934:("D_8085D934","UNK_TYPE1","",0x1),
0x8085D938:("D_8085D938","UNK_TYPE4","",0x4),
0x8085D93C:("D_8085D93C","UNK_TYPE4","",0x4),
- 0x8085D940:("D_8085D940","f32","",0x4),
- 0x8085D948:("D_8085D948","f32","",0x4),
- 0x8085D94C:("D_8085D94C","f32","",0x4),
- 0x8085D954:("D_8085D954","f32","",0x4),
+ 0x8085D940:("D_8085D940","Vec3f","",0xC),
+ 0x8085D94C:("D_8085D94C","Vec3f","",0xC),
0x8085D958:("D_8085D958","UNK_TYPE1","",0x1),
0x8085D960:("D_8085D960","UNK_TYPE1","",0x1),
0x8085D96C:("D_8085D96C","UNK_TYPE1","",0x1),
@@ -5462,20 +5366,18 @@
0x8085E6EC:("D_8085E6EC","f32","",0x4),
0x8085E6F0:("D_8085E6F0","f32","",0x4),
0x8085E6F4:("D_8085E6F4","f32","",0x4),
- 0x80862AF0:("D_80862AF0","UNK_TYPE1","",0x1),
- 0x80862AF4:("D_80862AF4","f32","",0x4),
- 0x80862AF8:("D_80862AF8","f32","",0x4),
+ 0x80862AF0:("sDogSpawnPos","Vec3f","",0xC),
0x80862AFC:("D_80862AFC","f32","",0x4),
0x80862B00:("D_80862B00","UNK_TYPE1","",0x1),
0x80862B02:("D_80862B02","UNK_TYPE1","",0x1),
0x80862B04:("D_80862B04","UNK_TYPE1","",0x1),
- 0x80862B08:("D_80862B08","UNK_TYPE1","",0x1),
- 0x80862B0C:("D_80862B0C","UNK_TYPE1","",0x1),
- 0x80862B10:("D_80862B10","UNK_TYPE1","",0x1),
- 0x80862B14:("D_80862B14","UNK_TYPE1","",0x1),
+ 0x80862B08:("sPlayerCurrentFloorType","UNK_TYPE1","",0x1),
+ 0x80862B0C:("sPlayerCurrentWallFlags","UNK_TYPE1","",0x1),
+ 0x80862B10:("sPlayerConveyorSpeedIndex","UNK_TYPE1","",0x1),
+ 0x80862B14:("sPlayerIsOnFloorConveyor","UNK_TYPE1","",0x1),
0x80862B16:("D_80862B16","UNK_TYPE1","",0x1),
0x80862B18:("D_80862B18","f32","",0x4),
- 0x80862B1C:("D_80862B1C","UNK_TYPE1","",0x1),
+ 0x80862B1C:("sPlayerPrevFloorProperty","UNK_TYPE1","",0x1),
0x80862B20:("D_80862B20","UNK_TYPE1","",0x1),
0x80862B24:("D_80862B24","UNK_TYPE1","",0x1),
0x80862B28:("D_80862B28","UNK_TYPE1","",0x1),
@@ -5483,7 +5385,7 @@
0x80862B30:("D_80862B30","UNK_TYPE1","",0x1),
0x80862B3C:("D_80862B3C","f32","",0x4),
0x80862B40:("D_80862B40","UNK_TYPE1","",0x1),
- 0x80862B44:("D_80862B44","UNK_TYPE1","",0x1),
+ 0x80862B44:("sPlayerControlInput","UNK_TYPE1","",0x1),
0x80862B48:("D_80862B48","UNK_TYPE1","",0x1),
0x80862B4C:("D_80862B4C","UNK_TYPE1","",0x1),
0x80862B50:("D_80862B50","UNK_TYPE1","",0x1),
@@ -5684,8 +5586,8 @@
0x80872E8C:("D_80872E8C","UNK_TYPE1","",0x1),
0x80872E90:("D_80872E90","UNK_TYPE4","",0x4),
0x80872E94:("D_80872E94","UNK_TYPE4","",0x4),
- 0x80872E98:("D_80872E98","UNK_TYPE1","",0x1),
- 0x80872E9C:("D_80872E9C","UNK_TYPE1","",0x1),
+ 0x80872E98:("sQuakeY","UNK_TYPE1","",0x1),
+ 0x80872E9C:("sQuakeDurations","UNK_TYPE1","",0x1),
0x80872EA0:("D_80872EA0","UNK_TYPE4","",0x4),
0x80872EAC:("D_80872EAC","UNK_TYPE4","",0x4),
0x80872EB8:("D_80872EB8","UNK_TYPE4","",0x4),
@@ -6190,7 +6092,7 @@
0x8089E314:("D_8089E314","UNK_TYPE1","",0x1),
0x8089E334:("D_8089E334","UNK_TYPE1","",0x1),
0x8089E33C:("D_8089E33C","UNK_TYPE4","",0x4),
- 0x8089E34C:("D_8089E34C","UNK_TYPE2","",0x2),
+ 0x8089E34C:("sCsId","UNK_TYPE2","",0x2),
0x8089E350:("D_8089E350","UNK_TYPE4","",0x4),
0x8089E354:("D_8089E354","UNK_TYPE1","",0x1),
0x8089E364:("D_8089E364","UNK_TYPE4","",0x4),
@@ -6553,7 +6455,7 @@
0x808BCD44:("D_808BCD44","f32","",0x4),
0x808BCDE0:("sNumLitTorchesInGroup","UNK_TYPE1","",0x1),
0x808BD160:("Item_B_Heart_InitVars","UNK_TYPE1","",0x1),
- 0x808BD180:("D_808BD180","UNK_TYPE1","",0x1),
+ 0x808BD180:("sInitChain","UNK_TYPE1","",0x1),
0x808BD190:("D_808BD190","f32","",0x4),
0x808BEF10:("En_Dekunuts_InitVars","UNK_TYPE1","",0x1),
0x808BEF30:("D_808BEF30","UNK_TYPE1","",0x1),
@@ -7672,11 +7574,11 @@
0x80911E30:("sSinkingLurePos","Vec3f","[20]",0xF0),
0x80911F20:("D_80911F20","UNK_TYPE1","",0x1),
0x80911F24:("sProjectedW","f32","",0x4),
- 0x80911F28:("sCameraEye","Vec3f","",0xC),
- 0x80911F38:("sCameraAt","Vec3f","",0xC),
- 0x80911F44:("sCameraId","s32","",0x4),
+ 0x80911F28:("sSubCamEye","Vec3f","",0xC),
+ 0x80911F38:("sSubCamAt","Vec3f","",0xC),
+ 0x80911F44:("sSubCamId","s32","",0x4),
0x80911F48:("D_80911F48","f32","",0x4),
- 0x80911F4C:("D_80911F4C","f32","",0x4),
+ 0x80911F4C:("sSubCamVelFactor","f32","",0x4),
0x80911F50:("D_80911F50","UNK_TYPE1","",0x1),
0x80911F58:("sSinkingLureBasePos","Vec3f","",0xC),
0x80911F64:("D_80911F64","f32","",0x4),
@@ -9865,11 +9767,11 @@
0x809C3770:("En_Aob_01_InitVars","UNK_TYPE1","",0x1),
0x809C3790:("sAnimationInfo","UNK_TYPE4","",0x4),
0x809C3820:("D_809C3820","UNK_TYPE1","",0x1),
- 0x809C384C:("D_809C384C","UNK_TYPE4","",0x4),
+ 0x809C384C:("sDogInfo","UNK_TYPE4","",0x4),
0x809C392C:("D_809C392C","UNK_TYPE1","",0x1),
0x809C394C:("D_809C394C","UNK_TYPE4","",0x4),
0x809C395C:("D_809C395C","UNK_PTR","",0x4),
- 0x809C3968:("D_809C3968","UNK_TYPE1","",0x1),
+ 0x809C3968:("sFocusOffset","UNK_TYPE1","",0x1),
0x809C3980:("D_809C3980","f32","",0x4),
0x809C3984:("D_809C3984","f32","",0x4),
0x809C3988:("D_809C3988","f32","",0x4),
@@ -11085,7 +10987,7 @@
0x80A2B90C:("sColHeaders","UNK_TYPE1","",0x1),
0x80A2B93C:("sTexAnims","UNK_TYPE1","",0x1),
0x80A2B96C:("D_80A2B96C","UNK_TYPE1","",0x1),
- 0x80A2B974:("D_80A2B974","UNK_TYPE2","",0x2),
+ 0x80A2B974:("sCsIdList","UNK_TYPE2","",0x2),
0x80A2B978:("D_80A2B978","UNK_TYPE1","",0x1),
0x80A2B988:("D_80A2B988","UNK_TYPE1","",0x1),
0x80A2B9A0:("jtbl_80A2B9A0","UNK_PTR","",0x4),
@@ -11147,19 +11049,19 @@
0x80A2ECE0:("Dm_Sa_InitVars","UNK_TYPE1","",0x1),
0x80A2ED00:("sAnimationInfo","UNK_TYPE1","",0x1),
0x80A2ED20:("D_80A2ED20","f32","",0x4),
- 0x80A31AD0:("En_Slime_InitVars","UNK_TYPE1","",0x1),
- 0x80A31AF0:("D_80A31AF0","UNK_TYPE1","",0x1),
- 0x80A31B1C:("D_80A31B1C","UNK_TYPE1","",0x1),
- 0x80A31B3C:("D_80A31B3C","UNK_TYPE1","",0x1),
- 0x80A31B44:("D_80A31B44","UNK_TYPE4","",0x4),
- 0x80A31B54:("D_80A31B54","UNK_TYPE1","",0x1),
- 0x80A31B5C:("D_80A31B5C","UNK_TYPE4","",0x4),
- 0x80A31B60:("D_80A31B60","UNK_TYPE1","",0x1),
- 0x80A31B64:("D_80A31B64","UNK_TYPE1","",0x1),
- 0x80A31B68:("D_80A31B68","UNK_TYPE1","",0x1),
- 0x80A31B74:("D_80A31B74","UNK_TYPE1","",0x1),
- 0x80A31B84:("D_80A31B84","UNK_TYPE1","",0x1),
- 0x80A31B94:("D_80A31B94","UNK_TYPE1","",0x1),
+ 0x80A31AD0:("En_Slime_InitVars","ActorInit","",0x1),
+ 0x80A31AF0:("sCylinderInit","ColliderCylinderInit","",0x1),
+ 0x80A31B1C:("sDamageTable","DamageTable","",0x1),
+ 0x80A31B3C:("sColChkInfoInit","CollisionCheckInfoInit","",0x1),
+ 0x80A31B44:("sEyeTextures","TexturePtr","",0x4),
+ 0x80A31B54:("sInitChain","InitChainEntry","",0x1),
+ 0x80A31B5C:("sTexturesDesegmented","s32","",0x1),
+ 0x80A31B60:("sBubblePrimColor","Color_RGBA8","",0x1),
+ 0x80A31B64:("sBubbleEnvColor","Color_RGBA8","",0x1),
+ 0x80A31B68:("sBubbleAccel","Vec3f","",0x1),
+ 0x80A31B74:("sPrimColors","Color_RGBA8","",0x4),
+ 0x80A31B84:("sEnvColors","Color_RGBA8","",0x4),
+ 0x80A31B94:("sLimbPosOffsets","Vec3f","",0x5),
0x80A31BD0:("D_80A31BD0","f32","",0x4),
0x80A31BD4:("D_80A31BD4","f32","",0x4),
0x80A31BD8:("D_80A31BD8","f32","",0x4),
@@ -11244,7 +11146,7 @@
0x80A31D14:("D_80A31D14","f32","",0x4),
0x80A31D18:("D_80A31D18","f32","",0x4),
0x80A31D1C:("D_80A31D1C","f32","",0x4),
- 0x80A32200:("D_80A32200","UNK_TYPE1","",0x1),
+ 0x80A32200:("sSlimeTexAnim","AnimatedMaterial*","",0x1),
0x80A338A0:("D_80A338A0","UNK_TYPE1","",0x1),
0x80A338C0:("D_80A338C0","UNK_TYPE1","",0x1),
0x80A338D4:("En_Pr_InitVars","UNK_TYPE1","",0x1),
@@ -11474,8 +11376,8 @@
0x80A43352:("sNightMessages2","s16","[3]",0x6),
0x80A4335A:("sDayMessages2","s16","[3]",0x6),
0x80A43364:("D_80A43364","u16","[2]",0x4),
- 0x80A434D0:("sCutscenes","s16","[2]",0x4),
- 0x80A434D4:("sCurrentCs","s16","",0x2),
+ 0x80A434D0:("sCsIdList","s16","[2]",0x4),
+ 0x80A434D4:("sCurCsId","s16","",0x2),
0x80A449E0:("En_Bat_InitVars","ActorInit","",0x1),
0x80A44A00:("sSphereInit","ColliderSphereInit","",0x1),
0x80A44A2C:("sDamageTable","DamageTable","4",0x1),
@@ -12822,7 +12724,7 @@
0x80AC0254:("D_80AC0254","UNK_TYPE2","",0x2),
0x80AC0258:("D_80AC0258","UNK_TYPE2","",0x2),
0x80AC025C:("D_80AC025C","UNK_TYPE4","",0x4),
- 0x80AC0260:("D_80AC0260","UNK_TYPE2","",0x2),
+ 0x80AC0260:("sCueId","UNK_TYPE2","",0x2),
0x80AC0264:("D_80AC0264","UNK_TYPE4","",0x4),
0x80AC0270:("D_80AC0270","f32","",0x4),
0x80AC0274:("D_80AC0274","f32","",0x4),
@@ -12928,15 +12830,14 @@
0x80AC65B0:("D_80AC65B0","UNK_TYPE1","",0x1),
0x80AC66A8:("TransitionWipe1_InitVars","UNK_PTR","",0x4),
0x80AC66D0:("D_80AC66D0","f32","",0x4),
- 0x80AC6C60:("D_80AC6C60","UNK_TYPE1","",0x1),
- 0x80AC7060:("D_80AC7060","UNK_TYPE1","",0x1),
- 0x80AC7460:("D_80AC7460","UNK_TYPE1","",0x1),
- 0x80AC7860:("D_80AC7860","UNK_TYPE1","",0x1),
- 0x80AC7C60:("D_80AC7C60","UNK_TYPE1","",0x1),
- 0x80AC8060:("D_80AC8060","UNK_TYPE1","",0x1),
- 0x80AC8250:("D_80AC8250","UNK_TYPE1","",0x1),
- 0x80AC8280:("D_80AC8280","UNK_TYPE1","",0x1),
- 0x80AC8350:("D_80AC8350","UNK_PTR","",0x4),
+ 0x80AC6C60:("fbdemo_tex_000520","UNK_TYPE1","",0x1),
+ 0x80AC7060:("fbdemo_tex_000920","UNK_TYPE1","",0x1),
+ 0x80AC7460:("fbdemo_tex_000D20","UNK_TYPE1","",0x1),
+ 0x80AC7860:("fbdemo_tex_001120","UNK_TYPE1","",0x1),
+ 0x80AC7C60:("fbdemo_tex_001520","UNK_TYPE1","",0x1),
+ 0x80AC8060:("sTransWipe3Vtx","UNK_TYPE1","",0x1),
+ 0x80AC8280:("sTransWipe3DL","UNK_TYPE1","",0x1),
+ 0x80AC8350:("sTransWipe3Textures","TexturePtr[]","8",0x4),
0x80AC8370:("TransitionWipe3_InitVars","UNK_PTR","",0x4),
0x80AC83A0:("D_80AC83A0","f32","",0x4),
0x80AC8650:("TransitionWipe4_InitVars","UNK_PTR","",0x4),
@@ -15202,14 +15103,14 @@
0x80B8E19C:("D_80B8E19C","CollisionCheckInfoInit2","",0xC),
0x80B8E308:("D_80B8E308","void*","",0x4),
0x80B8E318:("D_80B8E318","UNK_TYPE1","",0x1),
- 0x80B8E32C:("D_80B8E32C","UNK_TYPE2","",0x2),
+ 0x80B8E32C:("sCueId","UNK_TYPE2","",0x2),
0x80B8E330:("jtbl_80B8E330","UNK_PTR","",0x4),
0x80B8E34C:("jtbl_80B8E34C","UNK_PTR","",0x4),
0x80B913F0:("En_Ma_Yto_InitVars","UNK_TYPE1","",0x1),
0x80B91410:("D_80B91410","UNK_TYPE1","",0x1),
0x80B9143C:("D_80B9143C","UNK_TYPE1","",0x1),
0x80B91448:("D_80B91448","UNK_TYPE1","",0x1),
- 0x80B915F0:("D_80B915F0","UNK_TYPE2","",0x2),
+ 0x80B915F0:("sCueId","UNK_TYPE2","",0x2),
0x80B91600:("jtbl_80B91600","UNK_PTR","",0x4),
0x80B91614:("jtbl_80B91614","UNK_PTR","",0x4),
0x80B91628:("jtbl_80B91628","UNK_PTR","",0x4),
@@ -16597,7 +16498,7 @@
0x80C1E984:("D_80C1E984","UNK_TYPE1","",0x1),
0x80C1F150:("Dm_Bal_InitVars","UNK_TYPE1","",0x1),
0x80C1F170:("sAnimationInfo","UNK_PTR","",0x4),
- 0x80C1F2C0:("D_80C1F2C0","UNK_TYPE2","",0x2),
+ 0x80C1F2C0:("sCueId","UNK_TYPE2","",0x2),
0x80C1F2C4:("D_80C1F2C4","UNK_TYPE4","",0x4),
0x80C1F2D0:("D_80C1F2D0","UNK_TYPE1","",0x1),
0x80C1F2E0:("D_80C1F2E0","f32","",0x4),
diff --git a/tools/fixbaserom.py b/tools/fixbaserom.py
index 2c3942160..3966c3533 100755
--- a/tools/fixbaserom.py
+++ b/tools/fixbaserom.py
@@ -122,6 +122,7 @@ def decompress_rom(dmadata_addr, dmadata):
# re-calculate crc
return update_crc(decompressed)
+correct_compressed_str_hash = "2a0a8acb61538235bc1094d297fb6556"
correct_str_hash = "f46493eaa0628827dbd6ad3ecd8d65d6"
def get_str_hash(byte_array):
@@ -179,6 +180,13 @@ elif fileContent[0] == 0x37:
print("Byte swapping done.")
+# Check to see if the ROM is a compressed "vanilla" ROM
+compressed_str_hash = get_str_hash(bytearray(fileContent))
+if compressed_str_hash != correct_compressed_str_hash:
+ print("Error: Expected a hash of " + correct_compressed_str_hash + " but got " + compressed_str_hash + ". " +
+ "The baserom has probably been tampered, find a new one")
+ sys.exit(1)
+
# Decompress
FILE_TABLE_OFFSET = 0x1A500 # 0x1C110 for JP1.0, 0x1C050 for JP1.1, 0x24F60 for debug
if any([b != 0 for b in fileContent[FILE_TABLE_OFFSET + 0x9C:FILE_TABLE_OFFSET + 0x9C + 0x4]]):
diff --git a/tools/gitable.py b/tools/gitable.py
new file mode 100755
index 000000000..dad39638f
--- /dev/null
+++ b/tools/gitable.py
@@ -0,0 +1,1171 @@
+#!/usr/bin/env python3
+import argparse
+from cgitb import text
+import dataclasses
+import os
+import struct
+import sys
+import typing
+
+GETITEMENTRY_FORMAT = ">BBbBH"
+GETITEMENTRY_LENGTH = struct.calcsize(GETITEMENTRY_FORMAT)
+
+# MM US: 0x2E964
+
+itemId_names = {
+ 0x00: "ITEM_OCARINA",
+ 0x01: "ITEM_BOW",
+ 0x02: "ITEM_ARROW_FIRE",
+ 0x03: "ITEM_ARROW_ICE",
+ 0x04: "ITEM_ARROW_LIGHT",
+ 0x05: "ITEM_OCARINA_FAIRY",
+ 0x06: "ITEM_BOMB",
+ 0x07: "ITEM_BOMBCHU",
+ 0x08: "ITEM_STICK",
+ 0x09: "ITEM_NUT",
+ 0x0A: "ITEM_MAGIC_BEANS",
+ 0x0B: "ITEM_SLINGSHOT",
+ 0x0C: "ITEM_POWDER_KEG",
+ 0x0D: "ITEM_PICTO_BOX",
+ 0x0E: "ITEM_LENS",
+ 0x0F: "ITEM_HOOKSHOT",
+ 0x10: "ITEM_SWORD_GREAT_FAIRY",
+ 0x11: "ITEM_LONGSHOT",
+ 0x12: "ITEM_BOTTLE",
+ 0x13: "ITEM_POTION_RED",
+ 0x14: "ITEM_POTION_GREEN",
+ 0x15: "ITEM_POTION_BLUE",
+ 0x16: "ITEM_FAIRY",
+ 0x17: "ITEM_DEKU_PRINCESS",
+ 0x18: "ITEM_MILK_BOTTLE",
+ 0x19: "ITEM_MILK_HALF",
+ 0x1A: "ITEM_FISH",
+ 0x1B: "ITEM_BUG",
+ 0x1C: "ITEM_BLUE_FIRE",
+ 0x1D: "ITEM_POE",
+ 0x1E: "ITEM_BIG_POE",
+ 0x1F: "ITEM_SPRING_WATER",
+ 0x20: "ITEM_HOT_SPRING_WATER",
+ 0x21: "ITEM_ZORA_EGG",
+ 0x22: "ITEM_GOLD_DUST",
+ 0x23: "ITEM_MUSHROOM",
+ 0x24: "ITEM_SEAHORSE",
+ 0x25: "ITEM_CHATEAU",
+ 0x26: "ITEM_HYLIAN_LOACH",
+ 0x27: "ITEM_OBABA_DRINK",
+ 0x28: "ITEM_MOON_TEAR",
+ 0x29: "ITEM_DEED_LAND",
+ 0x2A: "ITEM_DEED_SWAMP",
+ 0x2B: "ITEM_DEED_MOUNTAIN",
+ 0x2C: "ITEM_DEED_OCEAN",
+ 0x2D: "ITEM_ROOM_KEY",
+ 0x2E: "ITEM_LETTER_MAMA",
+ 0x2F: "ITEM_LETTER_TO_KAFEI",
+ 0x30: "ITEM_PENDANT_OF_MEMORIES",
+ 0x31: "ITEM_TINGLE_MAP",
+ 0x32: "ITEM_MASK_DEKU",
+ 0x33: "ITEM_MASK_GORON",
+ 0x34: "ITEM_MASK_ZORA",
+ 0x35: "ITEM_MASK_FIERCE_DEITY",
+ 0x36: "ITEM_MASK_TRUTH",
+ 0x37: "ITEM_MASK_KAFEIS_MASK",
+ 0x38: "ITEM_MASK_ALL_NIGHT",
+ 0x39: "ITEM_MASK_BUNNY",
+ 0x3A: "ITEM_MASK_KEATON",
+ 0x3B: "ITEM_MASK_GARO",
+ 0x3C: "ITEM_MASK_ROMANI",
+ 0x3D: "ITEM_MASK_CIRCUS_LEADER",
+ 0x3E: "ITEM_MASK_POSTMAN",
+ 0x3F: "ITEM_MASK_COUPLE",
+ 0x40: "ITEM_MASK_GREAT_FAIRY",
+ 0x41: "ITEM_MASK_GIBDO",
+ 0x42: "ITEM_MASK_DON_GERO",
+ 0x43: "ITEM_MASK_KAMARO",
+ 0x44: "ITEM_MASK_CAPTAIN",
+ 0x45: "ITEM_MASK_STONE",
+ 0x46: "ITEM_MASK_BREMEN",
+ 0x47: "ITEM_MASK_BLAST",
+ 0x48: "ITEM_MASK_SCENTS",
+ 0x49: "ITEM_MASK_GIANT",
+ 0x4A: "ITEM_BOW_ARROW_FIRE",
+ 0x4B: "ITEM_BOW_ARROW_ICE",
+ 0x4C: "ITEM_BOW_ARROW_LIGHT",
+ 0x4D: "ITEM_SWORD_KOKIRI",
+ 0x4E: "ITEM_SWORD_RAZOR",
+ 0x4F: "ITEM_SWORD_GILDED",
+ 0x50: "ITEM_SWORD_DEITY",
+ 0x51: "ITEM_SHIELD_HERO",
+ 0x52: "ITEM_SHIELD_MIRROR",
+ 0x53: "ITEM_QUIVER_30",
+ 0x54: "ITEM_QUIVER_40",
+ 0x55: "ITEM_QUIVER_50",
+ 0x56: "ITEM_BOMB_BAG_20",
+ 0x57: "ITEM_BOMB_BAG_30",
+ 0x58: "ITEM_BOMB_BAG_40",
+ 0x59: "ITEM_WALLET_DEFAULT",
+ 0x5A: "ITEM_WALLET_ADULT",
+ 0x5B: "ITEM_WALLET_GIANT",
+ 0x5C: "ITEM_FISHING_POLE",
+ 0x5D: "ITEM_REMAINS_ODOLWA",
+ 0x5E: "ITEM_REMAINS_GOHT",
+ 0x5F: "ITEM_REMAINS_GYORG",
+ 0x60: "ITEM_REMAINS_TWINMOLD",
+ 0x61: "ITEM_SONG_SONATA",
+ 0x62: "ITEM_SONG_LULLABY",
+ 0x63: "ITEM_SONG_NOVA",
+ 0x64: "ITEM_SONG_ELEGY",
+ 0x65: "ITEM_SONG_OATH",
+ 0x66: "ITEM_SONG_SARIA",
+ 0x67: "ITEM_SONG_TIME",
+ 0x68: "ITEM_SONG_HEALING",
+ 0x69: "ITEM_SONG_EPONA",
+ 0x6A: "ITEM_SONG_SOARING",
+ 0x6B: "ITEM_SONG_STORMS",
+ 0x6C: "ITEM_SONG_SUN",
+ 0x6D: "ITEM_BOMBERS_NOTEBOOK",
+ 0x6E: "ITEM_SKULL_TOKEN",
+ 0x6F: "ITEM_HEART_CONTAINER",
+ 0x70: "ITEM_HEART_PIECE",
+ 0x73: "ITEM_SONG_LULLABY_INTRO" ,
+ 0x74: "ITEM_KEY_BOSS",
+ 0x75: "ITEM_COMPASS",
+ 0x76: "ITEM_DUNGEON_MAP",
+ 0x77: "ITEM_STRAY_FAIRIES",
+ 0x78: "ITEM_KEY_SMALL",
+ 0x79: "ITEM_MAGIC_SMALL",
+ 0x7A: "ITEM_MAGIC_LARGE",
+ 0x7B: "ITEM_HEART_PIECE_2",
+ 0x7C: "ITEM_INVALID_1",
+ 0x7D: "ITEM_INVALID_2",
+ 0x7E: "ITEM_INVALID_3",
+ 0x7F: "ITEM_INVALID_4",
+ 0x80: "ITEM_INVALID_5",
+ 0x81: "ITEM_INVALID_6",
+ 0x82: "ITEM_INVALID_7",
+ 0x83: "ITEM_RECOVERY_HEART",
+ 0x84: "ITEM_RUPEE_GREEN",
+ 0x85: "ITEM_RUPEE_BLUE",
+ 0x86: "ITEM_RUPEE_10",
+ 0x87: "ITEM_RUPEE_RED",
+ 0x88: "ITEM_RUPEE_PURPLE",
+ 0x89: "ITEM_RUPEE_SILVER",
+ 0x8A: "ITEM_RUPEE_HUGE",
+ 0x8B: "ITEM_STICKS_5",
+ 0x8C: "ITEM_STICKS_10",
+ 0x8D: "ITEM_NUTS_5",
+ 0x8E: "ITEM_NUTS_10",
+ 0x8F: "ITEM_BOMBS_5",
+ 0x90: "ITEM_BOMBS_10",
+ 0x91: "ITEM_BOMBS_20",
+ 0x92: "ITEM_BOMBS_30",
+ 0x93: "ITEM_ARROWS_10",
+ 0x94: "ITEM_ARROWS_30",
+ 0x95: "ITEM_ARROWS_40",
+ 0x96: "ITEM_ARROWS_50",
+ 0x97: "ITEM_BOMBCHUS_20",
+ 0x98: "ITEM_BOMBCHUS_10",
+ 0x99: "ITEM_BOMBCHUS_1",
+ 0x9A: "ITEM_BOMBCHUS_5",
+ 0x9B: "ITEM_STICK_UPGRADE_20",
+ 0x9C: "ITEM_STICK_UPGRADE_30",
+ 0x9D: "ITEM_NUT_UPGRADE_30",
+ 0x9E: "ITEM_NUT_UPGRADE_40",
+ 0x9F: "ITEM_CHATEAU_2",
+ 0xA0: "ITEM_MILK",
+ 0xA1: "ITEM_GOLD_DUST_2",
+ 0xA2: "ITEM_HYLIAN_LOACH_2",
+ 0xA3: "ITEM_SEAHORSE_CAUGHT",
+ 0xF0: "ITEM_F0" ,
+ 0xF1: "ITEM_F1",
+ 0xF2: "ITEM_F2",
+ 0xFC: "ITEM_FC" ,
+ 0xFD: "ITEM_FD",
+ 0xFE: "ITEM_FE",
+ 0xFF: "ITEM_NONE",
+}
+
+getItemId_names = {
+ 0x00: "GI_NONE",
+ 0x01: "GI_RUPEE_GREEN",
+ 0x02: "GI_RUPEE_BLUE",
+ 0x03: "GI_RUPEE_10",
+ 0x04: "GI_RUPEE_RED",
+ 0x05: "GI_RUPEE_PURPLE",
+ 0x06: "GI_RUPEE_SILVER",
+ 0x07: "GI_RUPEE_HUGE",
+ 0x08: "GI_WALLET_ADULT",
+ 0x09: "GI_WALLET_GIANT",
+ 0x0A: "GI_RECOVERY_HEART",
+ 0x0C: "GI_HEART_PIECE",
+ 0x0D: "GI_HEART_CONTAINER",
+ 0x0E: "GI_MAGIC_SMALL",
+ 0x0F: "GI_MAGIC_LARGE",
+ 0x11: "GI_STRAY_FAIRY",
+ 0x14: "GI_BOMBS_1",
+ 0x15: "GI_BOMBS_5",
+ 0x16: "GI_BOMBS_10",
+ 0x17: "GI_BOMBS_20",
+ 0x18: "GI_BOMBS_30",
+ 0x19: "GI_STICKS_1",
+ 0x1A: "GI_BOMBCHUS_10",
+ 0x1B: "GI_BOMB_BAG_20",
+ 0x1C: "GI_BOMB_BAG_30",
+ 0x1D: "GI_BOMB_BAG_40",
+ 0x1E: "GI_ARROWS_10",
+ 0x1F: "GI_ARROWS_30",
+ 0x20: "GI_ARROWS_40",
+ 0x21: "GI_ARROWS_50",
+ 0x22: "GI_QUIVER_30",
+ 0x23: "GI_QUIVER_40",
+ 0x24: "GI_QUIVER_50",
+ 0x25: "GI_ARROW_FIRE",
+ 0x26: "GI_ARROW_ICE",
+ 0x27: "GI_ARROW_LIGHT",
+ 0x28: "GI_NUTS_1",
+ 0x29: "GI_NUTS_5",
+ 0x2A: "GI_NUTS_10",
+ 0x2E: "GI_BOMBCHUS_20",
+ 0x32: "GI_SHIELD_HERO",
+ 0x33: "GI_SHIELD_MIRROR",
+ 0x34: "GI_POWDER_KEG",
+ 0x35: "GI_MAGIC_BEANS",
+ 0x36: "GI_BOMBCHUS_1",
+ 0x37: "GI_SWORD_KOKIRI",
+ 0x38: "GI_SWORD_RAZOR",
+ 0x39: "GI_SWORD_GILDED",
+ 0x3A: "GI_BOMBCHUS_5",
+ 0x3B: "GI_SWORD_GREAT_FAIRY",
+ 0x3C: "GI_KEY_SMALL",
+ 0x3D: "GI_KEY_BOSS",
+ 0x3E: "GI_MAP",
+ 0x3F: "GI_COMPASS",
+ 0x40: "GI_40",
+ 0x41: "GI_HOOKSHOT",
+ 0x42: "GI_LENS",
+ 0x43: "GI_PICTO_BOX",
+ 0x4C: "GI_OCARINA",
+ 0x50: "GI_BOMBERS_NOTEBOOK",
+ 0x52: "GI_SKULL_TOKEN",
+ 0x55: "GI_REMAINS_ODOLWA",
+ 0x56: "GI_REMAINS_GOHT",
+ 0x57: "GI_REMAINS_GYORG",
+ 0x58: "GI_REMAINS_TWINMOLD",
+ 0x59: "GI_POTION_RED_BOTTLE",
+ 0x5A: "GI_BOTTLE",
+ 0x5B: "GI_POTION_RED",
+ 0x5C: "GI_POTION_GREEN",
+ 0x5D: "GI_POTION_BLUE",
+ 0x5E: "GI_FAIRY",
+ 0x5F: "GI_DEKU_PRINCESS",
+ 0x60: "GI_MILK_BOTTLE",
+ 0x61: "GI_MILK_HALF",
+ 0x62: "GI_FISH",
+ 0x63: "GI_BUG",
+ 0x64: "GI_BLUE_FIRE",
+ 0x65: "GI_POE",
+ 0x66: "GI_BIG_POE",
+ 0x67: "GI_SPRING_WATER",
+ 0x68: "GI_HOT_SPRING_WATER",
+ 0x69: "GI_ZORA_EGG",
+ 0x6A: "GI_GOLD_DUST",
+ 0x6B: "GI_MUSHROOM",
+ 0x6C: "GI_6C",
+ 0x6D: "GI_6D",
+ 0x6E: "GI_SEAHORSE",
+ 0x6F: "GI_CHATEAU_BOTTLE",
+ 0x70: "GI_70",
+ 0x75: "GI_75",
+ 0x76: "GI_ICE_TRAP",
+ 0x78: "GI_MASK_DEKU",
+ 0x79: "GI_MASK_GORON",
+ 0x7A: "GI_MASK_ZORA",
+ 0x7B: "GI_MASK_FIERCE_DEITY",
+ 0x7C: "GI_MASK_CAPTAIN",
+ 0x7D: "GI_MASK_GIANT",
+ 0x7E: "GI_MASK_ALL_NIGHT",
+ 0x7F: "GI_MASK_BUNNY",
+ 0x80: "GI_MASK_KEATON",
+ 0x81: "GI_MASK_GARO",
+ 0x82: "GI_MASK_ROMANI",
+ 0x83: "GI_MASK_CIRCUS_LEADER",
+ 0x84: "GI_MASK_POSTMAN",
+ 0x85: "GI_MASK_COUPLE",
+ 0x86: "GI_MASK_GREAT_FAIRY",
+ 0x87: "GI_MASK_GIBDO",
+ 0x88: "GI_MASK_DON_GERO",
+ 0x89: "GI_MASK_KAMARO",
+ 0x8A: "GI_MASK_TRUTH",
+ 0x8B: "GI_MASK_STONE",
+ 0x8C: "GI_MASK_BREMEN",
+ 0x8D: "GI_MASK_BLAST",
+ 0x8E: "GI_MASK_SCENTS",
+ 0x8F: "GI_MASK_KAFEIS_MASK",
+ 0x91: "GI_CHATEAU",
+ 0x92: "GI_MILK",
+ 0x93: "GI_GOLD_DUST_2",
+ 0x94: "GI_HYLIAN_LOACH",
+ 0x95: "GI_SEAHORSE_CAUGHT",
+ 0x96: "GI_MOON_TEAR",
+ 0x97: "GI_DEED_LAND",
+ 0x98: "GI_DEED_SWAMP",
+ 0x99: "GI_DEED_MOUNTAIN",
+ 0x9A: "GI_DEED_OCEAN",
+ 0x9B: "GI_SWORD_GREAT_FAIRY_STOLEN",
+ 0x9C: "GI_SWORD_KOKIRI_STOLEN",
+ 0x9D: "GI_SWORD_RAZOR_STOLEN",
+ 0x9E: "GI_SWORD_GILDED_STOLEN",
+ 0x9F: "GI_SHIELD_HERO_STOLEN",
+ 0xA0: "GI_ROOM_KEY",
+ 0xA1: "GI_LETTER_TO_MAMA",
+ 0xA2: "GI_A2",
+ 0xA3: "GI_A3",
+ 0xA4: "GI_A4",
+ 0xA5: "GI_A5",
+ 0xA6: "GI_A6",
+ 0xA7: "GI_A7",
+ 0xA8: "GI_A8",
+ 0xA9: "GI_BOTTLE_STOLEN",
+ 0xAA: "GI_LETTER_TO_KAFEI",
+ 0xAB: "GI_PENDANT_OF_MEMORIES",
+ 0xB4: "GI_TINGLE_MAP_CLOCK_TOWN",
+ 0xB5: "GI_TINGLE_MAP_WOODFALL",
+ 0xB6: "GI_TINGLE_MAP_SNOWHEAD",
+ 0xB7: "GI_TINGLE_MAP_ROMANI_RANCH",
+ 0xB8: "GI_TINGLE_MAP_GREAT_BAY",
+ 0xB9: "GI_TINGLE_MAP_STONE_TOWER",
+ 0xBA: "GI_MAX" # I pity the fool
+}
+
+getItemDrawId_names = {
+ 0x00: "GID_BOTTLE",
+ 0x01: "GID_KEY_SMALL",
+ 0x02: "GID_MASK_KAMARO",
+ 0x03: "GID_MASK_COUPLE",
+ 0x04: "GID_04",
+ 0x05: "GID_05",
+ 0x06: "GID_06",
+ 0x07: "GID_07",
+ 0x08: "GID_RECOVERY_HEART",
+ 0x09: "GID_KEY_BOSS",
+ 0x0A: "GID_COMPASS",
+ 0x0B: "GID_BOMBERS_NOTEBOOK",
+ 0x0C: "GID_MASK_STONE",
+ 0x0D: "GID_MASK_KAFEIS_MASK",
+ 0x0E: "GID_MASK_CIRCUS_LEADER",
+ 0x0F: "GID_MASK_BREMEN",
+ 0x10: "GID_MASK_ALL_NIGHT",
+ 0x11: "GID_NUTS",
+ 0x12: "GID_HEART_CONTAINER",
+ 0x13: "GID_HEART_PIECE",
+ 0x14: "GID_QUIVER_30",
+ 0x15: "GID_QUIVER_40",
+ 0x16: "GID_QUIVER_50",
+ 0x17: "GID_BOMB_BAG_20",
+ 0x18: "GID_BOMB_BAG_30",
+ 0x19: "GID_BOMB_BAG_40",
+ 0x1A: "GID_STICK",
+ 0x1B: "GID_DUNGEON_MAP",
+ 0x1C: "GID_MAGIC_SMALL",
+ 0x1D: "GID_MAGIC_LARGE",
+ 0x1E: "GID_BOMB",
+ 0x1F: "GID_STONE_OF_AGONY",
+ 0x20: "GID_WALLET_ADULT",
+ 0x21: "GID_WALLET_GIANT",
+ 0x22: "GID_MASK_DON_GERO",
+ 0x23: "GID_ARROWS_SMALL",
+ 0x24: "GID_ARROWS_MEDIUM",
+ 0x25: "GID_ARROWS_LARGE",
+ 0x26: "GID_BOMBCHU",
+ 0x27: "GID_SHIELD_HERO",
+ 0x28: "GID_HOOKSHOT",
+ 0x29: "GID_29",
+ 0x2A: "GID_OCARINA",
+ 0x2B: "GID_MILK",
+ 0x2C: "GID_MASK_KEATON",
+ 0x2D: "GID_TINGLE_MAP",
+ 0x2E: "GID_BOW",
+ 0x2F: "GID_LENS",
+ 0x30: "GID_POTION_GREEN",
+ 0x31: "GID_POTION_RED",
+ 0x32: "GID_POTION_BLUE",
+ 0x33: "GID_SHIELD_MIRROR",
+ 0x34: "GID_MAGIC_BEANS",
+ 0x35: "GID_FISH",
+ 0x36: "GID_LETTER_MAMA",
+ 0x37: "GID_37",
+ 0x38: "GID_SWORD_BGS",
+ 0x39: "GID_MASK_SUN",
+ 0x3A: "GID_MASK_BLAST",
+ 0x3B: "GID_FAIRY",
+ 0x3C: "GID_MASK_SCENTS",
+ 0x3D: "GID_MASK_CAPTAIN",
+ 0x3E: "GID_MASK_BUNNY",
+ 0x3F: "GID_MASK_TRUTH",
+ 0x40: "GID_DEED_SWAMP",
+ 0x41: "GID_DEED_MOUNTAIN",
+ 0x42: "GID_RUPEE_HUGE",
+ 0x43: "GID_DEED_OCEAN",
+ 0x44: "GID_MASK_GORON",
+ 0x45: "GID_MASK_ZORA",
+ 0x46: "GID_46",
+ 0x47: "GID_ARROW_FIRE",
+ 0x48: "GID_ARROW_ICE",
+ 0x49: "GID_ARROW_LIGHT",
+ 0x4A: "GID_SKULL_TOKEN",
+ 0x4B: "GID_BUG",
+ 0x4C: "GID_4C",
+ 0x4D: "GID_POE",
+ 0x4E: "GID_FAIRY_2",
+ 0x4F: "GID_RUPEE_GREEN",
+ 0x50: "GID_RUPEE_BLUE",
+ 0x51: "GID_RUPEE_RED",
+ 0x52: "GID_BIG_POE",
+ 0x53: "GID_RUPEE_PURPLE",
+ 0x54: "GID_RUPEE_SILVER",
+ 0x55: "GID_SWORD_KOKIRI",
+ 0x56: "GID_SKULL_TOKEN_2",
+ 0x57: "GID_57",
+ 0x58: "GID_ZORA_EGG",
+ 0x59: "GID_MOON_TEAR",
+ 0x5A: "GID_DEED_LAND",
+ 0x5B: "GID_MASK_DEKU",
+ 0x5C: "GID_REMAINS_ODOLWA",
+ 0x5D: "GID_POWDER_KEG",
+ 0x5E: "GID_GOLD_DUST",
+ 0x5F: "GID_SEAHORSE",
+ 0x60: "GID_60",
+ 0x61: "GID_HYLIAN_LOACH",
+ 0x62: "GID_SEAHORSE_CAUGHT",
+ 0x63: "GID_REMAINS_GOHT",
+ 0x64: "GID_REMAINS_GYORG",
+ 0x65: "GID_REMAINS_TWINMOLD",
+ 0x66: "GID_SWORD_RAZOR",
+ 0x67: "GID_SWORD_GILDED",
+ 0x68: "GID_SWORD_GREAT_FAIRY",
+ 0x69: "GID_MASK_GARO",
+ 0x6A: "GID_MASK_GREAT_FAIRY",
+ 0x6B: "GID_MASK_GIBDO",
+ 0x6C: "GID_ROOM_KEY",
+ 0x6D: "GID_LETTER_TO_KAFEI",
+ 0x6E: "GID_PENDANT_OF_MEMORIES",
+ 0x6F: "GID_MUSHROOM",
+ 0x70: "GID_MASK_ROMANI",
+ 0x71: "GID_MASK_POSTMAN",
+ 0x72: "GID_MASK_GIANT",
+ 0x73: "GID_CHATEAU",
+ 0x74: "GID_PICTO_BOX",
+ 0x75: "GID_MASK_FIERCE_DEITY",
+ 0x76: "GID_MAX",
+ -1: "GID_NONE",
+}
+
+objectId_names = {
+ 0x000: "OBJECT_UNSET_0",
+ 0x001: "GAMEPLAY_KEEP",
+ 0x002: "GAMEPLAY_FIELD_KEEP",
+ 0x003: "GAMEPLAY_DANGEON_KEEP",
+ 0x004: "OBJECT_NB",
+ 0x005: "OBJECT_OKUTA",
+ 0x006: "OBJECT_CROW",
+ 0x007: "OBJECT_AH",
+ 0x008: "OBJECT_DY_OBJ",
+ 0x009: "OBJECT_WALLMASTER",
+ 0x00A: "OBJECT_DODONGO",
+ 0x00B: "OBJECT_FIREFLY",
+ 0x00C: "OBJECT_BOX",
+ 0x00D: "OBJECT_AL",
+ 0x00E: "OBJECT_BUBBLE",
+ 0x00F: "OBJECT_NIW",
+ 0x010: "OBJECT_LINK_BOY",
+ 0x011: "OBJECT_LINK_CHILD",
+ 0x012: "OBJECT_TITE",
+ 0x013: "OBJECT_TAB",
+ 0x014: "OBJECT_PH",
+ 0x015: "OBJECT_AND",
+ 0x016: "OBJECT_MSMO",
+ 0x017: "OBJECT_DINOFOS",
+ 0x018: "OBJECT_DRS",
+ 0x019: "OBJECT_ZL1",
+ 0x01A: "OBJECT_AN4",
+ 0x01B: "OBJECT_UNSET_1B",
+ 0x01C: "OBJECT_TEST3",
+ 0x01D: "OBJECT_FAMOS",
+ 0x01E: "OBJECT_UNSET_1E",
+ 0x01F: "OBJECT_UNSET_1F",
+ 0x020: "OBJECT_ST",
+ 0x021: "OBJECT_UNSET_21",
+ 0x022: "OBJECT_THIEFBIRD",
+ 0x023: "OBJECT_UNSET_23",
+ 0x024: "OBJECT_UNSET_24",
+ 0x025: "OBJECT_UNSET_25",
+ 0x026: "OBJECT_UNSET_26",
+ 0x027: "OBJECT_UNSET_27",
+ 0x028: "OBJECT_UNSET_28",
+ 0x029: "OBJECT_UNSET_29",
+ 0x02A: "OBJECT_BOMBF",
+ 0x02B: "OBJECT_UNSET_2B",
+ 0x02C: "OBJECT_UNSET_2C",
+ 0x02D: "OBJECT_UNSET_2D",
+ 0x02E: "OBJECT_UNSET_2E",
+ 0x02F: "OBJECT_UNSET_2F",
+ 0x030: "OBJECT_AM",
+ 0x031: "OBJECT_DEKUBABA",
+ 0x032: "OBJECT_UNSET_32",
+ 0x033: "OBJECT_UNSET_33",
+ 0x034: "OBJECT_UNSET_34",
+ 0x035: "OBJECT_UNSET_35",
+ 0x036: "OBJECT_UNSET_36",
+ 0x037: "OBJECT_UNSET_37",
+ 0x038: "OBJECT_UNSET_38",
+ 0x039: "OBJECT_UNSET_39",
+ 0x03A: "OBJECT_UNSET_3A",
+ 0x03B: "OBJECT_UNSET_3B",
+ 0x03C: "OBJECT_UNSET_3C",
+ 0x03D: "OBJECT_UNSET_3D",
+ 0x03E: "OBJECT_WARP1",
+ 0x03F: "OBJECT_B_HEART",
+ 0x040: "OBJECT_DEKUNUTS",
+ 0x041: "OBJECT_UNSET_41",
+ 0x042: "OBJECT_UNSET_42",
+ 0x043: "OBJECT_UNSET_43",
+ 0x044: "OBJECT_UNSET_44",
+ 0x045: "OBJECT_UNSET_45",
+ 0x046: "OBJECT_UNSET_46",
+ 0x047: "OBJECT_UNSET_47",
+ 0x048: "OBJECT_UNSET_48",
+ 0x049: "OBJECT_UNSET_49",
+ 0x04A: "OBJECT_UNSET_4A",
+ 0x04B: "OBJECT_UNSET_4B",
+ 0x04C: "OBJECT_UNSET_4C",
+ 0x04D: "OBJECT_UNSET_4D",
+ 0x04E: "OBJECT_UNSET_4E",
+ 0x04F: "OBJECT_UNSET_4F",
+ 0x050: "OBJECT_UNSET_50",
+ 0x051: "OBJECT_BB",
+ 0x052: "OBJECT_DEATH",
+ 0x053: "OBJECT_UNSET_53",
+ 0x054: "OBJECT_UNSET_54",
+ 0x055: "OBJECT_UNSET_55",
+ 0x056: "OBJECT_UNSET_56",
+ 0x057: "OBJECT_UNSET_57",
+ 0x058: "OBJECT_UNSET_58",
+ 0x059: "OBJECT_UNSET_59",
+ 0x05A: "OBJECT_UNSET_5A",
+ 0x05B: "OBJECT_UNSET_5B",
+ 0x05C: "OBJECT_F40_OBJ",
+ 0x05D: "OBJECT_PO_COMPOSER",
+ 0x05E: "OBJECT_UNSET_5E",
+ 0x05F: "OBJECT_HATA",
+ 0x060: "OBJECT_UNSET_60",
+ 0x061: "OBJECT_WOOD02",
+ 0x062: "OBJECT_UNSET_62",
+ 0x063: "OBJECT_UNSET_63",
+ 0x064: "OBJECT_TRAP",
+ 0x065: "OBJECT_UNSET_65",
+ 0x066: "OBJECT_UNSET_66",
+ 0x067: "OBJECT_UNSET_67",
+ 0x068: "OBJECT_UNSET_68",
+ 0x069: "OBJECT_UNSET_69",
+ 0x06A: "OBJECT_VM",
+ 0x06B: "OBJECT_UNSET_6B",
+ 0x06C: "OBJECT_UNSET_6C",
+ 0x06D: "OBJECT_UNSET_6D",
+ 0x06E: "OBJECT_UNSET_6E",
+ 0x06F: "OBJECT_UNSET_6F",
+ 0x070: "OBJECT_EFC_STAR_FIELD",
+ 0x071: "OBJECT_UNSET_71",
+ 0x072: "OBJECT_UNSET_72",
+ 0x073: "OBJECT_UNSET_73",
+ 0x074: "OBJECT_UNSET_74",
+ 0x075: "OBJECT_RD",
+ 0x076: "OBJECT_YUKIMURA_OBJ",
+ 0x077: "OBJECT_HEAVY_OBJECT",
+ 0x078: "OBJECT_UNSET_78",
+ 0x079: "OBJECT_UNSET_79",
+ 0x07A: "OBJECT_UNSET_7A",
+ 0x07B: "OBJECT_UNSET_7B",
+ 0x07C: "OBJECT_UNSET_7C",
+ 0x07D: "OBJECT_HORSE_LINK_CHILD",
+ 0x07E: "OBJECT_UNSET_7E",
+ 0x07F: "OBJECT_UNSET_7F",
+ 0x080: "OBJECT_SYOKUDAI",
+ 0x081: "OBJECT_UNSET_81",
+ 0x082: "OBJECT_UNSET_82",
+ 0x083: "OBJECT_UNSET_83",
+ 0x084: "OBJECT_EFC_TW",
+ 0x085: "OBJECT_UNSET_85",
+ 0x086: "OBJECT_GI_KEY",
+ 0x087: "OBJECT_MIR_RAY",
+ 0x088: "OBJECT_CTOWER_ROT",
+ 0x089: "OBJECT_UNSET_89",
+ 0x08A: "OBJECT_BDOOR",
+ 0x08B: "OBJECT_UNSET_8B",
+ 0x08C: "OBJECT_UNSET_8C",
+ 0x08D: "OBJECT_UNSET_8D",
+ 0x08E: "OBJECT_SB",
+ 0x08F: "OBJECT_GI_MELODY",
+ 0x090: "OBJECT_GI_HEART",
+ 0x091: "OBJECT_GI_COMPASS",
+ 0x092: "OBJECT_GI_BOSSKEY",
+ 0x093: "OBJECT_UNSET_93",
+ 0x094: "OBJECT_GI_NUTS",
+ 0x095: "OBJECT_UNSET_95",
+ 0x096: "OBJECT_GI_HEARTS",
+ 0x097: "OBJECT_GI_ARROWCASE",
+ 0x098: "OBJECT_GI_BOMBPOUCH",
+ 0x099: "OBJECT_IN",
+ 0x09A: "OBJECT_UNSET_9A",
+ 0x09B: "OBJECT_UNSET_9B",
+ 0x09C: "OBJECT_UNSET_9C",
+ 0x09D: "OBJECT_OS_ANIME",
+ 0x09E: "OBJECT_GI_BOTTLE",
+ 0x09F: "OBJECT_GI_STICK",
+ 0x0A0: "OBJECT_GI_MAP",
+ 0x0A1: "OBJECT_OF1D_MAP",
+ 0x0A2: "OBJECT_RU2",
+ 0x0A3: "OBJECT_UNSET_A3",
+ 0x0A4: "OBJECT_GI_MAGICPOT",
+ 0x0A5: "OBJECT_GI_BOMB_1",
+ 0x0A6: "OBJECT_UNSET_A6",
+ 0x0A7: "OBJECT_MA2",
+ 0x0A8: "OBJECT_GI_PURSE",
+ 0x0A9: "OBJECT_UNSET_A9",
+ 0x0AA: "OBJECT_UNSET_AA",
+ 0x0AB: "OBJECT_RR",
+ 0x0AC: "OBJECT_UNSET_AC",
+ 0x0AD: "OBJECT_UNSET_AD",
+ 0x0AE: "OBJECT_UNSET_AE",
+ 0x0AF: "OBJECT_GI_ARROW",
+ 0x0B0: "OBJECT_GI_BOMB_2",
+ 0x0B1: "OBJECT_UNSET_B1",
+ 0x0B2: "OBJECT_UNSET_B2",
+ 0x0B3: "OBJECT_GI_SHIELD_2",
+ 0x0B4: "OBJECT_GI_HOOKSHOT",
+ 0x0B5: "OBJECT_GI_OCARINA",
+ 0x0B6: "OBJECT_GI_MILK",
+ 0x0B7: "OBJECT_MA1",
+ 0x0B8: "OBJECT_UNSET_B8",
+ 0x0B9: "OBJECT_UNSET_B9",
+ 0x0BA: "OBJECT_UNSET_BA",
+ 0x0BB: "OBJECT_NY",
+ 0x0BC: "OBJECT_FR",
+ 0x0BD: "OBJECT_UNSET_BD",
+ 0x0BE: "OBJECT_UNSET_BE",
+ 0x0BF: "OBJECT_GI_BOW",
+ 0x0C0: "OBJECT_GI_GLASSES",
+ 0x0C1: "OBJECT_GI_LIQUID",
+ 0x0C2: "OBJECT_ANI",
+ 0x0C3: "OBJECT_GI_SHIELD_3",
+ 0x0C4: "OBJECT_UNSET_C4",
+ 0x0C5: "OBJECT_UNSET_C5",
+ 0x0C6: "OBJECT_GI_BEAN",
+ 0x0C7: "OBJECT_GI_FISH",
+ 0x0C8: "OBJECT_UNSET_C8",
+ 0x0C9: "OBJECT_UNSET_C9",
+ 0x0CA: "OBJECT_UNSET_CA",
+ 0x0CB: "OBJECT_GI_LONGSWORD",
+ 0x0CC: "OBJECT_UNSET_CC",
+ 0x0CD: "OBJECT_UNSET_CD",
+ 0x0CE: "OBJECT_UNSET_CE",
+ 0x0CF: "OBJECT_UNSET_CF",
+ 0x0D0: "OBJECT_ZO",
+ 0x0D1: "OBJECT_UNSET_D1",
+ 0x0D2: "OBJECT_UMAJUMP",
+ 0x0D3: "OBJECT_UNSET_D3",
+ 0x0D4: "OBJECT_UNSET_D4",
+ 0x0D5: "OBJECT_MASTERGOLON",
+ 0x0D6: "OBJECT_MASTERZOORA",
+ 0x0D7: "OBJECT_AOB",
+ 0x0D8: "OBJECT_IK",
+ 0x0D9: "OBJECT_AHG",
+ 0x0DA: "OBJECT_CNE",
+ 0x0DB: "OBJECT_UNSET_DB",
+ 0x0DC: "OBJECT_UNSET_DC",
+ 0x0DD: "OBJECT_AN3",
+ 0x0DE: "OBJECT_BJI",
+ 0x0DF: "OBJECT_BBA",
+ 0x0E0: "OBJECT_AN2",
+ 0x0E1: "OBJECT_UNSET_E1",
+ 0x0E2: "OBJECT_AN1",
+ 0x0E3: "OBJECT_BOJ",
+ 0x0E4: "OBJECT_FZ",
+ 0x0E5: "OBJECT_BOB",
+ 0x0E6: "OBJECT_GE1",
+ 0x0E7: "OBJECT_YABUSAME_POINT",
+ 0x0E8: "OBJECT_UNSET_E8",
+ 0x0E9: "OBJECT_UNSET_E9",
+ 0x0EA: "OBJECT_UNSET_EA",
+ 0x0EB: "OBJECT_UNSET_EB",
+ 0x0EC: "OBJECT_D_HSBLOCK",
+ 0x0ED: "OBJECT_D_LIFT",
+ 0x0EE: "OBJECT_MAMENOKI",
+ 0x0EF: "OBJECT_GOROIWA",
+ 0x0F0: "OBJECT_TORYO",
+ 0x0F1: "OBJECT_DAIKU",
+ 0x0F2: "OBJECT_NWC",
+ 0x0F3: "OBJECT_GM",
+ 0x0F4: "OBJECT_MS",
+ 0x0F5: "OBJECT_HS",
+ 0x0F6: "OBJECT_UNSET_F6",
+ 0x0F7: "OBJECT_LIGHTSWITCH",
+ 0x0F8: "OBJECT_KUSA",
+ 0x0F9: "OBJECT_TSUBO",
+ 0x0FA: "OBJECT_UNSET_FA",
+ 0x0FB: "OBJECT_UNSET_FB",
+ 0x0FC: "OBJECT_KANBAN",
+ 0x0FD: "OBJECT_OWL",
+ 0x0FE: "OBJECT_MK",
+ 0x0FF: "OBJECT_FU",
+ 0x100: "OBJECT_GI_KI_TAN_MASK",
+ 0x101: "OBJECT_UNSET_101",
+ 0x102: "OBJECT_GI_MASK18",
+ 0x103: "OBJECT_GI_RABIT_MASK",
+ 0x104: "OBJECT_GI_TRUTH_MASK",
+ 0x105: "OBJECT_UNSET_105",
+ 0x106: "OBJECT_STREAM",
+ 0x107: "OBJECT_MM",
+ 0x108: "OBJECT_UNSET_108",
+ 0x109: "OBJECT_UNSET_109",
+ 0x10A: "OBJECT_UNSET_10A",
+ 0x10B: "OBJECT_UNSET_10B",
+ 0x10C: "OBJECT_UNSET_10C",
+ 0x10D: "OBJECT_UNSET_10D",
+ 0x10E: "OBJECT_UNSET_10E",
+ 0x10F: "OBJECT_JS",
+ 0x110: "OBJECT_CS",
+ 0x111: "OBJECT_UNSET_111",
+ 0x112: "OBJECT_UNSET_112",
+ 0x113: "OBJECT_GI_SOLDOUT",
+ 0x114: "OBJECT_UNSET_114",
+ 0x115: "OBJECT_MAG",
+ 0x116: "OBJECT_UNSET_116",
+ 0x117: "OBJECT_UNSET_117",
+ 0x118: "OBJECT_UNSET_118",
+ 0x119: "OBJECT_GI_GOLONMASK",
+ 0x11A: "OBJECT_GI_ZORAMASK",
+ 0x11B: "OBJECT_UNSET_11B",
+ 0x11C: "OBJECT_UNSET_11C",
+ 0x11D: "OBJECT_KA",
+ 0x11E: "OBJECT_UNSET_11E",
+ 0x11F: "OBJECT_ZG",
+ 0x120: "OBJECT_UNSET_120",
+ 0x121: "OBJECT_GI_M_ARROW",
+ 0x122: "OBJECT_DS2",
+ 0x123: "OBJECT_UNSET_123",
+ 0x124: "OBJECT_FISH",
+ 0x125: "OBJECT_GI_SUTARU",
+ 0x126: "OBJECT_UNSET_126",
+ 0x127: "OBJECT_SSH",
+ 0x128: "OBJECT_BIGSLIME",
+ 0x129: "OBJECT_BG",
+ 0x12A: "OBJECT_BOMBIWA",
+ 0x12B: "OBJECT_HINTNUTS",
+ 0x12C: "OBJECT_RS",
+ 0x12D: "OBJECT_UNSET_12D",
+ 0x12E: "OBJECT_GLA",
+ 0x12F: "OBJECT_UNSET_12F",
+ 0x130: "OBJECT_GELDB",
+ 0x131: "OBJECT_UNSET_131",
+ 0x132: "OBJECT_DOG",
+ 0x133: "OBJECT_KIBAKO2",
+ 0x134: "OBJECT_DNS",
+ 0x135: "OBJECT_DNK",
+ 0x136: "OBJECT_UNSET_136",
+ 0x137: "OBJECT_GI_INSECT",
+ 0x138: "OBJECT_UNSET_138",
+ 0x139: "OBJECT_GI_GHOST",
+ 0x13A: "OBJECT_GI_SOUL",
+ 0x13B: "OBJECT_UNSET_13B",
+ 0x13C: "OBJECT_UNSET_13C",
+ 0x13D: "OBJECT_UNSET_13D",
+ 0x13E: "OBJECT_UNSET_13E",
+ 0x13F: "OBJECT_GI_RUPY",
+ 0x140: "OBJECT_MU",
+ 0x141: "OBJECT_WF",
+ 0x142: "OBJECT_SKB",
+ 0x143: "OBJECT_GS",
+ 0x144: "OBJECT_PS",
+ 0x145: "OBJECT_OMOYA_OBJ",
+ 0x146: "OBJECT_COW",
+ 0x147: "OBJECT_UNSET_147",
+ 0x148: "OBJECT_GI_SWORD_1",
+ 0x149: "OBJECT_UNSET_149",
+ 0x14A: "OBJECT_UNSET_14A",
+ 0x14B: "OBJECT_ZL4",
+ 0x14C: "OBJECT_LINK_GORON",
+ 0x14D: "OBJECT_LINK_ZORA",
+ 0x14E: "OBJECT_GRASSHOPPER",
+ 0x14F: "OBJECT_BOYO",
+ 0x150: "OBJECT_UNSET_150",
+ 0x151: "OBJECT_UNSET_151",
+ 0x152: "OBJECT_UNSET_152",
+ 0x153: "OBJECT_FWALL",
+ 0x154: "OBJECT_LINK_NUTS",
+ 0x155: "OBJECT_JSO",
+ 0x156: "OBJECT_KNIGHT",
+ 0x157: "OBJECT_ICICLE",
+ 0x158: "OBJECT_SPDWEB",
+ 0x159: "OBJECT_UNSET_159",
+ 0x15A: "OBJECT_BOSS01",
+ 0x15B: "OBJECT_BOSS02",
+ 0x15C: "OBJECT_BOSS03",
+ 0x15D: "OBJECT_BOSS04",
+ 0x15E: "OBJECT_BOSS05",
+ 0x15F: "OBJECT_BOSS06",
+ 0x160: "OBJECT_BOSS07",
+ 0x161: "OBJECT_RAF",
+ 0x162: "OBJECT_FUNEN",
+ 0x163: "OBJECT_RAILLIFT",
+ 0x164: "OBJECT_NUMA_OBJ",
+ 0x165: "OBJECT_FLOWERPOT",
+ 0x166: "OBJECT_SPINYROLL",
+ 0x167: "OBJECT_ICE_BLOCK",
+ 0x168: "OBJECT_UNSET_168",
+ 0x169: "OBJECT_KEIKOKU_DEMO",
+ 0x16A: "OBJECT_SLIME",
+ 0x16B: "OBJECT_PR",
+ 0x16C: "OBJECT_F52_OBJ",
+ 0x16D: "OBJECT_F53_OBJ",
+ 0x16E: "OBJECT_UNSET_16E",
+ 0x16F: "OBJECT_KIBAKO",
+ 0x170: "OBJECT_SEK",
+ 0x171: "OBJECT_GMO",
+ 0x172: "OBJECT_BAT",
+ 0x173: "OBJECT_SEKIHIL",
+ 0x174: "OBJECT_SEKIHIG",
+ 0x175: "OBJECT_SEKIHIN",
+ 0x176: "OBJECT_SEKIHIZ",
+ 0x177: "OBJECT_UNSET_177",
+ 0x178: "OBJECT_WIZ",
+ 0x179: "OBJECT_LADDER",
+ 0x17A: "OBJECT_MKK",
+ 0x17B: "OBJECT_UNSET_17B",
+ 0x17C: "OBJECT_UNSET_17C",
+ 0x17D: "OBJECT_UNSET_17D",
+ 0x17E: "OBJECT_KEIKOKU_OBJ",
+ 0x17F: "OBJECT_SICHITAI_OBJ",
+ 0x180: "OBJECT_DEKUCITY_ANA_OBJ",
+ 0x181: "OBJECT_RAT",
+ 0x182: "OBJECT_WATER_EFFECT",
+ 0x183: "OBJECT_UNSET_183",
+ 0x184: "OBJECT_DBLUE_OBJECT",
+ 0x185: "OBJECT_BAL",
+ 0x186: "OBJECT_WARP_UZU",
+ 0x187: "OBJECT_DRIFTICE",
+ 0x188: "OBJECT_FALL",
+ 0x189: "OBJECT_HANAREYAMA_OBJ",
+ 0x18A: "OBJECT_CRACE_OBJECT",
+ 0x18B: "OBJECT_DNQ",
+ 0x18C: "OBJECT_OBJ_TOKEIDAI",
+ 0x18D: "OBJECT_EG",
+ 0x18E: "OBJECT_TRU",
+ 0x18F: "OBJECT_TRT",
+ 0x190: "OBJECT_HAKUGIN_OBJ",
+ 0x191: "OBJECT_HORSE_GAME_CHECK",
+ 0x192: "OBJECT_STK",
+ 0x193: "OBJECT_UNSET_193",
+ 0x194: "OBJECT_UNSET_194",
+ 0x195: "OBJECT_MNK",
+ 0x196: "OBJECT_GI_BOTTLE_RED",
+ 0x197: "OBJECT_TOKEI_TOBIRA",
+ 0x198: "OBJECT_AZ",
+ 0x199: "OBJECT_TWIG",
+ 0x19A: "OBJECT_DEKUCITY_OBJ",
+ 0x19B: "OBJECT_PO_FUSEN",
+ 0x19C: "OBJECT_RACETSUBO",
+ 0x19D: "OBJECT_HA",
+ 0x19E: "OBJECT_BIGOKUTA",
+ 0x19F: "OBJECT_OPEN_OBJ",
+ 0x1A0: "OBJECT_FU_KAITEN",
+ 0x1A1: "OBJECT_FU_MATO",
+ 0x1A2: "OBJECT_MTORIDE",
+ 0x1A3: "OBJECT_OSN",
+ 0x1A4: "OBJECT_TOKEI_STEP",
+ 0x1A5: "OBJECT_LOTUS",
+ 0x1A6: "OBJECT_TL",
+ 0x1A7: "OBJECT_DKJAIL_OBJ",
+ 0x1A8: "OBJECT_VISIBLOCK",
+ 0x1A9: "OBJECT_TSN",
+ 0x1AA: "OBJECT_DS2N",
+ 0x1AB: "OBJECT_FSN",
+ 0x1AC: "OBJECT_SHN",
+ 0x1AD: "OBJECT_BIGICICLE",
+ 0x1AE: "OBJECT_GI_BOTTLE_15",
+ 0x1AF: "OBJECT_TK",
+ 0x1B0: "OBJECT_MARKET_OBJ",
+ 0x1B1: "OBJECT_GI_RESERVE00",
+ 0x1B2: "OBJECT_GI_RESERVE01",
+ 0x1B3: "OBJECT_LIGHTBLOCK",
+ 0x1B4: "OBJECT_TAKARAYA_OBJECTS",
+ 0x1B5: "OBJECT_WDHAND",
+ 0x1B6: "OBJECT_SDN",
+ 0x1B7: "OBJECT_SNOWWD",
+ 0x1B8: "OBJECT_GIANT",
+ 0x1B9: "OBJECT_COMB",
+ 0x1BA: "OBJECT_HANA",
+ 0x1BB: "OBJECT_BOSS_HAKUGIN",
+ 0x1BC: "OBJECT_MEGANEANA_OBJ",
+ 0x1BD: "OBJECT_GI_NUTSMASK",
+ 0x1BE: "OBJECT_STK2",
+ 0x1BF: "OBJECT_SPOT11_OBJ",
+ 0x1C0: "OBJECT_DANPEI_OBJECT",
+ 0x1C1: "OBJECT_DHOUSE",
+ 0x1C2: "OBJECT_HAKAISI",
+ 0x1C3: "OBJECT_PO",
+ 0x1C4: "OBJECT_SNOWMAN",
+ 0x1C5: "OBJECT_PO_SISTERS",
+ 0x1C6: "OBJECT_PP",
+ 0x1C7: "OBJECT_GORONSWITCH",
+ 0x1C8: "OBJECT_DELF",
+ 0x1C9: "OBJECT_BOTIHASIRA",
+ 0x1CA: "OBJECT_GI_BIGBOMB",
+ 0x1CB: "OBJECT_PST",
+ 0x1CC: "OBJECT_BSMASK",
+ 0x1CD: "OBJECT_SPIDERTENT",
+ 0x1CE: "OBJECT_ZORAEGG",
+ 0x1CF: "OBJECT_KBT",
+ 0x1D0: "OBJECT_GG",
+ 0x1D1: "OBJECT_MARUTA",
+ 0x1D2: "OBJECT_GHAKA",
+ 0x1D3: "OBJECT_OYU",
+ 0x1D4: "OBJECT_DNP",
+ 0x1D5: "OBJECT_DAI",
+ 0x1D6: "OBJECT_KGY",
+ 0x1D7: "OBJECT_FB",
+ 0x1D8: "OBJECT_TAISOU",
+ 0x1D9: "OBJECT_MASK_BU_SAN",
+ 0x1DA: "OBJECT_MASK_KI_TAN",
+ 0x1DB: "OBJECT_MASK_RABIT",
+ 0x1DC: "OBJECT_MASK_SKJ",
+ 0x1DD: "OBJECT_MASK_BAKURETU",
+ 0x1DE: "OBJECT_MASK_TRUTH",
+ 0x1DF: "OBJECT_GK",
+ 0x1E0: "OBJECT_HAKA_OBJ",
+ 0x1E1: "OBJECT_MASK_GORON",
+ 0x1E2: "OBJECT_MASK_ZORA",
+ 0x1E3: "OBJECT_MASK_NUTS",
+ 0x1E4: "OBJECT_MASK_BOY",
+ 0x1E5: "OBJECT_DNT",
+ 0x1E6: "OBJECT_YUKIYAMA",
+ 0x1E7: "OBJECT_ICEFLOE",
+ 0x1E8: "OBJECT_GI_GOLD_DUST",
+ 0x1E9: "OBJECT_GI_BOTTLE_16",
+ 0x1EA: "OBJECT_GI_BOTTLE_22",
+ 0x1EB: "OBJECT_BEE",
+ 0x1EC: "OBJECT_OT",
+ 0x1ED: "OBJECT_UTUBO",
+ 0x1EE: "OBJECT_DORA",
+ 0x1EF: "OBJECT_GI_LOACH",
+ 0x1F0: "OBJECT_GI_SEAHORSE",
+ 0x1F1: "OBJECT_BIGPO",
+ 0x1F2: "OBJECT_HARIKO",
+ 0x1F3: "OBJECT_DNO",
+ 0x1F4: "OBJECT_SINKAI_KABE",
+ 0x1F5: "OBJECT_KIN2_OBJ",
+ 0x1F6: "OBJECT_ISHI",
+ 0x1F7: "OBJECT_HAKUGIN_DEMO",
+ 0x1F8: "OBJECT_JG",
+ 0x1F9: "OBJECT_GI_SWORD_2",
+ 0x1FA: "OBJECT_GI_SWORD_3",
+ 0x1FB: "OBJECT_GI_SWORD_4",
+ 0x1FC: "OBJECT_UM",
+ 0x1FD: "OBJECT_MASK_GIBUDO",
+ 0x1FE: "OBJECT_MASK_JSON",
+ 0x1FF: "OBJECT_MASK_KERFAY",
+ 0x200: "OBJECT_MASK_BIGELF",
+ 0x201: "OBJECT_RB",
+ 0x202: "OBJECT_MBAR_OBJ",
+ 0x203: "OBJECT_IKANA_OBJ",
+ 0x204: "OBJECT_KZ",
+ 0x205: "OBJECT_TOKEI_TURRET",
+ 0x206: "OBJECT_ZOG",
+ 0x207: "OBJECT_ROTLIFT",
+ 0x208: "OBJECT_POSTHOUSE_OBJ",
+ 0x209: "OBJECT_GI_MASK09",
+ 0x20A: "OBJECT_GI_MASK14",
+ 0x20B: "OBJECT_GI_MASK15",
+ 0x20C: "OBJECT_INIBS_OBJECT",
+ 0x20D: "OBJECT_TREE",
+ 0x20E: "OBJECT_KAIZOKU_OBJ",
+ 0x20F: "OBJECT_GI_RESERVE_B_00",
+ 0x210: "OBJECT_GI_RESERVE_C_00",
+ 0x211: "OBJECT_ZOB",
+ 0x212: "OBJECT_MILKBAR",
+ 0x213: "OBJECT_DMASK",
+ 0x214: "OBJECT_MASK_KYOJIN",
+ 0x215: "OBJECT_GI_RESERVE_C_01",
+ 0x216: "OBJECT_ZOD",
+ 0x217: "OBJECT_KUMO30",
+ 0x218: "OBJECT_OBJ_YASI",
+ 0x219: "OBJECT_MASK_ROMERNY",
+ 0x21A: "OBJECT_TANRON1",
+ 0x21B: "OBJECT_TANRON2",
+ 0x21C: "OBJECT_TANRON3",
+ 0x21D: "OBJECT_GI_MAGICMUSHROOM",
+ 0x21E: "OBJECT_OBJ_CHAN",
+ 0x21F: "OBJECT_GI_MASK10",
+ 0x220: "OBJECT_ZOS",
+ 0x221: "OBJECT_MASK_POSTHAT",
+ 0x222: "OBJECT_F40_SWITCH",
+ 0x223: "OBJECT_LODMOON",
+ 0x224: "OBJECT_TRO",
+ 0x225: "OBJECT_GI_MASK12",
+ 0x226: "OBJECT_GI_MASK23",
+ 0x227: "OBJECT_GI_BOTTLE_21",
+ 0x228: "OBJECT_GI_CAMERA",
+ 0x229: "OBJECT_KAMEJIMA",
+ 0x22A: "OBJECT_HARFGIBUD",
+ 0x22B: "OBJECT_ZOV",
+ 0x22C: "OBJECT_HGDOOR",
+ 0x22D: "OBJECT_UNSET_22D",
+ 0x22E: "OBJECT_UNSET_22E",
+ 0x22F: "OBJECT_UNSET_22F",
+ 0x230: "OBJECT_DOR01",
+ 0x231: "OBJECT_DOR02",
+ 0x232: "OBJECT_DOR03",
+ 0x233: "OBJECT_DOR04",
+ 0x234: "OBJECT_LAST_OBJ",
+ 0x235: "OBJECT_REDEAD_OBJ",
+ 0x236: "OBJECT_IKNINSIDE_OBJ",
+ 0x237: "OBJECT_IKNV_OBJ",
+ 0x238: "OBJECT_PAMERA",
+ 0x239: "OBJECT_HSSTUMP",
+ 0x23A: "OBJECT_ZM",
+ 0x23B: "OBJECT_BIG_FWALL",
+ 0x23C: "OBJECT_SECOM_OBJ",
+ 0x23D: "OBJECT_HUNSUI",
+ 0x23E: "OBJECT_UCH",
+ 0x23F: "OBJECT_TANRON4",
+ 0x240: "OBJECT_TANRON5",
+ 0x241: "OBJECT_DT",
+ 0x242: "OBJECT_GI_MASK03",
+ 0x243: "OBJECT_CHA",
+ 0x244: "OBJECT_OBJ_DINNER",
+ 0x245: "OBJECT_GI_RESERVE_B_01",
+ 0x246: "OBJECT_LASTDAY",
+ 0x247: "OBJECT_BAI",
+ 0x248: "OBJECT_IN2",
+ 0x249: "OBJECT_IKN_DEMO",
+ 0x24A: "OBJECT_YB",
+ 0x24B: "OBJECT_RZ",
+ 0x24C: "OBJECT_MASK_ZACHO",
+ 0x24D: "OBJECT_GI_FIELDMAP",
+ 0x24E: "OBJECT_MASK_STONE",
+ 0x24F: "OBJECT_BJT",
+ 0x250: "OBJECT_TARU",
+ 0x251: "OBJECT_MOONSTON",
+ 0x252: "OBJECT_MASK_BREE",
+ 0x253: "OBJECT_GI_SCHEDULE",
+ 0x254: "OBJECT_GI_STONEMASK",
+ 0x255: "OBJECT_ZORABAND",
+ 0x256: "OBJECT_KEPN_KOYA",
+ 0x257: "OBJECT_OBJ_USIYANE",
+ 0x258: "OBJECT_GI_MASK05",
+ 0x259: "OBJECT_GI_MASK11",
+ 0x25A: "OBJECT_GI_MASK20",
+ 0x25B: "OBJECT_NNH",
+ 0x25C: "OBJECT_MASK_GERO",
+ 0x25D: "OBJECT_MASK_YOFUKASI",
+ 0x25E: "OBJECT_MASK_MEOTO",
+ 0x25F: "OBJECT_MASK_DANCER",
+ 0x260: "OBJECT_KZSAKU",
+ 0x261: "OBJECT_OBJ_MILK_BIN",
+ 0x262: "OBJECT_RANDOM_OBJ",
+ 0x263: "OBJECT_KUJIYA",
+ 0x264: "OBJECT_KITAN",
+ 0x265: "OBJECT_GI_MASK06",
+ 0x266: "OBJECT_GI_MASK16",
+ 0x267: "OBJECT_ASTR_OBJ",
+ 0x268: "OBJECT_BSB",
+ 0x269: "OBJECT_FALL2",
+ 0x26A: "OBJECT_STH",
+ 0x26B: "OBJECT_GI_MSSA",
+ 0x26C: "OBJECT_SMTOWER",
+ 0x26D: "OBJECT_GI_MASK21",
+ 0x26E: "OBJECT_YADO_OBJ",
+ 0x26F: "OBJECT_SYOTEN",
+ 0x270: "OBJECT_MOONEND",
+ 0x271: "OBJECT_OB",
+ 0x272: "OBJECT_GI_BOTTLE_04",
+ 0x273: "OBJECT_OBJ_DANPEILIFT",
+ 0x274: "OBJECT_WDOR01",
+ 0x275: "OBJECT_WDOR02",
+ 0x276: "OBJECT_WDOR03",
+ 0x277: "OBJECT_STK3",
+ 0x278: "OBJECT_KINSTA1_OBJ",
+ 0x279: "OBJECT_KINSTA2_OBJ",
+ 0x27A: "OBJECT_BH",
+ 0x27B: "OBJECT_WDOR04",
+ 0x27C: "OBJECT_WDOR05",
+ 0x27D: "OBJECT_GI_MASK17",
+ 0x27E: "OBJECT_GI_MASK22",
+ 0x27F: "OBJECT_LBFSHOT",
+ 0x280: "OBJECT_FUSEN",
+ 0x281: "OBJECT_ENDING_OBJ",
+ 0x282: "OBJECT_GI_MASK13",
+ 0x283: "OBJECT_ID_MAX",
+}
+
+@dataclasses.dataclass
+class GetItemEntry:
+ getItemId: int
+ itemId: int
+ field: int
+ gi: int
+ textId: int
+ objectId: int
+
+ def __str__(self) -> str:
+ itemId_name = itemId_names.get(self.itemId, f"NOT FOUND: 0x{self.itemId:X}")
+ gid = abs(self.gi) - 1
+ getitemDrawId_name = getItemDrawId_names.get(gid, f"NOT FOUND: 0x{abs(self.gi) - 1:X}")
+
+ if self.gi == 0:
+ chest_anim = 0
+ else:
+ chest_anim = "CHEST_ANIM_SHORT" if self.gi < 0 else "CHEST_ANIM_LONG"
+
+ objectId_name = objectId_names.get(self.objectId, f"NOT FOUND: 0x{abs(self.objectId):X}")
+
+ ret = f"/* 0x{self.getItemId:02X} */ GET_ITEM({itemId_name}, {objectId_name}, {getitemDrawId_name}, 0x{self.textId:X}, 0x{self.field:X}, {chest_anim})"
+
+ return ret
+
+def main() -> None:
+ description = "Extract and print the GetItem table"
+ epilog = ""
+
+ parser = argparse.ArgumentParser(description=description, epilog=epilog, formatter_class=argparse.RawTextHelpFormatter)
+ parser.add_argument("file", help="binary file to read")
+ parser.add_argument("offset", help="offset at which to start reading")
+ parser.add_argument("count", help="number of entries to extract")
+ parser.add_argument("-g", help="look further back for glitched items from Get Item Manipulation", action="store_true")
+
+ args = parser.parse_args()
+
+ start = int(args.offset, 0)
+ count = int(args.count, 0)
+ glitched = args.g
+ pos_start = 0
+
+ with open(args.file, "rb") as f:
+ if glitched:
+ start -= GETITEMENTRY_LENGTH * count
+ pos_start -= count
+ count *= 2
+
+ f.seek(start, os.SEEK_SET)
+ data = f.read(GETITEMENTRY_LENGTH * count)
+ unpacked_data = struct.iter_unpack(GETITEMENTRY_FORMAT, data)
+ get_item_entries: typing.List[GetItemEntry] = []
+
+ for i,entry in enumerate(unpacked_data):
+ get_item_entries.append(GetItemEntry(pos_start + i+1, *entry))
+
+ for entry in get_item_entries:
+ print(f"{entry},")
+
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/m2ctx.py b/tools/m2ctx.py
index 0824899f1..23875eef0 100755
--- a/tools/m2ctx.py
+++ b/tools/m2ctx.py
@@ -1,14 +1,39 @@
#!/usr/bin/env python3
-import argparse, os, subprocess, sys
+import argparse
+import os
+import sys
+import subprocess
+import tempfile
from pathlib import Path
-script_dir = os.path.dirname(os.path.realpath(__file__))
-root_dir = script_dir + "/../"
-src_dir = root_dir + "src/"
+script_dir = Path(os.path.dirname(os.path.realpath(__file__)))
+root_dir = script_dir / ".."
+src_dir = root_dir / "src"
+
+# Project-specific
+CPP_FLAGS = [
+ "-Iinclude",
+ "-Isrc",
+ "-Iassets",
+ "-Ibuild",
+ "-I.",
+
+ "-D__sgi",
+ "-D_LANGUAGE_C",
+ "-DNON_MATCHING",
+ "-D_Static_assert(x, y)=",
+ "-D__attribute__(x)="
+ "-D_MIPS_SZLONG=32",
+ "-ffreestanding",
+ "-DM2CTX",
+
+ "-std=gnu89",
+]
# Read through the processes context and replace whatever
def custom_replacements(output):
+ actorList = []
output = output.splitlines()
i = 0
@@ -36,7 +61,6 @@ def custom_replacements(output):
"door",
"chest",
]
- actorList = []
for x in range(12):
actorList.append(actorListText.replace("first;", f"{actorCats[x]};") + "\n")
if x == 2:
@@ -48,63 +72,55 @@ def custom_replacements(output):
i += 1
return "\n".join(output)
-def get_c_dir(dirname):
- for root, dirs, files in os.walk(src_dir):
- for directory in dirs:
- if directory == dirname:
- return os.path.join(root, directory)
-
-
-def get_c_file(directory):
- for root, dirs, files in os.walk(directory):
- for file in files:
- if file.endswith(".c") and "data" not in file:
- return file
-
-
-def import_c_file(in_file):
+def import_c_file(in_file) -> str:
in_file = os.path.relpath(in_file, root_dir)
- cpp_command = ["gcc", "-E", "-P", "-Iinclude", "-Iassets", "-Isrc", "-undef", "-D__sgi", "-D_LANGUAGE_C",
- "-DNON_MATCHING", "-D_Static_assert(x, y)=", "-D__attribute__(x)=", in_file]
+
+ cpp_command = ["gcc", "-E", "-P", "-undef", "-dM", *CPP_FLAGS, in_file]
+ cpp_command2 = ["gcc", "-E", "-P", "-undef", *CPP_FLAGS, in_file]
+
+ with tempfile.NamedTemporaryFile(suffix=".c") as tmp:
+ stock_macros = subprocess.check_output(["gcc", "-E", "-P", "-undef", "-dM", tmp.name], cwd=root_dir, encoding="utf-8")
+
+ out_text = ""
try:
- return subprocess.check_output(cpp_command, cwd=root_dir, encoding="utf-8")
+ out_text += subprocess.check_output(cpp_command, cwd=root_dir, encoding="utf-8")
+ out_text += subprocess.check_output(cpp_command2, cwd=root_dir, encoding="utf-8")
except subprocess.CalledProcessError:
print(
"Failed to preprocess input file, when running command:\n"
- + cpp_command,
+ + " ".join(cpp_command),
file=sys.stderr,
- )
+ )
sys.exit(1)
+ if not out_text:
+ print("Output is empty - aborting")
+ sys.exit(1)
+
+ for line in stock_macros.strip().splitlines():
+ out_text = out_text.replace(line + "\n", "")
+ return out_text
+
def main():
parser = argparse.ArgumentParser(usage="./m2ctx.py path/to/file.c or ./m2ctx.py (from an actor or gamestate's asm dir)",
- description="Creates a ctx.c file for mips2c. "
- "Output will be saved as oot/ctx.c")
+ description="Creates a ctx.c file for m2c or decomp.me. "
+ "Output will be saved as ctx.c")
parser.add_argument('filepath', help="path of c file to be processed")
- parser.add_argument("--custom", "-c", dest="custom", action="store_true", default=False,
- help="Apply custom replacements to the output to help aid m2c output")
+ parser.add_argument("--custom", "-c", dest="custom", action="store_true", default=False,
+ help="Apply custom replacements to the output to help aid m2c output")
args = parser.parse_args()
- if args.filepath:
- c_file_path = args.filepath
- print("Using file: {}".format(c_file_path))
- else:
- this_dir = Path.cwd()
- c_dir_path = get_c_dir(this_dir.name)
- if c_dir_path is None:
- sys.exit(
- "Cannot find appropriate c file dir. In argumentless mode, run this script from the c file's corresponding asm dir.")
- c_file = get_c_file(c_dir_path)
- c_file_path = os.path.join(c_dir_path, c_file)
- print("Using file: {}".format(c_file_path))
+ c_file_path = args.filepath
+ print("Using file: {}".format(c_file_path))
output = import_c_file(c_file_path)
if args.custom:
output = custom_replacements(output)
- with open(os.path.join(root_dir, "ctx.c"), "w", encoding="UTF-8") as f:
+ ctxPath = root_dir / "ctx.c"
+ with ctxPath.open("w", encoding="UTF-8") as f:
f.write(output)
diff --git a/tools/namefixer.py b/tools/namefixer.py
index 853322f5c..417210d8f 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -18,10 +18,16 @@ simpleReplace = {
wordReplace = {
# Functions
"Actor_GetSwitchFlag": "Flags_GetSwitch",
- "Math_FAtan2F(": "Math_Atan2S_XY(",
"Math_Acot2F": "Math_Atan2F_XY",
"atan_flip": "Math_Atan2F_XY",
"atans": "Math_Atan2S",
+ "sin_rad": "Math_SinF",
+ "cos_rad": "Math_CosF",
+ "randPlusMinusPoint5Scaled": "Rand_CenteredFloat",
+ # "Math_FAtan2F": "Math_Atan2S_XY", // Old Math_FAtan2F was renamed
+ "func_80086B30": "Math_FAtan2F",
+ "func_80086760": "Math_FTanF",
+ "func_80086C48": "Math_FAcosF",
# "SysMatrix_StateAlloc": "Matrix_StateAlloc",
# "SysMatrix_StatePush": "Matrix_StatePush",
@@ -164,6 +170,10 @@ wordReplace = {
"Actor_DistanceToPoint": "Actor_WorldDistXYZToPoint",
"Actor_XZDistanceBetweenActors": "Actor_WorldDistXZToActor",
"Actor_XZDistanceToPoint": "Actor_WorldDistXZToPoint",
+ "func_800B6468": "Actor_InitPlayerImpact",
+ "func_800B6474": "Actor_UpdatePlayerImpact",
+ "func_800B648C": "Actor_SetPlayerImpact",
+ "func_800B64FC": "Actor_GetPlayerImpact",
"Audio_PlaySoundAtPosition": "SoundSource_PlaySfxAtFixedWorldPos",
"func_800F0590": "SoundSource_PlaySfxEachFrameAtFixedWorldPos",
"func_8016970C": "Play_SetCameraAtEye",
@@ -195,72 +205,51 @@ wordReplace = {
"func_801A4A28": "Audio_PlayAmbience",
"func_801A7328": "AudioSfx_StopByPosAndId",
"func_801A75E8": "AudioSfx_StopById",
- "SkelAnime_LodDrawLimb": "SkelAnime_DrawLimbLod",
"SkelAnime_LodDraw": "SkelAnime_DrawLod",
- "SkelAnime_LodDrawLimbSV": "SkelAnime_DrawFlexLimbLod",
"SkelAnime_LodDrawSV": "SkelAnime_DrawFlexLod",
- # "SkelAnime_DrawLimb": "SkelAnime_DrawLimbOpa", # A different function is called this now
# "SkelAnime_Draw": "SkelAnime_DrawOpa", # A different function is called this now
"SkelAnime_DrawLimbSV": "SkelAnime_DrawFlexLimbOpa",
"SkelAnime_DrawSV": "SkelAnime_DrawFlexOpa",
# "SkelAnime_AnimateFrame": "SkelAnime_GetFrameData", # A different function is called this now
- "SkelAnime_GetTotalFrames": "Animation_GetLength",
"SkelAnime_GetFrameCount": "Animation_GetLastFrame",
- "SkelAnime_Draw2Limb": "SkelAnime_DrawLimb",
"SkelAnime_Draw2": "SkelAnime_Draw",
- "SkelAnime_DrawLimbSV2": "SkelAnime_DrawFlexLimb",
"SkelAnime_DrawSV2": "SkelAnime_DrawFlex",
- "func_80134FFC": "SkelAnime_GetFrameData2",
- "func_801353D4": "Animation_GetLimbCount2",
- "SkelAnime_GetTotalFrames2": "Animation_GetLength2",
- "SkelAnime_GetFrameCount2": "Animation_GetLastFrame2",
- "SkelAnime_InterpolateVec3s": "SkelAnime_InterpFrameTable",
"SkelAnime_AnimationCtxReset": "AnimationContext_Reset",
"func_801358D4": "AnimationContext_SetNextQueue",
"func_801358F4": "AnimationContext_DisableQueue",
- "SkelAnime_NextEntry": "AnimationContext_AddEntry",
"SkelAnime_LoadLinkAnimetion": "AnimationContext_SetLoadFrame",
- "SkelAnime_LoadAnimationType1": "AnimationContext_SetCopyAll",
- "SkelAnime_LoadAnimationType2": "AnimationContext_SetInterp",
- "SkelAnime_LoadAnimationType3": "AnimationContext_SetCopyTrue",
- "SkelAnime_LoadAnimationType4": "AnimationContext_SetCopyFalse",
- "SkelAnime_LoadAnimationType5": "AnimationContext_SetMoveActor",
- "SkelAnime_LinkAnimetionLoaded": "AnimationContext_LoadFrame",
+
"SkelAnime_AnimationType1Loaded": "AnimationContext_CopyAll",
"SkelAnime_AnimationType2Loaded": "AnimationContext_CopyInterp",
"SkelAnime_AnimationType3Loaded": "AnimationContext_CopyTrue",
"SkelAnime_AnimationType4Loaded": "AnimationContext_CopyFalse",
"SkelAnime_AnimationType5Loaded": "AnimationContext_MoveActor",
"func_80135EE8": "AnimationContext_Update",
- "SkelAnime_InitLinkAnimetion": "SkelAnime_InitLink",
- "func_801360A8": "LinkAnimation_SetUpdateFunction",
- "func_801360E0": "LinkAnimation_Update",
- "func_80136104": "LinkAnimation_Morph",
- "func_801361BC": "LinkAnimation_AnimateFrame",
- "func_80136288": "LinkAnimation_Loop",
- "func_8013631C": "LinkAnimation_Once",
+ "SkelAnime_InitLink": "SkelAnime_InitPlayer",
+ "LinkAnimation_SetUpdateFunction": "PlayerAnimation_SetUpdateFunction",
+ "LinkAnimation_Update": "PlayerAnimation_Update",
+ "LinkAnimation_AnimateFrame": "PlayerAnimation_AnimateFrame",
"SkelAnime_SetTransition": "Animation_SetMorph",
- "SkelAnime_ChangeLinkAnim": "LinkAnimation_Change",
- "SkelAnime_ChangeLinkAnimDefaultStop": "LinkAnimation_PlayOnce",
- "SkelAnime_ChangeLinkAnimPlaybackStop": "LinkAnimation_PlayOnceSetSpeed",
- "SkelAnime_ChangeLinkAnimDefaultRepeat": "LinkAnimation_PlayLoop",
- "SkelAnime_ChangeLinkAnimPlaybackRepeat": "LinkAnimation_PlayLoopSetSpeed",
- "func_8013670C": "LinkAnimation_CopyJointToMorph",
- "func_8013673C": "LinkAnimation_CopyMorphToJoint",
- "func_8013676C": "LinkAnimation_LoadToMorph",
- "func_801367B0": "LinkAnimation_LoadToJoint",
- "func_801367F4": "LinkAnimation_InterpJointMorph",
- "func_8013682C": "LinkAnimation_BlendToJoint",
- "func_801368CC": "LinkAnimation_BlendToMorph",
- "SkelAnime_SetModeStop": "LinkAnimation_EndLoop",
- "func_80136990": "Animation_OnFrameImpl",
- "func_80136A48": "LinkAnimation_OnFrame",
+ "LinkAnimation_Change": "PlayerAnimation_Change",
+ "LinkAnimation_PlayOnce": "PlayerAnimation_PlayOnce",
+ "LinkAnimation_PlayOnceSetSpeed": "PlayerAnimation_PlayOnceSetSpeed",
+ "LinkAnimation_PlayLoop": "PlayerAnimation_PlayLoop",
+ "LinkAnimation_PlayLoopSetSpeed": "PlayerAnimation_PlayLoopSetSpeed",
+ "LinkAnimation_CopyJointToMorph": "PlayerAnimation_CopyJointToMorph",
+ "LinkAnimation_CopyMorphToJoint": "PlayerAnimation_CopyMorphToJoint",
+ "LinkAnimation_LoadToMorph": "PlayerAnimation_LoadToMorph",
+ "LinkAnimation_LoadToJoint": "PlayerAnimation_LoadToJoint",
+ "LinkAnimation_InterpJointMorph": "PlayerAnimation_InterpJointMorph",
+ "LinkAnimation_BlendToJoint": "PlayerAnimation_BlendToJoint",
+ "LinkAnimation_BlendToMorph": "PlayerAnimation_BlendToMorph",
+ "LinkAnimation_EndLoop": "PlayerAnimation_EndLoop",
+ "LinkAnimation_OnFrame": "PlayerAnimation_OnFrame",
+
"SkelAnime_InitSV": "SkelAnime_InitFlex",
- "func_80136C84": "SkelAnime_SetUpdate",
"SkelAnime_FrameUpdateMatrix": "SkelAnime_Update",
"func_80136CF4": "SkelAnime_Morph",
"func_80136D98": "SkelAnime_MorphTaper",
- "func_80136F04": "SkelAnime_AnimateFrame",
+
"func_8013702C": "SkelAnime_LoopFull",
"func_801370B0": "SkelAnime_LoopPartial",
"func_8013713C": "SkelAnime_Once",
@@ -278,7 +267,7 @@ wordReplace = {
"func_801376DC": "SkelAnime_CopyFrameTableFalse",
"func_80137748": "SkelAnime_UpdateTranslation",
"func_801378B8": "Animation_OnFrame",
- "SkelAnime_CopyVec3s": "SkelAnime_CopyFrameTable",
+
"Actor_SetObjectSegment": "Actor_SetObjectDependency",
"func_800B3FC0": "ActorShadow_DrawCircle",
"func_800B4024": "ActorShadow_DrawSquare",
@@ -339,8 +328,12 @@ wordReplace = {
"func_800B86C8": "Actor_ChangeFocus",
"func_800DF840": "Camera_ChangeMode",
"func_800B90F4": "Actor_DeactivateLens",
- "func_800BC770": "Actor_AddQuake",
+ "Actor_AddQuake": "Actor_RequestQuake",
+ "func_800BC770": "Actor_RequestQuake",
+ "Actor_AddQuakeWithSpeed": "Actor_RequestQuakeWithSpeed",
+ "func_800BC848": "Actor_RequestQuakeAndRumble",
"func_800DF840": "Camera_ChangeMode",
+ "Camera_SetToTrackActor": "Camera_SetFocalActor",
"zelda_malloc": "ZeldaArena_Malloc",
"zelda_mallocR": "ZeldaArena_MallocR",
"zelda_realloc": "ZeldaArena_Realloc",
@@ -450,20 +443,49 @@ wordReplace = {
"BgCheck_AddActorMesh": "DynaPoly_SetBgActor",
"BgCheck_GetActorOfMesh": "DynaPoly_GetActor",
"BgCheck_RemoveActorMesh": "DynaPoly_DeleteBgActor",
- "BgCheck_AddActorMeshToLists": "DynaPoly_ExpandSRT",
- "BgCheck_Update": "DynaPoly_Setup",
+ "BgCheck_AddActorMeshToLists": "DynaPoly_AddBgActorToLookup",
+ "BgCheck_Update": "DynaPoly_UpdateContext",
"BgCheck_UpdateAllActorMeshes": "DynaPoly_UpdateBgActorTransforms",
"BgCheck_RelocateMeshHeaderPointers": "CollisionHeader_SegmentedToVirtual",
"BgCheck_RelocateMeshHeader": "CollisionHeader_GetVirtual",
"BgCheck_RelocateAllMeshHeaders": "BgCheck_InitCollisionHeaders",
"BgCheck_GetPolygonAttributes": "SurfaceType_GetData",
+ "DynaPolyActor_ResetState": "DynaPolyActor_UnsetAllInteractFlags",
+ "DynaPolyActor_SetRidingFallingState": "DynaPolyActor_SetActorOnTop",
+ "DynaPolyActor_SetRidingMovingState": "DynaPolyActor_SetPlayerOnTop",
+ "DynaPolyActor_SetRidingMovingStateByIndex": "DynaPoly_SetPlayerOnTop",
+ "DynaPolyActor_SetRidingRotatingState": "DynaPolyActor_SetPlayerAbove",
+ "DynaPolyActor_SetRidingRotatingStateByIndex": "DynaPoly_SetPlayerAbove",
+ "DynaPolyActor_SetSwitchPressedState": "DynaPolyActor_SetActorOnSwitch",
+ "DynaPolyActor_SetHeavySwitchPressedState": "DynaPolyActor_SetActorOnHeavySwitch",
+ "DynaPolyActor_IsInRidingFallingState": "DynaPolyActor_IsActorOnTop",
+ "DynaPolyActor_IsInRidingMovingState": "DynaPolyActor_IsPlayerOnTop",
+ "DynaPolyActor_IsInRidingRotatingState": "DynaPolyActor_IsPlayerAbove",
+ "DynaPolyActor_IsInSwitchPressedState": "DynaPolyActor_IsSwitchPressed",
+ "DynaPolyActor_IsInHeavySwitchPressedState": "DynaPolyActor_IsHeavySwitchPressed",
+ "func_800C62BC": "DynaPoly_DisableCollision",
+ "func_800C6314": "DynaPoly_EnableCollision",
+ "func_800C636C": "DynaPoly_DisableCeilingCollision",
+ "func_800C63C4": "DynaPoly_EnableCeilingCollision",
+ "func_800C641C": "DynaPoly_DisableFloorCollision",
+ "func_800C6474": "DynaPoly_EnableFloorCollision",
"SurfaceType_GetConveyorType": "SurfaceType_IsFloorConveyor",
"func_800C9704": "SurfaceType_GetBgCamIndex",
"func_800C9924": "BgCheck_GetBgCamFuncData",
"func_800C99AC": "SurfaceType_GetSceneExitIndex",
+ "func_800C99D4": "SurfaceType_GetFloorType",
+ "func_800C9A24": "SurfaceType_GetWallType",
+ "func_800C9A4C": "SurfaceType_GetWallFlags",
+ "func_800C9A7C": "SurfaceType_CheckWallFlag0",
+ "func_800C9AB0": "SurfaceType_CheckWallFlag1",
+ "func_800C9AE4": "SurfaceType_CheckWallFlag2",
+ "func_800C9B18": "SurfaceType_GetFloorProperty2",
+ "func_800C9B40": "SurfaceType_GetFloorProperty",
+ "func_800C9BB8": "SurfaceType_GetMaterial",
"func_800C9B90": "SurfaceType_IsHorseBlocked",
- "func_800C9BDC": "SurfaceType_GetSfx",
- "func_800C9C74": "SurfaceType_GetSlope",
+ "func_800C9BDC": "SurfaceType_GetSfxOffset",
+ "SurfaceType_GetSfx": "SurfaceType_GetSfxOffset",
+ "func_800C9C74": "SurfaceType_GetFloorEffect",
"func_800C9C9C": "SurfaceType_GetLightSettingIndex",
"func_800C9CC4": "SurfaceType_GetEcho",
"func_800C9CEC": "SurfaceType_IsHookshotSurface",
@@ -503,13 +525,13 @@ wordReplace = {
"func_8017F9C0": "Math3D_XZInSphere",
"func_8017FA34": "Math3D_XYInSphere",
"func_8017FAA8": "Math3D_YZInSphere",
- "func_800DFB14": "Camera_ChangeDataIdx",
+ "func_800DFB14": "Camera_ChangeActorCsCamIndex",
"func_800DFC68": "Camera_GetInputDirYaw",
"func_800DFCB4": "Camera_GetCamDirPitch",
"func_800DFCDC": "Camera_GetCamDirYaw",
"func_800E0308": "Camera_SetTargetActor",
"func_800E031C": "Camera_GetWaterYPos",
- "func_800E02AC": "Camera_SetToTrackActor",
+ "func_800E02AC": "Camera_SetFocalActor",
"func_800DFAC8": "Camera_ChangeSetting",
"func_800DFC90": "Camera_GetCamDir",
"func_800DFD04": "Camera_AddQuake",
@@ -583,29 +605,63 @@ wordReplace = {
"func_800FE498": "Environment_StartTime",
"func_800FE4A8": "Environment_IsTimeStopped",
"func_800F5A8C": "Environment_LerpWeight",
+
"func_801A3F54": "Audio_SetCutsceneFlag",
- "func_800EA0D4": "Cutscene_Start",
- "func_800EA0EC": "Cutscene_End",
+ "func_800EA0D4": "Cutscene_StartManual",
+ "Cutscene_Start": "Cutscene_StartManual",
+ "func_800EA0EC": "Cutscene_StopManual",
+ "Cutscene_End": "Cutscene_StopManual",
"func_800EDE34": "Cutscene_ActorTranslate",
"func_800EDF24": "Cutscene_ActorTranslateAndYaw",
"func_800EDF78": "Cutscene_ActorTranslateAndYawSmooth",
"func_800EE0CC": "Cutscene_ActorTranslateXZAndYawSmooth",
"func_800EE1D8": "Cutscene_GetSceneLayer",
- "func_800EE200": "Cutscene_GetActorActionIndex",
- "func_800EE29C": "Cutscene_CheckActorAction",
+ "func_800EE200": "Cutscene_GetCueChannel",
+ "Cutscene_GetActorActionIndex": "Cutscene_GetCueChannel",
+ "func_800EE29C": "Cutscene_IsCueInChannel",
+ "Cutscene_CheckActorAction": "Cutscene_IsCueInChannel",
"func_800EE2F4": "Cutscene_IsPlaying",
"Cutscene_GetSceneSetupIndex": "Cutscene_GetSceneLayer",
+
+ "func_800F15D8": "CutsceneManager_StoreCamera",
+ "ActorCutscene_SetIntentToPlay": "CutsceneManager_Queue",
+ "ActorCutscene_GetCanPlayNext": "CutsceneManager_IsNext",
+ "ActorCutscene_StartAndSetUnkLinkFields": "CutsceneManager_StartWithPlayerCs",
+ "ActorCutscene_StartAndSetFlag": "CutsceneManager_StartWithPlayerCsAndSetFlag",
+ "ActorCutscene_Start": "CutsceneManager_Start",
+ "ActorCutscene_Stop": "CutsceneManager_Stop",
+ "ActorCutscene_GetCurrentIndex": "CutsceneManager_GetCurrentCsId",
+ "ActorCutscene_GetCutscene": "CutsceneManager_GetCutsceneEntry",
+ "ActorCutscene_GetAdditionalCutscene": "CutsceneManager_GetAdditionalCsId",
+ "ActorCutscene_GetLength": "CutsceneManager_GetLength",
+ "ActorCutscene_GetCurrentSubCamId": "CutsceneManager_GetCurrentSubCamId",
+ "ActorCutscene_GetCurrentCamera": "CutsceneManager_GetCurrentSubCamId",
+
+ "EnvFlags_UnsetAll": "CutsceneFlags_UnsetAll",
+ "EnvFlags_Set": "CutsceneFlags_Set",
+ "EnvFlags_Unset": "CutsceneFlags_Unset",
+ "EnvFlags_Get": "CutsceneFlags_Get",
+
"func_801343C0": "SkelAnime_DrawTransformFlexOpa",
- "func_80134148": "SkelAnime_DrawTransformFlexLimbOpa",
"func_80114E90": "Inventory_HasEmptyBottle",
"func_80114F2C": "Inventory_HasItemInBottle",
"func_80123C90": "Player_SetEquipmentData",
- "Quake2_ClearType": "Distortion_ClearType",
- "Quake2_SetType": "Distortion_SetType",
- "Quake2_SetCountdown": "Distortion_SetCountdown",
+ "Quake2_SetType": "Distortion_Request",
+ "Distortion_SetType": "Distortion_Request",
+ "Quake2_SetCountdown": "Distortion_SetDuration",
+ "Distortion_SetCountdown": "Distortion_SetDuration",
+ "Distortion_GetCountdown": "Distortion_GetTimeLeft",
+ "Quake2_ClearType": "Distortion_RemoveRequest",
+ "Distortion_ClearType": "Distortion_RemoveRequest",
"func_800BE680": "Actor_DrawDamageEffects",
"func_8012F22C": "Inventory_GetSkullTokenCount",
- "Quake_RemoveFromIdx": "Quake_Remove",
+ "Quake_Add": "Quake_Request",
+ "Quake_SetQuakeValues": "Quake_SetPerturbations",
+ "Quake_SetCountdown": "Quake_SetDuration",
+ "Quake_GetCountdown": "Quake_GetTimeLeft",
+ "Quake_NumActiveQuakes": "Quake_GetNumActiveQuakes",
+ "Quake_RemoveFromIdx": "Quake_RemoveRequest",
+ "OLib_DbCameraVec3fSum":"OLib_Vec3fAdd",
"func_8013AB00": "SubS_DrawTransformFlex",
"func_8013A860": "SubS_DrawTransformFlexLimb",
@@ -616,7 +672,8 @@ wordReplace = {
"func_8013E640": "SubS_FindActorCustom",
"func_ActorCategoryIterateById": "SubS_FindActor",
"func_8013BB7C": "SubS_FindNearestActor",
- "func_8013E2D4": "SubS_StartActorCutscene",
+ "func_8013E2D4": "SubS_StartCutscene",
+ "SubS_StartActorCutscene": "SubS_StartCutscene",
"func_8013E3B8": "SubS_FillCutscenesList",
"func_8013AED4": "SubS_UpdateFlags",
"func_8013D8DC": "SubS_IsObjectLoaded",
@@ -656,6 +713,7 @@ wordReplace = {
"func_80158FB0": "Message_LoadTimeNES",
"func_8015926C": "Message_LoadOwlWarpTextNES",
"func_8015E750": "Message_FindCreditsMessage",
+ "func_80151BB4": "Message_BombersNotebookQueueEvent",
"func_80133038": "Schedule_RunScript",
"EffectSsKiraKira_SpawnSmallYellow": "EffectSsKirakira_SpawnSmallYellow",
@@ -687,13 +745,103 @@ wordReplace = {
"func_8010A54C": "Minimap_Draw",
"func_8010A580": "Map_Update",
- "ActorCutscene_GetCurrentCamera": "ActorCutscene_GetCurrentSubCamId",
-
"Entrance_CreateIndex": "Entrance_Create",
"Entrance_CreateIndexFromSpawn": "Entrance_CreateFromSpawn",
"func_80102544": "LightContext_SetFog",
+ "func_800F3A64": "Horse_IsValidSpawn",
+ "func_800F3B2C": "Horse_ResetHorseData",
+ "func_800F40A0": "Horse_Spawn",
+ "func_800F415C": "Horse_RotateToPoint",
+ "func_800F41E4": "Horse_IsActive",
+
+ "Padmgr_GetControllerBitmask": "PadMgr_GetValidControllersMask",
+ "func_80174F24": "PadMgr_SetRumbleRetraceCallback",
+ "func_80174F44": "PadMgr_UnsetRumbleRetraceCallback",
+ "func_80174F7C": "PadMgr_SetInputRetraceCallback",
+ "func_80174F9C": "PadMgr_UnsetInputRetraceCallback",
+ "Padmgr_GetEventCallback": "PadMgr_AcquireSerialEventQueue",
+ "func_80175008": "PadMgr_VoiceAcquireSerialEventQueue",
+ "Padmgr_SetEventCallback": "PadMgr_ReleaseSerialEventQueue",
+ "func_8017506C": "PadMgr_VoiceReleaseSerialEventQueue",
+ "Padmgr_Lock": "PadMgr_LockPadData",
+ "Padmgr_Unlock": "PadMgr_UnlockPadData",
+ "func_801750FC": "PadMgr_UpdateRumble",
+ "func_80175364": "PadMgr_RumbleStop",
+ "func_80175434": "PadMgr_RumblePause",
+ "func_8017544C": "PadMgr_RumbleSetSingle",
+ "Padmgr_ParseState": "PadMgr_UpdateInputs",
+ "func_801759BC": "PadMgr_InitVoice",
+ "func_80175AE0": "PadMgr_UpdateConnections",
+ "Padmgr_Update": "PadMgr_HandleRetrace",
+ "Padmgr_Stop": "PadMgr_HandlePreNMI",
+ "func_80175E68": "PadMgr_GetInputNoLock",
+
+ "Gfx_CallSetupDL": "Gfx_SetupDL",
+ "func_8012BFC4": "Gfx_SetupDL57",
+ "func_8012BFEC": "Gfx_SetupDL57_b",
+ "func_8012C014": "Gfx_SetupDL52_NoCD",
+ "func_8012C058": "Gfx_SetupDL58_Opa",
+ "func_8012C080": "Gfx_SetupDL57_Opa",
+ "func_8012C0A8": "Gfx_SetupDL50_Opa",
+ "func_8012C0D0": "Gfx_SetupDL51_Opa",
+ "func_8012C0F8": "Gfx_SetupDL52_Xlu",
+ "func_8012C120": "Gfx_SetupDL53_Opa",
+ "func_8012C148": "Gfx_SetupDL54_Opa",
+ "func_8012C170": "Gfx_SetupDL55_Xlu",
+ "func_8012C198": "Gfx_SetupDL26",
+ "func_8012C1C0": "Gfx_SetupDL26_Opa",
+ "func_8012C1EC": "Gfx_SetupDL23",
+ "func_8012C214": "Gfx_SetupDL23_Opa",
+ "func_8012C240": "Gfx_SetupDL25_Xlu2",
+ "func_8012C28C": "Gfx_SetupDL25_Opa",
+ "func_8012C2B4": "Gfx_SetupDL71",
+ "func_8012C2DC": "Gfx_SetupDL25_Xlu",
+ "func_8012C304": "Gfx_SetupDL72",
+ "func_8012C32C": "Gfx_SetupDL31_Opa",
+ "func_8012C354": "Gfx_SetupDL32_Opa",
+ "func_8012C37C": "Gfx_SetupDL33_Opa",
+ "func_8012C3A4": "Gfx_SetupDL64",
+ "func_8012C3CC": "Gfx_SetupDL34",
+ "func_8012C3F4": "Gfx_SetupDL34_Opa",
+ "func_8012C420": "Gfx_SetupDL35_Opa",
+ "func_8012C448": "Gfx_SetupDL44_Xlu",
+ "func_8012C470": "Gfx_SetupDL36_Opa",
+ "func_8012C498": "Gfx_SetupDL28",
+ "func_8012C4C0": "Gfx_SetupDL28_Opa",
+ "func_8012C4E8": "Gfx_SetupDL43_Opa",
+ "func_8012C510": "Gfx_SetupDL45_Opa",
+ "func_8012C538": "Gfx_SetupDL46_Overlay",
+ "func_8012C560": "Gfx_SetupDL38_Xlu",
+ "func_8012C588": "Gfx_SetupDL4_Xlu",
+ "func_8012C5B0": "Gfx_SetupDL37_Opa",
+ "func_8012C5D8": "Gfx_SetupDL2_Opa",
+ "func_8012C600": "Gfx_SetupDL39",
+ "func_8012C628": "Gfx_SetupDL39_Opa",
+ "func_8012C654": "Gfx_SetupDL39_Overlay",
+ "func_8012C680": "Gfx_SetupDL39_Ptr",
+ "func_8012C6AC": "Gfx_SetupDL40_Opa",
+ "func_8012C6D4": "Gfx_SetupDL41_Opa",
+ "func_8012C6FC": "Gfx_SetupDL47_Xlu",
+ "func_8012C724": "Gfx_SetupDL66",
+ "func_8012C74C": "Gfx_SetupDL67",
+ "func_8012C774": "Gfx_SetupDL68_NoCD",
+ "func_8012C7B8": "Gfx_SetupDL69_NoCD",
+ "func_8012C7FC": "Gfx_SetupDL65_NoCD",
+ "func_8012C840": "Gfx_SetupDL70",
+ "func_8012C868": "Gfx_SetupDL20_NoCD",
+ "func_8012C8AC": "Gfx_SetupDL42_Opa",
+ "func_8012C8D4": "Gfx_SetupDL42_Overlay",
+ "func_8012C8FC": "Gfx_SetupDL48_Opa",
+ "func_8012C924": "Gfx_SetupDL49_Xlu",
+ "func_8012C94C": "Gfx_SetupDL27_Xlu",
+ "func_8012C974": "Gfx_SetupDL60_XluNoCD",
+ "func_8012C9BC": "Gfx_SetupDL61_Xlu",
+ "func_8012C9E4": "Gfx_SetupDL56_Opa",
+ "func_8012CA0C": "Gfx_SetupDL56_Ptr",
+ "func_8012CA38": "Gfx_SetupDL59_Opa",
+
# Structs
"ActorAnimationEntry": "AnimationInfo",
"ActorAnimationEntryS": "AnimationInfoS",
@@ -702,6 +850,7 @@ wordReplace = {
"globalCtx": "play",
"globalCtx2": "play2",
"ScheduleResult": "ScheduleOutput",
+ "LinkAnimationHeader": "PlayerAnimationHeader",
# Struct members
"skelAnime.unk03": "skelAnime.taper",
@@ -724,6 +873,7 @@ wordReplace = {
"actor.minVelocityY": "actor.terminalVelocity",
"actor.yDistToWater": "actor.depthInWater",
"actor.yDistToPlayer": "actor.playerHeightRel",
+ "actor.cutscene": "actor.csId",
"actor.speedXZ": "actor.speed",
"thisx->speedXZ": "thisx->speed",
@@ -732,41 +882,42 @@ wordReplace = {
"gSaveContext.unk_3F22": "gSaveContext.hudVisibility",
"gSaveContext.unk_3F24": "gSaveContext.hudVisibilityTimer",
"gSaveContext.unk_3F26": "gSaveContext.prevHudVisibility",
- "gSaveContext.weekEventReg": "gSaveContext.save.weekEventReg",
+ "gSaveContext.weekEventReg": "gSaveContext.save.saveInfo.weekEventReg",
"gSaveContext.playerForm": "gSaveContext.save.playerForm",
"gSaveContext.day": "gSaveContext.save.day",
"gSaveContext.isNight": "gSaveContext.save.isNight",
"gSaveContext.environmentTime": "gSaveContext.skyboxTime",
- "gSaveContext.naviTimer": "gSaveContext.save.playerData.tatlTimer",
- "gSaveContext.tatlTimer": "gSaveContext.save.playerData.tatlTimer",
- "gSaveContext.rupees": "gSaveContext.save.playerData.rupees",
- "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",
+ "gSaveContext.naviTimer": "gSaveContext.save.saveInfo.playerData.tatlTimer",
+ "gSaveContext.tatlTimer": "gSaveContext.save.saveInfo.playerData.tatlTimer",
+ "gSaveContext.rupees": "gSaveContext.save.saveInfo.playerData.rupees",
+ "gSaveContext.magicAcquired": "gSaveContext.save.saveInfo.playerData.isMagicAcquired",
+ "gSaveContext.doubleMagic": "gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired",
+ "gSaveContext.doubleDefense": "gSaveContext.save.saveInfo.playerData.doubleDefense",
+ "gSaveContext.playerName": "gSaveContext.save.saveInfo.playerData.playerName",
+ "gSaveContext.inventory": "gSaveContext.save.saveInfo.inventory",
"gSaveContext.equippedMask": "gSaveContext.save.equippedMask",
"gSaveContext.entranceIndex": "gSaveContext.save.entrance",
"gSaveContext.time": "gSaveContext.save.time",
"gSaveContext.save.daySpeed": "gSaveContext.save.timeSpeedOffset",
"gSaveContext.unk_14": "gSaveContext.save.timeSpeedOffset",
- "gSaveContext.unk_FE6": "gSaveContext.save.bombersCaughtNum",
- "gSaveContext.unk_FE7": "gSaveContext.save.bombersCaughtOrder",
+ "gSaveContext.unk_FE6": "gSaveContext.save.saveInfo.bombersCaughtNum",
+ "gSaveContext.unk_FE7": "gSaveContext.save.saveInfo.bombersCaughtOrder",
"gSaveContext.linkAge": "gSaveContext.save.linkAge",
- "gSaveContext.dekuPlaygroundHighScores": "gSaveContext.save.dekuPlaygroundHighScores",
- "gSaveContext.lotteryCodeGuess": "gSaveContext.save.lotteryCodeGuess",
- "gSaveContext.permanentSceneFlags": "gSaveContext.save.permanentSceneFlags",
- "gSaveContext.bomberCode": "gSaveContext.save.bomberCode",
- "gSaveContext.skullTokenCount": "gSaveContext.save.skullTokenCount",
- "gSaveContext.cutscene": "gSaveContext.save.cutscene",
- "gSaveContext.health": "gSaveContext.save.playerData.health",
- "gSaveContext.equips": "gSaveContext.save.equips",
+ "gSaveContext.dekuPlaygroundHighScores": "gSaveContext.save.saveInfo.dekuPlaygroundHighScores",
+ "gSaveContext.lotteryCodeGuess": "gSaveContext.save.saveInfo.lotteryCodeGuess",
+ "gSaveContext.permanentSceneFlags": "gSaveContext.save.saveInfo.permanentSceneFlags",
+ "gSaveContext.bomberCode": "gSaveContext.save.saveInfo.bomberCode",
+ "gSaveContext.skullTokenCount": "gSaveContext.save.saveInfo.skullTokenCount",
+ "gSaveContext.cutscene": "gSaveContext.save.cutsceneIndex",
+ "gSaveContext.save.cutscene": "gSaveContext.save.cutsceneIndex",
+ "gSaveContext.health": "gSaveContext.save.saveInfo.playerData.health",
+ "gSaveContext.equips": "gSaveContext.save.saveInfo.equips",
"gSaveContext.unk_1016": "gSaveContext.jinxTimer",
"gSaveContext.unk_3F58": "gSaveContext.sunsSongState",
"gSaveContext.equips.buttonItems": "gSaveContext.save.equips.buttonItems",
"gSaveContext.unk_48C8": "gSaveContext.dungeonIndex",
- "gSaveContext.save.playerData.magicAcquired": "gSaveContext.save.playerData.isMagicAcquired",
- "gSaveContext.save.playerDatadoubleMagic": "gSaveContext.save.playerData.isDoubleMagicAcquired",
+ "gSaveContext.save.saveInfo.playerData.magicAcquired": "gSaveContext.save.saveInfo.playerData.isMagicAcquired",
+ "gSaveContext.save.playerData.doubleMagic": "gSaveContext.save.saveInfo.playerData.isDoubleMagicAcquired",
"gSaveContext.unk_3F28": "gSaveContext.magicState",
"gSaveContext.unk_3F30": "gSaveContext.magicFillTarget",
"gSaveContext.unk_3F2C": "gSaveContext.magicFlag",
@@ -776,6 +927,44 @@ wordReplace = {
"gSaveContext.nightSeqIndex": "gSaveContext.ambienceId",
"gSaveContext.minigameState": "gSaveContext.minigameStatus",
"gSaveContext.unk_3F3C": "gSaveContext.minigameHiddenScore",
+ "gSaveContext.save.playerData": "gSaveContext.save.saveInfo.playerData",
+ "gSaveContext.save.equips": "gSaveContext.save.saveInfo.equips",
+ "gSaveContext.save.inventory": "gSaveContext.save.saveInfo.inventory",
+ "gSaveContext.save.permanentSceneFlags": "gSaveContext.save.saveInfo.permanentSceneFlags",
+
+ "gSaveContext.save.unk_E18": "gSaveContext.save.saveInfo.unk_E5C",
+ "gSaveContext.save.dekuPlaygroundHighScores": "gSaveContext.save.saveInfo.dekuPlaygroundHighScores",
+ "gSaveContext.save.pictoFlags0": "gSaveContext.save.saveInfo.pictoFlags0",
+ "gSaveContext.save.pictoFlags1": "gSaveContext.save.saveInfo.pictoFlags1",
+ "gSaveContext.save.unk_E84": "gSaveContext.save.saveInfo.unk_E60",
+ "gSaveContext.save.unk_E88": "gSaveContext.save.saveInfo.unk_E64",
+ "gSaveContext.save.scenesVisible": "gSaveContext.save.saveInfo.scenesVisible",
+ "gSaveContext.save.skullTokenCount": "gSaveContext.save.saveInfo.skullTokenCount",
+ "gSaveContext.save.unk_EC4": "gSaveContext.save.saveInfo.unk_EA0",
+ "gSaveContext.save.unk_EC8": "gSaveContext.save.saveInfo.unk_EA4",
+ "gSaveContext.save.unk_ECC": "gSaveContext.save.saveInfo.unk_EA8",
+ "gSaveContext.save.stolenItems": "gSaveContext.save.saveInfo.stolenItems",
+ "gSaveContext.save.unk_DD8": "gSaveContext.save.saveInfo.unk_EB4",
+ "gSaveContext.save.bankRupees": "gSaveContext.save.saveInfo.bankRupees",
+ "gSaveContext.save.unk_EE0": "gSaveContext.save.saveInfo.unk_EBC",
+ "gSaveContext.save.unk_EE4": "gSaveContext.save.saveInfo.unk_EC0",
+ "gSaveContext.save.unk_EE8": "gSaveContext.save.saveInfo.unk_EC4",
+ "gSaveContext.save.horseBackBalloonHighScore": "gSaveContext.save.saveInfo.horseBackBalloonHighScore",
+ "gSaveContext.save.lotteryCodeGuess": "gSaveContext.save.saveInfo.lotteryCodeGuess",
+ "gSaveContext.save.shootingGalleryHighScores": "gSaveContext.save.saveInfo.shootingGalleryHighScores",
+ "gSaveContext.save.weekEventReg": "gSaveContext.save.saveInfo.weekEventReg",
+ "gSaveContext.save.regionsVisited": "gSaveContext.save.saveInfo.regionsVisited",
+ "gSaveContext.save.worldMapCloudVisibility": "gSaveContext.save.saveInfo.worldMapCloudVisibility",
+ "gSaveContext.save.unk_F64": "gSaveContext.save.saveInfo.unk_F40",
+ "gSaveContext.save.unk_F65": "gSaveContext.save.saveInfo.unk_F41",
+ "gSaveContext.save.scarecrowSpawnSong": "gSaveContext.save.saveInfo.scarecrowSpawnSong",
+ "gSaveContext.save.bombersCaughtNum": "gSaveContext.save.saveInfo.bombersCaughtNum",
+ "gSaveContext.save.bombersCaughtOrder": "gSaveContext.save.saveInfo.bombersCaughtOrder",
+ "gSaveContext.save.lotteryCodes": "gSaveContext.save.saveInfo.lotteryCodes",
+ "gSaveContext.save.spiderHouseMaskOrder": "gSaveContext.save.saveInfo.spiderHouseMaskOrder",
+ "gSaveContext.save.bomberCode": "gSaveContext.save.saveInfo.bomberCode",
+ "gSaveContext.save.horseData": "gSaveContext.save.saveInfo.horseData",
+ "gSaveContext.save.checksum": "gSaveContext.save.saveInfo.checksum",
"player->unk_A87": "player->exchangeItemId",
"player->leftHandActor": "player->heldActor",
@@ -792,19 +981,38 @@ wordReplace = {
"player->swordInfo": "player->meleeWeaponInfo",
"player->itemActionParam": "player->heldItemAction",
"player->heldItemActionParam": "player->itemAction",
+ "player->unk_A86": "player->currentActorCsIndex",
"player->unk_A9C": "player->secretRumbleCharge",
"player->unk_AA0": "player->closestSecretDistSq",
+ "player->unk_AAC": "player->headLimbRot",
+ "player->unk_AB2": "player->upperLimbRot",
+ "player->unk_B2A": "player->getItemDrawIdPlusOne",
+ "player->getItemDrawId": "player->getItemDrawIdPlusOne",
"player->unk_B68": "player->fallStartHeight",
"player->unk_B6A": "player->fallDistance",
+ "player->unk_B80": "player->pushedSpeed",
+ "player->unk_B84": "player->pushedYaw",
"player->targetActor": "player->talkActor",
"player->targetActorDistance": "player->talkActorDistance",
"player->unk_730": "player->targetedActor",
- "player->ageProperties->unk_92": "player->ageProperties->voiceSfxIdOffset",
- "player->ageProperties->unk_94": "player->ageProperties->surfaceSfxIdOffset",
- "csCtx.npcActions": "csCtx.actorActions",
- "csCtx->npcActions": "csCtx->actorActions",
- "csCtx.unk_12": "csCtx.currentCsIndex",
+ "ageProperties->unk_04": "ageProperties->shadowScale",
+ "ageProperties->unk_92": "ageProperties->voiceSfxOffset",
+ "ageProperties->unk_94": "ageProperties->surfaceSfxOffset",
+ "player->unk_A86": "player->csId",
+
+ "csCtx.npcActions": "csCtx.actorCues",
+ "csCtx->npcActions": "csCtx->actorCues",
+ "csCtx.actorActions": "csCtx.actorCues",
+ "csCtx->actorActions": "csCtx->actorCues",
+ "csCtx.playerAction": "csCtx.playerCue",
+ "csCtx->playerAction": "csCtx->playerCue",
+ "csCtx.unk_12": "csCtx.scriptIndex",
+ "csCtx.currentCsIndex": "csCtx.scriptIndex",
+ "csCtx->currentCsIndex": "csCtx->scriptIndex",
+ "csCtx.frames": "csCtx.curFrame",
+ "csCtx->frames": "csCtx->curFrame",
+
"globalCtx->mf_187FC": "play->billboardMtxF",
"globalCtx->projectionMatrix": "play->viewProjectionMtxF",
"globalCtx->actorCtx.actorList[": "play->actorCtx.actorLists[",
@@ -836,15 +1044,24 @@ wordReplace = {
"play->nextEntranceIndex": "play->nextEntrance",
"play->sceneNum": "play->sceneId",
"play->pauseCtx.unk_1F0": "play->pauseCtx.bombersNotebookOpen",
+ "play->sceneLoadFlag": "play->transitionTrigger",
+ "play->unk_18B4A": "play->transitionMode",
+ "play->unk_1887F": "play->transitionType",
+ "play->playerActorCsIds": "play->playerCsIds",
+ "play->envFlags": "play->cutsceneFlags",
"play->roomCtx.curRoom.unk3": "play->roomCtx.curRoom.behaviorType1",
"play->roomCtx.curRoom.unk2": "play->roomCtx.curRoom.behaviorType2",
"play->roomCtx.unk31": "play->roomCtx.status",
"actorCtx.unkC": "actorCtx.halfDaysBit",
- "actorCtx.unk1F4": "actorCtx.unk_1F4.unk_00",
- "actorCtx.unk1F5": "actorCtx.unk_1F4.timer",
- "actorCtx.unk1F8": "actorCtx.unk_1F4.unk_04",
- "actorCtx.unk1FC": "actorCtx.unk_1F4.unk_08",
+ "actorCtx.unk1F4": "actorCtx.playerImpact.type",
+ "actorCtx.unk1F5": "actorCtx.playerImpact.timer",
+ "actorCtx.unk1F8": "actorCtx.playerImpact.dist",
+ "actorCtx.unk1FC": "actorCtx.playerImpact.pos",
+ "actorCtx.unk_1F4.unk_00": "actorCtx.playerImpact.type",
+ "actorCtx.unk_1F4.timer": "actorCtx.playerImpact.timer",
+ "actorCtx.unk_1F4.unk_04": "actorCtx.playerImpact.dist",
+ "actorCtx.unk_1F4.unk_08": "actorCtx.playerImpact.pos",
"gSaveContext.unk_3DC8": "gSaveContext.timerOsTime",
"gSaveContext.unk_3DD0": "gSaveContext.timerStates",
@@ -854,19 +1071,22 @@ wordReplace = {
"gSaveContext.unk_3E50": "gSaveContext.timerStartOsTimes",
"gSaveContext.unk_3E88": "gSaveContext.timerStopTimes",
"gSaveContext.unk_3EC0": "gSaveContext.timerPausedOsTimes",
-
- "play->sceneLoadFlag": "play->transitionTrigger",
- "play->unk_18B4A": "play->transitionMode",
- "play->unk_1887F": "play->transitionType",
"gSaveContext.nextTransition": "gSaveContext.nextTransitionType",
"gSaveContext.unk_3F48": "gSaveContext.cutsceneTransitionControl",
"gSaveContext.fadeDuration": "gSaveContext.transFadeDuration",
"gSaveContext.fadeSpeed": "gSaveContext.transWipeSpeed",
+ "path->unk1": "path->additionalPathIndex",
+ "path->unk2": "path->customValue",
+
"D_801D15B0": "gZeroVec3f",
"D_801D15BC": "gZeroVec3s",
"D_801D1DE0": "gIdentityMtx",
"D_801D1E20": "gIdentityMtxF",
+ "sSetupDL": "gSetupDLs",
+
+ "D_801BDA9C": "gHorseIsMounted",
+ "D_801BDAA4": "gHorsePlayedEponasSong",
# Macros
"CUR_EQUIP_VALUE_VOID": "GET_CUR_EQUIP_VALUE",
@@ -874,6 +1094,10 @@ wordReplace = {
"ICHAIN_F32_DIV1000(minVelocityY,": "ICHAIN_F32_DIV1000(terminalVelocity,",
"ICHAIN_F32(minVelocityY,": "ICHAIN_F32(terminalVelocity,",
+ "RADF_TO_BINANG": "RAD_TO_BINANG",
+ "RADF_TO_DEGF": "RAD_TO_DEG",
+ "DEGF_TO_RADF": "DEG_TO_RAD",
+
"ACTORCTX_FLAG_2": "ACTORCTX_FLAG_PICTO_BOX_ON",
"ACTOR_FLAG_100": "ACTOR_FLAG_TALK_REQUESTED",
@@ -894,6 +1118,12 @@ wordReplace = {
"EXCH_ITEM_LETTER_MAMA": "PLAYER_IA_LETTER_MAMA",
"ITEM_FISHING_POLE": "ITEM_FISHING_ROD",
"PLAYER_AP_FISHING_POLE": "PLAYER_IA_FISHING_ROD",
+ "PLAYER_IA_BOTTLE": "PLAYER_IA_BOTTLE_EMPTY",
+
+ "WEEKEVENTREG_20_02": "WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE",
+ "WEEKEVENTREG_33_80": "WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE",
+ "WEEKEVENTREG_52_20": "WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE",
+ "WEEKEVENTREG_55_80": "WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE",
# Enums
"TRANS_TYPE_00": "TRANS_TYPE_WIPE",
@@ -919,6 +1149,16 @@ wordReplace = {
"TRANS_TYPE_20": "TRANS_TYPE_FADE_DYNAMIC",
"TRANS_TYPE_21": "TRANS_TYPE_CIRCLE",
"TRANS_TYPE_22": "TRANS_TYPE_WIPE5",
+ "PLAYER_CSMODE_6": "PLAYER_CSMODE_END",
+ "PLAYER_CSMODE_7": "PLAYER_CSMODE_WAIT",
+ "SUBS_CUTSCENE_SET_UNK_LINK_FIELDS": "SUBS_CUTSCENE_WITH_PLAYER",
+ "SUBS_CUTSCENE_SET_FLAG": "SUBS_CUTSCENE_WITH_PLAYER_SET_FLAG",
+
+ "COLPOLY_SURFACE_GROUND": "SURFACE_MATERIAL_DIRT",
+ "COLPOLY_SURFACE_SAND": "SURFACE_MATERIAL_SAND",
+ "COLPOLY_SURFACE_SNOW": "SURFACE_MATERIAL_SNOW",
+ "CS_STATE_0": "CS_STATE_IDLE",
+
# Example of custom behaviour:
# "PLAYER": ("GET_PLAYER(play)", {"ignore": (-1, '"PLAYER"')}), # ignore "PLAYER" in sSoundBankNames
}
diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml
index 5f42d30d6..efa3bc2fe 100644
--- a/tools/permuter_settings.toml
+++ b/tools/permuter_settings.toml
@@ -5,6 +5,8 @@ compiler_type = "ido"
"gs[DS]P.*" = "void"
"gDma.*" = "void"
"G_IM_SIZ_.*" = "int"
+"G_IM_FMT_.*" = "int"
+"G_TX_.*" = "int"
"G_[AC]C.*" = "int"
LOG = "void"
SET_FULLSCREEN_VIEWPORT = "void"
diff --git a/tools/sizes/boot_functions.csv b/tools/sizes/boot_functions.csv
index bbcf6d5de..ecc9eed27 100644
--- a/tools/sizes/boot_functions.csv
+++ b/tools/sizes/boot_functions.csv
@@ -154,48 +154,48 @@ asm/non_matchings/boot/mtxuty-cvt/MtxConv_F2L.s,MtxConv_F2L,0x80086110,0x52
asm/non_matchings/boot/mtxuty-cvt/MtxConv_L2F.s,MtxConv_L2F,0x80086258,0xA
asm/non_matchings/boot/assert/__assert.s,__assert,0x80086280,0xD
asm/non_matchings/boot/assert/func_800862B4.s,func_800862B4,0x800862B4,0xB
-asm/non_matchings/boot/boot_800862E0/SystemArena_MallocMin1.s,SystemArena_MallocMin1,0x800862E0,0xC
-asm/non_matchings/boot/boot_800862E0/SystemArena_FreeNullCheck.s,SystemArena_FreeNullCheck,0x80086310,0xB
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc.s,SystemArena_RunBlockFunc,0x8008633C,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc1.s,SystemArena_RunBlockFunc1,0x800863AC,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc8.s,SystemArena_RunBlockFunc8,0x8008641C,0x34
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunBlockFunc1Reverse.s,SystemArena_RunBlockFunc1Reverse,0x800864EC,0x27
-asm/non_matchings/boot/boot_800862E0/SystemArena_RunInits.s,SystemArena_RunInits,0x80086588,0x1C
-asm/non_matchings/boot/boot_800862E0/SystemArena_Init.s,SystemArena_Init,0x800865F8,0xA
+asm/non_matchings/boot/boot_800862E0/SystemHeap_Malloc.s,SystemHeap_Malloc,0x800862E0,0xC
+asm/non_matchings/boot/boot_800862E0/SystemArena_Free.s,SystemArena_Free,0x80086310,0xB
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc.s,SystemHeap_RunBlockFunc,0x8008633C,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc1.s,SystemHeap_RunBlockFunc1,0x800863AC,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc8.s,SystemHeap_RunBlockFunc8,0x8008641C,0x34
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunBlockFunc1Reverse.s,SystemHeap_RunBlockFunc1Reverse,0x800864EC,0x27
+asm/non_matchings/boot/boot_800862E0/SystemHeap_RunInits.s,SystemHeap_RunInits,0x80086588,0x1C
+asm/non_matchings/boot/boot_800862E0/SystemHeap_Init.s,SystemHeap_Init,0x800865F8,0xA
asm/non_matchings/boot/padsetup/PadSetup_Init.s,PadSetup_Init,0x80086620,0x50
-asm/non_matchings/boot/boot_80086760/func_80086760.s,func_80086760,0x80086760,0xD
-asm/non_matchings/boot/boot_80086760/func_80086794.s,func_80086794,0x80086794,0x8
-asm/non_matchings/boot/boot_80086760/func_800867B4.s,func_800867B4,0x800867B4,0x8
-asm/non_matchings/boot/boot_80086760/func_800867D4.s,func_800867D4,0x800867D4,0x8
-asm/non_matchings/boot/boot_80086760/func_800867F4.s,func_800867F4,0x800867F4,0x8
-asm/non_matchings/boot/boot_80086760/func_80086814.s,func_80086814,0x80086814,0x8
-asm/non_matchings/boot/boot_80086760/func_80086834.s,func_80086834,0x80086834,0x13
-asm/non_matchings/boot/boot_80086760/func_80086880.s,func_80086880,0x80086880,0x49
-asm/non_matchings/boot/boot_80086760/func_800869A4.s,func_800869A4,0x800869A4,0x53
-asm/non_matchings/boot/boot_80086760/func_80086AF0.s,func_80086AF0,0x80086AF0,0x10
-asm/non_matchings/boot/boot_80086760/func_80086B30.s,func_80086B30,0x80086B30,0x3A
-asm/non_matchings/boot/boot_80086760/func_80086C18.s,func_80086C18,0x80086C18,0xC
-asm/non_matchings/boot/boot_80086760/func_80086C48.s,func_80086C48,0x80086C48,0xA
-asm/non_matchings/boot/fp/func_80086C70.s,func_80086C70,0x80086C70,0x3
-asm/non_matchings/boot/fp/func_80086C7C.s,func_80086C7C,0x80086C7C,0x3
-asm/non_matchings/boot/fp/func_80086C88.s,func_80086C88,0x80086C88,0x4
-asm/non_matchings/boot/fp/func_80086C98.s,func_80086C98,0x80086C98,0x4
-asm/non_matchings/boot/fp/func_80086CA8.s,func_80086CA8,0x80086CA8,0x3
-asm/non_matchings/boot/fp/func_80086CB4.s,func_80086CB4,0x80086CB4,0x3
-asm/non_matchings/boot/fp/func_80086CC0.s,func_80086CC0,0x80086CC0,0x4
-asm/non_matchings/boot/fp/func_80086CD0.s,func_80086CD0,0x80086CD0,0x4
-asm/non_matchings/boot/fp/func_80086CE0.s,func_80086CE0,0x80086CE0,0x3
-asm/non_matchings/boot/fp/func_80086CEC.s,func_80086CEC,0x80086CEC,0x3
-asm/non_matchings/boot/fp/func_80086CF8.s,func_80086CF8,0x80086CF8,0x4
-asm/non_matchings/boot/fp/func_80086D08.s,func_80086D08,0x80086D08,0x4
-asm/non_matchings/boot/fp/func_80086D18.s,func_80086D18,0x80086D18,0x3
-asm/non_matchings/boot/fp/func_80086D24.s,func_80086D24,0x80086D24,0x3
-asm/non_matchings/boot/fp/func_80086D30.s,func_80086D30,0x80086D30,0x4
-asm/non_matchings/boot/fp/func_80086D40.s,func_80086D40,0x80086D40,0x4
-asm/non_matchings/boot/fp/func_80086D50.s,func_80086D50,0x80086D50,0x7
-asm/non_matchings/boot/fp/func_80086D6C.s,func_80086D6C,0x80086D6C,0x8
-asm/non_matchings/boot/fp/func_80086D8C.s,func_80086D8C,0x80086D8C,0x8
-asm/non_matchings/boot/fp/func_80086DAC.s,func_80086DAC,0x80086DAC,0x9
+asm/non_matchings/boot/boot_80086760/Math_FTanF.s,Math_FTanF,0x80086760,0xD
+asm/non_matchings/boot/boot_80086760/Math_FFloorF.s,Math_FFloorF,0x80086794,0x8
+asm/non_matchings/boot/boot_80086760/Math_FCeilF.s,Math_FCeilF,0x800867B4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FRoundF.s,Math_FRoundF,0x800867D4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FTruncF.s,Math_FTruncF,0x800867F4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FNearbyIntF.s,Math_FNearbyIntF,0x80086814,0x8
+asm/non_matchings/boot/boot_80086760/Math_FAtanTaylorQF.s,Math_FAtanTaylorQF,0x80086834,0x13
+asm/non_matchings/boot/boot_80086760/Math_FAtanTaylorF.s,Math_FAtanTaylorF,0x80086880,0x49
+asm/non_matchings/boot/boot_80086760/Math_FAtanContFracF.s,Math_FAtanContFracF,0x800869A4,0x53
+asm/non_matchings/boot/boot_80086760/Math_FAtanF.s,Math_FAtanF,0x80086AF0,0x10
+asm/non_matchings/boot/boot_80086760/Math_FAtan2F.s,Math_FAtan2F,0x80086B30,0x3A
+asm/non_matchings/boot/boot_80086760/Math_FAsinF.s,Math_FAsinF,0x80086C18,0xC
+asm/non_matchings/boot/boot_80086760/Math_FAcosF.s,Math_FAcosF,0x80086C48,0xA
+asm/non_matchings/boot/fp/floorf.s,floorf,0x80086C70,0x3
+asm/non_matchings/boot/fp/floor.s,floor,0x80086C7C,0x3
+asm/non_matchings/boot/fp/lfloorf.s,lfloorf,0x80086C88,0x4
+asm/non_matchings/boot/fp/lfloor.s,lfloor,0x80086C98,0x4
+asm/non_matchings/boot/fp/ceilf.s,ceilf,0x80086CA8,0x3
+asm/non_matchings/boot/fp/ceil.s,ceil,0x80086CB4,0x3
+asm/non_matchings/boot/fp/lceilf.s,lceilf,0x80086CC0,0x4
+asm/non_matchings/boot/fp/lceil.s,lceil,0x80086CD0,0x4
+asm/non_matchings/boot/fp/truncf.s,truncf,0x80086CE0,0x3
+asm/non_matchings/boot/fp/trunc.s,trunc,0x80086CEC,0x3
+asm/non_matchings/boot/fp/ltruncf.s,ltruncf,0x80086CF8,0x4
+asm/non_matchings/boot/fp/ltrunc.s,ltrunc,0x80086D08,0x4
+asm/non_matchings/boot/fp/nearbyintf.s,nearbyintf,0x80086D18,0x3
+asm/non_matchings/boot/fp/nearbyint.s,nearbyint,0x80086D24,0x3
+asm/non_matchings/boot/fp/lnearbyintf.s,lnearbyintf,0x80086D30,0x4
+asm/non_matchings/boot/fp/lnearbyint.s,lnearbyint,0x80086D40,0x4
+asm/non_matchings/boot/fp/roundf.s,roundf,0x80086D50,0x7
+asm/non_matchings/boot/fp/round.s,round,0x80086D6C,0x8
+asm/non_matchings/boot/fp/lroundf.s,lroundf,0x80086D8C,0x8
+asm/non_matchings/boot/fp/lround.s,lround,0x80086DAC,0x9
asm/non_matchings/boot/system_malloc/SystemArena_Malloc.s,SystemArena_Malloc,0x80086DD0,0xA
asm/non_matchings/boot/system_malloc/SystemArena_MallocR.s,SystemArena_MallocR,0x80086DF8,0xA
asm/non_matchings/boot/system_malloc/SystemArena_Realloc.s,SystemArena_Realloc,0x80086E20,0xC
@@ -203,7 +203,7 @@ asm/non_matchings/boot/system_malloc/SystemArena_Free.s,SystemArena_Free,0x80086
asm/non_matchings/boot/system_malloc/SystemArena_Calloc.s,SystemArena_Calloc,0x80086E78,0x15
asm/non_matchings/boot/system_malloc/SystemArena_GetSizes.s,SystemArena_GetSizes,0x80086ECC,0xE
asm/non_matchings/boot/system_malloc/SystemArena_CheckArena.s,SystemArena_CheckArena,0x80086F04,0x9
-asm/non_matchings/boot/system_malloc/SystemArena_InitArena.s,SystemArena_InitArena,0x80086F28,0xC
+asm/non_matchings/boot/system_malloc/SystemArena_Init.s,SystemArena_Init,0x80086F28,0xC
asm/non_matchings/boot/system_malloc/SystemArena_Cleanup.s,SystemArena_Cleanup,0x80086F58,0x9
asm/non_matchings/boot/system_malloc/SystemArena_IsInitialized.s,SystemArena_IsInitialized,0x80086F7C,0x9
asm/non_matchings/boot/rand/Rand_Next.s,Rand_Next,0x80086FA0,0xC
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 1d08b2962..80d36de95 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -210,10 +210,10 @@ asm/non_matchings/code/z_actor/TitleCard_InitPlaceName.s,TitleCard_InitPlaceName
asm/non_matchings/code/z_actor/TitleCard_Update.s,TitleCard_Update,0x800B5E68,0x2F
asm/non_matchings/code/z_actor/TitleCard_Draw.s,TitleCard_Draw,0x800B5F24,0x144
asm/non_matchings/code/z_actor/func_800B6434.s,func_800B6434,0x800B6434,0xD
-asm/non_matchings/code/z_actor/func_800B6468.s,func_800B6468,0x800B6468,0x3
-asm/non_matchings/code/z_actor/func_800B6474.s,func_800B6474,0x800B6474,0x6
-asm/non_matchings/code/z_actor/func_800B648C.s,func_800B648C,0x800B648C,0x1C
-asm/non_matchings/code/z_actor/func_800B64FC.s,func_800B64FC,0x800B64FC,0x22
+asm/non_matchings/code/z_actor/Actor_InitPlayerImpact.s,Actor_InitPlayerImpact,0x800B6468,0x3
+asm/non_matchings/code/z_actor/Actor_UpdatePlayerImpact.s,Actor_UpdatePlayerImpact,0x800B6474,0x6
+asm/non_matchings/code/z_actor/Actor_SetPlayerImpact.s,Actor_SetPlayerImpact,0x800B648C,0x1C
+asm/non_matchings/code/z_actor/Actor_GetPlayerImpact.s,Actor_GetPlayerImpact,0x800B64FC,0x22
asm/non_matchings/code/z_actor/func_800B6584.s,func_800B6584,0x800B6584,0x21
asm/non_matchings/code/z_actor/func_800B6608.s,func_800B6608,0x800B6608,0x1E
asm/non_matchings/code/z_actor/func_800B6680.s,func_800B6680,0x800B6680,0x23
@@ -257,7 +257,7 @@ asm/non_matchings/code/z_actor/func_800B715C.s,func_800B715C,0x800B715C,0x5
asm/non_matchings/code/z_actor/Actor_SetCameraHorseSetting.s,Actor_SetCameraHorseSetting,0x800B7170,0x1B
asm/non_matchings/code/z_actor/Actor_MountHorse.s,Actor_MountHorse,0x800B71DC,0x9
asm/non_matchings/code/z_actor/func_800B7200.s,func_800B7200,0x800B7200,0xB
-asm/non_matchings/code/z_actor/func_800B722C.s,func_800B722C,0x800B722C,0x8
+asm/non_matchings/code/z_actor/Actor_SpawnHorse.s,Actor_SpawnHorse,0x800B722C,0x8
asm/non_matchings/code/z_actor/func_800B724C.s,func_800B724C,0x800B724C,0x13
asm/non_matchings/code/z_actor/func_800B7298.s,func_800B7298,0x800B7298,0x12
asm/non_matchings/code/z_actor/func_800B72E0.s,func_800B72E0,0x800B72E0,0x6
@@ -373,9 +373,9 @@ asm/non_matchings/code/z_actor/Actor_TestFloorInDirection.s,Actor_TestFloorInDir
asm/non_matchings/code/z_actor/Actor_IsTargeted.s,Actor_IsTargeted,0x800BC5B8,0xD
asm/non_matchings/code/z_actor/Actor_OtherIsTargeted.s,Actor_OtherIsTargeted,0x800BC5EC,0xD
asm/non_matchings/code/z_actor/func_800BC620.s,func_800BC620,0x800BC620,0x54
-asm/non_matchings/code/z_actor/Actor_AddQuake.s,Actor_AddQuake,0x800BC770,0x1A
-asm/non_matchings/code/z_actor/Actor_AddQuakeWithSpeed.s,Actor_AddQuakeWithSpeed,0x800BC7D8,0x1C
-asm/non_matchings/code/z_actor/func_800BC848.s,func_800BC848,0x800BC848,0x1C
+asm/non_matchings/code/z_actor/Actor_RequestQuake.s,Actor_RequestQuake,0x800BC770,0x1A
+asm/non_matchings/code/z_actor/Actor_RequestQuakeWithSpeed.s,Actor_RequestQuakeWithSpeed,0x800BC7D8,0x1C
+asm/non_matchings/code/z_actor/Actor_RequestQuakeAndRumble.s,Actor_RequestQuakeAndRumble,0x800BC848,0x1C
asm/non_matchings/code/z_actor/Actor_DrawDoorLock.s,Actor_DrawDoorLock,0x800BC8B8,0xA6
asm/non_matchings/code/z_actor/Actor_SpawnShieldParticlesMetal.s,Actor_SpawnShieldParticlesMetal,0x800BCB50,0x8
asm/non_matchings/code/z_actor/Actor_SetColorFilter.s,Actor_SetColorFilter,0x800BCB70,0x21
@@ -530,18 +530,18 @@ asm/non_matchings/code/z_bgcheck/DynaPoly_Init.s,DynaPoly_Init,0x800C6044,0x15
asm/non_matchings/code/z_bgcheck/DynaPoly_Alloc.s,DynaPoly_Alloc,0x800C6098,0x3C
asm/non_matchings/code/z_bgcheck/DynaPoly_SetBgActor.s,DynaPoly_SetBgActor,0x800C6188,0x30
asm/non_matchings/code/z_bgcheck/DynaPoly_GetActor.s,DynaPoly_GetActor,0x800C6248,0x1D
-asm/non_matchings/code/z_bgcheck/func_800C62BC.s,func_800C62BC,0x800C62BC,0x16
-asm/non_matchings/code/z_bgcheck/func_800C6314.s,func_800C6314,0x800C6314,0x16
-asm/non_matchings/code/z_bgcheck/func_800C636C.s,func_800C636C,0x800C636C,0x16
-asm/non_matchings/code/z_bgcheck/func_800C63C4.s,func_800C63C4,0x800C63C4,0x16
-asm/non_matchings/code/z_bgcheck/func_800C641C.s,func_800C641C,0x800C641C,0x16
-asm/non_matchings/code/z_bgcheck/func_800C6474.s,func_800C6474,0x800C6474,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_DisableCollision.s,DynaPoly_DisableCollision,0x800C62BC,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_EnableCollision.s,DynaPoly_EnableCollision,0x800C6314,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_DisableCeilingCollision.s,DynaPoly_DisableCeilingCollision,0x800C636C,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_EnableCeilingCollision.s,DynaPoly_EnableCeilingCollision,0x800C63C4,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_DisableFloorCollision.s,DynaPoly_DisableFloorCollision,0x800C641C,0x16
+asm/non_matchings/code/z_bgcheck/DynaPoly_EnableFloorCollision.s,DynaPoly_EnableFloorCollision,0x800C6474,0x16
asm/non_matchings/code/z_bgcheck/DynaPoly_DeleteBgActor.s,DynaPoly_DeleteBgActor,0x800C64CC,0x22
-asm/non_matchings/code/z_bgcheck/func_800C6554.s,func_800C6554,0x800C6554,0x6
+asm/non_matchings/code/z_bgcheck/DynaPoly_InvalidateLookup.s,DynaPoly_InvalidateLookup,0x800C6554,0x6
asm/non_matchings/code/z_bgcheck/BgCheck_CalcWaterboxDimensions.s,BgCheck_CalcWaterboxDimensions,0x800C656C,0xB3
asm/non_matchings/code/z_bgcheck/DynaPoly_SetBgActorToLists.s,DynaPoly_SetBgActorToLists,0x800C6838,0x2C5
-asm/non_matchings/code/z_bgcheck/BgCheck_ResetFlagsIfLoadedActor.s,BgCheck_ResetFlagsIfLoadedActor,0x800C734C,0x26
-asm/non_matchings/code/z_bgcheck/DynaPoly_Setup.s,DynaPoly_Setup,0x800C73E4,0x62
+asm/non_matchings/code/z_bgcheck/DynaPoly_UnsetAllInteractFlags.s,DynaPoly_UnsetAllInteractFlags,0x800C734C,0x26
+asm/non_matchings/code/z_bgcheck/DynaPoly_UpdateContext.s,DynaPoly_UpdateContext,0x800C73E4,0x62
asm/non_matchings/code/z_bgcheck/func_800C756C.s,func_800C756C,0x800C756C,0x3C
asm/non_matchings/code/z_bgcheck/DynaPoly_SetupAllActorMeshes.s,DynaPoly_SetupAllActorMeshes,0x800C765C,0x24
asm/non_matchings/code/z_bgcheck/func_800C76EC.s,func_800C76EC,0x800C76EC,0xA2
@@ -569,21 +569,21 @@ asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamCount.s,BgCheck_GetBgCamCount,0
asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamFuncDataImpl.s,BgCheck_GetBgCamFuncDataImpl,0x800C98CC,0x16
asm/non_matchings/code/z_bgcheck/BgCheck_GetBgCamFuncData.s,BgCheck_GetBgCamFuncData,0x800C9924,0x22
asm/non_matchings/code/z_bgcheck/SurfaceType_GetSceneExitIndex.s,SurfaceType_GetSceneExitIndex,0x800C99AC,0xA
-asm/non_matchings/code/z_bgcheck/func_800C99D4.s,func_800C99D4,0x800C99D4,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetFloorType.s,SurfaceType_GetFloorType,0x800C99D4,0xA
asm/non_matchings/code/z_bgcheck/func_800C99FC.s,func_800C99FC,0x800C99FC,0xA
-asm/non_matchings/code/z_bgcheck/func_800C9A24.s,func_800C9A24,0x800C9A24,0xA
-asm/non_matchings/code/z_bgcheck/func_800C9A4C.s,func_800C9A4C,0x800C9A4C,0xC
-asm/non_matchings/code/z_bgcheck/func_800C9A7C.s,func_800C9A7C,0x800C9A7C,0xD
-asm/non_matchings/code/z_bgcheck/func_800C9AB0.s,func_800C9AB0,0x800C9AB0,0xD
-asm/non_matchings/code/z_bgcheck/func_800C9AE4.s,func_800C9AE4,0x800C9AE4,0xD
-asm/non_matchings/code/z_bgcheck/func_800C9B18.s,func_800C9B18,0x800C9B18,0xA
-asm/non_matchings/code/z_bgcheck/func_800C9B40.s,func_800C9B40,0x800C9B40,0xA
-asm/non_matchings/code/z_bgcheck/func_800C9B68.s,func_800C9B68,0x800C9B68,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetWallType.s,SurfaceType_GetWallType,0x800C9A24,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetWallFlags.s,SurfaceType_GetWallFlags,0x800C9A4C,0xC
+asm/non_matchings/code/z_bgcheck/SurfaceType_CheckWallFlag0.s,SurfaceType_CheckWallFlag0,0x800C9A7C,0xD
+asm/non_matchings/code/z_bgcheck/SurfaceType_CheckWallFlag1.s,SurfaceType_CheckWallFlag1,0x800C9AB0,0xD
+asm/non_matchings/code/z_bgcheck/SurfaceType_CheckWallFlag2.s,SurfaceType_CheckWallFlag2,0x800C9AE4,0xD
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetFloorProperty2.s,SurfaceType_GetFloorProperty2,0x800C9B18,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetFloorProperty.s,SurfaceType_GetFloorProperty,0x800C9B40,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_IsSoft.s,SurfaceType_IsSoft,0x800C9B68,0xA
asm/non_matchings/code/z_bgcheck/SurfaceType_IsHorseBlocked.s,SurfaceType_IsHorseBlocked,0x800C9B90,0xA
-asm/non_matchings/code/z_bgcheck/func_800C9BB8.s,func_800C9BB8,0x800C9BB8,0x9
-asm/non_matchings/code/z_bgcheck/SurfaceType_GetSfx.s,SurfaceType_GetSfx,0x800C9BDC,0x12
-asm/non_matchings/code/z_bgcheck/func_800C9C24.s,func_800C9C24,0x800C9C24,0x14
-asm/non_matchings/code/z_bgcheck/SurfaceType_GetSlope.s,SurfaceType_GetSlope,0x800C9C74,0xA
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetMaterial.s,SurfaceType_GetMaterial,0x800C9BB8,0x9
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetSfxOffset.s,SurfaceType_GetSfxOffset,0x800C9BDC,0x12
+asm/non_matchings/code/z_bgcheck/SurfaceType_HasMaterialProperty.s,SurfaceType_HasMaterialProperty,0x800C9C24,0x14
+asm/non_matchings/code/z_bgcheck/SurfaceType_GetFloorEffect.s,SurfaceType_GetFloorEffect,0x800C9C74,0xA
asm/non_matchings/code/z_bgcheck/SurfaceType_GetLightSettingIndex.s,SurfaceType_GetLightSettingIndex,0x800C9C9C,0xA
asm/non_matchings/code/z_bgcheck/SurfaceType_GetEcho.s,SurfaceType_GetEcho,0x800C9CC4,0xA
asm/non_matchings/code/z_bgcheck/SurfaceType_IsHookshotSurface.s,SurfaceType_IsHookshotSurface,0x800C9CEC,0xA
@@ -606,10 +606,10 @@ asm/non_matchings/code/z_bgcheck/WaterBox_GetLightSettingIndex.s,WaterBox_GetLig
asm/non_matchings/code/z_bgcheck/func_800CA6F0.s,func_800CA6F0,0x800CA6F0,0xB8
asm/non_matchings/code/z_bgcheck/func_800CA9D0.s,func_800CA9D0,0x800CA9D0,0x11
asm/non_matchings/code/z_bgcheck/func_800CAA14.s,func_800CAA14,0x800CAA14,0x2F
-asm/non_matchings/code/z_bg_collect/BgCheck2_UpdateActorPosition.s,BgCheck2_UpdateActorPosition,0x800CAAD0,0x4F
-asm/non_matchings/code/z_bg_collect/BgCheck2_UpdateActorYRotation.s,BgCheck2_UpdateActorYRotation,0x800CAC0C,0x25
-asm/non_matchings/code/z_bg_collect/BgCheck2_AttachToMesh.s,BgCheck2_AttachToMesh,0x800CACA0,0x23
-asm/non_matchings/code/z_bg_collect/BgCheck2_UpdateActorAttachedToMesh.s,BgCheck2_UpdateActorAttachedToMesh,0x800CAD2C,0x39
+asm/non_matchings/code/z_bg_collect/DynaPolyActor_UpdateCarriedActorPos.s,DynaPolyActor_UpdateCarriedActorPos,0x800CAAD0,0x4F
+asm/non_matchings/code/z_bg_collect/DynaPolyActor_UpdateCarriedActorRotY.s,DynaPolyActor_UpdateCarriedActorRotY,0x800CAC0C,0x25
+asm/non_matchings/code/z_bg_collect/DynaPolyActor_AttachCarriedActor.s,DynaPolyActor_AttachCarriedActor,0x800CACA0,0x23
+asm/non_matchings/code/z_bg_collect/DynaPolyActor_TransformCarriedActor.s,DynaPolyActor_TransformCarriedActor,0x800CAD2C,0x39
asm/non_matchings/code/z_bg_item/DynaPoly_Init.s,DynaPoly_Init,0x800CAE10,0x9
asm/non_matchings/code/z_bg_item/DynaPoly_LoadMesh.s,DynaPoly_LoadMesh,0x800CAE34,0x12
asm/non_matchings/code/z_bg_item/DynaPoly_ResetState.s,DynaPoly_ResetState,0x800CAE7C,0x3
@@ -629,16 +629,16 @@ asm/non_matchings/code/z_bg_item/DynaPoly_ValidateMove.s,DynaPoly_ValidateMove,0
asm/non_matchings/code/z_camera/Camera_fabsf.s,Camera_fabsf,0x800CB210,0xC
asm/non_matchings/code/z_camera/Camera_Vec3fMagnitude.s,Camera_Vec3fMagnitude,0x800CB240,0xC
asm/non_matchings/code/z_camera/Camera_QuadraticAttenuation.s,Camera_QuadraticAttenuation,0x800CB270,0x30
-asm/non_matchings/code/z_camera/Camera_LerpCeilF.s,Camera_LerpCeilF,0x800CB330,0x1A
-asm/non_matchings/code/z_camera/Camera_LerpCeilS.s,Camera_LerpCeilS,0x800CB398,0x25
-asm/non_matchings/code/z_camera/Camera_LerpFloorS.s,Camera_LerpFloorS,0x800CB42C,0x25
-asm/non_matchings/code/z_camera/Camera_LerpCeilVec3f.s,Camera_LerpCeilVec3f,0x800CB4C0,0x21
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilF.s,Camera_ScaledStepToCeilF,0x800CB330,0x1A
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilS.s,Camera_ScaledStepToCeilS,0x800CB398,0x25
+asm/non_matchings/code/z_camera/Camera_ScaledStepToFloorS.s,Camera_ScaledStepToFloorS,0x800CB42C,0x25
+asm/non_matchings/code/z_camera/Camera_ScaledStepToCeilVec3f.s,Camera_ScaledStepToCeilVec3f,0x800CB4C0,0x21
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesFastPitch.s,Camera_SetUpdateRatesFastPitch,0x800CB544,0x10
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesFastYaw.s,Camera_SetUpdateRatesFastYaw,0x800CB584,0x16
asm/non_matchings/code/z_camera/Camera_SetUpdateRatesSlow.s,Camera_SetUpdateRatesSlow,0x800CB5DC,0xC
asm/non_matchings/code/z_camera/Camera_Vec3sToVec3f.s,Camera_Vec3sToVec3f,0x800CB60C,0x1A
asm/non_matchings/code/z_camera/Camera_AngleDiffAndScale.s,Camera_AngleDiffAndScale,0x800CB674,0x15
-asm/non_matchings/code/z_camera/Camera_UpdateAtActorOffset.s,Camera_UpdateAtActorOffset,0x800CB6C8,0xE
+asm/non_matchings/code/z_camera/Camera_SetFocalActorAtOffset.s,Camera_SetFocalActorAtOffset,0x800CB6C8,0xE
asm/non_matchings/code/z_camera/Camera_GetFocalActorHeight.s,Camera_GetFocalActorHeight,0x800CB700,0x20
asm/non_matchings/code/z_camera/Camera_GetRunSpeedLimit.s,Camera_GetRunSpeedLimit,0x800CB780,0x13
asm/non_matchings/code/z_camera/func_800CB7CC.s,func_800CB7CC,0x800CB7CC,0xB
@@ -661,41 +661,41 @@ asm/non_matchings/code/z_camera/Camera_IsUsingZoraFins.s,Camera_IsUsingZoraFins,
asm/non_matchings/code/z_camera/func_800CBC30.s,func_800CBC30,0x800CBC30,0x15
asm/non_matchings/code/z_camera/func_800CBC84.s,func_800CBC84,0x800CBC84,0xC8
asm/non_matchings/code/z_camera/func_800CBFA4.s,func_800CBFA4,0x800CBFA4,0x17
-asm/non_matchings/code/z_camera/func_800CC000.s,func_800CC000,0x800CC000,0x4A
-asm/non_matchings/code/z_camera/func_800CC128.s,func_800CC128,0x800CC128,0x27
-asm/non_matchings/code/z_camera/func_800CC1C4.s,func_800CC1C4,0x800CC1C4,0x27
+asm/non_matchings/code/z_camera/Camera_BgCheckInfo.s,Camera_BgCheckInfo,0x800CC000,0x4A
+asm/non_matchings/code/z_camera/Camera_BgCheck.s,Camera_BgCheck,0x800CC128,0x27
+asm/non_matchings/code/z_camera/Camera_CheckOOB.s,Camera_CheckOOB,0x800CC1C4,0x27
asm/non_matchings/code/z_camera/func_800CC260.s,func_800CC260,0x800CC260,0x8A
-asm/non_matchings/code/z_camera/func_800CC488.s,func_800CC488,0x800CC488,0x39
-asm/non_matchings/code/z_camera/func_800CC56C.s,func_800CC56C,0x800CC56C,0x17
-asm/non_matchings/code/z_camera/func_800CC5C8.s,func_800CC5C8,0x800CC5C8,0x5E
+asm/non_matchings/code/z_camera/Camera_GetFloorYNorm.s,Camera_GetFloorYNorm,0x800CC488,0x39
+asm/non_matchings/code/z_camera/Camera_GetFloorY.s,Camera_GetFloorY,0x800CC56C,0x17
+asm/non_matchings/code/z_camera/Camera_GetFloorYLayer.s,Camera_GetFloorYLayer,0x800CC5C8,0x5E
asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamSetting.s,Camera_GetBgCamOrActorCsCamSetting,0x800CC740,0x1A
asm/non_matchings/code/z_camera/Camera_GetBgCamOrActorCsCamFuncData.s,Camera_GetBgCamOrActorCsCamFuncData,0x800CC7A8,0x17
asm/non_matchings/code/z_camera/Camera_GetBgCamIndex.s,Camera_GetBgCamIndex,0x800CC804,0x1C
asm/non_matchings/code/z_camera/Camera_GetWaterBoxBgCamSetting.s,Camera_GetWaterBoxBgCamSetting,0x800CC874,0x31
asm/non_matchings/code/z_camera/func_800CC938.s,func_800CC938,0x800CC938,0x8
-asm/non_matchings/code/z_camera/func_800CC958.s,func_800CC958,0x800CC958,0x1A
-asm/non_matchings/code/z_camera/func_800CC9C0.s,func_800CC9C0,0x800CC9C0,0xCB
+asm/non_matchings/code/z_camera/Camera_CalcXZAngle.s,Camera_CalcXZAngle,0x800CC958,0x1A
+asm/non_matchings/code/z_camera/Camera_GetPitchAdjFromFloorHeightDiffs.s,Camera_GetPitchAdjFromFloorHeightDiffs,0x800CC9C0,0xCB
asm/non_matchings/code/z_camera/func_800CCCEC.s,func_800CCCEC,0x800CCCEC,0xD8
-asm/non_matchings/code/z_camera/func_800CD04C.s,func_800CD04C,0x800CD04C,0x8F
-asm/non_matchings/code/z_camera/func_800CD288.s,func_800CD288,0x800CD288,0x16
-asm/non_matchings/code/z_camera/func_800CD2E0.s,func_800CD2E0,0x800CD2E0,0x4
-asm/non_matchings/code/z_camera/func_800CD2F0.s,func_800CD2F0,0x800CD2F0,0x3D
-asm/non_matchings/code/z_camera/func_800CD3E4.s,func_800CD3E4,0x800CD3E4,0x1A
+asm/non_matchings/code/z_camera/Camera_CalcUpVec.s,Camera_CalcUpVec,0x800CD04C,0x8F
+asm/non_matchings/code/z_camera/Camera_ClampLerpScale.s,Camera_ClampLerpScale,0x800CD288,0x16
+asm/non_matchings/code/z_camera/Camera_ResetActionFuncState.s,Camera_ResetActionFuncState,0x800CD2E0,0x4
+asm/non_matchings/code/z_camera/Camera_UpdateInterface.s,Camera_UpdateInterface,0x800CD2F0,0x3D
+asm/non_matchings/code/z_camera/Camera_BgCheckCorner.s,Camera_BgCheckCorner,0x800CD3E4,0x1A
asm/non_matchings/code/z_camera/func_800CD44C.s,func_800CD44C,0x800CD44C,0x7A
-asm/non_matchings/code/z_camera/func_800CD634.s,func_800CD634,0x800CD634,0x26
+asm/non_matchings/code/z_camera/Camera_CalcSlopeYAdj.s,Camera_CalcSlopeYAdj,0x800CD634,0x26
asm/non_matchings/code/z_camera/func_800CD6CC.s,func_800CD6CC,0x800CD6CC,0xB
-asm/non_matchings/code/z_camera/func_800CD6F8.s,func_800CD6F8,0x800CD6F8,0x4F
-asm/non_matchings/code/z_camera/func_800CD834.s,func_800CD834,0x800CD834,0x78
-asm/non_matchings/code/z_camera/func_800CDA14.s,func_800CDA14,0x800CDA14,0x56
-asm/non_matchings/code/z_camera/func_800CDB6C.s,func_800CDB6C,0x800CDB6C,0xC0
-asm/non_matchings/code/z_camera/func_800CDE6C.s,func_800CDE6C,0x800CDE6C,0x113
-asm/non_matchings/code/z_camera/func_800CE2B8.s,func_800CE2B8,0x800CE2B8,0xCA
-asm/non_matchings/code/z_camera/func_800CE5E0.s,func_800CE5E0,0x800CE5E0,0x6F
-asm/non_matchings/code/z_camera/func_800CE79C.s,func_800CE79C,0x800CE79C,0x65
-asm/non_matchings/code/z_camera/func_800CE930.s,func_800CE930,0x800CE930,0x6A
-asm/non_matchings/code/z_camera/func_800CEAD8.s,func_800CEAD8,0x800CEAD8,0x58
-asm/non_matchings/code/z_camera/func_800CEC38.s,func_800CEC38,0x800CEC38,0x56
-asm/non_matchings/code/z_camera/func_800CED90.s,func_800CED90,0x800CED90,0x185
+asm/non_matchings/code/z_camera/Camera_CalcAtDefault.s,Camera_CalcAtDefault,0x800CD6F8,0x4F
+asm/non_matchings/code/z_camera/Camera_CalcAtForScreen.s,Camera_CalcAtForScreen,0x800CD834,0x78
+asm/non_matchings/code/z_camera/Camera_CalcAtForNormal1.s,Camera_CalcAtForNormal1,0x800CDA14,0x56
+asm/non_matchings/code/z_camera/Camera_CalcAtForParallel.s,Camera_CalcAtForParallel,0x800CDB6C,0xC0
+asm/non_matchings/code/z_camera/Camera_CalcAtForFriendlyLockOn.s,Camera_CalcAtForFriendlyLockOn,0x800CDE6C,0x113
+asm/non_matchings/code/z_camera/Camera_CalcAtForEnemyLockOn.s,Camera_CalcAtForEnemyLockOn,0x800CE2B8,0xCA
+asm/non_matchings/code/z_camera/Camera_CalcAtForHorse.s,Camera_CalcAtForHorse,0x800CE5E0,0x6F
+asm/non_matchings/code/z_camera/Camera_ClampDist1.s,Camera_ClampDist1,0x800CE79C,0x65
+asm/non_matchings/code/z_camera/Camera_ClampDist2.s,Camera_ClampDist2,0x800CE930,0x6A
+asm/non_matchings/code/z_camera/Camera_CalcDefaultPitch.s,Camera_CalcDefaultPitch,0x800CEAD8,0x58
+asm/non_matchings/code/z_camera/Camera_CalcDefaultYaw.s,Camera_CalcDefaultYaw,0x800CEC38,0x56
+asm/non_matchings/code/z_camera/Camera_CalcDefaultSwing.s,Camera_CalcDefaultSwing,0x800CED90,0x185
asm/non_matchings/code/z_camera/Camera_Noop.s,Camera_Noop,0x800CF3A4,0x4
asm/non_matchings/code/z_camera/Camera_Normal1.s,Camera_Normal1,0x800CF3B4,0x530
asm/non_matchings/code/z_camera/Camera_Normal2.s,Camera_Normal2,0x800D0874,0x8
@@ -767,48 +767,48 @@ asm/non_matchings/code/z_camera/Camera_Special6.s,Camera_Special6,0x800DD0FC,0x8
asm/non_matchings/code/z_camera/Camera_Special7.s,Camera_Special7,0x800DD11C,0x8
asm/non_matchings/code/z_camera/Camera_Special8.s,Camera_Special8,0x800DD13C,0x11F
asm/non_matchings/code/z_camera/Camera_Special9.s,Camera_Special9,0x800DD5B8,0x1E8
-asm/non_matchings/code/z_camera/Camera_Alloc.s,Camera_Alloc,0x800DDD58,0x14
-asm/non_matchings/code/z_camera/Camera_Free.s,Camera_Free,0x800DDDA8,0xA
+asm/non_matchings/code/z_camera/Camera_Create.s,Camera_Create,0x800DDD58,0x14
+asm/non_matchings/code/z_camera/Camera_Destroy.s,Camera_Destroy,0x800DDDA8,0xA
asm/non_matchings/code/z_camera/Camera_Init.s,Camera_Init,0x800DDDD0,0x84
asm/non_matchings/code/z_camera/func_800DDFE0.s,func_800DDFE0,0x800DDFE0,0x40
-asm/non_matchings/code/z_camera/func_800DE0E0.s,func_800DE0E0,0x800DE0E0,0x3
-asm/non_matchings/code/z_camera/Camera_InitPlayerSettings.s,Camera_InitPlayerSettings,0x800DE0EC,0x87
+asm/non_matchings/code/z_camera/Camera_Stub800DE0E0.s,Camera_Stub800DE0E0,0x800DE0E0,0x3
+asm/non_matchings/code/z_camera/Camera_InitFocalActorSettings.s,Camera_InitFocalActorSettings,0x800DE0EC,0x87
asm/non_matchings/code/z_camera/Camera_ChangeStatus.s,Camera_ChangeStatus,0x800DE308,0x7
-asm/non_matchings/code/z_camera/func_800DE324.s,func_800DE324,0x800DE324,0xC2
-asm/non_matchings/code/z_camera/func_800DE62C.s,func_800DE62C,0x800DE62C,0x85
-asm/non_matchings/code/z_camera/func_800DE840.s,func_800DE840,0x800DE840,0x14
-asm/non_matchings/code/z_camera/func_800DE890.s,func_800DE890,0x800DE890,0x31
-asm/non_matchings/code/z_camera/func_800DE954.s,func_800DE954,0x800DE954,0x17
+asm/non_matchings/code/z_camera/Camera_UpdateWater.s,Camera_UpdateWater,0x800DE324,0xC2
+asm/non_matchings/code/z_camera/Camera_EarthquakeDay3.s,Camera_EarthquakeDay3,0x800DE62C,0x85
+asm/non_matchings/code/z_camera/Camera_UpdateHotRoom.s,Camera_UpdateHotRoom,0x800DE840,0x14
+asm/non_matchings/code/z_camera/Camera_SetSwordDistortion.s,Camera_SetSwordDistortion,0x800DE890,0x31
+asm/non_matchings/code/z_camera/Camera_RequestGiantsMaskSetting.s,Camera_RequestGiantsMaskSetting,0x800DE954,0x17
asm/non_matchings/code/z_camera/Camera_Update.s,Camera_Update,0x800DE9B0,0x2BA
asm/non_matchings/code/z_camera/func_800DF498.s,func_800DF498,0x800DF498,0xE
-asm/non_matchings/code/z_camera/Camera_SetMode.s,Camera_SetMode,0x800DF4D0,0xDC
+asm/non_matchings/code/z_camera/Camera_ChangeModeFlags.s,Camera_ChangeModeFlags,0x800DF4D0,0xDC
asm/non_matchings/code/z_camera/Camera_ChangeMode.s,Camera_ChangeMode,0x800DF840,0xB
-asm/non_matchings/code/z_camera/func_800DF86C.s,func_800DF86C,0x800DF86C,0x20
-asm/non_matchings/code/z_camera/func_800DF8EC.s,func_800DF8EC,0x800DF8EC,0x77
+asm/non_matchings/code/z_camera/Camera_CheckValidMode.s,Camera_CheckValidMode,0x800DF86C,0x20
+asm/non_matchings/code/z_camera/Camera_ChangeSettingFlags.s,Camera_ChangeSettingFlags,0x800DF8EC,0x77
asm/non_matchings/code/z_camera/Camera_ChangeSetting.s,Camera_ChangeSetting,0x800DFAC8,0x13
-asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s,Camera_ChangeDataIdx,0x800DFB14,0x42
-asm/non_matchings/code/z_camera/func_800DFC1C.s,func_800DFC1C,0x800DFC1C,0x9
-asm/non_matchings/code/z_camera/func_800DFC40.s,func_800DFC40,0x800DFC40,0xA
+asm/non_matchings/code/z_camera/Camera_ChangeActorCsCamIndex.s,Camera_ChangeActorCsCamIndex,0x800DFB14,0x42
+asm/non_matchings/code/z_camera/Camera_GetInputDir.s,Camera_GetInputDir,0x800DFC1C,0x9
+asm/non_matchings/code/z_camera/Camera_GetInputDirPitch.s,Camera_GetInputDirPitch,0x800DFC40,0xA
asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s,Camera_GetInputDirYaw,0x800DFC68,0xA
asm/non_matchings/code/z_camera/Camera_GetCamDir.s,Camera_GetCamDir,0x800DFC90,0x9
asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s,Camera_GetCamDirPitch,0x800DFCB4,0xA
asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s,Camera_GetCamDirYaw,0x800DFCDC,0xA
asm/non_matchings/code/z_camera/Camera_AddQuake.s,Camera_AddQuake,0x800DFD04,0x1D
asm/non_matchings/code/z_camera/Camera_SetViewParam.s,Camera_SetViewParam,0x800DFD78,0x5E
-asm/non_matchings/code/z_camera/func_800DFEF0.s,func_800DFEF0,0x800DFEF0,0xA
-asm/non_matchings/code/z_camera/func_800DFF18.s,func_800DFF18,0x800DFF18,0x7
-asm/non_matchings/code/z_camera/func_800DFF34.s,func_800DFF34,0x800DFF34,0x4
-asm/non_matchings/code/z_camera/func_800DFF44.s,func_800DFF44,0x800DFF44,0x7
-asm/non_matchings/code/z_camera/Camera_SetFlags.s,Camera_SetFlags,0x800DFF60,0x9
-asm/non_matchings/code/z_camera/Camera_ClearFlags.s,Camera_ClearFlags,0x800DFF84,0xA
+asm/non_matchings/code/z_camera/Camera_UnsetViewFlag.s,Camera_UnsetViewFlag,0x800DFEF0,0xA
+asm/non_matchings/code/z_camera/Camera_OverwriteStateFlags.s,Camera_OverwriteStateFlags,0x800DFF18,0x7
+asm/non_matchings/code/z_camera/Camera_ResetActionFuncStateUnused.s,Camera_ResetActionFuncStateUnused,0x800DFF34,0x4
+asm/non_matchings/code/z_camera/Camera_SetCsParams.s,Camera_SetCsParams,0x800DFF44,0x7
+asm/non_matchings/code/z_camera/Camera_SetStateFlag.s,Camera_SetStateFlag,0x800DFF60,0x9
+asm/non_matchings/code/z_camera/Camera_UnsetStateFlag.s,Camera_UnsetStateFlag,0x800DFF84,0xA
asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s,Camera_ChangeDoorCam,0x800DFFAC,0x34
asm/non_matchings/code/z_camera/Camera_Copy.s,Camera_Copy,0x800E007C,0x4C
-asm/non_matchings/code/z_camera/func_800E01AC.s,func_800E01AC,0x800E01AC,0x3
+asm/non_matchings/code/z_camera/Camera_IsDbgCamEnabled.s,Camera_IsDbgCamEnabled,0x800E01AC,0x3
asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s,Camera_GetQuakeOffset,0x800E01B8,0x9
-asm/non_matchings/code/z_camera/func_800E01DC.s,func_800E01DC,0x800E01DC,0x13
-asm/non_matchings/code/z_camera/func_800E0228.s,func_800E0228,0x800E0228,0x4
+asm/non_matchings/code/z_camera/Camera_SetCameraData.s,Camera_SetCameraData,0x800E01DC,0x13
+asm/non_matchings/code/z_camera/Camera_GetNegOne.s,Camera_GetNegOne,0x800E0228,0x4
asm/non_matchings/code/z_camera/func_800E0238.s,func_800E0238,0x800E0238,0x1D
-asm/non_matchings/code/z_camera/Camera_SetToTrackActor.s,Camera_SetToTrackActor,0x800E02AC,0x17
+asm/non_matchings/code/z_camera/Camera_SetFocalActor.s,Camera_SetFocalActor,0x800E02AC,0x17
asm/non_matchings/code/z_camera/Camera_SetTargetActor.s,Camera_SetTargetActor,0x800E0308,0x5
asm/non_matchings/code/z_camera/Camera_GetWaterYPos.s,Camera_GetWaterYPos,0x800E031C,0xB
asm/non_matchings/code/z_camera/func_800E0348.s,func_800E0348,0x800E0348,0x16
@@ -1047,54 +1047,54 @@ asm/non_matchings/code/z_debug_mode/Debug_DrawScreenText.s,Debug_DrawScreenText,
asm/non_matchings/code/z_debug_mode/DebugCamera_ScreenText.s,DebugCamera_ScreenText,0x800E9DBC,0x36
asm/non_matchings/code/z_debug_mode/DebugCamera_DrawScreenText.s,DebugCamera_DrawScreenText,0x800E9E94,0x39
asm/non_matchings/code/z_debug_mode/Debug_DrawText.s,Debug_DrawText,0x800E9F78,0x3A
-asm/non_matchings/code/z_demo/Cutscene_Init.s,Cutscene_Init,0x800EA060,0x1D
-asm/non_matchings/code/z_demo/Cutscene_Start.s,Cutscene_Start,0x800EA0D4,0x6
-asm/non_matchings/code/z_demo/Cutscene_End.s,Cutscene_End,0x800EA0EC,0x9
-asm/non_matchings/code/z_demo/Cutscene_Update1.s,Cutscene_Update1,0x800EA110,0x13
-asm/non_matchings/code/z_demo/Cutscene_Update2.s,Cutscene_Update2,0x800EA15C,0x2D
-asm/non_matchings/code/z_demo/Cutscene_DoNothing.s,Cutscene_DoNothing,0x800EA210,0x4
-asm/non_matchings/code/z_demo/func_800EA220.s,func_800EA220,0x800EA220,0xE
-asm/non_matchings/code/z_demo/func_800EA258.s,func_800EA258,0x800EA258,0x18
-asm/non_matchings/code/z_demo/func_800EA2B8.s,func_800EA2B8,0x800EA2B8,0x1B
-asm/non_matchings/code/z_demo/Cutscene_Command_Misc.s,Cutscene_Command_Misc,0x800EA324,0x222
-asm/non_matchings/code/z_demo/Cutscene_Command_SetLighting.s,Cutscene_Command_SetLighting,0x800EABAC,0x17
-asm/non_matchings/code/z_demo/Cutscene_Command_PlaySequence.s,Cutscene_Command_PlaySequence,0x800EAC08,0xF
-asm/non_matchings/code/z_demo/Cutscene_Command_StopSequence.s,Cutscene_Command_StopSequence,0x800EAC44,0x14
-asm/non_matchings/code/z_demo/Cutscene_Command_FadeSequence.s,Cutscene_Command_FadeSequence,0x800EAC94,0x20
-asm/non_matchings/code/z_demo/Cutscene_Command_PlayAmbienceSequence.s,Cutscene_Command_PlayAmbienceSequence,0x800EAD14,0xD
-asm/non_matchings/code/z_demo/func_800EAD48.s,func_800EAD48,0x800EAD48,0xD
-asm/non_matchings/code/z_demo/func_800EAD7C.s,func_800EAD7C,0x800EAD7C,0xD
-asm/non_matchings/code/z_demo/func_800EADB0.s,func_800EADB0,0x800EADB0,0x47
-asm/non_matchings/code/z_demo/Cutscene_Command_FadeAmbienceSequence.s,Cutscene_Command_FadeAmbienceSequence,0x800EAECC,0x15
-asm/non_matchings/code/z_demo/Cutscene_Command_Rumble.s,Cutscene_Command_Rumble,0x800EAF20,0x30
-asm/non_matchings/code/z_demo/Cutscene_Command_FadeColorScreen.s,Cutscene_Command_FadeColorScreen,0x800EAFE0,0x7F
-asm/non_matchings/code/z_demo/Cutscene_Command_SetTime.s,Cutscene_Command_SetTime,0x800EB1DC,0x62
-asm/non_matchings/code/z_demo/Cutscene_TerminatorImpl.s,Cutscene_TerminatorImpl,0x800EB364,0x54
-asm/non_matchings/code/z_demo/Cutscene_Command_Terminator.s,Cutscene_Command_Terminator,0x800EB4B4,0x91
-asm/non_matchings/code/z_demo/Cutscene_Command_ChooseCreditsScenes.s,Cutscene_Command_ChooseCreditsScenes,0x800EB6F8,0x11C
-asm/non_matchings/code/z_demo/Cutscene_Command_MotionBlur.s,Cutscene_Command_MotionBlur,0x800EBB68,0x5A
-asm/non_matchings/code/z_demo/Cutscene_Command_GiveTatlToPlayer.s,Cutscene_Command_GiveTatlToPlayer,0x800EBCD0,0x24
-asm/non_matchings/code/z_demo/Cutscene_Command_TransitionFX.s,Cutscene_Command_TransitionFX,0x800EBD60,0x246
-asm/non_matchings/code/z_demo/Cutscene_Command_Camera.s,Cutscene_Command_Camera,0x800EC678,0x17
+asm/non_matchings/code/z_demo/Cutscene_InitContext.s,Cutscene_InitContext,0x800EA060,0x1D
+asm/non_matchings/code/z_demo/Cutscene_StartManual.s,Cutscene_StartManual,0x800EA0D4,0x6
+asm/non_matchings/code/z_demo/Cutscene_StopManual.s,Cutscene_StopManual,0x800EA0EC,0x9
+asm/non_matchings/code/z_demo/Cutscene_UpdateManual.s,Cutscene_UpdateManual,0x800EA110,0x13
+asm/non_matchings/code/z_demo/Cutscene_UpdateScripted.s,Cutscene_UpdateScripted,0x800EA15C,0x2D
+asm/non_matchings/code/z_demo/CutsceneHandler_DoNothing.s,CutsceneHandler_DoNothing,0x800EA210,0x4
+asm/non_matchings/code/z_demo/Cutscene_StepTimer.s,Cutscene_StepTimer,0x800EA220,0xE
+asm/non_matchings/code/z_demo/CutsceneHandler_StartManual.s,CutsceneHandler_StartManual,0x800EA258,0x18
+asm/non_matchings/code/z_demo/CutsceneHandler_StartScript.s,CutsceneHandler_StartScript,0x800EA2B8,0x1B
+asm/non_matchings/code/z_demo/CutsceneCmd_Misc.s,CutsceneCmd_Misc,0x800EA324,0x222
+asm/non_matchings/code/z_demo/CutsceneCmd_SetLightSetting.s,CutsceneCmd_SetLightSetting,0x800EABAC,0x17
+asm/non_matchings/code/z_demo/CutsceneCmd_StartSequence.s,CutsceneCmd_StartSequence,0x800EAC08,0xF
+asm/non_matchings/code/z_demo/CutsceneCmd_StopSequence.s,CutsceneCmd_StopSequence,0x800EAC44,0x14
+asm/non_matchings/code/z_demo/CutsceneCmd_FadeOutSequence.s,CutsceneCmd_FadeOutSequence,0x800EAC94,0x20
+asm/non_matchings/code/z_demo/CutsceneCmd_StartAmbience.s,CutsceneCmd_StartAmbience,0x800EAD14,0xD
+asm/non_matchings/code/z_demo/Cutscene_SetSfxReverbIndexTo2.s,Cutscene_SetSfxReverbIndexTo2,0x800EAD48,0xD
+asm/non_matchings/code/z_demo/Cutscene_SetSfxReverbIndexTo1.s,Cutscene_SetSfxReverbIndexTo1,0x800EAD7C,0xD
+asm/non_matchings/code/z_demo/CutsceneCmd_ModifySequence.s,CutsceneCmd_ModifySequence,0x800EADB0,0x47
+asm/non_matchings/code/z_demo/CutsceneCmd_FadeOutAmbience.s,CutsceneCmd_FadeOutAmbience,0x800EAECC,0x15
+asm/non_matchings/code/z_demo/CutsceneCmd_RumbleController.s,CutsceneCmd_RumbleController,0x800EAF20,0x30
+asm/non_matchings/code/z_demo/CutsceneCmd_TransitionGeneral.s,CutsceneCmd_TransitionGeneral,0x800EAFE0,0x7F
+asm/non_matchings/code/z_demo/CutsceneCmd_SetTime.s,CutsceneCmd_SetTime,0x800EB1DC,0x62
+asm/non_matchings/code/z_demo/CutsceneCmd_DestinationDefault.s,CutsceneCmd_DestinationDefault,0x800EB364,0x54
+asm/non_matchings/code/z_demo/CutsceneCmd_Destination.s,CutsceneCmd_Destination,0x800EB4B4,0x91
+asm/non_matchings/code/z_demo/CutsceneCmd_ChooseCreditsScenes.s,CutsceneCmd_ChooseCreditsScenes,0x800EB6F8,0x11C
+asm/non_matchings/code/z_demo/CutsceneCmd_MotionBlur.s,CutsceneCmd_MotionBlur,0x800EBB68,0x5A
+asm/non_matchings/code/z_demo/CutsceneCmd_GiveTatlToPlayer.s,CutsceneCmd_GiveTatlToPlayer,0x800EBCD0,0x24
+asm/non_matchings/code/z_demo/CutsceneCmd_Transition.s,CutsceneCmd_Transition,0x800EBD60,0x246
+asm/non_matchings/code/z_demo/CutsceneCmd_UpdateCamSpline.s,CutsceneCmd_UpdateCamSpline,0x800EC678,0x17
asm/non_matchings/code/z_demo/Cutscene_CountNormalMasks.s,Cutscene_CountNormalMasks,0x800EC6D4,0x94
-asm/non_matchings/code/z_demo/Cutscene_Command_Textbox.s,Cutscene_Command_Textbox,0x800EC924,0x116
-asm/non_matchings/code/z_demo/func_800ECD7C.s,func_800ECD7C,0x800ECD7C,0x31
-asm/non_matchings/code/z_demo/Cutscene_ProcessCommands.s,Cutscene_ProcessCommands,0x800ECE40,0x2D0
-asm/non_matchings/code/z_demo/func_800ED980.s,func_800ED980,0x800ED980,0x11
-asm/non_matchings/code/z_demo/func_800ED9C4.s,func_800ED9C4,0x800ED9C4,0x10
-asm/non_matchings/code/z_demo/func_800EDA04.s,func_800EDA04,0x800EDA04,0x20
-asm/non_matchings/code/z_demo/func_800EDA84.s,func_800EDA84,0x800EDA84,0x57
-asm/non_matchings/code/z_demo/func_800EDBE0.s,func_800EDBE0,0x800EDBE0,0x74
+asm/non_matchings/code/z_demo/CutsceneCmd_Text.s,CutsceneCmd_Text,0x800EC924,0x116
+asm/non_matchings/code/z_demo/Cutscene_SetActorCue.s,Cutscene_SetActorCue,0x800ECD7C,0x31
+asm/non_matchings/code/z_demo/Cutscene_ProcessScript.s,Cutscene_ProcessScript,0x800ECE40,0x2D0
+asm/non_matchings/code/z_demo/CutsceneHandler_RunScript.s,CutsceneHandler_RunScript,0x800ED980,0x11
+asm/non_matchings/code/z_demo/CutsceneHandler_StopManual.s,CutsceneHandler_StopManual,0x800ED9C4,0x10
+asm/non_matchings/code/z_demo/CutsceneHandler_StopScript.s,CutsceneHandler_StopScript,0x800EDA04,0x20
+asm/non_matchings/code/z_demo/Cutscene_SetupScripted.s,Cutscene_SetupScripted,0x800EDA84,0x57
+asm/non_matchings/code/z_demo/Cutscene_HandleEntranceTriggers.s,Cutscene_HandleEntranceTriggers,0x800EDBE0,0x74
asm/non_matchings/code/z_demo/func_800EDDB0.s,func_800EDDB0,0x800EDDB0,0x3
asm/non_matchings/code/z_demo/func_800EDDBC.s,func_800EDDBC,0x800EDDBC,0x4
-asm/non_matchings/code/z_demo/Cutscene_LoadCutsceneData.s,Cutscene_LoadCutsceneData,0x800EDDCC,0x1A
+asm/non_matchings/code/z_demo/Cutscene_StartScripted.s,Cutscene_StartScripted,0x800EDDCC,0x1A
asm/non_matchings/code/z_demo/Cutscene_ActorTranslate.s,Cutscene_ActorTranslate,0x800EDE34,0x3C
asm/non_matchings/code/z_demo/Cutscene_ActorTranslateAndYaw.s,Cutscene_ActorTranslateAndYaw,0x800EDF24,0x15
asm/non_matchings/code/z_demo/Cutscene_ActorTranslateAndYawSmooth.s,Cutscene_ActorTranslateAndYawSmooth,0x800EDF78,0x55
asm/non_matchings/code/z_demo/Cutscene_ActorTranslateXZAndYawSmooth.s,Cutscene_ActorTranslateXZAndYawSmooth,0x800EE0CC,0x43
asm/non_matchings/code/z_demo/Cutscene_GetSceneLayer.s,Cutscene_GetSceneLayer,0x800EE1D8,0xA
-asm/non_matchings/code/z_demo/Cutscene_GetActorActionIndex.s,Cutscene_GetActorActionIndex,0x800EE200,0x27
-asm/non_matchings/code/z_demo/Cutscene_CheckActorAction.s,Cutscene_CheckActorAction,0x800EE29C,0x16
+asm/non_matchings/code/z_demo/Cutscene_GetCueChannel.s,Cutscene_GetCueChannel,0x800EE200,0x27
+asm/non_matchings/code/z_demo/Cutscene_IsCueInChannel.s,Cutscene_IsCueInChannel,0x800EE29C,0x16
asm/non_matchings/code/z_demo/Cutscene_IsPlaying.s,Cutscene_IsPlaying,0x800EE2F4,0xB
asm/non_matchings/code/z_draw/GetItem_Draw.s,GetItem_Draw,0x800EE320,0x11
asm/non_matchings/code/z_draw/GetItem_DrawBombchu.s,GetItem_DrawBombchu,0x800EE364,0x27
@@ -1150,31 +1150,31 @@ asm/non_matchings/code/code_800F12D0/func_800F12D0.s,func_800F12D0,0x800F12D0,0x
asm/non_matchings/code/code_800F12D0/func_800F1304.s,func_800F1304,0x800F1304,0x1C
asm/non_matchings/code/code_800F12D0/func_800F1374.s,func_800F1374,0x800F1374,0x1D
asm/non_matchings/code/code_800F12D0/func_800F13E8.s,func_800F13E8,0x800F13E8,0x1E
-asm/non_matchings/code/z_eventmgr/func_800F1460.s,func_800F1460,0x800F1460,0x26
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCutsceneImpl.s,ActorCutscene_GetCutsceneImpl,0x800F14F8,0x13
-asm/non_matchings/code/z_eventmgr/ActorCutscene_Init.s,ActorCutscene_Init,0x800F1544,0x25
-asm/non_matchings/code/z_eventmgr/func_800F15D8.s,func_800F15D8,0x800F15D8,0x1C
-asm/non_matchings/code/z_eventmgr/ActorCutscene_ClearWaiting.s,ActorCutscene_ClearWaiting,0x800F1648,0xC
-asm/non_matchings/code/z_eventmgr/ActorCutscene_ClearNextCutscenes.s,ActorCutscene_ClearNextCutscenes,0x800F1678,0xC
-asm/non_matchings/code/z_eventmgr/ActorCutscene_MarkNextCutscenes.s,ActorCutscene_MarkNextCutscenes,0x800F16A8,0x55
-asm/non_matchings/code/z_eventmgr/ActorCutscene_End.s,ActorCutscene_End,0x800F17FC,0xA0
-asm/non_matchings/code/z_eventmgr/ActorCutscene_Update.s,ActorCutscene_Update,0x800F1A7C,0x4A
-asm/non_matchings/code/z_eventmgr/ActorCutscene_SetIntentToPlay.s,ActorCutscene_SetIntentToPlay,0x800F1BA4,0x10
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCanPlayNext.s,ActorCutscene_GetCanPlayNext,0x800F1BE4,0x21
-asm/non_matchings/code/z_eventmgr/ActorCutscene_StartAndSetUnkLinkFields.s,ActorCutscene_StartAndSetUnkLinkFields,0x800F1C68,0x1E
-asm/non_matchings/code/z_eventmgr/ActorCutscene_StartAndSetFlag.s,ActorCutscene_StartAndSetFlag,0x800F1CE0,0x29
-asm/non_matchings/code/z_eventmgr/ActorCutscene_Start.s,ActorCutscene_Start,0x800F1D84,0x8E
-asm/non_matchings/code/z_eventmgr/ActorCutscene_Stop.s,ActorCutscene_Stop,0x800F1FBC,0x30
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentIndex.s,ActorCutscene_GetCurrentIndex,0x800F207C,0x4
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCutscene.s,ActorCutscene_GetCutscene,0x800F208C,0xB
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetAdditionalCutscene.s,ActorCutscene_GetAdditionalCutscene,0x800F20B8,0x10
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetLength.s,ActorCutscene_GetLength,0x800F20F8,0x10
-asm/non_matchings/code/z_eventmgr/func_800F2138.s,func_800F2138,0x800F2138,0x10
-asm/non_matchings/code/z_eventmgr/func_800F2178.s,func_800F2178,0x800F2178,0x10
-asm/non_matchings/code/z_eventmgr/ActorCutscene_GetCurrentSubCamId.s,ActorCutscene_GetCurrentSubCamId,0x800F21B8,0x5
-asm/non_matchings/code/z_eventmgr/func_800F21CC.s,func_800F21CC,0x800F21CC,0x3E
+asm/non_matchings/code/z_eventmgr/CutsceneManager_SetHudVisibility.s,CutsceneManager_SetHudVisibility,0x800F1460,0x26
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCutsceneEntryImpl.s,CutsceneManager_GetCutsceneEntryImpl,0x800F14F8,0x13
+asm/non_matchings/code/z_eventmgr/CutsceneManager_Init.s,CutsceneManager_Init,0x800F1544,0x25
+asm/non_matchings/code/z_eventmgr/CutsceneManager_StoreCamera.s,CutsceneManager_StoreCamera,0x800F15D8,0x1C
+asm/non_matchings/code/z_eventmgr/CutsceneManager_ClearWaiting.s,CutsceneManager_ClearWaiting,0x800F1648,0xC
+asm/non_matchings/code/z_eventmgr/CutsceneManager_ClearNextCutscenes.s,CutsceneManager_ClearNextCutscenes,0x800F1678,0xC
+asm/non_matchings/code/z_eventmgr/CutsceneManager_MarkNextCutscenes.s,CutsceneManager_MarkNextCutscenes,0x800F16A8,0x55
+asm/non_matchings/code/z_eventmgr/CutsceneManager_End.s,CutsceneManager_End,0x800F17FC,0xA0
+asm/non_matchings/code/z_eventmgr/CutsceneManager_Update.s,CutsceneManager_Update,0x800F1A7C,0x4A
+asm/non_matchings/code/z_eventmgr/CutsceneManager_Queue.s,CutsceneManager_Queue,0x800F1BA4,0x10
+asm/non_matchings/code/z_eventmgr/CutsceneManager_IsNext.s,CutsceneManager_IsNext,0x800F1BE4,0x21
+asm/non_matchings/code/z_eventmgr/CutsceneManager_StartWithPlayerCs.s,CutsceneManager_StartWithPlayerCs,0x800F1C68,0x1E
+asm/non_matchings/code/z_eventmgr/CutsceneManager_StartWithPlayerCsAndSetFlag.s,CutsceneManager_StartWithPlayerCsAndSetFlag,0x800F1CE0,0x29
+asm/non_matchings/code/z_eventmgr/CutsceneManager_Start.s,CutsceneManager_Start,0x800F1D84,0x8E
+asm/non_matchings/code/z_eventmgr/CutsceneManager_Stop.s,CutsceneManager_Stop,0x800F1FBC,0x30
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCurrentCsId.s,CutsceneManager_GetCurrentCsId,0x800F207C,0x4
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCutsceneEntry.s,CutsceneManager_GetCutsceneEntry,0x800F208C,0xB
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetAdditionalCsId.s,CutsceneManager_GetAdditionalCsId,0x800F20B8,0x10
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetLength.s,CutsceneManager_GetLength,0x800F20F8,0x10
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCutsceneScriptIndex.s,CutsceneManager_GetCutsceneScriptIndex,0x800F2138,0x10
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCutsceneCustomValue.s,CutsceneManager_GetCutsceneCustomValue,0x800F2178,0x10
+asm/non_matchings/code/z_eventmgr/CutsceneManager_GetCurrentSubCamId.s,CutsceneManager_GetCurrentSubCamId,0x800F21B8,0x5
+asm/non_matchings/code/z_eventmgr/CutsceneManager_FindEntranceCsId.s,CutsceneManager_FindEntranceCsId,0x800F21CC,0x3E
asm/non_matchings/code/z_eventmgr/func_800F22C4.s,func_800F22C4,0x800F22C4,0x40
-asm/non_matchings/code/z_eventmgr/ActorCutscene_SetReturnCamera.s,ActorCutscene_SetReturnCamera,0x800F23C4,0x7
+asm/non_matchings/code/z_eventmgr/CutsceneManager_SetReturnCamera.s,CutsceneManager_SetReturnCamera,0x800F23C4,0x7
asm/non_matchings/code/z_fcurve_data/func_800F23E0.s,func_800F23E0,0x800F23E0,0x26
asm/non_matchings/code/z_fcurve_data/func_800F2478.s,func_800F2478,0x800F2478,0x6A
asm/non_matchings/code/z_fcurve_data_skelanime/func_800F2620.s,func_800F2620,0x800F2620,0xC
@@ -1197,16 +1197,16 @@ asm/non_matchings/code/z_fireobj/FireObj_Init.s,FireObj_Init,0x800F36CC,0x39
asm/non_matchings/code/z_fireobj/FireObj_Fini.s,FireObj_Fini,0x800F37B0,0x10
asm/non_matchings/code/z_fireobj/FireObj_SetState2.s,FireObj_SetState2,0x800F37F0,0xC
asm/non_matchings/code/z_fireobj/FireObj_Update.s,FireObj_Update,0x800F3820,0x48
-asm/non_matchings/code/z_horse/func_800F3940.s,func_800F3940,0x800F3940,0x1D
-asm/non_matchings/code/z_horse/func_800F39B4.s,func_800F39B4,0x800F39B4,0x2C
-asm/non_matchings/code/z_horse/func_800F3A64.s,func_800F3A64,0x800F3A64,0x32
-asm/non_matchings/code/z_horse/func_800F3B2C.s,func_800F3B2C,0x800F3B2C,0xF
-asm/non_matchings/code/z_horse/func_800F3B68.s,func_800F3B68,0x800F3B68,0x37
-asm/non_matchings/code/z_horse/func_800F3C44.s,func_800F3C44,0x800F3C44,0xA4
-asm/non_matchings/code/z_horse/func_800F3ED4.s,func_800F3ED4,0x800F3ED4,0x73
-asm/non_matchings/code/z_horse/func_800F40A0.s,func_800F40A0,0x800F40A0,0x2F
-asm/non_matchings/code/z_horse/func_800F415C.s,func_800F415C,0x800F415C,0x22
-asm/non_matchings/code/z_horse/func_800F41E4.s,func_800F41E4,0x800F41E4,0x2F
+asm/non_matchings/code/z_horse/Horse_GetJumpingFencePathIndex.s,Horse_GetJumpingFencePathIndex,0x800F3940,0x1D
+asm/non_matchings/code/z_horse/Horse_CopyPointFromPathList.s,Horse_CopyPointFromPathList,0x800F39B4,0x2C
+asm/non_matchings/code/z_horse/Horse_IsValidSpawn.s,Horse_IsValidSpawn,0x800F3A64,0x32
+asm/non_matchings/code/z_horse/Horse_ResetHorseData.s,Horse_ResetHorseData,0x800F3B2C,0xF
+asm/non_matchings/code/z_horse/Horse_IsValidSceneLayer.s,Horse_IsValidSceneLayer,0x800F3B68,0x37
+asm/non_matchings/code/z_horse/Horse_SpawnOverworld.s,Horse_SpawnOverworld,0x800F3C44,0xA4
+asm/non_matchings/code/z_horse/Horse_SpawnMinigame.s,Horse_SpawnMinigame,0x800F3ED4,0x73
+asm/non_matchings/code/z_horse/Horse_Spawn.s,Horse_Spawn,0x800F40A0,0x2F
+asm/non_matchings/code/z_horse/Horse_RotateToPoint.s,Horse_RotateToPoint,0x800F415C,0x22
+asm/non_matchings/code/z_horse/Horse_IsActive.s,Horse_IsActive,0x800F41E4,0x2F
asm/non_matchings/code/z_jpeg/Jpeg_ScheduleDecoderTask.s,Jpeg_ScheduleDecoderTask,0x800F42A0,0x47
asm/non_matchings/code/z_jpeg/Jpeg_CopyToZbuffer.s,Jpeg_CopyToZbuffer,0x800F43BC,0x4E
asm/non_matchings/code/z_jpeg/Jpeg_GetUnalignedU16.s,Jpeg_GetUnalignedU16,0x800F44F4,0x13
@@ -1221,7 +1221,7 @@ asm/non_matchings/code/z_kanfont/Font_LoadCharNES.s,Font_LoadCharNES,0x800F4F54,
asm/non_matchings/code/z_kanfont/Font_LoadMessageBoxEndIcon.s,Font_LoadMessageBoxEndIcon,0x800F4FC0,0x11
asm/non_matchings/code/z_kanfont/Font_LoadOrderedFont.s,Font_LoadOrderedFont,0x800F5004,0x23
asm/non_matchings/code/z_kankyo/func_800F5090.s,func_800F5090,0x800F5090,0x11
-asm/non_matchings/code/z_kankyo/func_800F50D4.s,func_800F50D4,0x800F50D4,0xE
+asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s,Environment_ZBufValToFixedPoint,0x800F50D4,0xE
asm/non_matchings/code/z_kankyo/Environment_Init.s,Environment_Init,0x800F510C,0x212
asm/non_matchings/code/z_kankyo/func_800F5954.s,func_800F5954,0x800F5954,0x4E
asm/non_matchings/code/z_kankyo/Environment_LerpWeight.s,Environment_LerpWeight,0x800F5A8C,0x21
@@ -1586,17 +1586,17 @@ asm/non_matchings/code/z_olib/OLib_ClampMinDist.s,OLib_ClampMinDist,0x8010C304,0
asm/non_matchings/code/z_olib/OLib_ClampMaxDist.s,OLib_ClampMaxDist,0x8010C36C,0x1A
asm/non_matchings/code/z_olib/OLib_Vec3fDistNormalize.s,OLib_Vec3fDistNormalize,0x8010C3D4,0x2C
asm/non_matchings/code/z_olib/OLib_VecSphToVec3f.s,OLib_VecSphToVec3f,0x8010C484,0x2B
-asm/non_matchings/code/z_olib/OLib_VecSphGeoToVec3f.s,OLib_VecSphGeoToVec3f,0x8010C530,0x11
+asm/non_matchings/code/z_olib/OLib_VecGeoToVec3f.s,OLib_VecGeoToVec3f,0x8010C530,0x11
asm/non_matchings/code/z_olib/OLib_Vec3fToVecSph.s,OLib_Vec3fToVecSph,0x8010C574,0x55
-asm/non_matchings/code/z_olib/OLib_Vec3fToVecSphGeo.s,OLib_Vec3fToVecSphGeo,0x8010C6C8,0x12
+asm/non_matchings/code/z_olib/OLib_Vec3fToVecGeo.s,OLib_Vec3fToVecGeo,0x8010C6C8,0x12
asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecSph.s,OLib_Vec3fDiffToVecSph,0x8010C710,0x15
-asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecSphGeo.s,OLib_Vec3fDiffToVecSphGeo,0x8010C764,0x15
-asm/non_matchings/code/z_olib/OLib_VecSphAddToVec3f.s,OLib_VecSphAddToVec3f,0x8010C7B8,0x20
+asm/non_matchings/code/z_olib/OLib_Vec3fDiffToVecGeo.s,OLib_Vec3fDiffToVecGeo,0x8010C764,0x15
+asm/non_matchings/code/z_olib/OLib_AddVecGeoToVec3f.s,OLib_AddVecGeoToVec3f,0x8010C7B8,0x20
asm/non_matchings/code/z_olib/OLib_Vec3fDiffRad.s,OLib_Vec3fDiffRad,0x8010C838,0x24
asm/non_matchings/code/z_olib/OLib_Vec3fDiffDegF.s,OLib_Vec3fDiffDegF,0x8010C8C8,0x1A
asm/non_matchings/code/z_olib/OLib_Vec3fDiffBinAng.s,OLib_Vec3fDiffBinAng,0x8010C930,0x26
-asm/non_matchings/code/z_olib/OLib_DbCameraVec3fDiff.s,OLib_DbCameraVec3fDiff,0x8010C9C8,0x36
-asm/non_matchings/code/z_olib/OLib_DbCameraVec3fSum.s,OLib_DbCameraVec3fSum,0x8010CAA0,0x34
+asm/non_matchings/code/z_olib/OLib_Vec3fDiff.s,OLib_Vec3fDiff,0x8010C9C8,0x36
+asm/non_matchings/code/z_olib/OLib_Vec3fAdd.s,OLib_Vec3fAdd,0x8010CAA0,0x34
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectRGBA16.s,Gfx_DrawTexRectRGBA16,0x8010CB80,0x86
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectIA8.s,Gfx_DrawTexRectIA8,0x8010CD98,0x89
asm/non_matchings/code/z_parameter/Gfx_DrawTexRectIA8_DropShadow.s,Gfx_DrawTexRectIA8_DropShadow,0x8010CFBC,0xC6
@@ -1735,23 +1735,23 @@ asm/non_matchings/code/z_player_lib/Player_HasMirrorShieldEquipped.s,Player_HasM
asm/non_matchings/code/z_player_lib/Player_IsHoldingMirrorShield.s,Player_IsHoldingMirrorShield,0x80124088,0x10
asm/non_matchings/code/z_player_lib/Player_IsHoldingHookshot.s,Player_IsHoldingHookshot,0x801240C8,0x5
asm/non_matchings/code/z_player_lib/func_801240DC.s,func_801240DC,0x801240DC,0xD
-asm/non_matchings/code/z_player_lib/func_80124110.s,func_80124110,0x80124110,0xE
-asm/non_matchings/code/z_player_lib/func_80124148.s,func_80124148,0x80124148,0x8
-asm/non_matchings/code/z_player_lib/Player_ActionToMeleeWeapon.s,Player_ActionToMeleeWeapon,0x80124168,0xA
+asm/non_matchings/code/z_player_lib/Player_BButtonSwordFromIA.s,Player_BButtonSwordFromIA,0x80124110,0xE
+asm/non_matchings/code/z_player_lib/Player_GetHeldBButtonSword.s,Player_GetHeldBButtonSword,0x80124148,0x8
+asm/non_matchings/code/z_player_lib/Player_MeleeWeaponFromIA.s,Player_MeleeWeaponFromIA,0x80124168,0xA
asm/non_matchings/code/z_player_lib/Player_GetMeleeWeaponHeld.s,Player_GetMeleeWeaponHeld,0x80124190,0x9
asm/non_matchings/code/z_player_lib/Player_IsHoldingTwoHandedWeapon.s,Player_IsHoldingTwoHandedWeapon,0x801241B4,0xB
-asm/non_matchings/code/z_player_lib/Player_ActionToBottle.s,Player_ActionToBottle,0x801241E0,0xB
+asm/non_matchings/code/z_player_lib/Player_BottleFromIA.s,Player_BottleFromIA,0x801241E0,0xB
asm/non_matchings/code/z_player_lib/Player_GetBottleHeld.s,Player_GetBottleHeld,0x8012420C,0x8
-asm/non_matchings/code/z_player_lib/Player_ActionToExplosive.s,Player_ActionToExplosive,0x8012422C,0xB
+asm/non_matchings/code/z_player_lib/Player_ExplosiveFromIA.s,Player_ExplosiveFromIA,0x8012422C,0xB
asm/non_matchings/code/z_player_lib/Player_GetExplosiveHeld.s,Player_GetExplosiveHeld,0x80124258,0x8
-asm/non_matchings/code/z_player_lib/Player_ActionToSword.s,Player_ActionToSword,0x80124278,0xF
+asm/non_matchings/code/z_player_lib/Player_SwordFromIA.s,Player_SwordFromIA,0x80124278,0xF
asm/non_matchings/code/z_player_lib/func_801242B4.s,func_801242B4,0x801242B4,0xA
asm/non_matchings/code/z_player_lib/Player_GetEnvironmentalHazard.s,Player_GetEnvironmentalHazard,0x801242DC,0x51
-asm/non_matchings/code/z_player_lib/func_80124420.s,func_80124420,0x80124420,0x7E
+asm/non_matchings/code/z_player_lib/Player_UpdateBunnyEars.s,Player_UpdateBunnyEars,0x80124420,0x7E
asm/non_matchings/code/z_player_lib/func_80124618.s,func_80124618,0x80124618,0x37
asm/non_matchings/code/z_player_lib/Player_DrawImpl.s,Player_DrawImpl,0x801246F4,0x5F
-asm/non_matchings/code/z_player_lib/func_80124870.s,func_80124870,0x80124870,0x115
-asm/non_matchings/code/z_player_lib/func_80124CC4.s,func_80124CC4,0x80124CC4,0x95
+asm/non_matchings/code/z_player_lib/Player_AdjustSingleLeg.s,Player_AdjustSingleLeg,0x80124870,0x115
+asm/non_matchings/code/z_player_lib/Player_DrawHookshotReticle.s,Player_DrawHookshotReticle,0x80124CC4,0x95
asm/non_matchings/code/z_player_lib/func_80124F18.s,func_80124F18,0x80124F18,0x36
asm/non_matchings/code/z_player_lib/func_80124FF0.s,func_80124FF0,0x80124FF0,0x75
asm/non_matchings/code/z_player_lib/func_801251C4.s,func_801251C4,0x801251C4,0x55
@@ -1760,13 +1760,13 @@ asm/non_matchings/code/z_player_lib/func_80125340.s,func_80125340,0x80125340,0xB
asm/non_matchings/code/z_player_lib/func_8012536C.s,func_8012536C,0x8012536C,0xE
asm/non_matchings/code/z_player_lib/Player_DrawZoraShield.s,Player_DrawZoraShield,0x801253A4,0x57
asm/non_matchings/code/z_player_lib/func_80125500.s,func_80125500,0x80125500,0x20
-asm/non_matchings/code/z_player_lib/func_80125580.s,func_80125580,0x80125580,0x1D8
+asm/non_matchings/code/z_player_lib/Player_OverrideLimbDrawGameplayCommon.s,Player_OverrideLimbDrawGameplayCommon,0x80125580,0x1D8
asm/non_matchings/code/z_player_lib/func_80125CE0.s,func_80125CE0,0x80125CE0,0x1B
-asm/non_matchings/code/z_player_lib/func_80125D4C.s,func_80125D4C,0x80125D4C,0x15F
-asm/non_matchings/code/z_player_lib/func_801262C8.s,func_801262C8,0x801262C8,0x4D
-asm/non_matchings/code/z_player_lib/func_801263FC.s,func_801263FC,0x801263FC,0x11
+asm/non_matchings/code/z_player_lib/Player_OverrideLimbDrawGameplayDefault.s,Player_OverrideLimbDrawGameplayDefault,0x80125D4C,0x15F
+asm/non_matchings/code/z_player_lib/Player_OverrideLimbDrawGameplayFirstPerson.s,Player_OverrideLimbDrawGameplayFirstPerson,0x801262C8,0x4D
+asm/non_matchings/code/z_player_lib/Player_OverrideLimbDrawGameplayCrawling.s,Player_OverrideLimbDrawGameplayCrawling,0x801263FC,0x11
asm/non_matchings/code/z_player_lib/func_80126440.s,func_80126440,0x80126440,0x62
-asm/non_matchings/code/z_player_lib/func_801265C8.s,func_801265C8,0x801265C8,0x35
+asm/non_matchings/code/z_player_lib/Player_UpdateShieldCollider.s,Player_UpdateShieldCollider,0x801265C8,0x35
asm/non_matchings/code/z_player_lib/func_8012669C.s,func_8012669C,0x8012669C,0x5B
asm/non_matchings/code/z_player_lib/Player_DrawGetItemImpl.s,Player_DrawGetItemImpl,0x80126808,0x5D
asm/non_matchings/code/z_player_lib/Player_DrawGetItem.s,Player_DrawGetItem,0x8012697C,0x4E
@@ -1781,13 +1781,13 @@ asm/non_matchings/code/z_player_lib/Player_DrawCircusLeadersMask.s,Player_DrawCi
asm/non_matchings/code/z_player_lib/Player_DrawBlastMask.s,Player_DrawBlastMask,0x801278F8,0x5A
asm/non_matchings/code/z_player_lib/Player_DrawBunnyHood.s,Player_DrawBunnyHood,0x80127A60,0x41
asm/non_matchings/code/z_player_lib/func_80127B64.s,func_80127B64,0x80127B64,0x21
-asm/non_matchings/code/z_player_lib/func_80127BE8.s,func_80127BE8,0x80127BE8,0x6F
+asm/non_matchings/code/z_player_lib/Player_DrawStrayFairyParticles.s,Player_DrawStrayFairyParticles,0x80127BE8,0x6F
asm/non_matchings/code/z_player_lib/func_80127DA4.s,func_80127DA4,0x80127DA4,0x179
asm/non_matchings/code/z_player_lib/func_80128388.s,func_80128388,0x80128388,0x46
asm/non_matchings/code/z_player_lib/Player_DrawGreatFairysMask.s,Player_DrawGreatFairysMask,0x801284A0,0x68
asm/non_matchings/code/z_player_lib/func_80128640.s,func_80128640,0x80128640,0x14D
-asm/non_matchings/code/z_player_lib/func_80128B74.s,func_80128B74,0x80128B74,0x17
-asm/non_matchings/code/z_player_lib/func_80128BD0.s,func_80128BD0,0x80128BD0,0x4C8
+asm/non_matchings/code/z_player_lib/Player_SetFeetPos.s,Player_SetFeetPos,0x80128B74,0x17
+asm/non_matchings/code/z_player_lib/Player_PostLimbDrawGameplay.s,Player_PostLimbDrawGameplay,0x80128BD0,0x4C8
asm/non_matchings/code/z_prenmi/PreNMI_Stop.s,PreNMI_Stop,0x80129EF0,0x5
asm/non_matchings/code/z_prenmi/PreNMI_Update.s,PreNMI_Update,0x80129F04,0x12
asm/non_matchings/code/z_prenmi/PreNMI_Draw.s,PreNMI_Draw,0x80129F4C,0x2B
@@ -1803,97 +1803,97 @@ asm/non_matchings/code/z_quake/Quake_CallbackType3.s,Quake_CallbackType3,0x8012A
asm/non_matchings/code/z_quake/Quake_CallbackType2.s,Quake_CallbackType2,0x8012A4D0,0x1C
asm/non_matchings/code/z_quake/Quake_CallbackType4.s,Quake_CallbackType4,0x8012A540,0x26
asm/non_matchings/code/z_quake/Quake_GetFreeIndex.s,Quake_GetFreeIndex,0x8012A5D8,0x18
-asm/non_matchings/code/z_quake/Quake_AddImpl.s,Quake_AddImpl,0x8012A638,0x2E
-asm/non_matchings/code/z_quake/Quake_RemoveRequest.s,Quake_RemoveRequest,0x8012A6F0,0xA
+asm/non_matchings/code/z_quake/Quake_RequestImpl.s,Quake_RequestImpl,0x8012A638,0x2E
+asm/non_matchings/code/z_quake/Quake_Remove.s,Quake_Remove,0x8012A6F0,0xA
asm/non_matchings/code/z_quake/Quake_GetRequest.s,Quake_GetRequest,0x8012A718,0x17
asm/non_matchings/code/z_quake/Quake_SetValue.s,Quake_SetValue,0x8012A774,0x4D
asm/non_matchings/code/z_quake/Quake_SetSpeed.s,Quake_SetSpeed,0x8012A8A8,0x12
-asm/non_matchings/code/z_quake/Quake_SetCountdown.s,Quake_SetCountdown,0x8012A8F0,0x14
-asm/non_matchings/code/z_quake/Quake_GetCountdown.s,Quake_GetCountdown,0x8012A940,0xE
-asm/non_matchings/code/z_quake/Quake_SetQuakeValues.s,Quake_SetQuakeValues,0x8012A978,0x1A
-asm/non_matchings/code/z_quake/Quake_SetQuakeValues2.s,Quake_SetQuakeValues2,0x8012A9E0,0x1A
+asm/non_matchings/code/z_quake/Quake_SetDuration.s,Quake_SetDuration,0x8012A8F0,0x14
+asm/non_matchings/code/z_quake/Quake_GetTimeLeft.s,Quake_GetTimeLeft,0x8012A940,0xE
+asm/non_matchings/code/z_quake/Quake_SetPerturbations.s,Quake_SetPerturbations,0x8012A978,0x1A
+asm/non_matchings/code/z_quake/Quake_SetOrientation.s,Quake_SetOrientation,0x8012A9E0,0x1A
asm/non_matchings/code/z_quake/Quake_Init.s,Quake_Init,0x8012AA48,0x15
-asm/non_matchings/code/z_quake/Quake_Add.s,Quake_Add,0x8012AA9C,0x9
-asm/non_matchings/code/z_quake/Quake_Remove.s,Quake_Remove,0x8012AAC0,0x12
-asm/non_matchings/code/z_quake/Quake_Calc.s,Quake_Calc,0x8012AB08,0xD8
+asm/non_matchings/code/z_quake/Quake_Request.s,Quake_Request,0x8012AA9C,0x9
+asm/non_matchings/code/z_quake/Quake_RemoveRequest.s,Quake_RemoveRequest,0x8012AAC0,0x12
+asm/non_matchings/code/z_quake/Quake_Update.s,Quake_Update,0x8012AB08,0xD8
asm/non_matchings/code/z_quake/Distortion_Init.s,Distortion_Init,0x8012AE68,0x11
-asm/non_matchings/code/z_quake/Distortion_SetCountdown.s,Distortion_SetCountdown,0x8012AEAC,0xA
-asm/non_matchings/code/z_quake/Distortion_GetCountdown.s,Distortion_GetCountdown,0x8012AED4,0x4
+asm/non_matchings/code/z_quake/Distortion_SetDuration.s,Distortion_SetDuration,0x8012AEAC,0xA
+asm/non_matchings/code/z_quake/Distortion_GetTimeLeft.s,Distortion_GetTimeLeft,0x8012AED4,0x4
asm/non_matchings/code/z_quake/Distortion_GetType.s,Distortion_GetType,0x8012AEE4,0x4
-asm/non_matchings/code/z_quake/Distortion_SetType.s,Distortion_SetType,0x8012AEF4,0x9
-asm/non_matchings/code/z_quake/Distortion_ClearType.s,Distortion_ClearType,0x8012AF18,0x8
+asm/non_matchings/code/z_quake/Distortion_Request.s,Distortion_Request,0x8012AEF4,0x9
+asm/non_matchings/code/z_quake/Distortion_RemoveRequest.s,Distortion_RemoveRequest,0x8012AF18,0x8
asm/non_matchings/code/z_quake/Distortion_GetUnderwaterCurrentSpeed.s,Distortion_GetUnderwaterCurrentSpeed,0x8012AF38,0x19
asm/non_matchings/code/z_quake/Distortion_Update.s,Distortion_Update,0x8012AF9C,0x313
-asm/non_matchings/code/z_quake/Quake_NumActiveQuakes.s,Quake_NumActiveQuakes,0x8012BBE8,0x1A
+asm/non_matchings/code/z_quake/Quake_GetNumActiveQuakes.s,Quake_GetNumActiveQuakes,0x8012BBE8,0x1A
asm/non_matchings/code/z_rcp/Gfx_SetFog.s,Gfx_SetFog,0x8012BC50,0x4F
asm/non_matchings/code/z_rcp/Gfx_SetFogWithSync.s,Gfx_SetFogWithSync,0x8012BD8C,0x5F
asm/non_matchings/code/z_rcp/Gfx_SetFog2.s,Gfx_SetFog2,0x8012BF08,0xD
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDLImpl.s,Gfx_CallSetupDLImpl,0x8012BF3C,0xF
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDL.s,Gfx_CallSetupDL,0x8012BF78,0x8
-asm/non_matchings/code/z_rcp/Gfx_CallSetupDLAtPtr.s,Gfx_CallSetupDLAtPtr,0x8012BF98,0xB
-asm/non_matchings/code/z_rcp/func_8012BFC4.s,func_8012BFC4,0x8012BFC4,0xA
-asm/non_matchings/code/z_rcp/func_8012BFEC.s,func_8012BFEC,0x8012BFEC,0xA
-asm/non_matchings/code/z_rcp/func_8012C014.s,func_8012C014,0x8012C014,0x11
-asm/non_matchings/code/z_rcp/func_8012C058.s,func_8012C058,0x8012C058,0xA
-asm/non_matchings/code/z_rcp/func_8012C080.s,func_8012C080,0x8012C080,0xA
-asm/non_matchings/code/z_rcp/func_8012C0A8.s,func_8012C0A8,0x8012C0A8,0xA
-asm/non_matchings/code/z_rcp/func_8012C0D0.s,func_8012C0D0,0x8012C0D0,0xA
-asm/non_matchings/code/z_rcp/func_8012C0F8.s,func_8012C0F8,0x8012C0F8,0xA
-asm/non_matchings/code/z_rcp/func_8012C120.s,func_8012C120,0x8012C120,0xA
-asm/non_matchings/code/z_rcp/func_8012C148.s,func_8012C148,0x8012C148,0xA
-asm/non_matchings/code/z_rcp/func_8012C170.s,func_8012C170,0x8012C170,0xA
-asm/non_matchings/code/z_rcp/func_8012C198.s,func_8012C198,0x8012C198,0xA
-asm/non_matchings/code/z_rcp/func_8012C1C0.s,func_8012C1C0,0x8012C1C0,0xB
-asm/non_matchings/code/z_rcp/func_8012C1EC.s,func_8012C1EC,0x8012C1EC,0xA
-asm/non_matchings/code/z_rcp/func_8012C214.s,func_8012C214,0x8012C214,0xB
-asm/non_matchings/code/z_rcp/func_8012C240.s,func_8012C240,0x8012C240,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDLImpl.s,Gfx_SetupDLImpl,0x8012BF3C,0xF
+asm/non_matchings/code/z_rcp/Gfx_SetupDL.s,Gfx_SetupDL,0x8012BF78,0x8
+asm/non_matchings/code/z_rcp/Gfx_SetupDLAtPtr.s,Gfx_SetupDLAtPtr,0x8012BF98,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57.s,Gfx_SetupDL57,0x8012BFC4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57_b.s,Gfx_SetupDL57_b,0x8012BFEC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL52_NoCD.s,Gfx_SetupDL52_NoCD,0x8012C014,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL58_Opa.s,Gfx_SetupDL58_Opa,0x8012C058,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL57_Opa.s,Gfx_SetupDL57_Opa,0x8012C080,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL50_Opa.s,Gfx_SetupDL50_Opa,0x8012C0A8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL51_Opa.s,Gfx_SetupDL51_Opa,0x8012C0D0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL52_Xlu.s,Gfx_SetupDL52_Xlu,0x8012C0F8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL53_Opa.s,Gfx_SetupDL53_Opa,0x8012C120,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL54_Opa.s,Gfx_SetupDL54_Opa,0x8012C148,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL55_Xlu.s,Gfx_SetupDL55_Xlu,0x8012C170,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL26.s,Gfx_SetupDL26,0x8012C198,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL26_Opa.s,Gfx_SetupDL26_Opa,0x8012C1C0,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL23.s,Gfx_SetupDL23,0x8012C1EC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL23_Opa.s,Gfx_SetupDL23_Opa,0x8012C214,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Xlu2.s,Gfx_SetupDL25_Xlu2,0x8012C240,0xA
asm/non_matchings/code/z_rcp/func_8012C268.s,func_8012C268,0x8012C268,0x9
-asm/non_matchings/code/z_rcp/func_8012C28C.s,func_8012C28C,0x8012C28C,0xA
-asm/non_matchings/code/z_rcp/func_8012C2B4.s,func_8012C2B4,0x8012C2B4,0xA
-asm/non_matchings/code/z_rcp/func_8012C2DC.s,func_8012C2DC,0x8012C2DC,0xA
-asm/non_matchings/code/z_rcp/func_8012C304.s,func_8012C304,0x8012C304,0xA
-asm/non_matchings/code/z_rcp/func_8012C32C.s,func_8012C32C,0x8012C32C,0xA
-asm/non_matchings/code/z_rcp/func_8012C354.s,func_8012C354,0x8012C354,0xA
-asm/non_matchings/code/z_rcp/func_8012C37C.s,func_8012C37C,0x8012C37C,0xA
-asm/non_matchings/code/z_rcp/func_8012C3A4.s,func_8012C3A4,0x8012C3A4,0xA
-asm/non_matchings/code/z_rcp/func_8012C3CC.s,func_8012C3CC,0x8012C3CC,0xA
-asm/non_matchings/code/z_rcp/func_8012C3F4.s,func_8012C3F4,0x8012C3F4,0xB
-asm/non_matchings/code/z_rcp/func_8012C420.s,func_8012C420,0x8012C420,0xA
-asm/non_matchings/code/z_rcp/func_8012C448.s,func_8012C448,0x8012C448,0xA
-asm/non_matchings/code/z_rcp/func_8012C470.s,func_8012C470,0x8012C470,0xA
-asm/non_matchings/code/z_rcp/func_8012C498.s,func_8012C498,0x8012C498,0xA
-asm/non_matchings/code/z_rcp/func_8012C4C0.s,func_8012C4C0,0x8012C4C0,0xA
-asm/non_matchings/code/z_rcp/func_8012C4E8.s,func_8012C4E8,0x8012C4E8,0xA
-asm/non_matchings/code/z_rcp/func_8012C510.s,func_8012C510,0x8012C510,0xA
-asm/non_matchings/code/z_rcp/func_8012C538.s,func_8012C538,0x8012C538,0xA
-asm/non_matchings/code/z_rcp/func_8012C560.s,func_8012C560,0x8012C560,0xA
-asm/non_matchings/code/z_rcp/func_8012C588.s,func_8012C588,0x8012C588,0xA
-asm/non_matchings/code/z_rcp/func_8012C5B0.s,func_8012C5B0,0x8012C5B0,0xA
-asm/non_matchings/code/z_rcp/func_8012C5D8.s,func_8012C5D8,0x8012C5D8,0xA
-asm/non_matchings/code/z_rcp/func_8012C600.s,func_8012C600,0x8012C600,0xA
-asm/non_matchings/code/z_rcp/func_8012C628.s,func_8012C628,0x8012C628,0xB
-asm/non_matchings/code/z_rcp/func_8012C654.s,func_8012C654,0x8012C654,0xB
-asm/non_matchings/code/z_rcp/func_8012C680.s,func_8012C680,0x8012C680,0xB
-asm/non_matchings/code/z_rcp/func_8012C6AC.s,func_8012C6AC,0x8012C6AC,0xA
-asm/non_matchings/code/z_rcp/func_8012C6D4.s,func_8012C6D4,0x8012C6D4,0xA
-asm/non_matchings/code/z_rcp/func_8012C6FC.s,func_8012C6FC,0x8012C6FC,0xA
-asm/non_matchings/code/z_rcp/func_8012C724.s,func_8012C724,0x8012C724,0xA
-asm/non_matchings/code/z_rcp/func_8012C74C.s,func_8012C74C,0x8012C74C,0xA
-asm/non_matchings/code/z_rcp/func_8012C774.s,func_8012C774,0x8012C774,0x11
-asm/non_matchings/code/z_rcp/func_8012C7B8.s,func_8012C7B8,0x8012C7B8,0x11
-asm/non_matchings/code/z_rcp/func_8012C7FC.s,func_8012C7FC,0x8012C7FC,0x11
-asm/non_matchings/code/z_rcp/func_8012C840.s,func_8012C840,0x8012C840,0xA
-asm/non_matchings/code/z_rcp/func_8012C868.s,func_8012C868,0x8012C868,0x11
-asm/non_matchings/code/z_rcp/func_8012C8AC.s,func_8012C8AC,0x8012C8AC,0xA
-asm/non_matchings/code/z_rcp/func_8012C8D4.s,func_8012C8D4,0x8012C8D4,0xA
-asm/non_matchings/code/z_rcp/func_8012C8FC.s,func_8012C8FC,0x8012C8FC,0xA
-asm/non_matchings/code/z_rcp/func_8012C924.s,func_8012C924,0x8012C924,0xA
-asm/non_matchings/code/z_rcp/func_8012C94C.s,func_8012C94C,0x8012C94C,0xA
-asm/non_matchings/code/z_rcp/func_8012C974.s,func_8012C974,0x8012C974,0x12
-asm/non_matchings/code/z_rcp/func_8012C9BC.s,func_8012C9BC,0x8012C9BC,0xA
-asm/non_matchings/code/z_rcp/func_8012C9E4.s,func_8012C9E4,0x8012C9E4,0xA
-asm/non_matchings/code/z_rcp/func_8012CA0C.s,func_8012CA0C,0x8012CA0C,0xB
-asm/non_matchings/code/z_rcp/func_8012CA38.s,func_8012CA38,0x8012CA38,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Opa.s,Gfx_SetupDL25_Opa,0x8012C28C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL71.s,Gfx_SetupDL71,0x8012C2B4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL25_Xlu.s,Gfx_SetupDL25_Xlu,0x8012C2DC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL72.s,Gfx_SetupDL72,0x8012C304,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL31_Opa.s,Gfx_SetupDL31_Opa,0x8012C32C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL32_Opa.s,Gfx_SetupDL32_Opa,0x8012C354,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL33_Opa.s,Gfx_SetupDL33_Opa,0x8012C37C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL64.s,Gfx_SetupDL64,0x8012C3A4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL34.s,Gfx_SetupDL34,0x8012C3CC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL34_Opa.s,Gfx_SetupDL34_Opa,0x8012C3F4,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL35_Opa.s,Gfx_SetupDL35_Opa,0x8012C420,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL44_Xlu.s,Gfx_SetupDL44_Xlu,0x8012C448,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL36_Opa.s,Gfx_SetupDL36_Opa,0x8012C470,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL28.s,Gfx_SetupDL28,0x8012C498,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL28_Opa.s,Gfx_SetupDL28_Opa,0x8012C4C0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL43_Opa.s,Gfx_SetupDL43_Opa,0x8012C4E8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL45_Opa.s,Gfx_SetupDL45_Opa,0x8012C510,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL46_Overlay.s,Gfx_SetupDL46_Overlay,0x8012C538,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL38_Xlu.s,Gfx_SetupDL38_Xlu,0x8012C560,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL4_Xlu.s,Gfx_SetupDL4_Xlu,0x8012C588,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL37_Opa.s,Gfx_SetupDL37_Opa,0x8012C5B0,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL2_Opa.s,Gfx_SetupDL2_Opa,0x8012C5D8,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39.s,Gfx_SetupDL39,0x8012C600,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Opa.s,Gfx_SetupDL39_Opa,0x8012C628,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Overlay.s,Gfx_SetupDL39_Overlay,0x8012C654,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL39_Ptr.s,Gfx_SetupDL39_Ptr,0x8012C680,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL40_Opa.s,Gfx_SetupDL40_Opa,0x8012C6AC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL41_Opa.s,Gfx_SetupDL41_Opa,0x8012C6D4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL47_Xlu.s,Gfx_SetupDL47_Xlu,0x8012C6FC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL66.s,Gfx_SetupDL66,0x8012C724,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL67.s,Gfx_SetupDL67,0x8012C74C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL68_NoCD.s,Gfx_SetupDL68_NoCD,0x8012C774,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL69_NoCD.s,Gfx_SetupDL69_NoCD,0x8012C7B8,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL65_NoCD.s,Gfx_SetupDL65_NoCD,0x8012C7FC,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL70.s,Gfx_SetupDL70,0x8012C840,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL20_NoCD.s,Gfx_SetupDL20_NoCD,0x8012C868,0x11
+asm/non_matchings/code/z_rcp/Gfx_SetupDL42_Opa.s,Gfx_SetupDL42_Opa,0x8012C8AC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL42_Overlay.s,Gfx_SetupDL42_Overlay,0x8012C8D4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL48_Opa.s,Gfx_SetupDL48_Opa,0x8012C8FC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL49_Xlu.s,Gfx_SetupDL49_Xlu,0x8012C924,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL27_Xlu.s,Gfx_SetupDL27_Xlu,0x8012C94C,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL60_XluNoCD.s,Gfx_SetupDL60_XluNoCD,0x8012C974,0x12
+asm/non_matchings/code/z_rcp/Gfx_SetupDL61_Xlu.s,Gfx_SetupDL61_Xlu,0x8012C9BC,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL56_Opa.s,Gfx_SetupDL56_Opa,0x8012C9E4,0xA
+asm/non_matchings/code/z_rcp/Gfx_SetupDL56_Ptr.s,Gfx_SetupDL56_Ptr,0x8012CA0C,0xB
+asm/non_matchings/code/z_rcp/Gfx_SetupDL59_Opa.s,Gfx_SetupDL59_Opa,0x8012CA38,0xA
asm/non_matchings/code/z_rcp/Gfx_BranchTexScroll.s,Gfx_BranchTexScroll,0x8012CA60,0x29
asm/non_matchings/code/z_rcp/func_8012CB04.s,func_8012CB04,0x8012CB04,0x9
asm/non_matchings/code/z_rcp/func_8012CB28.s,func_8012CB28,0x8012CB28,0x9
@@ -1961,8 +1961,8 @@ asm/non_matchings/code/z_scene/Scene_Command09.s,Scene_Command09,0x801303D0,0x4
asm/non_matchings/code/z_scene/Scene_CommandSoundSettings.s,Scene_CommandSoundSettings,0x801303E0,0x17
asm/non_matchings/code/z_scene/Scene_CommandEchoSetting.s,Scene_CommandEchoSetting,0x8013043C,0x6
asm/non_matchings/code/z_scene/Scene_CommandAltHeaderList.s,Scene_CommandAltHeaderList,0x80130454,0x1E
-asm/non_matchings/code/z_scene/Scene_CommandCutsceneList.s,Scene_CommandCutsceneList,0x801304CC,0xD
-asm/non_matchings/code/z_scene/Scene_CommandActorCutsceneList.s,Scene_CommandActorCutsceneList,0x80130500,0x10
+asm/non_matchings/code/z_scene/Scene_CommandCutsceneScriptList.s,Scene_CommandCutsceneScriptList,0x801304CC,0xD
+asm/non_matchings/code/z_scene/Scene_CommandCutsceneList.s,Scene_CommandCutsceneList,0x80130500,0x10
asm/non_matchings/code/z_scene/Scene_CommandMiniMap.s,Scene_CommandMiniMap,0x80130540,0xE
asm/non_matchings/code/z_scene/Scene_Command1D.s,Scene_Command1D,0x80130578,0x4
asm/non_matchings/code/z_scene/Scene_CommandMiniMapCompassInfo.s,Scene_CommandMiniMapCompassInfo,0x80130588,0xA
@@ -2051,7 +2051,7 @@ asm/non_matchings/code/z_skelanime/SkelAnime_Draw.s,SkelAnime_Draw,0x80134990,0x
asm/non_matchings/code/z_skelanime/SkelAnime_DrawLimbSV2.s,SkelAnime_DrawLimbSV2,0x80134B54,0x9A
asm/non_matchings/code/z_skelanime/SkelAnime_DrawFlex.s,SkelAnime_DrawFlex,0x80134DBC,0x90
asm/non_matchings/code/z_skelanime/SkelAnime_GetFrameData2.s,SkelAnime_GetFrameData2,0x80134FFC,0xF6
-asm/non_matchings/code/z_skelanime/Animation_GetLimbCount2.s,Animation_GetLimbCount2,0x801353D4,0x9
+asm/non_matchings/code/z_skelanime/Animation_GetLimbCountLegacy.s,Animation_GetLimbCountLegacy,0x801353D4,0x9
asm/non_matchings/code/z_skelanime/SkelAnime_GetTotalFrames2.s,SkelAnime_GetTotalFrames2,0x801353F8,0x9
asm/non_matchings/code/z_skelanime/SkelAnime_GetFrameCount2.s,SkelAnime_GetFrameCount2,0x8013541C,0xB
asm/non_matchings/code/z_skelanime/SkelAnime_InterpFrameTable.s,SkelAnime_InterpFrameTable,0x80135448,0x120
@@ -2072,29 +2072,29 @@ asm/non_matchings/code/z_skelanime/AnimationContext_CopyTrue.s,AnimationContext_
asm/non_matchings/code/z_skelanime/AnimationContext_CopyFalse.s,AnimationContext_CopyFalse,0x80135DB8,0x21
asm/non_matchings/code/z_skelanime/AnimationContext_MoveActor.s,AnimationContext_MoveActor,0x80135E3C,0x2B
asm/non_matchings/code/z_skelanime/AnimationContext_Update.s,AnimationContext_Update,0x80135EE8,0x28
-asm/non_matchings/code/z_skelanime/SkelAnime_InitLinkAnimetion.s,SkelAnime_InitLinkAnimetion,0x80135F88,0x48
-asm/non_matchings/code/z_skelanime/LinkAnimation_SetUpdateFunction.s,LinkAnimation_SetUpdateFunction,0x801360A8,0xE
-asm/non_matchings/code/z_skelanime/LinkAnimation_Update.s,LinkAnimation_Update,0x801360E0,0x9
-asm/non_matchings/code/z_skelanime/LinkAnimation_Morph.s,LinkAnimation_Morph,0x80136104,0x2E
-asm/non_matchings/code/z_skelanime/LinkAnimation_AnimateFrame.s,LinkAnimation_AnimateFrame,0x801361BC,0x33
-asm/non_matchings/code/z_skelanime/LinkAnimation_Loop.s,LinkAnimation_Loop,0x80136288,0x25
-asm/non_matchings/code/z_skelanime/LinkAnimation_Once.s,LinkAnimation_Once,0x8013631C,0x35
+asm/non_matchings/code/z_skelanime/SkelAnime_InitPlayerAnimetion.s,SkelAnime_InitPlayerAnimetion,0x80135F88,0x48
+asm/non_matchings/code/z_skelanime/PlayerAnimation_SetUpdateFunction.s,PlayerAnimation_SetUpdateFunction,0x801360A8,0xE
+asm/non_matchings/code/z_skelanime/PlayerAnimation_Update.s,PlayerAnimation_Update,0x801360E0,0x9
+asm/non_matchings/code/z_skelanime/PlayerAnimation_Morph.s,PlayerAnimation_Morph,0x80136104,0x2E
+asm/non_matchings/code/z_skelanime/PlayerAnimation_AnimateFrame.s,PlayerAnimation_AnimateFrame,0x801361BC,0x33
+asm/non_matchings/code/z_skelanime/PlayerAnimation_Loop.s,PlayerAnimation_Loop,0x80136288,0x25
+asm/non_matchings/code/z_skelanime/PlayerAnimation_Once.s,PlayerAnimation_Once,0x8013631C,0x35
asm/non_matchings/code/z_skelanime/Animation_SetMorph.s,Animation_SetMorph,0x801363F0,0x9
-asm/non_matchings/code/z_skelanime/LinkAnimation_Change.s,LinkAnimation_Change,0x80136414,0x5E
-asm/non_matchings/code/z_skelanime/LinkAnimation_ChangeDefaultStop.s,LinkAnimation_ChangeDefaultStop,0x8013658C,0x18
-asm/non_matchings/code/z_skelanime/LinkAnimation_ChangePlaybackStop.s,LinkAnimation_ChangePlaybackStop,0x801365EC,0x19
-asm/non_matchings/code/z_skelanime/LinkAnimation_ChangeDefaultRepeat.s,LinkAnimation_ChangeDefaultRepeat,0x80136650,0x17
-asm/non_matchings/code/z_skelanime/LinkAnimation_ChangePlaybackRepeat.s,LinkAnimation_ChangePlaybackRepeat,0x801366AC,0x18
-asm/non_matchings/code/z_skelanime/LinkAnimation_CopyJointToMorph.s,LinkAnimation_CopyJointToMorph,0x8013670C,0xC
-asm/non_matchings/code/z_skelanime/LinkAnimation_CopyMorphToJoint.s,LinkAnimation_CopyMorphToJoint,0x8013673C,0xC
-asm/non_matchings/code/z_skelanime/LinkAnimation_LoadToMorph.s,LinkAnimation_LoadToMorph,0x8013676C,0x11
-asm/non_matchings/code/z_skelanime/LinkAnimation_LoadToJoint.s,LinkAnimation_LoadToJoint,0x801367B0,0x11
-asm/non_matchings/code/z_skelanime/LinkAnimation_InterpJointMorph.s,LinkAnimation_InterpJointMorph,0x801367F4,0xE
-asm/non_matchings/code/z_skelanime/LinkAnimation_BlendToJoint.s,LinkAnimation_BlendToJoint,0x8013682C,0x28
-asm/non_matchings/code/z_skelanime/LinkAnimation_BlendToMorph.s,LinkAnimation_BlendToMorph,0x801368CC,0x28
-asm/non_matchings/code/z_skelanime/LinkAnimation_EndLoop.s,LinkAnimation_EndLoop,0x8013696C,0x9
+asm/non_matchings/code/z_skelanime/PlayerAnimation_Change.s,PlayerAnimation_Change,0x80136414,0x5E
+asm/non_matchings/code/z_skelanime/PlayerAnimation_ChangeDefaultStop.s,PlayerAnimation_ChangeDefaultStop,0x8013658C,0x18
+asm/non_matchings/code/z_skelanime/PlayerAnimation_ChangePlaybackStop.s,PlayerAnimation_ChangePlaybackStop,0x801365EC,0x19
+asm/non_matchings/code/z_skelanime/PlayerAnimation_ChangeDefaultRepeat.s,PlayerAnimation_ChangeDefaultRepeat,0x80136650,0x17
+asm/non_matchings/code/z_skelanime/PlayerAnimation_ChangePlaybackRepeat.s,PlayerAnimation_ChangePlaybackRepeat,0x801366AC,0x18
+asm/non_matchings/code/z_skelanime/PlayerAnimation_CopyJointToMorph.s,PlayerAnimation_CopyJointToMorph,0x8013670C,0xC
+asm/non_matchings/code/z_skelanime/PlayerAnimation_CopyMorphToJoint.s,PlayerAnimation_CopyMorphToJoint,0x8013673C,0xC
+asm/non_matchings/code/z_skelanime/PlayerAnimation_LoadToMorph.s,PlayerAnimation_LoadToMorph,0x8013676C,0x11
+asm/non_matchings/code/z_skelanime/PlayerAnimation_LoadToJoint.s,PlayerAnimation_LoadToJoint,0x801367B0,0x11
+asm/non_matchings/code/z_skelanime/PlayerAnimation_InterpJointMorph.s,PlayerAnimation_InterpJointMorph,0x801367F4,0xE
+asm/non_matchings/code/z_skelanime/PlayerAnimation_BlendToJoint.s,PlayerAnimation_BlendToJoint,0x8013682C,0x28
+asm/non_matchings/code/z_skelanime/PlayerAnimation_BlendToMorph.s,PlayerAnimation_BlendToMorph,0x801368CC,0x28
+asm/non_matchings/code/z_skelanime/PlayerAnimation_EndLoop.s,PlayerAnimation_EndLoop,0x8013696C,0x9
asm/non_matchings/code/z_skelanime/Animation_OnFrameImpl.s,Animation_OnFrameImpl,0x80136990,0x2E
-asm/non_matchings/code/z_skelanime/LinkAnimation_OnFrame.s,LinkAnimation_OnFrame,0x80136A48,0xD
+asm/non_matchings/code/z_skelanime/PlayerAnimation_OnFrame.s,PlayerAnimation_OnFrame,0x80136A48,0xD
asm/non_matchings/code/z_skelanime/SkelAnime_Init.s,SkelAnime_Init,0x80136A7C,0x2D
asm/non_matchings/code/z_skelanime/SkelAnime_InitFlex.s,SkelAnime_InitFlex,0x80136B30,0x2F
asm/non_matchings/code/z_skelanime/SkelAnime_InitSkin.s,SkelAnime_InitSkin,0x80136BEC,0x26
@@ -2215,7 +2215,7 @@ asm/non_matchings/code/z_sub_s/SubS_ActorPathing_MoveWithGravity.s,SubS_ActorPat
asm/non_matchings/code/z_sub_s/SubS_ActorPathing_MoveWithoutGravityReverse.s,SubS_ActorPathing_MoveWithoutGravityReverse,0x8013E07C,0xA
asm/non_matchings/code/z_sub_s/SubS_ActorPathing_SetNextPoint.s,SubS_ActorPathing_SetNextPoint,0x8013E0A4,0x49
asm/non_matchings/code/z_sub_s/SubS_ChangeAnimationBySpeedInfo.s,SubS_ChangeAnimationBySpeedInfo,0x8013E1C8,0x43
-asm/non_matchings/code/z_sub_s/SubS_StartActorCutscene.s,SubS_StartActorCutscene,0x8013E2D4,0x39
+asm/non_matchings/code/z_sub_s/SubS_StartCutscene.s,SubS_StartCutscene,0x8013E2D4,0x39
asm/non_matchings/code/z_sub_s/SubS_FillCutscenesList.s,SubS_FillCutscenesList,0x8013E3B8,0x3E
asm/non_matchings/code/z_sub_s/SubS_ConstructPlane.s,SubS_ConstructPlane,0x8013E4B0,0x47
asm/non_matchings/code/z_sub_s/SubS_LineSegVsPlane.s,SubS_LineSegVsPlane,0x8013E5CC,0x1D
@@ -2270,9 +2270,9 @@ asm/non_matchings/code/z_vimode/func_80140898.s,func_80140898,0x80140898,0x1A
asm/non_matchings/code/z_vimode/func_80140900.s,func_80140900,0x80140900,0x3
asm/non_matchings/code/z_vimode/func_8014090C.s,func_8014090C,0x8014090C,0x19
asm/non_matchings/code/z_vimode/func_80140970.s,func_80140970,0x80140970,0xDC
-asm/non_matchings/code/z_vimode/func_80140CE0.s,func_80140CE0,0x80140CE0,0x9
-asm/non_matchings/code/z_vimode/func_80140D04.s,func_80140D04,0x80140D04,0x3
-asm/non_matchings/code/z_vimode/func_80140D10.s,func_80140D10,0x80140D10,0x5C
+asm/non_matchings/code/z_vimode/VisCvg_Init.s,VisCvg_Init,0x80140CE0,0x9
+asm/non_matchings/code/z_vimode/VisCvg_Destroy.s,VisCvg_Destroy,0x80140D04,0x3
+asm/non_matchings/code/z_vimode/VisCvg_Draw.s,VisCvg_Draw,0x80140D10,0x5C
asm/non_matchings/code/code_80140E80/func_80140E80.s,func_80140E80,0x80140E80,0x8
asm/non_matchings/code/code_80140E80/func_80140EA0.s,func_80140EA0,0x80140EA0,0x3
asm/non_matchings/code/code_80140E80/func_80140EAC.s,func_80140EAC,0x80140EAC,0x57
@@ -2289,9 +2289,9 @@ asm/non_matchings/code/z_vismono/VisMono_DesaturateTLUT.s,VisMono_DesaturateTLUT
asm/non_matchings/code/z_vismono/VisMono_DesaturateDList.s,VisMono_DesaturateDList,0x80141C34,0x8B
asm/non_matchings/code/z_vismono/VisMono_Draw.s,VisMono_Draw,0x80141E60,0x7B
asm/non_matchings/code/z_vismono/VisMono_DrawOld.s,VisMono_DrawOld,0x8014204C,0x1D
-asm/non_matchings/code/code_801420C0/func_801420C0.s,func_801420C0,0x801420C0,0xD
-asm/non_matchings/code/code_801420C0/func_801420F4.s,func_801420F4,0x801420F4,0x3
-asm/non_matchings/code/code_801420C0/func_80142100.s,func_80142100,0x80142100,0xD0
+asm/non_matchings/code/z_viszbuf/VisZbuf_Init.s,VisZbuf_Init,0x801420C0,0xD
+asm/non_matchings/code/z_viszbuf/VisZbuf_Destroy.s,VisZbuf_Destroy,0x801420F4,0x3
+asm/non_matchings/code/z_viszbuf/VisZbuf_Draw.s,VisZbuf_Draw,0x80142100,0xD0
asm/non_matchings/code/z_vr_box/func_80142440.s,func_80142440,0x80142440,0x342
asm/non_matchings/code/z_vr_box/func_80143148.s,func_80143148,0x80143148,0x28
asm/non_matchings/code/z_vr_box/Skybox_Setup.s,Skybox_Setup,0x801431E8,0x4F
@@ -2311,26 +2311,26 @@ asm/non_matchings/code/z_sram_NES/Sram_ResetSave.s,Sram_ResetSave,0x80144628,0x1
asm/non_matchings/code/z_sram_NES/Sram_GenerateRandomSaveFields.s,Sram_GenerateRandomSaveFields,0x80144684,0x83
asm/non_matchings/code/z_sram_NES/func_80144890.s,func_80144890,0x80144890,0x36
asm/non_matchings/code/z_sram_NES/Sram_InitDebugSave.s,Sram_InitDebugSave,0x80144968,0x4B
-asm/non_matchings/code/z_sram_NES/func_80144A94.s,func_80144A94,0x80144A94,0xF9
+asm/non_matchings/code/z_sram_NES/Sram_ResetSaveFromMoonCrash.s,Sram_ResetSaveFromMoonCrash,0x80144A94,0xF9
asm/non_matchings/code/z_sram_NES/Sram_OpenSave.s,Sram_OpenSave,0x80144E78,0x17D
asm/non_matchings/code/z_sram_NES/func_8014546C.s,func_8014546C,0x8014546C,0x8B
asm/non_matchings/code/z_sram_NES/func_80145698.s,func_80145698,0x80145698,0x4D
asm/non_matchings/code/z_sram_NES/func_801457CC.s,func_801457CC,0x801457CC,0x36D
-asm/non_matchings/code/z_sram_NES/func_80146580.s,func_80146580,0x80146580,0x2A
-asm/non_matchings/code/z_sram_NES/func_80146628.s,func_80146628,0x80146628,0x11E
+asm/non_matchings/code/z_sram_NES/Sram_EraseSave.s,Sram_EraseSave,0x80146580,0x2A
+asm/non_matchings/code/z_sram_NES/Sram_CopySave.s,Sram_CopySave,0x80146628,0x11E
asm/non_matchings/code/z_sram_NES/Sram_InitSave.s,Sram_InitSave,0x80146AA0,0xD6
-asm/non_matchings/code/z_sram_NES/func_80146DF8.s,func_80146DF8,0x80146DF8,0x12
+asm/non_matchings/code/z_sram_NES/Sram_WriteSaveOptionsToBuffer.s,Sram_WriteSaveOptionsToBuffer,0x80146DF8,0x12
asm/non_matchings/code/z_sram_NES/Sram_InitSram.s,Sram_InitSram,0x80146E40,0xC
asm/non_matchings/code/z_sram_NES/Sram_Alloc.s,Sram_Alloc,0x80146E70,0x13
-asm/non_matchings/code/z_sram_NES/func_80146EBC.s,func_80146EBC,0x80146EBC,0xB
+asm/non_matchings/code/z_sram_NES/Sram_SyncWriteToFlash.s,Sram_SyncWriteToFlash,0x80146EBC,0xB
asm/non_matchings/code/z_sram_NES/Sram_SaveSpecialEnterClockTown.s,Sram_SaveSpecialEnterClockTown,0x80146EE8,0x1D
asm/non_matchings/code/z_sram_NES/Sram_SaveSpecialNewDay.s,Sram_SaveSpecialNewDay,0x80146F5C,0x2B
-asm/non_matchings/code/z_sram_NES/func_80147008.s,func_80147008,0x80147008,0x6
-asm/non_matchings/code/z_sram_NES/func_80147020.s,func_80147020,0x80147020,0x12
-asm/non_matchings/code/z_sram_NES/func_80147068.s,func_80147068,0x80147068,0x34
-asm/non_matchings/code/z_sram_NES/func_80147138.s,func_80147138,0x80147138,0x6
-asm/non_matchings/code/z_sram_NES/func_80147150.s,func_80147150,0x80147150,0x12
-asm/non_matchings/code/z_sram_NES/func_80147198.s,func_80147198,0x80147198,0x5F
+asm/non_matchings/code/z_sram_NES/Sram_SetFlashPagesDefault.s,Sram_SetFlashPagesDefault,0x80147008,0x6
+asm/non_matchings/code/z_sram_NES/Sram_StartWriteToFlashDefault.s,Sram_StartWriteToFlashDefault,0x80147020,0x12
+asm/non_matchings/code/z_sram_NES/Sram_UpdateWriteToFlashDefault.s,Sram_UpdateWriteToFlashDefault,0x80147068,0x34
+asm/non_matchings/code/z_sram_NES/Sram_SetFlashPagesOwlSave.s,Sram_SetFlashPagesOwlSave,0x80147138,0x6
+asm/non_matchings/code/z_sram_NES/Sram_StartWriteToFlashOwlSave.s,Sram_StartWriteToFlashOwlSave,0x80147150,0x12
+asm/non_matchings/code/z_sram_NES/Sram_UpdateWriteToFlashOwlSave.s,Sram_UpdateWriteToFlashOwlSave,0x80147198,0x5F
asm/non_matchings/code/z_sram_NES/func_80147314.s,func_80147314,0x80147314,0x40
asm/non_matchings/code/z_sram_NES/func_80147414.s,func_80147414,0x80147414,0x3E
asm/non_matchings/code/z_sram_NES/Sram_nop8014750C.s,Sram_nop8014750C,0x8014750C,0x5
@@ -2369,7 +2369,7 @@ asm/non_matchings/code/z_message/func_801514B0.s,func_801514B0,0x801514B0,0x100
asm/non_matchings/code/z_message/Message_StartTextbox.s,Message_StartTextbox,0x801518B0,0x22
asm/non_matchings/code/z_message/Message_ContinueTextbox.s,Message_ContinueTextbox,0x80151938,0x4C
asm/non_matchings/code/z_message/func_80151A68.s,func_80151A68,0x80151A68,0x53
-asm/non_matchings/code/z_message/func_80151BB4.s,func_80151BB4,0x80151BB4,0x3A
+asm/non_matchings/code/z_message/Message_BombersNotebookQueueEvent.s,Message_BombersNotebookQueueEvent,0x80151BB4,0x3A
asm/non_matchings/code/z_message/func_80151C9C.s,func_80151C9C,0x80151C9C,0x42
asm/non_matchings/code/z_message/func_80151DA4.s,func_80151DA4,0x80151DA4,0x1A4
asm/non_matchings/code/z_message/func_80152434.s,func_80152434,0x80152434,0xC
@@ -2418,27 +2418,27 @@ asm/non_matchings/code/z_shrink_window/ShrinkWindow_Init.s,ShrinkWindow_Init,0x8
asm/non_matchings/code/z_shrink_window/ShrinkWindow_Destroy.s,ShrinkWindow_Destroy,0x80160CD4,0x4
asm/non_matchings/code/z_shrink_window/ShrinkWindow_Update.s,ShrinkWindow_Update,0x80160CE4,0x2D
asm/non_matchings/code/z_shrink_window/ShrinkWindow_Draw.s,ShrinkWindow_Draw,0x80160D98,0xFA
-asm/non_matchings/code/db_camera/func_80161180.s,func_80161180,0x80161180,0x7
-asm/non_matchings/code/db_camera/func_8016119C.s,func_8016119C,0x8016119C,0x24
-asm/non_matchings/code/db_camera/func_8016122C.s,func_8016122C,0x8016122C,0x23
-asm/non_matchings/code/db_camera/func_801612B8.s,func_801612B8,0x801612B8,0x1B8
-asm/non_matchings/code/db_camera/func_80161998.s,func_80161998,0x80161998,0x85
-asm/non_matchings/code/db_camera/func_80161BAC.s,func_80161BAC,0x80161BAC,0xD
-asm/non_matchings/code/db_camera/func_80161BE0.s,func_80161BE0,0x80161BE0,0xB
-asm/non_matchings/code/db_camera/func_80161C0C.s,func_80161C0C,0x80161C0C,0x5
-asm/non_matchings/code/db_camera/func_80161C20.s,func_80161C20,0x80161C20,0x8B
-asm/non_matchings/code/db_camera/func_80161E4C.s,func_80161E4C,0x80161E4C,0xA0
-asm/non_matchings/code/db_camera/func_801620CC.s,func_801620CC,0x801620CC,0xAC
-asm/non_matchings/code/db_camera/func_8016237C.s,func_8016237C,0x8016237C,0x1A
-asm/non_matchings/code/db_camera/func_801623E4.s,func_801623E4,0x801623E4,0x42
-asm/non_matchings/code/db_camera/func_801624EC.s,func_801624EC,0x801624EC,0x14
-asm/non_matchings/code/db_camera/func_8016253C.s,func_8016253C,0x8016253C,0x120
-asm/non_matchings/code/db_camera/func_801629BC.s,func_801629BC,0x801629BC,0x25
-asm/non_matchings/code/db_camera/func_80162A50.s,func_80162A50,0x80162A50,0x16A
-asm/non_matchings/code/db_camera/func_80162FF8.s,func_80162FF8,0x80162FF8,0x79
-asm/non_matchings/code/db_camera/func_801631DC.s,func_801631DC,0x801631DC,0x56
-asm/non_matchings/code/db_camera/func_80163334.s,func_80163334,0x80163334,0xCB
-asm/non_matchings/code/db_camera/func_80163660.s,func_80163660,0x80163660,0x28
+asm/non_matchings/code/cutscene_camera/func_80161180.s,func_80161180,0x80161180,0x7
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_Init.s,CutsceneCamera_Init,0x8016119C,0x24
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_Interpolate.s,CutsceneCamera_Interpolate,0x8016122C,0x23
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_ProcessSpline.s,CutsceneCamera_ProcessSpline,0x801612B8,0x1B8
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_UpdateSplines.s,CutsceneCamera_UpdateSplines,0x80161998,0x85
+asm/non_matchings/code/cutscene_camera/func_80161BAC.s,func_80161BAC,0x80161BAC,0xD
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_SetState.s,CutsceneCamera_SetState,0x80161BE0,0xB
+asm/non_matchings/code/cutscene_camera/CutsceneCamera_Reset.s,CutsceneCamera_Reset,0x80161C0C,0x5
+asm/non_matchings/code/cutscene_camera/func_80161C20.s,func_80161C20,0x80161C20,0x8B
+asm/non_matchings/code/cutscene_camera/func_80161E4C.s,func_80161E4C,0x80161E4C,0xA0
+asm/non_matchings/code/cutscene_camera/func_801620CC.s,func_801620CC,0x801620CC,0xAC
+asm/non_matchings/code/cutscene_camera/func_8016237C.s,func_8016237C,0x8016237C,0x1A
+asm/non_matchings/code/cutscene_camera/func_801623E4.s,func_801623E4,0x801623E4,0x42
+asm/non_matchings/code/cutscene_camera/func_801624EC.s,func_801624EC,0x801624EC,0x14
+asm/non_matchings/code/cutscene_camera/func_8016253C.s,func_8016253C,0x8016253C,0x120
+asm/non_matchings/code/cutscene_camera/func_801629BC.s,func_801629BC,0x801629BC,0x25
+asm/non_matchings/code/cutscene_camera/func_80162A50.s,func_80162A50,0x80162A50,0x16A
+asm/non_matchings/code/cutscene_camera/func_80162FF8.s,func_80162FF8,0x80162FF8,0x79
+asm/non_matchings/code/cutscene_camera/func_801631DC.s,func_801631DC,0x801631DC,0x56
+asm/non_matchings/code/cutscene_camera/func_80163334.s,func_80163334,0x80163334,0xCB
+asm/non_matchings/code/cutscene_camera/func_80163660.s,func_80163660,0x80163660,0x28
asm/non_matchings/code/z_kaleido_manager/func_80163700.s,func_80163700,0x80163700,0x16
asm/non_matchings/code/z_kaleido_manager/func_80163758.s,func_80163758,0x80163758,0x17
asm/non_matchings/code/z_kaleido_manager/func_801637B4.s,func_801637B4,0x801637B4,0x14
@@ -2554,16 +2554,16 @@ asm/non_matchings/code/z_play/Play_IsDebugCamEnabled.s,Play_IsDebugCamEnabled,0x
asm/non_matchings/code/z_play/func_8016A178.s,func_8016A178,0x8016A178,0x3C
asm/non_matchings/code/z_play/Play_FillScreen.s,Play_FillScreen,0x8016A268,0x18
asm/non_matchings/code/z_play/Play_Init.s,Play_Init,0x8016A2C8,0x252
-asm/non_matchings/code/z_play_hireso/func_8016AC10.s,func_8016AC10,0x8016AC10,0x83
-asm/non_matchings/code/z_play_hireso/func_8016AE1C.s,func_8016AE1C,0x8016AE1C,0x117
-asm/non_matchings/code/z_play_hireso/func_8016B278.s,func_8016B278,0x8016B278,0x8E
-asm/non_matchings/code/z_play_hireso/func_8016B4B0.s,func_8016B4B0,0x8016B4B0,0x3A5
-asm/non_matchings/code/z_play_hireso/func_8016C344.s,func_8016C344,0x8016C344,0x282
-asm/non_matchings/code/z_play_hireso/func_8016CD4C.s,func_8016CD4C,0x8016CD4C,0x5B0
-asm/non_matchings/code/z_play_hireso/func_8016E40C.s,func_8016E40C,0x8016E40C,0x1A1
-asm/non_matchings/code/z_play_hireso/func_8016EA90.s,func_8016EA90,0x8016EA90,0x1C6
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawScisTexRect.s,BombersNotebook_DrawScisTexRect,0x8016AC10,0x83
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawHeaders.s,BombersNotebook_DrawHeaders,0x8016AE1C,0x117
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawColumns.s,BombersNotebook_DrawColumns,0x8016B278,0x8E
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawEntries.s,BombersNotebook_DrawEntries,0x8016B4B0,0x3A5
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawRows.s,BombersNotebook_DrawRows,0x8016C344,0x282
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawTimeOfDay.s,BombersNotebook_DrawTimeOfDay,0x8016CD4C,0x5B0
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawCursor.s,BombersNotebook_DrawCursor,0x8016E40C,0x1A1
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawArrows.s,BombersNotebook_DrawArrows,0x8016EA90,0x1C6
asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s,BombersNotebook_Draw,0x8016F1A8,0xD1
-asm/non_matchings/code/z_play_hireso/func_8016F4EC.s,func_8016F4EC,0x8016F4EC,0x2F
+asm/non_matchings/code/z_play_hireso/BombersNotebook_LoadFiles.s,BombersNotebook_LoadFiles,0x8016F4EC,0x2F
asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s,BombersNotebook_Update,0x8016F5A8,0x1B4
asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s,BombersNotebook_Init,0x8016FC78,0x8
asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s,BombersNotebook_Destroy,0x8016FC98,0x16
@@ -2678,33 +2678,33 @@ asm/non_matchings/code/listalloc/func_80174AB4.s,func_80174AB4,0x80174AB4,0x1B
asm/non_matchings/code/listalloc/func_80174B20.s,func_80174B20,0x80174B20,0x20
asm/non_matchings/code/listalloc/func_80174BA0.s,func_80174BA0,0x80174BA0,0x14
asm/non_matchings/code/main/main.s,main,0x80174BF0,0xC8
-asm/non_matchings/code/padmgr/Padmgr_GetControllerBitmask.s,Padmgr_GetControllerBitmask,0x80174F10,0x5
-asm/non_matchings/code/padmgr/func_80174F24.s,func_80174F24,0x80174F24,0x8
-asm/non_matchings/code/padmgr/func_80174F44.s,func_80174F44,0x80174F44,0xE
-asm/non_matchings/code/padmgr/func_80174F7C.s,func_80174F7C,0x80174F7C,0x8
-asm/non_matchings/code/padmgr/func_80174F9C.s,func_80174F9C,0x80174F9C,0xE
-asm/non_matchings/code/padmgr/Padmgr_GetEventCallback.s,Padmgr_GetEventCallback,0x80174FD4,0xD
-asm/non_matchings/code/padmgr/func_80175008.s,func_80175008,0x80175008,0xD
-asm/non_matchings/code/padmgr/Padmgr_SetEventCallback.s,Padmgr_SetEventCallback,0x8017503C,0xC
-asm/non_matchings/code/padmgr/func_8017506C.s,func_8017506C,0x8017506C,0xC
-asm/non_matchings/code/padmgr/Padmgr_Lock.s,Padmgr_Lock,0x8017509C,0xC
-asm/non_matchings/code/padmgr/Padmgr_Unlock.s,Padmgr_Unlock,0x801750CC,0xC
-asm/non_matchings/code/padmgr/func_801750FC.s,func_801750FC,0x801750FC,0x9A
-asm/non_matchings/code/padmgr/func_80175364.s,func_80175364,0x80175364,0x34
-asm/non_matchings/code/padmgr/func_80175434.s,func_80175434,0x80175434,0x6
-asm/non_matchings/code/padmgr/func_8017544C.s,func_8017544C,0x8017544C,0xA
+asm/non_matchings/code/padmgr/PadMgr_GetValidControllersMask.s,PadMgr_GetValidControllersMask,0x80174F10,0x5
+asm/non_matchings/code/padmgr/PadMgr_SetRumbleRetraceCallback.s,PadMgr_SetRumbleRetraceCallback,0x80174F24,0x8
+asm/non_matchings/code/padmgr/PadMgr_UnsetRumbleRetraceCallback.s,PadMgr_UnsetRumbleRetraceCallback,0x80174F44,0xE
+asm/non_matchings/code/padmgr/PadMgr_SetInputRetraceCallback.s,PadMgr_SetInputRetraceCallback,0x80174F7C,0x8
+asm/non_matchings/code/padmgr/PadMgr_UnsetInputRetraceCallback.s,PadMgr_UnsetInputRetraceCallback,0x80174F9C,0xE
+asm/non_matchings/code/padmgr/PadMgr_AcquireSerialEventQueue.s,PadMgr_AcquireSerialEventQueue,0x80174FD4,0xD
+asm/non_matchings/code/padmgr/PadMgr_VoiceAcquireSerialEventQueue.s,PadMgr_VoiceAcquireSerialEventQueue,0x80175008,0xD
+asm/non_matchings/code/padmgr/PadMgr_ReleaseSerialEventQueue.s,PadMgr_ReleaseSerialEventQueue,0x8017503C,0xC
+asm/non_matchings/code/padmgr/PadMgr_VoiceReleaseSerialEventQueue.s,PadMgr_VoiceReleaseSerialEventQueue,0x8017506C,0xC
+asm/non_matchings/code/padmgr/PadMgr_LockPadData.s,PadMgr_LockPadData,0x8017509C,0xC
+asm/non_matchings/code/padmgr/PadMgr_UnlockPadData.s,PadMgr_UnlockPadData,0x801750CC,0xC
+asm/non_matchings/code/padmgr/PadMgr_UpdateRumble.s,PadMgr_UpdateRumble,0x801750FC,0x9A
+asm/non_matchings/code/padmgr/PadMgr_RumbleStop.s,PadMgr_RumbleStop,0x80175364,0x34
+asm/non_matchings/code/padmgr/PadMgr_RumblePause.s,PadMgr_RumblePause,0x80175434,0x6
+asm/non_matchings/code/padmgr/PadMgr_RumbleSetSingle.s,PadMgr_RumbleSetSingle,0x8017544C,0xA
asm/non_matchings/code/padmgr/PadMgr_RumbleSet.s,PadMgr_RumbleSet,0x80175474,0x13
asm/non_matchings/code/padmgr/PadMgr_ControllerHasRumblePak.s,PadMgr_ControllerHasRumblePak,0x801754C0,0x8
-asm/non_matchings/code/padmgr/Padmgr_CalcStickEdges.s,Padmgr_CalcStickEdges,0x801754E0,0xB1
-asm/non_matchings/code/padmgr/Padmgr_ParseState.s,Padmgr_ParseState,0x801757A4,0x86
-asm/non_matchings/code/padmgr/func_801759BC.s,func_801759BC,0x801759BC,0x49
-asm/non_matchings/code/padmgr/func_80175AE0.s,func_80175AE0,0x80175AE0,0x68
-asm/non_matchings/code/padmgr/Padmgr_Update.s,Padmgr_Update,0x80175C80,0x6F
-asm/non_matchings/code/padmgr/Padmgr_Stop.s,Padmgr_Stop,0x80175E3C,0xB
-asm/non_matchings/code/padmgr/func_80175E68.s,func_80175E68,0x80175E68,0x4C
-asm/non_matchings/code/padmgr/Padmgr_GetInput.s,Padmgr_GetInput,0x80175F98,0xF
-asm/non_matchings/code/padmgr/Padmgr_GetInput2.s,Padmgr_GetInput2,0x80175FD4,0xF
-asm/non_matchings/code/padmgr/Padmgr_ThreadEntry.s,Padmgr_ThreadEntry,0x80176010,0x61
+asm/non_matchings/code/padmgr/PadMgr_AdjustInput.s,PadMgr_AdjustInput,0x801754E0,0xB1
+asm/non_matchings/code/padmgr/PadMgr_UpdateInputs.s,PadMgr_UpdateInputs,0x801757A4,0x86
+asm/non_matchings/code/padmgr/PadMgr_InitVoice.s,PadMgr_InitVoice,0x801759BC,0x49
+asm/non_matchings/code/padmgr/PadMgr_UpdateConnections.s,PadMgr_UpdateConnections,0x80175AE0,0x68
+asm/non_matchings/code/padmgr/PadMgr_HandleRetrace.s,PadMgr_HandleRetrace,0x80175C80,0x6F
+asm/non_matchings/code/padmgr/PadMgr_HandlePreNMI.s,PadMgr_HandlePreNMI,0x80175E3C,0xB
+asm/non_matchings/code/padmgr/PadMgr_GetInputNoLock.s,PadMgr_GetInputNoLock,0x80175E68,0x4C
+asm/non_matchings/code/padmgr/PadMgr_GetInput.s,PadMgr_GetInput,0x80175F98,0xF
+asm/non_matchings/code/padmgr/PadMgr_GetInput2.s,PadMgr_GetInput2,0x80175FD4,0xF
+asm/non_matchings/code/padmgr/PadMgr_ThreadEntry.s,PadMgr_ThreadEntry,0x80176010,0x61
asm/non_matchings/code/padmgr/PadMgr_Init.s,PadMgr_Init,0x80176194,0x3B
asm/non_matchings/code/sched/Sched_SwapFramebuffer.s,Sched_SwapFramebuffer,0x80176280,0x25
asm/non_matchings/code/sched/Sched_RetraceUpdateFramebuffer.s,Sched_RetraceUpdateFramebuffer,0x80176314,0x14
@@ -2739,15 +2739,15 @@ asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntries.s,SpeedMeter_Draw
asm/non_matchings/code/speed_meter/func_801780F0.s,func_801780F0,0x801780F0,0x3F
asm/non_matchings/code/speed_meter/func_801781EC.s,func_801781EC,0x801781EC,0x90
asm/non_matchings/code/speed_meter/func_8017842C.s,func_8017842C,0x8017842C,0xC9
-asm/non_matchings/code/sys_cmpdma/func_80178750.s,func_80178750,0x80178750,0x32
-asm/non_matchings/code/sys_cmpdma/func_80178818.s,func_80178818,0x80178818,0x58
-asm/non_matchings/code/sys_cmpdma/func_80178978.s,func_80178978,0x80178978,0x17
-asm/non_matchings/code/sys_cmpdma/func_801789D4.s,func_801789D4,0x801789D4,0x6
-asm/non_matchings/code/sys_cmpdma/SysCfb_GetFbPtr.s,SysCfb_GetFbPtr,0x801789EC,0xA
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetLoResMode.s,SysCfb_SetLoResMode,0x80178750,0x32
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetHiResMode.s,SysCfb_SetHiResMode,0x80178818,0x58
+asm/non_matchings/code/sys_cmpdma/SysCfb_Init.s,SysCfb_Init,0x80178978,0x17
+asm/non_matchings/code/sys_cmpdma/SysCfb_Reset.s,SysCfb_Reset,0x801789D4,0x6
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetFramebuffer.s,SysCfb_GetFramebuffer,0x801789EC,0xA
asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBuffer.s,SysCfb_GetZBuffer,0x80178A14,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A24.s,func_80178A24,0x80178A24,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A34.s,func_80178A34,0x80178A34,0x18
-asm/non_matchings/code/sys_cmpdma/func_80178A94.s,func_80178A94,0x80178A94,0xB
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetWorkBuffer.s,SysCfb_GetWorkBuffer,0x80178A24,0x4
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferPixel.s,SysCfb_GetZBufferPixel,0x80178A34,0x18
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferInt.s,SysCfb_GetZBufferInt,0x80178A94,0xB
asm/non_matchings/code/sys_cmpdma/func_80178AC0.s,func_80178AC0,0x80178AC0,0x70
asm/non_matchings/code/sys_cmpdma/CmpDma_GetFileInfo.s,CmpDma_GetFileInfo,0x80178C80,0x3F
asm/non_matchings/code/sys_cmpdma/CmpDma_Decompress.s,CmpDma_Decompress,0x80178D7C,0xC
@@ -2762,13 +2762,13 @@ asm/non_matchings/code/sys_initial_check/Check_DrawExpansionPakErrorMessage.s,Ch
asm/non_matchings/code/sys_initial_check/Check_DrawRegionLockErrorMessage.s,Check_DrawRegionLockErrorMessage,0x801791CC,0x25
asm/non_matchings/code/sys_initial_check/Check_ExpansionPak.s,Check_ExpansionPak,0x80179260,0x11
asm/non_matchings/code/sys_initial_check/Check_RegionIsSupported.s,Check_RegionIsSupported,0x801792A4,0x17
-asm/non_matchings/code/sys_math/func_80179300.s,func_80179300,0x80179300,0x40
-asm/non_matchings/code/sys_math/func_80179400.s,func_80179400,0x80179400,0x31
-asm/non_matchings/code/sys_math/pow_int.s,pow_int,0x801794C4,0xA
-asm/non_matchings/code/sys_math/sin_rad.s,sin_rad,0x801794EC,0x15
-asm/non_matchings/code/sys_math/cos_rad.s,cos_rad,0x80179540,0x15
+asm/non_matchings/code/sys_math/Math_FactorialF.s,Math_FactorialF,0x80179300,0x40
+asm/non_matchings/code/sys_math/Math_Factorial.s,Math_Factorial,0x80179400,0x31
+asm/non_matchings/code/sys_math/Math_PowF.s,Math_PowF,0x801794C4,0xA
+asm/non_matchings/code/sys_math/Math_SinF.s,Math_SinF,0x801794EC,0x15
+asm/non_matchings/code/sys_math/Math_CosF.s,Math_CosF,0x80179540,0x15
asm/non_matchings/code/sys_math/Rand_ZeroFloat.s,Rand_ZeroFloat,0x80179594,0xB
-asm/non_matchings/code/sys_math/randPlusMinusPoint5Scaled.s,randPlusMinusPoint5Scaled,0x801795C0,0xC
+asm/non_matchings/code/sys_math/Rand_CenteredFloat.s,Rand_CenteredFloat,0x801795C0,0xC
asm/non_matchings/code/sys_math3d/Math3D_Normalize.s,Math3D_Normalize,0x801795F0,0x22
asm/non_matchings/code/sys_math3d/Math3D_PlaneVsLineSegClosestPoint.s,Math3D_PlaneVsLineSegClosestPoint,0x80179678,0x48
asm/non_matchings/code/sys_math3d/func_80179798.s,func_80179798,0x80179798,0xAB
@@ -2962,20 +2962,21 @@ asm/non_matchings/code/sys_slowly/Slowly_ThreadEntry.s,Slowly_ThreadEntry,0x8018
asm/non_matchings/code/sys_slowly/Slowly_Init.s,Slowly_Init,0x8018571C,0x21
asm/non_matchings/code/sys_slowly/Slowly_Destroy.s,Slowly_Destroy,0x801857A0,0x8
asm/non_matchings/code/sys_flashrom/func_801857C0.s,func_801857C0,0x801857C0,0x4
-asm/non_matchings/code/sys_flashrom/func_801857D0.s,func_801857D0,0x801857D0,0x25
-asm/non_matchings/code/sys_flashrom/func_80185864.s,func_80185864,0x80185864,0x29
-asm/non_matchings/code/sys_flashrom/func_80185908.s,func_80185908,0x80185908,0x18
-asm/non_matchings/code/sys_flashrom/func_80185968.s,func_80185968,0x80185968,0x22
-asm/non_matchings/code/sys_flashrom/func_801859F0.s,func_801859F0,0x801859F0,0xF
-asm/non_matchings/code/sys_flashrom/func_80185A2C.s,func_80185A2C,0x80185A2C,0x3C
-asm/non_matchings/code/sys_flashrom/func_80185B1C.s,func_80185B1C,0x80185B1C,0x32
-asm/non_matchings/code/sys_flashrom/func_80185BE4.s,func_80185BE4,0x80185BE4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsInit.s,SysFlashrom_IsInit,0x801857C0,0x4
+asm/non_matchings/code/sys_flashrom/SysFlashrom_GetVendorStr.s,SysFlashrom_GetVendorStr,0x801857D0,0x25
+asm/non_matchings/code/sys_flashrom/SysFlashrom_CheckFlashType.s,SysFlashrom_CheckFlashType,0x80185864,0x29
+asm/non_matchings/code/sys_flashrom/SysFlashrom_InitFlash.s,SysFlashrom_InitFlash,0x80185908,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ReadData.s,SysFlashrom_ReadData,0x80185968,0x22
+asm/non_matchings/code/sys_flashrom/SysFlashrom_EraseSector.s,SysFlashrom_EraseSector,0x801859F0,0xF
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ExecWrite.s,SysFlashrom_ExecWrite,0x80185A2C,0x3C
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AttemptWrite.s,SysFlashrom_AttemptWrite,0x80185B1C,0x32
+asm/non_matchings/code/sys_flashrom/SysFlashrom_NeedsToErase.s,SysFlashrom_NeedsToErase,0x80185BE4,0x10
asm/non_matchings/code/sys_flashrom/func_80185C24.s,func_80185C24,0x80185C24,0x47
asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s,SysFlashrom_ThreadEntry,0x80185D40,0x27
-asm/non_matchings/code/sys_flashrom/func_80185DDC.s,func_80185DDC,0x80185DDC,0x3A
-asm/non_matchings/code/sys_flashrom/func_80185EC4.s,func_80185EC4,0x80185EC4,0x10
-asm/non_matchings/code/sys_flashrom/func_80185F04.s,func_80185F04,0x80185F04,0x18
-asm/non_matchings/code/sys_flashrom/func_80185F64.s,func_80185F64,0x80185F64,0xB
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataAsync.s,SysFlashrom_WriteDataAsync,0x80185DDC,0x3A
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsBusy.s,SysFlashrom_IsBusy,0x80185EC4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AwaitResult.s,SysFlashrom_AwaitResult,0x80185F04,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataSync.s,SysFlashrom_WriteDataSync,0x80185F64,0xB
asm/non_matchings/code/code_80185F90/func_80185F90.s,func_80185F90,0x80185F90,0x26
asm/non_matchings/code/osFlash/func_80186A70.s,func_80186A70,0x80186A70,0x12
asm/non_matchings/code/osFlash/func_80186AB8.s,func_80186AB8,0x80186AB8,0x1C
@@ -3361,7 +3362,7 @@ asm/non_matchings/code/code_8019AF00/AudioOcarina_TerminaWallGenerateNotes.s,Aud
asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameInit.s,AudioOcarina_MemoryGameInit,0x8019D488,0x1C
asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameNextNote.s,AudioOcarina_MemoryGameNextNote,0x8019D4F8,0x42
asm/non_matchings/code/code_8019AF00/AudioOcarina_Update.s,AudioOcarina_Update,0x8019D600,0x56
-asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayLongScarecrowAfterCredits.s,AudioOcarina_PlayLongScarecrowAfterCredits,0x8019D758,0x43
+asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayLongScarecrowSong.s,AudioOcarina_PlayLongScarecrowSong,0x8019D758,0x43
asm/non_matchings/code/code_8019AF00/AudioOcarina_SetCustomSequence.s,AudioOcarina_SetCustomSequence,0x8019D864,0x14
asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayCustomSequence.s,AudioOcarina_PlayCustomSequence,0x8019D8B4,0xC
asm/non_matchings/code/code_8019AF00/AudioOcarina_CreateCustomSequence.s,AudioOcarina_CreateCustomSequence,0x8019D8E4,0x191
diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py
index 02a3e4a42..591671ab8 100755
--- a/tools/weekeventregconvert.py
+++ b/tools/weekeventregconvert.py
@@ -73,7 +73,7 @@ weekEventReg = {
( 8 << 8) | 0x04: "WEEKEVENTREG_08_04",
( 8 << 8) | 0x08: "WEEKEVENTREG_08_08",
( 8 << 8) | 0x10: "WEEKEVENTREG_08_10",
- ( 8 << 8) | 0x20: "WEEKEVENTREG_08_20",
+ ( 8 << 8) | 0x20: "WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE",
( 8 << 8) | 0x40: "WEEKEVENTREG_08_40",
( 8 << 8) | 0x80: "WEEKEVENTREG_08_80",
( 9 << 8) | 0x01: "WEEKEVENTREG_09_01",
@@ -155,7 +155,7 @@ weekEventReg = {
(18 << 8) | 0x10: "WEEKEVENTREG_18_10",
(18 << 8) | 0x20: "WEEKEVENTREG_18_20",
(18 << 8) | 0x40: "WEEKEVENTREG_18_40",
- (18 << 8) | 0x80: "WEEKEVENTREG_18_80",
+ (18 << 8) | 0x80: "WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES",
(19 << 8) | 0x01: "WEEKEVENTREG_19_01",
(19 << 8) | 0x02: "WEEKEVENTREG_19_02",
(19 << 8) | 0x04: "WEEKEVENTREG_19_04",
@@ -165,7 +165,7 @@ weekEventReg = {
(19 << 8) | 0x40: "WEEKEVENTREG_19_40",
(19 << 8) | 0x80: "WEEKEVENTREG_19_80",
(20 << 8) | 0x01: "WEEKEVENTREG_20_01",
- (20 << 8) | 0x02: "WEEKEVENTREG_20_02",
+ (20 << 8) | 0x02: "WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE",
(20 << 8) | 0x04: "WEEKEVENTREG_20_04",
(20 << 8) | 0x08: "WEEKEVENTREG_20_08",
(20 << 8) | 0x10: "WEEKEVENTREG_20_10",
@@ -174,15 +174,15 @@ weekEventReg = {
(20 << 8) | 0x80: "WEEKEVENTREG_20_80",
(21 << 8) | 0x01: "WEEKEVENTREG_21_01",
(21 << 8) | 0x02: "WEEKEVENTREG_21_02",
- (21 << 8) | 0x04: "WEEKEVENTREG_21_04",
- (21 << 8) | 0x08: "WEEKEVENTREG_21_08",
+ (21 << 8) | 0x04: "WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON",
+ (21 << 8) | 0x08: "WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON",
(21 << 8) | 0x10: "WEEKEVENTREG_21_10",
- (21 << 8) | 0x20: "WEEKEVENTREG_21_20",
+ (21 << 8) | 0x20: "WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM",
(21 << 8) | 0x40: "WEEKEVENTREG_21_40",
(21 << 8) | 0x80: "WEEKEVENTREG_21_80",
- (22 << 8) | 0x01: "WEEKEVENTREG_22_01",
+ (22 << 8) | 0x01: "WEEKEVENTREG_DEFENDED_AGAINST_THEM",
(22 << 8) | 0x02: "WEEKEVENTREG_22_02",
- (22 << 8) | 0x04: "WEEKEVENTREG_22_04",
+ (22 << 8) | 0x04: "WEEKEVENTREG_CALMED_GORON_ELDERS_SON",
(22 << 8) | 0x08: "WEEKEVENTREG_22_08",
(22 << 8) | 0x10: "WEEKEVENTREG_22_10",
(22 << 8) | 0x20: "WEEKEVENTREG_22_20",
@@ -221,11 +221,11 @@ weekEventReg = {
(26 << 8) | 0x40: "WEEKEVENTREG_26_40",
(26 << 8) | 0x80: "WEEKEVENTREG_26_80",
(27 << 8) | 0x01: "WEEKEVENTREG_27_01",
- (27 << 8) | 0x02: "WEEKEVENTREG_27_02",
- (27 << 8) | 0x04: "WEEKEVENTREG_27_04",
- (27 << 8) | 0x08: "WEEKEVENTREG_27_08",
- (27 << 8) | 0x10: "WEEKEVENTREG_27_10",
- (27 << 8) | 0x20: "WEEKEVENTREG_27_20",
+ (27 << 8) | 0x02: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN",
+ (27 << 8) | 0x04: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN",
+ (27 << 8) | 0x08: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN",
+ (27 << 8) | 0x10: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN",
+ (27 << 8) | 0x20: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN",
(27 << 8) | 0x40: "WEEKEVENTREG_27_40",
(27 << 8) | 0x80: "WEEKEVENTREG_27_80",
(28 << 8) | 0x01: "WEEKEVENTREG_28_01",
@@ -275,11 +275,11 @@ weekEventReg = {
(33 << 8) | 0x10: "WEEKEVENTREG_33_10",
(33 << 8) | 0x20: "WEEKEVENTREG_33_20",
(33 << 8) | 0x40: "WEEKEVENTREG_33_40",
- (33 << 8) | 0x80: "WEEKEVENTREG_33_80",
+ (33 << 8) | 0x80: "WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE",
(34 << 8) | 0x01: "WEEKEVENTREG_34_01",
(34 << 8) | 0x02: "WEEKEVENTREG_34_02",
(34 << 8) | 0x04: "WEEKEVENTREG_34_04",
- (34 << 8) | 0x08: "WEEKEVENTREG_SWAMP_SPIDER_HOUSE_TALKED",
+ (34 << 8) | 0x08: "WEEKEVENTREG_TALKED_SWAMP_SPIDER_HOUSE_MAN",
(34 << 8) | 0x10: "WEEKEVENTREG_34_10",
(34 << 8) | 0x20: "WEEKEVENTREG_34_20",
(34 << 8) | 0x40: "WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH",
@@ -407,25 +407,25 @@ weekEventReg = {
(50 << 8) | 0x01: "WEEKEVENTREG_50_01",
(50 << 8) | 0x02: "WEEKEVENTREG_50_02",
(50 << 8) | 0x04: "WEEKEVENTREG_50_04",
- (50 << 8) | 0x08: "WEEKEVENTREG_50_08",
+ (50 << 8) | 0x08: "WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING",
(50 << 8) | 0x10: "WEEKEVENTREG_50_10",
- (50 << 8) | 0x20: "WEEKEVENTREG_50_20",
+ (50 << 8) | 0x20: "WEEKEVENTREG_HAD_MIDNIGHT_MEETING",
(50 << 8) | 0x40: "WEEKEVENTREG_50_40",
- (50 << 8) | 0x80: "WEEKEVENTREG_50_80",
- (51 << 8) | 0x01: "WEEKEVENTREG_51_01",
+ (50 << 8) | 0x80: "WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES",
+ (51 << 8) | 0x01: "WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES",
(51 << 8) | 0x02: "WEEKEVENTREG_51_02",
(51 << 8) | 0x04: "WEEKEVENTREG_51_04",
(51 << 8) | 0x08: "WEEKEVENTREG_51_08",
(51 << 8) | 0x10: "WEEKEVENTREG_51_10",
- (51 << 8) | 0x20: "WEEKEVENTREG_51_20",
+ (51 << 8) | 0x20: "WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT",
(51 << 8) | 0x40: "WEEKEVENTREG_51_40",
(51 << 8) | 0x80: "WEEKEVENTREG_51_80",
- (52 << 8) | 0x01: "WEEKEVENTREG_52_01",
+ (52 << 8) | 0x01: "WEEKEVENTREG_ESCORTED_CREMIA",
(52 << 8) | 0x02: "WEEKEVENTREG_52_02",
(52 << 8) | 0x04: "WEEKEVENTREG_52_04",
(52 << 8) | 0x08: "WEEKEVENTREG_52_08",
(52 << 8) | 0x10: "WEEKEVENTREG_52_10",
- (52 << 8) | 0x20: "WEEKEVENTREG_52_20",
+ (52 << 8) | 0x20: "WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE",
(52 << 8) | 0x40: "WEEKEVENTREG_52_40",
(52 << 8) | 0x80: "WEEKEVENTREG_52_80",
(53 << 8) | 0x01: "WEEKEVENTREG_53_01",
@@ -451,7 +451,7 @@ weekEventReg = {
(55 << 8) | 0x10: "WEEKEVENTREG_55_10",
(55 << 8) | 0x20: "WEEKEVENTREG_55_20",
(55 << 8) | 0x40: "WEEKEVENTREG_55_40",
- (55 << 8) | 0x80: "WEEKEVENTREG_55_80",
+ (55 << 8) | 0x80: "WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE",
(56 << 8) | 0x01: "WEEKEVENTREG_56_01",
(56 << 8) | 0x02: "WEEKEVENTREG_56_02",
(56 << 8) | 0x04: "WEEKEVENTREG_56_04",
@@ -523,70 +523,70 @@ weekEventReg = {
(64 << 8) | 0x10: "WEEKEVENTREG_64_10",
(64 << 8) | 0x20: "WEEKEVENTREG_64_20",
(64 << 8) | 0x40: "WEEKEVENTREG_64_40",
- (64 << 8) | 0x80: "WEEKEVENTREG_64_80",
- (65 << 8) | 0x01: "WEEKEVENTREG_65_01",
- (65 << 8) | 0x02: "WEEKEVENTREG_65_02",
- (65 << 8) | 0x04: "WEEKEVENTREG_65_04",
- (65 << 8) | 0x08: "WEEKEVENTREG_65_08",
- (65 << 8) | 0x10: "WEEKEVENTREG_65_10",
+ (64 << 8) | 0x80: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_1",
+ (65 << 8) | 0x01: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_1",
+ (65 << 8) | 0x02: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_2",
+ (65 << 8) | 0x04: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_2",
+ (65 << 8) | 0x08: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_DAY_3",
+ (65 << 8) | 0x10: "WEEKEVENTREG_TALKED_DOGGY_RACETRACK_OWNER_NIGHT_3",
(65 << 8) | 0x20: "WEEKEVENTREG_65_20",
(65 << 8) | 0x40: "WEEKEVENTREG_65_40",
(65 << 8) | 0x80: "WEEKEVENTREG_65_80",
- (66 << 8) | 0x01: "WEEKEVENTREG_66_01",
- (66 << 8) | 0x02: "WEEKEVENTREG_66_02",
- (66 << 8) | 0x04: "WEEKEVENTREG_66_04",
- (66 << 8) | 0x08: "WEEKEVENTREG_66_08",
- (66 << 8) | 0x10: "WEEKEVENTREG_66_10",
- (66 << 8) | 0x20: "WEEKEVENTREG_66_20",
- (66 << 8) | 0x40: "WEEKEVENTREG_66_40",
- (66 << 8) | 0x80: "WEEKEVENTREG_66_80",
- (67 << 8) | 0x01: "WEEKEVENTREG_67_01",
- (67 << 8) | 0x02: "WEEKEVENTREG_67_02",
- (67 << 8) | 0x04: "WEEKEVENTREG_67_04",
- (67 << 8) | 0x08: "WEEKEVENTREG_67_08",
- (67 << 8) | 0x10: "WEEKEVENTREG_67_10",
- (67 << 8) | 0x20: "WEEKEVENTREG_67_20",
- (67 << 8) | 0x40: "WEEKEVENTREG_67_40",
- (67 << 8) | 0x80: "WEEKEVENTREG_67_80",
- (68 << 8) | 0x01: "WEEKEVENTREG_68_01",
- (68 << 8) | 0x02: "WEEKEVENTREG_68_02",
- (68 << 8) | 0x04: "WEEKEVENTREG_68_04",
- (68 << 8) | 0x08: "WEEKEVENTREG_68_08",
- (68 << 8) | 0x10: "WEEKEVENTREG_68_10",
- (68 << 8) | 0x20: "WEEKEVENTREG_68_20",
- (68 << 8) | 0x40: "WEEKEVENTREG_68_40",
- (68 << 8) | 0x80: "WEEKEVENTREG_68_80",
- (69 << 8) | 0x01: "WEEKEVENTREG_69_01",
- (69 << 8) | 0x02: "WEEKEVENTREG_69_02",
- (69 << 8) | 0x04: "WEEKEVENTREG_69_04",
- (69 << 8) | 0x08: "WEEKEVENTREG_69_08",
- (69 << 8) | 0x10: "WEEKEVENTREG_69_10",
- (69 << 8) | 0x20: "WEEKEVENTREG_69_20",
- (69 << 8) | 0x40: "WEEKEVENTREG_69_40",
- (69 << 8) | 0x80: "WEEKEVENTREG_69_80",
- (70 << 8) | 0x01: "WEEKEVENTREG_70_01",
- (70 << 8) | 0x02: "WEEKEVENTREG_70_02",
- (70 << 8) | 0x04: "WEEKEVENTREG_70_04",
- (70 << 8) | 0x08: "WEEKEVENTREG_70_08",
- (70 << 8) | 0x10: "WEEKEVENTREG_70_10",
- (70 << 8) | 0x20: "WEEKEVENTREG_70_20",
- (70 << 8) | 0x40: "WEEKEVENTREG_70_40",
- (70 << 8) | 0x80: "WEEKEVENTREG_70_80",
- (71 << 8) | 0x01: "WEEKEVENTREG_71_01",
- (71 << 8) | 0x02: "WEEKEVENTREG_71_02",
- (71 << 8) | 0x04: "WEEKEVENTREG_71_04",
- (71 << 8) | 0x08: "WEEKEVENTREG_71_08",
- (71 << 8) | 0x10: "WEEKEVENTREG_71_10",
- (71 << 8) | 0x20: "WEEKEVENTREG_71_20",
- (71 << 8) | 0x40: "WEEKEVENTREG_71_40",
- (71 << 8) | 0x80: "WEEKEVENTREG_71_80",
- (72 << 8) | 0x01: "WEEKEVENTREG_72_01",
- (72 << 8) | 0x02: "WEEKEVENTREG_72_02",
- (72 << 8) | 0x04: "WEEKEVENTREG_72_04",
- (72 << 8) | 0x08: "WEEKEVENTREG_72_08",
- (72 << 8) | 0x10: "WEEKEVENTREG_72_10",
- (72 << 8) | 0x20: "WEEKEVENTREG_72_20",
- (72 << 8) | 0x40: "WEEKEVENTREG_72_40",
+ (66 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU",
+ (66 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI",
+ (66 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN",
+ (66 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY",
+ (66 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI",
+ (66 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA",
+ (66 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR",
+ (66 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAOME_AROMA",
+ (67 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO",
+ (67 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN",
+ (67 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN",
+ (67 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS",
+ (67 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND",
+ (67 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER",
+ (67 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO",
+ (67 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG",
+ (68 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS",
+ (68 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO",
+ (68 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU",
+ (68 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS",
+ (68 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY",
+ (68 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING",
+ (68 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI",
+ (68 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI",
+ (69 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI",
+ (69 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES",
+ (69 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES",
+ (69 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT",
+ (69 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM",
+ (69 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM",
+ (69 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE",
+ (69 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA",
+ (70 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK",
+ (70 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK",
+ (70 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL",
+ (70 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL",
+ (70 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE",
+ (70 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK",
+ (70 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP",
+ (70 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP",
+ (71 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP",
+ (71 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP",
+ (71 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP",
+ (71 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP",
+ (71 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK",
+ (71 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK",
+ (71 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD",
+ (71 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK",
+ (72 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK",
+ (72 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT",
+ (72 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK",
+ (72 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK",
+ (72 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK",
+ (72 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK",
+ (72 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK",
(72 << 8) | 0x80: "WEEKEVENTREG_72_80",
(73 << 8) | 0x01: "WEEKEVENTREG_73_01",
(73 << 8) | 0x02: "WEEKEVENTREG_73_02",
@@ -608,7 +608,7 @@ weekEventReg = {
(75 << 8) | 0x02: "WEEKEVENTREG_75_02",
(75 << 8) | 0x04: "WEEKEVENTREG_75_04",
(75 << 8) | 0x08: "WEEKEVENTREG_75_08",
- (75 << 8) | 0x10: "WEEKEVENTREG_75_10",
+ (75 << 8) | 0x10: "WEEKEVENTREG_RECEIVED_ROOM_KEY",
(75 << 8) | 0x20: "WEEKEVENTREG_75_20",
(75 << 8) | 0x40: "WEEKEVENTREG_75_40",
(75 << 8) | 0x80: "WEEKEVENTREG_75_80",
@@ -648,7 +648,7 @@ weekEventReg = {
(80 << 8) | 0x02: "WEEKEVENTREG_80_02",
(80 << 8) | 0x04: "WEEKEVENTREG_80_04",
(80 << 8) | 0x08: "WEEKEVENTREG_80_08",
- (80 << 8) | 0x10: "WEEKEVENTREG_80_10",
+ (80 << 8) | 0x10: "WEEKEVENTREG_RECEIVED_PRIORITY_MAIL",
(80 << 8) | 0x20: "WEEKEVENTREG_80_20",
(80 << 8) | 0x40: "WEEKEVENTREG_80_40",
(80 << 8) | 0x80: "WEEKEVENTREG_80_80",
@@ -714,11 +714,11 @@ weekEventReg = {
(88 << 8) | 0x08: "WEEKEVENTREG_88_08",
(88 << 8) | 0x10: "WEEKEVENTREG_88_10",
(88 << 8) | 0x20: "WEEKEVENTREG_88_20",
- (88 << 8) | 0x40: "WEEKEVENTREG_88_40",
- (88 << 8) | 0x80: "WEEKEVENTREG_88_80",
- (89 << 8) | 0x01: "WEEKEVENTREG_89_01",
- (89 << 8) | 0x02: "WEEKEVENTREG_89_02",
- (89 << 8) | 0x04: "WEEKEVENTREG_89_04",
+ (88 << 8) | 0x40: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE",
+ (88 << 8) | 0x80: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN",
+ (89 << 8) | 0x01: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU",
+ (89 << 8) | 0x02: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA",
+ (89 << 8) | 0x04: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON",
(89 << 8) | 0x08: "WEEKEVENTREG_89_08",
(89 << 8) | 0x10: "WEEKEVENTREG_89_10",
(89 << 8) | 0x20: "WEEKEVENTREG_89_20",
@@ -843,20 +843,20 @@ def applyChange(fileContents: str, compiledRegex: re.Pattern, callback) -> str:
def updateCheck(fileContents: str) -> str:
- # gSaveContext.save.weekEventReg[86] & 2
- checkRegex = re.compile(rf"gSaveContext.save.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\&\s*(?P{NUMBER_PATTERN})")
+ # gSaveContext.save.saveInfo.weekEventReg[86] & 2
+ checkRegex = re.compile(rf"gSaveContext.save.saveInfo.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\&\s*(?P{NUMBER_PATTERN})")
return applyChange(fileContents, checkRegex, getCheckMacro)
def updateSet(fileContents: str) -> str:
- # gSaveContext.save.weekEventReg[51] |= 0x10
- setRegex = re.compile(rf"gSaveContext.save.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\|=\s*(?P{NUMBER_PATTERN})")
+ # gSaveContext.save.saveInfo.weekEventReg[51] |= 0x10
+ setRegex = re.compile(rf"gSaveContext.save.saveInfo.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\|=\s*(?P{NUMBER_PATTERN})")
return applyChange(fileContents, setRegex, getSetMacro)
def updateClear(fileContents: str) -> str:
- # gSaveContext.save.weekEventReg[85] &= (u8)~0x80
- clearRegex = re.compile(rf"gSaveContext.save.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\&=\s*(\(u8\))?~(?P{NUMBER_PATTERN})")
+ # gSaveContext.save.saveInfo.weekEventReg[85] &= (u8)~0x80
+ clearRegex = re.compile(rf"gSaveContext.save.saveInfo.weekEventReg\[(?P{NUMBER_PATTERN})\]\s*\&=\s*(\(u8\))?~(?P{NUMBER_PATTERN})")
return applyChange(fileContents, clearRegex, getClearMacro)
diff --git a/undefined_syms.txt b/undefined_syms.txt
index e28be948d..f0c2ad0d9 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -122,9 +122,11 @@ D_A4800010 = 0xA4800010; // SI_PIF_ADDR_WR64B_REG
D_A4800014 = 0xA4800014; // reserved
D_A4800018 = 0xA4800018; // SI_STATUS_REG
-// buffers
+// sys_cfb buffers
gFramebuffer1 = 0x80000500;
+gFramebufferHiRes0 = 0x80780000;
+gFramebufferHiRes1 = 0x80000500;
D_80025D00 = 0x80025D00;
// Ucode symbols
@@ -586,10 +588,6 @@ D_060005F8 = 0x060005F8;
D_06000A20 = 0x06000A20;
D_06000040 = 0x06000040;
-/* ovl_Bg_Tobira01 */
-D_060011C0 = 0x060011C0;
-D_06000088 = 0x06000088;
-
// ovl_Boss_01
D_06000C44 = 0x06000C44;
@@ -730,14 +728,6 @@ D_060134D0 = 0x060134D0;
D_06013828 = 0x06013828;
D_06014040 = 0x06014040;
-// ovl_Demo_Moonend
-
-D_06001214 = 0x06001214;
-D_0600B540 = 0x0600B540;
-D_0600B5A0 = 0x0600B5A0;
-D_06010C40 = 0x06010C40;
-D_060129F0 = 0x060129F0;
-
// ovl_Dm_Tsg
D_06002D30 = 0x06002D30;
@@ -773,10 +763,6 @@ D_060111E8 = 0x060111E8;
D_06012478 = 0x06012478;
D_06012618 = 0x06012618;
-// ovl_En_And
-
-D_0600B380 = 0x0600B380;
-
// ovl_En_Bal
D_060005FC = 0x060005FC;
@@ -1114,21 +1100,32 @@ D_06002188 = 0x06002188;
D_06000B70 = 0x06000B70;
D_06000D60 = 0x06000D60;
-// ovl_player_actor
-
-D_06008860 = 0x06008860;
-D_0600BDD8 = 0x0600BDD8;
-D_0600C540 = 0x0600C540;
-D_060127B0 = 0x060127B0;
-D_06013138 = 0x06013138;
-D_060134D0 = 0x060134D0;
-D_06014684 = 0x06014684;
-D_060177B8 = 0x060177B8;
-D_060178D0 = 0x060178D0;
-
// segment 0x07
+D_07000000 = 0x07000000;
+D_07000800 = 0x07000800;
+D_07001000 = 0x07001000;
+D_07001800 = 0x07001800;
+D_07002000 = 0x07002000;
+D_07002800 = 0x07002800;
+D_07003000 = 0x07003000;
+D_07003800 = 0x07003800;
+D_07004000 = 0x07004000;
+D_07004800 = 0x07004800;
+D_07005000 = 0x07005000;
+D_07005800 = 0x07005800;
+D_07006000 = 0x07006000;
+D_07006800 = 0x07006800;
+D_07007000 = 0x07007000;
+D_07007800 = 0x07007800;
+D_07008000 = 0x07008000;
+D_07008800 = 0x07008800;
+D_07009000 = 0x07009000;
+D_07009800 = 0x07009800;
+D_0700AC00 = 0x0700AC00;
+D_0700AEA0 = 0x0700AEA0;
+
// segment 0x08
@@ -1182,20 +1179,6 @@ D_0B000188 = 0x0B000188;
// segment 0x0C
D_0C000000 = 0x0C000000;
-D_0C000800 = 0x0C000800;
-D_0C001000 = 0x0C001000;
-D_0C001800 = 0x0C001800;
-D_0C001980 = 0x0C001980;
-D_0C006C00 = 0x0C006C00;
-D_0C006E00 = 0x0C006E00;
-D_0C014668 = 0x0C014668;
-
-// segment 0x0D
-
-D_0D002000 = 0x0D002000;
-D_0D002200 = 0x0D002200;
-D_0D002400 = 0x0D002400;
-D_0D003700 = 0x0D003700;
// segment 0x0E